【翻译、转载】MCP 核心架构


核心架构

了解 MCP 如何连接客户端、服务器和 LLM

模型上下文协议 (MCP) 构建在一个灵活、可扩展的架构之上,能够实现 LLM 应用程序与集成之间的无缝通信。本文档涵盖了核心的架构组件和概念。

概述
MCP 遵循客户端-服务器 (client-server) 架构,其中:

  • 宿主 (Host) 是发起连接的 LLM 应用程序(如 Claude 桌面版或 IDE)。
  • 客户端 (Client) 在宿主应用程序内部与服务器保持 1:1 连接。
  • 服务器 (Server) 向客户端提供上下文、工具和提示 (prompts)。

在这里插入图片描述

宿主 (Host)
服务器进程 (Server Process)
MCP 客户端
传输层
MCP 服务器

核心组件

协议层
协议层处理消息帧、请求/响应关联以及高级通信模式。

[Python]

class Session(BaseSession[RequestT, NotificationT, ResultT]):async def send_request(self,request: RequestT,result_type: type[Result]) -> Result:"""Send request and wait for response. Raises McpError if response contains error."""# Request handling implementationasync def send_notification(self,notification: NotificationT) -> None:"""Send one-way notification that doesn't expect response."""# Notification handling implementationasync def _received_request(self,responder: RequestResponder[ReceiveRequestT, ResultT]) -> None:"""Handle incoming request from other side."""# Request handling implementationasync def _received_notification(self,notification: ReceiveNotificationT) -> None:"""Handle incoming notification from other side."""# Notification handling implementation

关键类包括:

  • Protocol (协议)
  • Client (客户端)
  • Server (服务器)

传输层
传输层处理客户端和服务器之间的实际通信。MCP 支持多种传输机制:

  • Stdio 传输
    • 使用标准输入/输出 (standard input/output) 进行通信。
    • 非常适合本地进程。
  • 带 SSE 的 HTTP 传输
    • 使用服务器发送事件 (Server-Sent Events, SSE) 处理服务器到客户端的消息。
    • 使用 HTTP POST 处理客户端到服务器的消息。

所有传输都使用 JSON-RPC 2.0 来交换消息。有关模型上下文协议消息格式的详细信息,请参阅规范文档。

消息类型
MCP 有以下主要的消息类型:

  • 请求 (Request) 期望从对方获得响应:
interface Request {method: string; // 方法名params?: { ... }; // 参数 (可选)
}
  • 结果 (Result) 是对请求的成功响应:
interface Result {[key: string]: unknown; // 任意键值对
}
  • 错误 (Error) 表明请求失败:
interface Error {code: number; // 错误代码message: string; // 错误消息data?: unknown; // 额外数据 (可选)
}
  • 通知 (Notification) 是不期望响应的单向消息:
interface Notification {method: string; // 方法名params?: { ... }; // 参数 (可选)
}

连接生命周期

1. 初始化
[时序图]
在这里插入图片描述

服务器 客户端 initialize 请求 (协议版本, 能力) initialize 响应 (协议版本, 能力) initialized 通知 (确认) 连接准备就绪 服务器 客户端
  • 客户端发送包含协议版本和能力的 initialize 请求。
  • 服务器以其协议版本和能力进行响应。
  • 客户端发送 initialized 通知作为确认。
  • 开始正常的消息交换。

2. 消息交换
初始化后,支持以下模式:

  • 请求-响应 (Request-Response):客户端或服务器发送请求,另一方响应。
  • 通知 (Notification):任意一方发送单向消息。

3. 终止
任意一方都可以终止连接:

  • 通过 close() 进行干净关闭。
  • 传输断开。
  • 错误条件。

错误处理
MCP 定义了这些标准错误代码:

enum ErrorCode {// 标准 JSON-RPC 错误代码ParseError = -32700,       // 解析错误InvalidRequest = -32600,   // 无效请求MethodNotFound = -32601,   // 方法未找到InvalidParams = -32602,    // 无效参数InternalError = -32603     // 内部错误
}

SDK 和应用程序可以定义自己的高于 -32000 的错误代码。

错误通过以下方式传播:

  • 对请求的错误响应。
  • 传输上的错误事件。
  • 协议级别的错误处理程序。

实现示例
这是一个实现 MCP 服务器的基本示例:

[Python]

import asyncio
import mcp.types as types
from mcp.server import Server
from mcp.server.stdio import stdio_serverapp = Server("example-server")@app.list_resources()
async def list_resources() -> list[types.Resource]:return [types.Resource(uri="example://resource",name="Example Resource")]async def main():async with stdio_server() as streams:await app.run(streams[0],streams[1],app.create_initialization_options())if __name__ == "__main__":asyncio.run(main())

最佳实践

传输选择

  • 本地通信
    • 对于本地进程,使用 stdio 传输。
    • 对于同一台机器上的通信效率高。
    • 进程管理简单。
  • 远程通信
    • 对于需要 HTTP 兼容性的场景,使用 SSE。
    • 考虑安全影响,包括身份验证和授权。

消息处理

  • 请求处理
    • 彻底验证输入。
    • 使用类型安全的模式 (schema)。
    • 优雅地处理错误。
    • 实现超时机制。
  • 进度报告
    • 对长时间操作使用进度令牌 (progress tokens)。
    • 增量报告进度。
    • 在已知总进度时包含该信息。
  • 错误管理
    • 使用适当的错误代码。
    • 包含有用的错误消息。
    • 在出错时清理资源。

安全注意事项

  • 传输安全
    • 对远程连接使用 TLS。
    • 验证连接来源。
    • 在需要时实施身份验证。
  • 消息验证
    • 验证所有传入消息。
    • 净化输入内容 (Sanitize inputs)。
    • 检查消息大小限制。
    • 验证 JSON-RPC 格式。
  • 资源保护
    • 实施访问控制。
    • 验证资源路径。
    • 监控资源使用情况。
    • 对请求进行速率限制。
  • 错误处理 (安全方面)
    • 不要泄露敏感信息。
    • 记录与安全相关的错误。
    • 实施正确的清理操作。
    • 处理拒绝服务 (DoS) 场景。

调试与监控

  • 日志记录
    • 记录协议事件。
    • 跟踪消息流。
    • 监控性能。
    • 记录错误。
  • 诊断
    • 实施健康检查。
    • 监控连接状态。
    • 跟踪资源使用情况。
    • 进行性能分析 (Profile)。
  • 测试
    • 测试不同的传输方式。
    • 验证错误处理。
    • 检查边缘情况。
    • 对服务器进行负载测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/78490.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 数据智能实战 (11):LLM如何解决模型可解释性

写在前面 —— 不只知其然,更要知其所以然:借助 LLM,揭开复杂模型决策的神秘面纱 在前面的篇章中,我们学习了如何利用 LLM 赋能用户分群、购物篮分析、流失预测以及个性化内容生成。我们看到了 LLM 在理解数据、生成特征、提升模型效果和自动化内容方面的巨大潜力。 然而…

Linux:进程优先级及环境

一:孤儿进程 在Linux系统中,当一个进程创建了子进程后,如果父进程执行完毕或者提前退出而子进程还在运行,那么子进程就会成为孤儿进程。子进程就会被systemd(系统)进程收养,其pid为1 myproces…

Java大厂面试:Java技术栈中的核心知识点

Java技术栈中的核心知识点 第一轮提问:基础概念与原理 技术总监:郑薪苦,你对JVM内存模型了解多少?能简单说说吗?郑薪苦:嗯……我记得JVM有堆、栈、方法区这些区域,堆是存放对象的地方&#xf…

CF1000E We Need More Bosses

CF1000E We Need More Bosses 题目描述 题目大意: 给定一个 n n n 个点 m m m 条边的无向图,保证图连通。找到两个点 s , t s,t s,t,使得 s s s到 t t t必须经过的边最多(一条边无论走哪条路线都经过ta,这条边就是…

imx6uLL应用-v4l2

Linux V4L2 视频采集 JPEG 解码 LCD 显示实践 本文记录一个完整的嵌入式视频处理项目:使用 V4L2 接口从摄像头采集 MJPEG 图像,使用 libjpeg 解码为 RGB 格式,并通过 framebuffer 显示在 LCD 屏幕上。适用于使用 ARM Cortex-A 系列开发板进…

强化学习机器人模拟器——QAgent:一个支持多种强化学习算法的 Python 实现

QAgent 是一个灵活的 Python 类,专为实现经典的强化学习(Reinforcement Learning, RL)算法而设计,支持 Q-learning、SARSA 和 SARSA(λ) 三种算法。本篇博客将基于提供的 q_agent.py 代码,详细介绍 QAgent 类的功能、结构和使用方法,帮助您理解其在强化学习任务中的应用,…

Feign的原理

为什么 SpringCloud 中的Feign,可以帮助我们像使用本地接口一样调用远程 HTTP服务? Feign底层是如何实现的?这篇文章,我们一起来聊一聊。 1. Feign 的基本原理 Feign 的核心思想是通过接口和注解定义 HTTP 请求,将接…

探索正态分布:交互式实验带你体验统计之美

探索正态分布:交互式实验带你体验统计之美 正态分布,这条优美的钟形曲线,可以说是统计学中最重要、最无处不在的概率分布。从自然现象(如身高、测量误差)到金融市场,再到机器学习,它的身影随处…

使用 IDEA + Maven 搭建传统 Spring MVC 项目的详细步骤(非Spring Boot)

搭建Spring MVC项目 第一步:创建Maven项目第二步:配置pom.xml第三步:配置web.xml第四步:创建Spring配置文件第五步:创建控制器第六步:创建JSP视图第七步:配置Tomcat并运行目录结构常见问题解决与…

AI日报 · 2025年5月04日|Hugging Face 启动 MCP 全球创新挑战赛

1、Hugging Face 启动 MCP 全球创新挑战赛 Hugging Face 于 5 月 3 日发布 MCP Global Innovation Challenge,面向全球开发者征集基于模型上下文协议(MCP)的创新工具与应用,赛事持续至 5 月 31 日,设立多档…

学习spring boot-拦截器Interceptor,过滤器Filter

目录 拦截器Interceptor 过滤器Filter 关于过滤器的前置知识可以参考: 过滤器在springboot项目的应用 一,使用WebfilterServletComponentScan 注解 1 创建过滤器类实现Filter接口 2 在启动类中添加 ServletComponentScan 注解 二,创建…

汇编常用语法

GNU汇编语句: [lable:] instruction [comment] lable 表示标号,表示地址位置,可选. instruction即指令,也就是汇编指令或伪指令。 comment 就是注释内容。 用户使用.section 伪操作来定义一个段,汇编系统预定义了一些…

terraform resource创建了5台阿里云ecs,如要使用terraform删除其中一台主机,如何删除?

在 Terraform 中删除阿里云 5 台 ECS 实例中的某一台,具体操作取决于你创建资源时使用的 多实例管理方式(count 或 for_each)。以下是详细解决方案: 方法一:使用 for_each(推荐) 如果创建时使…

pycharm terminal 窗口打不开了

参考添加链接描述powershell.exe改为cmd.exe发现有一个小正方形,最大化可以看见了。

百度「心响」:左手“多智能体”右手“保姆级服务”,C端用户能看懂这技术告白吗?

——当技术名词撞上“傻瓜式”需求,谁是赢家? 「多智能体」是什么?用户:不重要,能一键搞定就行 百度最新推出的多智能体平台“心响”,号称能用自然语言交互一键托管复杂任务。 从旅游攻略到法律咨询&#x…

57认知干货:AI机器人产业

机器人本质上由可移动的方式和可交互万物的机构组成,即适应不同环境下不同场景的情况,机器人能够做到根据需求调整交互机构和移动方式。因此,随着人工智能技术的发展,AI机器人的产业也将在未来逐步从单一任务的执行者,发展为能够完成复杂多样任务的智能体。 在未来的社会…

在两个bean之间进行数据传递的解决方案

简介 在日常开发中,在两个bean之间进行数据传递是常见的操作,例如在日常开发中,将数据从VO类转移到DO类等。在两个bean之间进行数据传递,最常见的解决方案,就是手动复制,但是它比较繁琐,充斥着…

基于开闭原则优化数据库查询语句拼接方法

背景 在开发实践中,曾有同事在实现新功能时,因直接修改一段数据库查询条件拼接方法的代码逻辑,导致生产环境出现故障。 具体来看,该方法通过在函数内部直接编写条件判断语句实现查询拼接,尽管从面向对象设计的开闭原…

QT开发工具对比:Qt Creator、Qt Designer、Qt Design Studio

前端开发工具—Qt Designer Qt Designer是Qt框架的一部分,是一个图形用户界面设计工具。它允许开发者通过可视化方式设计和布局GUI组件,而无需手动编写UI代码。设计完成后,Qt Designer生成UI文件(通常以.ui为扩展名)&…

0基础 | STM32 | TB6612电机驱动使用

TB6612介绍及使用 单片机通过驱动板连接至电机 原因:单品机I/O口输出电流I小 驱动板:从外部引入高电压,控制电机驱动 电源部分 VM:电机驱动电源输入,输入电压范围建议为3.7~12V GND:逻辑电…