为 Reachy Mini 添加 MCP 工具

Hugging Face Blog 产品

摘要

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_headplay_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-tool
  • mcp

结论

现在,应用拥有三种类型的工具共享一个注册表:内置工具、本地自定义工具和远程 MCP 工具。配置文件仍然决定给定助手可以使用哪些工具。一个小型、可信的核心保持在中心位置,而其周围的可选能力可以在不触及应用本身的情况下添加、测试和替换。

我们现在最好奇的是人们会构建什么。如果你发布了一个工具 Space,请为其打上 reachy-mini-toolmcp 标签,以便他人发现。我们很期待看到 Reachy Mini 最终能做什么!

致谢:感谢 Fabien Danieau (https://huggingface.co/FabienDanieau) 审校本文并帮助测试工作流,感谢 Andres Marafioti (https://huggingface.co/andito) 帮助测试,感谢 Remi Fabre (https://huggingface.co/RemiFabre) 和 Pollen Robotics 团队提供塑造远程工具工作流的想法和反馈。

相似文章

我们给Reachy Mini装上了实时语音大脑

Reddit r/LocalLLaMA

我们使用GPT Realtime给Reachy Mini机器人装上了实时语音大脑,使其能够通过麦克风听、摄像头看、扬声器说话,并通过动作工具做出物理反应。该项目已在GitHub上开源。