Portfolio wedge

Agents run the same lien clocks your managers see

UnitClock ships a public MCP server at https://unitclock.com/api/mcp. Connect Cursor, Claude, or your own agent with an org API key. The sandbox key below is read and dry-run only. Missing or invalid keys return 401.

Markdown twin for agents: /mcp.md · llms.txt

Auth model

  • Org API keys — uc_live_… hashed in Neon. Create one in the app under Agents. Primary auth for paid use.
  • OAuth 2.1 client_credentials — POST /api/oauth/token. No authorization-code or registration endpoint is advertised.
  • dry_run default on mutating tools until you pass confirm: true and have the right scopes.
  • Confirm-gated writes for sends, SCRA records, auction moves, FMS sync that can change clocks, and other statutory steps — preview via needs_confirmation when confirm is missing.
  • Live notice sends need notices:send, org live_sends_enabled, and confirm.
  • Unauthenticated probes return 401 with WWW-Authenticate pointing at /.well-known/oauth-protected-resource/api/mcp.

Transport (Streamable HTTP)

  • POST JSON-RPC 2.0 (initialize, tools/list, tools/call) with Accept: application/json, text/event-stream.
  • Legacy envelope { "tool": "run_daily_sweep", "arguments": {} } still works on POST.
  • GET with a valid bearer returns the tool name list; we do not offer a long-lived GET SSE stream (405 when Accept: text/event-stream).
  • Server card for scanners: /.well-known/mcp.json (same JSON at /.well-known/mcp/server-card.json).

What agents can do

29 tools mirror in-app Agents workflows: daily sweep, due queues, compliance clock, notice dry-run/generate, proof attach, overlock, auction checklist, reschedule (renotice block), stop-sale on pay, SCRA checkpoint, exports, FMS sync, state packs, and ask→build intake.

Discover tool names with GET /api/mcp and a valid key.

MCP & agent pricing →

Sandbox key (PathProbe)

uc_demo_public_sandbox is scoped to seeded Austin (fac_austin) and Oakland (fac_oakland). Reads work. Writes with confirm: true stay dry-run. Live vendor sends return 402. Fetch the current key from GET /api/mcp/demo-key if it was rotated.

curl -s https://unitclock.com/api/mcp \
  -H "Authorization: Bearer uc_demo_public_sandbox" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"pathprobe","version":"0"}}}'

curl -s https://unitclock.com/api/mcp \
  -H "Authorization: Bearer uc_demo_public_sandbox" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'

curl -s https://unitclock.com/api/mcp \
  -H "Authorization: Bearer uc_demo_public_sandbox" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"list_facilities","arguments":{}}}'

Install in Cursor

The snippet uses the sandbox key. Swap in a uc_live_… key from Agents when you need persisted writes.

{
  "mcpServers": {
    "unitclock": {
      "url": "https://unitclock.com/api/mcp",
      "headers": {
        "Authorization": "Bearer uc_demo_public_sandbox"
      }
    }
  }
}

Install in Claude Desktop

Add the same block under mcpServers in claude_desktop_config.json (macOS: Application Support/Claude).

{
  "mcpServers": {
    "unitclock": {
      "url": "https://unitclock.com/api/mcp",
      "headers": {
        "Authorization": "Bearer uc_demo_public_sandbox"
      }
    }
  }
}

Tool catalog (summary)

Names match the live server. Tier reflects relative API cost — not legal weight.

Clock & sweep

  • run_daily_sweep — Due, overdue, and blocked units in one pass.

    When: Start-of-day or nightly agent run across the portfolio.

  • get_unit_compliance_clock — Per-unit deadline, blockers, and pack version.

    When: Answering “where is unit 204 in the lien clock?” before any write.

  • list_units_due_for_notice — Notice queue with statutory deadlines.

    When: Building today’s notice batch for site managers.

  • list_missing_proofs — Proof gaps before sale or overlock.

    When: Pre-auction or pre-overlock QA on mail and photo artifacts.

  • list_units — Filter delinquent, in-lien, or auction-ready units.

    When: Scoped lists for a status lane (delinquent, in-lien, auction).

  • list_facilities — Facilities visible to the API key.

    When: Multi-site agents resolving facility_id before unit calls.

Notices & proof

  • generate_lien_notice — Dry-run notice draft; confirm-gated persist.

    When: Drafting a pack-backed notice before human or counsel review.

  • send_notice — Confirm-gated vendor send (pass-through mail).

    When: Live certified/mail send after preview, scopes, and org live_sends_enabled.

  • mark_notice_delivered — Delivery artifact on the clock.

    When: Recording carrier delivery or return receipt on the unit timeline.

  • attach_proof — Vault mail receipts, photos, affidavits.

    When: Closing a proof gap surfaced by list_missing_proofs.

  • log_contact_attempt — Non-statutory diligence log only.

    When: Documenting operator outreach — not a substitute for statutory notice.

  • set_overlock_status — Confirm-gated overlock event.

    When: Recording overlock after policy checks; confirm required.

Auction & SCRA

  • schedule_auction_ad_checklist — Schedule newspaper or online ad checklist items.

    When: Moving a unit into advertise/sale prep with confirm.

  • list_auction_checklist — Sale checklist and renotice flags.

    When: Pre-sale review for ads, SCRA, and renotice blockers.

  • reschedule_auction — Sets renotice_required — sale blocked.

    When: Date change that triggers renotice — expect sale_blocked.

  • stop_sale_on_pay — Full pay cancels auction pipeline.

    When: Tenant pays in full before the sale; confirm to unwind auction state.

  • mark_auction_complete — Blocked when SCRA or renotice open.

    When: Closing a sale only after blockers are clear.

  • check_scra_status — Fails closed to unchecked without stored artifact.

    When: Recording an SCRA diligence check — not a compliance guarantee.

  • cancel_lien_process — Operator cancel or CA opposition path.

    When: Stopping the lien clock (payoff, mistake, or CA opposition).

State packs & sync

  • get_state_pack — Operational pack metadata (attestation required for live).

    When: Resolving which state pack version applies before notices or exports.

  • list_pack_changelog — Pack version history.

    When: Explaining pack bumps to operators or counsel.

  • sync_fms_delinquencies — Pull delinquencies from your FMS ledger; confirm-gated.

    When: Nightly SiteLink/storEDGE pull that may change clocks — confirm required.

  • record_payment_event — Payment events on the clock.

    When: Posting a payment that should move DPD or cure state.

  • apply_partial_payment_policy — Partial-pay policy application.

    When: Applying your partial-pay rules without assuming statutory cure.

Exports & product

  • export_audit_trail — Defense packet job (PDF/ZIP).

    When: Generating an audit trail export for a unit or date range.

  • create_defense_packet — Counsel-ready export bundle.

    When: Packaging proofs and clock history for counsel review — not legal advice.

  • submit_feature_ask — Ask → build intake from an agent.

    When: Logging product feedback from an automated workflow.

  • list_feature_asks — Open asks on the board.

    When: Triaging customer asks without opening the Operator UI.

  • ping_ask_shipped — Mark shipped; confirm-gated.

    When: Notifying the board that a requested build shipped.

Honest limits

  • UnitClock is not legal advice. Responses include disclaimer and pack version.
  • Public demo uses fixture packs — not attested counsel templates.
  • We do not claim guaranteed compliance or “SCRA safe.”
  • MCP does not change Square/Stripe Operator checkout — billing stays in-app.
  • log_contact_attempt is non-statutory diligence only — it never satisfies notice requirements.

Operator includes fair-use MCP. The MCP add-on is a separate Stripe subscription on the same account (STRIPE_PRICE_MCP_ADDON). Caps are enforced by the API. Not legal advice, not insurance, and not E&O coverage.