MCP server
intellia mcp serves the CLI to an AI agent over the Model Context Protocol (MCP), on stdin and stdout. The agent
gets the CLI’s guides, schemas, verified examples and your organization’s inventory, and can run CLI commands, with
the same credentials the CLI already uses. One line of configuration adds it to Claude Code, Cursor or any other MCP
client.
Add it to your client
The server has two modes. Choose one when you add it; an agent cannot change it.
Default: the agent asks before anything changes.
claude mcp add intellia -- intellia mcp--allow-writes: the agent changes your org without asking.
claude mcp add intellia -- intellia mcp --allow-writes--allow-writes gives the connected agent write access to your organization. Every command except secret get and
secret use runs without asking you first. Use it only with an agent you would trust with your own terminal. There is
no other way to turn writes on.
The same server in a project’s .mcp.json (Claude Code), or in .cursor/mcp.json or ~/.cursor/mcp.json (Cursor):
{
"mcpServers": {
"intellia": { "command": "intellia", "args": ["mcp"] }
}
}For --allow-writes, use "args": ["mcp", "--allow-writes"].
Tools
| Tool | What it does |
|---|---|
search |
Searches the CLI’s guides and verified examples by keywords. Each hit names its resource and the command that prints it. |
get_schema |
Prints the JSON Schema of a file the CLI reads, as intellia schema does. |
explain_error |
Explains an error code, as intellia explain does. |
next |
Suggests commands from the local state, as intellia next does. |
inventory |
Lists your organization’s resources, as intellia inventory does. It needs an org admin role. |
ask |
Answers a question about the platform, as intellia ask does. |
run |
Runs one CLI command, given as an argv array such as ["webhooks", "list"], and returns its JSON. |
ask is billed to the active organization like intellia ask, with up to two model calls per question.
run never uses a shell: each element of the array is one argument. A leading "intellia" is dropped.
Resources
| Resource | Holds |
|---|---|
intellia://guides/{topic} |
A task guide, as intellia guide <topic> prints it. |
intellia://examples/{id} |
A verified example, as intellia examples show <id> prints it. |
intellia://schemas/{kind} |
A file schema, as intellia schema <kind> prints it. |
intellia://inventory |
Your organization’s inventory. |
What asks first
In the default mode, run executes most read-only commands at once. These commands do not change your organization.
The server’s instructions give the agent the exact list, generated from the same policy run enforces.
Every other command asks you first. It asks because the command does one or more of these things:
- changes data on the platform;
- runs code from this workspace;
- writes files on this machine;
- sends a local file to the platform.
So a read-only command still asks when:
- it runs workspace code or writes files by default, as
pull,app validateandworkflow builddo; - it is given an option that writes files:
--output,--out,--emit,--dir,--download,--with-source,--in-placeor--extract-functions; - it sends a local file to the platform, as
conditions evaluateandforms acceptance-testdo.
When a command asks, your client shows a confirmation with the exact command, as it will run, and the folder it runs in. The command runs only if you approve. Each approval covers that one call. The same command asks again next time, and nothing is remembered.
Spending credits does not ask on its own. The ask tool and the read-only searches that use credits run at once.
run runs ask too, and prints a hint beside the result that the ask tool is the better entry point.
The confirmation uses MCP elicitation. Support for it varies by client. A client without it cannot run anything that
asks. Those commands are refused with the code mcp_confirmation_unsupported, and every command that runs at once
and every other tool still works. Run the refused command in a terminal, or start the server with --allow-writes.
Never over MCP
secret get and secret use are refused in both modes, with the code mcp_command_never, even if you would approve
them: either can print a credential into the agent’s context. Bind the secret to the workflow node, or use it through
bindings.
Build fence
--build-fence refuses the commands a Developer Mode build does not run: each publishes, deploys or changes a resource
the module declares (the user deploys the module once the build is verified), or puts a secret’s value where the run’s
transcript can hold it (run refuses those two in every mode). Other live changes are not fenced. Each refusal has the code
mcp_command_build_fenced and names what to run instead. The server judges the command it resolves, so an alias or an
option before the command does not get around it, and --dry-run counts only as the command’s own option, never after
-- or inside another argument.
| Command | Instead |
|---|---|
modules deploy |
modules deploy is not permitted during build: the user deploys the module once intellia_verify_module passes. Run intellia modules check . to check it now. |
workflow deploy, workflow publish, workflow delete, workflow unpublish, publish, delete |
Live workflow deployment/mutation is not permitted during build; use intellia workflow build and intellia workflow validate. |
agents push, agents create, agents update, agents delete, kbs push, kbs create, kbs update, kbs delete, app-sites create, app-sites update, app-sites delete, schedules create, schedules update, schedules delete, webhooks create, webhooks update, webhooks delete |
Live org resource mutation is not permitted during build; author the declarative files in the module workspace. |
app build |
app build publishes a new app version to the live org. Check the app with intellia app bundle --dir <app dir>: it validates, tests and bundles, and publishes nothing. The module ships the app: name its directory in the site file (app: ../apps/<slug>), and the user’s deploy builds it. |
tables push without --dry-run |
tables push without --dry-run is not permitted during build. Keep the schema in tables/<name>.yaml, and check it with intellia tables push <file> --dry-run. |
tables rows create, tables rows update, tables rows delete, tables rows import |
tables rows create, update, delete and import change rows in the live org’s table, and are not permitted during build. Declare starter rows under seed: in tables/<name>.yaml; the user’s deploy seeds an empty table with them. |
deploy without --dry-run |
deploy writes the workflow, and the tables, agents, knowledge bases, webhooks, schedules and skills it bundles, to the live org. Check it with intellia deploy --dry-run <file> or intellia validate <file>; the user deploys the module once intellia_verify_module passes. |
secret get, secret use |
secret get and secret use put a secret’s value where the run’s transcript and logs can hold it, so agents may not run them. Agents use secrets through bindings, which supply the value to the workflow or app when it runs. |
The server also sets INTELLIA_BUILD_FENCE=1 for every command it runs. With that variable set to 1, the CLI
itself refuses the same commands, whoever starts it: a shell, a script or another program. That refusal has the code
cli_command_build_fenced. --help still works, over MCP and in the CLI.
The server in OpenCode 2.1.3’s opencode.jsonc, with Code Mode off, so each tool stays its own call:
{
"mcp": {
"servers": {
"intellia": {
"type": "local",
"command": ["intellia", "mcp", "--allow-writes", "--build-fence"],
"codemode": false,
"timeout": { "execution": 330000 }
}
}
}
}OpenCode 2.1.3 has no execution timeout by default. timeout.execution is in milliseconds, and 330,000 is just over
the five minutes each command has (see Limits).
The folder it starts in
Every command runs in the folder your client started the server in:
- The API endpoint and organization are resolved once, when the server starts, as the CLI resolves them in a
terminal, and each command gets them as environment variables. A
.intelliarc.yamlin the folder never sets them (its other keys apply); the environment and your home config can.
Inside that folder, a command does what it does in a terminal. It may write local files (for example, pull or
kbs files download) and run the workspace’s own code (for example, app validate evaluates intellia.manifest.ts,
and workflow build builds TypeScript workflows). MCP adds no sandbox.
Credentials
The server uses the CLI’s own credentials: INTELLIA_API_KEY or INTELLIA_TOKEN, or ~/.intellia/credentials.
Credentials are redacted from results. Every tool result, resource and error is scanned, and each credential the CLI
holds is replaced with <redacted>, written as-is or JSON-escaped, URL-encoded, hex or base64. A credential in
another encoding, compressed or split across chunks is not recognised. Commands run with INTELLIA_AGENT_INVOCATION=1, so secret get and secret use also refuse on
their own.
Limits
- Each command has five minutes. A command that does not finish is stopped, and the result says it timed out.
- A result over 200,000 characters is refused with
mcp_output_too_large. The refusal still gives the command’s exit code, so you can tell whether a change went through. - A command cannot read input. When the command has a
--yesoption,runadds--yesbefore asking you, so the confirmation shows it and your approval stands in for the command’s own prompt. Any other prompt fails at once. - When the client closes the server, or the server gets SIGINT or SIGTERM, every running command is stopped first. A process that a command starts in a session of its own is not reached.
Errors
A refusal is the CLI’s usual error object, with ok: false, error, code and fix. explain_error (or
intellia explain <code>) explains each code.