squidX logo

MCP server

Give Claude, Cursor or any MCP client a set of tools over your workspace: read the queue and the numbers, draft and schedule posts, and, if you allow it, publish.

What it is

The Model Context Protocol is how an AI client discovers and calls tools. squidX runs an MCP server at

MCP endpoint
https://squidx.io/api/mcp
  • Transport: Streamable HTTP, stateless, JSON responses. Every request is authenticated on its own; there is no session to keep and no SSE stream to open.
  • Auth: OAuth 2.1, the way the MCP spec describes it. The client registers itself, sends you to squidx.io to sign in, and you pick the workspace and the access level on a consent page. A client that cannot do OAuth sends an API key as a bearer token instead. See Authentication.
  • Tools: the key's permissions decide the tool list. A read-only key never sees squidx_publish_post, so the model cannot even try. The full list is in Tools reference.

Connect a client

The URL is the same everywhere: https://squidx.io/api/mcp. Most clients sign in through the browser. Where a key is shown, replace sqx_your_key with yours.

claude.ai and Claude Desktop

claude.ai and Claude Desktop
Settings > Connectors > Add custom connector
Name:  squidX
URL:   https://squidx.io/api/mcp
Connect, then sign in to squidX and press Allow.

No key to paste. Claude registers itself, sends you to squidx.io to sign in, and you pick the workspace and the access level on the consent page. Custom connectors need a paid Claude plan.

Claude Code

Claude Code
claude mcp add --transport http squidx https://squidx.io/api/mcp
# then, inside Claude Code:
/mcp   # pick squidx, Authenticate

Sign-in opens in the browser. To use an API key instead, add --header "Authorization: Bearer sqx_your_key" to the first command.

Cursor

Cursor
{
  "mcpServers": {
    "squidx": {
      "url": "https://squidx.io/api/mcp"
    }
  }
}

Save as .cursor/mcp.json in the project, or in ~/.cursor/mcp.json for every project. Cursor opens the sign-in when the server asks for it. To use a key instead, add headers: { Authorization: "Bearer ${env:SQUIDX_API_KEY}" }.

Codex CLI

Codex CLI
codex mcp add squidx --url https://squidx.io/api/mcp \
  --oauth-client-registration dcr
# or with a key:
codex mcp add squidx --url https://squidx.io/api/mcp --bearer-token-env-var SQUIDX_API_KEY

The first form signs in through the browser. The second reads the key from SQUIDX_API_KEY.

Any Streamable HTTP client

Any Streamable HTTP client
{
  "type": "http",
  "url": "https://squidx.io/api/mcp",
  "headers": {
    "Authorization": "Bearer sqx_your_key"
  }
}

Transport: Streamable HTTP, stateless, JSON responses. A client that understands OAuth 2.1 can leave the header out: the 401 points at /.well-known/oauth-protected-resource and the rest follows the spec.

How the sign-in works

  1. The client calls the server without a token and gets a 401 that names /.well-known/oauth-protected-resource.
  2. It reads that document, then /.well-known/oauth-authorization-server, and registers itself at /api/oauth/register. No secret changes hands for a public client; PKCE protects the exchange.
  3. Your browser opens /oauth/authorize. You sign in to squidX if needed, pick the workspace and the access level, and press Allow.
  4. The client trades the code for an access token (one hour) and a refresh token (30 days, rotated on every use) at /api/oauth/token.

The app then appears under Settings › API and MCP access › Connected apps, where one click disconnects it. An access token is an API key with an expiry: the same permissions, the same rate limit, the same tool list.

Permissions and safety

  • Read only: the agent can list posts, read analytics, leads and mentions. It cannot change anything.
  • Read and write: adds drafting, scheduling, rescheduling, cancelling, deleting and publishing.
  • Custom: posts:write without posts:publish is the sweet spot for a content agent. It fills the queue at the times you set; nothing goes to X until the cron reaches the slot, and you can still read the queue first.
  • squidx_publish_post and squidx_delete_post take a confirm: true argument and describe themselves as actions to confirm with the person. A well-behaved client asks before calling them.
  • Writes are never retried by squidX. The server instructions tell the model the same, and to check the queue with squidx_list_posts instead of calling a write twice.
Images
The MCP tools take text. To attach an image, upload it with POST /media and pass its id in the segment's media list, or add it from the dashboard composer.

Things to ask

  • "What is in my queue for this week?"
  • "Which of my posts got the most impressions in the last 90 days, and what do they have in common?"
  • "Draft a five-post thread on this article and put it in the next free slot."
  • "Move tomorrow's post to Thursday 9am Paris time."
  • "Show me the mentions I have not answered yet."
  • "List new leads above 80 and write a first DM for each."

Troubleshooting

  • "Couldn't register with squidX's sign-in service": the discovery documents did not answer. Check that https://squidx.io/.well-known/oauth-authorization-server loads in a browser, then remove and re-add the connector.
  • Sent back to the app with an error: you pressed Deny, or the request lacked PKCE. Add the connector again.
  • 401 with a key: the header is missing or the key is wrong. The header is Authorization: Bearer sqx_..., with the space.
  • No write tools in the list: the access is read-only. Disconnect the app in Settings and sign in again with Read and write, or create a key with it; then reconnect the client so it fetches the tool list again.
  • 405 on GET: expected. The endpoint only takes POSTed JSON-RPC messages; a client that opens a standalone SSE stream falls back to plain requests.
  • Tool answers inactive: the workspace has no active plan. Drafts still work; queuing and publishing need a subscription or credits.