MCP server
Use Graine from Claude, Cursor and other AI tools. One endpoint, your API key, and the same tools as Sprout — reads run at once, and your AI tool asks you before anything changes.
Graine runs a Model Context Protocol server. Connect an MCP client — Claude Desktop, Cursor, Claude Code, or any client that speaks MCP over HTTP — and it can read your agents, workflows, campaigns, calls and numbers, and make changes once you confirm them. These are the same tools Sprout uses in the dashboard.
| Endpoint | https://api.graine.ai/v2/mcp |
| Transport | Streamable HTTP. Each request is one JSON-RPC message, or a batch of up to 20, answered as JSON — no session to keep, no event stream |
| Authentication | Authorization: Bearer gat_… — a Graine API key, or Sign in with Graine |
| Protocol versions | 2025-06-18, 2025-03-26, 2024-11-05 |
| Methods | initialize, ping, tools/list, tools/call |
Before you start
Create an API key in the dashboard under API keys
(Authentication). The key's
scopes decide which tools your AI tool sees, and
the role of the person who made the key applies as well
(Keys and workspace roles): a
tool is listed only when both allow it. For an assistant that should only look,
give the key agents:read and calls:read and nothing else.
The key acts as you
Anything your AI tool does with the key is done as the key's creator, within its scopes. Keep the key out of files you share or commit, and revoke it under API keys to cut access at once (Revoke a key).
Connect your AI tool
Replace gat_YOUR_KEY with your key.
Claude Desktop
Open Settings → Developer → Edit Config and add Graine to
claude_desktop_config.json, then restart Claude Desktop. This uses
mcp-remote, which needs Node.js:
The header is written without a space after the colon, and the key sits in
env, as mcp-remote expects.
Cursor
Add Graine to ~/.cursor/mcp.json for every project, or to .cursor/mcp.json
in one project:
Claude Code
Add --scope user to use it in every project. To share the server with your
team in a project's .mcp.json without sharing a key, let each person's
environment supply it:
Check the key
Ask for the tools the key may use:
The answer lists each tool with its description, its inputs and how it is marked.
The tools
| Scope the key needs | Tools |
|---|---|
agents:read | list_agents, get_agent, list_workflows, get_workflow, list_workflow_samples, check_workflow, list_phone_numbers, list_knowledge_bases |
calls:read | list_campaigns, get_campaign, get_workflow_run, list_calls, get_call |
account:read | get_balance |
| Any key | search_docs, get_doc — these docs |
agents:write | create_agent, update_agent, clone_agent, create_workflow, save_workflow_draft, publish_workflow, assign_phone_number |
calls:write | place_test_call, test_run_workflow, cancel_workflow_run |
batches:write | start_campaign, pause_campaign, resume_campaign, start_workflow_campaign, pause_workflow_campaign, resume_workflow_campaign |
Read tools are marked read-only and change nothing. Every other tool changes something, and the ones that place calls or act on what is live — publishing a workflow, placing a test call or a test run, starting, pausing or resuming a campaign or a list, cancelling a run — are also marked destructive. Your AI tool asks you before it uses a tool that changes something; keep that on.
Attaching a document, undoing a change and opening a page are Sprout's alone: they need the dashboard.
What a change returns
A tool that changes something runs as soon as your AI tool calls it — your confirmation in the AI tool takes the place of Sprout's approval card. It answers with what happened:
status | Meaning |
|---|---|
done | The change was made. dashboard_path is the page that shows it. |
held | Your workspace's approval rules sent it to an admin, as they would any request made with this key. |
refused | This key may not do it. |
failed | It couldn't be made; summary says why. |
skipped | It changed since it was read. Read it again and retry. |
refused, failed and skipped come back as a tool error (isError: true),
so your AI tool knows the change didn't happen. Calls placed this way are
ordinary calls: billed, in Call History, and held to your balance and to the
agent being switched on, like every other call.
Limits and errors
| Tool calls | 120 per key per minute, on top of the API's own rate limits |
| A request | Up to 1 MB; a batch, up to 20 messages |
| A tool call | Answers within 90 seconds |
| Answer | When |
|---|---|
401 | No key, or a key that isn't valid — see Authentication |
403 | The key holds none of the scopes above |
429 | Over the limit; Retry-After says how many seconds to wait |
-32601 | A method this server doesn't have |
-32602 | A tool this key can't see, or arguments that aren't right |
-32700 / -32600 | The request isn't valid JSON-RPC |

