Hugging Face · 官方博客

为 Reachy Mini 添加 MCP 工具

Adding MCP Tools to Reachy Mini

二〇二六年六月三日 · 英文原文

Reachy Mini 对话应用新增通过 MCP 调用公共 Hugging Face Spaces 中远程工具的能力,支持天气查询、网络搜索等功能。工具在 Space 中持续运行,不下载代码到本地。内置工具(如 move_head、camera)与远程工具共享注册表,通过配置文件 tools.txt 控制启用。Pollen Robotics 发布两个金丝雀工具(reachy-mini-search-tool 和 reachy-mini-weather-tool),支持并行调用。当前支持公共 Gradio Spaces,不支持私有或需认证的 Spaces。

](https://huggingface.co/alozowski)

Image 2: Reachy Mini 望向窗外

Reachy Mini 不再需要望向窗外才能告诉你天气

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 来说,这没问题:它们与硬件通信,属于应用的一部分。但很多有用的功能与身体无关,比如网络搜索、天气或查询。对于这些功能,将所有内容保持本地化主要会带来不便:

从 Spaces 调用工具

远程工具增加了第三种类型,与你已有的内置和自定义本地工具并列,用于那些更容易独立发布、共享和更新的能力:

我们从两个金丝雀工具开始,它们是用于测试新流程的小型测试工具:

它们足以测试整个功能:从 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 <owner/space-name>
 
# 在特定配置文件中启用
reachy-mini-conversation-app tool-spaces add <owner/space-name> --profile <NAME>
 
# 仅安装,不启用
reachy-mini-conversation-app tool-spaces add <owner/space-name> --install-only
 
# 列出已安装的 Spaces
reachy-mini-conversation-app tool-spaces list
 
# 移除已安装的 Space
reachy-mini-conversation-app tool-spaces remove <owner/space-name>

add 命令会验证 Hub 上的 Space,探测 MCP 端点,发现其工具,并默认将工具 ID 追加到当前激活配置文件的 tools.txt 中。除非你设置了 REACHY_MINI_CUSTOM_PROFILE,否则当前激活配置文件是 default。使用 --install-only 可以跳过此步骤。

tools.txt 是守门员:只有当远程工具的 ID 出现在配置文件的 tools.txt 中时,它才处于激活状态,与你想要的任何内置工具并列。

清单文件的位置

已安装的来源持久化存储在:

工具命名

每个已安装的 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]

## 金丝雀搜索和天气规则
你有两个远程工具:
- 一个天气简报工具,用于获取某个地点的当日天气摘要
- 一个网络搜索工具,用于获取更广泛的当前网络信息

使用天气工具获取今日天气状况、温度、降雨概率、日出、日落,或诸如是否需要带外套等简单建议。
使用网络搜索获取新闻、事件、营业时间、旅行信息、严重警报或更广泛的当前背景信息。

当用户的问题混合了天气部分和当前信息部分时(例如,"should I bring a jacket in Bordeaux today, and is there anything major happening downtown tonight?"),在同一轮中并行调用两个工具。不要等待一个结果才开始另一个,除非天气结果对于缩小搜索范围是必要的。

然后将结果合并成一个简短的答案。先涵盖天气部分,然后是事件或新闻部分,用平实的连贯句子表达。不要标记各部分,也不要提及哪个工具提供了哪部分信息。

当用户询问事件、新闻或正在发生的事情时,从搜索结果中给出实际答案:说出具体的事件、场地或头条新闻。不要告诉用户去查看网站、访问列表网站或让他们自己查找。如果搜索结果没有返回具体内容,直接说你没有发现任何值得注意的事件,而不是将他们引导到别处。

对于可能需要一点时间的远程查询,你可以给出一个非常简短的英文确认,例如"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,该 Space 暴露标准的 MCP 端点,并保持工具无状态,以便它们能在网络上良好运行。一个 Space 能否被安装取决于其运行时行为,而不是标签。

安装不需要标签,但它们有助于人们找到兼容的 Space:

结论

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

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

致谢:非常感谢 Fabien Danieau 校对本文并帮助测试工作流程,感谢 Andres Marafioti 帮助测试,以及感谢 Remi Fabre 和 Pollen Robotics 团队为远程工具工作流程提供的想法和反馈。

译自 Hugging Face · 官方博客 · 录于 二〇二六年六月三日