Starlight, diataxis-shaped: a tutorial pair, six how-to guides, a generated tool reference plus a configuration reference, and four explanation pages covering architecture, sandbox isolation, see-and-drive, and the failure handling philosophy. The tool reference is generated from the running MCP server's own schemas, so its 33 tools, parameters and defaults cannot drift from the code; the generator asserts its grouping still covers exactly the live tool set. Infrastructure follows the warehacking cookie-cutter (multi-stage Dockerfile, Caddy serving dist with real 404 status, compose profiles for prod and dev, Makefile with a deploy target pointed at docker-2). Two deviations worth noting: remark-gfm is added to the MDX pipeline because Astro enables GFM for .md but not .mdx, so tables silently rendered as run-together paragraphs; and the card icon palette is pinned to the accent because Starlight's staggered grid rotates through colours including purple. Package URLs now point at the Gitea repo and this site.
79 lines
2.0 KiB
TOML
79 lines
2.0 KiB
TOML
[project]
|
|
name = "mcqemu"
|
|
version = "2026.08.17"
|
|
description = "MCP server for managing QEMU virtual machines"
|
|
readme = "README.md"
|
|
requires-python = ">=3.11"
|
|
authors = [{ name = "Ryan Malloy", email = "ryan@supported.systems" }]
|
|
license = "MIT"
|
|
keywords = ["mcp", "qemu", "qmp", "virtualization", "kvm", "sandbox"]
|
|
classifiers = [
|
|
"Development Status :: 4 - Beta",
|
|
"Intended Audience :: Developers",
|
|
"Intended Audience :: System Administrators",
|
|
"License :: OSI Approved :: MIT License",
|
|
"Operating System :: POSIX :: Linux",
|
|
"Programming Language :: Python :: 3",
|
|
"Programming Language :: Python :: 3.11",
|
|
"Programming Language :: Python :: 3.12",
|
|
"Programming Language :: Python :: 3.13",
|
|
"Topic :: System :: Emulators",
|
|
"Topic :: System :: Systems Administration",
|
|
]
|
|
|
|
dependencies = [
|
|
"fastmcp>=3.4.7,<4",
|
|
"qemu.qmp>=0.0.6",
|
|
]
|
|
|
|
[project.urls]
|
|
Documentation = "https://mcqemu.warehack.ing"
|
|
Repository = "https://git.supported.systems/warehack.ing/mcqemu"
|
|
|
|
[project.scripts]
|
|
mcqemu = "mcqemu.server:main"
|
|
|
|
[dependency-groups]
|
|
dev = [
|
|
"pytest>=8",
|
|
"pytest-asyncio>=1.0",
|
|
"ruff>=0.12",
|
|
]
|
|
|
|
[build-system]
|
|
requires = ["hatchling"]
|
|
build-backend = "hatchling.build"
|
|
|
|
[tool.hatch.build.targets.wheel]
|
|
packages = ["src/mcqemu"]
|
|
|
|
[tool.hatch.build.targets.sdist]
|
|
exclude = [
|
|
"CLAUDE.md",
|
|
".env",
|
|
".mcp.json",
|
|
"tests/",
|
|
".pytest_cache/",
|
|
".ruff_cache/",
|
|
"dist/",
|
|
]
|
|
|
|
[tool.ruff]
|
|
line-length = 100
|
|
src = ["src", "tests"]
|
|
|
|
[tool.ruff.lint]
|
|
select = ["E", "F", "I", "UP", "B", "SIM", "ASYNC"]
|
|
# ASYNC109: `timeout` params here are deliberate LLM-facing tool parameters.
|
|
# ASYNC110: polling an external process's death has no event to await.
|
|
# ASYNC240: pathlib use is microsecond stat/exists checks, not bulk I/O.
|
|
# ASYNC230: the one blocking read is a bounded 256KB tail, not bulk I/O.
|
|
ignore = ["ASYNC109", "ASYNC110", "ASYNC230", "ASYNC240"]
|
|
|
|
[tool.pytest.ini_options]
|
|
asyncio_mode = "auto"
|
|
markers = [
|
|
"integration: boots real QEMU (run with '-m integration')",
|
|
]
|
|
addopts = "-m 'not integration'"
|