Skip to main content
Glama
crowntowncompost-mcp

crowntowncompost-mcp

by chrischall

crowntowncompost-mcp

MCP server for the Crown Town Compost customer portal — check your pickups, invoices, and upcoming collection days, skip a service, report a missed pickup, and update your account, all in natural language.

Developed and maintained by AI (Claude Code). Use at your own discretion.

What it talks to

crowntowncompost.com is a marketing site with no customer data. Everything lives at portal.crowntowncompost.com, a Django app (a white-labeled StopSuite hauler platform). This server authenticates server-side with a session cookie you already hold, or with your own portal username and password — a normal form login that returns one — and reads the same pages and JSON endpoints the website uses. No browser extension, no bot-wall workaround, no third-party service in the middle.

Related MCP server: BillingServ MCP

Install

npm install -g crowntowncompost-mcp

Then add it to your MCP host. Two configurations work — supply either a session cookie you already hold (nothing else needed), or the login pair so the server can mint one:

{
  "mcpServers": {
    "crowntowncompost": {
      "command": "npx",
      "args": ["-y", "crowntowncompost-mcp"],
      "env": {
        "CROWNTOWN_USERNAME": "you@example.com",
        "CROWNTOWN_PASSWORD": "your-portal-password"
      }
    }
  }
}

To use a session cookie instead, set CROWNTOWN_SESSION_COOKIE to a Cookie header value from a signed-in browser session (sessionid=…; csrftoken=…) and leave the username and password unset. The portal login is then never run, and no password is stored anywhere.

Setting both is also valid, and is the most robust configuration: the cookie is used first, and when the portal eventually expires it the login quietly mints a replacement. With a cookie alone, an expired session is reported as expired — the server says so plainly rather than claiming nothing is configured.

Locally you can instead copy .env.example to .env. The server boots without credentials (so a host's install-time probe succeeds); the configuration error surfaces on the first tool call.

Tools

Reads

Tool

What it returns

crowntown_healthcheck

Whether credentials work, plus account status; on failure error.kind says which hop broke (no_credential, credential_rejected, session_expired, edge_blocked, timeout, transport, http)

crowntown_get_dashboard

Account status, subscription (plan, price, renewal date), next service date, service addresses + pickup days, and your environmental impact

crowntown_get_account

Contact details and notification preferences

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

crowntown_list_service_history

Past collection stops — date, outcome, time, weight, services. Paginated; filter by success/missing/empty/inaccessible/unacceptable

crowntown_list_upcoming_services

Upcoming collection days, each with the ids needed to skip it

crowntown_list_invoices

Billing history with amounts, status, and Stripe payment links

Writes (all confirmation-gated)

Tool

What it does

crowntown_skip_service

Skip or un-skip an upcoming collection day

crowntown_update_account

Update contact details / notification preferences

crowntown_report_missed_pickup

Report that a collection was missed

crowntown_contact_support

Send a message to customer support

Every mutating tool asks you to confirm before it writes anything. A client that can show a confirmation prompt (Claude Code) gets that prompt (unless MCP_CONFIRM_ELICITATION=off). Elsewhere (claude.ai, Claude Desktop) the first call sends nothing and returns status: "confirmation-required" with a preview of exactly what would be sent plus a confirmToken; only a repeat call with the same arguments and that token proceeds. The token works once, expires, and is refused (DRAFT_CHANGED) if what would be sent changed in between — including values the tool reads first, such as the account form crowntown_update_account re-saves or the reply-to email/phone the support form pre-fills. Where a re-read can prove the change stuck (skips, account updates) the tool re-reads and reports verified; where it can't (support messages, missed-pickup reports) it says so rather than claiming success.

Confirmations

variable

default

MCP_CONFIRM_MODE

ask-user

What a write does on a client that cannot show a confirmation prompt (claude.ai, Claude Desktop). ask-user: two steps — the first call does nothing and returns a preview plus a token, and the model must get your approval in chat before calling again with it. auto: the same two steps, but the model may use the token after reviewing the preview itself. refuse: writes are refused on such clients. A client that can show prompts (Claude Code) always gets the real prompt, unless MCP_CONFIRM_ELICITATION=off. An unrecognised value is treated as refuse.

MCP_CONFIRM_ELICITATION

on

off never shows a confirmation prompt, so every client gets the MCP_CONFIRM_MODE behaviour. Set it for a client that says it can show prompts but never does (the write hangs — opencode 2.0.x). Any other value is treated as on, with a warning on stderr.

MCP_CONFIRM_TTL_SECONDS

600

How long a token stays valid.

MCP_CONFIRM_SECRET

random per process

Signing key; set it only if tokens must survive a server restart.

Payments are deliberately out of scope — crowntown_list_invoices returns the hosted invoice URL for you to open in a browser.

Without the MCP

The skills/crowntown-portal skill does the same things with curl in a shell — useful in scripts or on a machine where this server isn't installed. It documents the Django CSRF handshake, both JSON endpoints, and every write's field list.

Development

npm install
npm run build
npm test

Tests mock the network — no credentials needed and nothing hits the live portal. tests/server-boot.test.ts spawns the real built artifacts (the npm bin and the bundle, the latter without node_modules) and runs the MCP handshake against them.

Endpoint shapes are documented in docs/CROWNTOWN-API.md, including which parts are live-verified and which are not.

License

MIT

Available Tools

11 tools
crowntown_contact_supportSend a message to customer supportA
Destructive

Send a message to Crown Town Compost customer support. The reply-to email and phone default to the ones the support form pre-fills from your account, and the preview shows the exact values that will be sent. Asks the user to confirm first: a confirmation prompt where the client supports one; otherwise the first call returns a preview and a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE).

Inputs: message (required), email, phone, confirmToken.

crowntown_get_accountGet account contact detailsA
Read-onlyIdempotent

Get your account contact details (first name, last name, phone) and notification preferences (email reminders, service notifications). Read-only — use crowntown_update_account to change them.

Inputs: view.

crowntown_get_dashboardGet account dashboard summaryA
Read-onlyIdempotent

Get your Crown Town Compost dashboard: account status, active subscription (plan, price, renewal date), next service date, service address(es) and their pickup day(s), and your composting environmental impact (lbs diverted, seedlings, miles offset, gallons of gas). Read-only.

Inputs: no named parameters.

crowntown_get_pickup_scheduleGet pickup schedule (days + time window)A
Read-onlyIdempotent

Get the pickup schedule for each service address: pickup day(s), next service date, the official set-out-by time, and an observed arrival-time window (earliest/latest/typical and whether it is consistent or varies) derived from the recorded collection times in your service history. Crown Town Compost publishes no guaranteed arrival window, so the observed window is empirical. Read-only.

Inputs: history_sample.

crowntown_healthcheckVerify Crown Town Compost auth + connectivityA
Read-onlyIdempotent

Confirm credentials are configured, log in to the Crown Town Compost portal, fetch the dashboard, and report {authenticated, account_status, service_addresses}. On failure, error.kind says which hop broke: no_credential (nothing configured), credential_rejected (the portal refused the username/password), session_expired (a supplied session cookie is no longer honoured), edge_blocked (a CDN/WAF refused the request before the portal saw it, so the credentials were never judged), timeout, transport or http. Read-only; never returns the credentials.

Inputs: no named parameters.

crowntown_list_invoicesList billing history (invoices)A
Read-onlyIdempotent

List your Crown Town Compost invoices — number, date, amount, status, whether payable, and links (Stripe PDF / receipt / hosted invoice page). Paginated. view "brief" answers one line per invoice instead ("Invoice — — ", inside the untrusted-data envelope) and lists only the payable invoices unless payable_only is false. Read-only.

Inputs: page, view, per_page, payable_only.

crowntown_list_service_historyList service history (pickups)A
Read-onlyIdempotent

List past collection stops for your account — date, status (Success/Missing/Empty/Inaccessible/Unacceptable), collection time, weight, and services rendered. Paginated and filterable by status. Read-only.

Inputs: page, status, per_page.

crowntown_list_upcoming_servicesList upcoming (skippable) servicesA
Read-onlyIdempotent

List upcoming scheduled collection days from the service calendar, each with the identifiers needed to skip it (rid, clid), the service date, and whether it is currently scheduled or already skipped. view "brief" answers one line per day instead: "Compost pickup — — scheduled|skipped". Read-only — use crowntown_skip_service to actually skip/unskip.

Inputs: view.

crowntown_report_missed_pickupReport a missed pickupA
Destructive

Report that a scheduled collection was missed. This notifies Crown Town Compost staff. Asks the user to confirm first: a confirmation prompt where the client supports one; otherwise the first call returns a preview and a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE).

Inputs: date (required), comment, confirmToken.

crowntown_skip_serviceSkip or un-skip an upcoming serviceA

Skip (or un-skip) an upcoming collection day. Pass the rid + clid from crowntown_list_upcoming_services. Asks the user to confirm first: a confirmation prompt where the client supports one; otherwise the first call returns a preview and a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE).

Inputs: rid (required), clid (required), action, confirmToken.

crowntown_update_accountUpdate account contact details / preferencesA

Update your contact details and/or notification preferences. Reads your current account form, changes ONLY the field(s) you specify, and re-saves the rest verbatim. The preview shows the current values and the resulting state. Asks the user to confirm first: a confirmation prompt where the client supports one; otherwise the first call returns a preview and a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE).

Inputs: phone, last_name, first_name, confirmToken, +2 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.2/5.0

    Scored across 11 tools

    Disambiguation4/5

    Most tools have a clear resource+action identity (list_invoices, skip_service, report_missed_pickup, update_account). The main soft overlap is between crowntown_get_dashboard and crowntown_get_pickup_schedule (both return next service date and address/pickup days), plus list_upcoming_services vs. pickup schedule, but the descriptions explicitly differentiate them (summary vs. empirical arrival window vs. skippable calendar entries).

    Naming Consistency4/5

    All names share a consistent crowntown_ prefix and snake_case verb_noun pattern (list_*, get_*, update_*, skip_*, report_*, contact_*). crowntown_healthcheck is the one deviation, being a bare noun with no verb, but it is unambiguous in context.

    Tool Count5/5

    11 tools is squarely in the well-scoped range, and each one maps to a distinct customer-portal need: account read/write, dashboard, schedule, upcoming services, skip, history, missed pickup, invoices, support, and diagnostics. Nothing appears redundant or filler.

    Completeness4/5

    The lifecycle is well covered: view account/dashboard/schedule/history, act on services (skip, report missed), manage account, list invoices, and contact support. Minor gaps exist — no subscription management (pause/cancel/change plan) and no invoice payment action beyond following the Stripe link, but these are plausibly out of scope for this MCP.

    Maintenance

    ActivityActive
    ResponsivenessUsually handled

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      D
      maintenance
      MCP server for GoHighLevel sub-accounts, enabling management of CRM contacts, pipelines, calendars, invoices, and more via natural language.
      -
    • A
      license
      A
      quality
      C
      maintenance
      This is an MCP server for the BillingServ API. Once it's set up, your AI assistant can look up customers, invoices, orders, packages, and reports straight from your BillingServ installation
      3
      75 npm
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Unofficial MCP server for the Apps API that enables managing customers, payments, plans, coupons, and Discord integration through natural language.
      47 npm
      2
      MIT