[project] name = "fldigi-mcp" version = "0.4.0" description = "An MCP server for controlling the fldigi digital-modem application over XML-RPC." readme = "README.md" license = { text = "GPL-3.0-or-later" } requires-python = ">=3.10" authors = [ { name = "Stefan Brunner (AE5VG)", email = "me@stefanbrunner.org" }, ] keywords = [ "fldigi", "mcp", "model-context-protocol", "ham-radio", "amateur-radio", "xmlrpc", ] classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", "Topic :: Communications :: Ham Radio", ] dependencies = [ "mcp[cli]>=1.2.0,<2", "pyyaml>=6.0", ] [project.optional-dependencies] # signal hunting: analyse receiver audio to find and name signals (numpy) and tap # the input device live (sounddevice / PortAudio). The base server stays dependency-free. hunt = ["numpy>=1.24", "sounddevice>=0.4.6"] [dependency-groups] dev = [ "pytest>=8.0", "ruff>=0.6", # tests/test_hunt.py and tests/test_tapd.py importorskip on numpy; without it # here, a bare `uv sync` (what CI runs) silently skips 13 signal-hunt tests. # sounddevice is deliberately NOT here: it is imported lazily inside the live # audio tap only, and pulling it in would drag PortAudio onto the runners. "numpy>=1.24", ] [project.scripts] fldigi-mcp = "fldigi_mcp.server:main" fldigi-mcp-tap = "fldigi_mcp.tapd:main" [project.urls] Homepage = "https://github.com/sbrunner-atx/fldigi-mcp" Repository = "https://github.com/sbrunner-atx/fldigi-mcp" Issues = "https://github.com/sbrunner-atx/fldigi-mcp/issues" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/fldigi_mcp"] # Ruff is a fast linter/formatter; configuring it here is a sign of a maintained # project. We run it in CI in a later phase. [tool.ruff] line-length = 100 target-version = "py310" [tool.ruff.lint] select = ["E", "F", "I", "UP", "B"]