從零開始編寫 Mcp Server, 發佈上線,超簡單全網最細
MCP 簡單來說就是 AI 大模型的標準化工具箱。在我們之前的很多期視頻裏面,只是討論瞭如何使用別人已經編寫好的 MCP Server,對接到 AI 客戶端裏面,實現各種智能體與工作流。
本期視頻我們轉換到開發者的角度,超簡單,幾分鐘之內編寫一個 MCP Server,並且把它發佈上線,提供給所有人去使用。
本期視頻內容較多,並且十分硬核,可以幫助我們從開發者的角度更加深入理解 MCP 協議。在爬爬蝦的這期視頻裏面,對 MCP 協議有過詳細介紹了,這裏我們簡單總結一下。
概念與準備工作
MCP 全稱是模型上下文協議,MCP 服務或者叫做 MCP Server,作爲 AI 與外部工具的中間層,代替人類訪問並且操作外部工具。MCP Server 本質上就是一段 Nodejs 或者 Python 程序,大模型通過操作系統的 STDIO,也就是標準輸入輸出通道,或者 SSE 協議調用某個 MCP Server。
消息格式是類似這種的,MCP Server 接收到這些消息以後,通過自己的代碼功能或者使用 API 請求,訪問外部工具並且完成任務。MCP Server 本質上就是一段 Python 或者 nodejs 程序,編寫一個 MCP Server,也就是編寫這段程序。
我們來到 MCP 在 GitHub 上面的官方倉庫,就是這個地址。
MCP Github 首頁:
https://github.com/modelcontextprotocol
這裏有兩個 SDK,Python 還有 Typescript SDK。SDK 也就是開發工具包,本期視頻我們主要以 Python 的 SDK 爲例,演示下創建一個 MCP Server。
我們點擊 Python SDK,在安裝這一部分,MCP 推薦使用 uv 去管理 Python 項目。我們點擊這個鏈接,uv 是目前熱度最高的 Python 環境管理工具。我們準備工作的第一步,就是把 uv 安裝一下。
在 UV 的官網,點擊 installation,找到對應系統的安裝命令。
UV 安裝:
https://docs.astral.sh/uv/getting-started/installation/
我是 Windows 系統的,我就執行這個命令。我把這個命令複製一下,注意這是一個 Powershell 的命令。在桌面右鍵在終端打開,我們打開一個 Powershell 的命令行窗口,把命令粘貼進來,回車執行。
UV 安裝成功以後,我們可以來查看一下電腦上已經安裝過的 Python 版本,輸入這個命令:
**uv python list **
這裏列出的是電腦上的 Python 版本還有它的安裝路徑。
我現在想把這個 3.13 的版本安裝一下,執行這個命令
uv python install 3.13
創建 MCP 項目
我新建了一個文件夾叫 mcp_server,我準備在這裏面創建我們第一個 MCP Server。我在 Powershell 這邊使用 CD 命令,先切換到我們剛纔創建的文件夾,
然後執行
uv init . -p 3.13
就是把當前這個文件夾初始化成一個 Python 工程,Python 版本是 3.13。
接下來我們把 MCP 的 SDK 安裝一下,執行這個命令
uv add "mcp[cli]"
這個命令就是把 MCP 的 SDK 也就是開發工具包安裝上
接下來我們找一個 IDE 打開我們剛纔新創建的文件夾,這裏我使用 vs code。使用 vs code 編寫 Python 程序。我們需要在左側的 extension 裏面搜索 Python,然後把 Python debugger 跟 Python 這兩個插件安裝一下。
接下來我們使用 vs code 打開剛纔創建的文件夾,就是這個 MCP Server 的文件夾。我們看到 UV 已經幫我們配置好了開發環境:
-
.venv 文件夾是 Python 的虛擬環境
-
pyproject 文件定義了項目的基本信息
-
main.py 文件是一個基礎的代碼樣例
編寫 MCP Server
接下來開始編寫 MCP Server,然後我們來到 Python SDK 這邊,前面幾步已經完成了,下面需要做的是把代碼拷貝進來。我把代碼複製一下。
# server.py
from mcp.server.fastmcp import FastMCP
# Create an MCP server
mcp = FastMCP("Demo")
# Add an addition tool
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + b
# Add a dynamic greeting resource
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""Get a personalized greeting"""
return f"Hello, {name}!"
前兩行的寫法是固定的:在 MCP 包裏面導入 FastMCP,然後使用 FastMCP 初始化 MCP 對象。接下來這一句
@mcp.tool()
是 Python 裏面的裝飾器,用來給下面這個函數增加功能,在這裏表示聲明下面這個函數是一個 MCP 工具。
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + b
這裏有幾個關鍵點:
-
這個 """Add two numbers""" 註釋是必須要寫的,這個註釋的意思是使用自然語言告訴 AI 大模型這個函數的功能是什麼。在這個例子裏面,就是把兩個數字加起來。AI 大模型拿到這個 MCP Server 以後,他就知道我有一個工具,這個工具可以幫助我精確的計算加法。在這個例子裏面,代碼非常的簡單,當然,我們也可以把一些很複雜的功能放到這裏面,形成一些很有用的工具。
-
第二個關鍵點是這裏的類型修飾符 add(a: int, b: int) -> int:。在這個函數里面接收兩個 int 變量,然後返回一個 int 值。這個類型修飾符是一定要寫的,它有助於幫助大模型理解工具的傳參是什麼類型的,可以幫助大模型更精準的調用 MCP 工具。
我們看到修飾符有兩種:mcp.tool 還有 mcp.resource:
-
mcp.tool 聲明瞭這是一個工具,類似於 Http Rest API 裏面的 post 方法。大模型使用工具與外部系統進行交互,通常會產生副作用,比如寫入文件,發送郵件,還有寫數據庫等等。
-
下面的 resource 類似於 HTTP 裏面的 get 方法,通常 resource 爲大模型提供只讀數據,resource 只是請求數據,但不會產生任何副作用,有點像 rest API 裏面的 get 方法。
一個 MCP Server 的代碼就這麼多,最後我們再加兩句話,讓它可以變成一個可以獨立運行的程序。我們就加上這一句 mcp.run(),括號裏面是協議,這裏我們先使用最簡單的 STDIO 協議。
完整代碼:
# server.py
from mcp.server.fastmcp import FastMCP
# Create an MCP server
mcp = FastMCP("Demo")
# Add an addition tool
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + b
# Add a dynamic greeting resource
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""Get a personalized greeting"""
return f"Hello, {name}!"
if __name__ == "__main__":
mcp.run(transport='stdio')
我們找一個 AI 客戶端來試一下剛纔編寫好的程序。這裏我使用的 AI 客戶端是 Cherry studio,爬爬蝦之前有一期完整視頻介紹使用 Cherry studio 接入 MCP Server。
我們先進入設置,找到 MCP 服務器,右上角如果有一個紅色的歎號,我們需要先把 UV 跟 Bun 安裝一下,Cherry Studio 使用的是它內置的 UV 還有 Bun。
這裏的協議選擇 stdio,注意命令這裏寫 uv,不要寫錯了。下面的參數都是固定的:
填好以後點擊保存,這裏打上一個綠燈,就配置成功了。
我們來試一下,我們選擇一個 AI 模型,這裏我用的 Gemini 2.5 Flash。爬爬蝦之前有一期視頻介紹把 Gemini 接入 Cherry studio。
在 MCP 服務器這裏,找到我們剛纔添加的那個,
我們來試一下它的加法。這裏看到它調用了 MCP,正確的傳遞了參數,並且拿到了結果,最後完成了輸出。
除了使用 Cherry Studio,接下來我們換一個 AI 客戶端,這裏我準備使用 cursor。我們先打開 cursor,找到右上角的設置 MCP,點擊添加,cursor 這邊需要編寫 Json 文件。
我們來到 Cherry studio,找到設置還是 MCP,找到這個編輯按鈕,我們把這個配置文件整個複製出來,然後粘貼到 cursor 裏面。保存一下,這裏打上一個綠燈,就配置成功了。
使用 SSE 協議
接下來我們進入第二部分,使用 SSE 協議。接下來,我們把這個 MCP Server 改成 SSE 協議的,改成 SSE 協議非常的簡單,只需要在代碼裏的最後一行,把 STDIO 改成 SSE。
if __name__ == "__main__":
mcp.run(transport='sse')
改成 SSE,我們需要服務端這邊把它啓動起來,右上角點擊這個啓動按鈕,我們啓動起來以後,把這個監聽的地址複製一下,
回到 Cherry studio 的設置,找到我們的 MCP,這次把類型從 stdio 改成 SSE。接下來填寫一個 URL,我們填寫剛纔複製的 Server 端的地址,後面加 / sse。好,這樣完成,我們保存一下,回到聊天界面。
我們再試一下,在下面把 MCP 服務器選中,詢問 AI 一個問題,它成功調用了 MCP Server 並且給出了結果。我們回到 vs code 這邊,可以看到這些遠程的調用記錄,這樣證明了實際的代碼執行是在 vs code 這邊,AI 客戶端通過 SSE 協議遠程調用了這個方法,並且拿到了結果。
STDIO vs SSE
總結一下 SSE 與 STDIO 的區別:
-
STDIO 協議一般是客戶端把 MCP Server 也就是這個 Python 程序下載到本機並且本機運行,AI 客戶端與 MCP Server 使用 STDIO 也就是操作系統的標準輸入輸出通道進行交互。使用 STDIO 協議,AI 客戶端與 MCP Server 的距離更近一些。
-
SSE 協議則是把 MCP Server 也就是這個 Python 程序單獨部署,AI 客戶端與 MCP Server 使用 SSE 協議進行遠程調用。使用 SSE 協議,AI 客戶端與 MCP Server 的距離更遠一些。
除了 SSE 協議,MCP Server 目前還支持另外一種是 streamable-http,這個跟 SSE 功能非常像,也是遠程調用。
我們把協議類型改成 streamable-http,啓動起來,
if __name__ == "__main__":
mcp.run(transport='streamable-http')
然後客戶端也需要相應的改動。我們來到客戶端,這裏的類型選擇 streamable-http,URL 末尾從 sse 改成 mcp,最後點擊保存,這樣同樣的可以配置成功。
我們再來試一下,同樣的完成了調用,最終結果也是正確的。同樣的,我們可以把這套配置放到 cursor 上面。
cursor 有一點不同的是,需要把這裏的 baseUrl 改成 url
好,本期視頻前半段的內容我們就完成了。我們介紹瞭如何在本地編寫一個 MCP Server,並且在本地的 AI 客戶端裏面去使用,這裏我們介紹了三種協議:STDIO,SSE 還有 streamable HTTP。
將 MCP Server 發佈到公網
下一個章節,我們把這個 MCP Server 發佈到公網上面,讓所有人都可以使用。把一個 MCP Server 發佈到公網上面有兩種方式:
-
最常見的就是把它打包成一個 Python 包,並且上傳到 Pypi 上面,其他人使用 uvx 命令就可以自動的下載到這個 Python 包,並且本地執行。
-
另外一種方式,我們就使用 SSE 協議,把我們的程序部署到一個雲服務器上面,然後暴露出來一個公網鏈接,其他人使用這個公網鏈接,就可以使用我們的 MCP Server。
方法一:發佈到 PyPI
這裏我們先看第一種方法,上傳到 Pypi 上面。這裏我新建一個文件夾,叫做 tech_shrimp_mcp_demo,因爲 Pypi 是沒有命名空間的,所以我們的測試程序最好在前面加上自己的名字,以免跟別人混淆起來。
我們在命令行切換到對應的文件夾,我們輸入
uv init . --package -p 3.13
把這個文件夾初始化一下,後面加 --package 表示初始化的時候把它初始化成一個 Python 包,然後指定 Python 版本 3.13。
接下來還是添加 MCP 的依賴,
uv add "mcp[cli]"
好,我們再用 vs code 打開這個文件夾,這次我們要把代碼寫到這個__init__.py,看到這裏面已經有個 main 方法了,我們保留這個 main 方法,接下來把我們剛纔寫的本地的那套代碼粘貼在上面,然後把 mcp.run 寫到 main 方法裏面。這裏的協議使用 stdio。
完整代碼:
# server.py
from mcp.server.fastmcp import FastMCP
# Create an MCP server
mcp = FastMCP("Demo")
# Add an addition tool
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + b
# Add a dynamic greeting resource
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""Get a personalized greeting"""
return f"Hello, {name}!"
def main() -> None:
mcp.run(transport='stdio')
代碼就編寫完成了,我們執行這個命令打包試一下,
uv build
看到打包成功了,接下來我們把這個打好了包發佈到 Pypi 上面,提供給所有人下載使用。
首先我們需要註冊一下 Pypi,在右上角點擊 register,填寫用戶名,郵箱密碼,然後我們需要收一下驗證郵件,這裏來到我的郵箱,點擊驗證鏈接,完成驗證。
接下來點擊生成恢復碼,屏幕上一共會出現 8 組恢復碼,我們把它保存下來。接下來我們把第一組恢復碼填進去,點擊 verify,點擊添加雙重身份驗證。
然後我們去手機的軟件市場下載微軟的 Authenticator,點擊上面的加號,然後選擇個人賬戶,使用手機掃描電腦屏幕上的二維碼,然後把手機上生成的這個 6 位數的驗證碼填寫過來,這樣就完成了雙重身份驗證。
在 account setting 這裏往下找,有一個 API TOKEN,
我們點擊一下,隨便填個名字,然後範圍選擇所有項目,點擊生成,這樣就生成了一個很長的 Pypi 的 API TOKEN,我們把它複製下來保存好。
有了 TOKEN 以後,我們執行這個命令
uv publish --token pypi-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
後面就是 Pypi 網站的 TOKEN,回車,這樣就發佈成功了。
我們找到右上角自己的名字 your projects,這個就是我們剛剛上傳的 MCP Server,我們點擊 view,這就是一個功能齊全的 Python 包,當然爲了正規,最好填一個項目描述,然後我們就可以在客戶端裏面使用這個 MCP Server 了。
我們把這個包的名字複製一下,回到 Cherry studio 這邊,添加服務器 --> 快速創建,類型選擇 STDIO,命令填寫 uvx,一定不要搞錯了,下面的參數就把我們自己上傳的那個包名填寫過來,最後點擊保存。
我們可以把這個配置文件發送給任何一個小夥伴們去使用,這是我們自己發佈到公網上的 MCP Server,其他人通過這個名字就可以下載下來並且本地使用,效果非常的棒,感覺很好。
方法二:部署到公網服務器
我們來看 MCP 的另外一種發佈方式,在公網上暴露一個 SSE 的地址,然後讓其他人進行遠程調用。我們只需要把寫好的 Python 程序部署到一個公網 IP 的雲服務器上面就可以了。
這是我的一臺 Ubuntu 系統的雲服務器,我們先把 UV 安裝一下,這裏來到 UV 的官網,找到 Linux 系統的安裝命令,複製進來執行一下。UV 安裝完成以後,記得重開一下命令行窗口,
首先創建一個文件夾叫 mcp_demo,然後我們進入到這個文件夾。
這是我們本期視頻創建的第一個項目,注意這個不是打包那個,這裏需要改一下 main.py,首先要把協議改成 sse,接下來再添加一句話,
mcp.settings.host = "0.0.0.0" # 允許遠程連接
這樣可以讓我們的 Server 從遠程被訪問到。
完整代碼 main.py :
# server.py
from mcp.server.fastmcp import FastMCP
# Create an MCP server
mcp = FastMCP("Demo")
# Add an addition tool
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + b
# Add a dynamic greeting resource
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""Get a personalized greeting"""
return f"Hello, {name}!"
if __name__ == "__main__":
mcp.settings.host = "0.0.0.0" # 允許遠程連接
mcp.run(transport='sse')
接下來我們把這個代碼 main.py 直接拖到服務器對應的目錄,下面還需要把 pyproject 文件也拖進來。代碼準備好以後,我們使用 UV 來啓動,首先配置虛擬環境
uv venv
第二步安裝依賴
**uv pip install . **
就是安裝當前目錄這個項目的依賴,下一個命令就可以啓動了
uv run main.py
我們還是來到 Cherry studio,來編輯一下這個 MCP 服務器,類型選擇 SSE,URL 這裏填
http:// 服務器公網 IP:8000/sse。
總結
總結一下本期視頻,我們使用 Python SDK 從 0 到 1 創建 MCP 工具,總共介紹了 4 種場景:
-
本地使用 STDIO
-
本地使用 SSE
-
發佈 STDIO
-
發佈 SSE
Nodejs 那邊原理跟 Python 是一模一樣的,只是換了一種編程語言,本期視頻篇幅有限,我們就不展開講了。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/ODLIBzN1xEMibxNTeEC1Xw