Skip to main content
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, su 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 su aplicación SDK.
Esta página cubre la configuración de MCP para el Agent SDK. Para agregar servidores MCP a la CLI de Claude Code de modo que se carguen en cada proyecto, consulte Alcances de instalación de MCP.

Inicio rápido

Este ejemplo se conecta al servidor MCP de documentación de Claude Code usando transporte HTTP y utiliza allowedTools con un comodín para permitir todas las herramientas del servidor.
El agente se conecta al servidor de documentación, busca información sobre hooks y devuelve los resultados.

Agregar un servidor MCP

Puede configurar servidores MCP en código al llamar a query(), o en un archivo .mcp.json cargado mediante settingSources.

Agregar un servidor en código

Pase servidores MCP directamente en la opción mcpServers. Este ejemplo inicia un servidor MCP del sistema de archivos local para /Users/me/projects. Reemplace esa ruta con un directorio en su máquina:

Agregar un servidor desde un archivo de configuración

Cree un archivo .mcp.json en la raíz de su proyecto. El archivo se carga cuando la fuente de configuración project está habilitada, que lo está para las opciones predeterminadas de query(). Si establece settingSources explícitamente, incluya "project" para que este archivo se cargue. Reemplace /Users/me/projects con un directorio en su máquina:

Temporización de la conexión

Claude Code registra los servidores que usted pasa en options.mcpServers al inicio y emite el mensaje init una vez que se resuelve la espera de primer turno, si la hay. Si cada servidor de options.mcpServers retrasa el primer turno, y cuándo se conecta, depende de su tipo: Los servidores cargados desde archivos de configuración como .mcp.json o desde plugins comúnmente muestran pending en el mensaje init. Cuando options.mcpServers contiene un servidor stdio, HTTP o SSE, el primer turno espera a que se conecten estos servidores pendientes también, hasta MCP_TIMEOUT. Cuando options.mcpServers está vacío o contiene solo servidores SDK, el primer turno espera hasta 2 segundos en su lugar:
  • Con búsqueda de herramientas, el valor predeterminado: la espera cubre servidores aún pendientes configurados con alwaysLoad: true y no el resto. El resto sigue conectándose en segundo plano. Disponibilidad de herramientas describe cómo Claude accede a sus herramientas una vez que se conectan.
  • Sin búsqueda de herramientas: la espera cubre cada servidor pendiente. Configurar búsqueda de herramientas cubre qué desactiva la búsqueda de herramientas. Si usted excluye la herramienta ToolSearch de la sesión, por ejemplo a través de disallowedTools, la sesión también se ejecuta sin búsqueda de herramientas.
Si usted establece permissionPromptToolName, el primer turno también espera al servidor de esa herramienta en todos los casos, hasta MCP_TIMEOUT. Para establecer la espera del primer turno usted mismo, agregue CLAUDE_CODE_MCP_STARTUP_WAIT_MS a la opción env, por ejemplo CLAUDE_CODE_MCP_STARTUP_WAIT_MS: "5000". El primer turno entonces espera hasta esa cantidad de milisegundos para cada servidor pendiente, independientemente de si la búsqueda de herramientas está disponible. Este plazo también reemplaza la espera del primer turno MCP_TIMEOUT para servidores stdio, HTTP y SSE en options.mcpServers. CLAUDE_CODE_MCP_STARTUP_WAIT_MS requiere Claude Code v2.1.274 o posterior. Los servidores aún pendientes cuando termina la espera siguen conectándose en segundo plano. Establezca la variable en 0 para omitir la espera. Un servidor permissionPromptToolName mantiene su propia espera MCP_TIMEOUT independientemente del valor. Para bloquear el inicio mismo en una fase separada y anterior a la espera del primer turno, antes de que se envíe el mensaje init:
  • Establezca MCP_CONNECTION_NONBLOCKING en 0 para bloquear todo el lote de conexiones. Claude Code limita esa espera a 5 segundos por defecto. Ajuste el límite con la variable de entorno MCP_CONNECT_TIMEOUT_MS, en milisegundos. Los servidores aún pendientes en ese plazo siguen conectándose en segundo plano.
  • Establezca alwaysLoad: true en la configuración de un servidor para que sus herramientas estén disponibles en sus esquemas completos en el primer turno, exentas de aplazamiento de búsqueda de herramientas. Claude Code espera al inicio a que se conecten las herramientas de ese servidor, limitado al mismo plazo, mientras que otros servidores siguen conectándose en segundo plano; un servidor remoto con una lista de herramientas en caché las proporciona sin conectarse, según la tabla anterior.
El mensaje system con subtipo init reporta el estado de cada servidor en el momento en que se emite; consulte Manejo de errores para leer esos estados.

Permitir herramientas MCP

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.

Convención de nomenclatura de herramientas

Las herramientas MCP siguen el patrón de nomenclatura mcp__<server-name>__<tool-name>. Por ejemplo, un servidor GitHub llamado "github" con una herramienta list_issues se convierte en mcp__github__list_issues.

Aprobación automática con allowedTools

Use allowedTools para aprobar automáticamente herramientas MCP específicas para que Claude pueda usarlas sin un aviso de permiso:
Los caracteres comodín (*) le permiten permitir todas las herramientas de un servidor sin enumerar cada una individualmente.
Prefiera allowedTools sobre modos de permiso para acceso MCP. permissionMode: "acceptEdits" no aprueba automáticamente herramientas MCP (solo ediciones de archivos y comandos Bash del sistema de archivos). permissionMode: "bypassPermissions" sí aprueba automáticamente herramientas MCP pero también desactiva la mayoría de otros avisos de seguridad, lo que es más amplio de lo necesario; consulte Cómo se evalúan los permisos para los avisos que permanecen. Un carácter comodín en allowedTools otorga exactamente el servidor MCP que desea y nada más. Consulte Modos de permiso para una comparación completa.

Descubrir herramientas disponibles

Para ver qué herramientas proporciona un servidor MCP, consulte la documentación del servidor o inspeccione el array tools en el mensaje init system. Los nombres de herramientas MCP comienzan con mcp__. Claude Code emite el mensaje init después de la espera de conexión de primer turno para servidores pasados en options.mcpServers, por lo que el array tools enumera las herramientas mcp__ de cada servidor que se ha conectado para entonces, más las de servidores con una lista de herramientas en caché, que se conectan en el primer uso. Las herramientas de cualquier otro servidor que no se haya conectado están ausentes; consulte Manejo de errores para leer el estado de cada servidor. Este filtro imprime los nombres de herramientas MCP:
También puede pedirle a Claude que enumere las herramientas disponibles de un servidor.

Tipos de transporte

Los servidores MCP se comunican con su agente utilizando diferentes protocolos de transporte. Consulte la documentación del servidor para ver qué transporte admite:
  • Si la documentación le proporciona un comando para ejecutar (como npx @modelcontextprotocol/server-filesystem), use stdio
  • Si la documentación le proporciona una URL, use HTTP o SSE
  • Si está creando sus propias herramientas en código, use un servidor MCP SDK

Servidores stdio

Procesos locales que se comunican a través de stdin/stdout. Utiliza esto para servidores MCP que ejecutas en la misma máquina. Para el formato .mcp.json, usa los mismos campos que se muestran en Agregar un servidor desde un archivo de configuración. En código, pasa el comando y sus argumentos. Reemplaza /Users/me/projects con un directorio en tu máquina:

Servidores HTTP/SSE

Use HTTP o SSE para servidores MCP alojados en la nube y API remotas. Para el formulario .mcp.json, use los mismos campos que en el ejemplo en Encabezados HTTP para servidores remotos, con "type": "sse" para un servidor SSE. En código, pase la URL del servidor:
Para el transporte HTTP transmisible, use "type": "http" en su lugar. En archivos de configuración .mcp.json y otros JSON, "streamable-http" se acepta como un alias para "http". El tipo McpHttpServerConfig de los SDK declara solo "http", así que use "http" para servidores que pase en código.

Servidores MCP SDK

Defina herramientas personalizadas directamente en el código de su aplicación en lugar de ejecutar un proceso de servidor separado. Consulte la guía de herramientas personalizadas para obtener detalles de implementación. Un servidor MCP SDK registrado por una solicitud de control initialize comienza a conectarse tan pronto como Claude Code procesa la solicitud. Cuando tiene muchas herramientas MCP configuradas, las definiciones de herramientas pueden consumir una porción significativa de su ventana de contexto. La búsqueda de herramientas resuelve esto al retener las definiciones de herramientas del contexto y cargar solo las que Claude necesita para cada turno. La búsqueda de herramientas está habilitada de forma predeterminada. Consulte Búsqueda de herramientas para opciones de configuración, mejores prácticas y uso de búsqueda de herramientas con herramientas SDK personalizadas.

Autenticación

La mayoría de los servidores MCP requieren autenticación para acceder a servicios externos. Pase las credenciales a través de variables de entorno en la configuración del servidor.

Pasar credenciales a través de variables de entorno

Use el campo env para pasar claves API, tokens y otras credenciales al servidor MCP:

Encabezados HTTP para servidores remotos

Para servidores HTTP y SSE, pase los encabezados de autenticación directamente en la configuración del servidor:
Para un ejemplo completo y funcional de un servidor remoto autenticado con encabezados, consulte Listar problemas de un repositorio.

Autenticación OAuth2

La especificación MCP admite OAuth 2.1 para autorización. El SDK no abre un navegador ni ejecuta un flujo OAuth interactivo. Cuando un servidor configurado devuelve un desafío de autorización y no hay ningún token almacenado disponible, la ejecución del agente continúa sin las herramientas de ese servidor, y el servidor reporta el estado needs-auth. La matriz mcp_servers del mensaje de inicialización del sistema aún puede mostrar pending para ese servidor cuando se emite. Para confirmar si un servidor necesita credenciales, consulte mcpServerStatus() en el SDK de TypeScript o get_mcp_status() en Python. Para proporcionar credenciales, complete el flujo OAuth en su propia aplicación y pase el token de acceso resultante en los headers del servidor:

Ejemplos

Listar problemas de un repositorio

Este ejemplo se conecta al servidor MCP de GitHub remoto para listar problemas recientes. El ejemplo incluye registro de depuración para verificar la conexión MCP y las llamadas a herramientas. Antes de ejecutar, cree un token de acceso personal de GitHub con acceso de lectura a los repositorios que desea consultar y establézcalo como variable de entorno:
En la línea MCP servers:, un status de connected para github confirma que el token funciona. Si Claude Code tiene una lista de herramientas en caché para el servidor, el estado puede mostrar pending en su lugar y el servidor se conecta en su primera llamada a herramienta. Si el estado es failed o needs-auth, consulte Manejo de errores antes de confiar en el resultado, ya que Claude puede recurrir a herramientas integradas cuando el servidor no está disponible.

Consultar una base de datos

Este ejemplo utiliza DBHub para consultar una base de datos Postgres. El agente descubre automáticamente el esquema de la base de datos, escribe la consulta SQL y devuelve los resultados. La herramienta execute_sql de DBHub ejecuta cualquier SQL que emita el agente, incluidas escrituras, a menos que lo restrinja. Establecer readonly = true en el archivo de configuración de DBHub hace que DBHub rechace las declaraciones INSERT, UPDATE, DELETE y DDL, por lo que el ejemplo no puede modificar sus datos incluso si el agente emite una escritura. DBHub resuelve ${DATABASE_URL} desde el entorno del proceso cuando carga la configuración, por lo que la cadena de conexión se mantiene fuera del archivo. Cree este dbhub.toml junto a su script:
dbhub.toml
El script luego apunta DBHub al archivo de configuración en lugar de pasar una cadena de conexión directamente. Antes de ejecutar, establezca la variable de entorno DATABASE_URL en su cadena de conexión. Reemplace los valores de marcador de posición con los detalles de su propia base de datos:

Manejo de errores

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. Claude Code emite un mensaje system con subtipo init al inicio de cada consulta. Este mensaje incluye el estado de conexión para cada servidor MCP. El campo status puede ser "pending", "connected", "failed", "needs-auth" o "disabled". Claude Code emite el mensaje init después del tiempo de espera de conexión de primer turno para servidores pasados en options.mcpServers, por lo que un servidor de este tipo que se conectó dentro del tiempo de espera muestra "connected". En el mensaje init, no trate "pending" como un fallo por sí solo. Puede significar cualquiera de estos: Verifique "failed" o "needs-auth" para detectar servidores que no serán utilizables:
El estado de un servidor remoto también puede cambiar después de que reporta "connected". Cuando la conexión a él se cae a mitad de sesión, Claude Code mueve el servidor de vuelta a "pending" mientras se reconecta. Una llamada posterior a mcpServerStatus() en TypeScript, o ClaudeSDKClient.get_mcp_status() en Python, puede entonces reportar "pending" para un servidor que vio conectado anteriormente, sin cambio de configuración de su parte. Después de que cinco intentos de reconexión fallen, el servidor reporta "failed", o "needs-auth" cuando necesita ser autorizado nuevamente. Un servidor HTTP o SSE en estado "failed" aún puede volver a "connected" sin que hagas ninguna llamada, porque Claude Code sigue reintentando en segundo plano después de un error transitorio. Para reintentar manualmente, llama a reconnectMcpServer() en TypeScript o ClaudeSDKClient.reconnect_mcp_server() en Python.

Solución de problemas

El servidor muestra estado “failed”

Verifique el mensaje init para ver qué servidores no pudieron conectarse:
Un estado "pending" no significa que el servidor haya fallado. Consulte Manejo de errores para ver los casos que cubre en la inicialización. Para obtener estados actualizados más adelante en la sesión, llame al método mcpServerStatus() de la consulta en el SDK de TypeScript, o ClaudeSDKClient.get_mcp_status() en Python. Causas comunes:
  • Variables de entorno faltantes: Asegúrese de que los tokens y credenciales requeridos estén configurados. Para servidores stdio, verifique que el campo env coincida con lo que el servidor espera.
  • Servidor no instalado: Para comandos npx, verifique que el paquete exista y que Node.js esté en su PATH.
  • Cadena de conexión inválida: Para servidores de base de datos, verifique el formato de la cadena de conexión y que la base de datos sea accesible.
  • Problemas de red: Para servidores HTTP/SSE remotos, verifique que la URL sea accesible y que los firewalls permitan la conexión.

Las herramientas no se están llamando

Si Claude ve herramientas pero no las utiliza, verifique que haya otorgado permiso con allowedTools:

Falta una herramienta en un servidor MCP del SDK

En el SDK de TypeScript, cuando el esquema de entrada de una herramienta no se puede convertir a JSON Schema, el servidor que creaste con createSdkMcpServer() omite esa herramienta al listar sus herramientas. En ese momento, el SDK emite una advertencia. En Node.js, la advertencia es una advertencia de proceso con el código CLAUDE_SDK_MCP_TOOL_SCHEMA_UNCONVERTIBLE, y comienza con este texto:
El resto de la advertencia incluye el mensaje del error de conversión cuando lo hay y, a continuación, indica qué revisar y cambiar. Antes de la versión v0.3.286 del Agent SDK de TypeScript, un solo esquema no convertible hacía que fallara todo el listado de herramientas del servidor sin esta advertencia, por lo que ninguna de las herramientas de ese servidor llegaba a Claude.

Tiempos de espera de conexión

Las conexiones del servidor MCP se agotan después de 30 segundos de forma predeterminada. Para cambiar cuánto tiempo puede tomar una llamada de herramienta en ejecución, establezca MCP_TOOL_TIMEOUT. Si su servidor tarda más en iniciarse, la conexión falla. Aumente el límite de conexión con la variable de entorno MCP_TIMEOUT, en milisegundos. Para servidores que necesitan más tiempo de inicio, también considere:
  • Usar un servidor más ligero si está disponible
  • Precalentar el servidor antes de iniciar su agente
  • Verificar los registros del servidor para detectar causas de inicialización lenta
En TypeScript, puede establecer el límite de llamadas de herramientas para un único servidor MCP del SDK pasando timeout a createSdkMcpServer().

La salida de la herramienta excede el máximo de tokens permitidos

El SDK aplica los mismos límites de salida MCP que Claude Code. Cuando el resultado exitoso de una herramienta sin contenido de imagen es mayor que 25.000 tokens, Claude Code guarda la salida en un archivo y reemplaza el resultado de la herramienta con un mensaje de error que nombra la ruta del archivo, para que el agente pueda leer la salida en porciones. Para cambiar el límite de tokens, establece la variable de entorno MAX_MCP_OUTPUT_TOKENS. A menos que la herramienta declare anthropic/maxResultSizeChars, un resultado de texto exitoso de más de 50.000 caracteres se guarda en un archivo independientemente del límite de tokens. Consulta Límites de salida MCP y advertencias para el comportamiento completo, incluida la forma en que un servidor declara esa anotación.