MCP Introduction
Plug your AI coding agent directly into Nodion. No local daemon, no custom glue code.
Nodion runs a Remote MCP server at https://mcp.nodion.com/mcp. Any MCP-compatible client (Claude Code, Cursor, Zed, OpenAI Codex, Gemini CLI, Windsurf) can authenticate with a Bearer token and drive your Nodion projects in natural language.
How it works
MCP is an open protocol that lets LLMs call external tools. The Nodion MCP server exposes the actions an AI agent needs to manage applications and run code in isolated containers: listing projects, deploying new versions, reading env vars, fetching deployment logs, plus a full runner surface including the runs.exec sandbox primitive. Each tool maps 1:1 to a public REST API endpoint.
Your API key scopes decide what the agent can do. A read-only key exposes only read tools; a deploy-capable key unlocks deploy, env.set and the other write tools.
1. Create an API key
Head to my.nodion.com → User Settings → Security, click Add API Key, choose the scopes you want to grant and optionally restrict the key to specific projects or set an expiry. The token is shown only once, so copy it straight into your AI client's config.
See the Authentication API docs for the full scope matrix.
2. Connect your AI client
Claude Code
bashclaude mcp add --transport http nodion https://mcp.nodion.com/mcp \
--header "Authorization: Bearer YOUR_NODION_API_KEY" Start or restart a Claude Code session. The Nodion tools become available in chat immediately.
Zed
Open the command palette, run zed: open settings and add:
json{
"context_servers": {
"nodion": {
"url": "https://mcp.nodion.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_NODION_API_KEY"
}
}
}
} OpenAI Codex
Edit ~/.codex/config.toml:
toml[mcp_servers.nodion]
url = "https://mcp.nodion.com/mcp"
[mcp_servers.nodion.http_headers]
Authorization = "Bearer YOUR_NODION_API_KEY" For cleaner key handling, store the token in an env var and use env_http_headers instead.
Gemini CLI
Edit ~/.gemini/settings.json:
json{
"mcpServers": {
"nodion": {
"httpUrl": "https://mcp.nodion.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_NODION_API_KEY"
}
}
}
} Cursor
Edit ~/.cursor/mcp.json (global) or .cursor/mcp.json (per project):
json{
"mcpServers": {
"nodion": {
"url": "https://mcp.nodion.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_NODION_API_KEY"
}
}
}
} Windsurf
Edit ~/.codeium/windsurf/mcp_config.json with the same JSON shape as Cursor.
3. Verify the connection
The easiest sanity check is the MCP Inspector:
bashnpx @modelcontextprotocol/inspector https://mcp.nodion.com/mcp Set the Authorization header to Bearer YOUR_NODION_API_KEY and you will see the tool manifest.
Available tools
Write tools require confirm=true, so the model must ask before making changes:
Read — foundational
whoami. Returns the authenticated Nodion user.projects.list. Lists projects this key can access.projects.use. Selects the active project for the session.regions.list. Lists available Nodion regions. Returns ids needed byapps.create/runners.create.instance_types.list. Lists CPU/memory/price for every instance type. Returns ids needed byapps.create/runners.create.
Read — applications
apps.list,apps.get. Browse applications in the current project.apps.logs. Last N runtime stdout/stderr lines from the running instances of an application.deployments.list,deployments.get. Inspect past deployments.deployments.logs. Build and release pipeline log lines of a specific deployment (image pull, build, release output). Different fromapps.logs, which is the container's runtime output.env.list. Lists environment variables.domains.list. Lists domains attached to an application.processes.list. Lists processes (web, worker, cron, etc.) with currentinstance_amount.
Read — git integrations
integrations.list. Lists git integrations available to the current project owner (GitHub, GitLab, Bitbucket, Nodion Git).repos.list. Lists repositories accessible through a given integration.branches.list. Lists branches of a given repository.
Read — runners and runs
runners.list,runners.get. Browse runners and their warmup state.runs.list,runs.get. Inspect past runs and their status.runs.logs. Paginated log lines of a run, with optionalafter_idcursor.runs.tail. Last N log lines as a single text blob, LLM-friendly.
Write — applications
deploy. Creates a new deployment.env.set. Creates or updates an environment variable.env.unset. Removes an environment variable.processes.scale. Sets a process'sinstance_amount. Pass0to stop the process.
Write — runners and runs
runners.create,runners.update,runners.delete. Manage runner configuration.runners.warmup. Pre-pull a runner's image. Idempotent, low-risk; noconfirmrequired.runs.create. Trigger an asynchronous run. Returns immediately with a pending run id.runs.stop. Cancel a pending or running run.
Sandbox execution
One convenience tool combines triggering, polling and log collection into a single synchronous call. It is the building block for AI-agent code execution:
runs.exec. Run a command and wait for the result. Two modes:- Pass
runner_idto use an existing runner. - Pass
image_name+image_tag+region_id+instance_type_idto spin up an ephemeral runner that is deleted automatically once the run finishes (or times out).
{ run_id, runner_id, ephemeral, status, exit_code, duration_ms, output, truncated, timed_out }. Default timeout 60 seconds, max 300. Output is capped at 30 KB. For long-running jobs useruns.create+ polling instead.- Pass
Audit log
Every MCP tool call is audited. The originating API key, tool name, project, arguments and duration are recorded so you can review what an agent did on your behalf. View it under User Settings → Security → Audit.