Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Execute Grammarly primary workflow: Core Workflow A. Use when implementing primary use case, building main features, or core integration tasks. Trigger with phrases like "grammarly main workflow", "primary task with grammarly".
.claude/skills/jeremylongshore-grammarly-core-workflow-a/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -19% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -5% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -25% | 0% |
| case-06 | ✗→✓ | ▲ Improved | -56% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 52% | 0% |
Integrate Grammarly's Writing Score API into your application. Score documents, track writing quality over time, and provide feedback. The API evaluates text across four dimensions: engagement, correctness, clarity, and tone.
grammarly-install-auth setuptypescript// src/grammarly/scoring.ts interface WritingScore { overallScore: number; engagement: number; correctness: number; clarity: number; tone: number; } interface ScoreRequest { text: string; audienceType?: 'general' | 'knowledgeable' | 'expert'; domain?: 'academic' | 'business' | 'general' | 'email' | 'casual'; } async function scoreDocument(req: ScoreRequest, token: string): Promise<WritingScore> { const response = await fetch('https://api.grammarly.com/ecosystem/api/v2/scores', { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify(req), }); if (!response.ok) throw new Error(`Grammarly API ${response.status}: ${await response.text()}`); return response.json(); }
typescriptasync function batchScore(documents: string[], token: string): Promise<WritingScore[]> { const results: WritingScore[] = []; for (const doc of documents) { if (doc.split(/\s+/).length < 30) { console.warn('Skipping: minimum 30 words required'); continue; } const score = await scoreDocument({ text: doc }, token); results.push(score); await new Promise(r => setTimeout(r, 500)); // Rate limit buffer } return results; }
typescriptinterface QualityGate { minOverall: number; minCorrectness: number; minClarity: number; } function checkQualityGate(score: WritingScore, gate: QualityGate): { passed: boolean; issues: string[] } { const issues: string[] = []; if (score.overallScore < gate.minOverall) issues.push(`Overall ${score.overallScore} < ${gate.minOverall}`); if (score.correctness < gate.minCorrectness) issues.push(`Correctness ${score.correctness} < ${gate.minCorrectness}`); if (score.clarity < gate.minClarity) issues.push(`Clarity ${score.clarity} < ${gate.minClarity}`); return { passed: issues.length === 0, issues }; } // Usage: enforce quality before publishing const score = await scoreDocument({ text: blogPost }, token); const gate = checkQualityGate(score, { minOverall: 80, minCorrectness: 90, minClarity: 75 }); if (!gate.passed) console.error('Quality gate failed:', gate.issues);
| Limit | Value | |-------|-------| | Max text size | 4 MB | | Max characters | 100,000 | | Min words | 30 |
| Error | Cause | Solution | |-------|-------|----------| | 400 | Text too short | Ensure >= 30 words | | 413 | Text too large | Split into chunks < 100K chars | | 429 | Rate limited | Implement exponential backoff |
For AI and plagiarism detection, see grammarly-core-workflow-b.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 15,822 | 13,118 | -17% | 1 | 1 | 0% | 3,458 | 2,794 | -19% | 0 | 0 | — |
case-02 | fail→pass | 18,434 | 8,282 | -55% | 1 | 1 | 0% | 2,809 | 2,660 | -5% | 0 | 0 | — |
case-03 | fail→fail | 18,371 | 13,868 | -25% | 1 | 1 | 0% | 3,040 | 2,907 | -4% | 0 | 0 | — |
case-04 | fail→pass | 14,901 | 7,134 | -52% | 1 | 1 | 0% | 1,844 | 1,378 | -25% | 0 | 0 | — |
case-05 | pass→pass | 8,821 | 6,675 | -24% | 1 | 1 | 0% | 801 | 1,275 | +59% | 0 | 0 | — |
case-06 | fail→pass | 14,439 | 1,711 | -88% | 1 | 1 | 0% | 2,970 | 1,312 | -56% | 0 | 0 | — |
case-07 | fail→pass | 16,279 | 6,644 | -59% | 1 | 1 | 0% | 846 | 1,289 | +52% | 0 | 0 | — |
case-08 | pass→pass | 7,669 | 3,806 | -50% | 1 | 1 | 0% | 1,502 | 1,209 | -20% | 0 | 0 | — |
case-09 | fail→pass | 26,201 | 1,824 | -93% | 1 | 1 | 0% | 1,601 | 1,354 | -15% | 0 | 0 | — |
case-10 | fail→pass | 6,632 | 7,011 | +6% | 1 | 1 | 0% | 1,389 | 1,445 | +4% | 0 | 0 | — |
case-11 | pass→pass | 14,610 | 4,058 | -72% | 1 | 1 | 0% | 2,123 | 1,715 | -19% | 0 | 0 | — |
case-12 | fail→pass | 7,755 | 2,085 | -73% | 1 | 1 | 0% | 1,697 | 1,368 | -19% | 0 | 0 | — |
case-13 | fail→pass | 31,461 | 7,527 | -76% | 1 | 1 | 0% | 1,148 | 1,388 | +21% | 0 | 0 | — |
case-14 | fail→pass | 17,111 | 7,044 | -59% | 1 | 1 | 0% | 2,082 | 1,337 | -36% | 0 | 0 | — |
case-15 | fail→fail | 18,198 | 13,273 | -27% | 1 | 1 | 0% | 2,336 | 3,347 | +43% | 0 | 0 | — |
case-16 | pass→pass | 14,212 | 15,277 | +7% | 1 | 1 | 0% | 2,593 | 2,859 | +10% | 0 | 0 | — |
case-17 | pass→pass | 12,394 | 8,261 | -33% | 1 | 1 | 0% | 1,190 | 1,542 | +30% | 0 | 0 | — |
case-18 | fail→pass | 12,830 | 7,844 | -39% | 1 | 1 | 0% | 2,333 | 1,494 | -36% | 0 | 0 | — |
case-19 | pass→pass | 8,403 | 3,299 | -61% | 1 | 1 | 0% | 1,539 | 1,564 | +2% | 0 | 0 | — |
case-20 | fail→pass | 12,446 | 5,173 | -58% | 1 | 1 | 0% | 2,050 | 1,898 | -7% | 0 | 0 | — |
case-21 | fail→pass | 16,580 | 18,258 | +10% | 1 | 1 | 0% | 2,144 | 3,488 | +63% | 0 | 0 | — |
case-22 | fail→fail | 20,664 | 11,292 | -45% | 1 | 1 | 0% | 2,900 | 3,270 | +13% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +59 percentage points is the difference between those two pass rates over the 19 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.