Python Strands Agent 到 MCP
connection 生成器可以将您的 Python Strands Agent 连接到 MCP 服务器(可以是 TypeScript 或 Python)。
该生成器会设置所有必要的配置,使您的代理能够发现和调用 MCP 服务器的工具,无论是部署到 AWS(通过 Bedrock AgentCore)还是在本地运行时都可以。
在使用此生成器之前,请确保您具备:
- 一个包含 Strands Agent 组件的 Python 项目
- 一个包含 MCP 服务器组件的项目(可以是
ts#mcp-server或py#mcp-server) - 两个组件都使用
computeType: BedrockAgentCoreRuntime创建
- 安装 Nx Console VSCode Plugin 如果您尚未安装
- 在VSCode中打开Nx控制台
- 点击
Generate (UI)在"Common Nx Commands"部分 - 搜索
@aws/nx-plugin - connection - 填写必需参数
- 点击
Generate
pnpm nx g @aws/nx-plugin:connectionyarn nx g @aws/nx-plugin:connectionnpx nx g @aws/nx-plugin:connectionbunx nx g @aws/nx-plugin:connection选择您的代理项目作为源,选择您的 MCP 服务器项目作为目标。如果您的项目包含多个组件,请指定 sourceComponent 和 targetComponent 选项以消除歧义。
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| sourceProject 必需 | string | - | 源项目 |
| targetProject 必需 | string | - | 要连接到的目标项目 |
| sourceComponent | string | - | 要从其连接的源组件(组件名称、相对于源项目根目录的路径或生成器 ID)。使用 '.' 显式选择项目作为源。 |
| targetComponent | string | - | 要连接到的目标组件(组件名称、相对于目标项目根目录的路径或生成器 ID)。使用 '.' 显式选择项目作为目标。 |
生成器会在 packages/common/agent_connection/ 创建一个共享的 agent_connection Python 项目(如果尚不存在)。每个连接的客户端模块都会生成到这个共享项目中:
文件夹packages/common/agent_connection
文件夹<scope>_agent_connection
- __init__.py 重新导出每个连接的客户端
文件夹core
- agentcore_mcp_client.py 核心 AgentCore MCP 客户端
文件夹app
- <mcp_server_name>_client.py 每个 MCP 服务器的专用连接客户端
此外,生成器还会:
- 转换您的代理的
agent.py,通过基于类的客户端导入和使用 MCP 服务器的工具 - 将
agent_connection项目添加为您的代理项目的工作区依赖项 - 更新代理的
serve-local目标,使其依赖于 MCP 服务器的服务目标
使用已连接的 MCP 服务器
Section titled “使用已连接的 MCP 服务器”生成器会转换您的代理的 agent.py 以使用 MCP 服务器的工具:
from contextlib import contextmanagerfrom strands import Agent
from my_scope_agent_connection import MyMcpServerClient
@contextmanagerdef get_agent(session_id: str): my_mcp_server = MyMcpServerClient.create(session_id=session_id) with ( my_mcp_server, ): yield Agent( system_prompt="...", tools=[*my_mcp_server.list_tools_sync()], )session_id 参数从调用方传递,确保 Bedrock AgentCore Observability 的一致性。
运行连接生成器后,您需要授予代理调用 MCP 服务器的权限:
const mcpServer = new MyMcpServer(this, 'MyMcpServer');const myAgent = new MyAgent(this, 'MyAgent');
// Grant the agent access to bedrock modelsmyAgent.agentCoreRuntime.addToRolePolicy( new PolicyStatement({ actions: ['bedrock:InvokeModel', 'bedrock:InvokeModelWithResponseStream'], resources: ['arn:aws:bedrock:*:*:foundation-model/*', 'arn:aws:bedrock:*:*:inference-profile/*'], }),);
// Grant the agent permissions to invoke the MCP servermcpServer.grantInvokeAccess(myAgent.agentCoreRuntime);MCP 服务器的 AgentCore 运行时 ARN 会由生成的 CDK 构造自动注册到 运行时配置 的 connection 命名空间中,因此代理可以在运行时发现它。
运行连接生成器后,您需要在 Terraform 配置中授予代理调用 MCP 服务器的权限:
module "inventory_mcp_server" { source = "../../common/terraform/src/app/mcp-servers/inventory-mcp"}
module "story_agent" { source = "../../common/terraform/src/app/agents/story-agent"}
# Grant the agent permissions to invoke the MCP serverresource "aws_iam_policy" "agent_invoke_mcp" { name = "AgentInvokeMcpPolicy" policy = jsonencode({ Version = "2012-10-17" Statement = [{ Effect = "Allow" Action = "bedrock-agentcore:InvokeAgent" Resource = module.inventory_mcp_server.agent_core_runtime_arn }] })}
resource "aws_iam_role_policy_attachment" "agent_invoke_mcp" { role = module.story_agent.agent_core_runtime_role_arn policy_arn = aws_iam_policy.agent_invoke_mcp.arn}MCP 服务器的 AgentCore 运行时 ARN 会由生成的 Terraform 模块自动注册到 运行时配置 的 connection 命名空间中,因此代理可以在运行时发现它。
生成器会配置代理的 serve-local 目标以:
- 自动启动已连接的 MCP 服务器
- 设置
SERVE_LOCAL=true,使生成的客户端使用直接 HTTP 传输而不是 AgentCore
使用以下命令在本地运行代理:
pnpm nx <agent-name>-serve-local <project-name>yarn nx <agent-name>-serve-local <project-name>npx nx <agent-name>-serve-local <project-name>bunx nx <agent-name>-serve-local <project-name>这将同时启动代理和所有已连接的 MCP 服务器,代理将通过 HTTP 直接连接到分配的本地端口上的 MCP 服务器。