Deploy Sirius MCP
Run the Sirius MCP server locally. Solo use is free: no license key is required.
Two install paths, pick one:
npx(default quick-start) — for Claude Code / Cursor / OpenCode users who want the simplest path. No Docker.- Docker — for persistent, VPS or team-hosted deployments.
1. Quick start with npx#
Prerequisites
- Node.js 22 or newer (installing Node also installs
npm, which providesnpx). - Nothing else for solo use (no Docker, no license file, no account).
Missing Node? If you see command not found: npx (macOS/Linux) or 'npx' is not recognized (Windows), the prerequisite is Node itself: install it from https://nodejs.org (any LTS version ≥ 22), reopen your terminal, then continue below. npx is a part of npm, which ships with Node — there is no separate install step.
MCP client config
Add one short entry to your MCP client config. No path variables, no multi-line commands.
mcpServers — Claude Code (.mcp.json / ~/.claude.json), Cursor, Antigravity, Windsurf
{
"mcpServers": {
"sirius": {
"command": "npx",
"args": ["-y", "@sirius-mcp/mcp"]
}
}
}
mcp — OpenCode (opencode.json)
{
"mcp": {
"sirius": {
"type": "local",
"command": ["npx", "-y", "@sirius-mcp/mcp"],
"enabled": true
}
}
}
-y answers the one-time "install package?" prompt automatically so the client startup never blocks. npx re-resolves the latest published version from the npm registry on every run — verified on npm 11.16.0 (Node 24.18.0, 2026-08-25): each invocation revalidates the package against the registry, so an unpinned npx @sirius-mcp/mcp always starts the newest release; appending @latest is not required.
Prefer a persistent sirius-mcp command instead of npx? Install globally with npm i -g @sirius-mcp/mcp.
Verify
Ask your agent to run context_list. If it returns documents, Sirius is installed and working.
2. Docker — persistent / VPS / team-hosted#
The Docker path is fully supported and is the recommended option when you want an immutable, version-pinned deployment (a VPS, a shared host, or a team running the same image). Use npx for quick personal installs instead.
Prerequisites
- Docker installed and running
- Nothing else for solo use (no Node.js, no license file, no account)
Install with docker run
One copy-paste command. MCP uses JSON-RPC over stdin/stdout, so -i is required. The optional port mapping (-p 127.0.0.1:4200:4200) exposes the embedded Living Architecture Web Portal. --pull=always re-fetches the image on every start so :latest never goes stale.
docker run -i --rm \
--pull=always \
-p 127.0.0.1:4200:4200 \
-v "$PWD:/project" \
-e SIRIUS_PROJECT_ROOT=/project \
ghcr.io/sirius-mcp/sirius-mcp:latest
- Bind-mounts the current directory to
/projectinside the container - Sets
SIRIUS_PROJECT_ROOTso the.context/store lives on the host - Publishes port
4200locally (127.0.0.1:4200) to access the Living Architecture Web Portal in your browser - Runs as non-root (
node, uid 1000) - Pin a release with a semver tag instead of
latestwhen you need a fixed version (see Versioning)
--pull=always and registry outages (verified behavior)
Verified empirically on Docker 29.7.2 (client and server, 2026-08-25): when the registry is unreachable, docker run --pull=always fails hard (exit code 125, failed to resolve reference) — it does not fall back to the locally cached image. The same happens when the remote tag does not exist yet, even if a matching image is cached locally. This is fail-closed, not fail-open.
If a registry outage must not break your session starts, use the explicit fallback (pull first, ignore failure, then run from cache):
docker pull ghcr.io/sirius-mcp/sirius-mcp:latest || true
docker run -i --rm \
-v "$PWD:/project" \
-e SIRIUS_PROJECT_ROOT=/project \
ghcr.io/sirius-mcp/sirius-mcp:latest
docker pull refreshes the cached image when the registry is reachable; || true keeps the session alive from cache when it is not.
Equivalent docker-compose.yml
Compose is useful for local validation. It is not a 24/7 daemon: the server is interactive stdio. Real MCP clients should use docker run -i (or the client config snippets below). pull_policy: always is the Compose equivalent of --pull=always; it has the same fail-closed behavior on registry outages described above (prepend a docker compose pull || true if you need the fallback).
services:
sirius:
image: ghcr.io/sirius-mcp/sirius-mcp:latest
pull_policy: always
container_name: sirius
stdin_open: true
tty: true
ports:
- "127.0.0.1:4200:4200"
environment:
- SIRIUS_PROJECT_ROOT=/project
- SIRIUS_WEB_PORTAL=1
- SIRIUS_WEB_PORT=4200
- SIRIUS_HOST=0.0.0.0
volumes:
- .:/project
restart: "no"
docker compose up
3. Environment variables#
Solo
| Name | Required? | Default | What it does |
|---|---|---|---|
SIRIUS_PROJECT_ROOT | No | process cwd | Project directory that holds the .context/ store |
SIRIUS_AUTO_UPDATE | No | enabled | Set to disabled to turn off outbound update checks (zero network) |
SIRIUS_UPDATE_INTERVAL_HOURS | No | 24 | Hours between update checks when auto-update is enabled |
SIRIUS_RELEASE_ENDPOINT | No | https://api.siriusmcp.dev/api/releases/latest | Public release endpoint (no token required), served by the Sirius API with npm as the upstream source. The check runs by default against this endpoint; the check is non-blocking and silent on failure. Override to point at your own endpoint, or combine with SIRIUS_AUTO_UPDATE=disabled for zero network |
Living Architecture Web Portal (Phase 2)
| Name | Required? | Default | What it does |
|---|---|---|---|
SIRIUS_WEB_PORTAL | No | 1 | Set to 0 to disable the embedded HTTP server serving the Web Portal UI. SIRIUS_UI=0 is an equivalent alias; --no-ui works on the CLI |
SIRIUS_WEB_PORT | No | 4200 | Local port for the Web Portal UI (http://127.0.0.1:4200) |
SIRIUS_PORT | No | 4200 | Alias for the portal port — takes precedence over SIRIUS_WEB_PORT when both are set |
SIRIUS_HOST | No | 127.0.0.1 | Loopback bind address (0.0.0.0 inside container) |
File watcher and crawler (Phase 2)
| Name | Required? | Default | What it does |
|---|---|---|---|
SIRIUS_WATCH_ENABLED | No | 1 | Set to 0 to disable the file watcher; manual reindex keeps working |
SIRIUS_WATCH_STRATEGY | No | auto | auto | poll | native. On Windows and inside Docker, native is ignored (polling is always used there). poll forces polling everywhere; native only has effect on bare-metal macOS/Linux |
SIRIUS_WATCH_INTERVAL_MS | No | 1000 | Polling interval (= T/2; T is the freshness target). Clamped to a minimum of 100 ms |
SIRIUS_WATCH_DEBOUNCE_MS | No | 400 | Debounce window before watched changes are applied to the index |
SIRIUS_WATCH_BURST_THRESHOLD | No | 50 | More than this many events in one debounce window triggers a full reindex (with a 5 s burst cooldown) |
SIRIUS_CRAWL_MAX_FILE_BYTES | No | 1048576 | Files larger than this are excluded from context_crawl |
Vector search and embeddings (optional)
| Name | Required? | Default | What it does |
|---|---|---|---|
SIRIUS_VECTOR | No | 1 | Set to 0 to disable vector search entirely (kill-switch, forcing lexical-only FTS5 search) |
SIRIUS_EMBEDDINGS_DIR | No | ~/.sirius/embeddings | Custom directory path for libraries and ONNX model weights. Always use an absolute path in MCP client configs, as relative paths resolve against the client launch directory. |
SIRIUS_EMBEDDINGS_MIRROR | No | unset | Base URL override for downloading model assets from a custom or internal mirror |
Enterprise (not needed for solo use)
| Name | Required? | Default | What it does |
|---|---|---|---|
SIRIUS_LICENSE_KEY | No | unset | Enterprise license key. When unset, the server runs in free solo mode (all core tools allowed; no license file; no license network calls) |
SIRIUS_LICENSE_HARD_GATE | No | unset | Set to 1 to block read tools when the license is not active/grace. Without a SIRIUS_LICENSE_KEY, this is a no-op — solo mode ignores it |
SIRIUS_LICENSE_OFFLINE | No | unset | Set to 1 with a license key to validate against a local encrypted license file instead of phone-home |
SIRIUS_LICENSE_GRACE_DAYS | No | 7 | Grace period after last successful validation (enterprise) |
SIRIUS_LICENSE_ENFORCE | No | unset | Enterprise enforcement flag; without a SIRIUS_LICENSE_KEY, solo mode still applies |
The phone-home validation URL is a real setting today: SIRIUS_LICENSE_SERVER_URL (defaults to a development placeholder). The production validation URL is issued with the enterprise license.
4. MCP client configuration#
Two supported commands, same MCP protocol. Pick the envelope that matches your client.
npxcommand:npx -y @sirius-mcp/mcp— always runs the latest published release (see Quick start).- Docker command:
docker run -i --rm --pull=always -v "${workspaceFolder}:/project" -e SIRIUS_PROJECT_ROOT=/project ghcr.io/sirius-mcp/sirius-mcp:latest— replace${workspaceFolder}with your project path if the client does not expand that variable.
mcpServers — Claude Code, Cursor
{
"mcpServers": {
"sirius": {
"command": "npx",
"args": ["-y", "@sirius-mcp/mcp"]
}
}
}
Docker variant:
{
"mcpServers": {
"sirius": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"--pull=always",
"-v", "${workspaceFolder}:/project",
"-e", "SIRIUS_PROJECT_ROOT=/project",
"ghcr.io/sirius-mcp/sirius-mcp:latest"
]
}
}
}
mcp — OpenCode
{
"mcp": {
"sirius": {
"type": "local",
"command": ["npx", "-y", "@sirius-mcp/mcp"],
"enabled": true
}
}
}
Docker variant:
{
"mcp": {
"sirius": {
"type": "local",
"command": ["docker", "run", "-i", "--rm", "--pull=always", "-v", "${workspaceFolder}:/project", "-e", "SIRIUS_PROJECT_ROOT=/project", "ghcr.io/sirius-mcp/sirius-mcp:latest"],
"enabled": true
}
}
}
| Client | Config file | Format | Status |
|---|---|---|---|
| Claude Code | .mcp.json (project) or ~/.claude.json (user) | mcpServers | verified |
| OpenCode | opencode.json (project root) | mcp | verified |
| Antigravity CLI | agy MCP config / sidecars | mcpServers | verified |
| Cursor | .cursor/mcp.json | mcpServers | verified |
| Windsurf | ~/.codeium/windsurf/mcp_config.json | mcpServers | verified |
Tip (Web Portal): To open the Living Architecture Web Portal in your browser while your agent works, add
"-p", "127.0.0.1:4200:4200"to theargsarray inmcpServersorcommandinopencode.json.
5. Bootstrap & Smoke test#
Note: The JSON-RPC payloads below illustrate the underlying MCP wire protocol for debugging. In your day-to-day workflow, you can simply ask your coding agent (Claude Code, Cursor, OpenCode, Windsurf, Antigravity) to initialize the store or crawl the repository.
Initialize or Bootstrap an Existing Project
-
New project: Run
project_initto create a fresh.context/store:json{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"project_init","arguments":{}}} -
Existing (Brownfield) codebase bootstrap: Run
context_crawlto scan and ingest documentation intodraftdocuments:json{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"context_crawl","arguments":{"path":"."}}}Supported Ecosystems & Manifests:
- JavaScript / TypeScript:
package.json - Java:
pom.xml,build.gradle,build.gradle.kts,settings.gradle,settings.gradle.kts - C# / .NET:
*.csproj,*.sln - Python:
pyproject.toml,setup.py,setup.cfg,requirements.txt,Pipfile - Go:
go.mod,go.work - Rust:
Cargo.toml
- JavaScript / TypeScript:
-
Verify Context: List documents in your store:
json{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"context_list","arguments":{}}} -
Local FTS5 Search: Query architectural patterns and decisions using fast full-text search:
json{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"context_search","arguments":{"query":"auth flow tenant isolation"}}}
Living Architecture Web Portal
When port 4200 is forwarded (-p 127.0.0.1:4200:4200), open http://127.0.0.1:4200 to interact with:
- Interactive D3 Topology Canvas: Visual dependency graph of all system components, decisions, features, and business rules with multi-LOD rendering.
- Document Inspector & Markdown Reader: Instant preview with YAML frontmatter HUD, Invariants Box, Boundaries Box, and Mermaid diagram visualization.
- Search Modal (
⌘K/Ctrl+K): Real-time full-text search across all documents. - SSE Status Beacon (
/api/events): Real-time live reload when files in.context/change.
If port 4200 is busy, the portal retries the next consecutive ports (up to 4209) — the URL actually bound appears in the boot log and in the context://system/web-portal resource.
Real-Time Indexing (File Watcher)
Sirius includes a native File Watcher (SIRIUS_WATCH_ENABLED=1). Any manual edits to .context/ markdown files are automatically detected and indexed into SQLite FTS5 in ≤ 2 seconds. You no longer need to call reindex manually during normal editing.
6. Volume permissions (Docker)#
The container runs as uid 1000. If the host directory is not writable by that uid, project_init and context_upsert fail with EACCES.
Two ways to fix it:
# Run the container as your own uid/gid (works on Linux and macOS)
docker run -i --rm --pull=always --user "$(id -u):$(id -g)" \
-v "$PWD:/project" \
-e SIRIUS_PROJECT_ROOT=/project \
ghcr.io/sirius-mcp/sirius-mcp:latest
# Or make the directory writable by the container's uid
chown -R 1000:1000 "$PWD"
Docker Desktop on Windows usually handles permissions via the VM, but WSL2 volumes may need the same chown inside the WSL distribution.
7. Air-gap / offline mode#
Solo use checks for updates by default (the release endpoint now has a default, see Environment variables). To run fully air-gapped, set SIRIUS_AUTO_UPDATE=disabled and leave SIRIUS_LICENSE_KEY unset: no update check runs and no license phone-home runs. A docker run with that configuration makes no outbound calls beyond pulling the image itself.
- Local SQLite FTS5 Full-Text Search: Runs 100% in-process with SQLite FTS5 lexical indexing. Zero external network egress, zero API keys required.
- Web Portal Zero-Egress Invariant: All UI assets, textures, and fonts (
Newsreader,Inter,JetBrains Mono) are packaged locally with immutable caching (NFR-SEC-03). Zero external font or CDN calls. - Anti-DNS Rebinding Security: The embedded web server enforces strict Host/Origin header validation on loopback addresses (
NFR-SEC-02), rejecting external rebinding with HTTP 403.
Enterprise deployments can go further:
SIRIUS_LICENSE_OFFLINE=1(requires aSIRIUS_LICENSE_KEY): validates against a local encrypted license file instead of phone-home. Without a key it is a no-op — solo mode already makes no license calls.SIRIUS_AUTO_UPDATE=disabledturns off update checks explicitly.
In air-gap mode, apply updates by pulling a newer image tag (see Versioning) or reinstalling the npm package; the in-process update check will not run.
8. Privacy guarantees#
Sirius does not send project names, document contents, file paths, or logs to any outbound endpoint. The only network requests it can make are:
- Auto-update check:
GETto the release endpoint with query parameters limited toversionandarch. In solo mode (SIRIUS_LICENSE_KEYunset), onlyversionandarchare sent; with a license key,licenseKeyis added. If the primary release endpoint is unreachable, the check falls back tohttps://registry.npmjs.org/@sirius-mcp/mcp/latest. WithSIRIUS_AUTO_UPDATE=disabled, neither request runs. - License validation (enterprise builds only): a lightweight check sending
licenseKey, an anonymousinstanceFingerprint(one-way hash of machine identity), andversion. Solo mode performs no license validation and sends no license data.
Customer, subscription, and email data are never transmitted from the MCP runtime.
9. Versioning#
Published image: ghcr.io/sirius-mcp/sirius-mcp · Published npm package: @sirius-mcp/mcp (on npm since v1.4.0 — older tags are GHCR-only)
| Tag | Meaning |
|---|---|
latest | Most recent successful publish from a version tag |
vX.Y.Z | Immutable semver release (e.g. v1.0.0) |
Prefer a semver tag in production or shared environments so pulls stay reproducible. Use latest for quick local trials. The npm path always resolves the latest published release (npx re-validates on every run — see Quick start).
Images are published on git tags matching v*.*.*; each publish also updates latest. The same tag publishes the npm package, so a release reaches both registries in one pipeline.
Updating: pull a newer tag and recreate the container:
docker pull ghcr.io/sirius-mcp/sirius-mcp:vX.Y.Z
Updates never touch the .context/ store. If you run from source as a contributor, see CONTRIBUTING.md for the bare-metal workflow, including the sidecar update script.
10. Embeddings (optional)#
Sirius supports local hybrid vector search combining semantic embeddings with lexical SQLite FTS5 through Reciprocal Rank Fusion (RRF). Semantic vector search runs entirely on your machine using ONNX Runtime with quantized Xenova/multilingual-e5-small embeddings (384 dimensions) — no remote API calls, no token fees, zero telemetry.
Setup
On the npm path, embedding libraries and models are opt-in to keep the default package lean. To enable vector search:
# If installed globally:
sirius-mcp setup embeddings
# Or via npx:
npx @sirius-mcp/mcp setup embeddings
The command installs @huggingface/[email protected] into the embeddings vendor directory (~/.sirius/embeddings), downloads the model weights at the pinned revision, and runs a functional smoke test.
To verify your runtime status:
sirius-mcp doctor
Disk footprint
The embedding runtime requires approximately ~430 MB of disk space:
- ~230 MB for the transformer runtime and ONNX execution libraries.
- ~195 MB for the quantized multilingual E5 model weights and tokenizer files.
Docker tier (batteries-included)
The official Docker image (ghcr.io/sirius-mcp/sirius-mcp:latest) comes with the embedding runtime and model weights pre-seeded at /home/node/.sirius/embeddings. Containers start in the ready state out-of-the-box without requiring any post-install download.
Air-gapped and enterprise pre-seed
In air-gapped environments without internet access:
-
Run
sirius-mcp setup embeddingson an internet-connected machine. -
Copy the resulting directory (default:
~/.sirius/embeddings) to the offline environment. -
Configure the
SIRIUS_EMBEDDINGS_DIRenvironment variable to point to the shared vendor directory:bashexport SIRIUS_EMBEDDINGS_DIR=/opt/sirius/embeddingsImportant: Always specify an absolute path for
SIRIUS_EMBEDDINGS_DIRin IDE and MCP client configuration files. Relative paths resolve against whichever working directory the host MCP client spawns the Node.js process from (often the user home directory or IDE install location, not the project root).
Custom mirror override
If your organization hosts HuggingFace model assets on an internal mirror or proxy, configure the base URL with:
export SIRIUS_EMBEDDINGS_MIRROR="https://hf-mirror.corp.internal"
sirius-mcp setup embeddings
Kill-switch
To disable vector search at runtime and force lexical-only FTS5 search:
export SIRIUS_VECTOR=0
Honest degradation
Vector search is strictly optional. If the embedding runtime is absent, incomplete, or uninstalled, Sirius automatically operates in lexical-only FTS5 mode. Search queries never fail or throw errors due to missing vector dependencies.
11. Troubleshooting#
command not found: npx/'npx' is not recognized: Node.js is missing — install Node ≥ 22 from https://nodejs.org, reopen your terminal, retry (see Quick start).- Client startup hangs on a package prompt: use
-yin the npx args (the config snippets above already include it). - No response from MCP client (Docker): ensure
-iis present and the client is attached to the container stdin/stdout. docker run --pull=alwaysfails withfailed to resolve referenceduring a registry outage:--pull=alwaysis fail-closed (verified on Docker 29.7.2) — use thedocker pull ... || truefallback documented in Docker.EACCESon.context/: uid 1000 inside the container cannot write the host volume. Run with--user "$(id -u):$(id -g)"orchown -R 1000:1000 "$PWD"(see Volume permissions).better-sqlite3native errors (Docker): the image builds the native module for Alpine musl. If you rebuild the image on a different base, delete the hostsirius-mcp/node_modulesand rebuild. On the npm path,better-sqlite3fetches a prebuilt binary automatically; a local compile only happens on platforms it does not prebuild for, which needs a C++ toolchain.
12. Changelog and Release Notes#
Versioned, dated publication history. If you are returning to this doc because your instance stopped being updated, this section tells you what you are missing and how far behind you are — no account, login or identification needed.
Public references (no login needed): npm versions — https://www.npmjs.com/package/@sirius-mcp/mcp?activeTab=versions · GHCR image — https://github.com/sirius-mcp/sirius-mcp/pkgs/container/sirius-mcp
| Version | Published | Highlights |
|---|---|---|
| v1.8.0 | 2026-09-14 | Typed links (supersedes, contradicts, causes, fixes), enforcement/block_requested posture fields, comment-mode sirius gate over unified diffs (CI-agnostic); drift report gains typed-link integrity and notices |
| v1.7.0 | 2026-09-14 | Trust-family document fields (stale_after, sources, generated, verified); crawler drafts expire after P30D; read-only sirius drift staleness report |
| v1.6.0 | 2026-09-11 | Precedence Contract document seeded into .context/; sirius snippet routing-snippet generator (opt-in at setup, --status/--remove); new resources context://system/precedence-contract and context://system/query-stats (local query counter) |
| v1.5.2 | 2026-08-28 | Web Portal enabled by default (was opt-in); bounded port-fallback retry on conflict; non-blocking portal start; new context://system/web-portal status resource |
| v1.5.1 | 2026-08-28 | Workspace is the default installer scope; project-relative workspace resolution for Codex CLI, Zed, Continue.dev and Windsurf |
| v1.5.0 | 2026-08-27 | Interactive setup wizard for 17 targets (10 IDEs + 7 CLIs); non-destructive config patching with backups; headless install/setup/doctor/uninstall |
| v1.4.1 | 2026-08-26 | Shebang on the executable entrypoint fixes Windows npm shims (npx runs instead of opening the file) |
| v1.4.0 | 2026-08-26 | npm distribution (@sirius-mcp/mcp); default-on update check with context://system/update-status resource; npx quick-start leads the deploy docs |
| v1.3.1 | 2026-08-25 | Living Architecture Web Portal aligned with The Carbon Ledger design system; brand assets; air-gap font packaging; topology canvas ergonomics |
| v1.3.0 | 2026-08-24 | Embedded web server on 127.0.0.1:4200; SSE live-reload; watcher scalability |
| v1.2.0 | 2026-08-24 | Crawl adapters for Python, Go and Rust; architecture document type; SVG sanitization in FTS5 |
| v1.1.0 | 2026-08-18 | context_crawl brownfield bootstrap; file watcher; serialized index writer; context://index/status resource; automated release pipeline (kill+boot, GHCR publish) |
| v1.0.2 | 2026-08-14 | Quality gate v2 (complexity/size limits, e2e); deploy guides (EN+PT) synced to the landing; Docker build postinstall fix |
| v1.0.1 | 2026-08-14 | Test coverage and branch fixes (no user-facing changes) |
| v1.0.0 | 2026-07-29 | Public MVP: project init, document CRUD, FTS5 search, resources, reindex, Docker image, air-gap mode, privacy-by-design distribution |
Publication dates come from the git tags in the private sirius-mcp/sirius-mcp-core repository (the public github.com/sirius-mcp/sirius-mcp repo is a placeholder, without docs, releases or tags). Published versions: https://www.npmjs.com/package/@sirius-mcp/mcp?activeTab=versions · GHCR package: https://github.com/sirius-mcp/sirius-mcp/pkgs/container/sirius-mcp.
How to tell which version you are running
- Any client: the MCP
initializehandshake reports the server version — your client logs it on connect (look forversion: "X.Y.Z"). - Docker: the image tag in your config (
docker run ... ghcr.io/sirius-mcp/sirius-mcp:<tag>);latesttracks the newest publish only when combined with--pull=alwaysor an explicitdocker pull. - npm:
npx @sirius-mcp/mcpalways starts the latest published release — see Quick start. - Newer instances (post-fix): the server logs
update available: vX.Y.Zat boot/24h when a newer release exists, and the read-only resourcecontext://system/update-statusexposes the last check of the session (JSON). Instances running these newer builds reuse that existing cadence — no extra mechanism, nothing to configure. - Older instances (pre-fix): no in-binary signal can reach them. This changelog section is the fallback: check your tag against the table above and pull the newest release.
