An MCP server that exposes the IceDOS ecosystem — configuration, modules, options, and system operations — to AI agents. Built on FastMCP.
Packaged as an IceDOS module (icedos.nix). Once the system is rebuilt it is
available as a toolset command:
icedos mcp serve # start the server over stdioThe command sets ICEDOS_CONFIG_DIR to the active configuration root before
launching. Run directly for development:
ICEDOS_CONFIG_DIR=/path/to/config icedos-mcp-serverThe server locates the IceDOS config root by honoring ICEDOS_CONFIG_DIR, then
falling back to walking up from the working directory for a config.toml +
flake.nix pair. Config edits use tomlkit for round-trip preservation, and new
tables are spaced with one blank line between blocks to match the hand-written style.
Config
get_config— readconfig.toml(or.private.toml), whole or by sectionget_config_value— read one value by dotted path;resolved=truereturns the effective option value/type from the index (not just declared TOML)set_config_value— write a value (optional eval-validation via genflake, auto-revert on failure)delete_config_value— remove a key, or an array item viapath|itemsyntax (type-coerced)list_repositories— list[[icedos.repositories]]entriesadd_repository— append a repository entry (override_url,patches,fetch_deps,fetch_optional_deps)edit_user— add/update an[icedos.users.<name>]entry
Modules
enable_module/disable_module— add/remove a module in its owning repo'smoduleslist (repo auto-resolved from the index)module_graph— forward deps + reverse dependents for a module
Query & discovery
search_options/search_modules— relevance-ranked, paginated ({total,count,offset,truncated,results}+limit/offset)get_option— full option details + paste-ready TOML snippetget_module/list_modules— module details / list (markers: ● explicit, ◐ dependency, ○ available)
System
rebuild— build the configuration (never activates); condensed summary by default,logs=truefor the full logget_diff— pendingconfig.tomlchanges since last buildrollback— roll back to a previous generation (dryfor a plan-only run)doctor— health checks (substituters, cache, hardware, store, gc, inputs)list_inputs— flake.lock inputs that built the running system: pinned rev + freshnessdiff_generations— config.toml diff between two generations
Packages
list_packages— installed packagesrun_package— run a package without installing it (blocking;timeoutconfigurable)
Repo explorer
explore_repo— inspect a module repo (local override first, else GitHub API)explore_local_repo— inspect a local repo checkout
System info
get_system_info_tool— hostname, kernel, uptime, generation, store spaceget_generations_tool— generations with dates + the config snapshot that built each
icedos://config, icedos://config/private, icedos://options, icedos://modules,
icedos://generations, icedos://system-info, and the templated
icedos://repo/{url} (URL is percent-encoded, e.g. icedos://repo/github%3Aicedos%2Fapps).
configure_module, troubleshoot, add_application, icedos_overview.
mcp-server/
flake.nix # IceDOS module scan entry point
icedos.nix # packages the server, wires the `icedos mcp serve` command
src/
pyproject.toml # hatchling build; package = icedos_mcp
icedos_mcp/
server.py # tool/resource/prompt definitions (FastMCP)
config.py # config.toml read/edit (tomlkit round-trip)
cli.py # subprocess wrappers for the icedos CLI
modules.py # repo/module exploration
system.py # system info & generations
prompts.py # prompt templates
cd src
python -m build --wheel --no-isolation # build a wheel (hatchling)
python -m py_compile icedos_mcp/*.py # quick syntax checkAfter editing any .nix file, format the tree from the IceDOS root with icedos nixf ..