Developer Docs

MCP Server

Connect Claude, Cursor, or any MCP client to Chat33 — post, pull analytics, and build DM flows with natural language.

https://chat33.io/api/mcp/mcp
MCP spec

What it is

Chat33 runs a remote Model Context Protocol server (Streamable HTTP transport) at https://chat33.io/api/mcp/mcp. Every tool is a thin wrapper around the same v1 REST API that powers the n8n node and your own integrations — so anything an MCP client can do, it does with your real connected accounts, posts, and flows. No separate credentials or sandbox: it authenticates with the same sk_live_... API key from Settings → API Keys.

1. Connect from Claude Code

Create an API key in Settings → API Keys (default scopes cover everything: accounts:read, posts:read, posts:write, media:write, flows:read, flows:write), then register the server:

bash
claude mcp add --transport http chat33 https://chat33.io/api/mcp/mcp --header "x-api-key: sk_live_..."

Run claude mcp list to confirm it connected, then just ask — Claude Code will call the right tools.

2. Connect from claude.ai (or another client)

  1. Go to Settings → Connectors → Add custom connector.
  2. URL: https://chat33.io/api/mcp/mcp
  3. Add a custom header x-api-key with your Chat33 API key.

Note: claude.ai custom connectors are evolving quickly — use this with clients that support custom headers on remote MCP connections. Cursor, Windsurf, and other MCP-compatible tools work the same way: point them at the URL above with an x-api-key (or Authorization: Bearer sk_live_...) header.

3. Tools

ToolDescription
list_accountsList connected social accounts (channels), optionally filtered by platform
create_postCreate and queue (or schedule) a post across one or more connected accounts
validate_postDry run a post — checks media & platform compatibility without publishing
list_postsList posts, filterable by status, platform, or channel; paginated
get_postGet a single post by ID, including its live status and engagement stats
delete_postCancel a queued or scheduled post before it publishes
get_post_logsGet delivery/publish log entries for a post — for debugging failures
upload_mediaIngest a media file from a public https URL, returns a hosted URL to post with
create_upload_urlGet a presigned URL to PUT a local file to — for files with no public URL, or over 4.5MB
get_analyticsAggregate engagement analytics (views, likes, comments, shares) across published posts
list_flowsList all DM-automation flows, newest-updated first, with triggers and status
get_flowGet a single flow by ID, including its full node/edge graph and synced triggers
create_flowCreate a DM-automation flow (trigger + action node graph) in DRAFT status
set_flow_statusChange a flow's status: ACTIVE, PAUSED, ARCHIVED, or DRAFT

Flow authoring is guided in-tool: create_flow's description carries the full node/edge schema (18 node types, trigger types, worked examples), so a client can compose a valid flow from a plain-English request without a separate schema lookup. New flows are created DRAFT — call set_flow_status with ACTIVE to turn them on.

Auth & scopes

Requests authenticate with the same header the REST API and n8n node use: x-api-key: sk_live_... (an Authorization: Bearer sk_live_... header also works). Each tool call is authorized against the key's scopes, same as the equivalent REST endpoint — posts:write for create_post, flows:write for create_flow/set_flow_status, and so on.

Example prompts

"Post this video to my TikTok as private"

"Share this article on LinkedIn, connections only"

"How did my last 10 TikTok posts perform?"

"Create a flow that DMs everyone who comments SKILL on my latest reel"

Troubleshooting

401 Unauthorized — the API key is missing, invalid, or wasn't sent as a header at all. Re-check the connector config or the --header flag.

403 Insufficient scope — the key is missing a scope the tool needs. Flow tools in particular need flows:read/flows:write: keys created before flows shipped won't have them — create a new key, or add the scopes to the existing one in Settings → API Keys.

Tool call fails with a platform error — run validate_post first; it surfaces missing media, unsupported formats, and channel mismatches without publishing anything.