Skip to content
aiqbench takeAI Products

aiqbench analysis

Reachy Mini now leverages Model Context Protocol (MCP) to execute remote tools hosted on public Hugging Face Spaces, enabling capabilities like weather checks and web searches without downloading code to the local machine. This architecture allows developers to dynamically extend the robot's functionality by simply adding Space URLs, while maintaining strict control over available actions through profile-based tool filtering. The update shifts the paradigm from static, locally bundled utilities to a scalable, cloud-hosted tool ecosystem that supports both custom and community-built functions.
Source coveringHugging Face
What this isA model's reading of the article and related coverage, written for aiqbench. Not the publisher's words.

Adding MCP Tools to Reachy Mini

Hugging Face7 min read

The Reachy Mini conversation app can now use tools hosted in public Hugging Face Spaces, called over MCP. You can give your robot a new ability, like checking the weather or searching the web, by adding a Space from the Hub instead of editing the app. The tool keeps running in the Space itself, so no code is downloaded onto your machine. And you can publish your own tools for other people to use.

Below, we look at what a tool is, how profiles control what the robot can use, and the current limits of the remote path.

When you talk to the robot, what you get back isn't only a voice, it's a system that reacts to the conversation: the robot can move and respond non-verbally, when it's applicable. The part we want to focus on here is the tools that make that possible. A tool is something the model can do during a conversation: play an emotion, move the head, look through the camera. Each tool has a name and a short description. The model reads those, decides when one is useful, calls it, and uses what comes back.

A tool in the code isn't usable until it's enabled in a profile, a folder with two files that matter here: instructions.txt (the prompt) and tools.txt (the tools that are turned on).

If a name isn't in tools.txt, the model can't call it.

You can also write your own tool: add a Python file to the profile (or external_tools/), give it a name and description, and list that name in tools.txt.

Today there are built-in tools and custom local tools, and tools.txt decides which are active. This works well for the robot's body and keeps the trusted core small.

The constraint here is that every tool has to be local Python. For move_head or play_emotion that's right: they talk to the hardware and belong in the app but a lot of useful things have nothing to do with the body, like web search, weather, or lookups. For those, keeping everything local is mostly friction:

you can still use custom one-off tools from external_tools/ It's a good fit for stateless capabilities like search, weather, and lookups: anything you want to iterate on without touching the app itself. And because anyone can publish a compatible Space, it's easy to share tools and build on each other's work.

They're enough to exercise the whole feature: install from the Hub, discover the remote tools, enable them per profile, and let the realtime backend call them exactly like built-in tools.

Now the robot can search the web and check the weather in the same conversation, which is exactly what the canary_web_search_weather profile below does.

add validates the Space on the Hub, probes the MCP endpoint, discovers its tools, and by default appends the tool IDs to the active profile's tools.txt. The active profile is default unless you've set REACHY_MINI_CUSTOM_PROFILE. Use --install-only to skip that step.

tools.txt is the gatekeeper: a remote tool is only active if its ID appears in the profile's tools.txt, alongside whatever built-in tools you want.

tools.txt is the gatekeeper: a remote tool is only active if its ID appears in the profile's tools.txt, alongside whatever built-in tools you want.

installed_tool_spaces.json in managed app mode

external_content/installed_tool_spaces.json in terminal mode

This keeps remote tool names from colliding with built-in ones and lets multiple Spaces coexist in the same profile.

The implementation also strips redundant Space-name prefixes when possible, so a verbose remote tool name becomes a cleaner local ID. If stripping would cause a collision between two tools from the same Space, the code falls back to the fully namespaced name.

There is also a duplicate safety check at registry level: Tool.name values must be unique across the entire merged tool set. The app fails fast if two sources claim the same name.

For this work we created two focused canary profiles to isolate the MCP experiment from the full embodied tool set.

The small physical tool set means Reachy Mini can still react expressively while answering current questions from the web.

The remote-tool plumbing gets the tools into the model. The prompts decide how the model uses them.

That was especially visible in the search-plus-weather canary. A combined question like:

can be handled in at least three ways: weather first then search, search first then weather, or both in the same turn. If the prompt is vague, the model serialises the calls and creates unnecessary latency. So the canary prompts became part of the feature, not just incidental configuration.

canary_web_search/instructions.txt

canary_web_search_weather/instructions.txt

Per-profile enablement via tools.txt

Two things are worth calling out. First, the Space has to actually behave like an MCP server; if tool discovery fails, the install fails. Second, prompt instructions can encourage parallel calls but cannot guarantee them. If deterministic orchestration matters for a use case, that logic should move from the prompt into code.

If you want others to use your tool, publish it as a public Gradio Space that exposes the standard MCP endpoint, and keep the tools stateless so they work well over the network. Whether a Space installs depends on this runtime behavior, not on tags.

The app now has three kinds of tools sharing one registry: built-in, local custom, and remote MCP tools, and profiles still decide which of them a given assistant can reach. A small, trusted core stays at the center while the optional capabilities around it can be added, tested, and swapped without touching the app itself.

What we're most curious about now is what people build. If you publish a tool Space, tag it reachy-mini-tool and mcp so others can find it. We'd love to see what Reachy Mini ends up able to do!

Acknowledgements: Many thanks to Fabien Danieau for proofreading this post and helping test the workflow, to Andres Marafioti for helping test it, and to Remi Fabre and the Pollen Robotics team for the ideas and feedback that shaped the remote tools workflow.

Full text under the publisher's open licence · 996 words

Related coverage