{
  "markdown": "# crowntowncompost-mcp\n\nMCP server for the **Crown Town Compost** customer portal — check your pickups, invoices, and\nupcoming collection days, skip a service, report a missed pickup, and update your account, all in\nnatural language.\n\n> Developed and maintained by AI (Claude Code). Use at your own discretion.\n\n## What it talks to\n\n`crowntowncompost.com` is a marketing site with no customer data. Everything lives at\n**`portal.crowntowncompost.com`**, a Django app (a white-labeled **StopSuite** hauler platform).\nThis server authenticates server-side with **a session cookie you already hold**, or with **your own\nportal username and password** — a normal form login that returns one — and reads the same pages and\nJSON endpoints the website uses.\nNo browser extension, no bot-wall workaround, no third-party service in the middle.\n\n## Install\n\n```sh\nnpm install -g crowntowncompost-mcp\n```\n\nThen add it to your MCP host. Two configurations work — supply **either** a\nsession cookie you already hold (nothing else needed), **or** the login pair so\nthe server can mint one:\n\n```json\n{\n  \"mcpServers\": {\n    \"crowntowncompost\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"crowntowncompost-mcp\"],\n      \"env\": {\n        \"CROWNTOWN_USERNAME\": \"you@example.com\",\n        \"CROWNTOWN_PASSWORD\": \"your-portal-password\"\n      }\n    }\n  }\n}\n```\n\nTo use a session cookie instead, set `CROWNTOWN_SESSION_COOKIE` to a `Cookie`\nheader value from a signed-in browser session (`sessionid=…; csrftoken=…`) and\nleave the username and password unset. The portal login is then never run, and\nno password is stored anywhere.\n\nSetting both is also valid, and is the most robust configuration: the cookie is\nused first, and when the portal eventually expires it the login quietly mints a\nreplacement. With a cookie alone, an expired session is reported as expired —\nthe server says so plainly rather than claiming nothing is configured.\n\nLocally you can instead copy `.env.example` to `.env`. The server boots without credentials (so a\nhost's install-time probe succeeds); the configuration error surfaces on the first tool call.\n\n## Tools\n\n### Reads\n\n| Tool | What it returns |\n|---|---|\n| `crowntown_healthcheck` | Whether credentials work, plus account status — distinguishes \"no creds\" from \"bad creds\" from \"site error\" |\n| `crowntown_get_dashboard` | Account status, subscription (plan, price, renewal date), next service date, service addresses + pickup days, and your environmental impact |\n| `crowntown_get_account` | Contact details and notification preferences |\n| `crowntown_get_pickup_schedule` | Pickup day(s) and time window per address — the official set-out-by time plus an observed arrival window (earliest/latest/typical, consistent vs varies) derived from your collection history |\n| `crowntown_list_service_history` | Past collection stops — date, outcome, time, weight, services. Paginated; filter by `success`/`missing`/`empty`/`inaccessible`/`unacceptable` |\n| `crowntown_list_upcoming_services` | Upcoming collection days, each with the ids needed to skip it |\n| `crowntown_list_invoices` | Billing history with amounts, status, and Stripe payment links |\n\n### Writes (all confirm-gated)\n\n| Tool | What it does |\n|---|---|\n| `crowntown_skip_service` | Skip or un-skip an upcoming collection day |\n| `crowntown_update_account` | Update contact details / notification preferences |\n| `crowntown_report_missed_pickup` | Report that a collection was missed |\n| `crowntown_contact_support` | Send a message to customer support |\n\nEvery mutating tool takes `confirm`. Without `confirm: true` it makes **no network call** and returns\na dry-run preview of exactly what would be sent. Where a re-read can prove the change stuck (skips,\naccount updates) the tool re-reads and reports `verified`; where it can't (support messages, missed-pickup\nreports) it says so rather than claiming success.\n\nPayments are deliberately out of scope — `crowntown_list_invoices` returns the hosted invoice URL for\nyou to open in a browser.\n\n## Without the MCP\n\nThe `skills/crowntown-portal` skill does the same things with `curl` in a shell — useful in scripts or\non a machine where this server isn't installed. It documents the Django CSRF handshake, both JSON\nendpoints, and every write's field list.\n\n## Development\n\n```sh\nnpm install\nnpm run build\nnpm test\n```\n\nTests mock the network — no credentials needed and nothing hits the live portal. `tests/server-boot.test.ts`\nspawns the real built artifacts (the npm `bin` and the bundle, the latter without `node_modules`) and runs\nthe MCP handshake against them.\n\nEndpoint shapes are documented in [`docs/CROWNTOWN-API.md`](docs/CROWNTOWN-API.md), including which\nparts are live-verified and which are not.\n\n## License\n\nMIT\n",
  "bytes": 4757,
  "sha": "c1d353621124726759d22bc10a3f2ed77b9d350adb624ed3aefdf1aa6db70c02",
  "repo_slug": "chrischall/crowntowncompost-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_chrischall_crowntowncompost_mc_b567d761/readme"
}