Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Menu Docs

Usar servidores MCP remotos

Neste guia, você pode aprender como conectar seu agente a servidores remotos do Model Context Protocol (MCP). O Atlas Agent Engine descobre ferramentas de servidores MCP configurados na inicialização e as disponibiliza para o código do agente .

A configuração do servidor MCP é idêntica para agentes Python e TypeScript. Apenas o código do agente é diferente. Os agentes Python acessam ferramentas usando o método app.get_tools() e não exigem nenhum executor @app.tool(). Os agentes do TypeScript acessam as ferramentas usando o método app.getTools().

O Atlas Agent Engine suporta o transporte Streamable HTTP MCP e fornece dois métodos para autenticar com servidores MCP remotos:

  • Token do portador (valor bearer_env): a plataforma lê um token estático de uma variável de ambiente e o anexa como um cabeçalho Authorization: Bearer em cada solicitação.

  • OAuth 2.1 (valor oauth): a plataforma usa um cache de token preenchido pelo comando agentengine dev mcp auth login e atualiza os tokens de acesso automaticamente quando eles expiram.

Você pode usar um ou ambos os métodos de autenticação no mesmo arquivo. Cada servidor na seção mcp.servers especifica seu próprio método de autenticação de forma independente, para que você possa se conectar a um servidor autenticado por portador e a um servidor autenticado por OAuth no mesmo arquivo agent.yaml.

Antes de começar, certifique-se de ter o seguinte:

  • A CLI agentengine instalada e autenticada. Para saber mais, consulte o guia Instalar e autenticar.

  • Um projeto de agente válido com um arquivo agent.yaml. Para saber mais, consulte o guia Criar um projeto.

  • Credenciais para seu servidor MCP remoto : um token de acesso pessoal para autenticação de token de portador ou uma conta com acesso OAuth para autenticação OAuth.

Use a autenticação de token de portador quando o servidor MCP aceitar um token de acesso pessoal estático.

1

Adicione o token do portador ao seu arquivo .env com o nome da variável que você fará referência no arquivo agent.yaml. O exemplo a seguir mostra como adicionar um token ao seu arquivo .env:

GITHUB_MCP_TOKEN=<your-personal-access-token>

Importante

Não confirme segredos para o controle de versão. Adicione o arquivo .env ao seu arquivo .gitignore.

2

Adicione uma seção mcp.servers ao seu arquivo agent.yaml. Configure o campo auth.type para o valor bearer_env e o campo auth.token_env para o nome da variável de ambiente que contém o token. O exemplo a seguir mostra como configurar um servidor GitHub MCP em seu arquivo 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
3

No diretório de projeto do agente , execute o seguinte comando. A plataforma se conecta ao servidor MCP na inicialização e registra suas ferramentas automaticamente:

agentengine dev up

Use a autenticação OAuth quando o servidor MCP permitir OAuth 2.1. Você deve executar o comando agentengine dev mcp auth login para preencher o cache de token antes de iniciar a pilha de agente .

1

Adicione uma seção mcp.servers ao seu arquivo agent.yaml. Defina o campo auth.type para o valor oauth e forneça o escopo OAuth necessário. O exemplo a seguir mostra como configurar um servidor MCP em seu arquivo 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
2

No diretório de projeto do agente , execute o comando agentengine dev mcp auth login com o nome do servidor definido no arquivo agent.yaml. O comando abre o fluxo de consenso OAuth em seu navegador e grava o cache de token no diretório ~/.agentengine/mcp-oauth:

agentengine dev mcp auth login sentry

O cache de token é separado para cada projeto e cada endpoint MCP. Conectar de um projeto não conecta você para outro projeto, então você deve executar o comando agentengine dev mcp auth login uma vez por projeto.

Durante o login, a CLI descobre o endpoint de autorização OAuth do servidor. Esse endpoint deve usar o esquema https. Se o servidor anunciar um endpoint de autorização que use qualquer outro esquema, o comando agentengine dev mcp auth login interromperá e gerará um erro Refused to open unauthorized MCP OAuth URL.

Observação

Você deve executar o comando agentengine dev mcp auth login antes de executar o comando agentengine dev up. O tempo de execução monta o cache de token na inicialização e não pode autenticar depois que o ambiente estiver em execução.

3

No diretório de projeto do agente , execute o seguinte comando. A plataforma se conecta ao servidor MCP e registra suas ferramentas automaticamente:

agentengine dev up

Você não precisa definir ferramentas personalizadas para os agentes que usam servidores MCP remotos. Em vez disso, use os seguintes métodos para acessar as ferramentas detectadas em todos os servidores MCP configurados:

  • Python: métodos app.get_tools() e app.get_tool_schemas()

  • TypeScript: métodos app.getTools() e app.getToolSchemas()

Os exemplos a seguir mostram um agente implementável mínimo que usa ferramentas MCP remotas. O agente usa um LangGraph StateGraph para rotear mensagens entre as ferramentas LLM e MCP. O LLM decide qual ferramenta chamar, a classe ToolNode executa a chamada de ferramenta e o resultado é passado de volta para o LLM até que nenhuma outra chamada de ferramenta seja necessária.

Selecione a guia do idioma do seu agente para ver o exemplo correspondente:

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]
@app.entrypoint
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();

Defina o campo language em seu arquivo agent.yaml como o valor typescript e ponto o campo entrypoint para o objetoapp exportado, como no valor remote_mcp_ts.github:app.

O nome de um servidor é uma chave na seção mcp.servers. Um nome pode conter até 128 caracteres de texto codificado em UTF8 imprimível, incluindo caracteres não ASCII e nomes pontilhados. Um nome não pode estar vazio ou conter os seguintes elementos:

  • Texto somente para espaços em branco

  • Espaço em branco à esquerda ou à direita

  • Controle, largura zero, marca de ordem de bytes (BOM) ou caracteres bidirecionais

  • Separadores de caminho (/ ou \)

  • ..

O comando agentengine agent validate valida nomes em relação a estas regras. Para saber mais, consulte Validar Configuração.

A tabela a seguir descreve os campos disponíveis na seção mcp.servers do seu arquivo agent.yaml:

Campo
Tipo
Obrigatório
Descrição

mcp.servers.<name>

objeto

no

Define uma conexão de servidor MCP nomeada. O nome é utilizado como identificador do servidor ao executar o comando agentengine dev mcp auth login <name>. Para visualizar os requisitos de nomenclatura, consulte a seção Regras de nomenclatura do servidor.

mcp.servers.<name>.transport

string

no

Protocolo de transporte para a conexão MCP. Atualmente, o único valor suportado é streamable_http. Este também é o valor padrão.

mcp.servers.<name>.url

string

sim

URL do ponto de extremidade do servidor MCP remoto. Você deve especificar uma URL absoluta http ou https. Se o campo auth.type estiver definido como qualquer valor diferente de none, a URL deverá usar https.

mcp.servers.<name>.headers

map[string, string]

no

Cabeçalhos HTTP estáticos para incluir em cada solicitação ao servidor MCP . Use para opções específicas do servidor, como filtrar os conjuntos de ferramentas disponíveis.

mcp.servers.<name>.auth.type

string

no

Tipo de autenticação. Os valores aceitos são none, bearer_env, oauth e client_credentials. O padrão é none.

mcp.servers.<name>.auth.token_env

string

quando auth.type é bearer_env

Nome da variável de ambiente que contém o token do portador. A variável deve ser definida em seu arquivo .env.

mcp.servers.<name>.auth.scope

string

no

Escopos OAuth separados por espaço a serem solicitados. Você pode definir esse campo somente quando auth.type estiver definido como oauth ou client_credentials.

mcp.servers.<name>.auth.client_name

string

no

Nome legível por humanos para o cliente OAuth. Alguns servidores exibem este nome na tela de autorização . Você pode definir esse campo somente quando auth.type estiver definido como oauth.

mcp.servers.<name>.auth.redirect_uri

string

no

URI de redirecionamento de loopback usado pelo login interativo do OAuth. Você pode definir esse campo somente quando auth.type estiver definido como oauth.

mcp.servers.<name>.auth.client_id_env

string

sim, se auth.type estiver definido como client_credentials

Nome da variável de ambiente que contém o ID do cliente OAuth.

mcp.servers.<name>.auth.client_secret_env

string

sim, se auth.type estiver definido como client_credentials

Nome da variável de ambiente que contém o segredo do cliente OAuth.

mcp.servers.<name>.auth.token_url

string

no

Ponto de conexão do token OAuth usado para solicitar um token de acesso para autenticação de credenciais do cliente . Você deve especificar um URLhttps absoluto. Você pode definir esse campo somente quando auth.type estiver client_credentials.

mcp.servers.<name>.allowed_tools

list[string]

no

Lista de permissões de nomes de ferramentas MCP remotas a serem expostas ao agente. Quando definido, a plataforma registra apenas as ferramentas listadas e ignora todas as outras ferramentas que o servidor retorna. Quando omitido, a plataforma expõe todas as ferramentas que o servidor retorna. Use esse campo para limitar a superfície da ferramenta apenas às ferramentas necessárias para o agente .

mcp.servers.<name>.timeout_seconds

int

no

Tempo limite da solicitação em segundos aplicado a cada chamada de ferramenta MCP. O padrão é 30.

Você pode definir vários servidores dentro da seção mcp.servers em um único arquivo agent.yaml. O Atlas Agent Engine se conecta a todos os servidores configurados na inicialização e mescla suas ferramentas na superfície de ferramentas do agente. O exemplo a seguir conecta os servidores GitHub, Sentry e Glean simultaneamente em um único arquivo 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

Ao conectar a vários servidores com autenticação OAuth, você deve executar o comando agentengine dev mcp auth login <name> para cada servidor OAuth antes de iniciar o ambiente. O exemplo a seguir mostra os comandos a serem executados a partir do diretório de projeto do agente para autenticação nos servidores Sentry e Glean antes de iniciar o ambiente:

agentengine dev mcp auth login sentry
agentengine dev mcp auth login glean
agentengine dev up

O arquivo .env e o cache de token OAuth local estão disponíveis somente durante o desenvolvimento local com o comando agentengine dev up. Antes de implementar o agente, você deve provisionar as credenciais do MCP como segredos de espaço de trabalho para que o tempo de execução implantado possa se autenticar em cada servidor do MCP.

As seções a seguir descrevem como provisionar segredos para cada tipo de autenticação. Para saber mais sobre segredos de provisionamento, consulte o guia Segredos de Provision Cloud.

Para cada servidor autenticado ao portador , provisione a variável de ambiente do token como um segredo de espaço de trabalho. Use o seguinte comando para provisionar o segredo e incluir o sinalizador --workspace-scope para direcionar o espaço de trabalho atual:

agentengine secret set GITHUB_MCP_TOKEN --workspace-scope

Para provisionar o segredo e sincronizá-lo com os sistemas em execução em uma única etapa, use o sinalizador --sync:

agentengine secret set GITHUB_MCP_TOKEN --workspace-scope --sync

Execute este comando para cada servidor autenticado ao portador antes de distribuir.

Para cada servidor OAuth, carregue do cache de token local para o espaço de trabalho usando o comando agentengine dev mcp auth upload:

agentengine dev mcp auth upload sentry

Para carregar e sincronizar com os sistemas em execução em uma única etapa, use o sinalizador --sync:

agentengine dev mcp auth upload sentry --sync

Execute este comando para cada servidor OAuth antes de distribuir.

Depois que seu agente estiver conectado aos servidores MCP remotos, você poderá testá-lo localmente e, em seguida, implementá-lo. Para saber mais sobre como testar seu agente localmente e implementá-lo, consulte os seguintes guias na documentação do Mecanismo do Agente do Atlas :