Robots
The same search, from a ROS 2 node or a companion computer.
Plain HTTP, compact JSON, no keys. The index holds 691 robot command sets and 725 device contracts among 224,100 records: ROS 2 packages and their commands, MAVLink command sets, and the contracts of devices an agent can drive. Robot work here is early and says so.
Two searches, same doors
- 1. Search over our own index live
- 2.2 million tool actions inside the software agents and robots can invoke, every result labelled by our checks. This is what answers today, through MCP, the API or the CLI.
- 2. The neutral router next
- One call that decides, on the question itself, which search source to ask: our index first, then outside engines, judged on quality, latency and cost, with the source named. Not built yet; it will arrive as its own endpoint and MCP tool.
1. One call over HTTP
Ask for the action in plain words. Leave answer=1 off inside a control loop: the search itself answers from our GPU in well under a second, the language-model answer adds seconds.
curl "https://unfragile.ai/api/v1/find?q=arm+the+drone+and+take+off+to+10+metres&k=5"Each result carries name, action, description, tier, label and, for verified records, url: the signed passport.
2. From a ROS 2 node
# ROS 2 (rclpy) — example node: asks Unfragile which action does a task and
# publishes the top result's name. Adapt the topic and the task to your stack.
import json, urllib.parse, urllib.request
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class FindAction(Node):
def __init__(self):
super().__init__("unfragile_find")
self.pub = self.create_publisher(String, "unfragile/top_action", 10)
task = "move the arm to its home position"
q = urllib.parse.quote(task)
# k=5, no answer layer: the box answers in well under a second; the
# language-model answer adds seconds and belongs outside control loops.
with urllib.request.urlopen(f"https://unfragile.ai/api/v1/find?q={q}&k=5", timeout=5) as r:
data = json.load(r)
for row in data["results"]:
self.get_logger().info(f'{row["label"]:32} {row["name"]} · {row["action"]}')
top = data["results"][0] if data["results"] else None
if top and top["tier"] in ("verified", "official"):
self.pub.publish(String(data=f'{top["name"]}:{top["action"]}'))
else:
self.get_logger().warn("no verified action; not publishing")
def main():
rclpy.init(); n = FindAction(); rclpy.spin_once(n, timeout_sec=0.1); n.destroy_node(); rclpy.shutdown()3. Through MCP, when an agent runs on the robot
A robot whose planner is an agent runtime with MCP support gets the same seven tools as any agent, unfragile_find and unfragile_verify first among them. Add the server to that runtime's configuration:
{
"mcpServers": {
"unfragile": { "command": "npx", "args": ["-y", "@unfragile/mcp-server"] }
}
}4. Verify before you load a new package
Over HTTP from any language, or on the companion computer's command line.
# Companion computer (any Python) — before loading a new MAVLink or ROS package,
# ask for its verdict. Never load a flagged one.
import json, urllib.request
req = urllib.request.Request(
"https://unfragile.ai/api/v1/verify",
data=json.dumps({"target": "pypi:pymavlink"}).encode(),
headers={"Content-Type": "application/json"},
)
v = json.load(urllib.request.urlopen(req, timeout=5))
print(v["verdict"], "-", v["reason"]) # trusted | caution | unverified | flagged
assert v["verdict"] != "flagged"npx -p @unfragile/mcp-server unfragile verify pypi:pymavlink # exit 1 = flagged, do not load5. The rules for robots
- Only act on
verifiedorofficial. A resultfound in code, not yet checkedexists in source but has not answered our checks; read it before it touches a motor. - Never load a
failedorflaggedpackage. - Time-bound every call. Use a timeout; on 503 the service is down and nothing is guessed. Do not block a loop on us.
- An empty result is an answer. Fall back to your own defaults; do not improvise a command.
6. What is still being built for robots
- A ROS 2 client package, so the call above is a service, not a snippet.
- A latency budget published per endpoint, measured, not promised.
- The neutral router, so a robot's question can reach sources beyond this index.
The machine-readable version of this page is /robots.md.