{
  "markdown": "# Lodging Decision MCP Server (alpha)\n\nNarrow, agent-facing MCP server wrapping PR #25's (`Scenic-Stay/staygraph`, branch\n`agent/scenicgraph-lodging-decision-api`) lodging-decision kernel unmodified. Governed by\n[`gauntlet/projects/decision-intelligence-v0.1/WORK-ORDERS.yaml`](https://github.com/Scenic-Stay/scenic-intelligence/blob/brain/v1.1-rc1-bootstrap/gauntlet/projects/decision-intelligence-v0.1/WORK-ORDERS.yaml)\n(`DI-001-A`) in `Scenic-Stay/scenic-intelligence`. Read that Work Order before changing scope.\n\nLive: `https://di-001-a-lodging-decision-mcp.scenicstay.workers.dev/mcp`\n\nExtracted from `Scenic-Stay/staygraph` (`services/di-001-a-mcp-decision-server/`, branch\n`agent/di-001-a-mcp-decision-server`, commits `8c8f4c7`/`f7df7b3`) into its own public repo so\nGitHub-based MCP discovery (the Official MCP Registry, Glama's crawler) can find it without\nexposing the rest of `staygraph`'s code. That branch is preserved as historical record; deploy\nfrom this repo going forward.\n\n## What this is\n\nOne MCP tool, `lodging_decision`. Callers supply a traveler profile, trip context, and\na list of candidate listings; the tool returns a deterministic, evidence-backed\nrecommendation with score breakdown, tradeoffs, risk flags, missing information, and\nconfidence. It does not search inventory, book, transact, or persist anything.\n\n## Scope\n\nNon-sensitive categories only: budget, location, amenities, quality/reviews,\ncancellation policy, fees, remote-work/family/business/relocation/event trip framing,\nand stated accessibility needs. No Safety & Belonging, Medical Recovery, or\nprotected-characteristic-adjacent input is accepted — see `src/guard.ts`, a\ndefense-in-depth denylist that rejects (does not silently strip) free-text fields\nreferencing a protected characteristic or discriminatory steering criterion, on top of\nthe fact that the underlying kernel has no such fields to begin with.\n\n## Structure\n\n- `src/kernel/` — PR #25's contracts, scorer, validation, and fixtures, copied\n  byte-for-byte (`test/kernel-parity.test.ts` proves this against PR #25's own six\n  tests and committed example fixtures).\n- `src/guard.ts` — the denylist guard described above.\n- `src/worker.ts` — Cloudflare Worker entrypoint: MCP `WebStandardStreamableHTTPServerTransport`\n  at `POST /mcp`, plus a KV-backed soft daily request ceiling and a `/health` check.\n- `test/` — kernel parity tests, guard tests.\n\n## Local development\n\n```bash\nnpm install\nnpm test        # kernel parity + guard tests\nnpm run typecheck\nnpm run dev      # wrangler dev, serves http://127.0.0.1:8787/mcp\n```\n\n## Deploy\n\n```bash\nnpm run deploy   # wrangler deploy\n```\n\nRequires the `DI_001_A_ABUSE_CEILING` KV namespace bound in `wrangler.jsonc` (already\nprovisioned; see the Work Order's execution_result for the namespace ID and actual\nCloudflare cost recorded at deploy time).\n\n## Known limitations (carried over from PR #25, unresolved here)\n\nUnauthenticated, unversioned, no rate limiting beyond the soft daily ceiling, not\ncalibrated against real human booking decisions. Do not expose to untrusted\nhigh-volume traffic without a further hardening decision — see the Work Order's\ncircuit breakers for the manual kill-switch (pull the Worker; delist from all\ndirectories) if abuse signals appear.\n",
  "bytes": 3277,
  "sha": "2866d412716505bb1b8641ea7cfe57a7f57b7625656fdcbd80f36faa49559585",
  "repo_slug": "scenic-stay/lodging-decision-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_scenicstay_lodging_decision_mc_e13e3b13/readme"
}