以Streamable HTTP方式訪問mcp server的過程

一、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;介紹一些常見問題的…