如何使用 FastAPI 構建 MCP 服務器

哎呀,各位算法界的小伙伴們!今天咱們要聊聊一個超酷的話題——MCP 協議!你可能已經聽說了,Anthropic 推出了這個新玩意兒,目的是讓 AI 代理和你的應用程序之間的對話變得更順暢、更清晰。不過別擔心,為你的 Python 應用程序搭建一個這樣的服務器并不復雜,甚至可以說簡單到讓你懷疑人生!

為什么需要它?

  • 允許 AI 代理與您的應用程序集成
    想象一下,AI 就像你的私人助理,而 MCP 就是它和你家大門之間的鑰匙。

  • 將復雜性從人類開發者轉移到 AI 代理
    讓 AI 去操心那些繁瑣的邏輯吧,咱就負責躺平享受成果。

  • 簡化將 AI 連接到眾多工具和數據源的過程
    不管你是想連數據庫還是接 API,MCP 都能幫你搞定。

如果 MCP 成為下一個行業標準(已經火起來了,看起來可能性非常之大),那你只能選擇跟上潮流。畢竟,別人家的 AI 都在忙著自動集成,你總不能還手動敲代碼吧?更何況,等你看到實現它所需的代碼量時,你會覺得自己簡直是個天才!


如何做?

創建具有所需功能的 FastAPI 服務器

(如果你已經有了一個,請直接跳過此步驟)

FastAPI 的入門教程肯定比我的講解更專業,但我會盡量用接地氣的方式給你講清楚:

安裝依賴項:
pip install uvicorn, fastapi
創建一個 FastAPI 服務器:
from fastapi import FastAPIapp = FastAPI()@app.get("/")
async def root():return {"message": "MCP 超級酷"}  # 返回一條消息,告訴世界 MCP 很棒

對于應用的每個功能,編寫一個“路徑操作”——也就是分配給特定路徑的函數(比如這里的根函數位于路徑 / 下),執行 HTTP 操作(GET、POST、PUT、DELETE…)。然后用 uvicorn 運行你的應用:

uvicorn main:app --reload

搞定!你的 FastAPI 應用現在可以在 http://127.0.0.1:8000 上訪問啦。接下來,讓我們把它升級成一個真正的 MCP 服務器!

插圖


從 FastAPI 到 MCP 服務器

安裝開源工具 fastapi-mcp:

pip install fastapi-mcp ## 這行代碼價值一個億

特性

  • 直接集成 - 將 MCP 服務器直接掛載到您的 FastAPI 應用中
  • 零配置要求 - 只需將其指向您的 FastAPI 應用即可正常運行
  • 自動發現所有 FastAPI 端點并轉換為 MCP 工具
  • 保留請求模型和響應模型的架構
  • 保留所有端點的文檔,就像在 Swagger 中一樣
  • 可擴展性 - 在自動生成的工具之外添加自定義 MCP 工具

基礎用法

添加到你的 FastAPI 代碼:

from fastapi import FastAPI
from fastapi_mcp import add_mcp_server# 您的 FastAPI 應用
app = FastAPI()# 把 MCP 服務器掛載到你的應用上,就像給舞臺裝上聚光燈
add_mcp_server(app,                 # 您的 FastAPI 應用mount_path="/mcp",   # 在哪里掛載 MCP 服務器name="我的 API MCP",   # MCP 服務器的名稱
)

高級玩法

FastAPI - MCP 還有很多隱藏技能,能讓你隨心所欲地定制和控制 MCP 服務器的創建和配置,就像玩一場超級酷炫的游戲:

from fastapi import FastAPI
from fastapi_mcp import add_mcp_serverapp = FastAPI()mcp_server = add_mcp_server(app,                                    # 你的 FastAPI 應用mount_path="/mcp",                      # MCP 服務器掛載的位置name="My API MCP",                      # MCP 服務器的名字describe_all_responses=True,            # 默認是 False。就像打開一個百寶箱,把所有可能的響應模式都包含在工具描述里,而不只是成功的響應。describe_full_response_schema=True      # 默認是 False。把完整的 JSON 模式包含在工具描述里,而不只是一個對大語言模型友好的響應示例。
)# 你還可以像變魔術一樣,在現有 API 的基礎上添加自定義工具。
@mcp_server.tool()
async def get_server_time() -> str:"""獲取當前服務器時間。就像從時間老人那里偷來一點時間信息"""from datetime import datetimereturn datetime.now().isoformat()

就這樣!MCP 服務器自動生成并可在 http://127.0.0.1:8000/mcp 上訪問。這是一個可以在 Cursor(或者任何支持 SSE 的 AI 代理,據說 Cline 對 MCP 的支持也快來了)中配置的地址。


使用 MCP

通過 SSE 連接 MCP 服務器

當你的集成了 MCP 的 FastAPI 應用運行起來后,你可以用任何支持 SSE 的 MCP 客戶端連接它,比如 Cursor,就像用一把神奇的鑰匙打開寶藏大門:

  1. 啟動你的應用,就像啟動一輛超級跑車。
  2. 在 Cursor -> 設置 -> MCP 里,把你的 MCP 服務器端點的 URL(比如 http://localhost:8000/mcp)作為 SSE 地址,就像給跑車設置目的地。
  3. Cursor 會像一個聰明的小偵探,自動發現所有可用的工具和資源。

通過 mcp - proxy stdio 連接 MCP 服務器

要是你的 MCP 客戶端不支持 SSE,比如 Claude Desktop,也別擔心,我們有辦法:

  1. 啟動你的應用,讓它像個活力滿滿的小機器人一樣跑起來。
  2. 安裝 mcp - proxy,比如:uv tool install mcp-proxy,就像給小機器人裝上一個新的配件。
  3. 在 Claude Desktop 的 MCP 配置文件 (claude_desktop_config.json) 里添加以下內容:
Windows 系統
{"mcpServers": {"my-api-mcp-proxy": {"command": "mcp-proxy","args": ["http://127.0.0.1:8000/mcp"]}}
}
MacOS 系統
{"mcpServers": {"my-api-mcp-proxy": {"command": "/Full/Path/To/Your/Executable/mcp-proxy","args": ["http://127.0.0.1:8000/mcp"]}}
}

在終端里運行 which mcp - proxy 就能找到 mcp - proxy 的路徑,就像在迷宮里找到正確的路。


接下來是什么?

一旦設置完成,AI 代理現在可以通過標準化協議與你的應用程序交互了!你可以通過添加更多端點來擴展你的 MCP 服務器,暴露應用程序的不同功能。

記住,MCP 的目標是讓集成變得簡單——所以千萬別搞得太復雜!從基本功能開始,根據需要逐步擴展。

使用 FastAPI 和 fastapi-mcp 庫的好處在于,你保留了 FastAPI 的所有優勢(比如自動文檔和類型驗證),同時通過最少的額外代碼添加了 MCP 功能。

如果你嘗試了,請告訴我,并別忘了給 fastapi-mcp倉庫加星哦!🌟


好了,今天的任務完成啦!希望這篇幽默風趣的翻譯能讓你輕松掌握如何用 FastAPI 構建 MCP 服務器。要是你覺得有用,記得給我點個贊哈!否則……嗯,你的工作可能就像氣球一樣飛走咯,說不定連你的家人都得跟著緊張一下下呢!😄

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

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

相關文章

【Git】-- 處理 Git 提交到錯誤分支的問題

如果你不小心把本應提交到 test 分支的代碼提交到了 master 分支(但尚未 push),可以按照以下步驟解決: 方法一(推薦):使用 git reset 和 git stash 首先,確保你在 master 分支&…

通用目標檢測技術選型分析報告--截止2025年4月

前言 本文撰寫了一份關于通用目標檢測(General Object Detection)的技術選型分析報告,覆蓋2000至2025年技術演進歷程,重點納入YOLO-World、RT-DETR、Grounding DINO等2024-2025年的最新模型。 報告將包括技術定義、行業現狀、技…

鏈路追蹤Skywalking

一、什么是Skywalking 分布式鏈路追蹤的一種方式:Spring Cloud SleuthZipKin,這種方案目前也是有很多企業在用,但是作為程序員要的追逐一些新奇的技術,Skywalking作為后起之秀也是值得大家去學習的。 Skywalking是一個優秀的國產…

websocket獲取客服端真實ip

在websocket建立連接時,獲取訪問客戶端的真實ip 1. websocket建立連接過程 2. pom依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>3. 添加配置,握…

NSSCTF(MISC)—[justCTF 2020]pdf

相應的做題地址&#xff1a;https://www.nssctf.cn/problem/920 binwalk分離 解壓文件2AE59A.zip mutool 得到一張圖片 B5F31內容 B5FFD內容 轉換成圖片 justCTF{BytesAreNotRealWakeUpSheeple}

部分國產服務器CPU及內存性能測試情況

近日對部分國產服務器進行了CPU和內存的性能測試&#xff0c; 服務器包括華錕振宇、新華三和中興三家&#xff0c;CPU包括鯤鵬、海光和Intel&#xff0c;初步測試結果如下&#xff1a; 服務器廠商四川華錕振宇新華三中興中興服務器HuaKun TG225 B1R4930 G5R5930 G2R5300 G4操作…

【無標題】Scala函數基礎

函數和方法的區別 1&#xff09; 核心概念 &#xff08;1&#xff09; 為完成某一功能的程序語句的集合&#xff0c;稱為函數。 &#xff08;2&#xff09; 類中的函數稱之方法。 2&#xff09; 案例實操 &#xff08;1&#xff09; Scala 語言可以在任何的語法結構中聲明…

uniapp -- 列表垂直方向拖拽drag組件

背景 需要在小程序中實現拖拽排序功能,所以就用到了m-drag拖拽組件,在開發的過程中,發現該組件在特殊的場景下會有些問題,并對其進行了拓展。 效果 組件代碼 <template><!-- 創建一個垂直滾動視圖,類名為m-drag --><scroll

conda安裝python 遇到 pip is configured with locations that require TLS/SSL問題本質解決方案

以前寫了一篇文章&#xff0c;不過不是專門為了解決這個問題的&#xff0c;但是不能訪問pip install 不能安裝來自https 協議的包問題幾乎每次都出現&#xff0c;之前解決方案只是治標不治本 https://blog.csdn.net/wangsenling/article/details/130194456???????https…

【初階數據結構】隊列

文章目錄 目錄 一、概念與結構 二、隊列的實現 隊列的定義 1.初始化 2.入隊列 3.判斷隊列是否為空 4.出隊列 5.取隊頭數據 6.取隊尾數據 7.隊列有效個數 8.銷毀隊列 三.完整源碼 總結 一、概念與結構 概念&#xff1a;只允許在一端進行插入數據操作&#xff0c;在另一端進行刪除…

Apache Shiro 全面指南:從入門到高級應用

一、Shiro 概述與核心架構 1.1 什么是 Shiro&#xff1f; Apache Shiro 是一個強大且易用的 Java 安全框架&#xff0c;它提供了認證&#xff08;Authentication&#xff09;、授權&#xff08;Authorization&#xff09;、加密&#xff08;Cryptography&#xff09;和會話管…

es 3期 第28節-深入掌握集群組建與集群設置

#### 1.Elasticsearch是數據庫&#xff0c;不是普通的Java應用程序&#xff0c;傳統數據庫需要的硬件資源同樣需要&#xff0c;提升性能最有效的就是升級硬件。 #### 2.Elasticsearch是文檔型數據庫&#xff0c;不是關系型數據庫&#xff0c;不具備嚴格的ACID事務特性&#xff…

Android學習總結之通信篇

一、Binder跨進程通信的底層實現細節&#xff08;掛科率35%&#xff09; 高頻問題&#xff1a;“Binder如何實現一次跨進程方法調用&#xff1f;”   候選人常見錯誤&#xff1a;   僅回答“通過Binder驅動傳輸數據”&#xff0c;缺乏對內存映射和線程調度的描述混淆Binde…

數據結構C語言練習(兩個棧實現隊列)

一、引言 在數據結構的學習中&#xff0c;我們經常會遇到一些有趣的問題&#xff0c;比如如何用一種數據結構去實現另一種數據結構的功能。本文將深入探討 “用棧實現隊列” 這一經典問題&#xff0c;詳細解析解題思路、代碼實現以及每個函數的作用&#xff0c;幫助讀者更好地…

前端如何導入谷歌字體庫

#谷歌字體庫內容豐富&#xff0c;涵蓋上千種多語言支持的字體&#xff0c;學習導入谷歌字體庫來增加網站的閱讀性&#xff0c;是必不可少的一項技能# 1&#xff0c;前往谷歌字體網站 要會魔法&#xff0c;裸連很卡 2&#xff0c; 尋找心儀字體 Googles Fonts下面的filters可…

SnapdragonCamera驍龍相機源碼解析

驍龍相機是高通開發的一個測試系統攝像頭的demo&#xff0c;代碼完善&#xff0c;功能強大。可以配合Camera驅動進行功能聯調。 很多邏輯代碼在CaptureModule.java里。 CaptureModule有8000多行&#xff0c;包羅萬象。 涉及到界面顯示要結合CaptureUI.java 一起來實現。 Ca…

多線程猜數問題

題目&#xff1a;線程 A 生成隨機數&#xff0c;另外兩個線程來猜數&#xff0c;線程 A 可以告訴猜的結果是大還是小&#xff0c;兩個線程都猜對后&#xff0c;游戲結束&#xff0c;編寫代碼完成。 一、Semaphore 多個線程可以同時操作同一信號量&#xff0c;由此實現線程同步…

seq2seq

理解 transformer 中的 encoder decoder 詳細的 transformer 教程見&#xff1a;【極速版 – 大模型入門到進階】Transformer 文章目錄 &#x1f30a; Encoder: 給一排向量輸出另外一排向量&#x1f30a; Encoder vs. Decoder: multi-head attention vs. masked multi-head at…

Proxmox pct 部署ubuntu

pct 前言 PCT(Proxmox Container Tool)是 PVE 中用于管理 Linux 容器(LXC)的命令行工具。通過 PCT,用戶可以執行各種容器管理任務,例如創建新的容器、啟動和停止容器、更新容器、安裝軟件包、導出和導入容器等。PCT 提供了與 Web 界面相同的功能,但通過命令行進行操作,…

Google Play關鍵字優化:關鍵排名因素與實戰策略

如果您準備發布應用程序或開始專注于關鍵字優化&#xff0c;您可能想知道如何向Google Play上的應用程序添加關鍵字。Google Play上的搜索量和排名與App Store不同&#xff0c;而且被索引排名的關鍵字也不同。在此文中&#xff0c;我們將確定Google Play上的關鍵排名因素&#…