Your REST API is already the tool.

RCP is a lightweight, open protocol for exposing REST endpoints as AI-callable tools — no protocol server, no persistent connection. A server publishes a manifest; a client fetches it and calls the endpoints directly.

Read the docs$ npm i rcp-sdk
GET /manifest200
{ rcpVersion: "0.1", tools: […] }
// model picks create_order, supplies { item: "sku_88" }
POST https://api.acme.dev/orders200
{ id: "ord_193", status: "confirmed" }

The shape of it

Two roles, no third “host” layer, no persistent connection — every interaction is a plain, stateless HTTP request. Discovery and execution even hit different places: the manifest is only ever a directory, and the model’s tool call goes straight to the tool’s own URL.

  1. 1Discovery

    The client fetches the manifest URL once per session. The server returns its rcpVersion, auth mode, and tool list.

  2. 2Selection

    The model sees only exposedParams — anything bound to a resolver was already stripped from the schema.

  3. 3Execution

    The client fills resolver-bound params from ctx, renders the request, and calls the tool's own URL directly.

When it’s not MCP

If MCP is the right fit when you need rich, stateful capabilities, RCP is for the much more common case: you already have a REST API, and you just want an AI application to call some of its endpoints as tools.

RCPMCP
ConnectionStateless HTTP requestPersistent session
ServerYour existing REST APIA dedicated protocol server
Best fitYou already have endpoints to exposeRich, stateful capabilities

Params the model never sees

A resolver-bound param never reaches the model — it’s removed from the tool schema at discovery time, not just hidden by convention. Use it for a tenant ID, an internal user ID, anything the model shouldn’t supply or even see.

Read more about resolvers
// server declares the resolver
tenantId: resolver(ctx => ctx.tenantId)
// what the model is offered
{ tool: "list_orders", exposedParams: ["status", "limit"] }

SDKs

rcp-sdkTypeScript

The reference implementation. Client and server, same package.

View SDK docs

More languages land the same way — self-contained, own package manifest, own tests.

Popular guides

Expose REST API to AI in 5 minutes

Install rcp-sdk, defineTool(), serve manifest, discover with createRcpClient().

RCP vs MCP — lightweight alternative

When stateless HTTP beats a dedicated MCP server.

Build AI agent with OpenAI tools

Via OpenAI SDK — rcpToolsToOpenAiTools() to ChatCompletionTool[].

Build AI agent with LangChain

DynamicStructuredTool + LangGraph + MultiServerRcpClient.

Build AI agent with Gemini

Google GenAI function calling for Gemini 2.5 — Interactions + classic.

RCP manifest format

GET /manifest — JSON directory of AI tools.

Secure tenant isolation — killer feature

Params the model never sees — stop prompt injection from leaking tenant data.