El Protocolo de Contexto de Modelo (MCP) es un estándar abierto para conectar agentes de IA a herramientas externas y fuentes de datos. Con MCP, tu agente puede consultar bases de datos, integrarse con APIs como Slack y GitHub, y conectarse a otros servicios sin escribir implementaciones de herramientas personalizadas.
Los servidores MCP pueden ejecutarse como procesos locales, conectarse a través de HTTP o ejecutarse directamente dentro de tu aplicación SDK.
Este ejemplo se conecta al servidor MCP de documentación de Claude Code usando transporte HTTP y usa allowedTools con un comodín para permitir todas las herramientas del servidor.
import { query } from "@anthropic-ai/claude-agent-sdk";
for await (const message of query({
prompt: "Use the docs MCP server to explain what hooks are in Claude Code",
options: {
mcpServers: {
"claude-code-docs": {
type: "http",
url: "https://code.claude.com/docs/mcp"
}
},
allowedTools: ["mcp__claude-code-docs__*"]
}
})) {
if (message.type === "result" && message.subtype === "success") {
console.log(message.result);
}
}El agente se conecta al servidor de documentación, busca información sobre hooks y devuelve los resultados.
Puedes configurar servidores MCP en código al llamar a query(), o en un archivo .mcp.json que el SDK carga automáticamente.
Pasa servidores MCP directamente en la opción mcpServers:
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: ["-y", "@modelcontextprotocol/server-filesystem", "/Users/me/projects"]
}
},
allowedTools: ["mcp__filesystem__*"]
}
})) {
if (message.type === "result" && message.subtype === "success") {
console.log(message.result);
}
}Crea un archivo .mcp.json en la raíz de tu proyecto. El SDK lo carga automáticamente:
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/Users/me/projects"]
}
}
}Las herramientas MCP requieren permiso explícito antes de que Claude pueda usarlas. Sin permiso, Claude verá que las herramientas están disponibles pero no podrá llamarlas.
Las herramientas MCP siguen el patrón de nomenclatura mcp__<server-name>__<tool-name>. Por ejemplo, un servidor de GitHub llamado "github" con una herramienta list_issues se convierte en mcp__github__list_issues.
Usa allowedTools para especificar qué herramientas MCP puede usar Claude:
options: {
mcpServers: { /* your servers */ },
allowedTools: [
"mcp__github__*", // All tools from the github server
"mcp__db__query", // Only the query tool from db server
"mcp__slack__send_message" // Only send_message from slack server
]
}Los comodines (*) te permiten permitir todas las herramientas de un servidor sin listar cada una individualmente.
En lugar de listar herramientas permitidas, puedes cambiar el modo de permiso para otorgar acceso más amplio:
permissionMode: "acceptEdits": Aprueba automáticamente el uso de herramientas (aún solicita operaciones destructivas)permissionMode: "bypassPermissions": Omite todos los avisos de seguridad, incluidos los de operaciones destructivas como eliminación de archivos o ejecución de comandos de shell. Úsalo con cuidado, especialmente en producción. Este modo se propaga a los suagentes generados por la herramienta Task.options: {
mcpServers: { /* your servers */ },
permissionMode: "acceptEdits" // No need for allowedTools
}Consulta Permisos para más detalles sobre los modos de permiso.
Para ver qué herramientas proporciona un servidor MCP, consulta la documentación del servidor o conéctate al servidor e inspecciona el mensaje de inicialización system:
for await (const message of query({ prompt: "...", options })) {
if (message.type === "system" && message.subtype === "init") {
console.log("Available MCP tools:", message.mcp_servers);
}
}Los servidores MCP se comunican con tu agente usando diferentes protocolos de transporte. Consulta la documentación del servidor para ver qué transporte admite:
npx @modelcontextprotocol/server-github), usa stdioProcesos locales que se comunican a través de stdin/stdout. Usa esto para servidores MCP que ejecutas en la misma máquina:
Usa HTTP o SSE para servidores MCP alojados en la nube y APIs remotas:
Para HTTP (sin streaming), usa "type": "http" en su lugar.
Define herramientas personalizadas directamente en el código de tu aplicación en lugar de ejecutar un proceso de servidor separado. Consulta la guía de herramientas personalizadas para detalles de implementación.
Cuando tienes muchas herramientas MCP configuradas, las definiciones de herramientas pueden consumir una parte significativa de tu ventana de contexto. La búsqueda de herramientas MCP resuelve esto cargando herramientas dinámicamente bajo demanda en lugar de precargar todas ellas.
La búsqueda de herramientas se ejecuta en modo automático de forma predeterminada. Se activa cuando las descripciones de tus herramientas MCP consumirían más del 10% de la ventana de contexto. Cuando se activa:
defer_loading: true en lugar de cargarse en contexto por adelantadoLa búsqueda de herramientas requiere modelos que admitan bloques tool_reference: Sonnet 4 y posteriores, u Opus 4 y posteriores. Los modelos Haiku no admiten búsqueda de herramientas.
Controla el comportamiento de búsqueda de herramientas con la variable de entorno ENABLE_TOOL_SEARCH:
| Valor | Comportamiento |
|---|---|
auto | Se activa cuando las herramientas MCP superan el 10% del contexto (predeterminado) |
auto:5 | Se activa en el umbral del 5% (personaliza el porcentaje) |
true | Siempre habilitado |
false | Deshabilitado, todas las herramientas MCP cargadas por adelantado |
Establece el valor en la opción env:
const options = {
mcpServers: { /* your MCP servers */ },
env: {
ENABLE_TOOL_SEARCH: "auto:5" // Enable at 5% threshold
}
};La mayoría de los servidores MCP requieren autenticación para acceder a servicios externos. Pasa credenciales a través de variables de entorno en la configuración del servidor.
Usa el campo env para pasar claves API, tokens y otras credenciales al servidor MCP:
Consulta Listar problemas de un repositorio para un ejemplo completo y funcional con registro de depuración.
Para servidores HTTP y SSE, pasa encabezados de autenticación directamente en la configuración del servidor:
La especificación MCP admite OAuth 2.1 para autorización. El SDK no maneja flujos OAuth automáticamente, pero puedes pasar tokens de acceso a través de encabezados después de completar el flujo OAuth en tu aplicación:
// After completing OAuth flow in your app
const accessToken = await getAccessTokenFromOAuthFlow();
const options = {
mcpServers: {
"oauth-api": {
type: "http",
url: "https://api.example.com/mcp",
headers: {
Authorization: `Bearer ${accessToken}`
}
}
},
allowedTools: ["mcp__oauth-api__*"]
};Este ejemplo se conecta al servidor MCP de GitHub para listar problemas recientes. El ejemplo incluye registro de depuración para verificar la conexión MCP y las llamadas de herramientas.
Antes de ejecutar, crea un token de acceso personal de GitHub con alcance repo y establécelo como variable de entorno:
export GITHUB_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxximport { query } from "@anthropic-ai/claude-agent-sdk";
for await (const message of query({
prompt: "List the 3 most recent issues in anthropics/claude-code",
options: {
mcpServers: {
"github": {
command: "npx",
args: ["-y", "@modelcontextprotocol/server-github"],
env: {
GITHUB_TOKEN: process.env.GITHUB_TOKEN
}
}
},
allowedTools: ["mcp__github__list_issues"]
}
})) {
// Verify MCP server connected successfully
if (message.type === "system" && message.subtype === "init") {
console.log("MCP servers:", message.mcp_servers);
}
// Log when Claude calls an MCP tool
if (message.type === "assistant") {
for (const block of message.content) {
if (block.type === "tool_use" && block.name.startsWith("mcp__")) {
console.log("MCP tool called:", block.name);
}
}
}
// Print the final result
if (message.type === "result" && message.subtype === "success") {
console.log(message.result);
}
}Este ejemplo usa el servidor MCP de Postgres para consultar una base de datos. La cadena de conexión se pasa como argumento al servidor. El agente descubre automáticamente el esquema de la base de datos, escribe la consulta SQL y devuelve los resultados:
import { query } from "@anthropic-ai/claude-agent-sdk";
// Connection string from environment variable
const connectionString = process.env.DATABASE_URL;
for await (const message of query({
// Natural language query - Claude writes the SQL
prompt: "How many users signed up last week? Break it down by day.",
options: {
mcpServers: {
"postgres": {
command: "npx",
// Pass connection string as argument to the server
args: ["-y", "@modelcontextprotocol/server-postgres", connectionString]
}
},
// Allow only read queries, not writes
allowedTools: ["mcp__postgres__query"]
}
})) {
if (message.type === "result" && message.subtype === "success") {
console.log(message.result);
}
}Los servidores MCP pueden fallar al conectarse por varias razones: el proceso del servidor podría no estar instalado, las credenciales podrían ser inválidas o un servidor remoto podría ser inaccesible.
El SDK emite un mensaje system con subtipo init al inicio de cada consulta. Este mensaje incluye el estado de conexión para cada servidor MCP. Verifica el campo status para detectar fallos de conexión antes de que el agente comience a trabajar:
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") {
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");
}
}Verifica el mensaje init para ver qué servidores no se conectaron:
if (message.type === "system" && message.subtype === "init") {
for (const server of message.mcp_servers) {
if (server.status === "failed") {
console.error(`Server ${server.name} failed to connect`);
}
}
}Causas comunes:
env coincida con lo que espera el servidor.npx, verifica que el paquete exista y que Node.js esté en tu PATH.Si Claude ve herramientas pero no las usa, verifica que hayas otorgado permiso con allowedTools o cambiando el modo de permiso:
options: {
mcpServers: { /* your servers */ },
allowedTools: ["mcp__servername__*"] // Required for Claude to use the tools
}El SDK de MCP tiene un tiempo de espera predeterminado de 60 segundos para conexiones de servidor. Si tu servidor tarda más en iniciarse, la conexión fallará. Para servidores que necesitan más tiempo de inicio, considera:
allowedTools y disallowedToolsWas this page helpful?