一、mcp server 部署

使用fastmcp框架 部署 mcp server, 以下是源代码

# 引入 fastmcp 依赖包
from fastmcp import FastMCP# 新建fastmcp实例, 名字叫做 weather
mcp = FastMCP("weather")@mcp.tool(name="weather", tags={"weather"})
def weather(city: str) -> str:"""获取制定城市的天气信息:param city: 城市名称:return:    天气信息"""print(f"正在获取 {city} 的天气信息...")return f"{city} 的天气是晴天,温度 25 度。"if __name__ == '__main__':# mcp.run(transport="stdio")mcp.run(transport="streamable-http", host="0.0.0.0", port=8000, path="/weather")

运行python文件,启动 mcp server , 以下是启动成功界面
在这里插入图片描述

二、理解mcp服务调用原理

模型上下文协议 (MCP) 为客户端-服务器连接定义了严格的生命周期,以确保适当的功能协商和状态管理。

  • 初始化 :能力协商和协议版本协议
  • 操作 :正常协议通信
  • Shutdown:正常终止连接

在这里插入图片描述

初始化

初始化阶段必须是客户端和服务器之间的第一次交互。在此阶段,客户端和服务器:

  • 建立协议版本兼容性
  • 交换和获取功能
  • 获取实现详情

客户端必须通过发送包含以下内容的 initialize 请求来启动此阶段:

  • 支持的协议版本
  • 客户端功能
  • 客户端实现信息
initialize request
{"jsonrpc": "2.0","id": 1,"method": "initialize","params": {"protocolVersion": "2025-03-26","capabilities": {"roots": {"listChanged": true},"sampling": {}},"clientInfo": {"name": "ExampleClient","version": "1.0.0"}}
}

initialize 请求不可以作为 JSON-RPC 的一部分 batch,因为在初始化完成之前,其他请求和通知是不可能的。这还允许向后兼容未明确支持 JSON-RPC 批处理的先前协议版本。

服务器必须使用自己的功能和信息进行响应:

{"jsonrpc": "2.0","id": 1,"result": {"protocolVersion": "2025-03-26","capabilities": {"logging": {},"prompts": {"listChanged": true},"resources": {"subscribe": true,"listChanged": true},"tools": {"listChanged": true}},"serverInfo": {"name": "ExampleServer","version": "1.0.0"},"instructions": "Optional instructions for the client"}
}

成功初始化后,客户端必须发送初始化通知,以指示它已准备好开始正常作:

initialize notifications
{"jsonrpc": "2.0","method": "notifications/initialized"
}

注意:

客户端 一定不能 在 服务器 响应 initialize 请求之前发送 ping 以外的请求。

服务器在接收初始化通知之前不应发送 ping 和 logging 以外的请求。

版本协商

在 initialize 请求中,客户端必须发送它支持的协议版本。这应该是客户端支持的最新版本 。
如果服务器支持请求的协议版本,则它必须使用相同的版本进行响应。否则,服务器必须使用它支持的另一个协议版本进行响应。这应该是服务器支持的最新版本 。

如果客户端不支持服务器响应中的版本,则它应该 断开。

能力协商

客户端和服务器功能确定在会话期间哪些可选协议功能将可用。
主要功能包括:

  • roots: 提供文件系统 root 能力
  • sampling: 支持 LLM采样请求
  • experimental: 描述对非标准实验性功能的支持
  • prompts: 提供提示模板
  • resources: 提供可读资源
  • tools: 公开可调用工具
  • logging: 发出结构化日志消息
  • completions: 支持参数自动补全
  • experimental: 描述对非标准实验性功能的支持
  • subscribe:支持订阅单个项目的更改(仅限资源)

功能对象可以描述子功能,例如:
listChanged:支持列表更改通知(用于提示、资源和工具)
subscribe:支持订阅单个项目的更改(仅限资源)

Operation

在操作阶段,客户端和服务端根据协商的能力进行消息交换。
双方都应该 :

  • 遵循协商的协议版本
  • 仅使用已成功协商的功能

Shutdown

在 shutdown 阶段,一端(通常是 client)干净地终止协议连接。没有定义特定的关闭消息,而是使用底层传输机制来发出连接终止信号:

stdio

对于 stdio 传输 ,客户端应通过以下方式启动关闭:

  • 首先,关闭子进程(服务器)的输入流
  • 等待服务器退出,如果服务器未在合理时间内退出,则发送 SIGTERM
  • 如果服务器在 SIGTERM 之后的合理时间内未退出,则发送 SIGKILL

服务器可以通过关闭其对 Client 端的输出流并退出来启动关闭。

HTTP 协议

对于 HTTP 传输 ,通过关闭关联的 HTTP 连接来指示关闭。

Timeouts

实现应为所有发送的请求建立超时,以防止连接挂起和资源耗尽。当请求在超时期限内未收到成功或错误响应时,发送者应针对该请求发出取消通知并停止等待响应。

SDK 和其他中间件应允许按请求配置这些超时。

实现可以选择在收到与请求相对应的进度通知时重置超时时钟,因为这意味着工作实际上正在进行。但是,无论进度通知如何,实现都应始终强制执行最大超时,以限制行为异常的客户端或服务器的影响。

Error Handling

实现应该准备好处理这些错误情况:

  • 协议版本不匹配
  • 无法协商所需的功能
  • 请求超时

初始化错误示例:

{"jsonrpc": "2.0","id": 1,"error": {"code": -32602,"message": "Unsupported protocol version","data": {"supported": ["2024-11-05"],"requested": "1.0.0"}}
}

三、请求案例

1. 首先发送初始化请求

调用工具之前, 首先需要初始化连接:

  • 新增请求头: Accept: application/json, text/event-stream
  • 构建请求体
{"jsonrpc": "2.0","method": "initialize","params": {"protocolVersion": "2025-07-17","capabilities": {},"clientInfo": {"name": "example-client","version": "1.0.0"}},"id": 0
}
  • 请求测试
    在这里插入图片描述
    从相应头中,可以拿到 mcp-session-id:
    在这里插入图片描述

2. 响应初始化

  • 新增请求头: mcp-session-id:18251f0529ec4bef90da4d3ffb34b81b

  • 构建请求体:

{"jsonrpc": "2.0","method": "notifications/initialized"
}

-检查响应, 服务器端返回的内容为空,正确
在这里插入图片描述

3. 在当前session下进行基本操作测试

3.1 获取可用工具列表
  • 请求体:
{"jsonrpc": "2.0","id": 1,"method": "tools/list","params": {}
}
  • 响应内容
event: message
data: {"jsonrpc":"2.0","id":1,"result":{"tools":[{"name":"weather","description":"获取制定城市的天气信息\n:param city: 城市名称\n:return:    天气信息","inputSchema":{"properties":{"city":{"title":"City","type":"string"}},"required":["city"],"type":"object"},"outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"_WrappedResult","type":"object","x-fastmcp-wrap-result":true}}]}}
3.2 调用工具
  • 请求体:
{"jsonrpc": "2.0","id": 2,"method": "tools/call","params": {"name": "weather","arguments": {"city": "深圳"}}
}
}
  • 响应内容
event: message
data: {"jsonrpc":"2.0","id":2,"result":{"content":[{"type":"text","text":"深圳 的天气是晴天,温度 25 度。"}],"structuredContent":{"result":"深圳 的天气是晴天,温度 25 度。"},"isError":false}}

常见错误

1. Not Acceptable: Client must accept both application/json and text/event-stream

报错信息
{"jsonrpc": "2.0","id": "server-error","error": {"code": -32600,"message": "Not Acceptable: Client must accept both application/json and text/event-stream"}
}
原因

客户端请求头没有支持 application/json 和 text/event-stream

解决

新增请求头: Accept: application/json, text/event-stream
在这里插入图片描述

2. Bad Request: Missing session ID

报错信息

{
“jsonrpc”: “2.0”,
“id”: “server-error”,
“error”: {
“code”: -32600,
“message”: “Bad Request: Missing session ID”
}
}

原因

客户端请求头没有 session id

解决

请求头新增字段:mcp-session-id , 这个 session id 需要 请求 初始化方法, 从相应头中获取

在这里插入图片描述

3. Invalid request parameters

报错信息
event: message
data: {"jsonrpc":"2.0","id":1,"error":{"code":-32602,"message":"Invalid request parameters","data":""}}
原因

没有 调用相应初始化方法

解决

请求响应初始化方法

  • 构建请求体:
{"jsonrpc": "2.0","method": "notifications/initialized"
}

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

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

相关文章

二次元 IP 虚拟数字人宣传:漫画角色动态直播与衍生周边预售联动

当漫画角色从静态画稿中走出,以动态直播的形式与粉丝实时互动,再顺势开启衍生周边预售 —— 虚拟数字人技术正重塑二次元 IP 的宣传逻辑。这种 “动态直播 周边预售” 的联动模式,不仅打破了次元壁,更让 IP 热度高效转化为商业价…

如何在服务器上获取Linux目录大小

目前我在管理一台hostease的服务器时遇到服务器磁盘空间不足的情况。随着在系统中添加更多文件,这些系统文件目录也变得越来越大。过大的目录也消耗了系统资源,导致系统运行缓慢。后来我通过下列的方法对服务器上的磁盘空间使用进行了逐一检查。在这篇综…

来伊份养馋记社区零售 4.0 上海首店落沪:重构 “家门口” 的生活服务生态

7 月 19 日,来伊份与养馋记战略合作的首个 “社区零售 4.0” 门店在上海松江泗泾镇泗宝路正式开业。这不仅是双方自今年 1 月达成战略合作后的实质性落地,更是 3 月 “社区生活新生态” 构想的首次规模化实践,标志着零食行业巨头与社区零售新…

从C++开始的编程生活(3)——引用类型、内联inline和nullptr

前言 本系列文章承接C语言的学习,需要有C语言的基础才能学会哦~ 第3篇主要讲的是有关于C的引用类型、内联inline和nullptr。 C才起步,都很简单呢! 目录 前言 引用类型 基本语法 特性 应用 const引用 基本语法 引用与指针的关系 内联…

makefile-- 其他函数

fuctionsjoin​$(join <list1>,<list2>)连接函数把list2 中单词对应的添加到list1 的后面若list1 的单词个数> list2 &#xff0c;多出的list1 保持不变若list2 的单词个数> list21&#xff0c;多出的list2 添加到list1 后面foreach​$(foreach <var>…

【unity实战】使用unity的Navigation+LineRenderer实现一个3D人物寻路提前指示预测移动轨迹的效果,并可以适配不同的地形

文章目录 前言 实战 1、实现要点 1.1 NavMesh.CalculatePath方法计算两个点之间的导航路径 1.2 寻找投射的地面点 2、代码实现如下 3、烘培地面导航网格 4、添加导航玩家代理,并挂载前面的脚本 5、创建Line Renderer,并放在角色下面作为子物体 6、运行游戏查看效果 专栏推荐 …

宝塔申请证书错误,提示 module ‘OpenSSL.crypto‘ has no attribute ‘sign‘

遇到"module OpenSSL.crypto has no attribute sign"错误时&#xff0c;通常是由于pyOpenSSL版本兼容性问题导致的‌。以下是解决方案&#xff1a;通过SSH连接到服务器&#xff0c;执行以下命令安装指定版本的pyOpenSSL&#xff1a;btpip install pyOpenSSL24.2.1-U然…

【ffmpeg源码学习】详解pkg-config的作用

文章目录 前言 一、什么是pkg-config? 二、为什么需要 pkg-config? 三、pkg-config 的工作原理 3.1 .pc 文件 3.2 查询流程 3.3 查找路径 四、pkg-config 在 FFmpeg 中的作用 五、pkg-config 的常用命令 六、在项目中的实际用法 6.1 makefile示例: 6.2 cmake示例: 6.3 gcc命…

PHPStorm携手ThinkPHP8:开启高效开发之旅

目录一、前期准备1.1 开发环境搭建1.2 配置 Xdebug二、PHPStorm 集成 ThinkPHP82.1 导入 ThinkPHP8 项目2.2 配置 PHP 解释器2.3 配置服务器三、ThinkPHP8 项目开发基础3.1 项目结构剖析3.2 控制器与方法创建3.3 视图渲染与数据传递四、数据库操作与模型定义4.1 数据库配置4.2 …

HTTP性能优化实战技术详解(2025)

HTTP性能优化实战技术详解本文基于提供的文章大纲&#xff0c;对HTTP性能优化进行扩展说明。文章结构清晰&#xff0c;从理解瓶颈到具体优化策略&#xff0c;再到监控与高级技巧&#xff0c;逐步展开。每个部分包括背景介绍、核心原理、实施步骤、示例或工具推荐&#xff0c;确…

探索文件系统:软硬链接的奥秘

目录 1.文件系统 1.1 磁盘物理存储结构 1.2 磁盘逻辑存储结构 1.3 inode编号 2. 软硬链接 2.1 软链接 2.2 硬链接 2.3 目录文件的软硬链接 1.文件系统 在一台电脑中&#xff0c;大部分文件都不是被打开的&#xff0c;这些文件都在磁盘中进行保存。已经打开的文件需要管…

3x3矩阵教程

3x3矩阵教程 1. 简介 三维矩阵是线性代数中的重要概念&#xff0c;用于表示三维空间中的线性变换。本教程将介绍如何使用C实现三维矩阵的基本运算和变换。 2. 代码实现 2.1 头文件 (matrix3x3.h) #ifndef MATRIX3X3_H #define MATRIX3X3_H#include <array> #include <…

深度学习前置知识

文章目录介绍数据操作张量张量的定义1. **张量的维度&#xff08;Rank&#xff09;**2. **张量的形状&#xff08;Shape&#xff09;**简单的数据预处理&#xff08;插值线性代数微积分概率论1. 基本概念(1) 随机试验与事件(2) 概率公理&#xff08;Kolmogorov公理&#xff09;…

XSS学习总结

一.XSS概述 跨站脚本攻击&#xff08;Cross-Site Scripting&#xff0c;XSS&#xff09;是一种常见的网络安全漏洞&#xff0c;攻击者通过在网页上注入恶意脚本代码&#xff0c;从而在用户的浏览器上执行恶意操作。这些脚本可以是 JavaScript、HTML 或其他网页脚本语言。一旦用…

计算机网络中:传输层和网络层之间是如何配合的

可以把网络层和传输层想成一个“快递系统”&#xff1a; 网络层&#xff08;IP 层&#xff09; 邮政系统&#xff1a;只负责把“包裹”&#xff08;IP 数据报&#xff09;从 A 地搬到 B 地&#xff0c;不保证顺序、不保证不丢、不保证不重复。传输层&#xff08;TCP/UDP 层&am…

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 用户登录实现

大家好&#xff0c;我是java1234_小锋老师&#xff0c;最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程&#xff0c;持续更新中&#xff0c;计划月底更新完&#xff0c;感谢支持。今天讲解用户登录实现 视频在线地址&#xff1a; …

Redis主从复制数据同步实现原理详细介绍

文章目录一、主从复制的概念二、全量复制&#xff08;完整重同步&#xff09;三、增量复制&#xff08;部分重同步&#xff09;1. 增量复制的核心思想2. 增量复制的实现3. 复制偏移量&#xff08;replicationoffset&#xff09;4. 复制积压缓冲区&#xff08;replicationbacklo…

docker 软件bug 误导他人 笔记

DockerDesktopInstaller.exe install --installation-dirX:\AI-AI\docker\pro\ 由于 Docker官方随便修改安装命令&#xff0c;这个在4.4一下是无法使用的&#xff0c;存在误导他人

Python 进阶(六): Word 基本操作

目录 1. 概述2. 写入 2.1 标题2.2 段落2.3 表格2.4 图片2.5 样式 3. 读取 1. 概述 Word 是一个十分常用的文字处理工具&#xff0c;通常我们都是手动来操作它&#xff0c;本节我们来看一下如何通过 Python 来操作。 Python 提供了 python-docx 库&#xff0c;该库就是为 Wo…

OpenLayers 入门指南【三】:API概要

目录一、官方文档二、核心类三、总结一、官方文档 首页右侧有四个栏目分别是 Docs(文档):也可以理解为使用指南&#xff0c;涵盖一下四个模块 Quick Start(快速入门)&#xff1a;介绍如何快速引入并使用OpenLayers快速构建一个地图应用FAQ(问答)&#xff1a;介绍一些常见问题的…