devin-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@devin-mcpImplement a new login feature using OAuth2"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Devin MCP Server
An MCP server that enables Claude Code to delegate implementation tasks to Devin.
Installation
Option 1: Install from Local Path (Development)
If you have the devin-mcp repository cloned locally:
# Navigate to the devin-mcp directory
cd /path/to/devin-mcp
# Install with uv (creates venv automatically)
uv pip install -e .Option 2: Install from Git Repository
# Install directly from git (if repository is public)
uv pip install git+https://github.com/iainmck29/devin-mcp.git
# Or from a specific branch/tag
uv pip install git+https://github.com/iainmck29/devin-mcp.git@mainOption 3: Install as a Published Package
# If published to PyPI (future)
uv pip install devin-mcpNote: The MCP server needs to be installed in a location where uv can find it. If installing from a local path, use an absolute path or ensure the path is accessible.
Related MCP server: claude-code-codex-agents
Configuration
Set your Devin API key and playbook ID as environment variables:
export DEVIN_API_KEY="your-api-key-here"
export DEVIN_PLAYBOOK_ID="your-playbook-id-here"Usage
Running the Server
# Via module (using uv run to automatically use project venv)
uv run python -m devin_mcp.server
# Or via CLI entry point
uv run devin-mcpClaude Code Configuration
Step 1: Get Your Devin API Key
Sign in to Devin
Navigate to your account settings or API section
Generate or copy your API key
Step 2: Locate Claude Code Settings File
The MCP settings file location depends on your OS:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
Step 3: Configure the MCP Server
Open the settings file and add the devin server configuration. If the file doesn't exist or is empty, create it with this structure:
{
"mcpServers": {
"devin": {
"command": "uv",
"args": ["run", "python", "-m", "devin_mcp.server"],
"env": {
"DEVIN_API_KEY": "your-api-key-here",
"DEVIN_PLAYBOOK_ID": "your-playbook-id-here"
}
}
}
}Important Notes:
Replace
"your-api-key-here"with your actual Devin API keyReplace
"your-playbook-id-here"with your Devin playbook IDIf you installed from a local path, ensure
uvis in your PATHThe
uvcommand must be able to find the installeddevin_mcppackageIf you installed in a specific virtual environment, you may need to use the full path to
uvor activate that environment
Step 4: Restart Claude Code
After saving the configuration file:
Completely quit Claude Code (not just close the window)
Reopen Claude Code
The MCP server should automatically start and connect
Step 5: Verify It's Working
Open Claude Code in any project
Check the MCP status indicator (usually in the bottom status bar)
Try asking Claude: "What MCP tools are available?" or "List the devin tools"
You should see the four Devin tools:
devin_run_phase,devin_await_completion,devin_get_status,devin_send_message
Troubleshooting
Server won't start:
Verify
uvis installed:which uvoruv --versionCheck that
devin_mcpis installed:uv run python -c "import devin_mcp; print('OK')"Check Claude Code logs for error messages
API key errors:
Verify the API key is correct in the config file
Ensure there are no extra quotes or whitespace around the key
Test the API key manually:
export DEVIN_API_KEY="your-key" && uv run python -c "from devin_mcp.client import DevinClient; print('OK')"
Tools not appearing:
Restart Claude Code completely
Check the MCP connection status in Claude Code
Verify the config JSON is valid (no trailing commas, proper quotes)
Available Tools
devin_run_phase
Create a new Devin session with a playbook and prompt.
Parameters:
prompt(string, required): The task promptplaybook_id(string, optional): The Devin playbook ID. UsesDEVIN_PLAYBOOK_IDenv var if not provided.
Returns: { success, session_id, url } or { success: false, error }
devin_await_completion
Poll a session until it reaches a terminal state.
Parameters:
session_id(string, required): The session to monitortimeout(integer, optional): Max wait in seconds (default: 600)
Returns: Full session details or raises DevinTimeoutError
devin_get_status
Quick, non-blocking status check.
Parameters:
session_id(string, required): The session to check
Returns: { success, session_id, url, status_enum } or { success: false, error }
devin_send_message
Send a follow-up message to a session.
Parameters:
session_id(string, required): The session to messagemessage(string, required): The message content
Returns: { success, detail } or { success: false, error }
Example Workflow
# 1. Start a phase (uses DEVIN_PLAYBOOK_ID from environment)
result = devin_run_phase(
prompt="thoughts/shared/plans/2024-01-15-auth.md, phase 1, branch feature/auth"
)
# Or override with a specific playbook:
# result = devin_run_phase(prompt="...", playbook_id="pb_abc123")
session_id = result["session_id"]
# 2. Wait for completion
session = devin_await_completion(session_id, timeout=600)
# 3. Check result
if session["status_enum"] == "finished":
print("Phase completed successfully!")
elif session["status_enum"] == "blocked":
# Send clarification if needed
devin_send_message(session_id, "Use the existing User model from src/models/user.py")Development
# Install dev dependencies
uv pip install -e ".[dev]"
# Run tests (using uv run to ensure correct environment)
uv run pytest
# Type check
uv run mypy src/Available Tools
4 toolsdevin_await_completionA
Poll a Devin session until it reaches a terminal state.
Args: session_id: The session ID to monitor timeout: Maximum seconds to wait (default: 600 = 10 minutes)
Returns: Full session details if completed within timeout. Raises DevinTimeoutError if timeout exceeded.
The tool polls every 5 seconds and returns when status_enum is one of: blocked, finished, expired, stopped, suspend_requested, suspend_requested_frontend
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the polling interval (5 seconds), the timeout default and error behavior (DevinTimeoutError), the terminal states it waits for, and the return value. It's behaviorally transparent about its blocking/polling nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly packed with useful information: polling behavior, terminal states list, timeout semantics, error behavior, return value. No filler or redundancy. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema (per context signals), so return-value documentation burden is relieved. The description covers the polling cadence, terminal states, timeout behavior, and error handling. It's fairly complete for a monitor/poll tool, though it doesn't describe what 'full session details' contains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does address both parameters: session_id is described as 'The session ID to monitor' and timeout as 'Maximum seconds to wait' with default. This matches what's in the input schema (default 600), adding minimal extra meaning beyond restating schema values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb+resource: 'Poll a Devin session until it reaches a terminal state.' It lists the exact terminal states and distinguishes itself from siblings like devin_get_status (which presumably returns a snapshot once, not polls) and devin_run_phase. The purpose is unambiguous and specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly explains that this polls until terminal state, distinguishing it from a one-shot status check. It names the terminal states explicitly so an agent knows when to use this vs getting a single snapshot. However, it doesn't explicitly say 'use devin_get_status instead if you only need one snapshot' as an exclusionary note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
devin_get_statusB
Quick, non-blocking status check on a Devin session.
Args: session_id: The session ID to check
Returns: dict with keys: - success: bool indicating if status was retrieved - session_id: The session ID - url: The session URL (if success) - status_enum: Current status (if success) - error: Error message (if not success)
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It does note the tool is 'non-blocking' and 'quick,' which is useful for an agent deciding whether to poll vs. block. However, it doesn't disclose rate-limit implications, whether repeated polling is discouraged, or the exact status_enum values that might be returned — the return is described but not the nuance of status values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the one-line summary. However, the Returns section is somewhat verbose relative to value — it lists six keys that partially mirror what the output schema would already describe. The Args section is near-tautological. Some trimming could improve signal density.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter read-only tool with an output schema, the description is reasonably complete. It covers purpose, non-blocking nature, and return structure. However, it lacks guidance on how status_enum values relate to sibling tools (e.g., when to use devin_await_completion vs repeatedly calling this), and doesn't specify error conditions beyond a generic error field.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (session_id) exists at 0% schema coverage. The description minimally states 'The session ID to check' in the args section, which is a tautology of the parameter name. No additional semantics like format, where to obtain the ID, or validation rules are provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it's a 'Quick, non-blocking status check on a Devin session.' The verb 'check' with the resource 'status' is specific and clear. It distinguishes itself from siblings like devin_run_phase (execution) and devin_send_message (messaging), though it doesn't explicitly name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context via 'Quick, non-blocking' — suggesting it's for lightweight polling rather than blocking waits. However, it doesn't explicitly contrast with devin_await_completion, which would be the natural alternative for waiting on a session to finish. No explicit when/when-not guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
devin_run_phaseB
Create a new Devin session with a playbook and prompt.
Args: prompt: The task prompt (e.g., "thoughts/shared/plans/2024-01-15-auth.md, phase 1, branch feature/auth") playbook_id: The Devin playbook ID to use. Optional if DEVIN_PLAYBOOK_ID env var is set.
Returns: dict with keys: - success: bool indicating if session was created - session_id: The created session ID (if success) - url: The session URL (if success) - error: Error message (if not success)
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | Yes | ||
| playbook_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It does document the return format (success, session_id, url, error keys), which is helpful. However, it doesn't disclose side effects, auth requirements, rate limits, or what happens on partial failure. The return format disclosure is useful but incomplete for a session-spawning external tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with Args/Returns sections, making it scannable. Every sentence adds information. It's somewhat longer than the minimum, but the return-key documentation and parameter examples justify the length. Formatting is clean and front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, which offloads some completeness burden. With only 2 parameters (one optional) and a clear purpose, the description is reasonably complete. However, given it spawns external sessions, missing context about session lifecycle, expected duration, or relationship to devin_await_completion could confuse an agent about the asynchronous nature of the created session.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the schema itself provides minimal help. The description compensates partially by explaining the prompt parameter with a concrete example and clarifying that playbook_id is optional if the env var is set. This adds real meaning beyond the schema, but there's no documentation of the playbook_id parameter's format or how to find valid IDs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a new Devin session with a playbook and prompt. It uses a specific verb+resource construction and the context makes the purpose distinct from siblings (get_status, await_completion, send_message). However, it doesn't explicitly differentiate itself from sibling create-like tools, though none of the siblings appear to create sessions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context (starting a new session), and the example prompt provides a meaningful usage template. However, it doesn't explicitly state when to use this tool versus alternatives, nor mention exclusions or prerequisites (like needing DEVIN_PLAYBOOK_ID or an existing plan document).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
devin_send_messageA
Send a follow-up message to a Devin session.
Use this when Devin is blocked and needs clarification to continue.
Args: session_id: The session ID to message message: The message content to send
Returns: dict with keys: - success: bool indicating if message was sent - detail: Confirmation message (if success) - error: Error message (if not success)
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden for behavioral disclosure. It discloses the return shape (success/detail/error) and implies the message-sending operation. However, it doesn't state whether messages require a running/awaiting session, whether there are rate limits, or what happens if the session is already complete—modest gaps. It does add a meaningful usage trigger though.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and tightly written—a purpose line, a when-to-use line, and a compact Args/Returns section. No filler words or redundancy. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite 0% schema coverage and no annotations, the description compensates well: it explains the use trigger, both parameters, and documents the return dict. An output schema exists (the Returns section), so return format needn't be elsewhere. For a simple 2-param message tool, the description is largely complete; only minor behavioral gaps (rate limits, session-state preconditions) keep it from 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and both params have minimal schema titles ('Message', 'Session Id'). The description adds modest context: session_id is 'the session ID to message' and message is 'the message content to send.' This is marginally helpful but doesn't convey format, length constraints, or expectation that the message should be a clarification prompt—acceptable but thin.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it sends a follow-up message to a Devin session with a specific verb+resource ('Send a follow-up message to a Devin session'). It distinguishes from siblings reasonably—devin_run_phase runs a phase, devin_get_status/await_completion query state—while this writes a message. It's clear but doesn't explicitly contrast with siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: 'Use this when Devin is blocked and needs clarification to continue.' This directly answers when to use it (unblocking a stuck session). It gives clear context but doesn't mention when NOT to use it or name alternatives explicitly, which prevents a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v0.1.0- First observed
devin_await_completion - First observed
devin_get_status - First observed
devin_run_phase - First observed
devin_send_message
TDQS
Scored across 4 tools
Each tool targets a distinct lifecycle operation: run creates a session, get_status checks state, await_completion polls to terminal state, and send_message sends a follow-up. No two tools overlap in purpose, and even the two status-related tools are clearly differentiated (one is a quick snapshot, the other blocks until completion).
All four tools follow a consistent devin_verb_noun pattern: run_phase, get_status, await_completion, send_message. The verb style (run, get, await, send) and noun targets are uniformly clear and predictable.
Four tools is a well-scoped surface for a Devin session MCP server. Each tool covers a distinct part of the lifecycle (create, check, wait, interact) without extraneous duplication or missing essentials.
The core session lifecycle is well covered: create/run, check status, await terminal state, and send a follow-up message. The only potential minor gap is the absence of a direct cancel/stop operation, which is likely handled via suspend_requested state, but it's a reasonable gap agents can work around.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
One identity across Claude Code, Codex, Cursor, Gemini, Windsurf: shared inbox and handoffs.
No-data MCP handoff for local Claude Code to Codex harness moves. $49 lifetime.
Claude Code / MCP skills for the dev pipeline: discover, spec, design, build, ship, operate.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables Codex to delegate tasks to Claude Code, allowing Claude to investigate, edit, and verify changes in the repository with background job management.7MIT
- AlicenseAqualityDmaintenanceEnables Claude Code to delegate tasks to OpenAI's Codex CLI (GPT-5.4) with structured execution traces, parallel execution, session persistence, and adversarial code review.15MIT
- AlicenseAqualityBmaintenanceDelegate tasks from Claude Code to other models (Codex CLI, DeepSeek, OpenRouter, etc.) without leaving the app.219MIT
- AlicenseAqualityCmaintenanceEnables Claude to delegate tasks to external coding agents (Codex or Antigravity) for independent reviews, separate quota usage, and async processing.6MIT