protocol/types.py and arsdk/types.py are the interfaces the parallel streams build against: command/arg/enum/expectation specs and the safety tiers on one side, frame encoding and the buffer conventions on the other. Logging goes to stderr throughout, since stdout carries JSON-RPC. That is also why this package will speak ARSDK itself rather than through pyparrot, which prints from its receive thread.
54 lines
1.6 KiB
TOML
54 lines
1.6 KiB
TOML
[project]
|
|
name = "mcbebop"
|
|
version = "2026.10.02"
|
|
description = "MCP server for the Parrot Bebop 2 drone: telemetry, camera, files, and every ARSDK command"
|
|
readme = "README.md"
|
|
requires-python = ">=3.12"
|
|
license = "MIT"
|
|
authors = [{name = "Ryan Malloy", email = "ryan@supported.systems"}]
|
|
keywords = ["mcp", "drone", "parrot", "bebop", "arsdk", "fastmcp"]
|
|
classifiers = [
|
|
"Development Status :: 3 - Alpha",
|
|
"Intended Audience :: Developers",
|
|
"Programming Language :: Python :: 3.12",
|
|
"Programming Language :: Python :: 3.13",
|
|
"Topic :: Scientific/Engineering",
|
|
]
|
|
dependencies = [
|
|
# 4.x is the current family; <5 because FastMCP has moved import paths
|
|
# across majors before (mcvnc was broken by the 3 -> 4 move).
|
|
"fastmcp>=4.0.10,<5",
|
|
"pydantic-settings>=2.7",
|
|
"zeroconf>=0.147", # mDNS discovery of _arsdk-090c._udp
|
|
"pillow>=11.0", # downscale camera frames before they reach the model
|
|
]
|
|
|
|
[project.urls]
|
|
Homepage = "https://warehack.ing"
|
|
Repository = "https://git.supported.systems/rsp2k/mcbebop"
|
|
|
|
[project.scripts]
|
|
mcbebop = "mcbebop.server:main"
|
|
|
|
[build-system]
|
|
requires = ["uv_build>=0.11.3,<0.12.0"]
|
|
build-backend = "uv_build"
|
|
|
|
[tool.uv.build-backend]
|
|
source-exclude = ["CLAUDE.md", ".env", ".env.*", ".mcp.json", "tests", "captures"]
|
|
|
|
[dependency-groups]
|
|
dev = ["ruff>=0.16", "pytest>=8.0", "pytest-asyncio>=0.25"]
|
|
|
|
[tool.pytest.ini_options]
|
|
asyncio_mode = "auto"
|
|
markers = ["drone: needs a real Bebop 2 on the network (run with '-m drone')"]
|
|
addopts = "-m 'not drone'"
|
|
|
|
[tool.ruff]
|
|
line-length = 110
|
|
target-version = "py312"
|
|
|
|
[tool.ruff.lint]
|
|
select = ["E", "F", "I", "W", "UP", "B", "SIM", "RUF"]
|