大家好,Open WebUI 迎來重要更新,現已正式支持 MCP 工具服務器,但 MCP 工具服務器需由兼容 OpenAPI 的代理作為前端。mcpo 是一款實用代理,經測試,它能讓開發者使用 MCP 服務器命令和標準 OpenAPI 服務器工具,輕松連接工具與大語言模型(LLM)智能體及應用程序。本文將詳細介紹 mcpo 工作機制,創建、部署新的 MCP 服務器,并集成到 Open WebUI 中,挖掘 MCP 工具服務器潛力,拓展應用場景。
1.MCPO架構?
MCPO架構
MCPO 通過標準輸入 / 輸出(stdio)傳輸直接與 MCP 服務器進行交互。隨后,在和 Open WebUI 交互時,所有 MCP 通信都會轉化為 RESTful API。
2.前提條件?
本地未安裝 Ollama 的,請下載并安裝,下載地址:https://ollama.com/download 。
若本地未安裝Open WebUI,請下載并安裝,下載地址:https://github.com/open-webui/open-webui 。
安裝NodeJS和Python 3.11(Open WebUI所需)/pip,或使用uv(運行命令:curl -LsSf https://astral.sh/uv/install.sh | sh) 。安裝VS Code + Roo Code + Google Gemini 2.5 Pro(用于生成新MCP服務器代碼)。
3.配置MCPO服務器?
創建新的Python虛擬環境:
python -m venv.venv
source.venv/bin/activate
安裝MCPO服務器:
pip install mcpo
安裝MCP服務器:
從這里選擇服務器:https://github.com/modelcontextprotocol/servers 。嘗試安裝以下3個服務器:time、memory和fetch。
# 1.time mcp服務器
pip install mcp-server-time
# 2.memory mcp服務器
npm install @modelcontextprotocol/server-memory
# 3.fetch mcp服務器
pip install mcp-server-fetch
接下來,創建一個config.json
文件,這樣就可以通過單個MCPO服務器連接多個Minecraft服務器實例。
? cat config.json?
{"mcpServers": {"memory": {"command":?"npx","args": ["-y",?"@modelcontextprotocol/server-memory"]},"time": {"command":?"uvx","args": ["mcp-server-time",?"--local-timezone=America/New_York"]},"fetch": {"command":?"uvx","args": ["mcp-server-fetch"]}}
}
運行MCPO服務器:
$ uvx mcpo --config config.json --port 8001
結果日志:
? uvx mcpo --config config.json --port 8001
Starting MCP OpenAPI Proxy with config file: config.json
INFO: ? ? Started server process [1190222]
INFO: ? ? Waiting?for?application startup.
Knowledge Graph MCP Server running on stdio
此時完成MCPO服務器的設置。使用MCPO生成的文檔鏈接驗證MCP服務器:
MCPO 為 MCP 工具生成的 API 文檔
MCP服務器已啟動并運行,其中一個工具調用fetch
也正常可用。
4.配置Open WebUI工具?
接下來,要將MCPO端點作為工具添加到Open WebUI中,點擊“設置”>“工具”>“+”。然后,輸入MCPO工具的URL并點擊“保存”。
在 Open WebUI 中添加工具
要驗證工具是否已啟用,可以點擊輸入聊天窗口中[麥克風]圖標旁邊的[工具]圖標。
5.在Open WebUI中測試工具調用?
嘗試使用fetch工具,通過提問從URL檢索內容:
看到一個“Tool_endpoint_fetch_post”日志,這表明響應是通過工具調用功能生成的,確認Open WebUI對MCP工具的支持,在使用MCPO作為代理時是可行的。
接下來,進行另一項實驗:創建一個新的MCP服務器,并將其添加到MCPO中,看看會發生什么。
6.創建新MCP服務器:關稅新聞反應?
這個新MCP服務器的目的是在互聯網上搜索對最近宣布的關稅的最新反應。為簡單起見,使用DuckDuckGo作為新聞搜索引擎。
新的關稅新聞反應 MCP 服務器流程
為節省時間,使用“VS Code + Roo Code + Gemini 2.5 Pro”工具組合,通過一個需求提示快速生成MCP服務器代碼和配置。
7.生成關稅新聞反應MCP服務器代碼?
在Roo Code的代碼模式聊天窗口中輸入以下需求提示:
**項目目標:**創建一個基于Python的MCP服務器,提供一個工具,用于搜索有關2025年4月宣布的美國關稅的國際反應的近期新聞文章,同時支持stdio和SSE傳輸。**1. 業務需求:**- 服務器應允許用戶(或人工智能智能體)查詢關于不同國家對指定美國關稅反應的新聞文章。- 重點應放在檢索過去一周內發布的相關新聞上。- 服務器應進行打包,以便使用pip輕松分發和安裝。**2. 技術需求:**- **MCP服務器實現:**- 使用`mcp` Python軟件開發工具包(包名:`mcp`)進行實現。- 支持標準輸入/輸出(`stdio`)和服務器發送事件(`sse`)傳輸機制,可通過`--transport`命令行參數選擇。- 使用`mcp.server.lowlevel.Server`提供的基于裝飾器的API(`@mcp_server.list_tools`,`@mcp_server.call_tool`)。- 使用`click`進行命令行參數解析(`--transport`,`--port`)。- 使用`starlette`和`uvicorn`處理SSE傳輸的Web服務器組件。- **核心工具(`get_tariff_reaction_news`):**- **功能:** 使用DuckDuckGo搜索引擎(`duckduckgo-search`庫)在互聯網上搜索與關稅反應相關的新聞文章。- **搜索查詢構建:**- 基本查詢:“reactions to US tariffs April 2025”- 如果提供了`country`輸入:“reactions from [Country Name] to US tariffs April 2025”- 如果提供了`additional_keywords`,則追加。- **篩選:** 將搜索結果限制為過去一周內發布的新聞(在`duckduckgo-search`中使用`timelimit='w'`)。- **排名:** 默認使用DuckDuckGo的相關性/排名。- **工具模式(使用Pydantic):**- **輸入(`GetTariffReactionNewsInput`):**- `country`:`Optional[str]` - 搜索重點關注的特定國家。- `additional_keywords`:`Optional[str]` - 添加到查詢中的額外術語。- **內部輸出模型:**- `SearchResultItem`:定義單個結果的結構(`title`、`url`、`snippet`、`source`、`published_date`)。- `SearchSuccessOutput`:成功時包含`list[SearchResultItem]`。- `SearchErrorOutput`:失敗時包含`error: str`字段。- **MCP工具返回類型:** 用`@mcp_server.call_tool`裝飾的函數將返回`list[mcp.types.TextContent]`。`SearchSuccessOutput`或`SearchErrorOutput`模型將被序列化為`TextContent`塊的`text`字段。工具執行錯誤應作為標準Python異常(例如`ValueError`、`Exception`)拋出,`mcp`庫會將其格式化為MCP錯誤響應。- **依賴項:**- `mcp[cli]>=1.6.0`:用于MCP服務器/工具實現和類型定義。- `duckduckgo-search>=2025.4.1`:用于執行網絡搜索。- `pydantic>=2.11`:用于定義輸入/輸出模式和驗證。- `anyio>=4.0`:`mcp`庫通過stdio運行異步服務器所需。- `click>=8.0`:用于命令行參數解析。- `starlette>=0.27`:用于SSE傳輸的Web框架。- `uvicorn[standard]>=0.23`:用于運行Starlette應用程序。- `requests>=2.25`:(已包含但未直接使用)。- **開發環境:**- 使用Python虛擬環境(例如`venv`)管理依賴項。- 包含一個`requirements.txt`文件(通過`pip freeze`生成)。- **打包:**- 使用帶有`setuptools`構建后端的`pyproject.toml`文件,使服務器可通過`pip`安裝。- 包含一個控制臺腳本入口點(`tariff-news-server`),用于運行主CLI函數(`main_cli`)。- **代碼結構:**- 按邏輯組織代碼(例如,在`src/tariff_news_server`包中包含`schemas.py`、`tool.py`、`server.py`)。- **執行:**- **Stdio(默認):** 通過`python -m tariff_news_server.server`或`tariff-news-server`(如果已安裝)運行。在MCP設置中使用`python -m...`命令進行配置。- **SSE:** 通過`tariff-news-server --transport sse [--port <port>]`運行。在MCP設置中使用控制臺腳本命令和參數進行配置,或作為指向正確URL的遠程SSE服務器(例如`http://localhost:8000/mcp/sse`)。**3. 有用資源(原始鏈接):**- Python MCP SDK(`mcp`包):https://github.com/modelcontextprotocol/python-sdk- 示例MCP服務器:https://github.com/modelcontextprotocol/python-sdk/tree/main/examples/servers (特別是`simple-tool`提供了相關模式)。**4. 文檔:**- 生成關稅新聞MCP服務器的解決方案圖。- 生成源代碼文檔。
在VS Code的Roo Code擴展聊天窗口中輸入需求提示:
成功完成后,將生成新的關稅新聞反應MCP服務器工作代碼,并生成更新后的配置,以便在Roo Code中進行測試。
8.在Roo Code中測試MCP服務器?
可以在Roo Code的MCP服務器選項卡中驗證關稅新聞MCP服務器是否已啟用:
通過提問“mexico latest reaction on tariff?”來測試工具調用是否有效:
查看最終響應:
基于使用關稅新聞服務器檢索到的近期新聞文章,墨西哥未受到2025年4月宣布的最新一輪美國關稅的影響。以下是對此反應的總結:- 寬慰與慶祝:墨西哥為避開這些針對許多其他美國貿易伙伴的新關稅而慶祝。- 自由貿易延續:這一豁免表明,美國和墨西哥之間現有的自由貿易關系可能在這一輪關稅實施中得以存續。- 對更廣泛影響的認識:盡管墨西哥直接避開了關稅,但該國認識到,這些廣泛的關稅所造成的全球經濟不確定性仍可能對其經濟產生負面影響。從本質上講,墨西哥對避免了關稅的直接影響感到寬慰,但對全球貿易不穩定帶來的間接后果仍持謹慎態度。
9.將新MCP服務器添加到MCPO中?
使用以下命令將新的MCP服務器安裝到MCPO服務器的Python環境中:
$ git?clone?https://github.com/minyang-chen/AI-powered-Development.git
$?cd?tariff-news-server
$ pip install -e.
通過添加關稅新聞反應MCP服務器來更新MCP settings.json:
{"mcpServers": {"memory": {"command":?"npx","args": ["-y",?"@modelcontextprotocol/server-memory"]},"time": {"command":?"uvx","args": ["mcp-server-time",?"--local-timezone=America/New_York"]},"fetch": {"command":?"uvx","args": ["mcp-server-fetch"]},"tariff": {"command":?"python3","args": ["-m","tariff_news_server.server"]}}
}
啟動MCP服務器:
$ uvx mcpo --config./config.json --port 8001
檢查MCP服務器API文檔是否已啟動:
現在完成了MCPO服務器的更新,接下來更新Open WebUI。
10.將關稅新聞MCP服務器添加到Open WebUI中?
轉到“設置”/“工具”,然后點擊“+”按鈕:
在聊天窗口中檢查關稅新聞反應服務器是否已啟用:
為測試該工具進行提問,例如可以問:“What is Canada's latest reaction to tariffs?”
測試結果成功,得到了積極響應并啟動了工具調用,也可以在日志文件中驗證MCPO服務器的工具調用。
## MCPO服務器日志INFO: ? ? 127.0.0.1:33694 -?"OPTIONS /tariff/get_tariff_reaction_news HTTP/1.1"?200 OK
Calling get_tariff_reaction_news with arguments: {'country':?'Canada'}
2025-04-03 20:06:39,935 - mcp.server.lowlevel.server - INFO - Processing request of?type?CallToolRequest
2025-04-03 20:06:39,935 - __main__ - INFO - Received call_tool request?for?tool: get_tariff_reaction_news
2025-04-03 20:06:39,935 - __main__ - INFO - Parsed tool input: country='Canada'?additional_keywords=None
2025-04-03 20:06:39,935 - tariff_news_server.tool - INFO - Executing search with query:?'reactions from Canada to US tariffs'
2025-04-03 20:06:40,189 - primp - INFO - response: https://duckduckgo.com/?q=reactions+from+Canada+to+US+tariffs 200
2025-04-03 20:06:41,407 - primp - INFO - response: https://duckduckgo.com/news.js?l=wt-wt&o=json&noamp=1&q=reactions+from+Canada+to+US+tariffs&vqd=4-290943568794945560942460956578934889745&p=-2&df=w 200
2025-04-03 20:06:41,408 - tariff_news_server.tool - INFO - Found 10 results.
2025-04-03 20:06:41,408 - __main__ - INFO - Tool execution result?type: <class?'tariff_news_server.schemas.SearchSuccessOutput'>
2025-04-03 20:06:41,408 - __main__ - INFO - Tool succeeded, returning 10 results.
INFO: ? ? 127.0.0.1:33694 -?"POST /tariff/get_tariff_reaction_news HTTP/1.1"?200 OK