AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs Menu

リモート MCP サーバーの使用

このガイドでは、エージェントをリモート MCP(Model Context Protocol)サーバーに接続する方法を学習できます。 Atlas Agent Engine は、スタートアップ時に構成済みの MCP サーバーからツールを検出し、それらをエージェントコードで使用できるようにします。

MCPサーバーの構成は、 Pythonと TypeScript エージェントで同一です。エージェントコードのみが異なります。 Pythonエージェントは app.get_tools() メソッドを使用してツールにアクセスし、@app.tool() 修飾子は必要ありません。 TypeScript エージェントは app.getTools() メソッドを使用してツールにアクセスします。

Atlas Agent Engine は Streamable HTTP MCP トランスポートをサポートしており、リモート MCP サーバーで認証するための 2 つの方法を提供します。

  • Bearer トークン(bearer_env 値): プラットフォームは環境変数から静的トークンを読み取り、すべてのリクエストに対してAuthorization: Bearer ヘッダーとしてそれを添付します。

  • OAuth2.1 (oauth 値): プラットフォームは、 コマンドによって入力されたトークンキャッシュを使用し、アクセスagentengine dev mcp auth login トークンの有効期限が切れると自動的に更新されます。

同じファイルでいずれかの認証方法または両方の認証方法を使用できます。 mcp.servers セクションの各サーバーは独自の認証方法を個別に指定するため、同じ agent.yamlファイルで Bearer 認証サーバーと OAuth 認証サーバーに接続できます。

始める前に、以下のものを必ず用意してください。

  • agentengineCLI がインストールおよび認証されました。詳細については、 「インストールと認証のガイド」を参照してください。

  • ファイルを持つ有効なエージェントプロジェクト。詳しくは、「 プロジェクトの作成agent.yaml 」ガイドを参照してください。

  • リモート MCPサーバーの認証情報 : ベアラー トークン認証用のパーソナル アクセス トークン、または OAuth認証用の OAuth アクセス権を持つアカウント。

MCPサーバーが静的パーソナル アクセス トークンを受け入れる場合は、ベアラ トークン認証を使用します。

1

agent.yamlファイルで参照変数名を使用して、.envファイルにベアラー トークンを追加します。次の例は、.envファイルにトークンを追加する方法を示しています。

GITHUB_MCP_TOKEN=<your-personal-access-token>

重要

バージョン管理にシークレットをコミットしないでください。 .envファイルを.gitignoreファイルに追加します。

2

agent.yamlファイルに mcp.servers セクションを追加します。 auth.typeフィールドに bearer_env 値を設定し、auth.token_envフィールドにトークンを保持する環境変数の名前を設定します。次の例は、agent.yamlファイルで GitHub MCPサーバーを構成する方法を示しています。

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

エージェントのプロジェクトディレクトリから、次のコマンドを実行します。プラットフォームはスタートアップ時に MCPサーバーに接続し、そのツールを自動的に登録します。

agentengine dev up

MCPサーバーがOAuth 2.1 をサポートしている場合は、OAuth認証を使用します。エージェントスタックを起動する前に、agentengine dev mcp auth login コマンドを実行してトークンキャッシュにデータを入力する必要があります。

1

agent.yamlファイルに mcp.servers セクションを追加します。 auth.typeフィールドを oauth 値に設定し、必要な OAuth スコープを指定します。次の例は、agent.yamlファイルで MCPサーバーを構成する方法を示しています。

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

エージェントのプロジェクトディレクトリから、 agent.yamlファイルで定義したサーバー名を使用して agentengine dev mcp auth login コマンドを実行します。このコマンドは ブラウザで OAuth 同意フローを開き、トークンキャッシュを~/.agentengine/mcp-oauthディレクトリに書込みます。

agentengine dev mcp auth login sentry

トークンキャッシュは、各プロジェクトと各 MCP エンドポイントで異なります。あるプロジェクトからログインしても、別のプロジェクトにはログしないため、プロジェクトごとに 1 回 agentengine dev mcp auth login コマンドを実行する必要があります。

ログイン中に、CLI はサーバーの OAuth認可エンドポイントを検出します。このエンドポイントは https スキームを使用する必要があります。サーバーが他のスキームを使用する認可エンドポイントを公開した場合、agentengine dev mcp auth login コマンドは停止し、Refused to open unauthorized MCP OAuth URL エラーを生成します。

注意

agentengine dev mcp auth loginagentengine dev upコマンドを実行中前に、 コマンドを実行する必要があります。ランタイムはスタートアップ時にトークンキャッシュをマウントするため、環境がを実行中後は認証できません。

3

エージェントのプロジェクトディレクトリから、次のコマンドを実行します。プラットフォームは MCPサーバーに接続し、そのツールを自動的に登録します。

agentengine dev up

リモート MCP サーバーを使用するエージェントのカスタム ツールを定義する必要はありません。代わりに、次のメソッドを使用して、構成されたすべての MCP サーバーから検出されたツールにアクセスします。

  • Python: app.get_tools() メソッドと app.get_tool_schemas() メソッド

  • TypeScript: app.getTools() メソッドと app.getToolSchemas() メソッド

次の例は、リモート MCP ツールを使用する最小の配置可能なエージェントを示しています。エージェントはLgGraph StateGraph を使用して、LDM と MCP ツール間でメッセージをルーティングします。 LM は呼び出すツールを決定し、ToolNodeクラスがツール呼び出しを実行し、その結果は LM に渡され、ツール呼び出しが不要になるまで渡されます。

対応する例を表示するには、エージェントの言語のタブを選択します。

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();

agent.yamlファイルの languageフィールドを typescript 値に設定し、エクスポートされた appオブジェクトの entrypointフィールドを、remote_mcp_ts.github:app 値のように点。

サーバー名は mcp.servers セクションの下のキーです。名前には、非 ASCII 文字やドット付き名前を含む、印刷可能な UTF-8 でエンコードされたテキストを最大 128 文字含めることができます。名前は空にすることも、次の要素を含めることはできません。

  • 空白のみのテキスト

  • 先頭または末尾の空白

  • 制御、ゼロ幅、バイト順マーク(BOM)、または双方向文字

  • パス区切り文字(/ または \)

  • ..

agentengine agent validateコマンドは、これらのルールに対して名前を検証します。詳細については、「 構成の検証 」を参照してください。

次の表は、agent.yamlファイルの mcp.servers セクションで使用できるフィールドを説明したものです。

フィールド
タイプ
必須
説明

mcp.servers.<name>

オブジェクト

no

名前付き MCPサーバー接続を定義します。名前は、agentengine dev mcp auth login <name> コマンドを実行中ときにサーバー識別子として使用されます。命名要件を確認するには、「 サーバーの命名ルール 」セクションを参照してください。

mcp.servers.<name>.transport

string

no

MCP 接続のトランスポートプロトコル。現在、サポートされている値は streamable_http のみです。これはデフォルト値でもあります。

mcp.servers.<name>.url

string

はい

リモート MCPサーバーエンドポイントのURL 。絶対の http または https URLを指定する必要があります。 auth.typeフィールドがnone 以外の値に設定されている場合、 URL はhttps を使用する必要があります。

mcp.servers.<name>.headers

map[string, string]

no

MCPサーバーへのすべてのリクエストに含める静的HTTPヘッダー。これは、利用可能なツールセットをフィルタリングするなど、サーバー固有のオプションに使用します。

mcp.servers.<name>.auth.type

string

no

認証タイプ。指定可能な値は、none、bearer_env、oauth、client_credentials です。デフォルトは none です。

mcp.servers.<name>.auth.token_env

string

auth.type が bearer_env の場合

Bearer トークンを保持する環境変数の名前。変数は .envファイルに設定する必要があります。

mcp.servers.<name>.auth.scope

string

no

をリクエストためのスペース区切りの OAuth スコープ。このフィールドは、auth.type が oauth または client_credentials に設定されている場合にのみ設定できます。

mcp.servers.<name>.auth.client_name

string

no

人間が判読可能な OAuthクライアントの名前。一部のサーバーは認可同意画面にこの名前を表示します。このフィールドは、auth.type が oauth に設定されている場合にのみ設定できます。

mcp.servers.<name>.auth.redirect_uri

string

no

インタラクティブ OAuth ログインで使用されるループバック リダイレクト URI 。このフィールドは、auth.type が oauth に設定されている場合にのみ設定できます。

mcp.servers.<name>.auth.client_id_env

string

はい、auth.type が client_credentials に設定されている場合

OAuthクライアントIDを保持する環境変数の名前。

mcp.servers.<name>.auth.client_secret_env

string

はい、auth.type が client_credentials に設定されている場合

OAuthクライアントシークレットを保持する環境変数の名前。

mcp.servers.<name>.auth.token_url

string

no

クライアント認証情報認証のアクセス トークンをリクエストために使用される OAuth トークン エンドポイント。絶対的な https URLを指定する必要があります。このフィールドは、auth.type が client_credentials の場合にのみ設定できます。

mcp.servers.<name>.allowed_tools

list[string]

no

エージェントに公開するリモート MCP ツール名の許可リスト。これを設定すると、プラットフォームはリストされているツールのみを登録し、サーバーが返す他のすべてのツールを無視します。省略した場合、プラットフォームはサーバーが返すすべてのツールを公開します。このフィールドを使用して、ツール画面をエージェントが必要とするツールのみに制限します。

mcp.servers.<name>.timeout_seconds

整数

no

各 MCP ツール呼び出しに適用される秒単位のリクエスト タイムアウト。デフォルトは 30 です。

単一の agent.yamlファイル内の mcp.servers セクション内で複数のサーバーを定義できます。 Atlas Agent Engine は、スタートアップ時にすべての設定されたサーバーに接続し、そのツールをエージェントのツール画面にマージします。次の例では、GitHub、セカンダリ、Grant サーバーを単一の 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

OAuth認証を使用して複数のサーバーに接続する場合は、環境を起動する前に、各agentengine dev mcp auth login <name> OAuthサーバーに対して コマンドを実行する必要があります。次の例は、環境を起動する前にセカンダリ サーバーと Glas サーバーの両方で認証するためにエージェントのプロジェクトディレクトリから実行するコマンドを示しています。

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

.envファイルとローカル OAuth トークンキャッシュは、agentengine dev up コマンドを使用したローカル開発中にのみ使用できます。エージェントを配置する前に、配置されたランタイムが各 MCPサーバーで認証できるように、MCP 認証情報をワークスペース シークレットとしてプロビジョニングする必要があります。

以下のセクションでは、各認証タイプのシークレットをプロビジョニングする方法について説明します。シークレットのプロビジョニングの詳細については、「 クラウド シークレットのプロビジョニング 」ガイドを参照してください。

各 ベアラー認証サーバーに対して、トークン環境変数をワークスペース シークレットとしてプロビジョニングします。次のコマンドを使用してシークレットをプロビジョニングし、現在のワークスペースを対象とするには --workspace-scope フラグを含めます。

agentengine secret set GITHUB_MCP_TOKEN --workspace-scope

シークレットをプロビジョニングし、実行中の配置に一度に同期するには、--sync フラグを使用します。

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

配置する前に、各 Bearer 認証サーバーに対してこのコマンドを実行します。

各 OAuthサーバーに対して、agentengine dev mcp auth upload コマンドを使用してローカル トークンキャッシュをワークスペースにアップロードします。

agentengine dev mcp auth upload sentry

実行中の配置を 1 つのステップでアップロードして同期するには、--sync フラグを使用します。

agentengine dev mcp auth upload sentry --sync

配置する前に、各 OAuthサーバーに対して次のコマンドを実行します。

エージェントがリモート MCP サーバーに接続されたら、ローカルでテストしてから配置できます。エージェントをローカルでテストして配置する方法の詳細については、Atlas Agent Engine ドキュメントの次のガイドを参照してください。