Model Context Protocol sidecar for a local Nodel runtime. This release is an
independent unsupported preview (v0.1.x), is not affiliated with Museum Victoria,
and does not imply upstream endorsement.
The source and release repository is mcartmel/nodel-mcp.
For compatibility, the v0.1 runtime, package, service, state paths, and release
artifacts remain named nodel-ai.
Clone the repository for development:
git clone https://github.com/mcartmel/nodel-mcp.gitReleased archives and checksums are published on the GitHub Releases page.
- Supported shape: Linux + Node.js 22, with
systemdas the supported service manager. - Support status: unsupported public preview, no SLA, and no commitment to review issues or pull requests.
- Security posture: single-operator deployment patterns only (not multi-user, multi-tenant).
- Compatibility stance: pre-1.0 MCP/HTTP interface; patch releases should avoid intentional breaking changes, while minor releases may break with notes.
- Nodel baseline: 2.2.1.542 is the validated baseline compatibility target; other versions are best effort until listed in the compatibility matrix.
The v0.1 release path is a versioned GitHub Release archive. Extract it and run the precompiled application without a build. Before starting, choose the Nodel runtime to connect to and whether this sidecar should expose write tools.
-
Extract
nodel-ai-v<version>.tar.gzand enter its directory. -
Install production dependencies:
npm ci --omit=dev
-
Copy the example environment:
cp .env.example .env
-
Set the primary Nodel runtime in
.env.If Nodel and this sidecar run on the same host, keep the default:
NODEL_BASE_URL=http://127.0.0.1:8085
If Nodel runs on another trusted host, replace it with that host's reachable REST base URL, for example:
NODEL_BASE_URL=http://nodel-host.example.internal:8085
127.0.0.1always means the sidecar's own network namespace. When running the sidecar in a container or on another machine, use an address it can actually reach. Do not pointNODEL_BASE_URLat an untrusted service or expose Nodel's REST port directly to an untrusted network. -
Choose an access mode in
.env.No changes are required for read-only operation. To enable parameter, binding, recipe/file, and action writes while retaining short-lived operator approvals, set:
NODEL_ENABLE_WRITES=true NODEL_REQUIRE_WRITE_APPROVAL=true
Create and restart operations require one additional gate:
NODEL_ENABLE_NODE_LIFECYCLE=true
Deletion is a separate, cumulative opt-in and requires all three gates:
NODEL_ENABLE_WRITES=true NODEL_ENABLE_NODE_LIFECYCLE=true NODEL_ENABLE_DELETES=true NODEL_REQUIRE_WRITE_APPROVAL=true
Keep
NODEL_REQUIRE_WRITE_APPROVAL=truefor normal operation. Approval IDs are workflow controls, not authentication; keep the MCP listener loopback-only or configure the token and reverse-proxy protections described below. -
Start the service:
node dist/index.js
-
Confirm sidecar liveness and connectivity to the configured Nodel runtime:
curl -s http://127.0.0.1:8765/healthz curl -s http://127.0.0.1:8765/readyz
/healthzconfirms that the sidecar is running./readyzconfirms that it can reachNODEL_BASE_URL. Add the configured bearer token whenNODEL_MCP_TOKENis set.
For non-loopback access, use the tested Caddy renderer documented in
docs/operations.md. Caddy is never bundled or
auto-installed; keep the out-of-band token in a 0600 .env.
Host warning: this host currently exposes plaintext/basic-auth 8080 and
unauthenticated 8085. The host is not secure until those listeners are
firewalled or rebound; the renderer only warns.
The service is read-only by default. Write, lifecycle, and delete capabilities are enabled independently and cumulatively through the gates above.
Release downloads also include SHA256SUMS, SBOM.cdx.json,
dependency-licenses.json, and ARTIFACT-MANIFEST.json. These files are both
inside the archive and attached as separate draft-release assets; checksums cover
all of them except SHA256SUMS itself.
| Variable | Default | Purpose |
|---|---|---|
NODEL_BASE_URL |
http://127.0.0.1:8085 |
Primary trusted Nodel REST base URL; defaults to Nodel in the sidecar's host/network namespace |
MCP_BIND_ADDRESS |
127.0.0.1 |
Listener bind address |
MCP_PORT |
8765 |
Listener port |
NODEL_MCP_TOKEN |
unset | Inbound bearer token for /mcp and /readyz |
MCP_ALLOWED_ORIGINS |
unset | Exact allowed browser Origins for HTTP requests |
NODEL_ALLOWED_RUNTIME_ORIGINS |
unset | Exact allowed runtime origins for explicit runtimeUrl operations. The NODEL_BASE_URL origin is always allowed. |
NODEL_STATE_DIR |
.state |
Persistent approval/audit/backup state |
NODEL_ENABLE_WRITES |
false |
Enable maintenance writes/actions |
NODEL_ENABLE_NODE_LIFECYCLE |
false |
Enable create_node/restart_node when writes are enabled |
NODEL_ENABLE_DELETES |
false |
Enable delete_node with lifecycle + writes |
NODEL_REQUIRE_WRITE_APPROVAL |
true |
Require workflow approval ids for writes |
Set additional request/retention limits as needed:
MCP_REQUEST_BODY_LIMIT_BYTES(default: 1048576)NODEL_AUDIT_MAX_BYTES(default: 10485760)NODEL_AUDIT_RETENTION_FILES(default: 5)NODEL_BACKUP_RETENTION_DAYS(default: 30)NODEL_BACKUP_RETENTION_PER_NODE_KIND(default: 50)
NODEL_ENABLE_WRITES=false
NODEL_ENABLE_NODE_LIFECYCLE=false
NODEL_ENABLE_DELETES=false
NODEL_REQUIRE_WRITE_APPROVAL=trueNODEL_ENABLE_WRITES=true
NODEL_ENABLE_NODE_LIFECYCLE=false
NODEL_ENABLE_DELETES=false
NODEL_REQUIRE_WRITE_APPROVAL=trueNODEL_ENABLE_WRITES=true
NODEL_ENABLE_NODE_LIFECYCLE=true
NODEL_ENABLE_DELETES=false
NODEL_REQUIRE_WRITE_APPROVAL=true# Writes + lifecycle + deletes + approval must all be enabled for delete mode
NODEL_ENABLE_WRITES=true
NODEL_ENABLE_NODE_LIFECYCLE=true
NODEL_ENABLE_DELETES=true
NODEL_REQUIRE_WRITE_APPROVAL=trueWrites remain experimental and require operator workflow discipline.
- Loopback use (
127.0.0.1) is the direct mode. For any non-loopback bind, configure a high-entropyNODEL_MCP_TOKENand set a strictMCP_ALLOWED_ORIGINSallowlist. - The sidecar rejects arbitrary caller-supplied hostnames and only contacts configured/local-discovered endpoints.
- Use a reverse proxy for transport hardening where needed; this component does not provide TLS termination.
If NODEL_MCP_TOKEN is present, send this header on MCP requests:
Authorization: Bearer <NODEL_MCP_TOKEN>GET /healthz: unauthenticated liveness with minimal fields (ok,version).GET /readyz: protected Nodel readiness probe.POST /mcp: MCP Streamable HTTP endpoint behind token/origin policies.
When a token is configured, unauthenticated /mcp and /readyz requests must
return 401; /healthz is the unauthenticated 200 preflight.
This project treats write approval as a human workflow control, not a security boundary. Operational flow is:
read/proposeordryRun- Operator review and confirmation
nodel.approve_writeas a fallback when MCP elicitation is unavailable- Apply tool with
approvalId - Read-back / readiness verification based on tool capability
nodel.request_write_approval is the MCP-native path when supported by the
client and falls back to manual confirmation guidance when unsupported.
A release may be run directly (node dist/index.js) or under systemd.
The system installer supports configurable paths:
- App directory: configurable (example
/opt/nodel-ai) - Env file: configurable (example
/etc/nodel-ai.env) - State directory: configurable (example
/var/lib/nodel-ai)
The user and system installers render units with configurable paths and service
account. User defaults use the extracted directory, .env, and .state; system
defaults use /opt/nodel-ai, /etc/nodel-ai.env, and /var/lib/nodel-ai.
scripts/install-systemd-user.shscripts/install-systemd-system.sh
For service guidance and recovery steps (backups, log interpretation, upgrade,
rollback, health/readiness, and turning writes back off), see
docs/operations.md.
The README no longer maintains a manual tool list. Use the generated reference to avoid drift:
The list is generated from canonical tool definitions and includes capability, stability, and gate information.
Point MCP clients at http://127.0.0.1:8765/mcp for local testing.
{
"mcp": {
"nodel": {
"type": "remote",
"url": "http://127.0.0.1:8765/mcp"
}
}
}Add bearer auth in the MCP client only when NODEL_MCP_TOKEN is configured.
Codex clients should use bearer_token_env_var = "NODEL_MCP_TOKEN", never a
literal token in client configuration.
docs/architecture.md: trust boundaries and contract modeldocs/security-model.md: security assumptions and failure modeldocs/operations.md: operational runbooksdocs/operations.md#trusted-reverse-proxy-tls-example-caddy: tested Caddy renderer and rollout workflowdocs/migration-v0.1.md: migration from an earlier local build tov0.1.xdocs/releasing.md: maintainer release procedureSUPPORT.md,SECURITY.md,CHANGELOG.md,THIRD_PARTY_NOTICES.md
Before 1.0.0, patch releases should avoid intentional breaking changes.
Before enabling writes, complete the migration checklist in
docs/migration-v0.1.md.