FastAPI-MCP構建自定義MCP工具實操指南

一、簡介

  • ? FastAPI-MCP是一個基于python FastAPI框架開發的開源項目,可以自動識別并暴露FastAPI接口為MCP工具

  • ? 擁有FastAPI框架的所有優點,如異步高并發、獨立遠程部署、OpenAPI文檔

  • ? 提供SSE、mcp-remote接入方式,支持設置授權訪問,適配各種支持MCP協議客戶端

  • ? FastAPI-MCP開源地址:https://github.com/tadata-org/fastapi_mcp,工作原理參考下圖:

    圖片

二、安裝并啟動示例

1. 安裝fastapi-mcp

  • ? 提前準備好python 3.10+、uv/pip軟件環境(此處不做贅述)

  • ? 直接一鍵安裝

//安裝方式1: 使用uv命令
uv add fastapi-mcp
//安裝方式2:使用pip命令
pip install fastapi-mcp

2. 編寫示例代碼 fastapi-mcp.py,實現兩個測試工具

  • ? 一個獲取當前時間的接口/工具(不需要授權)

  • ? 一個模擬獲取用戶信息的/工具(需要授權)

from datetime import datetimeimport uvicorn
from fastapi import FastAPI, Depends, HTTPException, Header
from fastapi_mcp import FastApiMCPapp = FastAPI()# 授權驗證,如果不需要,可以刪除
asyncdefverify_token(authorization: str | None = Header(None)):# 這里替換為實際的驗證邏輯,比如數據庫查詢,JWT驗證等valid_tokens = {"123456", "abcdef"}  # 示例有效token集合if authorization notin valid_tokens:raise HTTPException(status_code=403, detail="Invalid Token")returnTrue# 注意:要設置添加明確的 operation_id 參數,這會讓大模型更容易理解工具的作用
# 編寫一個獲取當前時間的接口
@app.get("/getCurrentTime", operation_id="get_current_time")
asyncdefget_current_time():return {"current_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")}# 編寫一個模擬獲取用戶信息的接口
@app.get("/users/{user_id}", operation_id="get_user_info")
asyncdefget_user_info(user_id: int, is_auth: bool = Depends(verify_token)):  # 驗證請求頭,需要授權訪問# 這里的data可以替換成實際的查詢數據庫,這里只作為示例返回data = {"user_id": user_id,"name": "小狗狗","sex": "男","birthday": "2002-07-06",}return data# 創建 MCP 服務器實例,綁定到 FastAPI app
mcp = FastApiMCP(app)
# 掛載 MCP 服務器,默認路徑是 /mcp(可以修改)
mcp.mount()if __name__ == "__main__":uvicorn.run(app, host="0.0.0.0", port=8000)

3. 啟動運行測試用例

python fastapi-mcp.py 

在這里插入圖片描述

4. 啟動之后,可以直接訪問原本FastAPI提供的在線文檔、接口等

  • ? 在線 Swagger 文檔,訪問:http://localhost:8000/docs

    在這里插入圖片描述

  • ? 既是MCP工具,也是正常的API接口,如下使用 Postman 訪問示例

    在這里插入圖片描述

三、在Cherry Studio中使用FastAPI-MCP服務

下載并安裝 Cherry Studio 客戶端軟件,下載地址:https://www.cherry-ai.com/

在這里插入圖片描述

配置使用 FastAPI-MCP 啟動后提供的服務,默認MCP服務運行在:http://localhost:8000/mcp,配置如下:

  • ? Cherry Studio提供的非常方便的可視化配置界面

在這里插入圖片描述

  • ? 實際上在其他支持SSE的MCP客戶端,可以使用下面配置
{"mcpServers":{"fastapi-mcp":{"name":"fastapi-mcp","type":"sse","description":"","isActive":true,"baseUrl":"http://localhost:8000/mcp","headers":{"Content-Type":"application/json","Authorization":"123456"}}
}
  • ? 配置完成后,MCP客戶端可以自動請求獲取到相關的MCP工具了

在這里插入圖片描述

在對話中,使用fastapi-mcp工具

  • ? 開啟并選擇fastapi-mcp工具

在這里插入圖片描述

  • ? 獲取當前時間示例

在這里插入圖片描述

  • ? 獲取用戶ID為888888的用戶信息

在這里插入圖片描述

  • ? 可以自動鏈式調用多個工具,完成復雜任務:幫我看看用戶ID為888888的用戶多少歲了

在這里插入圖片描述

四、總結

  • ? FastAPI-MCP工具可以讓你開發MCP工具像開發普通接口一樣,靈活擴展、適應性強

  • ? 使用FastAPI-MCP,可以快速搭建起自己的私有MCP工具集,獨立部署、遠程訪問

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/84939.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/84939.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/84939.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LLMs之Memory:《LLMs Do Not Have Human-Like Working Memory》翻譯與解讀

LLMs之Memory:《LLMs Do Not Have Human-Like Working Memory》翻譯與解讀 導讀:該論文通過三個精心設計的實驗,證明了當前的大型語言模型(LLMs)缺乏類似人類的工作記憶。實驗結果表明,LLMs無法在沒有明確外…

Node.js驗證碼:從生成到驗證的趣味之旅

文章目錄 Node.js驗證碼:從生成到驗證的趣味之旅📜 引言:為什么需要驗證碼?1. 驗證碼的基本原理 🧠驗證碼工作流程示意圖 2. 技術棧準備 🛠?3. 驗證碼生成詳解 🎨3.1 生成SVG驗證碼3.2 轉換為P…

芯科科技攜最新Matter演示和參考應用精彩亮相Matter開放日和開發者大會

全面展示賦能Matter設備實現跨協議和跨海內外生態的技術能力 作為Matter標準創始廠商之一和其解決方案的領先供應商,Silicon Labs(亦稱“芯科科技”)于6月12至13日參加由連接標準聯盟中國成員組(CMGC)主辦的Matter年度…

AndroidStudio下載的SDK沒有tool目錄,或者想要使用uiautomatorviewer工具

1.如果沒有tool目錄可以使用下面的地址進行下載 https://dl.google.com/android/repository/tools_r25.2.5-windows.zip 2.并且把下載的文件解壓到放在AndroidStudio的目錄中 3.如果使用uiautomatorviewer.bat出現下面的錯誤 Unable to connect to adb.Check if adb is instal…

FastJSON等工具序列化特殊字符時會加轉義字符\

在Java中JSON數據格式用String接收時,此時在FastJSON層面看來該JSON只是普通字符串,所以對原字符串序列化會得到轉義字符\ 得到轉義后字符串,再反序列化轉義后字符串會得到原字符串 String json"{\"name\": \"張三\&quo…

數據結構 學習 隊列 2025年6月14日 11點22分

循環隊列 循環隊列是一種線性數據結構,它遵循FIFO(先進先出)原則,但與普通隊列不同的是,循環隊列的最后一個元素連接回第一個元素,形成一個環形結構。這種設計有效解決了普通隊列的"假溢出"問題&…

打造絲滑滾動體驗:Scroll-driven Animations 正式上線!

🌀 打造絲滑滾動體驗:Scroll-driven Animations 正式上線! 🚨 告別 JS 手動監聽滾動條,CSS 新能力讓你用兩行代碼實現高級滾動動效。 🔍 什么是 Scroll-driven Animations? Scroll-driven anim…

知識體系_研究模型_價格敏感度測試模型(PSM)

1 概述 價格敏感度測試模型(Price Sensitivity Measurement,PSM) ,通過調研潛在用戶對于不同價格的滿意或接受程度,從而制定出合適的產品價格。 價格敏感度PSM模型的分析一般分為以下幾個步驟: (1)確定多個價格 (2)通過一定的方式(通常是問卷)收集目標客戶對不同價…

C++11函數封裝器 std::function

? 1. 什么是 std::function std::function 是 C11 引入的標準庫工具,是一個通用的函數封裝器,可以包裝以下任意可調用對象: 普通函數Lambda 表達式函數指針成員函數指針函數對象(也叫仿函數,定義了 operator() 的類…

centos系統docker配置`milvus-standalone`教程

本人使用的是京東云服務器docker配置milvus 參考教程:https://blog.csdn.net/withme977/article/details/137270087 需要注意:虛擬機安裝pymilvus和docker安裝milvus版本需要對應,否則會出現connection失敗問題 查看虛擬機pymilvus版本&…

AI for 數據分析:技術演進與應用實踐

一、AI 數據分析的核心定義與技術演進 概念延伸:從傳統分析到智能分析 傳統數據分析工作,主要依賴人工使用 Excel、SPSS 等統計工具進行建模與分析。這種方式不僅效率較低,而且對專業人員的依賴度極高。而 AI 驅動的數據分析則借助機器學習…

stm32 f103c8t6仿真 串口收發測試

C8T6串口概述 STM32F103C8T6微控制器包含3個串口模塊: USART1 (高級串口) USART2 USART3 (部分型號可能標記為UART3) 引腳分布圖 USART1 (串口1) 基本特性 類型:全功能USART(通用同步異步收發器) 通信模式: 全雙工異步通信 單線半…

語言特性適用的場景:衛星、火箭控制系統用什么開發語言?

核心飛行控制系統開發語言 衛星、火箭及相關航天系統的軟件開發對可靠性、實時性、安全性有極高要求,因此語言選擇需嚴格匹配這些需求。以下是航天領域常用的編程語言及其應用場景分析: 一、核心飛行控制與嵌入式系統:C、C、Ada 航天器的核…

AI for Science:智能科技如何重塑科學研究

AI與科學研究的邂逅 人工智能(Artificial Intelligence,簡稱AI)作為一門致力于模擬人類智能的交叉學科,近年來已經從實驗室走向現實世界的各個角落,而科學研究領域正是其最具變革潛力的舞臺之一。AI的核心在于通過算法…

項目三 - 任務7:開發名片管理系統

在本次項目三的任務7中,我們成功開發了一個功能全面的名片管理系統。該系統采用Java語言,基于MVC(模型-視圖-控制器)架構模式,實現了用戶登錄、名片的增刪改查等核心功能。通過設計Card類來封裝名片信息,Ca…

MySQL 8.0 OCP 英文題庫解析(十八)

Oracle 為慶祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免費考取原價245美元的MySQL OCP 認證。 從今天開始,將英文題庫免費公布出來,并進行解析,幫助大家在一個月之內輕松通過OCP認證。 本期公布試題161~170 試題1…

leetcode_503 下一個更大元素

1. 題意 在一個循環數組中,找到下一個比它大的數。 2. 題解 也不知道怎么就單調棧了,可能是刷出來的吧。。。 還是來解釋一下吧!!! 如果有新元素入棧 c c c, 那么在棧內的元素只要小于新元素的 s s s…

在postgresql中,group by時取第一個值

在postgresql中,group by時,uuid類型的字段可以用哪個聚集函數: SELECT create_user , (array_agg(myid))[1] AS first_uuid FROM "t_resource_data" GROUP BY create_user 人大金倉、PostgreSQL使用GROUP BY聚合后,取第一個值或最后一個值的辦_pgsql gro…

【FineDance】ModuleNotFoundError: No module named ‘pytorch3d‘

pytorch3d Traceback (most recent call last): File “/home/zhangbin/perfwork/01_ai/13_FineDance/data/code/pre_motion.py”, line 12, in from dataset.quaternion import ax_to_6v, ax_from_6v File “/home/zhangbin/perfwork/01_ai/13_FineDance/dataset/quaternion.…