MCP Local-to-Hosted Deployment Fix
# MCP Local-to-Hosted Deployment Fix
Business story
A local MCP server can work on its author's laptop while a hosted-like client fails because transport, endpoint, authentication, version, and discovery are implicit. This MVP makes one supported path explicit and testable.
Before and after
Before: manual local process, unclear endpoint, unpinned dependencies, vague errors. After: Node 22 server version demo-1, streamable HTTP at /mcp, sandbox bearer token, stable two-tool registry, tenant fixtures, request IDs, deterministic failures, smoke client, reset script, and runbook.
Quick start
No package installation is required or permitted for this demo.
./scripts/reset-demo.sh
./scripts/start-demo.sh
# in another terminal
node runtime/client.mjs
node runtime/run-tests.mjsNormal walkthrough
Health, token issuance, initialize, discovery, tenant-a read, and approval-denied archive are covered by smoke/client.ts. The read returns only tenant-a titles. The write never mutates data and is denied without a request-bound approval string.
Failure walkthrough
Use MCP_FAILURE=timeout ./scripts/start-demo.sh or MCP_FAILURE=unavailable ./scripts/start-demo.sh. The failure matrix is represented by deterministic unit and integration checks in tests/run-tests.mjs.
Test evidence
The dependency-free runner verifies token rejection and expiry, protocol mismatch, discovery, schemas, tenant isolation, approval policy, read, write, and registry behavior. Run it after reset. Logs are JSON lines in logs/events.jsonl and never contain the raw bearer token.
Repository
See docs/architecture.md, docs/compatibility.md, and docs/runbook.md. Intended dependency versions are pinned in package.json; no node_modules is required for the constrained fallback.
Visual demo

Maintained by Kiell Tampubolon. More selected work at kielltampubolon.id.