AI Agent 调用外部工具有标准方案吗?MCP 协议 + Bedrock 实战详解
有。MCP(Model Context Protocol)就是解决这个问题的。 一句话:Agent 调工具的标准协议。 工具提供方按 MCP 规范暴露能力(MCP Server),Agent 侧按规范调用(MCP Client)。通信走 JSON-RPC。 核心价值:装一个 Server = 获得一组工具。不用手写 function schema,不用手写调用逻辑。 传统方式:每个工具手写 schema + 手写调用代码 + 手写鉴权 MCP 方式:Server 暴露工具定义(名称、参数、描述),Client 自动发现并调用 好处是标准化和复用。同一个 S3 MCP Server,可以被多个不同的 Agent 使用。 Bedrock Agent 原生支持 MCP Client。接入流程: 以 S3 文件操作为例: Server 里可以做白名单、参数校验、长度限制等安全检查。 给 MCP Server 一个最小权限 IAM Role: 只给特定 bucket 的读权限。 把 MCP Server 注册到 Bedrock Agent,Agent 调用时自动走 MCP 协议。 MCP 让工具接入变简单了,安全不能松: 两种方式不冲突,按需选择。做了一个 AI Agent,需要它读 S3 文件、查 DynamoDB、调内部 API。每个工具都要写 function calling 的 schema 和调用逻辑,工具一多维护成本很高。有没有标准化的方案?
MCP 是什么
跟传统 function calling 的区别
用 Amazon Bedrock 跑 MCP
1. 写一个 MCP Server
from mcp.server import Server
import boto3, json
app = Server("s3-server")
s3 = boto3.client('s3', region_name='cn-northwest-1')
@app.tool()
async def list_files(bucket: str, prefix: str = "") -> str:
"""列出存储桶中的文件"""
resp = s3.list_objects_v2(Bucket=bucket, Prefix=prefix, MaxKeys=50)
return json.dumps([obj['Key'] for obj in resp.get('Contents', [])], ensure_ascii=False)
@app.tool()
async def read_file(bucket: str, key: str) -> str:
"""读取文本文件"""
if bucket not in ["my-agent-bucket"]:
return "无权访问"
resp = s3.get_object(Bucket=bucket, Key=key)
return resp['Body'].read().decode('utf-8')[:10000]2. 配 IAM 权限
{
"Statement": [{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:ListBucket"],
"Resource": [
"arn:aws-cn:s3:::my-agent-bucket",
"arn:aws-cn:s3:::my-agent-bucket/*"
]
}]
}3. 在 Bedrock Agent 中配置
安全要点
适用场景
🔗 Amazon Bedrock:https://aws.amazon.com/cn/bedrock/
🔗 Amazon Bedrock AgentCore:https://aws.amazon.com/cn/bedrock/agentcore/
🔗 IAM:https://docs.aws.amazon.com/iam/