MCP 到底是什么?一篇讲透:协议原理 + Bedrock 实战 + 安全防护

最近 MCP 这个词在技术社区频率很高。但很多文章讲得云里雾里,看完还是不知道它到底解决了什么问题。

简单说:MCP 让 Agent 调工具变得像装插件一样简单。

没有 MCP 之前

Agent 要调外部工具(读文件、查数据库、发通知),你得手动写 function calling:定义 schema、写调用逻辑、处理鉴权、做错误重试。每个工具都要搞一遍。

工具少的时候还行,工具一多就是大量重复劳动。而且每个工具的接入方式不一样,维护成本高。

MCP 做了什么

MCP(Model Context Protocol)定义了一个标准协议:

  • MCP Server:工具提供方,按标准暴露能力
  • MCP Client:Agent/IDE 侧,按标准调用
  • 通信走 JSON-RPC(本地用 stdio,远程用 HTTP + SSE)

装一个 MCP Server,Agent 就获得了这个 Server 暴露的所有工具。不用写 function schema,不用写调用逻辑。

类比一下:MCP 之于 Agent,就像 USB 之于电脑。以前每个外设都要专门的接口和驱动,USB 统一了。

跟 Amazon Bedrock 怎么配合

Bedrock Agent 原生支持 MCP。架构很简单:

java 复制代码
Bedrock Agent
    ↓
MCP Client(内置)
    ↓
MCP Server (S3)      → 读写文件
MCP Server (DynamoDB) → 查数据
MCP Server (自建 API) → 业务逻辑

实战:写一个 S3 MCP Server

python 复制代码
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:
    """列出 S3 存储桶中的文件"""
    resp = s3.list_objects_v2(Bucket=bucket, Prefix=prefix, MaxKeys=50)
    files = [obj['Key'] for obj in resp.get('Contents', [])]
    return json.dumps(files, ensure_ascii=False)

@app.tool()
async def read_file(bucket: str, key: str) -> str:
    """读取 S3 文本文件"""
    # 白名单检查
    if bucket not in ["my-agent-bucket"]:
        return "错误:无权访问该存储桶"
    resp = s3.get_object(Bucket=bucket, Key=key)
    content = resp['Body'].read().decode('utf-8')
    return content[:10000]  # 防止撑爆 context

@app.tool()
async def write_file(bucket: str, key: str, content: str) -> str:
    """写入文本到 S3"""
    s3.put_object(Bucket=bucket, Key=key, Body=content.encode('utf-8'))
    return f"已写入: s3://{bucket}/{key}"

安全:三层控制

第一层 - MCP Server 代码里限制:白名单、参数校验、路径检查

第二层 - Server 的 IAM Role:只给 S3 的 Get/Put/List,限定特定 bucket

json 复制代码
{
    "Statement": [{
        "Effect": "Allow",
        "Action": ["s3:GetObject", "s3:PutObject", "s3:ListBucket"],
        "Resource": [
            "arn:aws-cn:s3:::my-agent-bucket",
            "arn:aws-cn:s3:::my-agent-bucket/*"
        ]
    }]
}

第三层 - Bedrock Agent 的 IAM Role:控制 Agent 能调哪些 MCP Server

三层取交集,Agent 只能做三层都允许的操作。

日志

MCP Server 的调用日志 + CloudTrail 的 API 调用日志,形成完整链路。

什么场景适合 MCP

  • ✅ Agent 需要接入多个工具/服务
  • ✅ 工具需要被多个 Agent 复用
  • ✅ 需要在工具层面做权限控制
  • ⚠️ 只有一两个简单工具 → 直接 function calling 可能更简单

总结

MCP 把 Agent 的工具调用标准化了。配合 Amazon Bedrock,可以用 IAM 做权限、CloudTrail 做审计、VPC Endpoint 做网络隔离,形成完整的安全方案。

如果你的 Agent 要接多个云服务或内部 API,值得试试 MCP。


🔗 Amazon Bedrock:aws.amazon.com/cn/bedrock/ 🔗 Amazon Bedrock AgentCore:aws.amazon.com/cn/bedrock/... 🔗 CloudTrail:aws.amazon.com/cn/cloudtra...

相关推荐
smallyoung13 分钟前
告别N+1:Spring Boot 一键数据翻译框架体系
java·后端·架构
Bazingga2 小时前
Java16 record 完整拆解——语法、语义、限制、反射
java·后端
SL_staff3 小时前
规则联动:给工厂装上‘自动化神经反射弧’——JVS·物联网平台规则引擎实战教程
java·人工智能·物联网
骑着蜗牛撵大象3273 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
WJ.Polar4 小时前
Java封装、继承、多态
java·开发语言
ly76894 小时前
PostgreSQL 备份恢复策略:pg_basebackup、WAL 归档与 PITR 在企业 Java 系统中的落地
java·数据库·postgresql·pitr·pg_basebackup·wal 归档
摇滚侠4 小时前
Java 中如何表示负数,有符号和无符号的区别,补码的计算规则,char byte short int long 的范围
java·开发语言
奇牙coding4 小时前
Codex CLI 升级后多文件编辑静默失效:config.yaml 枚举变更排查与修复指南
java·前端·javascript·ai
小羊没烦恼!5 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
Lhappy嘻嘻5 小时前
读懂 JVM:内存模型、类加载机制、分代回收
java·开发语言·jvm