Developer Docs

Antwork MCP Server

Reference documentation for the Antwork Model Context Protocol server — setup, OAuth scopes, the full tool catalog, interactive MCP Apps, and troubleshooting.

Last updated: May 13, 2026·antwork.io

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 logo

Cursor

  1. 1.One click — Cursor will open and ask you to confirm the install.
Add to Cursor

One click — your client will open and ask you to confirm the install.

VS Code logo

VS Code

  1. 1.One click — VS Code will open and prompt you to confirm.
Add to VS Code

One click — your client will open and ask you to confirm the install.

Prerequisite
GitHub Copilot requiredMCP servers run in Copilot agent mode. The free Copilot tier works. Learn more
Claude Code logo

Claude Code

  1. 1.Run this command in your terminal.
  2. 2.Then in Claude Code, type /mcp to authorize.
Adds Antwork as an HTTP MCP server
$ claude mcp add antwork --transport http https://api.antwork.io/mcp
Prerequisite
Claude Pro, Max, Team, or API key requiredClaude Code authenticates against an Anthropic subscription or API key. Learn more
Claude Desktop logo

Claude Desktop

  1. 1.Open Claude Desktop → Customize → Connectors → Add custom connector.
  2. 2.Paste the URL below and click Authorize.
MCP server URL
https://api.antwork.io/mcp
Prerequisite
Claude Pro, Max, Team, or Enterprise requiredCustom connectors are not available on the free Claude plan. Learn more
ChatGPT logo

ChatGPT

  1. 1.Enable Developer Mode in ChatGPT → Settings → Apps & Connectors.
  2. 2.Add a new app: name "antwork", URL below, auth "OAuth".
MCP server URL
https://api.antwork.io/mcp
Prerequisite
ChatGPT Plus, Pro, Business, Enterprise, or Edu + Developer ModeCustom connectors are gated behind paid plans and require turning on Developer Mode in beta features. Learn more
Windsurf logo

Windsurf

  1. 1.Open Windsurf → Settings → MCP servers → Edit raw config.
  2. 2.Paste this snippet inside the mcpServers object.
mcpServers config · Settings → MCP
{
  "mcpServers": {
    "antwork": {
      "url": "https://api.antwork.io/mcp"
    }
  }
}
Gemini CLI logo

Gemini CLI

  1. 1.Run this command in your terminal.
  2. 2.Then run /mcp auth antwork inside the Gemini CLI.
Adds Antwork as an HTTP MCP server
$ gemini mcp add --transport http antwork https://api.antwork.io/mcp
OpenClaw logo

OpenClaw

  1. 1.Run this command in your terminal.
  2. 2.Then run mcporter auth antwork to authorize.
Adds Antwork via mcporter
$ mcporter config add antwork --url https://api.antwork.io/mcp --auth oauth
!Sign up first. The OAuth consent step requires an Antwork account. If you haven't signed up, do that at antwork.io/signup (free plan available) before adding the connector.

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.

readReadRead posts, social accounts, voice profiles, workspace settings, analytics. No mutations.
writeWriteCreate / edit / delete drafts and scheduled posts. Mutate media library and workspace settings. Does not publish.
publishDestructivePublish posts to connected social platforms and schedule them for future publishing. Granted only when the user explicitly approves.
mediaWriteUpload 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_token grant.
  • Revoke via the standard /oauth/revoke endpoint (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

whoamiReadProfile of the authenticated user.
list_workspacesReadList all workspaces the user belongs to. Shows isDefault flag.
set_default_workspaceWriteSet or clear the default workspace so subsequent tools omit workspace_id.
create_workspaceWriteCreate a new workspace owned by the authenticated user.
get_workspace_settingsReadBrand identity, content guidelines, target audience, and per-platform preferences.
update_workspace_identityDestructiveRename a workspace or update its description.
update_workspace_settingsDestructiveMutate workspace-level content guidelines and brand settings.

Social accounts & voice profiles

list_social_accountsReadAll connected social accounts with health, expiry, and platform.
get_connection_urlsReadOAuth URLs for connecting new social accounts.
disconnect_social_accountDestructiveRevoke a connected social account; tokens are deleted server-side.
get_voice_profilesReadPer-platform tone, vocabulary, and recurring phrases learned from existing content.
get_voice_profileWriteGet one voice profile and refresh it from the live account if stale.
fetch_platform_postsReadPull recent posts from a connected platform (used to refresh voice profiles).

Posts — read

list_postsReadList drafts, scheduled, published, and failed posts. Filterable by status and platform.
search_postsReadFull-text search across post bodies, hashtags, and per-platform copy.
get_postReadSingle post with full payload (text, media, status, per-platform URLs).
get_post_historyReadPer-day metric history for a published post — likes / comments / shares / impressions.

Posts — write

create_postWriteCreate a DRAFT post. Does not publish or schedule on its own — follow up with schedule_post or publish_post.
update_postWriteMutate any field on a post — text, platforms, hashtags, media, schedule time, per-platform copy.
duplicate_postWriteClone an existing post into a fresh draft.
delete_postDestructiveSoft-delete a post. For published posts also enqueues platform-side deletion when the connector supports it.

Posts — publishing

publish_postDestructivePublish a draft immediately to every configured platform. Waits up to ~25 seconds for terminal status and returns per-platform URLs.
schedule_postDestructiveSchedule a draft for a future timestamp. Server enforces that the time is in the future.
retry_failed_postDestructiveRetry a previously-failed publish — useful when a token was refreshed or rate limits cleared.

Analytics & planning

get_performanceReadAggregate engagement totals across the workspace for a given window.
get_engagement_historyReadPer-day engagement timeseries across the workspace.
get_optimal_posting_timesReadSuggested posting windows per platform inferred from historical engagement.
refresh_post_metricsWriteHit the platform APIs live for specific posts and refresh their cached metrics. Slow but freshest — prefer get_performance for broad reads.
get_calendarReadScheduled and published posts grouped by date. Renders as an interactive calendar in MCP App clients.

Media

list_mediaReadWorkspace media library — images, video, PDFs.
get_mediaReadSingle media item with download URL and per-mime metadata.
start_media_uploadWriteOpen 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_mediaWriteIngest 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_mediaWriteAttach media items to a draft post.
delete_mediaDestructiveSoft-delete a media item; does not affect posts that already reference it.
!Tool argument schemas are introspected from the server live — connect a client and call tools/list to see the canonical JSON Schemas with required fields and types.

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_postsposts-table: filterable list with inline detail modal that edits + publishes without leaving chat.
  • get_post, create_post, update_post, duplicate_postpost-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_calendarcalendar: month / week views of scheduled + published posts.
  • start_media_uploadupload-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_accountconnections-panel: per-account health, reconnect, disconnect; workspace switching via the header propagates to every other iframe.
  • list_media, get_mediamedia-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 accountResults returned from publish_post and get_post so multi-account workspaces show the correct publishing account in UI.

Contact

Questions, integration help, or bugs? Reach out.

iker.gonzalez@antwork.io

Antwork · Spain · EU