mcp server
indi-mcp
An MCP server that controls Astrophotography equipment via INDI on a raspberry pi or equivalent devices
Set up
Runs on your computer. Pick your agent and operating system.
Before you start
- uv (`curl -LsSf https://astral.sh/uv/install.sh | sh`)
{
"mcpServers": {
"oekalegon-indi-mcp": {
"command": "uvx",
"args": [
"indi-mcp"
]
}
}
}same format Cursor, GitHub Copilot CLI, Junie, JetBrains AI Assistant, Augment (Auggie CLI), Factory Droid, Kiro, Devin CLI +12
Values in angle brackets are placeholders. Restart Claude Desktop after editing its config.Claude Desktop docs
README
synced Oct 14, 2026INDI MCP Server
An MCP server that controls astrophotography equipment via INDI on a Raspberry Pi (or equivalent device), and exposes it to other computers on the local network.
What it does
- Equipment control — connect to an INDI server and control mounts, cameras, filter wheels, focusers and other astrophotography gear through MCP tools.
- INDI server management — manage the INDI server itself: install/remove drivers, and start, stop or restart the server, all via MCP.
- Frame storage — captured frames are stored on the Raspberry Pi and can be listed, inspected and transferred to another computer on the local network via MCP.
Documentation
- Design Document
- Deployment — running the server locally (
stdio) vs. as a systemd service on the Raspberry Pi (streamable-http) - Rig YAML Schema — field reference for
rigs/*.yamlimaging rig definitions - Observatory Location YAML Schema — field reference for
observatories/*.yamllocation definitions - Script YAML Schema — field reference for the YAML scripting layer;
built-in primitive/composed scripts ship under
scripts/ - Property/Message JSON Payload Schema — field reference for the
kind/type-tagged JSON carried inside MCP tool results and event streams
Debug CLI
indi-mcp-cli is a small standalone tool for manually testing/debugging the INDI server and
driver management tools, without needing an MCP client:
uv run indi-mcp-cli server status
uv run indi-mcp-cli server start --port 7624
uv run indi-mcp-cli driver list
uv run indi-mcp-cli driver start "CCD Simulator"
uv run indi-mcp-cli listen --device "CCD Simulator" # prints incoming events until Ctrl+C
The driver catalog is read from /usr/share/indi/ by default, which only exists where INDI's
drivers are actually installed (e.g. the Raspberry Pi). On a machine with a local INDI install
elsewhere (e.g. Homebrew on macOS, typically /usr/local/share/indi or
/opt/homebrew/share/indi), point the server at it via INDI_MCP_DRIVER_CATALOG_DIR
(INDIMCP-128) — this applies to the MCP server itself, not just indi-mcp-cli's driver
subcommands, since both read the same catalog:
export INDI_MCP_DRIVER_CATALOG_DIR=/usr/local/share/indi
uv run indi-mcp-cli driver list
Status
Early setup stage — MCP server skeleton in place, with INDI server management tools (start/stop/restart/status) implemented.
Tech stack
- Python 3.12+, managed with uv
- Official Python MCP SDK (
mcp) indipyclient— pure-Python INDI client, used for equipment controlindiweb— used as a library only (itsIndiServer/DriverCollectionclasses), forindiserverprocess/FIFO control and driver-catalog parsing; its bundled web app is not usedastropy— celestial-geometry computation (Sun/Moon position, illumination) forcapture_frame's FITS header enrichment, see docs/FitsHeaders.md- Ruff for linting and formatting
- ty for static type checking
- pytest, with
pytest-asyncioandpytest-cov - pre-commit to run the above on every commit
Development setup
uv sync --dev
uv run pre-commit install
Common tasks:
uv run ruff check . # lint
uv run ruff format . # format
uv run ty check . # type-check
uv run pytest --cov # test
Contributing / branching model
This project follows a git-flow-style workflow:
main— always releasable; only accepts merges fromrelease/*orhotfix/*branches.develop— integration branch for ongoing work.feature/*— branched from and merged back intodevelop.
A CI check (enforce-merge-policy) rejects pull requests that don't follow these rules.