为 Reachy Mini 添加 MCP 工具
摘要
Reachy Mini 的对话应用现在可以通过 MCP 使用托管在 Hugging Face Spaces 中的工具,允许用户通过单个命令添加诸如查天气或网页搜索等功能。
查看缓存全文
缓存时间: 2026/06/03 15:37
为 Reachy Mini 添加 MCP 工具 来源:https://huggingface.co/blog/adding-mcp-tools-to-reachy-mini 返回文章列表 (https://huggingface.co/blog) Alina Lozovskaya 的头像 (https://huggingface.co/alozowski) Reachy Mini 望向窗外Reachy Mini 不再需要望向窗外才能告诉你天气了 - 内置工具 - 配置文件如何控制工具 - 本地工具的局限性 - 从 Spaces 调用工具 - 安装、列出、移除 - 清单文件存放位置 - 工具命名 - 示例配置文件 - 提示词为何重要 - 当前支持的功能与不支持的功能 - 发布工具 Spaces 的技巧 - 结论
Reachy Mini 对话应用现在可以使用托管在公开 Hugging Face Spaces 中的工具,这些工具通过 MCP 调用。你可以为机器人赋予新能力,比如查看天气或搜索网页,只需从 Hub 添加一个 Space,无需修改应用。工具在 Space 自身中持续运行,不会下载任何代码到你的机器上。你还可以发布自己的工具供他人使用。
添加工具只需一条命令:
reachy-mini-conversation-app tool-spaces add pollen-robotics/reachy-mini-weather-tool
然后像往常一样启动应用:
reachy-mini-conversation-app
现在你只需问:
What's the weather in Paris today?
下面,我们将探讨工具是什么、配置文件如何控制机器人能使用的工具,以及远程路径当前的局限性。
内置工具
当你与机器人对话时,得到的不仅仅是语音:它是一个能对对话做出反应的系统——机器人在适当的时候可以移动并做出非言语回应。我们重点关注的,是使这一切成为可能的工具。
工具是模型在对话中可以执行的操作:播放情感、移动头部、通过摄像头观察。每个工具都有名称和简短描述。模型读取这些信息,判断何时有用,调用它,并利用返回的结果。
目前所有工具都是本地的,内嵌在应用中,且大部分与机器人的身体相关:
| 工具 | 功能 |
|---|---|
move_head | 排队改变头部姿势 |
dance / stop_dance | 播放或清除舞蹈库中的舞蹈 |
play_emotion / stop_emotion | 播放或清除录制的情感片段 |
head_tracking | 切换头部追踪偏移 |
camera | 捕获一帧图像并分析 |
idle_do_nothing | 在空闲回合明确保持空闲 |
配置文件如何控制工具
代码中的工具只有在配置文件中启用后才能使用。配置文件是一个文件夹,其中包含两个关键文件:instructions.txt(提示词)和 tools.txt(启用的工具列表)。
default 配置文件启用了全套工具:
# profiles/default/tools.txt
dance
stop_dance
play_emotion
stop_emotion
camera
idle_do_nothing
head_tracking
move_head
如果某个名称不在 tools.txt 中,模型就无法调用它。你也可以编写自己的工具:向配置文件(或 external_tools/ 目录)添加一个 Python 文件,为其命名和描述,并将该名称列出在 tools.txt 中。
目前已有内置工具和自定义本地工具,tools.txt 决定哪些工具处于活动状态。这对于机器人身体控制来说运行良好,并且保持了可信核心的小型化。
本地工具的局限性
这里的限制是每个工具都必须是本地 Python 代码。对于 move_head 或 play_emotion 来说,这很合理:它们与硬件通信,属于应用的一部分。但许多有用的功能与身体无关,例如网页搜索、天气或查询。
对于这些功能,将所有内容保持本地化主要是带来摩擦:
- 共享工具意味着要移交 Python 文件
- 更新工具意味着要再次发送这些文件
- 修改工具意味着要编辑应用,尽管该能力实际上与应用本身是分离的
从 Spaces 调用工具
远程工具在已有的内置和自定义本地工具基础上,增加了第三种类型,适用于更容易独立发布、共享和更新的能力:
- 内置机器人工具保持本地、可信
- 可共享的远程工具可以托管在公开的 Hugging Face Spaces 中
- 你仍然可以使用来自
external_tools/的自定义一次性工具
这对于无状态能力(如搜索、天气、查询)非常契合:任何你想在不触及应用本身的情况下迭代的功能。
由于任何人都可以发布兼容的 Space,共享工具和彼此协作变得简单。
我们首先提供了两个金丝雀工具,用于测试新流程的小型测试工具:
它们足以测试整个功能:从 Hub 安装、发现远程工具、按配置文件启用,并让实时后端像调用内置工具一样调用它们。
要同时使用两者,添加每个 Space,让它们的工具堆叠在同一个配置文件中:
reachy-mini-conversation-app tool-spaces add pollen-robotics/reachy-mini-search-tool
reachy-mini-conversation-app tool-spaces add pollen-robotics/reachy-mini-weather-tool
现在,机器人在同一对话中可以搜索网页和查看天气——这正是下面 canary_web_search_weather 配置文件所做的。
安装、列出、移除
# 安装并启用到当前活动配置文件
reachy-mini-conversation-app tool-spaces add <space_slug>
# 安装并启用到指定配置文件
reachy-mini-conversation-app tool-spaces add --profile <profile_name> <space_slug>
# 仅安装,不启用
reachy-mini-conversation-app tool-spaces add --install-only <space_slug>
# 列出已安装的 spaces
reachy-mini-conversation-app tool-spaces list
# 移除一个已安装的 space
reachy-mini-conversation-app tool-spaces remove <space_slug>
add 命令会在 Hub 上验证该 Space,探測 MCP 端点,发现其工具,并默认将工具 ID 追加到活动配置文件的 tools.txt 中。活动配置文件默认为 default,除非你设置了 REACHY_MINI_CUSTOM_PROFILE 环境变量。使用 --install-only 可以跳过这一步骤。
tools.txt是门卫:远程工具只有在其 ID 出现在配置文件的tools.txt中(与你希望保留的内置工具一起列出)时,才会变为活动状态。
清单文件存放位置
已安装的来源持久化在以下文件中:
installed_tool_spaces.json(托管应用模式)external_content/installed_tool_spaces.json(终端模式)
工具命名
每个已安装的 Space 会根据其 slug 生成一个本地别名,其中连字符、点和斜杠都会转换为下划线:
pollen-robotics/reachy-mini-search-tool → pollen_robotics_reachy_mini_search_tool
然后远程工具会通过双下划线进行命名空间限定:
pollen_robotics_reachy_mini_search_tool__search_web
pollen_robotics_reachy_mini_weather_tool__get_day_brief
这可以防止远程工具名称与内置工具冲突,并允许多个 Space 在同一个配置文件中共存。
实现还会在可能的情况下去除冗余的 Space 名称前缀,从而使冗长的远端工具名称变为更简洁的本地 ID。如果去除前缀会导致同一个 Space 中的两个工具产生冲突,代码会回退到完全限定的命名空间名称。
在注册层面还有重复安全检查:Tool.name 值在整个合并工具集合中必须唯一。如果有两个来源声称拥有相同名称,应用会快速失败。
示例配置文件
我们创建了两个针对性强的金丝雀配置文件,以将 MCP 实验与完整的具体化工具集隔离开来。
第一个配置文件保留了少数表现性工具(情感、头部运动),并增加了网页搜索:
# profiles/canary_web_search/tools.txt
play_emotion
stop_emotion
idle_do_nothing
move_head
pollen_robotics_reachy_mini_search_tool__search_web
第二个配置文件相同,并在搜索之外增加了天气工具:
# profiles/canary_web_search_weather/tools.txt
play_emotion
stop_emotion
idle_do_nothing
move_head
pollen_robotics_reachy_mini_search_tool__search_web
pollen_robotics_reachy_mini_weather_tool__get_day_brief
精简的物理工具集意味着 Reachy Mini 在回答来自网络的实时问题时,仍能进行富有表现力的反应。
提示词为何重要
远程工具的管道将工具传递给模型,而提示词决定模型如何使用它们。这在搜索加天气的金丝雀测试中尤为明显。
像这样的组合问题:
Should I bring a jacket in Bordeaux today, and is there anything major happening downtown tonight?
至少可以通过三种方式处理:先天气再搜索、先搜索再天气,或者在同一轮中并行调用。如果提示词不明确,模型会序列化调用,造成不必要的延迟。
因此,金丝雀提示词本身成为了功能的一部分,而不仅仅是附带配置。
canary_web_search/instructions.txt
[default_prompt]
## 金丝雀网页搜索规则
你拥有一个用于获取最新网络信息的远程工具。当用户询问实时信息、新闻、当前可用性或任何可能已发生变化的内容时,请使用它。
当搜索结果已能回答问题时,直接用平实的语言给出答案。以答案开头,不要啰嗦工具使用。
对于可能需要一些时间的远程查询,你可以给出一个非常简短的英文确认,例如“Let me check that and I'll be right back”,然后继续。
除非用户明确要求其他语言,否则用英文回答。如果结果摘要不完整或模糊,简要提及不确定性。
仅在链接有价值或用户要求来源时提及链接。
保持回复简短且适合朗读,就像语音助手念出来的那样。通常一两句话就够了。跳过开场白、列表、标题和填充内容。只给出用户需要的事实或直接答案。
canary_web_search_weather/instructions.txt
[default_prompt]
## 金丝雀搜索与天气规则
你拥有两个远程工具:
- 一个天气简报工具,用于获取某个地点的紧凑日间天气信息
- 一个网页搜索工具,用于获取更广泛的当前网络信息
使用天气工具获取今日天气状况、温度、下雨几率、日出日落,或简单的建议(比如是否需要带外套)。
使用网页搜索获取新闻、事件、营业时间、旅行信息、严重警报或更广泛的当前背景。
当用户的问题混合了天气部分和当前信息部分(例如“我应该今天在波尔多带外套吗?今晚市中心有什么重大活动吗?”),在同一轮中并行调用两个工具。不要等一个结果出来再启动另一个,除非天气结果对缩小搜索范围是必要的。
然后将结果合并成一个简短答案。先覆盖天气部分,再覆盖事件或新闻部分,用连贯的简单句子表述。不要标注段落来源,也不要提及哪个工具提供了哪部分信息。
当用户询问事件、新闻或正在发生的事情时,从搜索结果中给出实际答案:指明具体事件、地点或标题。不要告诉用户去查看网站、访问列表站点或自己查找。如果搜索结果没有返回具体内容,明确说明你没有找到任何值得注意的事件,而不是将用户引导到别处。
对于可能需要一些时间的远程查询,你可以给出一个非常简短的英文确认,例如“Let me check that and I'll be right back”,然后继续。
除非用户明确要求其他语言,否则用英文回答。除非用户询问,否则不要谈论工具使用。保持回复简短且适合朗读,就像语音助手念出来的那样。通常一两句话就够了。跳过开场白、列表、标题和填充内容。只给出用户需要的事实或直接答案。
当前支持的功能与不支持的功能
| 功能 | 支持情况 |
|---|---|
通过 slug 安装公开的、兼容 MCP 的 Gradio Spaces(标准 /gradio_api/mcp/ 端点) | ✅ |
| 同时使用多个 Spaces | ✅ |
通过 tools.txt 按配置文件启用 | ✅ |
| 命名空间限定的远程工具 ID | ✅ |
| 后端无关的注册(OpenAI、Gemini、Hugging Face) | ✅ |
| 不会下载任意代码到本地应用 | ✅ |
| 私有或需要认证的 Spaces | ❌ |
| 非 Gradio 的 Spaces | ❌ |
| 任意原始 MCP URL 或非 Hugging Face 的 MCP 服务器 | ❌ |
| 保证的并行工具编排 | ❌ |
有两件事值得指出。第一,Space 必须真正像 MCP 服务器一样工作;如果工具发现失败,则安装失败。第二,提示词指令可以鼓励并行调用,但不能保证一定并行执行。如果确定性编排对某个用例很重要,应将该逻辑从提示词移到代码中。
发布工具 Space 的技巧
如果你希望他人使用你的工具,请将其发布为公开的 Gradio Space,并暴露标准 MCP 端点。保持工具无状态,以便在网络中良好运作。
一个 Space 是否可安装取决于其运行时行为,而非标签。安装时不需要标签,但标签有助于他人找到兼容的 Space:
reachy-mini-toolmcp
结论
现在,应用拥有三种类型的工具共享一个注册表:内置工具、本地自定义工具和远程 MCP 工具。配置文件仍然决定给定助手可以使用哪些工具。一个小型、可信的核心保持在中心位置,而其周围的可选能力可以在不触及应用本身的情况下添加、测试和替换。
我们现在最好奇的是人们会构建什么。如果你发布了一个工具 Space,请为其打上 reachy-mini-tool 和 mcp 标签,以便他人发现。我们很期待看到 Reachy Mini 最终能做什么!
致谢:感谢 Fabien Danieau (https://huggingface.co/FabienDanieau) 审校本文并帮助测试工作流,感谢 Andres Marafioti (https://huggingface.co/andito) 帮助测试,感谢 Remi Fabre (https://huggingface.co/RemiFabre) 和 Pollen Robotics 团队提供塑造远程工具工作流的想法和反馈。
相似文章
@andimarafioti: Reachy Mini刚刚获得了新大脑!我们发布了一个完全开源的与Reachy Mini对话的后端。在过去48小时…
Reachy Mini拥有一个全新的完全开源后端,用于实时语音交互,本地运行音频模型,并利用LLM订阅来避免按秒计费的API成本。
我们给Reachy Mini装上了实时语音大脑
我们使用GPT Realtime给Reachy Mini机器人装上了实时语音大脑,使其能够通过麦克风听、摄像头看、扬声器说话,并通过动作工具做出物理反应。该项目已在GitHub上开源。
一款MCP工具,让你从Claude.ai聊天中运行并管理Claude Code会话(在构思的地方工作)
一款开源MCP工具,让Claude.ai能够运行并管理Claude Code会话,形成一个循环:Claude.ai触发Claude Code,并在浏览器中接收响应,从而免去复制粘贴的操作。
@tan_stack: MCP 工具过去只返回文本供模型读取。现在它们返回交互式 UI。TanStack AI 的新 MCP 应用…
TanStack AI 推出的 MCP 应用支持在聊天中直接渲染交互式 UI 小部件,超越了仅返回文本的 MCP 工具响应。
@waqasraza: Reachy Mini 已组装就绪,感谢 @huggingface 和 @pollenrobotics #reachymini #Ai
Reachy Mini 是一款由人工智能驱动的机器人,现已组装完毕并准备就绪,并向 Hugging Face 和 Pollen Robotics 表示感谢。