---
url: /blog/p478ja06/index.md
---
> 转载自https://zhuanlan.zhihu.com/p/1892965223436104450

## [Open WebUI](https://zhida.zhihu.com/search?content_id=256144106\&content_type=Article\&match_order=1\&q=Open+WebUI\&zhida_source=entity) 正式支持 MCP 工具服务器 - 只要 MCP 工具服务器通过 [OpenAPI 兼容代理](https://zhida.zhihu.com/search?content_id=256144106\&content_type=Article\&match_order=1\&q=OpenAPI+兼容代理\&zhida_source=entity)进行前端处理…

![img](../../../50_ARCHIVES/Blog_Published/2025/open-webui使用mcp.assets/v2-8062846cd8b03355585cb061901a7636_1440w.jpg)

*Open WebUI* 正式支持 *MCP 工具* 服务器 - 只要 MCP 工具服务器通过 OpenAPI 兼容代理（openapi-servers）进行前端处理 - 这是一个专门构建的代理实现，可在以下地址获取： [https://github.com/open-webui/mcpo](https://link.zhihu.com/?target=https%3A//github.com/open-webui/mcpo)。

在尝试本地设置、实验配置和测试提示后，我发现 mcpo 是一个简单的代理，允许你使用 MCP 服务器命令与标准 OpenAPI 服务器配合工作的工具。这使得将你的工具与 [LLM 代理](https://zhida.zhihu.com/search?content_id=256144106\&content_type=Article\&match_order=1\&q=LLM+代理\&zhida_source=entity)和应用程序连接变得容易。

> 在本文中，我们将首先探讨它的工作原理，然后创建一个全新的 MCP 服务器，启动它，并将其作为工具添加到 open-webui 中。

### *MCPO 架构*

![img](../../../50_ARCHIVES/Blog_Published/2025/open-webui使用mcp.assets/v2-8062846cd8b03355585cb061901a7636_1440w.jpg)

MCPO 架构

根据解决方案架构，MCPO 使用标准输入/输出（stdio）传输直接与 MCP 服务器交互。随后，在与 Open-WebUI 交互时，所有 MCP 通信都被转换为 RESTful API。

### ***先决条件***

1. 如果本地没有安装 Ollama，请下载并安装，参见：[https://ollama.com/download](https://link.zhihu.com/?target=https%3A//ollama.com/download)
2. 如果本地没有安装 open-webui，请下载并安装，参见：[https://github.com/open-webui/open-webui](https://link.zhihu.com/?target=https%3A//github.com/open-webui/open-webui)
3. NodeJS
4. Python 3.11（open-webui 要求）/ pip 或使用 uv（`curl -LsSf https://astral.sh/uv/install.sh | sh`）
5. VS Code + Roo Code + Google Gemini 2.5 Pro（可选，用于新 MCP 服务器的代码生成）

### *配置 MCPO 服务器*

* 创建新的 Python 虚拟环境

```text
$ python -m venv .venv
$ source .venv/bin/activate
```

* 安装 MCPO 服务器

```text
$ pip install mcpo
```

安装 MCP 服务器

从这里选择服务器：[https://github.com/modelcontextprotocol/servers](https://link.zhihu.com/?target=https%3A//github.com/modelcontextprotocol/servers)。现在让我们尝试安装以下 3 个服务器，它们是 time、memory 和 fetch。

```text
# 1.time mcp server
$ pip install mcp-server-time

# 2.memory mcp server
$ npm install @modelcontextprotocol/server-memory

# 3.fetch mcp server
$ pip install mcp-server-fetch
```

* 接下来，创建一个 `config.json` 文件，这样我们就可以使用单个 MCPO 服务器连接到多个 Minecraft 服务器实例。

```bash
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 服务器

```lua
uvx mcpo --config config.json --port 8001


## result log
❯ 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 服务器。

![img](../../../50_ARCHIVES/Blog_Published/2025/open-webui使用mcp.assets/v2-c9f64d07f8d98e918d07e502328e9d0b_1440w.jpg)

MCPO 为 MCP 工具生成的 API 文档

到目前为止看起来不错。MCP 服务器已经启动并运行，带有一个工具调用 fetch。

### *配置 Open-WebUI 工具*

接下来，要在 Open-WebUI 中添加 MCPO 端点作为工具，点击 **Settings > Tools > +**。然后，输入 MCPO 工具的 URL 并点击 **Save**。

请参见下面的截图：

![img](../../../50_ARCHIVES/Blog_Published/2025/open-webui使用mcp.assets/v2-829410962ec7705d60927d312dad22b7_1440w.jpg)

在 Open-WebUI 中添加工具

要验证工具是否启用，我们可以点击输入聊天窗口中的 \[tools] 图标，就在 \[mic] 图标旁边

![img](../../../50_ARCHIVES/Blog_Published/2025/open-webui使用mcp.assets/v2-5da451f036efbce89fb3dd9767e22e83_1440w.jpg)

启用工具的 Open-WebUI

### *在 Open-WebUI 中测试工具调用*

让我们尝试使用 `fetch tool` 通过提问来从 URL 检索内容。

![img](../../../50_ARCHIVES/Blog_Published/2025/open-webui使用mcp.assets/v2-9d2c98f59e99abd410478fdacb234e39_1440w.jpg)

Open-WebUI 中的工具调用

我们看到一个 `Tool_endpoint_fetch_post` 日志，这表明响应是使用工具调用功能生成的 - 这是一个强大的功能。到目前为止，一切看起来都不错。我们确认 Open-WebUI 对 MCP 工具的支持与 MCPO 作为代理一起工作。

> 接下来，让我们进行另一个实验：我们将创建一个新的 MCP 服务器并将其添加到 MCPO 中，看看会发生什么。

### *创建新的 MCP 服务器：关税新闻反应*

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

![img](../../../50_ARCHIVES/Blog_Published/2025/open-webui使用mcp.assets/v2-49c8ba1fc32122a1f2644da97c804f51_1440w.jpg)

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

你可以通过在这里下载代码来跳过这一步：`https://github.com/minyang-chen/AI-powered-Development/tree/main/tariff-news-server`

为了节省时间，我将使用 “**VS Code + Roo Code + Gemini 2.5 Pro**” 工具栈，通过单一需求提示快速生成 MCP 服务器代码和配置。如果你不熟悉使用 “VS Code + Roo Code + Gemini 2.5 Pro” 进行自主编码开发，请参见我之前的文章：

[AI 驱动的自主编码 VSCode + Roo Code + Gemini 2.5 Pro](https://link.zhihu.com/?target=https%3A//medium.com/@mychen76/ai-powered-autonomous-coding-project-new-lightrag-mcp-server-vscode-roo-code-gemini-2-5-pro-343041753654)

## AI 驱动的自主编码 VSCode + Roo Code + Gemini 2.5 Pro

### *随着大型语言模型（LLMs）变得越来越先进，像 Cursor、Dalvin、Cline、Roo Code 和 Copilot 这样的工具…*

### 生成关税新闻反应 MCP 服务器代码

在 Roo Code 聊天窗口的代码模式下输入以下需求提示。

```js
**项目目标：**
创建一个基于 Python 的 MCP 服务器，提供一个工具来搜索关于 2025 年 4 月宣布的美国关税的国际反应的最新新闻文章，支持 stdio 和 SSE 传输。

**1. 业务需求：**

*   服务器应该使用户（或 AI 代理）能够查询关于不同国家对指定美国关税的反应的新闻文章。
*   重点应该是检索最近一周内发布的相关新闻。
*   服务器应该打包以便使用 pip 轻松分发和安装。

**2. 技术要求：**

*   **MCP 服务器实现：**
    *   使用 `mcp` Python SDK（包名：`mcp`）实现。
    *   通过 `--transport` 命令行参数支持标准 I/O（`stdio`）和服务器发送事件（`sse`）传输机制。
    *   使用 `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](https://github.com/modelcontextprotocol/python-sdk)
*   示例 MCP 服务器：[https://github.com/modelcontextprotocol/python-sdk/tree/main/examples/servers](https://github.com/modelcontextprotocol/python-sdk/tree/main/examples/servers)（特别是 `simple-tool` 提供了相关模式）。

**4. 文档：**
- 为关税新闻 MCP 服务器生成解决方案图
- 为源代码生成文档
```

在 VS Code - Roo Code 扩展聊天窗口中输入需求提示。

![img](../../../50_ARCHIVES/Blog_Published/2025/open-webui使用mcp.assets/v2-30d326aa75d324f1d7288aed1203d43c_1440w.jpg)

输入需求提示

“成功完成后，将生成新的关税新闻反应 MCP 服务器工作代码，并生成更新的配置以在 Roo Code 中进行测试。”

### 在 Roo Code 中测试 MCP 服务器

我们可以在 MCP 服务器选项卡中验证 Roo Code 是否启用了关税新闻 MCP 服务器。

![img](../../../50_ARCHIVES/Blog_Published/2025/open-webui使用mcp.assets/v2-b37bbbd08efacdd1c7c7258aa7766501_1440w.jpg)

验证关税工具已启用

通过提问测试工具调用是否工作：**“墨西哥对关税的最新反应？”**

![img](../../../50_ARCHIVES/Blog_Published/2025/open-webui使用mcp.assets/v2-dfb0f268c8624ab1dc0f01c09b6d89d1_1440w.jpg)

查看最终响应。

![img](../../../50_ARCHIVES/Blog_Published/2025/open-webui使用mcp.assets/v2-c2f13b089cdcab4e9821c7dd15c093ee_1440w.jpg)

测试工具调用

```text
根据使用关税新闻服务器检索的最新新闻文章，墨西哥在 2025 年 4 月宣布的最新一轮美国关税中幸免于难。

以下是反应的摘要：

宽慰和庆祝：墨西哥庆祝躲过了这些针对许多其他美国贸易伙伴的新关税。
持续的自由贸易：这种排除表明美国和墨西哥之间现有的自由贸易关系可能会在这一轮关税实施中幸存下来。
对更广泛影响的意识：尽管直接幸免，墨西哥承认这些广泛关税造成的全球经济不确定性仍可能对其经济产生负面影响。
本质上，墨西哥对避免关税的直接影响感到宽慰，但对全球贸易不稳定带来的间接后果保持谨慎。
```

到目前为止，看起来不错。

### **将新的 MCP 服务器添加到 MCPO**

**步骤 1.** 使用以下命令将新的 MCP 服务器安装到 MCPO 服务器 Python 环境中：

```text
$ git clone https://github.com/minyang-chen/AI-powered-Development.git
$ cd tariff-news-server
$ pip install -e .
```

**步骤 2.** 通过添加关税新闻反应 MCP 服务器更新 MCP settings.json

```css
 {
  "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"];
    }
  }
}
```

**步骤 3.** 启动 MCP 服务器

```text
$ uvx mcpo --config ./config.json --port 8001
```

**步骤 4.** 检查 MCP 服务器 API 文档是否启动。

![img](../../../50_ARCHIVES/Blog_Published/2025/open-webui使用mcp.assets/v2-07b047e1fcdfae755683605a77146de8_1440w.jpg)

关税新闻 MCP 服务器文档

好的，我们已经完成了 MCPO 服务器更新。接下来更新 Open-WebUI。

### 将关税新闻 MCP 服务器添加到 Open-WebUI

**步骤 1.** 转到设置/工具，然后点击 + 按钮

![img](../../../50_ARCHIVES/Blog_Published/2025/open-webui使用mcp.assets/v2-cb635803dcc8ec7345b2447852471d3b_1440w.jpg)

将关税新闻 MCP 服务器添加为工具

**步骤 2.** 检查关税新闻反应服务器是否在聊天窗口中启用

![img](../../../50_ARCHIVES/Blog_Published/2025/open-webui使用mcp.assets/v2-41234c1db34833df57152258b3de8a13_1440w.jpg)

验证关税新闻 MCP 服务器

**步骤 3.** 要测试工具，尝试提问。例如，你可以问：’**加拿大对关税的最新反应是什么？**

![img](../../../50_ARCHIVES/Blog_Published/2025/open-webui使用mcp.assets/v2-3aef635e73e03980f5de8cf7d0cefcfd_1440w.jpg)

测试关税新闻 MCP 服务器

测试结果成功，产生了积极的响应并启动了工具调用。有关更多详细信息，请点击链接：’tool\_endpoint\_get\_tariff\_reaction\_news\_post’。你也可以在日志文件中验证 MCPO 服务器工具调用。

```yaml
## 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
```

### *最终思考*

到目前为止，我很喜欢 mcpo。特别是，它让你能够使用 API 文档开箱即用地测试 MCP 服务器。它是一个简单的代理，允许你使用 MCP 服务器命令与期望标准 OpenAPI 服务器的工具一起工作。它旨在使与 LLM 代理和应用程序的集成变得毫不费力。Mcpo 是一个有价值的工具，特别是对于现有的 Open-WebUI 用户。

### 参考资料：

关税新闻 MCP 服务器代码：[https://github.com/minyang-chen/AI-powered-Development/tree/main/tariff-news-server](https://link.zhihu.com/?target=https%3A//github.com/minyang-chen/AI-powered-Development/tree/main/tariff-news-server)

[GitHub - open-webui/mcpo: A simple, secure MCP-to-OpenAPI proxy server](https://link.zhihu.com/?target=https%3A//github.com/open-webui/mcpo)

[AI 驱动的自主编码 VSCode + Roo Code + Gemini 2.5 Pro](https://link.zhihu.com/?target=https%3A//mychen76.medium.com/ai-powered-autonomous-coding-project-new-lightrag-mcp-server-vscode-roo-code-gemini-2-5-pro-343041753654)
