Rivet MCP
Connect your AI client to Rivet to inspect actors, call actions, and use the Actor Inspector.
Connect your client
The hosted endpoint is https://mcp.rivet.dev/mcp. When a hosted client connects, Rivet opens a sign-in flow so you can choose and approve its access.
Claude Code
Run this command, then approve the Rivet sign-in when it opens.
claude mcp add --transport http rivet https://mcp.rivet.dev/mcp
Codex
Run this command, then approve the Rivet sign-in when it opens.
codex mcp add rivet --url https://mcp.rivet.dev/mcp
Cursor
Add this configuration to Cursor, then approve the Rivet sign-in when it opens.
{
"mcpServers": {
"rivet": {
"url": "https://mcp.rivet.dev/mcp"
}
}
}
Gemini CLI
Run this command, then approve the Rivet sign-in when it opens.
gemini mcp add --transport http rivet https://mcp.rivet.dev/mcp
VS Code
Run this command, then approve the Rivet sign-in when it opens.
code --add-mcp '{"name":"rivet","type":"http","url":"https://mcp.rivet.dev/mcp"}'
Local
Add this configuration to your client to connect to Rivet already running on your machine. Local connections need neither a URL nor sign-in.
{
"mcpServers": {
"rivet": {
"command": "npx",
"args": ["-y", "@rivet-dev/mcp", "--target", "local"]
}
}
}
Control access
Scope hosted connections
You can constrain the hosted endpoint with organization, project, and namespace query parameters.
| Endpoint | Access |
|---|---|
https://mcp.rivet.dev/mcp | Your client asks which scope to use and remembers it. |
https://mcp.rivet.dev/mcp?organization=ORG | One organization. |
https://mcp.rivet.dev/mcp?organization=ORG&project=PROJECT | One project. |
https://mcp.rivet.dev/mcp?organization=ORG&project=PROJECT&namespace=NS | One namespace. |
Replace the placeholders with the same slugs used in your dashboard URL: /orgs/ORG/projects/PROJECT/ns/NS. If you omit the values, your client asks you to choose and stays on that selection for the rest of the session.
Security model
- Generated code runs with no network, environment variables, files, or way to start a process.
- Every call goes through Rivet. Rivet checks it against the access you approved and attaches your credentials.
- A hosted connection carries only the access you granted, and its grant expires after 15 minutes.
- Your credentials stay on Rivet and never reach the model.
- An inline Inspector is limited to the actor you requested and disappears with the conversation. Clients that cannot render it receive the same details as text.
What you can do
These examples are illustrative and make no live backend calls.
Find running actors
Which chat rooms are still awake?
Rivet MCP uses search to find rivet.actors.list, lists the matching chat-room actors, and returns one concise result: 3 rooms awake.
Call an actor action
What has Acme been saying?
Rivet MCP uses search to find rivet.actor.action, calls the getHistory action on the chat-room · acme actor, and returns the action result: 128 messages from Acme.
Inspect an actor inline
Open the Actor Inspector for chat-room · acme.
The same actor view available in the dashboard opens inside the conversation. It includes the State, Connections, Queue, Workflow, and Database tabs. The inline view is limited to the actor you requested and disappears with the conversation. Clients that cannot render the Inspector receive the same details as text.
One request, two tools
Your client does not have to choose from a long list of narrow tools. Rivet MCP exposes two tools and composes the operations needed for a request.
Find the right operations
The search tool looks at the namespace you connected and returns only the operations that apply to the request.
Run one composed request
The execute tool writes ordinary JavaScript, combines the relevant operations, and returns one answer instead of making the client coordinate every call. You do not write this generated code or see it unless you ask.
For the request “Which chat rooms are still awake, and what has Acme been saying?”, Rivet MCP finds and runs rivet.actors.list and rivet.actor.action:
// "Which chat rooms are still awake, and what has Acme been saying?"
const { actors } = await rivet.actors.list({ name: "chat-room" });
const awake = actors.filter((room) => room.status === "running");
const history = await rivet.actor.action({
actor: { name: "chat-room", key: ["acme"] },
name: "getHistory",
});
return { awake: awake.length, history };
The result is one answer: 3 rooms awake, 128 messages from Acme.