Solo operators. LinkedIn or X. Standard rate limits.
- REST + MCP + Skills included
- Per-workspace API keys
- 7-day trial — no card
TwinWrite ships as a remote MCP server, a REST API, and a Skills bundle. One key gates all three. Connect from Claude Code in 30 seconds and ship grounded, on-brand drafts straight from a tool call.
Already in a Claude Code session? Run this and TwinWrite shows up as a first-class tool surface. The MCP transport is HTTP — no local process to babysit, no daemon to update.
# Install the remote MCP serverclaude mcp add twinwrite --url https://twinwrite.com/mcp --auth-token sk_live_…
Get a key from /dashboard/settings/api-keys after signup. The full sk_live_… token is shown once — copy it then and there. Lost keys are not recoverable; revoke and reissue.
The MCP server gives Claude the tools. The TwinWrite skill teaches Claude how to use them well — daily routines, campaign workflows, feed recipes. Skill files are served from /.well-known/skills/twinwrite/ and refresh whenever you re-run the install.
npx skills add -y https://twinwrite.comSkills are optional — the MCP tools work without them. But adding the skill converts "draft a post" from a tool call into a one-shot routine that picks the feed, drafts, schedules, and reports back.
From a Claude Code prompt to scheduled drafts in two tool calls. The MCP tools mirror the REST surface 1:1, so the trace is the same whether Claude is driving or your own agent is.
Use twinwrite to draft 3 LinkedIn posts about my product launch and schedule them for this week.# Claude Code's tool trace1. twinwrite.drafts_generate({ "source": { "topic": "my product launch" }, "count": 3 }) → { "ok": true, "drafts": [ { "id": "1d8b…", "status": "pending", "platform": "linkedin", … }, { "id": "1d8c…", "status": "pending", "platform": "linkedin", … }, { "id": "1d8d…", "status": "pending", "platform": "linkedin", … } ]}2. twinwrite.drafts_schedule({ "draft_id": "1d8b…", "scheduled_at": "2026-05-06T13:00:00Z" }) → { "ok": true, "draft": { …, "status": "scheduled" } } (Claude repeats step 2 for each accepted draft.)
POST + JSON, bearer auth, sync responses. OpenAPI 3.1 spec is served at /api/v1/agent/openapi.json — generate SDKs at will. Errors return the same AgentApiError shape on REST and MCP.
curl -X POST https://twinwrite.com/api/v1/agent/drafts.generate \ -H "Authorization: Bearer sk_live_…" \ -H "Content-Type: application/json" \ -d '{"source":{"topic":"my product launch"}}'
{ "ok": true, "drafts": [ { "id": "1d8b…", "platform": "linkedin", "status": "pending", "locale": "en", "body": "Three lessons from yesterday's launch post that …", "thread_items": null, "image_url": null, "feed_item_id": null, "campaign_id": null, "scheduled_for": null, "created_at": "2026-05-04T12:34:56Z" } ]}
Throttling adds Retry-After on REST and retry_after_seconds on both surfaces. The model can recover without a human in the loop.
Every endpoint, schema, and MCP tool — generated from the same source as the OpenAPI document. Adding a tool to the codebase ships the docs in the same deploy. tests/agent-mcp.test.ts guarantees REST and MCP never drift.
MCP install · REST quickstart · auth · per-endpoint schemas · OpenAPI 3.1. One in-app docs page, no third-party developer portal.
No separate developer SKU. Whatever plan you're on, the API is part of it — REST, MCP, and Skills. Rate limits scale with your tier.
Solo operators. LinkedIn or X. Standard rate limits.
Daily posters and tinkerers. Higher rate limits, priority generation.
5–50 seats. One key per member, one invoice for the org.
50+ seats. Procurement, security review, SSO, SLA. Bespoke rate limits.
You could glue together an RSS parser, a dedup index, a brand-voice prompt, a scheduler, and a thread splitter. Or you could use the one the founder already posts from every day.
# 1. Get a keyopen https://twinwrite.com/dashboard/settings/api-keys # 2. Connect from Claude Codeclaude mcp add twinwrite --url https://twinwrite.com/mcp --auth-token sk_live_… # 3. Prompt"Draft 3 posts about my launch and schedule them."