Overview
En esta guía, aprenderá a conectar su agente a servidores remotos del Protocolo de Contexto de Modelo (MCP). El motor de agentes de Atlas detecta las herramientas de los servidores MCP configurados al iniciarse y las pone a disposición del código de su agente.
La configuración del servidor MCP es idéntica para los agentes de Python y TypeScript. Solo difiere el código del agente. Los agentes de Python acceden a las herramientas mediante el método app.get_tools() y no requieren decoradores @app.tool(). Los agentes de TypeScript acceden a las herramientas mediante el método app.getTools().
El motor de agente Atlas admite el transporte MCP HTTP Streamable y proporciona dos métodos para autenticarse con servidores MCP remotos:
Token de portador (valor
bearer_env): La plataforma lee un token estático de una variable de entorno y lo adjunta como un encabezadoAuthorization: Beareren cada solicitud.OAuth 2.1 (valor
oauth): La plataforma utiliza una caché de tokens rellenada por el comandoagentengine dev mcp auth loginy actualiza automáticamente los tokens de acceso cuando caducan.
Puedes usar uno o ambos métodos de autenticación en el mismo archivo. Cada servidor en la sección mcp.servers especifica su propio método de autenticación de forma independiente, por lo que puedes conectarte a un servidor autenticado mediante bearer y a un servidor autenticado mediante OAuth en el mismo archivo agent.yaml.
Requisitos previos
Antes de comenzar, asegúrate de tener lo siguiente:
La interfaz de línea de comandos
agentenginese instaló y autenticó correctamente. Para obtener más información, consulte la guía de instalación y autenticación.Un proyecto de agente válido con un archivo
agent.yaml. Para obtener más información, consulte la guía Crear un proyecto.Credenciales para su servidor MCP remoto: un token de acceso personal para la autenticación mediante token de portador, o una cuenta con acceso OAuth para la autenticación OAuth.
Configurar la autenticación mediante token de portador
Utilice la autenticación mediante token de portador cuando el servidor MCP acepte un token de acceso personal estático.
Agrega tu token al archivo .env.
Agregue el token de portador a su archivo .env con el nombre de variable al que hará referencia en el archivo agent.yaml. El siguiente ejemplo muestra cómo agregar un token a su archivo .env:
GITHUB_MCP_TOKEN=<your-personal-access-token>
Importante
No guardes secretos en el control de versiones. Agrega el archivo .env a tu archivo .gitignore.
Configure el servidor MCP en el archivo agent.yaml.
Agregue una sección mcp.servers a su archivo agent.yaml. Establezca el campo auth.type con el valor de bearer_env y el campo auth.token_env con el nombre de la variable de entorno que contiene el token. El siguiente ejemplo muestra cómo configurar un servidor MCP de GitHub en su archivo agent.yaml:
mcp: servers: github: transport: streamable_http url: https://api.githubcopilot.com/mcp/ headers: X-MCP-Readonly: "true" X-MCP-Toolsets: repos,issues,pull_requests,actions auth: type: bearer_env token_env: GITHUB_MCP_TOKEN timeout_seconds: 30
Configurar la autenticación OAuth
Utilice la autenticación OAuth cuando el servidor MCP admita OAuth 2.1. Debe ejecutar el comando agentengine dev mcp auth login para llenar la caché de tokens antes de iniciar la pila de agentes.
Configure el servidor MCP en el archivo agent.yaml.
Agregue una sección mcp.servers a su archivo agent.yaml. Establezca el campo auth.type con el valor oauth y proporcione el ámbito OAuth requerido. El siguiente ejemplo muestra cómo configurar un servidor MCP en su archivo agent.yaml:
mcp: servers: sentry: transport: streamable_http url: https://mcp.sentry.dev/mcp auth: type: oauth scope: "org:read project:read team:read event:read" timeout_seconds: 30
Autentícate con el servidor MCP.
Desde el directorio de tu proyecto de agente, ejecuta el comando agentengine dev mcp auth login con el nombre del servidor que definiste en el archivo agent.yaml. El comando abre el flujo de consentimiento de OAuth en tu navegador y escribe la caché del token en el directorio ~/.agentengine/mcp-oauth:
agentengine dev mcp auth login sentry
La caché de tokens es independiente para cada proyecto y cada punto final de MCP. Iniciar sesión desde un proyecto no inicia sesión en otro, por lo que debe ejecutar el comando agentengine dev mcp auth login una vez por proyecto.
Durante el inicio de sesión, la interfaz de línea de comandos (CLI) detecta el punto final de autorización OAuth del servidor. Este punto final debe usar el esquema https. Si el servidor anuncia un punto final de autorización que usa cualquier otro esquema, el comando agentengine dev mcp auth login se detiene y genera un error Refused to open unauthorized MCP OAuth URL.
Nota
Debe ejecutar el comando agentengine dev mcp auth login antes de ejecutar el comando agentengine dev up. El entorno de ejecución monta la caché de tokens al inicio y no puede autenticarse una vez que el entorno está en funcionamiento.
Escribir código de agente
No es necesario definir herramientas personalizadas para los agentes que utilizan servidores MCP remotos. En su lugar, utilice los siguientes métodos para acceder a las herramientas detectadas desde todos los servidores MCP configurados:
Python: métodos
app.get_tools()yapp.get_tool_schemas()TypeScript: métodos
app.getTools()yapp.getToolSchemas()
Los siguientes ejemplos muestran un agente mínimo desplegable que utiliza herramientas MCP remotas. El agente utiliza un LangGraph StateGraph para enrutar mensajes entre el LLM y las herramientas MCP. El LLM decide qué herramienta llamar, la clase ToolNode ejecuta la llamada a la herramienta y el resultado se devuelve al LLM hasta que no se necesiten más llamadas a herramientas.
Seleccione la pestaña correspondiente al idioma de su agente para ver el ejemplo correspondiente:
from typing import Annotated, TypedDict from langchain_core.messages import BaseMessage from langchain_openai import ChatOpenAI from langgraph.graph import END, START, StateGraph from langgraph.graph.message import add_messages from langgraph.prebuilt import ToolNode from agent_engine_sdk_langgraph import App app = App(app_name="my-mcp-agent") class AgentState(TypedDict): messages: Annotated[list[BaseMessage], add_messages] def build_agent(): llm = app.llm(ChatOpenAI(model="gpt-4o-mini")) tools = app.get_tools() llm_with_tools = llm.bind_tools(app.get_tool_schemas()) def call_model(state: AgentState): return {"messages": [llm_with_tools.invoke(state["messages"])]} def should_continue(state: AgentState): last = state["messages"][-1] return "tools" if getattr(last, "tool_calls", None) else "end" graph = StateGraph(AgentState) graph.add_node("agent", call_model) graph.add_node("tools", ToolNode(tools)) graph.add_edge(START, "agent") graph.add_conditional_edges( "agent", should_continue, {"tools": "tools", "end": END} ) graph.add_edge("tools", "agent") return graph.compile(checkpointer=app.checkpointer()) app.run()
import "dotenv/config"; import { BaseMessage } from "@langchain/core/messages"; import { Annotation, END, START, StateGraph } from "@langchain/langgraph"; import { ToolNode } from "@langchain/langgraph/prebuilt"; import { ChatOpenAI } from "@langchain/openai"; import { App } from "@mongodb-js/agent-engine-sdk-langgraph"; export const app = new App({ appName: "my-mcp-agent" }); const AgentStateAnnotation = Annotation.Root({ messages: Annotation<BaseMessage[]>({ reducer: (left, right) => left.concat(right), default: () => [], }), }); type AgentState = typeof AgentStateAnnotation.State; export const buildAgent = app.entrypoint(() => { const llm = app.llm(new ChatOpenAI({ model: "gpt-4o-mini" })); const tools = [...app.getTools()]; const llmWithTools = llm.bindTools([...app.getToolSchemas()]); const callModel = async (state: AgentState) => { const response = await llmWithTools.invoke(state.messages); return { messages: [response] }; }; const shouldContinue = (state: AgentState) => { const last = state.messages[state.messages.length - 1]; const toolCalls = (last as { tool_calls?: unknown[] }).tool_calls; return Array.isArray(toolCalls) && toolCalls.length > 0 ? "tools" : END; }; return new StateGraph(AgentStateAnnotation) .addNode("agent", callModel) .addNode("tools", new ToolNode(tools)) .addEdge(START, "agent") .addConditionalEdges("agent", shouldContinue, { tools: "tools", [END]: END, }) .addEdge("tools", "agent") .compile({ checkpointer: app.checkpointer() }); }); app.run();
Establezca el campo language en su archivo agent.yaml al valor typescript y apunte el campo entrypoint al objeto app exportado, como en el valor remote_mcp_ts.github:app.
Reglas para nombrar servidores
El nombre del servidor es una clave en la sección mcp.servers. Un nombre puede contener hasta 128 caracteres de texto imprimible codificado en UTF-8, incluidos caracteres no ASCII y nombres con puntos. Un nombre no puede estar vacío ni contener los siguientes elementos:
Texto solo con espacios en blanco
Espacio en blanco inicial o final
Caracteres de control, de ancho cero, de marca de orden de bytes (BOM) o bidireccionales
Separadores de ruta (
/o\)..
El comando agentengine agent validate valida los nombres según estas reglas. Para obtener más información, consulte Validar configuración.
Esquema de configuración del servidor MCP
La siguiente tabla describe los campos disponibles en la sección mcp.servers de su archivo agent.yaml:
Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| Objeto | no | |
| string | no | Protocolo de transporte para la conexión MCP. Actualmente, el único valor admitido es |
| string | Sí | URL del punto final del servidor MCP remoto. Debe especificar una URL absoluta |
| mapa[cadena, cadena] | no | Encabezados HTTP estáticos que se incluirán en cada solicitud al servidor MCP. Úselos para opciones específicas del servidor, como el filtrado de los conjuntos de herramientas disponibles. |
| string | no | Tipo de autenticación. Los valores aceptados son |
| string | cuando | Nombre de la variable de entorno que contiene el token de portador. La variable debe estar configurada en su archivo |
| string | no | Ámbitos OAuth separados por espacios para solicitar. Puede configurar este campo solo cuando |
| string | no | Nombre legible para el cliente OAuth. Algunos servidores muestran este nombre en la pantalla de consentimiento de autorización. Este campo solo se puede configurar cuando |
| string | no | URI de redireccionamiento de bucle invertido utilizada por el inicio de sesión interactivo de OAuth. Este campo solo se puede configurar cuando |
| string | Sí, si | Nombre de la variable de entorno que contiene el ID del cliente OAuth. |
| string | Sí, si | Nombre de la variable de entorno que almacena el secreto del cliente OAuth. |
| string | no | Punto final de token OAuth utilizado para solicitar un token de acceso para la autenticación de credenciales de cliente. Debe especificar una URL absoluta |
| list[string] | no | Lista de herramientas MCP remotas permitidas para el agente. Al configurarla, la plataforma registra solo las herramientas indicadas e ignora las demás que devuelve el servidor. Si se omite, la plataforma muestra todas las herramientas que devuelve el servidor. Utilice este campo para limitar la superficie de herramientas a las que su agente requiere. |
| Int | no | Tiempo de espera de solicitud en segundos aplicado a cada llamada a la herramienta MCP. El valor predeterminado es |
Conectar varios servidores MCP
Puedes definir varios servidores dentro de la sección mcp.servers en un único archivo agent.yaml. El motor del agente Atlas se conecta a todos los servidores configurados al iniciarse e integra sus herramientas en la interfaz del agente. El siguiente ejemplo conecta simultáneamente los servidores GitHub, Sentry y Glean en un único archivo agent.yaml:
mcp: servers: github: transport: streamable_http url: https://api.githubcopilot.com/mcp/ headers: X-MCP-Readonly: "true" X-MCP-Toolsets: repos,issues,pull_requests,actions auth: type: bearer_env token_env: GITHUB_MCP_TOKEN timeout_seconds: 30 sentry: transport: streamable_http url: https://mcp.sentry.dev/mcp auth: type: oauth scope: "org:read project:read team:read event:read" timeout_seconds: 30 glean: transport: streamable_http url: https://mongodb-be.glean.com/mcp/default auth: type: oauth scope: "SEARCH DOCUMENTS ENTITIES" client_name: My Glean MCP Agent timeout_seconds: 30
Cuando te conectas a varios servidores con autenticación OAuth, debes ejecutar el comando agentengine dev mcp auth login <name> para cada servidor OAuth antes de iniciar el entorno. El siguiente ejemplo muestra los comandos que debes ejecutar desde el directorio de tu proyecto de agente para autenticarte con los servidores Sentry y Glean antes de iniciar el entorno:
agentengine dev mcp auth login sentry agentengine dev mcp auth login glean agentengine dev up
Proporcionar credenciales MCP para la implementación
El archivo .env y la caché local de tokens OAuth solo están disponibles durante el desarrollo local con el comando agentengine dev up. Antes de implementar el agente, debe aprovisionar las credenciales de MCP como secretos del espacio de trabajo para que el entorno de ejecución implementado pueda autenticarse con cada servidor MCP.
Las siguientes secciones describen cómo aprovisionar secretos para cada tipo de autenticación. Para obtener más información sobre el aprovisionamiento de secretos, consulte la guía «Aprovisionamiento de secretos en la nube».
Autenticación mediante token de portador
Para cada servidor autenticado por portador, configure la variable de entorno del token como un secreto de espacio de trabajo. Utilice el siguiente comando para configurar el secreto e incluya la bandera --workspace-scope para apuntar al espacio de trabajo actual:
agentengine secret set GITHUB_MCP_TOKEN --workspace-scope
Para aprovisionar el secreto y sincronizarlo con las implementaciones en ejecución en un solo paso, utilice la bandera --sync:
agentengine secret set GITHUB_MCP_TOKEN --workspace-scope --sync
Ejecute este comando para cada servidor autenticado mediante bearer antes de la implementación.
Autenticación de OAuth
Para cada servidor OAuth, cargue la caché de tokens local en el espacio de trabajo utilizando el comando agentengine dev mcp auth upload:
agentengine dev mcp auth upload sentry
Para cargar y sincronizar con implementaciones en ejecución en un solo paso, utilice la bandera --sync:
agentengine dev mcp auth upload sentry --sync
Ejecute este comando para cada servidor OAuth antes de la implementación.
Próximos pasos
Una vez que su agente esté conectado a los servidores MCP remotos, puede probarlo localmente y luego implementarlo. Para obtener más información sobre cómo probar su agente localmente e implementarlo, consulte las siguientes guías en la documentación de Atlas Agent Engine: