Skip to main content

Hosted MCP server discovery manifest (public)

Orbit runs a hosted remote MCP server at POST /api/v1/mcp (Streamable-HTTP JSON-RPC) that lets an MCP-aware agent host or aggregator drive Orbit’s CPaaS capabilities — messaging, voice, contacts, campaigns, analytics — without running a local process. But callers need to know the server exists before they hold an Orbit API key. This public, unauthenticated endpoint fills that gap: it returns a standard MCP Registry server.json-shaped manifest that aggregators, crawlers, and MCP clients can read to auto-discover and auto-configure the server. The same manifest is also served from two self-serve copies — https://orbit.devotel.io/.well-known/mcp.json for self-hosted discovery and apps/mcp-server/server.json in the repo — kept in lockstep so every discovery path sees the same payload.

Response example

200

Verify the manifest caches correctly

The response carries a Cache-Control: public, max-age=300, s-maxage=300, stale-while-revalidate=600 header. Manifest contents change rarely (only when the hosted server version is bumped), so aggregators can cache the response for up to five minutes and serve stale content for ten minutes while revalidating in the background. Treat the version field as eventually consistent — a newly deployed tool catalog may take up to the cache window to surface. Before your aggregator hard-codes the manifest, fetch it once and assert the cache headers are as above and the remotes[0].url matches the endpoint you will POST to. That way a version bump or a URL change surfaces at setup time, not after your client has cached a stale copy.

Calling the server: POST /api/v1/mcp

Unlike the discovery manifest above, the JSON-RPC endpoint is authenticated — pass your Orbit API key as X-API-Key: <key> or Authorization: Bearer <key>, the same way every other REST route authenticates. The route accepts a single JSON-RPC 2.0 envelope per request: {"jsonrpc":"2.0","id":<number or string>,"method":"<name>","params":{...}}. Four methods are wired: initialize, tools/list, tools/call, and notifications/initialized. A request with no id (or id: null) is a JSON-RPC notification and returns 202 with no body.

tools/list — enumerate what your key can call

Only tools your API key’s scopes unlock are listed — the catalog is default-deny, so an unscoped key sees an empty tools array.

tools/call — send_sms (messaging.send SMS)

The canonical write tool: send an SMS. The params.name is the exact tool name from tools/list; params.arguments is the validated input object.
The tool result inverts the usual MCP shape so an LLM gets the payload as text: result.content[0].text holds the JSON-stringified body of the underlying Orbit REST response. When the underlying call returns a non-2xx, result.isError is true and the same envelope still comes back with HTTP 200. Always check isError before acting on the text payload.

Error envelopes

Failures come back as a JSON-RPC error object — {"jsonrpc":"2.0","id":<your id>,"error":{"code":<number>,"message":"<reason>"}}. HTTP status is still 200. The -32001 code is deliberately the same for “unknown tool” and “known but unscoped”: an unscoped caller cannot probe which tools exist. The example below uses a key without the messages:write scope.
Grant the missing scope on the key in Settings → API keys, or request access from a workspace admin.

No authentication on the discovery manifest

The discovery route above is registered before API-key authentication in the app’s middleware chain (pre-auth, the same way the health probe and well-known agent-keys routes are) — genuinely unauthenticated by design, not just documented that way. Aggregators, registry crawlers, and MCP client transports call it without an API key. Only the actual JSON-RPC endpoint (POST /api/v1/mcp) requires the key.

Next steps

  • Full walkthrough: the MCP server guide covers the Claude/Cursor client setup and the full tool catalog.
  • Scopes: every tool name maps to a regular Orbit API-key scope — see authentication.
  • Self-hosted twin files: https://orbit.devotel.io/.well-known/mcp.json and the repo file apps/mcp-server/server.json carry the same manifest for local-process and self-hosted discovery paths.