【大模型/MCP】MCP简介

news2025/5/31 16:22:00

一句话总结

如果你打算让 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 Schema
    args = 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 websockets

async 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.coloradmin.cn/o/2391659.html

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

相关文章

[Godot][游戏开发] 如何在 Godot 中配置 Android 环境(适配新版 Android Studio)

在使用 Godot 进行 Android 项目的开发与导出时,配置 Android 环境是一项必要步骤。随着 Android Studio 的更新(特别是自 Arctic Fox 版本起),安装方式发生了变化,默认不再引导用户手动配置 SDK/JDK/NDK,而…

机器学习多分类逻辑回归和二分类神经网络实践

1、2-17 实现多分类逻辑回归 代码 # 2-17 实现多分类逻辑回归 import pandas as pd import numpy as np import matplotlib.pyplot as plt# 参数设置 iterations 5400 # 迭代次数 learning_rate 0.1 # 学习率 m_train 200 # 训练样本数量# 整数索引值转one-hot向量 def…

社交类网站设计:经典feed流系统架构详细设计(小红书微博等)

文章目录 一、关注服务1、粉丝、关注数架构设计(1)数据库实现方案1(2)数据库实现方案2(3)基于redis缓存优化(4)使用专用计数服务(5)近似计数(牺牲…

RISC-V PMA、PMP机制深入分析

1 PMA PMA(Physical Memory Attributes),物理内存属性,顾名思义就是用来设置物理内存属性的,但这里说“设置”,并不合理,因为一般情况下各存储的属性,在芯片设计时就固定了&#xf…

【NebulaGraph】查询案例(七)

【NebulaGraph】查询案例 七 1. 查询语句12. 查询语句23. 查询语句34. 查询语句4 1. 查询语句1 GO FROM "player100" OVER * YIELD type(edge) AS link, properties($$) AS properties,tostring(src(edge)) AS src,tostring(dst(edge)) AS dst, tags($$) AS tagLi…

从“刚性扩容”到“弹性供给”:移动充电服务重构配电网边际成本

随着新能源技术的快速发展,电动汽车的普及对传统配电网提出了新的挑战。传统的“刚性扩容”模式依赖基础设施的物理扩建,不仅投资成本高,且难以应对动态变化的电力需求。在此背景下,“弹性供给”理念逐渐兴起,特别是移…

Grafana-Gauge仪表盘

仪表盘是一种单值可视化。 可让您快速直观地查看某个值落在定义的或计算出的最小和最大范围内的位置。 通过重复选项,您可以显示多个仪表盘,每个对应不同的序列、列或行。 支持的数据格式 单值 数据集中只有一个值,会生成一个显示数值的…

游戏引擎学习第313天:回到 Z 层级的工作

回顾并为今天的内容定下基调 昨天我们新增了每个元素级别的排序功能,并且采用了一种我们认为挺有意思的方法。原本计划采用一个更复杂的实现方式,但在中途实现的过程中,突然意识到其实有个更简单的做法,于是我们就改用了这个简单…

Milvus部署架构选择和Docker部署实战指南

导读:向量数据库作为AI时代的核心基础设施,Milvus凭借其强大的性能和灵活的架构设计在市场中占据重要地位。然而,许多开发者在部署Milvus时面临架构选择困惑和配置复杂性挑战,导致项目进展受阻。 本文将为您提供一套完整的Milvus部…

高效合并 Excel 表格实用工具

软件介绍 这里介绍一款用于 Excel 合并的软件。 使用反馈与工具引入 之前推荐过 Excel 合并工具,但有小伙伴反馈这些工具对于需要合并单元格的 Excel 文件不太适用,而且无法合并表头。鉴于这些问题,找到了今天要介绍的这款 Excel 合并工具…

拉取gitlab项目

一、下载nvm管理node 先下载配置好nvm,再用nvm下载node 下载链接:开始 下载nvm - nvm中文官网 情况:npm i 下载依赖缓慢,可能是node版本不对,可能node版本太高 可能得问题:使用nvm 下载低版本的node时,…

树莓派(Raspberry Pi)安装Docker教程

本章教程,主要介绍如何在树莓派上安装Docker。 一、安装步骤 # 卸载旧版本(如果有): for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg;

计算机视觉---YOLOv4

YOLOv4(You Only Look Once v4)于2020年由Alexey Bochkovskiy等人提出,是YOLO系列的重要里程碑。它在YOLOv3的基础上整合了当时最先进的计算机视觉技术,实现了检测速度与精度的显著提升。以下从主干网络、颈部网络、头部检测、训练…

在雄性小鼠自发脑网络中定位记忆巩固的因果中枢

目录 简要总结 摘要 1 引言 2 方法 3 结果 简要总结 这篇文章主要研究了雄性小鼠在自发脑网络中记忆巩固的因果中枢定位。记忆巩固涉及学习后休息和睡眠期间全脑网络的自发重组,但具体机制尚不清楚。目前理论认为海马体在这一过程中至关重要,但其他…

刷机维修进阶教程-----没有开启usb调试 如何在锁定机型的拨号界面特殊手段来开启ADB

有时候我们会遇到一些机型被屏幕锁 账号锁等锁定。无法进入系统界面。也没有开启usb调试的情况下如何通过一些操作来开启adb调试。然后通过adb指令来禁用对应的app顺利进入系统。以此来操作保数据等操作. 通过博文了解💝💝💝 1💝💝💝----了解一些品牌机型锁定状态…

Selenium 测试框架 - Kotlin

🚀Selenium Kotlin 实践指南:以百度搜索为例的完整测试示例 随着测试自动化的普及,Selenium 已成为 Web 自动化测试的事实标准,而 Kotlin 凭借其简洁语法和高安全性,越来越受到开发者欢迎。本指南将通过一个完整的实战案例——在百度中执行搜索操作,来展示如何使用 Sele…

010501上传下载_反弹shell-渗透命令-基础入门-网络安全

文章目录 1 上传下载2 反弹shell命令1. 正向连接(Forward Connection)正向连接示例(nc) 2. 反向连接(Reverse Connection)反向连接示例(反弹 Shell) 对比表格实际应用中的选择防御建…

Flask集成Selenium实现网页截图

先看效果 程序实现的功能为:截取目标网址对应的页面,并将截取后的页面图片返回到用户端,用户可自由保存该截图。 支持的url参数如下: url:目标网址(必填项),字符串类型&#xff0c…

知识图谱:AI时代语义认知的底层重构逻辑

在生成式人工智能(GEO)的技术架构中,知识图谱已从辅助性工具演变为驱动机器认知的核心神经中枢。它通过结构化语义网络的重构,正在突破传统数据处理的线性逻辑,建立机器对复杂业务场景的深度理解能力。 一、语义解构&a…

QGIS新手教程2:线图层与多边形图层基础操作指南(点线互转、中心点提取与WKT导出)

QGIS新手教程:线图层与多边形图层基础操作指南(点线互转、中心点提取与WKT导出) 目录 QGIS新手教程:线图层与多边形图层基础操作指南(点线互转、中心点提取与WKT导出)📌 引言第一部分&#xff1…