OpenWebUI新突破,MCPO框架解锁MCP工具新玩法

大家好,Open WebUI 迎来重要更新,现已正式支持 MCP 工具服务器,但 MCP 工具服务器需由兼容 OpenAPI 的代理作为前端。mcpo 是一款实用代理,经测试,它能让开发者使用 MCP 服务器命令和标准 OpenAPI 服务器工具,轻松连接工具与大语言模型(LLM)智能体及应用程序。本文将详细介绍 mcpo 工作机制,创建、部署新的 MCP 服务器,并集成到 Open WebUI 中,挖掘 MCP 工具服务器潜力,拓展应用场景。

1.MCPO架构 

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 文档

MCPO 为 MCP 工具生成的 API 文档

MCP服务器已启动并运行,其中一个工具调用fetch也正常可用。

4.配置Open WebUI工具 

接下来,要将MCPO端点作为工具添加到Open WebUI中,点击“设置”>“工具”>“+”。然后,输入MCPO工具的URL并点击“保存”。

在 Open WebUI 中添加工具

在 Open WebUI 中添加工具

要验证工具是否已启用,可以点击输入聊天窗口中[麦克风]图标旁边的[工具]图标。

图片

5.在Open WebUI中测试工具调用 

尝试使用fetch工具,通过提问从URL检索内容:

图片

看到一个“Tool_endpoint_fetch_post”日志,这表明响应是通过工具调用功能生成的,确认Open WebUI对MCP工具的支持,在使用MCPO作为代理时是可行的。

接下来,进行另一项实验:创建一个新的MCP服务器,并将其添加到MCPO中,看看会发生什么。

6.创建新MCP服务器:关税新闻反应 

这个新MCP服务器的目的是在互联网上搜索对最近宣布的关税的最新反应。为简单起见,使用DuckDuckGo作为新闻搜索引擎。

新的关税新闻反应 MCP 服务器流程

新的关税新闻反应 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
### 如何调用 MCP 功能 MCP 是一种用于连接客户端和服务端的协议,允许开发者通过配置服务端来调用特定的功能。以下是关于如何在 Cursor 中调用 MCP 工具以及生成结构化提示词的相关说明。 #### 配置 MCP 服务端 为了能够在 Cursor 中调用 MCP 工具,首先需要确保已正确配置了 MCP 的服务端环境。这通常涉及设置服务器地址、认证密钥以及其他必要的参数[^1]。具体操作如下: - **安装依赖库**:如果尚未完成,请先安装支持 MCP 协议所需的 Python 库或其他编程语言中的对应模块。 - **启动服务端**:运行 MCP Server 并指定其监听的 IP 和端口。例如,在命令行中可以输入以下内容以启动服务: ```bash python mcp_server.py --host=0.0.0.0 --port=8080 ``` #### 调用 MCP 工具 当服务端成功部署后,可以通过 Cursor 提供的接口发起请求并调用所需工具。此过程可能包括以下几个方面的工作流定义和数据交互逻辑[^2]: - 学习 MCP 的标准写法,理解官方 demo 的设计模式; - 构建符合规范的 JSON 或 YAML 格式的提示词作为输入传递给目标函数; 这里给出一个简单的例子展示如何创建这样的提示词模板: ```json { "tool_name": "example_tool", "parameters": { "param1": "value1", "param2": true, "nested_param": {"key":"data"} } } ``` 上述代码片段展示了向 `example_tool` 发送带有三个不同类型的参数(字符串型、布尔型及嵌套对象)的一个请求实例[^3]。 #### 结合 LangFlow 进行扩展应用 进一步地,还可以借助 Cline 开发无代码版本的 MCP Server 来集成更多复杂场景下的需求处理能力,比如基于大模型驱动的知识检索系统——LangFlow 就是一个不错的选择。它能够帮助用户快速搭建起具备自然语言查询解析功能的应用程序界面(UI),从而极大简化前端用户体验的同时也提高了后台运算效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

python慕遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值