Overview
The Antwork MCP server lets your AI assistant draft, schedule, publish, and analyze social media posts on your behalf. It speaks the open Model Context Protocol standard, so any MCP-aware client (claude.ai, Claude Code, Cursor, ChatGPT, Windsurf, custom agents) can connect with the same single URL.
What you can do once connected
- ›Draft posts on-brand using your stored voice profile per platform.
- ›Schedule or publish to LinkedIn, X, Threads, Facebook, Instagram, YouTube, TikTok, and Pinterest.
- ›Read engagement metrics, post history, and per-day timeseries for any post.
- ›Manage drafts, scheduled posts, and the media library.
- ›Connect / disconnect social accounts and inspect their health.
Server URL
https://api.antwork.io/mcp
One URL serves every user — there are no per-tenant subdomains. Authentication happens via OAuth on first tool call (see Authentication).
Quick start
Every supported MCP client follows the same shape: register the server URL, then approve OAuth in your browser when prompted. The exact install affordance differs per client — pick yours below.
Cursor
- 1.One click — Cursor will open and ask you to confirm the install.
One click — your client will open and ask you to confirm the install.
VS Code
- 1.One click — VS Code will open and prompt you to confirm.
One click — your client will open and ask you to confirm the install.
Claude Code
- 1.Run this command in your terminal.
- 2.Then in Claude Code, type /mcp to authorize.
$ claude mcp add antwork --transport http https://api.antwork.io/mcp
Claude Desktop
- 1.Open Claude Desktop → Customize → Connectors → Add custom connector.
- 2.Paste the URL below and click Authorize.
https://api.antwork.io/mcp
ChatGPT
- 1.Enable Developer Mode in ChatGPT → Settings → Apps & Connectors.
- 2.Add a new app: name "antwork", URL below, auth "OAuth".
https://api.antwork.io/mcp
Windsurf
- 1.Open Windsurf → Settings → MCP servers → Edit raw config.
- 2.Paste this snippet inside the mcpServers object.
{
"mcpServers": {
"antwork": {
"url": "https://api.antwork.io/mcp"
}
}
}Gemini CLI
- 1.Run this command in your terminal.
- 2.Then run /mcp auth antwork inside the Gemini CLI.
$ gemini mcp add --transport http antwork https://api.antwork.io/mcp
OpenClaw
- 1.Run this command in your terminal.
- 2.Then run mcporter auth antwork to authorize.
$ mcporter config add antwork --url https://api.antwork.io/mcp --auth oauth
Authentication
The Antwork MCP server implements OAuth 2.1 with PKCE and dynamic client registration (RFC 7591), so MCP clients can connect without you pre-registering each one. Tokens are scoped, revocable, and issued per-client.
OAuth scopes
Each tool requires one of four scopes. The consent screen lists the scopes a client is requesting so you can approve or deny them granularly.
| read | Read | Read posts, social accounts, voice profiles, workspace settings, analytics. No mutations. |
| write | Write | Create / edit / delete drafts and scheduled posts. Mutate media library and workspace settings. Does not publish. |
| publish | Destructive | Publish posts to connected social platforms and schedule them for future publishing. Granted only when the user explicitly approves. |
| media | Write | Upload and attach images / video / PDFs to posts. Separate from write so granular consent is possible. |
Token lifecycle
- ›Access tokens are short-lived JWTs (5 minute TTL).
- ›Refresh tokens are long-lived and stored server-side. Standard
refresh_tokengrant. - ›Revoke via the standard
/oauth/revokeendpoint (RFC 7009) or from Settings → Connected AIs in your Antwork dashboard. Revocation invalidates the refresh token immediately. - ›Each MCP client (Claude desktop, Claude Code, Cursor, …) gets its own token. Revoking one client does not affect others.
Discovery endpoints
- ›
GET /.well-known/oauth-protected-resource— RFC 9728 resource metadata. - ›
GET /.well-known/oauth-authorization-server— RFC 8414 authorization server metadata. - ›
POST /oauth/register— RFC 7591 dynamic client registration. - ›
POST /oauth/token— authorization-code and refresh-token grants. PKCE S256 required. - ›
POST /oauth/revoke— RFC 7009 token revocation.
Tool reference
Antwork exposes 35 MCP tools across seven categories. Read-only tools never mutate state; destructive tools (publish, delete, disconnect) trigger explicit confirmation in clients that honor destructiveHint annotations.
Identity & workspaces
| whoami | Read | Profile of the authenticated user. |
| list_workspaces | Read | List all workspaces the user belongs to. Shows isDefault flag. |
| set_default_workspace | Write | Set or clear the default workspace so subsequent tools omit workspace_id. |
| create_workspace | Write | Create a new workspace owned by the authenticated user. |
| get_workspace_settings | Read | Brand identity, content guidelines, target audience, and per-platform preferences. |
| update_workspace_identity | Destructive | Rename a workspace or update its description. |
| update_workspace_settings | Destructive | Mutate workspace-level content guidelines and brand settings. |
Social accounts & voice profiles
| list_social_accounts | Read | All connected social accounts with health, expiry, and platform. |
| get_connection_urls | Read | OAuth URLs for connecting new social accounts. |
| disconnect_social_account | Destructive | Revoke a connected social account; tokens are deleted server-side. |
| get_voice_profiles | Read | Per-platform tone, vocabulary, and recurring phrases learned from existing content. |
| get_voice_profile | Write | Get one voice profile and refresh it from the live account if stale. |
| fetch_platform_posts | Read | Pull recent posts from a connected platform (used to refresh voice profiles). |
Posts — read
| list_posts | Read | List drafts, scheduled, published, and failed posts. Filterable by status and platform. |
| search_posts | Read | Full-text search across post bodies, hashtags, and per-platform copy. |
| get_post | Read | Single post with full payload (text, media, status, per-platform URLs). |
| get_post_history | Read | Per-day metric history for a published post — likes / comments / shares / impressions. |
Posts — write
| create_post | Write | Create a DRAFT post. Does not publish or schedule on its own — follow up with schedule_post or publish_post. |
| update_post | Write | Mutate any field on a post — text, platforms, hashtags, media, schedule time, per-platform copy. |
| duplicate_post | Write | Clone an existing post into a fresh draft. |
| delete_post | Destructive | Soft-delete a post. For published posts also enqueues platform-side deletion when the connector supports it. |
Posts — publishing
| publish_post | Destructive | Publish a draft immediately to every configured platform. Waits up to ~25 seconds for terminal status and returns per-platform URLs. |
| schedule_post | Destructive | Schedule a draft for a future timestamp. Server enforces that the time is in the future. |
| retry_failed_post | Destructive | Retry a previously-failed publish — useful when a token was refreshed or rate limits cleared. |
Analytics & planning
| get_performance | Read | Aggregate engagement totals across the workspace for a given window. |
| get_engagement_history | Read | Per-day engagement timeseries across the workspace. |
| get_optimal_posting_times | Read | Suggested posting windows per platform inferred from historical engagement. |
| refresh_post_metrics | Write | Hit the platform APIs live for specific posts and refresh their cached metrics. Slow but freshest — prefer get_performance for broad reads. |
| get_calendar | Read | Scheduled and published posts grouped by date. Renders as an interactive calendar in MCP App clients. |
Media
| list_media | Read | Workspace media library — images, video, PDFs. |
| get_media | Read | Single media item with download URL and per-mime metadata. |
| start_media_upload | Write | Open a workspace-level drop-zone iframe so the user can upload files to the library without picking a post first. Same base64-over-RPC mechanism as the post-card's Add media. |
| upload_media | Write | Ingest a file from a public URL (e.g. AI-generated image hosted elsewhere). LLM-facing path; the post-card and upload-zone iframes use this same tool internally with base64. |
| attach_media | Write | Attach media items to a draft post. |
| delete_media | Destructive | Soft-delete a media item; does not affect posts that already reference it. |
MCP Apps (interactive UI)
Several tools render interactive iframes when invoked from a host that supports the MCP Apps spec (claude.ai, Claude Code ≥ 0.5). The iframe calls back to the same MCP server over the host bridge — no extra auth needed.
- ›
list_posts,search_posts→ posts-table: filterable list with inline detail modal that edits + publishes without leaving chat. - ›
get_post,create_post,update_post,duplicate_post→ post-preview: full post card with per-platform tabs, inline editor, schedule/publish actions, an Add media picker (uploads + library reuse), and per-account "View on X" links once published. - ›
get_calendar→ calendar: month / week views of scheduled + published posts. - ›
start_media_upload→ upload-zone: workspace-level drop-zone for adding files to the media library without picking a post; supports drag-and-drop, paste, multi-file batches. - ›
list_social_accounts,get_connection_urls,disconnect_social_account→ connections-panel: per-account health, reconnect, disconnect; workspace switching via the header propagates to every other iframe. - ›
list_media,get_media→ media-gallery: thumbnail grid of the workspace library — reuse media across posts without re-uploading.
Clients that don't support MCP Apps still get the raw tool output — the UI is purely a presentation layer.
Troubleshooting
"Bearer token required" / 401 on every call
The MCP client hasn't completed OAuth or its refresh token has been revoked. In claude.ai: Settings → Connectors → Antwork → Disconnect, then reconnect. In Claude Code: /mcp → pick antwork → Re-authenticate.
Publish failed on one platform but succeeded on others
publish_post returns per-platform status. The most common cause is a social account whose token expired or was revoked from the platform side. Run list_social_accounts to find unhealthy accounts and reconnect them via the consent URL returned by get_connection_urls, then call retry_failed_post.
"Post stays as DRAFT after I asked to schedule it"
create_post only creates a draft. Your assistant must follow up with schedule_post(post_id, scheduled_for) or publish_post(post_id). The companion Antwork Poster Skill (github.com/iker-gonzalez/antwork-skills) codifies this two-step so Claude doesn't skip it.
The wrong account got the post (multiple accounts per platform)
When a workspace has more than one connected account on a platform (e.g. two LinkedIn pages), Antwork picks the first healthy account by default. To target a specific account, pass its accountId in the post's platforms array rather than the platform name. The Antwork Poster Skill also prompts the assistant to confirm before publishing.
Media upload silently drops the file
attach_media requires a Firebase Storage URL — pass external URLs through upload_media first so they get staged into your workspace storage. The publisher refuses non-storage URLs.
Rate limits
Antwork applies a soft rate limit of 60 tool calls / minute / workspace. Hitting the limit returns HTTP 429 with a Retry-After header. Publish operations are not rate-limited at the MCP layer but downstream platforms have their own limits (LinkedIn ~150 posts/day, X ~300 posts/3h).
Origin blocked / CORS error in browser-based clients
The server validates the Origin header on Streamable HTTP per the MCP spec. Allowed origins are first-party Antwork hosts, claude.ai, claude.com, console.anthropic.com, and localhost. If you're hosting a custom client on a different origin, contact us to whitelist it.
Limits & quotas
- ›Tool calls: 60 / minute / workspace (soft limit; HTTP 429 with
Retry-After). - ›Media upload: 25 MB per file. Images, video (mp4/mov/webm), PDFs accepted.
- ›Posts: no Antwork-side cap; downstream platforms enforce their own (LinkedIn ~150/day, X ~300/3h, others vary).
- ›Scheduled posts: 1 year max horizon.
- ›OAuth tokens: access token 5 min TTL, refresh token revocable any time.
Hard quotas (image generation, voice-profile refresh, brand extraction) are tied to plan tier. Pro and Business plans get higher monthly allowances; see pricing for current values.
Changelog
v1.0 — May 2026
Initial public release alongside Anthropic connector directory submission.
- ›35 MCP tools across identity, social accounts, voice profiles, posts, publishing, analytics, and media.
- ›Five MCP Apps: posts-table, post-preview, calendar, upload-zone, connections-panel.
- ›OAuth 2.1 with PKCE, dynamic client registration (RFC 7591), token revocation (RFC 7009).
- ›Per-platform
accountResultsreturned frompublish_postandget_postso multi-account workspaces show the correct publishing account in UI.
Contact
Questions, integration help, or bugs? Reach out.
Antwork · Spain · EU