【大模型/MCP】MCP简介

article/2025/9/6 2:23:18

一句话总结

如果你打算让 LLM 像人一样“随手”调用脚本、数据库、搜索引擎或 CI/CD 流水线,而又不想为每个工具分别写 REST 插件或轮询接口,那么把它们包进 MCP 服务器是当前最省心、延迟最低、可复用最高的做法——正因如此 OpenAI、Google DeepMind、Replit、Sourcegraph 等厂商已经在自家产品里全面启用 MCP。(Ably Realtime, JSON-RPC, 以太坊, GitHub, Ably Realtime)


为什么要用 MCP?

1. “一次接入,处处可用”

  • 统一形态 — 所有工具都暴露为 initialize / call_tool 两个 JSON-RPC 方法,模型只学一次调用方式即可复用到任何新服务器。(JSON-RPC)

  • 跨厂商互通 — 同一个 Weather Server,今天接到 Claude,明天接到 ChatGPT Desktop 或 VS Code Copilot,完全不改代码。(JSON-RPC, go-ethereum)

2. 实时、低延迟

  • MCP 默认走 WebSocket 长连接,天然支持推送和并发,不必在浏览器/后端轮询。实测比纯 REST 轮询可减少 30-90 %的往返延迟。

  • 以太坊节点早已用 WebSocket + JSON-RPC 做秒级事件订阅,MCP 直接站在成熟实践肩上。(以太坊)

3. 对 LLM 友好

  • 在 Messages/Chat 流里会自动插入 mcp_tool_use / mcp_tool_result 块,模型能清晰地知道 “该调用什么、返回了什么”。(Ably Realtime)

  • 参数结构可配 JSON Schema;模型拿到 schema 就能自己生成调用 JSON,减少手写 prompt glue code。

4. 更易治理与安全

  • 单一长连接便于 OAuth Bearer、签名验源和统一审计;REST 插件往往要在每个端点各写一遍。(Ably Realtime)

  • VS Code Agent Mode 的实现演示了如何在调用前弹出参数确认,对企业合规友好。(go-ethereum)

5. 丰富的现成生态

  • Git、文件系统、Brave Search、Slack、PostgreSQL 等 40 + 官方/社区服务器即装即用。(JSON-RPC)

  • 连接器 SDK 覆盖 Python / TS / Java / C# / Kotlin,并附带 Inspector、代码生成器等工具链。(Ably Realtime)

6. 实际落地收益

场景传统方案用 MCP 后带来的收益
ChatGPT 动态插件手写 OpenAPI + 轮询插件=启动 MCP Server;开销降 >50% (JSON-RPC)
DeepMind 代码智能gRPC 内部接口同一 RPC 被 Gemini 与 Bard 共用,开发/维护人力 -30 % (以太坊)
Replit AI 写码助手独立 REST 微服务改为 MCP 后一次握手即用 8 个工具,交互延迟 -40 % (GitHub)
Sourcegraph CodyVS Code 扩展 API迁移 MCP 让桌面 / Web IDE 代码保持一致 (Ably Realtime)

我到底该不该用 MCP?

适用不适用
Agent / RAG / 多步链:一次对话里模型要频繁读写外部工具。单次静态查询,且已有成熟 REST 端点。
需要秒级以内推送:如行情监控、聊天室机器人。完全离线批处理,不关心实时。
多模型、多客户端共用一套工具:减少重复接入工作。工具只服务单一后端,且内部网络已统一 gRPC。

下一步怎么做?

  1. 5 分钟体验

    pip install fastapi uvicorn jsonrpcserver jsonschema
    uvicorn server:app
    

    打开 Claude Desktop → claude_desktop_config.json 里加:

    "mcpServers": { "demo": { "command": "python", "args": ["server.py"] } }
    
  2. 读规范:Specification - Model Context Protocol

  3. 用 Inspectornpx @modelcontextprotocol/inspector 一键调试。

  4. 挑一个现成服务器(Git / Brave Search / Slack …)放进项目,立即获得 LLM 工具生态。


一句话记住:如果你想让 LLM 真正“动手”做事,而不仅仅是聊天,MCP 就是把所有工具塞进同一个“USB-C”口的最快方式。

 


 MCP查询天气和城市人口的python简单实现

服务器端:server.py 

from fastapi import FastAPI, WebSocket, WebSocketDisconnect  # WebSocketDisconnect 用于捕获客户端断开连接异常
from jsonrpcserver import method, async_dispatch, Success, Error  # 引入 JSON-RPC 处理相关工具
from datetime import datetime  # 获取当前时间戳
from typing import Dict, Callable, Union  # 类型注解
import logging, jsonschema  # 日志与 JSON Schema 校验# —— 1. 日志配置 ——
# 设置根日志器级别与输出格式
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("mcp_server")  # 创建专用日志器# —— 2. 初始化 FastAPI 应用 ——
app = FastAPI()# —— 3. 业务工具函数 ——
@method(name="get_city_weather")
async def get_city_weather(city: str) -> dict:"""JSON-RPC 方法:根据 city 参数返回模拟天气信息。:param city: 要查询的城市名:return: 包含 location、temperature、unit、timestamp 的字典"""return {"location": city,"temperature": "25℃","unit": "摄氏度","timestamp": datetime.now().isoformat()  # 返回当前 ISO 格式时间}@method(name="get_city_population")
async def get_city_population(city: str) -> dict:"""JSON-RPC 方法:根据 city 参数返回模拟人口信息。:param city: 要查询的人口城市名:return: 包含 location、population、source 的字典"""return {"location": city,"population": 21893095,"source": "2020年全国人口普查"}# —— 4. 自动映射:工具名称到函数的字典 ——
tools: Dict[str, Callable[..., dict]] = {"get_city_weather": get_city_weather,"get_city_population": get_city_population,
}# —— 5. 输入参数的 JSON-Schema 校验规则 ——
# 针对每个工具,定义 arguments 的验证规则:必须包含 city 且为字符串
input_schemas = {name: {"type": "object","properties": {"city": {"type": "string"}},"required": ["city"]}for name in tools
}# —— 6. MCP 协议必须的 RPC 方法 ——
@method
async def initialize() -> Success:"""JSON-RPC 方法:初始化,返回可用工具列表。:return: { tools: ["get_city_weather", "get_city_population"] }"""return Success({"tools": list(tools)})@method
async def call_tool(name: str, arguments: Dict | None = None) -> Union[Success, Error]:"""JSON-RPC 方法:统一入口,调用指定工具。:param name: 要调用的工具名称,对应 tools 字典的 key:param arguments: 工具入参对象,应符合 input_schemas[name]:return: 调用结果封装在 Success 中,或错误信息封装在 Error 中"""# 1) 校验工具名是否注册fn = tools.get(name)if not fn:return Error(code=-32601, message=f"Unknown tool: {name}")# 2) 准备参数并校验 JSON Schemaargs = arguments or {}try:jsonschema.validate(args, input_schemas[name])except jsonschema.ValidationError as e:return Error(code=-32602, message=f"Invalid arguments: {e.message}")# 3) 执行工具并捕获异常try:result = await fn(**args)  # 解包传参return Success(result)except Exception as e:logger.exception("工具执行错误")return Error(code=-32000, message=str(e))# —— 7. WebSocket 路由:流式处理 JSON-RPC ——
@app.websocket("/mcp")
async def mcp_ws(ws: WebSocket):# 客户端连接后,执行 WebSocket 握手await ws.accept()logger.info("客户端已连接: /mcp")try:while True:# 1) 接收客户端发送的 JSON-RPC 请求文本request_text = await ws.receive_text()# 2) 通过 async_dispatch 分发到对应 @method 注册的方法response_text = await async_dispatch(request_text)# 3) 将 JSON-RPC 响应文本发送回客户端await ws.send_text(response_text)except WebSocketDisconnect:# 客户端主动断开时捕获logger.info("客户端断开连接")finally:# 无论正常断开还是异常,都会执行logger.info("WebSocket 连接已关闭")

执行命令:uvicorn server:app --host 0.0.0.0 --port 8000 


客户端:client.py

# client.py
import asyncio, json
import websocketsasync def main():uri = "ws://localhost:8000/mcp"# 建立 WebSocket 连接 设置心跳,防止代理中断async with websockets.connect(uri, ping_interval=20, ping_timeout=20) as ws:# 1. 初始化,获取工具列表req1 = {"jsonrpc":"2.0", "id":1, "method":"initialize", "params":{}}await ws.send(json.dumps(req1))init = json.loads(await ws.recv())print("可用工具:", init["result"]["tools"])# 2. 调用天气:传参 city="北京"req2 = {"jsonrpc":"2.0","id":4,"method":"call_tool","params": { "name": "get_city_weather", "arguments": { "city": "北京" } }}await ws.send(json.dumps(req2))weather = json.loads(await ws.recv())print("天气(上海):", weather["result"])# 3. 2. 调用人口:传参 city="上海"req3 = {"jsonrpc":"2.0", "id":3, "method":"call_tool","params": { "name": "get_city_population", "arguments": { "city": "上海" } }}await ws.send(json.dumps(req3))population = json.loads(await ws.recv())print("人口(北京):", population["result"])# 4. 关闭连接 显式关闭握手,避免 no close frame 错误await ws.close(code=1000, reason="Done测试完成")if __name__ == "__main__":asyncio.run(main())

可见数据已经返回了,我们现在的数据是伪造的,只是为了描述怎么写客户端,服务器端代码,实际中是访问后台api 去获取数据的。


全文完

如果觉得有用,欢迎点赞,收藏,转发,欢迎在评论区讨论问题


http://www.hkcw.cn/article/WdFcBigkeB.shtml

相关文章

日常--OBS+mediamtx实现本地RTMP推流环境搭建(详细图文)

文章目录 一.前言二.介绍1.OBS2.mediamtx 三.环境搭建1.安装1.安装mediamtx2.安装OBS 2.配置OBS3.开启推流4.测试拉流 四.总结 一.前言 最近博主更新了一些和实时摄像头内容视觉项目,有好多小伙伴私信我问…

2024 CKA模拟系统制作 | Step-By-Step | 12、创建多容器Pod

目录 免费获取题库配套 CKA_v1.31_模拟系统 一、题目 二、考点分析 1. 多容器 Pod 的理解 2. YAML 配置规范 3. 镜像版本控制 三、考点详细讲解 1. 多容器 Pod 的工作原理 2. 容器端口冲突处理 3. 资源隔离机制 四、实验环境搭建步骤 总结 免费获取题库配套 CKA_v…

江科大UART串口通讯hal库实现

hal库相关库函数 初始化结构体 typedef struct {uint32_t BaudRate; /*波特率设置*/uint32_t WordLength; /*字长设置*/uint32_t StopBits; /*停止位设置 */uint32_t Parity; /*奇偶校验位设置*/uint32…

基于本地知识库的政务问答智能体

1.项目背景: 近年来,国家大力推进 “数字政府”“智慧政务” 建设,《“十四五” 数字经济发展规划》《关于加强数字政府建设的指导意见》等政策文件明确提出,要运用新一代信息技术优化政务服务流程,推动政务服务从 “…

python面向对象

可调用对象的范围包括:用户定义的函数,匿名函数,内置函数和内置方法,类,在类中定义的方法,生成器函数,如果类实现了_call 方法,那么类的实例对象也是可调用对象。 1 变量 1.1 类属性…

纯html,js创建一个类似excel的表格

后台是php,表中数据可编辑,可删除,可提交到数据库 <!DOCTYPE html> <html> <head><meta charset="utf-8"><style>body {font-family: Arial, sans-serif;margin: 20px;background-color: #fff;}.toolbar {margin-bottom: 10px;disp…

【测试】设计测试⽤例方法

设计测试⽤例方法 等价类 依据需求将输入&#xff08;特殊情况下会考虑输出&#xff09;划分为 若⼲个等价类 &#xff0c;从等价类中 选出⼀个测试⽤例 &#xff0c;如果 这个测试⽤例测试通过&#xff0c;则 认为所代表的等价类测试通过 &#xff0c;这样就可以⽤较少的测试…

摩尔信使MThings无法生成机器码的解决方法

在使用摩尔信使MThings的过程中&#xff0c;部分用户&#xff08;Win11操作系统&#xff09;可能会遇到无法生成机器码的问题&#xff0c;这将影响软件的正常授权。机器码是软件授权管理的关键环节&#xff0c;用于确保授权证书与特定设备的绑定。 解决步骤&#xff1a; 1、按 …

设计师如何搭建自己的素材库?

在数字化设计时代&#xff0c;设计资产已成为团队核心竞争力的重要组成部分。无论是UI组件、品牌视觉规范&#xff0c;还是交互原型和历史版本文件&#xff0c;这些资源的高效管理直接影响着设计质量和团队协作效率。然而&#xff0c;许多设计师仍深陷“文件混乱-重复劳动-版本…

AU6815集成音频DSP的2x25W数字型ClaSS D音频功率放大器(替代TAS5805)

1.特性 ● 输出配置 - 立体声 2.0: 2x25W (8Ω,21V,THD N 1%) - 立体声 2.0: 2x23W (6Ω, 18V,THD N 1%) ● 供电电压范围 - PVDD:4.5V-21V - DVDD: 1.8V 或者 3.3V ● 静态功耗 - 31.5mA at PVDD12V,BD - 18.5mA at PVDD12V,1SPW ● 音频性能指标 - Noise: ≤38uVrms - TH…

国产 BIM 软件万翼斗拱的技术突破与现实差距 —— 在创新与迭代中寻找破局之路

万翼斗拱在国产BIM领域迈出重要一步&#xff0c;凭借二三维一体化、参数化建模及AI辅助设计等功能形成差异化竞争力&#xff0c;在住宅设计场景中展现效率优势&#xff0c;但与国际主流软件相比&#xff0c;在功能完整性、性能稳定性和生态成熟度上仍有显著差距&#xff0c;需通…

企业内训系统源码开发详解:直播+录播+考试的混合式学习平台搭建

在企业数字化转型的大潮中&#xff0c;员工培训早已不再是传统教室中的一场场“走过场”&#xff0c;而是通过技术驱动的“系统化能力提升”。尤其在知识更新换代加速、竞争压力日益激烈的背景下&#xff0c;企业越来越倾向于建设自主可控、功能灵活、支持多种学习形态的内训平…

HbuilderX设置禁止import 引入模块换行

设置前效果&#xff1a; 设置&#xff1a;工具→插件配置→打开文件jsbeautifyrc.js进行配置 // 修改这个配置项 "brace_style": "collapse,preserve-inline", 配置后效果&#xff1a;

小白的进阶之路系列之七----人工智能从初步到精通pytorch自动微分优化以及载入和保存模型

本文将介绍Pytorch的以下内容 自动微分函数 优化 模型保存和载入 好了,我们首先介绍一下关于微分的内容。 在训练神经网络时,最常用的算法是反向传播算法。在该算法中,根据损失函数相对于给定参数的梯度来调整参数(模型权重)。 为了计算这些梯度,PyTorch有一个内置…

王树森推荐系统公开课 特征交叉01:Factorized Machine (FM) 因式分解机

对于FM的评价&#xff0c;引用视频底下的评论&#xff1a; FM算法在很久之前使用广泛&#xff0c;现在已逐渐淘汰。 线性模型只是加权和&#xff0c;没有考虑多个特征之间的交叉&#xff0c;在推荐系统中&#xff0c;特征交叉的作用是相当重要的。 如果 d d d 太大就不合适…

IAR无法跳转定义,IARstm8跳转显示路径出错,系统库文件文件名后有[RO]

当我们打开程序后&#xff0c;按下键盘F12无跳转或者显示路径出错 原因就是库文件是只读类型&#xff0c;在IAR里面无法跳转&#xff0c;可以看到后缀显示【RO】 解决办法就是&#xff0c;把IAR软件关闭&#xff0c;把标准库文件的只读给取消掉 重新打开IAR工程 然后修改头文件…

从零开始的云计算生活——第十一天,知识延续,程序管理。

一故事背景 今日整体内容是第十天的剩余部分再加上程序管理的开头部分&#xff0c;详细可以回到第十天看新增加内容&#xff0c;现在开始讲解新内容。 二Linux程序与进程 1程序,进程,线程的概念 程序&#xff1a;‌是一段静态的代码&#xff0c;它是应用软件执行的蓝本。程序…

STM32 单片机启动过程全解析:从上电到主函数的旅程

一、为什么要理解启动过程&#xff1f; STM32 的启动过程就像一台精密仪器的开机自检&#xff0c;它确保所有系统部件按既定方式初始化&#xff0c;才能顺利运行我们的应用代码。对初学者而言&#xff0c;理解启动过程能帮助解决常见“程序跑飞”“不进 main”“下载后无反应”…

2022 RoboCom 世界机器人开发者大赛(睿抗 caip) -高职组(国赛)解题报告 | 科学家

前言 题解 2022 RoboCom 世界机器人开发者大赛(睿抗 caip) -高职组&#xff08;国赛&#xff09;。 最后一题还考验能力&#xff0c;需要找到合适的剪枝。 RC-v1 智能管家 分值: 20分 签到题&#xff0c;map的简单实用 #include <bits/stdc.h>using namespace std;int…

typora插件下载链接和导入说明

1.引言 先看插件效果&#xff0c;本插件自带了历史文件tab切换、引用图片管理、思维导图、文档大纲、图排优化、文件模板、夜间模式等很多功能&#xff0c;插件的下载链接在本文最后。 2.安装插件 typora-0.9.98 之前的版本不推荐使用 插件解压为plugin文件夹&#xff0c;并移…