模型上下文协议(MCP)是一种开放协议,用于以模型无关的格式描述工具和数据源,使 LLM 能够通过结构化 API 发现和使用它们。
Agent Server 使用 Streamable HTTP 传输实现 MCP。这允许 LangGraph **代理** 作为 **MCP 工具**公开,使其可与任何支持 Streamable HTTP 的 MCP 兼容客户端一起使用。
MCP 端点可在此处访问 /mcp on Agent Server.
您可以设置 自定义认证中间件 来通过 MCP 服务器认证用户,以获取对 LangSmith 部署中用户范围的工具的访问权限。
此流程的示例架构:
sequenceDiagram
%% Actors
participant ClientApp as Client
participant AuthProv as Auth Provider
participant LangGraph as Agent Server
participant SecretStore as Secret Store
participant MCPServer as MCP Server
%% Platform login / AuthN
ClientApp ->> AuthProv: 1. Login (username / password)
AuthProv -->> ClientApp: 2. Return token
ClientApp ->> LangGraph: 3. Request with token
Note over LangGraph: 4. Validate token (@auth.authenticate)
LangGraph -->> AuthProv: 5. Fetch user info
AuthProv -->> LangGraph: 6. Confirm validity
%% Fetch user tokens from secret store
LangGraph ->> SecretStore: 6a. Fetch user tokens
SecretStore -->> LangGraph: 6b. Return tokens
Note over LangGraph: 7. Apply access control (@auth.on.*)
%% MCP round-trip
Note over LangGraph: 8. Build MCP client with user token
LangGraph ->> MCPServer: 9. Call MCP tool (with header)
Note over MCPServer: 10. MCP validates header and runs tool
MCPServer -->> LangGraph: 11. Tool response
%% Return to caller
LangGraph -->> ClientApp: 12. Return resources / tool output
要求
要使用 MCP,请确保已安装以下依赖项:
- *
langgraph-api >= 0.2.3 - *
langgraph-sdk >= 0.1.61
使用以下命令安装:
pip install "langgraph-api>=0.2.3" "langgraph-sdk>=0.1.61"
uv add "langgraph-api>=0.2.3" "langgraph-sdk>=0.1.61"
用法概述
启用 MCP:
- * 升级至 langgraph-api>=0.2.3。如果您正在部署 LangSmith,创建新版本时会自动为您完成此操作。
- * MCP 工具(代理)将自动公开。
- * 使用任何支持 Streamable HTTP 的 MCP 兼容客户端连接。
客户端
使用 MCP 兼容客户端连接到 Agent Server。以下示例展示如何使用不同的编程语言进行连接。
JavaScript/TypeScript
npm install @modelcontextprotocol/sdk
> **注意** > 将 serverUrl 替换为您的 Agent Server URL,并根据需要配置认证标头。
// Connects to the LangGraph MCP endpoint
async function connectClient(url) {
const baseUrl = new URL(url);
const client = new Client({
name: 'streamable-http-client',
version: '1.0.0'
});
const transport = new StreamableHTTPClientTransport(baseUrl);
await client.connect(transport);
console.log("Connected using Streamable HTTP transport");
console.log(JSON.stringify(await client.listTools(), null, 2));
return client;
}
const serverUrl = "http://localhost:2024/mcp";
connectClient(serverUrl)
.then(() => {
console.log("Client connected successfully");
})
.catch(error => {
console.error("Failed to connect client:", error);
});
Python
使用以下命令安装适配器:
pip install langchain-mcp-adapters
以下是一个如何连接到远程 MCP 端点并使用代理作为工具的示例:
# Create server parameters for stdio connection
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
from langchain_mcp_adapters.tools import load_mcp_tools
from langchain.agents import create_agent
server_params = {
"url": "https://mcp-finance-agent.xxx.us.langgraph.app/mcp",
"headers": {
"X-Api-Key":"lsv2_pt_your_api_key"
}
}
async def main():
async with streamablehttp_client(**server_params) as (read, write, _):
async with ClientSession(read, write) as session:
# Initialize the connection
await session.initialize()
# Load the remote graph as if it was a tool
tools = await load_mcp_tools(session)
# Create and run a react agent with the tools
agent = create_agent("gpt-5.5", tools)
# Invoke the agent with a message
agent_response = await agent.ainvoke({"messages": "What can the finance agent do for me?"})
print(agent_response)
if __name__ == "__main__":
asyncio.run(main())
将代理公开为 MCP 工具
部署后,您的代理将作为工具出现在 MCP 端点中 使用此配置:
- * **工具名称**:代理的名称。
- * **工具描述**:代理的描述。
- * **工具输入模式**:代理的输入模式。
设置名称和描述
您可以在 langgraph.json:
{
"graphs": {
"my_agent": {
"path": "./my_agent/agent.py:graph",
"description": "A description of what the agent does"
}
},
"env": ".env"
}
部署后,您可以使用 LangGraph SDK 更新名称和描述。
模式
定义清晰、最小化的输入和输出模式,以避免向 LLM 暴露不必要的内部复杂性。
默认的 MessagesState 使用 AnyMessage,支持多种消息类型,但对于直接暴露给 LLM 来说过于通用。
相反,请定义 **自定义智能体或工作流** 使用明确定义类型的输入和输出结构。
例如,用于回答文档问题的工作流可能如下所示:
from langgraph.graph import StateGraph, START, END
from typing_extensions import TypedDict
# Define input schema
class InputState(TypedDict):
question: str
# Define output schema
class OutputState(TypedDict):
answer: str
# Combine input and output
class OverallState(InputState, OutputState):
pass
# Define the processing node
def answer_node(state: InputState):
# Replace with actual logic and do something useful
return {"answer": "bye", "question": state["question"]}
# Build the graph with explicit schemas
builder = StateGraph(OverallState, input_schema=InputState, output_schema=OutputState)
builder.add_node(answer_node)
builder.add_edge(START, "answer_node")
builder.add_edge("answer_node", END)
graph = builder.compile()
# Run the graph
print(graph.invoke({"question": "hi"}))
更多详细信息,请参阅 底层概念指南.
在您的部署中使用用户作用域的 MCP 工具
要使您 LangSmith 部署中的用户作用域工具可用,请从实现类似以下代码片段开始:
from langchain_mcp_adapters.client import MultiServerMCPClient
def mcp_tools_node(state, config):
user = config["configurable"].get("langgraph_auth_user")
, user["github_token"], user["email"], etc.
client = MultiServerMCPClient({
"github": {
"transport": "streamable_http", # (1)
"url": "https://my-github-mcp-server/mcp", # (2)
"headers": {
"Authorization": f"Bearer {user['github_token']}"
}
}
})
tools = await client.get_tools() # (3)
# Your tool-calling logic here
tool_messages = ...
return {"messages": tool_messages}
- MCP 仅支持向发出的请求添加标头
streamable_http和ssetransportservers. - 您的 MCP 服务器 URL。
- 从您的 MCP 服务器获取可用工具。
_这也可以通过 在运行时重建图 以在新的运行中具有不同的配置_
会话行为
当前的 LangGraph MCP 实现不支持会话。每个 /mcp 请求都是无状态且独立的。
身份验证
/mcp 端点使用与 LangGraph API 其余部分相同的身份验证方式。请参阅 身份验证指南 了解设置详情。
禁用 MCP
要禁用 MCP 端点,请设置 disable_mcp to true 在您的 langgraph.json 配置文件中:
{
"$schema": "https://langgra.ph/schema.json",
"http": {
"disable_mcp": true
}
}
这将防止服务器暴露 /mcp endpoint.