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

news2025/5/20 8:51:24

大家好,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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2378804.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TRTC实时对话式AI解决方案,助力人机语音交互极致体验

近年来&#xff0c;AI热度持续攀升&#xff0c;无论是融资规模还是用户热度都大幅增长。2023 年&#xff0c;中国 AI 行业融资规模达2631亿人民币&#xff0c;较2022年上升51%&#xff1b;2024年第二季度&#xff0c;全球 AI 初创企业融资规模为 240 亿美金&#xff0c;较第一季…

Linux安全篇 --firewalld

一、Firewalld 防火墙概述 1、Firewalld 简介 firewalld 的作用是为包过滤机制提供匹配规则(或称为策略)&#xff0c;通过各种不同的规则告诉netfilter 对来自指定源、前往指定目的或具有某些协议特征的数据包采取何种处理方式为了更加方便地组织和管理防火墙,firewalld 提供…

系分论文《论系统需求分析方法及应用》

系统分析师论文范文系列 【摘要】 2022年6月&#xff0c;我作为系统分析师参与了某金融机构“智能信贷风控系统”的建设项目。该系统旨在通过对业务流程的数字化重构&#xff0c;优化信贷审批效率并降低风险。项目涉及信贷申请、资质审核、风险评估、额度审批等核心流程&#x…

LIIGO ❤️ RUST: 12 YEARS

LIIGO &#x1f496; RUST: 12 YEARS 今天是RUST语言1.0发布十周年纪念日。十年前的今天&#xff0c;2015年的今天&#xff0c;Rust 1.0 正式发行。这是值得全球Rust支持者隆重纪念的日子。我借此机会衷心感谢Rust语言创始人Graydon Hoare&#xff0c;Mozilla公司&#xff0c;…

Trivy:让你时刻掌控的开源安全扫描器

深入了解 Trivy:全面的安全扫描工具 在如今互联网快速发展的时代,软件的安全性显得尤为重要。随着应用程序的复杂性增加,其可能带来的安全漏洞也在不断增多。如何快速、准确地发现这些潜在威胁是每个开发者和运维人员心中的课题。今天,我们将为大家介绍一个开源的安全扫描…

LlamaIndex 第八篇 MilvusVectorStore

本指南演示了如何使用 LlamaIndex 和 Milvus 构建一个检索增强生成&#xff08;RAG&#xff09;系统。 RAG 系统将检索系统与生成模型相结合&#xff0c;根据给定的提示生成新的文本。该系统首先使用 Milvus 等向量相似性搜索引擎从语料库中检索相关文档&#xff0c;然后使用生…

2022河南CCPC(前四题)

签到题目 #include <bits/stdc.h> using namespace std; #define int long long #define PII pair<int,int> #define fi first #define se second #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);void solve() {int n;cin>>…

谷歌浏览器(Google Chrome)136.0.7103.93便携增强版|Win中文|安装教程

软件下载 【名称】&#xff1a;谷歌浏览器&#xff08;Google Chrome&#xff09;136.0.7103.93 【大小】&#xff1a;170M 【语言】&#xff1a;简体中文 【安装环境】&#xff1a;Win10/Win11 【夸克网盘下载链接】&#xff08;务必手机注册&#xff09;&#xff1a; h…

高可用消息队列实战:AWS SQS 在分布式系统中的核心解决方案

引言&#xff1a;消息队列的“不可替代性” 在微服务架构和分布式系统盛行的今天&#xff0c;消息队列&#xff08;Message Queue&#xff09; 已成为解决系统解耦、流量削峰、异步处理等难题的核心组件。然而&#xff0c;传统的自建消息队列&#xff08;如RabbitMQ、Kafka&am…

「Mac畅玩AIGC与多模态41」开发篇36 - 用 ArkTS 构建聚合搜索前端页面

一、概述 本篇基于上一节 Python 实现的双通道搜索服务&#xff08;聚合 SearxNG 本地知识库&#xff09;&#xff0c;构建一个完整的 HarmonyOS ArkTS 前端页面。用户可在输入框中输入关键词&#xff0c;实时查询本地服务 http://localhost:5001/search?q...&#xff0c;返…

springCloud/Alibaba常用中间件之Seata分布式事务

文章目录 SpringCloud Alibaba:依赖版本补充Seata处理分布式事务(AT模式)AT模式介绍核心组件介绍AT的工作流程&#xff1a;两阶段提交&#xff08;**2PC**&#xff09; Seata-AT模式使用Seata(2.0.0)下载、配置和启动Seata案例实战前置代码添加全局注解 GlobalTransactional Sp…

Datawhale FastAPI Web框架5月第1次笔记

原课程地址&#xff1a; FastAPI Web框架https://www.datawhale.cn/learn/summary/164本次难点&#xff1a; 切换python的版本为3.10 作业过程 启动&#xff1a; jupyter notebook 首先我们要确保自己的python版本是3.10 import sys print(sys.version) 第一个fastapi…

操作系统:os概述

操作系统&#xff1a;OS概述 程序、进程与线程无极二级目录三级目录 程序、进程与线程 指令执行需要那些条件&#xff1f;CPU内存 需要数据和 无极 二级目录 三级目录

LLaMA-Factory:环境准备

一、硬件和系统 操作系统: Ubuntu 24.04.2 LTS&#xff08;64位&#xff09;GPU: NVIDIA RTX 4090 笔记本 GPU&#xff0c;16GB显存CPU: 建议高性能多核 CPU&#xff08;如 Intel i7/i9 或 AMD Ryzen 7/9&#xff09;以支持数据预处理&#xff0c;我的是32核。RAM: 至少 32GB&…

ArrayList-集合使用

自动扩容&#xff0c;集合的长度可以变化&#xff0c;而数组长度不变&#xff0c;集合更加灵活。 集合只能存引用数据类型&#xff0c;不能直接存基本数据类型&#xff0c;除非包装 ArrayList会拿[]展示数据

一分钟用 MCP 上线一个 贪吃蛇 小游戏(CodeBuddy版)

我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 你好&#xff0c;我是悟空。 背景 上篇我们用 MCP 上线了一个 2048 小游戏&#xff0c;这次我们继续做一个 …

TTS:F5-TTS 带有 ConvNeXt V2 的扩散变换器

1&#xff0c;项目简介 F5-TTS 于英文生成领域表现卓越&#xff0c;发音标准程度在本次评测软件中独占鳌头。再者&#xff0c;官方预设的多角色生成模式独具匠心&#xff0c;能够配置多个角色&#xff0c;一次性为多角色、多情绪生成对话式语音&#xff0c;别出心裁。 最低配置…

大型语言模型中的QKV与多头注意力机制解析

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

基于地图的数据可视化:解锁地理数据的真正价值

目录 一、基于地图的数据可视化概述 &#xff08;一&#xff09;定义与内涵 &#xff08;二&#xff09;重要性与意义 二、基于地图的数据可视化的实现方式 &#xff08;一&#xff09;数据收集与整理 &#xff08;二&#xff09;选择合适的可视化工具 &#xff08;三&a…

分布式链路跟踪

目录 链路追踪简介 基本概念 基于代理&#xff08;Agent&#xff09;的链路跟踪 基于 SDK 的链路跟踪 基于日志的链路跟踪 SkyWalking Sleuth ZipKin 链路追踪简介 分布式链路追踪是一种监控和分析分布式系统中请求流动的方法。它能够记录和分析一个请求在系统中经历的每…