Reference

Protocol reference

What a client needs to talk to the server without a ready-made one.

POST https://app.filmo.io/api/v1/mcp. There is no workspace segment: the account comes from the credential. The transport is Streamable HTTP, POST only and stateless: the server assigns no Mcp-Session-Id. A GET answers HTTP 405 with a JSON-RPC error -32000.

MethodWhat it does
initializeNegotiates the protocol. The server answers the revision the client asks for when it accepts it (see Protocol revisions below), otherwise 2025-06-18, with the capability tools and listChanged: false, and its instructions.
notifications/initializedAcknowledged by the client after initialize. A request that holds only notifications gets a 202 with no body.
tools/listThe catalogue. Public without a credential; with one, only the tools it can call.
tools/callRuns a tool. Needs a credential.
pingAnswers {}. Public.
Anything elsePrompts and resources are not offered: the server answers -32601. A batch holds at most 20 messages and runs them in order.
  • Content-Type: application/json and an Accept that lists application/json and text/event-stream, as the specification requires of a client.
  • Authorization: Bearer <key or access token> for tools/call.
  • MCP-Protocol-Version on every request after initialize, with the negotiated version (the specification asks it of a client).
StatusWhenBody
200A JSON-RPC message was processed, including a tool errorJSON-RPC response
401tools/call without a valid credential, or initialize or tools/list with a credential that is not validRFC 9457 problem, with WWW-Authenticate (resource_metadata, scope)
405GETJSON-RPC error -32000
308A production host that is not app.filmo.ioA JSON-RPC error that names the canonical URL
500An unexpected failureJSON-RPC error -32603

A limit imposed by the platform (413, 502, 504) is not a problem document.

A protocol failure is a JSON-RPC error with the standard codes (-32700 parse, -32600 invalid request, -32601 method not found, -32602 invalid params or unknown tool, -32603 internal). Messages are in English. A failed call is not one of these: see below.

Every tool declares an outputSchema, open to new fields. A success returns structuredContent with data (and pagination in lists) and meta:

meta fieldWhen
idempotencyKeyA write that takes a key: yours; on the four tools that duplicate something irreversible on a blind retry, the one the server generated if you sent none
idempotentReplaytrue when the call repeats an earlier one with the same key and nothing ran again
rateLimitAlways: { limit, remaining, reset }, what the RateLimit-* headers say over REST
etagA detail read: pass it as ifMatch on the next write

A failure is a result with isError: true and the RFC 9457 problem as JSON in content[0].text, with no structuredContent. A 429 problem carries retryAfter and the detail “Rate limit exceeded: retry in N seconds”. See Errors.

tools/list returns the four annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) and, on 25 tools, _meta["anthropic/requiresUserInteraction"]: true. They are hints that the server declares, not guarantees.

ResultTypeScript SDK callToolPython SDK call_tool
Success with metaReturns the resultReturns the result
Tool error (isError)Returns the result; read content[0].textReturns the result; read content[0].text
A 429Returns the result; retryAfter in the problemReturns the result; retryAfter in the problem
Unknown tool, bad requestThrows (JSON-RPC error)Throws

Filmo ran seven cases against the real route (a read, a write with idempotencyKey, a replay with the same key, a 400, a 403 insufficient_scope, a 404 and a 429) with the TypeScript SDK @modelcontextprotocol/sdk 1.26.0 and 1.32.1, the TypeScript client @modelcontextprotocol/client 2.3.1 and the Python SDK mcp 1.27.1 and 2.3.0. None raises -32602 and the 429 problem arrives readable. Client and StreamableHTTPClientTransport are used the same way in both TypeScript lines; only the package and the import change. Other versions were not tried.

  • A tool error has no structuredContent because the TypeScript 1.x SDK (callTool, from 1.20 to 1.32.1) validates it against the outputSchema even when isError is true. The 2.x client and the Python SDK do not validate it when isError is true; the error shape passes in all of them.
  • A success is validated against the outputSchema in both TypeScript lines, and an extra field raises -32602 Structured content does not match the tool's output schema. That is why the outputSchema of every tool is open to new fields.
  • The errors of the TypeScript 2.x SDK are ProtocolError (with a code); in 1.x they were McpError. If you catch by class, check the name when you migrate.
  • Not tried with the 2.x client: the OAuth flow, the caching of tools/list and the other changes of that line. The seven cases ran against doubles of the REST handlers, not against a deployed server.
RevisionNotes
2025-06-18The default: the server answers it when the client asks for it or for a revision the server does not know.
2025-03-26, 2024-11-05Accepted: the server answers the same revision the client asked for.
2025-11-25Not on the server's list, so it answers initialize with the default, as the lifecycle of that revision allows; a client that cannot use the default disconnects.
2026-07-28The current revision of the specification. It is stateless and has no initialize; most clients still use the earlier handshake.

The server does not announce client ID metadata documents (CIMD), which the newer specification prefers over dynamic registration. Sources: modelcontextprotocol.io/specification/versioning and /specification/2026-07-28/basic/versioning, checked on 2026-10-25.

  • Guides

    Errors

    A tool error is a result with isError: true and the problem in the first text block. Branch on its code.

  • Connect

    Build your own client

    Use the official MCP SDKs or the MCP connectors of the Anthropic and OpenAI APIs.

  • Introduction

    MCP server

    Connect an AI assistant to your Filmo account. It can use exactly the tools its key or connection allows.