Forge reads ROS 2 (DDS) from 19 OEM families and emits the same canonical JSON for every one of them. No per-vendor parser, no per-vendor schema.
One MCP endpoint serves every protocol adapter — there is no per-protocol URL to configure.
Each links to its own mapping reference with vendor-specific tag shapes.
Sampled from the live corpus — one example per vendor, so you can see the same canonical field arriving from different raw tag shapes.
| Raw tag in | Canonical field out | Source | |
|---|---|---|---|
| CJointT.rax_1: 42.7 | → | robot.joint.position: 42.7 | ABB Robotics |
| $AXIS_ACT.A1: 88.2 | → | robot.joint.position: 88.2 | KUKA |
| /robot_status/battery_percentage: 82 | → | amr.battery.charge: 82 | MiR (Mobile Industrial Robots) |
| actual_q_0: 1.57 | → | robot.joint.position: 1.57 | Universal Robots |
| J1_pos: 30.5 | → | robot.joint.position: 30.5 | Fanuc Robotics |
| battery_soc: 0.74 | → | amr.battery.charge: 74 | OTTO Motors |
The fields most commonly emitted by these 19 OEMs. The full schema is open source: FoundryNet/canonical-schema (MIT).
robot.joint.currentrobot.joint.effortrobot.joint.positionrobot.joint.temperaturerobot.joint.velocityrobot.moderobot.payloadrobot.safety.status_bitsrobot.tcp.forcerobot.tcp.poserobot.tcp.speedamr.battery.charge
industrial robot autonomous mobile robot
Other protocols: BACnet/IP EtherNet/IP HTTP / REST J1939 (CAN) MQTT Sparkplug B MTConnect Modbus TCP OPC UA PROFINET / S7