Agent
解释一下什么是agent
Agent(智能体) 是能够自主感知环境、决策并执行动作,以实现特定目标的实体。
- 感知:机器人的摄像头、NLP Agent 的文本输入等
- 决策:推荐系统 Agent 根据用户浏览历史,决策推荐哪些商品;无人机 Agent 根据地形,决策最优飞行路径,ChatExcel通过解析表格内容和用户提示词决定处理的步骤
- 行动:工业机器人 Agent 执行 "抓取零件" 的动作;邮件自动回复 Agent 发送预设邮件;LLM Agent 调用工具(如计算器、搜索引擎)完成任务,ChatExcel执行pandas代码操作表格。
MCP
什么是MCP
模型上下文协议(Model Context Protocol)
旨在统一大模型与外部数据源和工具之间的通信协议 。MCP 的主要目的在于解决当前 AI 模型因数据孤岛限制而无法充分发挥潜力的难题,MCP 使得 AI 应用能够安全地访问和操作本地及远程数据,为 AI 应用提供了连接万物的接口。
将 LLM 与资源之间的通信划分为三个主要部分:客户端、服务器和资源。
客户端负责发送请求给 MCP 服务器 ,服务器则将这些请求转发给相应的资源。这种分层的设计使得 MCP 协议能够更好地控制访问权限 ,确保只有经过授权的用户才能访问特定的资源。
MCP基本工作流程:
- 初始化连接:客户端向服务器发送连接请求,建立通信通道。
- 发送请求:客户端根据需求构建请求消息,并发送给服务器。
- 处理请求:服务器接收到请求后,解析请求内容,执行相应的操作(如查询数据库、读取文件等)。
- 返回结果:服务器将处理结果封装成响应消息,发送回客户端。
- 断开连接:任务完成后,客户端可以主动关闭连接或等待服务器超时关闭。
MCP核心架构
MCP 主机(MCP Hosts):发起请求的 LLM 应用程序(例如 Claude Desktop、IDE 或 AI 工具)。
MCP 客户端(MCP Clients):在主机程序内部,与 MCP server 保持 1:1 的连接。
MCP 服务器(MCP Servers):为 MCP client 提供上下文、工具和 prompt 信息。
本地资源(Local Resources):本地计算机中可供 MCP server 安全访问的资源(例如文件、数据库)。
远程资源(Remote Resources):MCP server 可以连接到的远程资源(例如通过 API)。
MCP Client
MCP client 充当 LLM 和 MCP server 之间的桥梁,MCP client 的工作流程如下:
- MCP client 首先从 MCP server 获取可用的工具列表。
- 将用户的查询连同工具描述通过 function calling 一起发送给 LLM。
- LLM 决定是否需要使用工具以及使用哪些工具。
- 如果需要使用工具,MCP client 会通过 MCP server 执行相应的工具调用。
- 工具调用的结果会被发送回 LLM。
- LLM 基于所有信息生成自然语言响应。
- 最后将响应展示给用户。
通信机制
stdio(Standard Input/Output)即标准输入输出流,是操作系统为进程提供的默认通信管道。在 MCP 协议中,MCP Client 和 MCP Server 运行在同一台机器上,作为两个独立进程,通过 stdin(标准输入)和 stdout(标准输出)直接传输 JSON-RPC 消息,无需经过网络协议栈。
- 进程启动:MCP Host 启动时,会 fork 一个子进程运行 MCP Server(如本地文件管理 Server),并建立 stdio 管道连接。
- 消息发送:Client 把 JSON-RPC 请求消息序列化为字符串,通过 stdout 写入管道。
- 消息接收:Server 从 stdin 读取管道中的字符串,反序列化为 JSON 对象,执行对应的方法(如读取本地文件)。
- 响应返回:Server 将执行结果封装为 JSON-RPC 响应消息,通过自身的 stdout 写回管道,Client 从 stdin 读取响应。
SSE(Server-Sent Events)是一种基于 HTTP 协议的单向服务器推送技术,允许服务器主动向客户端发送实时数据。在 MCP 协议中,MCP Client 和 MCP Server 部署在不同主机,通过 HTTP 连接建立 SSE 通道,传输 JSON-RPC 消息,实现跨网络的远程通信。与 WebSocket(双向全双工)不同,SSE 是单向的:客户端发起一次 HTTP GET 请求后,连接会被保持为长连接,后续只有 Server 能主动向 Client 推送数据;如果 Client 需要发送请求(如调用远程方法),则需要单独发起 HTTP POST 请求。 - 建立长连接:Client 向 Server 的 SSE 端点(如 http://remote-mcp-server.com/sse)发送 HTTP GET 请求,请求头中指定 Accept: text/event-stream,表示要建立 SSE 连接。
- 发送远程请求:Client 若需调用 Server 方法(如查询远程天气 API),则发起 HTTP POST 请求,将 JSON-RPC 消息体放在请求体中。
- Server 处理并推送响应:
- Server 执行方法后,将 JSON-RPC 响应消息封装为 SSE 格式的事件;
- 通过已建立的 SSE 长连接,将事件推送给 Client。
- 实时数据推送:如果 Server 有主动更新(如航班动态、股票价格变化),可直接通过 SSE 向 Client 推送 JSON-RPC 消息,无需 Client 轮询。
身份认证
单一key
对 MCP 服务器,我们采用一种现代、标准的方法:JWT Bearer Token 身份验证。
基本思路如下:
- 一个授权服务器/身份提供商(Authorization Server / Identity Provider)向客户端签发一个JSON Web Token(JWT) ,这是带数字签名的"通行证"。
- 客户端在请求头中附带该令牌:Authorization: Bearer <很长的 JWT 字符串>。
- 我们的 MCP 服务器作为资源服务器(Resource Server) ,无需与授权服务器通信;它只需要授权服务器的公钥,用来验证令牌签名的有效性与未被篡改。
这种方式既安全又易扩展。你的 MCP 服务器不处理密码或机密,只需验证签名令牌。下面分别用 fastmcp 与 mcp 来实现。