Scaffold: package, settings, errors, server factory, shared contracts

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.
This commit is contained in:
2026-10-01 23:53:15 -06:00
parent 40814040a2
commit 5732befe82
16 changed files with 2191 additions and 0 deletions
+53
View File
@@ -0,0 +1,53 @@
[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"]