Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Production readiness checklist for Grammarly API integrations. Use when preparing a Grammarly integration for production deployment.
.claude/skills/jeremylongshore-grammarly-prod-checklist/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 7% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 15% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 10% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 36% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 47% | 0% |
Grammarly provides AI-powered writing assistance with grammar checking, tone detection, plagiarism scanning, and style suggestions. A production integration processes user-submitted text through Grammarly's API and returns actionable suggestions. Failures mean unchecked content goes live, suggestion latency degrades UX, or sensitive text leaks outside approved processing boundaries.
GRAMMARLY_API_KEY stored in secrets manager (not config files)https://api.grammarly.com/v1)typescriptasync function checkGrammarlyReadiness(): Promise<void> { const checks: { name: string; pass: boolean; detail: string }[] = []; // API connectivity try { const res = await fetch('https://api.grammarly.com/v1/check', { method: 'POST', headers: { Authorization: `Bearer ${process.env.GRAMMARLY_API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ text: 'This is a production readiness test sentence for validation.' }), }); checks.push({ name: 'Grammarly API', pass: res.ok, detail: res.ok ? 'Connected' : `HTTP ${res.status}` }); } catch (e: any) { checks.push({ name: 'Grammarly API', pass: false, detail: e.message }); } // Credentials present checks.push({ name: 'API Key Set', pass: !!process.env.GRAMMARLY_API_KEY, detail: process.env.GRAMMARLY_API_KEY ? 'Present' : 'MISSING' }); // Rate limit headroom try { const res = await fetch('https://api.grammarly.com/v1/usage', { headers: { Authorization: `Bearer ${process.env.GRAMMARLY_API_KEY}` }, }); checks.push({ name: 'Usage Endpoint', pass: res.ok, detail: res.ok ? 'Accessible' : `HTTP ${res.status}` }); } catch (e: any) { checks.push({ name: 'Usage Endpoint', pass: false, detail: e.message }); } for (const c of checks) console.log(`[${c.pass ? 'PASS' : 'FAIL'}] ${c.name}: ${c.detail}`); } checkGrammarlyReadiness();
| Check | Risk if Skipped | Priority | |-------|----------------|----------| | Token refresh logic | Silent auth failure blocks all checks | P1 | | Text chunking | Large documents rejected or truncated | P1 | | Rate limit handling | Burst traffic triggers 429 cascade | P2 | | Plagiarism timeout | Stuck requests block content pipeline | P2 | | Usage monitoring | Surprise plan overage charges | P3 |
See grammarly-security-basics for text data handling and privacy controls.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 26,040 | 23,959 | -8% | 1 | 1 | 0% | 4,767 | 5,116 | +7% | 0 | 0 | — |
case-02 | fail→fail | 22,011 | 25,203 | +15% | 1 | 1 | 0% | 3,322 | 4,362 | +31% | 0 | 0 | — |
case-03 | fail→fail | 17,164 | 21,222 | +24% | 1 | 1 | 0% | 3,350 | 5,826 | +74% | 0 | 0 | — |
case-04 | fail→fail | 24,119 | 22,908 | -5% | 1 | 1 | 0% | 3,151 | 5,334 | +69% | 0 | 0 | — |
case-05 | fail→fail | 15,229 | 25,533 | +68% | 1 | 1 | 0% | 2,773 | 4,623 | +67% | 0 | 0 | — |
case-06 | pass→fail | 21,280 | 21,614 | +2% | 1 | 1 | 0% | 2,735 | 3,934 | +44% | 0 | 0 | — |
case-07 | pass→pass | 15,238 | 15,188 | -0% | 1 | 1 | 0% | 2,602 | 3,636 | +40% | 0 | 0 | — |
case-08 | fail→pass | 10,544 | 9,840 | -7% | 1 | 1 | 0% | 1,628 | 1,867 | +15% | 0 | 0 | — |
case-09 | fail→pass | 14,694 | 9,343 | -36% | 1 | 1 | 0% | 1,657 | 1,826 | +10% | 0 | 0 | — |
case-10 | pass→pass | 16,213 | 6,255 | -61% | 1 | 1 | 0% | 1,817 | 1,974 | +9% | 0 | 0 | — |
case-11 | fail→fail | 15,551 | 11,496 | -26% | 1 | 1 | 0% | 2,479 | 2,957 | +19% | 0 | 0 | — |
case-12 | fail→pass | 18,176 | 16,703 | -8% | 1 | 1 | 0% | 2,227 | 3,037 | +36% | 0 | 0 | — |
case-13 | fail→pass | 13,446 | 13,256 | -1% | 1 | 1 | 0% | 2,183 | 3,213 | +47% | 0 | 0 | — |
case-14 | fail→pass | 16,957 | 9,076 | -46% | 1 | 1 | 0% | 2,019 | 2,167 | +7% | 0 | 0 | — |
case-15 | fail→pass | 19,725 | 21,554 | +9% | 1 | 1 | 0% | 4,012 | 4,737 | +18% | 0 | 0 | — |
case-16 | pass→fail | 20,321 | 16,052 | -21% | 1 | 1 | 0% | 2,483 | 3,677 | +48% | 0 | 0 | — |
case-17 | pass→pass | 13,201 | 15,844 | +20% | 1 | 1 | 0% | 2,205 | 3,441 | +56% | 0 | 0 | — |
case-18 | pass→pass | 16,811 | 10,769 | -36% | 1 | 1 | 0% | 2,055 | 3,015 | +47% | 0 | 0 | — |
case-19 | pass→pass | 15,659 | 17,023 | +9% | 1 | 1 | 0% | 2,792 | 3,509 | +26% | 0 | 0 | — |
case-20 | pass→pass | 15,976 | 24,529 | +54% | 1 | 1 | 0% | 2,459 | 4,509 | +83% | 0 | 0 | — |
case-21 | pass→pass | 10,335 | 12,950 | +25% | 1 | 1 | 0% | 1,386 | 2,920 | +111% | 0 | 0 | — |
case-22 | pass→pass | 20,879 | 16,203 | -22% | 1 | 1 | 0% | 2,150 | 2,772 | +29% | 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. The headline lift of +23 percentage points is the difference between those two pass rates over the 22 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
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.