{
  "markdown": "# MIRASTACK Redfish MCP Server\n\n> Governed MCP server for DMTF Redfish-compliant BMCs — iDRAC, iLO, XCC,\n> OpenBMC and compatible implementations. **Read-only by default**: mutating\n> tools are not registered unless you explicitly raise the write mode, and\n> every mutation is a dry-run until confirmed.\n>\n> Built by [MIRASTACK LABS](https://mirastacklabs.ai). Apache-2.0.\n\n<!-- mcp-name: ai.mirastacklabs/mirastack-redfish-mcp -->\n\n[![mirastack-redfish-mcp MCP server](https://glama.ai/mcp/servers/mirastacklabs-ai/mirastack-redfish-mcp/badges/card.svg)](https://glama.ai/mcp/servers/mirastacklabs-ai/mirastack-redfish-mcp)\n\n[![mirastack-redfish-mcp MCP server](https://glama.ai/mcp/servers/mirastacklabs-ai/mirastack-redfish-mcp/badges/score.svg)](https://glama.ai/mcp/servers/mirastacklabs-ai/mirastack-redfish-mcp)\n\n## Highlights\n\n- MCP `stdio` and `streamable-http` transports via the official Python MCP SDK.\n- Distilled schema metadata from [DMTF Redfish-Publications](https://github.com/DMTF/Redfish-Publications), pinned to release `2026.1`.\n- Protocol-correct Redfish behavior: session auth, ETag/`If-Match`, `202` task polling, and registry-backed error rendering.\n- Safe write controls: tiered registration plus dry-run-first confirmations.\n\n## Why this exists\n\nA BMC is a pre-OS, out-of-band control plane with authority above normal host-level root access. Giving an autonomous agent BMC access without strong guardrails creates immediate blast-radius risk across power, boot, firmware, and account boundaries. This server forces dangerous actions behind deliberate write-mode elevation, and keeps every mutation dry-run by default so intent can be reviewed before application. The result is a governed operational interface rather than an always-armed remote control. The model can still move fast on diagnostics, but privilege transitions become explicit and auditable.\n\n## Installation\n\n```bash\npip install mirastack-redfish-mcp\n```\n\n## Try it in 60 seconds (no hardware)\n\nRun a local DMTF mockup, start the MCP server in read-only mode, and call a read tool:\n\n```bash\ndocker compose -f examples/mockup/docker-compose.yml up -d\nexport MIRASTACK_REDFISH_HOST=\"http://127.0.0.1:18000\"\nexport MIRASTACK_REDFISH_USERNAME=\"<bmc-username>\"\nexport MIRASTACK_REDFISH_PASSWORD=\"<bmc-password>\"\nexport MIRASTACK_REDFISH_WRITE_MODE=\"off\"\nmirastack-redfish-mcp --transport stdio\n```\n\nExample tool call:\n\n```json\n{\"tool\":\"service_info\",\"arguments\":{}}\n```\n\nExpected output shape:\n\n```json\n{\n  \"endpoint\": \"default\",\n  \"service_root\": {\n    \"@odata.id\": \"/redfish/v1\"\n  },\n  \"capabilities\": {\n    \"redfish_version\": \"...\"\n  }\n}\n```\n\n### Discovery mode\n\nThe server also starts with **zero endpoint credentials** and still serves read-only\ntool discovery (for MCP scanner validation and metadata indexing). In this mode,\nschema/corpus-backed tools continue to work, while BMC-connected tools return a\nconfiguration error that names the required environment variables:\n`MIRASTACK_REDFISH_HOST`, `MIRASTACK_REDFISH_USERNAME`, and\n`MIRASTACK_REDFISH_PASSWORD` (or `MIRASTACK_REDFISH_PASSWORD_FILE`), or\n`MIRASTACK_REDFISH_ENDPOINTS` for multi-endpoint setup.\n\nDiscovery mode also covers a **missing endpoints file**. If `MIRASTACK_REDFISH_ENDPOINTS`\npoints at a path that does not exist - which is how container platforms and MCP directory\nscanners inject a placeholder - the server logs a warning naming that path on stderr and\nstarts with zero endpoints. A file that *does* exist but cannot be read or parsed remains a\nhard startup failure, and a partially configured single endpoint (for example\n`MIRASTACK_REDFISH_HOST` without `MIRASTACK_REDFISH_PASSWORD`) still raises, so a typo can\nnever silently downgrade a configured deployment.\n\n## Quick Start (hardware, stdio)\n\n```bash\nexport MIRASTACK_REDFISH_HOST=\"https://192.0.2.10\"\nexport MIRASTACK_REDFISH_USERNAME=\"<bmc-username>\"\nexport MIRASTACK_REDFISH_PASSWORD=\"<bmc-password>\"\nexport MIRASTACK_REDFISH_WRITE_MODE=\"off\"\nmirastack-redfish-mcp --transport stdio\n```\n\n## Quick Start (streamable-http)\n\n```bash\nmirastack-redfish-mcp \\\n  --transport streamable-http \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --path /mcp \\\n  --stateless-http \\\n  --json-response\n```\n\n> **Warning:** binding to `0.0.0.0` exposes BMC control to every host that can reach this port. Bind to loopback unless the listener sits behind an authenticating proxy on a trusted management network.\n\n## Configuration\n\n### Canonical environment variables\n\nUse `MIRASTACK_REDFISH_*` variables:\n\n- `MIRASTACK_REDFISH_HOST`\n- `MIRASTACK_REDFISH_USERNAME`\n- `MIRASTACK_REDFISH_PASSWORD` or `MIRASTACK_REDFISH_PASSWORD_FILE`\n- optional: `MIRASTACK_REDFISH_VERIFY_SSL` (**default: `true`**), `MIRASTACK_REDFISH_CA_BUNDLE`, `MIRASTACK_REDFISH_TIMEOUT_SEC`, `MIRASTACK_REDFISH_AUTH_MODE`\n\n### Multi-endpoint configuration\n\nSet `MIRASTACK_REDFISH_ENDPOINTS` to inline JSON or a YAML/JSON file:\n\n```json\n{\n  \"idrac-prod\": {\n    \"base_url\": \"https://192.0.2.10\",\n    \"username\": \"<bmc-username>\",\n    \"password_file\": \"/run/secrets/idrac_password\",\n    \"verify_ssl\": true,\n    \"read_only\": true\n  },\n  \"ilo-lab\": {\n    \"base_url\": \"https://192.0.2.11\",\n    \"username\": \"<bmc-username>\",\n    \"password\": \"<bmc-password>\",\n    \"verify_ssl\": true\n  }\n}\n```\n\nLab-only override (not recommended for production):\n\n```json\n{\n  \"ilo-lab\": {\n    \"verify_ssl\": false\n  }\n}\n```\n\nSet `MIRASTACK_REDFISH_DEFAULT_ENDPOINT` to choose the default endpoint.\n\n### Compatibility\n\nLegacy bare `REDFISH_*` environment variables are still read as a fallback, with a one-time deprecation warning per variable.\n\n### Tool registration profile\n\n- `MIRASTACK_REDFISH_TOOL_PROFILE=full` (default): all toolsets allowed by write mode.\n- `MIRASTACK_REDFISH_TOOL_PROFILE=standard`: excludes raw write escape hatches.\n- `MIRASTACK_REDFISH_TOOL_PROFILE=core`: curated 15-tool small-model surface.\n- `MIRASTACK_REDFISH_TOOLSETS` (comma-separated) overrides profiles with explicit toolsets.\n\nMeasured advertised tool-schema payload at `MIRASTACK_REDFISH_WRITE_MODE=full`: core 20,795 bytes (15 tools), standard 43,669 bytes (33 tools), full 54,745 bytes (40 tools). Re-measure with `python3 scripts/check_tool_metadata.py --sizes`.\n\n## Write Safety Model\n\n- `MIRASTACK_REDFISH_WRITE_MODE=off` (default): mutating tools are not registered.\n- `MIRASTACK_REDFISH_WRITE_MODE=power`: power/reset/boot control tools are registered.\n- `MIRASTACK_REDFISH_WRITE_MODE=config`: config-tier tools are registered.\n- `MIRASTACK_REDFISH_WRITE_MODE=full`: full-tier tools are registered.\n\nEvery mutating tool accepts `confirm`:\n\n- `confirm=false`: dry-run response (`dry_run=true`, `applied=false`) with `next_step`.\n- `confirm=true`: action is applied.\n\nPer-endpoint `read_only=true` overrides global write mode and blocks all writes on that endpoint.\n\n### Tier contract\n\n- **Power tier:** `set_power_state`, `set_boot_override`, `reset_manager`, `cancel_task`\n- **Config tier:** `set_bios_attributes`, `eject_virtual_media`, `redfish_patch`, `redfish_post`, `redfish_delete`, `redfish_invoke_action`\n- **Full tier:** `insert_virtual_media`, `clear_logs`, `manage_account`, `simple_update`, `reset_to_defaults`\n\n## Development\n\n```bash\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -e .[dev]\nmake build-index\nmake verify\n```\n\nThe schema index is generated from DMTF Redfish-Publications, pinned to one release for reproducibility. See [CONTRIBUTING.md](CONTRIBUTING.md#schema-corpus) for refresh procedure.\n\n## Registry Publishing Notes\n\n- `server.json` includes PyPI and OCI package definitions for MCP Registry.\n- This README carries the required marker: `mcp-name: ai.mirastacklabs/mirastack-redfish-mcp`.\n- Docker image includes the `io.modelcontextprotocol.server.name` OCI label.\n- Install the official publisher CLI via Homebrew: `brew install mcp-publisher`.\n- Do not use `npx mcp-publisher` or `pip install mcp-publisher` for registry publishing.\n\n## Container and directory deployments\n\nThe published image puts the console script on `PATH`, so `docker run ... mirastack-redfish-mcp --transport stdio` works unchanged.\n\nSome MCP directories ignore the repository [Dockerfile](Dockerfile) and generate their own image from source. If that generated build installs with `uv sync`, the project lands in a virtualenv at `/app/.venv` and the console script is **not** on `PATH`, so a launcher that spawns the bare name fails with `ENOENT`. Point the launcher at the absolute path instead:\n\n```json\n{\n  \"buildSteps\": [\"uv sync\"],\n  \"cmdArguments\": [\"/app/.venv/bin/mirastack-redfish-mcp\", \"--transport\", \"stdio\"]\n}\n```\n\nA placeholder `MIRASTACK_REDFISH_ENDPOINTS` path that the platform never creates is safe - the server starts in discovery mode and serves the read-only tool surface.\n\n## Contributing\n\nGitHub is a public **read-only mirror**. Issues are welcome on GitHub, but pull requests opened on GitHub cannot be merged. See [CONTRIBUTING.md](CONTRIBUTING.md) for accepted contribution paths.\n\n## Security\n\nSee [SECURITY.md](SECURITY.md).\n\n## License\n\nApache-2.0.\n",
  "bytes": 9046,
  "sha": "e1dee82c31b0d85408c6764f2696f8d3908c5765964553b08859d1a6178500db",
  "repo_slug": "mirastacklabs-ai/mirastack-redfish-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_ai_mirastacklabs_mirastack_redfish_mcp_aa989ffd/readme"
}