Acknowledge on data type alone, never on buffer id. A live Bebop 2 sends DATA_WITH_ACK on buffer 126 and plain DATA on 127, the opposite of what the buffer names imply, so requiring both to agree meant nothing was ever acknowledged. The drone resent its state instead of continuing: 35 telemetry keys where there should be 192, and a connect that took 4 s instead of 1.7. Record argument-less events. Eight events carry no arguments and their arrival is the whole message, including AllStatesChanged and AllSettingsChanged, which mark the end of a state dump. Keying only by argument decoded them to an empty dict and lost them. Wait for those terminators instead of a quiet period. The drone streams attitude at about 5 Hz throughout, so the link is never quiet and the wait always ran to its timeout with a partial burst. Also: preflight no longer reports ready when a blocking check has no data. It answered 'ready' on an aircraft it knew almost nothing about, which is worse than refusing to answer.
mcbebop
An MCP server for the Parrot Bebop 2, so an agent can talk to the drone without anyone writing code for each question.
Parrot abandoned the Bebop line, but the aircraft is still a capable, cheap platform and its protocol is fully described by Parrot's own XML, which this package vendors. Every one of the 264 commands is reachable; nothing is hand-wrapped.
Status: in development. Not flight-tested. See the safety section.
What it talks to
| Interface | Notes |
|---|---|
| ARSDK3 over UDP | commands and telemetry; this package implements the protocol directly |
| ARStream2 | live H.264 video. The Bebop 2 serves no RTSP, despite what older libraries assume |
| FTP | media, flight plans, blackbox logs |
| Telnet | read-only shell, only after the drone's debug mode is enabled |
Safety
Commands are classified by consequence. Observing and configuring are open;
anything that can spin a motor or change the flight envelope refuses until
arm() is called with a reason, and re-locks on a timer and on disconnect.
Landing and Emergency are deliberately never locked, because refusing to
land an airborne aircraft is the more dangerous answer.
connect(target="sim") runs everything against a protocol-accurate simulator,
which is where anything involving motion should be rehearsed.
Install
uvx mcbebop
claude mcp add mcbebop -- uvx mcbebop
Credits
arsdk-xml/ is Parrot SA's own protocol definition, BSD-3-Clause. See
arsdk-xml/PROVENANCE.md.