MCP in the SDK¶
- URL: https://platform.claude.com/docs/en/agent-sdk/mcp.md
- Retrieved: 2026-01-08T05:11:32.935274+00:00
MCP in the SDK¶
Extend Claude Code with custom tools using Model Context Protocol servers
Overview¶
Model Context Protocol (MCP) servers extend Claude Code with custom tools and capabilities. MCPs can run as external processes, connect via HTTP/SSE, or execute directly within your SDK application.
Configuration¶
Basic Configuration¶
Configure MCP servers in .mcp.json at your project root:
```json TypeScript { "mcpServers": { "filesystem": { "command": "npx", "args": ["@modelcontextprotocol/server-filesystem"], "env": { "ALLOWED_PATHS": "/Users/me/projects" } } } }
```json Python
{
"mcpServers": {
"filesystem": {
"command": "python",
"args": ["-m", "mcp_server_filesystem"],
"env": {
"ALLOWED_PATHS": "/Users/me/projects"
}
}
}
}
Using MCP Servers in SDK¶
```typescript TypeScript import { query } from "@anthropic-ai/claude-agent-sdk";
for await (const message of query({ prompt: "List files in my project", options: { mcpServers: { "filesystem": { command: "npx", args: ["@modelcontextprotocol/server-filesystem"], env: { ALLOWED_PATHS: "/Users/me/projects" } } }, allowedTools: ["mcp__filesystem__list_files"] } })) { if (message.type === "result" && message.subtype === "success") { console.log(message.result); } }
```python Python
from claude_agent_sdk import query
async for message in query(
prompt="List files in my project",
options={
"mcpServers": {
"filesystem": {
"command": "python",
"args": ["-m", "mcp_server_filesystem"],
"env": {
"ALLOWED_PATHS": "/Users/me/projects"
}
}
},
"allowedTools": ["mcp__filesystem__list_files"]
}
):
if message["type"] == "result" and message["subtype"] == "success":
print(message["result"])
Transport Types¶
stdio Servers¶
External processes communicating via stdin/stdout:
```typescript TypeScript // .mcp.json configuration { "mcpServers": { "my-tool": { "command": "node", "args": ["./my-mcp-server.js"], "env": { "DEBUG": "${DEBUG:-false}" } } } }
```python Python
# .mcp.json configuration
{
"mcpServers": {
"my-tool": {
"command": "python",
"args": ["./my_mcp_server.py"],
"env": {
"DEBUG": "${DEBUG:-false}"
}
}
}
}
HTTP/SSE Servers¶
Remote servers with network communication:
```typescript TypeScript // SSE server configuration { "mcpServers": { "remote-api": { "type": "sse", "url": "https://api.example.com/mcp/sse", "headers": { "Authorization": "Bearer ${API_TOKEN}" } } } }
// HTTP server configuration { "mcpServers": { "http-service": { "type": "http", "url": "https://api.example.com/mcp", "headers": { "X-API-Key": "${API_KEY}" } } } }
```python Python
# SSE server configuration
{
"mcpServers": {
"remote-api": {
"type": "sse",
"url": "https://api.example.com/mcp/sse",
"headers": {
"Authorization": "Bearer ${API_TOKEN}"
}
}
}
}
# HTTP server configuration
{
"mcpServers": {
"http-service": {
"type": "http",
"url": "https://api.example.com/mcp",
"headers": {
"X-API-Key": "${API_KEY}"
}
}
}
}
SDK MCP Servers¶
In-process servers running within your application. For detailed information on creating custom tools, see the Custom Tools guide:
Resource Management¶
MCP servers can expose resources that Claude can list and read:
```typescript TypeScript import { query } from "@anthropic-ai/claude-agent-sdk";
// List available resources for await (const message of query({ prompt: "What resources are available from the database server?", options: { mcpServers: { "database": { command: "npx", args: ["@modelcontextprotocol/server-database"] } }, allowedTools: ["mcp__list_resources", "mcp__read_resource"] } })) { if (message.type === "result") console.log(message.result); }
```python Python
from claude_agent_sdk import query
# List available resources
async for message in query(
prompt="What resources are available from the database server?",
options={
"mcpServers": {
"database": {
"command": "python",
"args": ["-m", "mcp_server_database"]
}
},
"allowedTools": ["mcp__list_resources", "mcp__read_resource"]
}
):
if message["type"] == "result":
print(message["result"])
Authentication¶
Environment Variables¶
```typescript TypeScript // .mcp.json with environment variables { "mcpServers": { "secure-api": { "type": "sse", "url": "https://api.example.com/mcp", "headers": { "Authorization": "Bearer ${API_TOKEN}", "X-API-Key": "${API_KEY:-default-key}" } } } }
// Set environment variables process.env.API_TOKEN = "your-token"; process.env.API_KEY = "your-key";
```python Python
# .mcp.json with environment variables
{
"mcpServers": {
"secure-api": {
"type": "sse",
"url": "https://api.example.com/mcp",
"headers": {
"Authorization": "Bearer ${API_TOKEN}",
"X-API-Key": "${API_KEY:-default-key}"
}
}
}
}
# Set environment variables
import os
os.environ["API_TOKEN"] = "your-token"
os.environ["API_KEY"] = "your-key"
OAuth2 Authentication¶
OAuth2 MCP authentication in-client is not currently supported.
Error Handling¶
Handle MCP connection failures gracefully:
```typescript TypeScript import { query } from "@anthropic-ai/claude-agent-sdk";
for await (const message of query({ prompt: "Process data", options: { mcpServers: { "data-processor": dataServer } } })) { if (message.type === "system" && message.subtype === "init") { // Check MCP server status const failedServers = message.mcp_servers.filter( s => s.status !== "connected" );
if (failedServers.length > 0) {
console.warn("Failed to connect:", failedServers);
}
}
if (message.type === "result" && message.subtype === "error_during_execution") { console.error("Execution failed"); } }
```python Python
from claude_agent_sdk import query
async for message in query(
prompt="Process data",
options={
"mcpServers": {
"data-processor": data_server
}
}
):
if message["type"] == "system" and message["subtype"] == "init":
# Check MCP server status
failed_servers = [
s for s in message["mcp_servers"]
if s["status"] != "connected"
]
if failed_servers:
print(f"Failed to connect: {failed_servers}")
if message["type"] == "result" and message["subtype"] == "error_during_execution":
print("Execution failed")
Related Resources¶
- Custom Tools Guide - Detailed guide on creating SDK MCP servers
- TypeScript SDK Reference
- Python SDK Reference
- SDK Permissions
- Common Workflows