cincsystems-mcp
Exposes the CINC Systems HOA management REST API as MCP tools, enabling natural language queries and actions for ACC requests, aged balances, vendor records, call logs, documents, and more.
README
cincsystems-mcp
First MCP server for the CINC Systems (HOA / community association management) REST API. 50K+ communities, 6M+ doors, $11B+ annual payments processed.
CINC Systems is the leading US community-association-management (CAM / HOA / condo) platform. Management companies use it to run the back-office accounting, board packets, ACC (Architectural Control Committee) workflow, homeowner communications, vendor management, and aged-balance collections for the HOAs, condominiums, lifestyle communities, and high-rises they manage.
cincsystems-mcp exposes the CINC Systems V1 REST API as 13 MCP tools so
Claude / Cursor / any MCP client can read and (for ACC and vendors) write to
your CINC account in plain English.
What this unlocks
- ACC triage: "Show me every pending ACC request in HOA 42, sorted by submission date."
- Aged balances report: "Who's 90+ days past due across all our HOAs?"
- Collections escalation: "Pull the flagged-collections list for HOA 88 and draft a referral-to-attorney email for the top 3."
- Board packet drafting: "What charges were posted in HOA 142 last quarter?"
- Document lookup: "Where are the CC&Rs for Cypress Run?"
- Vendor tracking: "List every vendor whose insurance is on file in HOA 42."
- Call log audit: "Show me this week's call log for HOA 42."
Quick start
pip install -e .
export CINC_SYSTEMS_API_KEY=<opaque-token>
export CINC_SYSTEMS_MGMT_ID=<integer>
export CINC_SYSTEMS_BASE_URL=https://<your-subdomain>.cincsys.com
cinc_systems_mcp
Or run it via mcp directly:
mcp run src/cinc_systems_mcp/server.py
Auth
CINC Systems V1 is per-tenant. Each management company has its own subdomain
and its own mgmt_id integer. You need three values:
| Env var | What it is | Where to get it |
|---|---|---|
CINC_SYSTEMS_API_KEY |
Opaque API key (NOT Bearer-prefixed) | CINC UI -> Account -> API Settings |
CINC_SYSTEMS_MGMT_ID |
Per-tenant integer (e.g. 1234) |
CINC UI -> top-right menu -> API Settings |
CINC_SYSTEMS_BASE_URL |
Per-tenant base URL (e.g. https://acme.cincsys.com) |
The URL you log in to |
The V1 API uses a plain Authorization: <api_key> header. CINC's V1 server
rejects Bearer -prefixed tokens; this client uses the opaque-token form.
Tools
13 tools total. All read the CINC account scoped to your mgmt_id.
Diagnostic
health_check— verify the API key, mgmt_id, and base URL are all valid
Associations
list_associations(assoc_code=None)— list all HOAs/condos you manageget_association(assoc_code)— get one HOA by its code
Homeowners
list_homeowners(assoc_code=None, last_name=None)— list homeownersget_homeowner(homeowner_id)— get one homeowner by ID
ACC (Architectural Control Committee)
list_acc(assoc_code=None, status=None)— list architectural review requestscreate_acc(body)— log a new ACC request (e.g. paint, fence, addition)
Vendors
list_vendors(assoc_code=None)— list contractors you useupdate_vendor(vendor_id, body)— update vendor record (insurance, contact)
Aged Balances
list_aged_balances(assoc_code=None)— delinquent accounts by 30/60/90+ day buckets
Call Logs
list_call_logs(assoc_code=None, days=None)— inbound/outbound HOA calls
Documents
list_documents(assoc_code=None, doc_type=None)— CC&Rs, bylaws, minutes, contracts
Flagged Collections
list_flagged_collections(assoc_code=None)— accounts escalated to attorney
Post Charges
list_post_charges(assoc_code=None, since=None)— recently posted assessments/fines/fees
Real workflow examples
Q: "Who in HOA 42 is 90+ days past due?"
Use list_aged_balances(assoc_code="HOA042") to pull the aging report.
The response is a list of records broken into 30/60/90+ day buckets.
Surface the 90+ bucket and the homeowner IDs in it.
Q: "What architectural requests came in this week?"
Call list_acc(assoc_code=None, status="pending") and filter to the
last 7 days on the assistant side. Each record has assocCode,
homeownerId, description, requestType, and submission timestamp.
Q: "Log a paint request for homeowner 9876 in HOA 42."
Call create_acc(body={
"assocCode": "HOA042",
"homeownerId": "9876",
"description": "Repaint front door navy blue",
"requestType": "paint"
}). The response is the new ACC record.
Architecture
Built on industry-leading Python patterns (see
~/.mavis/agents/mavis/memory/engineering-playbook.md):
- Shared
httpx.AsyncClientwith connection pooling and transport-level retries for transient network failures. - Typed exception hierarchy —
CincSystemsAuthError/NotFoundError/RateLimitError/APIError/ConnectionErrorwith structured fields (http_status,error_code,request_id,retry_after). - Application-level retry with exponential backoff + full jitter on 429
and 5xx, honoring the
Retry-Afterheader. - Dispatch table for HTTP status -> exception (one row per status, no
chained
if/raise). - isError-compliance — every tool
raises on failure so FastMCP setsisError=trueon the wire response (the Blackwell Systems MCP audit found 9 of 25 default-input crashes + 11 silent-error patterns in popular MCPs; we don't repeat that mistake). - JSONL audit logging — every tool call writes a structured record to
stderr (or a file via
CINC_SYSTEMS_AUDIT_LOG) with secret redaction. - respx + hypothesis tests — 25+ tests, ruff + mypy --strict clean.
Testing
pip install -e ".[dev]"
pytest # 25+ tests, no live API
ruff check src tests
ruff format --check src tests
mypy src
License
MIT.
Related MCPs
Other first-party MCPs in this series:
sanjibani/hawksoft-mcp— insurancesanjibani/open-dental-mcp— dentalsanjibani/ezyvet-mcp— veterinarysanjibani/jobber-mcp— home servicesanjibani/practicepanther-mcp— legal practicesanjibani/cox-automotive-mcp— auto dealershipsanjibani/qualia-mcp— title and escrowsanjibani/realm-mp-mcp— church / nonprofitsanjibani/fieldroutes-mcp— pest control / lawn caresanjibani/campspot-mcp— outdoor hospitalitysanjibani/cleancloud-mcp— laundry / dry cleaningsanjibani/playmetrics-mcp— youth sportssanjibani/foreup-mcp— golf course managementsanjibani/storedge-mcp— self-storagesanjibani/courtreserve-mcp— racquet sportssanjibani/procare-mcp— child caresanjibani/passare-mcp— deathcare / funeralsanjibani/funraise-mcp— nonprofit fundraisingsanjibani/kicksite-mcp— martial artssanjibani/singleops-mcp— green industry
Browse the full list at https://github.com/sanjibani?q=-mcp.
For custom MCP engagements, see https://sanjibani.github.io/mcp-services/.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
Neon Database
MCP server for interacting with Neon Management API and databases
E2B
Using MCP to run code via e2b.
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.