Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use this skill when helping users add MCP servers to their Warp configuration.
.claude/skills/warpdotdev-agent-add-mcp/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 3% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 36% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 111% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 36% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 62% | 0% |
Warp supports MCP servers via native config files. Follow these steps when helping a user add an MCP server.
If the user hasn't specified, ask whether they want to configure the server globally (for all projects) or project-scoped (for a specific repository only).
Config file paths:
~/.warp/.mcp.json{repo_root}/.warp/.mcp.jsonIf the user hasn't provided the server's connection details, use WebSearch to find the correct configuration for the named server.
If it's unclear whether the server should be run as a local CLI process (stdio transport) or connected to via URL (HTTP/SSE streaming transport), ask the user which they prefer.
Check whether the target config file exists.
mkdir -p for the directory and initialize it with an empty mcpServers wrapper key:json { "mcpServers": {} }
mcpServers (preferred)mcp_serversserversmcp.servers (nested under a mcp key)Preserve the existing wrapper key when writing. If the existing key is unrecognized or incompatible, switch to mcpServers.
Never remove existing server entries — only add or update the new server.
json{ "mcpServers": { "server-name": { "command": "npx", "args": ["-y", "@scope/package-name"], "env": { "API_KEY": "${API_KEY}" } } } }
By default, Warp spawns stdio servers from the directory the config was discovered in:
{repo_root}/.warp/.mcp.json) run from the repo root.~/.warp/.mcp.json, ~/.claude.json, etc.) run from the home directory.If the server's command or args are relative paths (e.g. ./tooling/mcp/server.js) or the server expects a specific cwd, set working_directory to override the default:
json{ "mcpServers": { "server-name": { "command": "node", "args": ["./tooling/mcp/server.js"], "working_directory": "/absolute/path/to/repo" } } }
json{ "mcpServers": { "server-name": { "url": "https://example.com/mcp", "env": { "API_KEY": "${API_KEY}" } } } }
For environment variables containing secrets, use ${VAR_NAME} syntax — Warp will substitute the value from the user's environment at runtime.
.mcp.json files on save — no restart required.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 11,289 | 6,515 | -42% | 1 | 1 | 0% | 1,938 | 1,992 | +3% | 0 | 0 | — |
case-02 | fail→fail | 10,994 | 17,242 | +57% | 1 | 1 | 0% | 1,786 | 2,453 | +37% | 0 | 0 | — |
case-03 | fail→pass | 9,512 | 6,794 | -29% | 1 | 1 | 0% | 1,460 | 1,983 | +36% | 0 | 0 | — |
case-04 | pass→pass | 3,503 | 3,709 | +6% | 1 | 1 | 0% | 530 | 1,473 | +178% | 0 | 0 | — |
case-05 | pass→pass | 5,679 | 8,756 | +54% | 1 | 1 | 0% | 1,013 | 1,794 | +77% | 0 | 0 | — |
case-06 | pass→pass | 4,912 | 3,960 | -19% | 1 | 1 | 0% | 638 | 1,516 | +138% | 0 | 0 | — |
case-07 | fail→pass | 6,589 | 6,937 | +5% | 1 | 1 | 0% | 1,047 | 2,211 | +111% | 0 | 0 | — |
case-08 | pass→pass | 7,541 | 5,547 | -26% | 1 | 1 | 0% | 1,246 | 1,761 | +41% | 0 | 0 | — |
case-09 | fail→pass | 7,643 | 4,117 | -46% | 1 | 1 | 0% | 1,100 | 1,500 | +36% | 0 | 0 | — |
case-10 | fail→pass | 7,201 | 4,316 | -40% | 1 | 1 | 0% | 1,032 | 1,676 | +62% | 0 | 0 | — |
case-11 | pass→pass | 10,653 | 5,362 | -50% | 1 | 1 | 0% | 1,714 | 1,804 | +5% | 0 | 0 | — |
case-12 | fail→pass | 6,519 | 4,491 | -31% | 1 | 1 | 0% | 1,073 | 1,598 | +49% | 0 | 0 | — |
case-13 | fail→fail | 9,048 | 6,961 | -23% | 1 | 1 | 0% | 1,527 | 2,081 | +36% | 0 | 0 | — |
case-14 | pass→pass | 3,410 | 9,143 | +168% | 1 | 1 | 0% | 523 | 1,506 | +188% | 0 | 0 | — |
case-15 | fail→pass | 9,047 | 3,629 | -60% | 1 | 1 | 0% | 1,324 | 1,327 | +0% | 0 | 0 | — |
case-16 | pass→pass | 12,042 | 7,411 | -38% | 1 | 1 | 0% | 2,048 | 2,121 | +4% | 0 | 0 | — |
case-17 | fail→pass | 6,142 | 2,847 | -54% | 1 | 1 | 0% | 898 | 1,286 | +43% | 0 | 0 | — |
case-18 | pass→pass | 5,766 | 4,419 | -23% | 1 | 1 | 0% | 813 | 1,603 | +97% | 0 | 0 | — |
case-19 | fail→pass | 10,721 | 5,244 | -51% | 1 | 1 | 0% | 1,717 | 1,704 | -1% | 0 | 0 | — |
case-20 | pass→fail | 8,981 | 10,697 | +19% | 1 | 1 | 0% | 1,539 | 2,361 | +53% | 0 | 0 | — |
case-21 | pass→pass | 8,880 | 22,542 | +154% | 1 | 1 | 0% | 1,423 | 2,767 | +94% | 0 | 0 | — |
case-22 | pass→pass | 10,904 | 14,426 | +32% | 1 | 1 | 0% | 1,973 | 3,238 | +64% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +36 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.