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: trueand 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_confirmationwhen confirm is missing. - Live notice sends need
notices:send, orglive_sends_enabled, and confirm. - Unauthenticated probes return 401 with
WWW-Authenticatepointing at/.well-known/oauth-protected-resource/api/mcp.
Transport (Streamable HTTP)
- POST JSON-RPC 2.0 (
initialize,tools/list,tools/call) withAccept: 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.
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_attemptis 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.