AppFolio MCP Server
Summary: An MCP server that connects AI tools to AppFolio Property Manager, exposing 293 operations (137 reports + 156 Database API endpoints) through six catalog-backed tools.
Discover and run 137 read-only reports across financial, leasing, tenant, owner, property/unit, maintenance, HOA, rent roll, register, and vendor categories, with auto-pagination and optional column selection.
Inspect report specs before running: required/optional filters, types, enums, defaults, nested attributes, and response columns.
Browse 156 Database API endpoints filtered by category, resource, HTTP method, or reads-only.
Inspect endpoint specs: method, path params, query filters, request body schema, response fields, and request samples.
Execute reads (58 GET endpoints) with filters and auto-pagination.
Execute writes (98 endpoints: 55 POST, 33 PATCH, 4 PUT, 6 DELETE) live against your AppFolio database — bills, charges, journal entries, tenants, owners, properties, units, work orders, vendors, leads, leases, violations, and more.
Upload files (attachments and photos) via multipart on 14 endpoints, with local file validation (≤100 MiB) and no auto-retry on timeout.
Validate every request against a local catalog and enforce AppFolio's documented rate limits.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@AppFolio MCP Server show me the financial reports"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
AppFolio MCP Server
An MCP (Model Context Protocol) server for AppFolio Property Manager, connecting your property management data to AI tools.
Quick start
Claude
bash (macOS/Linux):
APPFOLIO_VHOST="yourcompany"
APPFOLIO_CLIENT_ID="your-reports-client-id"
APPFOLIO_CLIENT_SECRET="your-reports-client-secret"
APPFOLIO_DB_DEVELOPER_ID="your-developer-id"
APPFOLIO_DB_CLIENT_ID="your-db-client-id"
APPFOLIO_DB_CLIENT_SECRET="your-db-client-secret"
claude mcp add appfolio \
--env APPFOLIO_VHOST="$APPFOLIO_VHOST" \
--env APPFOLIO_CLIENT_ID="$APPFOLIO_CLIENT_ID" \
--env APPFOLIO_CLIENT_SECRET="$APPFOLIO_CLIENT_SECRET" \
--env APPFOLIO_DB_DEVELOPER_ID="$APPFOLIO_DB_DEVELOPER_ID" \
--env APPFOLIO_DB_CLIENT_ID="$APPFOLIO_DB_CLIENT_ID" \
--env APPFOLIO_DB_CLIENT_SECRET="$APPFOLIO_DB_CLIENT_SECRET" \
-- npx -y @nightsquawktech/appfolio-mcp-serverPowerShell (Windows):
$APPFOLIO_VHOST = "yourcompany"
$APPFOLIO_CLIENT_ID = "your-reports-client-id"
$APPFOLIO_CLIENT_SECRET = "your-reports-client-secret"
$APPFOLIO_DB_DEVELOPER_ID = "your-developer-id"
$APPFOLIO_DB_CLIENT_ID = "your-db-client-id"
$APPFOLIO_DB_CLIENT_SECRET = "your-db-client-secret"
claude mcp add appfolio `
--env "APPFOLIO_VHOST=$APPFOLIO_VHOST" `
--env "APPFOLIO_CLIENT_ID=$APPFOLIO_CLIENT_ID" `
--env "APPFOLIO_CLIENT_SECRET=$APPFOLIO_CLIENT_SECRET" `
--env "APPFOLIO_DB_DEVELOPER_ID=$APPFOLIO_DB_DEVELOPER_ID" `
--env "APPFOLIO_DB_CLIENT_ID=$APPFOLIO_DB_CLIENT_ID" `
--env "APPFOLIO_DB_CLIENT_SECRET=$APPFOLIO_DB_CLIENT_SECRET" `
-- npx -y @nightsquawktech/appfolio-mcp-serverCursor
Or put the mcp.json block in .cursor/mcp.json, then verify with:
agent mcp list(The Cursor CLI manages configured servers but has no mcp add; install is via the button or mcp.json.)
VS Code
bash (macOS/Linux):
APPFOLIO_VHOST="yourcompany"
APPFOLIO_CLIENT_ID="your-reports-client-id"
APPFOLIO_CLIENT_SECRET="your-reports-client-secret"
APPFOLIO_DB_DEVELOPER_ID="your-developer-id"
APPFOLIO_DB_CLIENT_ID="your-db-client-id"
APPFOLIO_DB_CLIENT_SECRET="your-db-client-secret"
code --add-mcp '{"name":"appfolio","command":"npx","args":["-y","@nightsquawktech/appfolio-mcp-server"],"env":{"APPFOLIO_VHOST":"'"$APPFOLIO_VHOST"'","APPFOLIO_CLIENT_ID":"'"$APPFOLIO_CLIENT_ID"'","APPFOLIO_CLIENT_SECRET":"'"$APPFOLIO_CLIENT_SECRET"'","APPFOLIO_DB_DEVELOPER_ID":"'"$APPFOLIO_DB_DEVELOPER_ID"'","APPFOLIO_DB_CLIENT_ID":"'"$APPFOLIO_DB_CLIENT_ID"'","APPFOLIO_DB_CLIENT_SECRET":"'"$APPFOLIO_DB_CLIENT_SECRET"'"}}'PowerShell (Windows):
$APPFOLIO_VHOST = "yourcompany"
$APPFOLIO_CLIENT_ID = "your-reports-client-id"
$APPFOLIO_CLIENT_SECRET = "your-reports-client-secret"
$APPFOLIO_DB_DEVELOPER_ID = "your-developer-id"
$APPFOLIO_DB_CLIENT_ID = "your-db-client-id"
$APPFOLIO_DB_CLIENT_SECRET = "your-db-client-secret"
$config = @{
name = "appfolio"
command = "npx"
args = @("-y", "@nightsquawktech/appfolio-mcp-server")
env = @{
APPFOLIO_VHOST = $APPFOLIO_VHOST
APPFOLIO_CLIENT_ID = $APPFOLIO_CLIENT_ID
APPFOLIO_CLIENT_SECRET = $APPFOLIO_CLIENT_SECRET
APPFOLIO_DB_DEVELOPER_ID = $APPFOLIO_DB_DEVELOPER_ID
APPFOLIO_DB_CLIENT_ID = $APPFOLIO_DB_CLIENT_ID
APPFOLIO_DB_CLIENT_SECRET = $APPFOLIO_DB_CLIENT_SECRET
}
} | ConvertTo-Json -Compress
code --add-mcp $configCodex
bash (macOS/Linux):
APPFOLIO_VHOST="yourcompany"
APPFOLIO_CLIENT_ID="your-reports-client-id"
APPFOLIO_CLIENT_SECRET="your-reports-client-secret"
APPFOLIO_DB_DEVELOPER_ID="your-developer-id"
APPFOLIO_DB_CLIENT_ID="your-db-client-id"
APPFOLIO_DB_CLIENT_SECRET="your-db-client-secret"
codex mcp add appfolio \
--env APPFOLIO_VHOST="$APPFOLIO_VHOST" \
--env APPFOLIO_CLIENT_ID="$APPFOLIO_CLIENT_ID" \
--env APPFOLIO_CLIENT_SECRET="$APPFOLIO_CLIENT_SECRET" \
--env APPFOLIO_DB_DEVELOPER_ID="$APPFOLIO_DB_DEVELOPER_ID" \
--env APPFOLIO_DB_CLIENT_ID="$APPFOLIO_DB_CLIENT_ID" \
--env APPFOLIO_DB_CLIENT_SECRET="$APPFOLIO_DB_CLIENT_SECRET" \
-- npx -y @nightsquawktech/appfolio-mcp-serverPowerShell (Windows):
$APPFOLIO_VHOST = "yourcompany"
$APPFOLIO_CLIENT_ID = "your-reports-client-id"
$APPFOLIO_CLIENT_SECRET = "your-reports-client-secret"
$APPFOLIO_DB_DEVELOPER_ID = "your-developer-id"
$APPFOLIO_DB_CLIENT_ID = "your-db-client-id"
$APPFOLIO_DB_CLIENT_SECRET = "your-db-client-secret"
codex mcp add appfolio `
--env "APPFOLIO_VHOST=$APPFOLIO_VHOST" `
--env "APPFOLIO_CLIENT_ID=$APPFOLIO_CLIENT_ID" `
--env "APPFOLIO_CLIENT_SECRET=$APPFOLIO_CLIENT_SECRET" `
--env "APPFOLIO_DB_DEVELOPER_ID=$APPFOLIO_DB_DEVELOPER_ID" `
--env "APPFOLIO_DB_CLIENT_ID=$APPFOLIO_DB_CLIENT_ID" `
--env "APPFOLIO_DB_CLIENT_SECRET=$APPFOLIO_DB_CLIENT_SECRET" `
-- npx -y @nightsquawktech/appfolio-mcp-serverOr add it to ~/.codex/config.toml under [mcp_servers.appfolio].
mcp.json
Every environment variable the server reads, with recommended values:
{
"mcpServers": {
"appfolio": {
"command": "npx",
"args": ["-y", "@nightsquawktech/appfolio-mcp-server"],
"env": {
"APPFOLIO_VHOST": "yourcompany",
"APPFOLIO_CLIENT_ID": "your-reports-client-id",
"APPFOLIO_CLIENT_SECRET": "your-reports-client-secret",
"APPFOLIO_DB_DEVELOPER_ID": "your-developer-id",
"APPFOLIO_DB_CLIENT_ID": "your-db-client-id",
"APPFOLIO_DB_CLIENT_SECRET": "your-db-client-secret"
}
}
}
}File locations: .mcp.json in your project root (Claude Code), claude_desktop_config.json (Claude Desktop), .cursor/mcp.json (Cursor).
Related MCP server: Qobrix CRM MCP Server
Configuration
The server talks to two AppFolio APIs, each with its own credentials. Configure one set or both: each API's tools only need their own variables, and the other API's tools return an error at call time if their variables are unset.
Variable | Required | Default | Purpose |
| for Reports API tools | Your AppFolio database name, the subdomain in | |
| for Reports API tools | Reports API Client ID (Account Settings > Manage API Settings > Reports API Credentials) | |
| for Reports API tools | Reports API Client Secret | |
| for Database API tools | Your AppFolio Developer ID (Admin > Developer ID) | |
| for Database API tools | Database API Basic Auth Client ID (API Credentials > Basic Auth) | |
| for Database API tools | Database API Basic Auth Client Secret | |
| no |
| Per-attempt timeout for file uploads (attachments and photos) |
Security & write safety
AppFolio credentials: create dedicated API credentials for this server. Reports API credentials come from Account Settings > Manage API Settings > Reports API Credentials; Database API credentials are a Developer ID plus Basic Auth Client ID and Secret from API Credentials > Basic Auth.
The Reports API tools (
list_reports,describe_report,run_report) are read-only: reports return data and never modify anything.The Database API tool
call_endpointexecutes reads and writes. Of the 156 endpoints, 58 are GET reads and 98 are write operations (55 POST, 33 PATCH, 4 PUT, 6 DELETE) that execute live against your AppFolio database. There is no environment write gate in this version.For a read-only posture, configure only the Reports API variables: without
APPFOLIO_DB_*credentials, everycall_endpointrequest fails before reaching AppFolio.Every request is validated against the local catalog first (known operation, required path params, required report filters), and the client enforces AppFolio's documented rate limits (7 requests per 15 seconds on the Reports API, all three Database API windows).
All requests go directly from your machine to
{vhost}.appfolio.comandapi.appfolio.com; nothing passes through third parties.
The tool surface is a guardrail, not a security boundary. The env vars in your MCP config are real AppFolio credentials, and an AI agent with shell access can bypass the MCP tools and call the AppFolio API directly with them. If you need hard read-only, enforce it at the source: scope the API credentials themselves, or only issue the read-oriented Reports API credentials and leave the Database API credentials out of the config.
Tools
Both APIs are catalog-backed: instead of one MCP tool per report or endpoint, each API exposes a list/describe/call triple built on mcp-core. list_* discovers what exists (137 reports, 156 endpoints), describe_* returns the full parameter spec for one entry from a local catalog, and the execute tool (run_report / call_endpoint) validates the request against that spec before calling AppFolio. Six tools cover 293 operations without flooding your client's tool list.
list_reports List the 137 AppFolio reports (slug, name, category, required filters)
describe_report Full parameter spec for one report: filters, types, enums, response columns
run_report Run a report and return its rows, auto-paginated
list_endpoints List the 156 Database API endpoints (operationId, method, path, category)
describe_endpoint Full spec for one endpoint: path params, filters, body schema, response fields
call_endpoint Call a Database API endpoint after validating it against the catalogFile uploads (attachments and photos)
Fourteen Database API endpoints upload a file as multipart/form-data instead of taking JSON: every POST .../{Id}/attachments (bills, charges, journal entries, CA violations, rental applications, owners, occupancies, properties, units, inspections, work orders) plus POST /properties/{PropertyId}/photos, POST /properties/{PropertyId}/marketing_photos and POST /units/{UnitId}/photos. describe_endpoint marks them with requestBody.contentType: "multipart/form-data" and a fileUpload usage block.
Pass the local file through call_endpoint's file argument, not as a path string in body:
{
"params": {
"operation_id": "post_bills_billid_attachments",
"path_params": { "BillId": "8a1e6f3c-2b4d-4c5e-9f70-1a2b3c4d5e6f" },
"file": { "path": "C:/Users/me/Documents/receipts/invoice-1042.jpg" }
}
}A successful upload returns the new attachment's ID (AppFolio answers HTTP 201):
{ "operation_id": "post_bills_billid_attachments", "method": "POST", "path": "/bills/{BillId}/attachments",
"uploaded": { "field": "File", "filename": "invoice-1042.jpg", "contentType": "image/jpeg", "bytes": 48213 },
"result": { "Id": "<attachment UUID>" } }file.pathmust be an absolute path on the machine running the MCP server. The file must exist and be a readable, non-empty regular file of at most 100 MiB. It is checked and read before anything is sent, so a bad path never reaches AppFolio.The bytes are sent as the multipart part
File, with the filename (the path's basename unless you setfile.filename) and a MIME type guessed from the extension (override it withfile.content_type). The HTTP client generates the multipartContent-Typeand boundary itself. Authentication and rate limiting are the same as for every other request.Extra form fields go in
body, e.g."body": { "Position": 1 }for a marketing photo.body.Fileis rejected, because a path string there is what produced AppFolio's422: File parameter specified, but no file was passed.A
fileargument on a JSON endpoint is rejected. JSON endpoints are unchanged.Uploads are not retried automatically after a timeout or dropped connection, because AppFolio may already have stored the file and a retry could create a duplicate. The error says the outcome is unknown: check the record's attachments (e.g.
get_work_orders_attachments) before uploading again. Only HTTP 429 responses, which AppFolio rejects without storing anything, are retried.File contents and credentials are never logged or included in tool output.
API coverage
293 operations covered: 137 reports (Reports API v2) and 156 endpoints (Database API v0).
Category | Operations |
Reports: Association / HOA | 16 |
Reports: Financial | 34 |
Reports: Leasing | 16 |
Reports: Maintenance & Workflow | 12 |
Reports: Other | 2 |
Reports: Owner | 6 |
Reports: Property & Unit | 19 |
Reports: Registers & Transactions | 9 |
Reports: Rent Roll | 5 |
Reports: Tenant | 13 |
Reports: Vendor | 5 |
Database API: Accounting | 30 |
Database API: Community Associations | 12 |
Database API: Corporate Accounting | 2 |
Database API: Custom Fields | 1 |
Database API: Leasing | 20 |
Database API: Maintenance | 29 |
Database API: People | 21 |
Database API: Properties | 40 |
Database API: System | 1 |
Report | ID |
Board of Directors |
|
Dues Roll |
|
Dues Roll (Itemized) |
|
Eligible Debt Summary |
|
Fund Balance Sheet |
|
Fund Balance Sheet - Active Funds |
|
Fund Income Statement |
|
Homeowner Delinquency |
|
Homeowner Delinquency (As Of) |
|
Homeowner Directory |
|
Homeowner Ledger |
|
Homeowner Prepayment Balance |
|
Homeowner Resale |
|
Homeowner Vehicle Info |
|
Insurance Enforcement |
|
Violation Detail |
|
Report | ID |
Account Totals |
|
Additional Fees |
|
Aged Payables Summary |
|
Aged Receivable Detail |
|
Annual Budget - Comparative |
|
Annual Budget - Forecast |
|
Balance Sheet |
|
Balance Sheet - Comparative |
|
Balance Sheet - Property Comparison |
|
Bank Account Association |
|
Budget - Comparative |
|
Budget - Property Comparison |
|
Cash Flow |
|
Cash Flow - Property Comparison |
|
Cash Flow Detail |
|
Chart of Accounts |
|
Email Delivery Errors |
|
Expense Distribution |
|
Fixed Assets |
|
General Ledger |
|
Import Variances |
|
Income Statement |
|
Income Statement - Comparative |
|
Income Statement - Property Comparison |
|
Income Statement (Date Range) |
|
Insurance Usage |
|
Late Fee Policy Comparison |
|
Loans |
|
Trial Balance |
|
Trial Balance by Property |
|
Trust Account Balance |
|
Trust Account Detail |
|
Cash Flow - 12 Month |
|
Income Statement - 12 Month |
|
Report | ID |
Guest Card Inquiries |
|
Guest Card Interests |
|
Historical Advertised Rent |
|
Inactive Guest Card Interests |
|
Lease Expiration Detail By Month |
|
Lease Expiration Summary By Month |
|
Lease History |
|
Leasing Agent Performance |
|
Leasing Funnel Performance |
|
Leasing Summary |
|
Prospect Source Tracking |
|
Renewal Summary |
|
Rental Applications |
|
Screening Assessments |
|
Screening Usage |
|
Showings |
|
Report | ID |
Association Work Order |
|
Cancelled Workflows |
|
Completed Workflows |
|
Realm-X Flows Assigned Tasks |
|
In-Progress Workflows |
|
Inspection Detail |
|
Project Budget Detail |
|
Project Directory |
|
Unit Inspection |
|
Activities Summary |
|
Work Order |
|
Work Order Labor Summary |
|
Report | ID |
Receivables Activity |
|
Survey Responses |
|
Report | ID |
Owner Custom Fields |
|
Owner Directory |
|
Owner Leasing |
|
Owner Withholdings |
|
Owner 1099 Summary |
|
Owner 1099 Detail |
|
Report | ID |
Amenities By Property |
|
AppFolio Stack™ Usage |
|
Inventory Status |
|
Inventory Usage |
|
Keys Detail |
|
Occupancy Custom Fields |
|
Occupancy Summary |
|
Premium Listing Billing Detail |
|
Property Budget |
|
Property Custom Fields |
|
Property Directory |
|
Property Group Directory |
|
Property Performance |
|
Property Staff Assignments |
|
Rentable Items |
|
Unit Custom Fields |
|
Unit Directory |
|
Unit Turn Detail |
|
Unit Vacancy Detail |
|
Report | ID |
Bill Detail |
|
Charge Detail |
|
Check Register |
|
Check Register Detail (Enhanced) |
|
Deposit Register |
|
Expense Register |
|
Income Register |
|
Payment Plans |
|
Purchase Order |
|
Report | ID |
Gross Potential Rent |
|
Rent Roll |
|
Rent Roll (Commercial) |
|
Rent Roll (Itemized) |
|
Rent Roll (By Bed) |
|
Report | ID |
Delinquency |
|
Delinquency (As Of) |
|
Renter Directory |
|
Resident Financial Activity |
|
Security Deposit Funds Detail |
|
Debt Collections Status |
|
Tenant Directory |
|
Tenant Ledger |
|
Tenant Tickler |
|
Tenant Transactions Summary |
|
Tenant Unpaid Charges Summary |
|
Tenant Vehicle Info |
|
Unpaid Balances by Month |
|
Report | ID |
Vendor Custom Fields |
|
Vendor Directory |
|
Vendor Ledger |
|
Vendor Ledger (Enhanced) |
|
Vendor 1099 Summary |
|
Method | Path | Operation ID |
GET |
|
|
POST |
|
|
GET |
|
|
POST |
|
|
PATCH |
|
|
POST |
|
|
POST |
|
|
POST |
|
|
GET |
|
|
POST |
|
|
POST |
|
|
POST |
|
|
POST |
|
|
GET |
|
|
GET |
|
|
POST |
|
|
GET |
|
|
GET |
|
|
POST |
|
|
PATCH |
|
|
POST |
|
|
POST |
|
|
GET |
|
|
POST |
|
|
GET |
|
|
GET |
|
|
POST |
|
|
PATCH |
|
|
POST |
|
|
GET |
|
|
Method | Path | Operation ID |
GET |
|
|
GET |
|
|
GET |
|
|
GET |
|
|
GET |
|
|
GET |
|
|
GET |
|
|
GET |
|
|
GET |
|
|
POST |
|
|
PATCH |
|
|
POST |
|
|
Method | Path | Operation ID |
GET |
|
|
POST |
|
|
Method | Path | Operation ID |
GET |
|
|
Method | Path | Operation ID |
GET |
|
|
POST |
|
|
POST |
|
|
PATCH |
|
|
PATCH |
|
|
GET |
|
|
GET |
|
|
PATCH |
|
|
GET |
|
|
PUT |
|
|
GET |
|
|
GET |
|
|
PATCH |
|
|
POST |
|
|
POST |
|
|
PATCH |
|
|
GET |
|
|
GET |
|
|
POST |
|
|
PATCH |
|
|
Method | Path | Operation ID |
POST |
|
|
DELETE |
|
|
PATCH |
|
|
POST |
|
|
POST |
|
|
GET |
|
|
POST |
|
|
DELETE |
|
|
PATCH |
|
|
POST |
|
|
GET |
|
|
POST |
|
|
PATCH |
|
|
POST |
|
|
GET |
|
|
POST |
|
|
PATCH |
|
|
POST |
|
|
PATCH |
|
|
POST |
|
|
GET |
|
|
GET |
|
|
POST |
|
|
PATCH |
|
|
POST |
|
|
DELETE |
|
|
POST |
|
|
PATCH |
|
|
GET |
|
|
Method | Path | Operation ID |
GET |
|
|
POST |
|
|
PATCH |
|
|
GET |
|
|
POST |
|
|
GET |
|
|
PATCH |
|
|
POST |
|
|
POST |
|
|
PATCH |
|
|
GET |
|
|
POST |
|
|
GET |
|
|
GET |
|
|
PATCH |
|
|
POST |
|
|
PATCH |
|
|
PATCH |
|
|
POST |
|
|
GET |
|
|
GET |
|
|
Method | Path | Operation ID |
POST |
|
|
GET |
|
|
GET |
|
|
PATCH |
|
|
GET |
|
|
PATCH |
|
|
POST |
|
|
POST |
|
|
DELETE |
|
|
PATCH |
|
|
POST |
|
|
PATCH |
|
|
POST |
|
|
DELETE |
|
|
PATCH |
|
|
GET |
|
|
POST |
|
|
GET |
|
|
GET |
|
|
GET |
|
|
GET |
|
|
PATCH |
|
|
GET |
|
|
PATCH |
|
|
POST |
|
|
GET |
|
|
PATCH |
|
|
POST |
|
|
POST |
|
|
PATCH |
|
|
POST |
|
|
DELETE |
|
|
PATCH |
|
|
PUT |
|
|
GET |
|
|
POST |
|
|
GET |
|
|
GET |
|
|
PUT |
|
|
PUT |
|
|
Method | Path | Operation ID |
GET |
|
|
Contributing
Contributions and issues are welcome. Please open an issue first before submitting a PR.
License
AGPL-3.0: free for personal and open-source use. Organizations that cannot comply with the AGPL can purchase a commercial license, and hosted/managed versions are available. See COMMERCIAL.md or contact hello@nightsquawk.tech.
Copyright
For copyright concerns or takedown requests, contact hello@nightsquawk.tech.
Available Tools
6 toolscall_endpointA
Call an AppFolio Database API endpoint and return its JSON response. Validates the operationId and required path params against the catalog before calling AppFolio, then executes (GET reads are auto-paginated; POST/PATCH/PUT/DELETE writes execute live against your AppFolio database). Use describe_endpoint first to learn the exact params and body.
Inputs: params (required).
describe_endpointA
Get the full specification for a single AppFolio Database API endpoint: HTTP method, path and path params, query filters (GET), request body schema with nested attributes (writes), response fields, and a request sample. Call this before call_endpoint to know exactly which parameters to pass.
Inputs: params (required).
describe_reportA
Get the full parameter specification for a single AppFolio report: required and optional filters, types, enums, defaults, nested attributes, and response columns. Call this before run_report to know exactly which parameters to pass.
Inputs: params (required).
list_endpointsA
List the available AppFolio Database API endpoints (operationId, method, path, category, description). Optionally filter by category, resource, method, or reads-only. Use this to discover which endpoint to use, then call describe_endpoint for its parameters and call_endpoint to execute it. This is the AppFolio v0 Database API (records/CRUD), distinct from the Reporting API (list_reports/run_report).
Inputs: params (required).
list_reportsA
List the available AppFolio reports (slug, name, category, required filters). Optionally filter by category. Use this to discover which report to run, then call describe_report for its parameters and run_report to execute it.
Inputs: params (required).
run_reportA
Run an AppFolio report and return its rows. Validates the report name, required filters, and parameter names against the report catalog before calling AppFolio. Use describe_report first to learn the exact filter keys for the report.
Inputs: params (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 6 tools
The tools clearly separate into two distinct domains: reporting (list_reports, describe_report, run_report) and database API (list_endpoints, describe_endpoint, call_endpoint). Within each domain, the list/describe/execute functions have unambiguous roles, making misselection highly unlikely.
All tool names follow a consistent lowercase verb_noun pattern (list_, describe_, run_, call_). The naming clearly indicates both the action and the target resource, with no mixing of conventions or vague verbs.
With exactly 6 tools, the server is well-scoped. It covers two complementary API surfaces (reports and database endpoints) with a discover-describe-execute pattern for each, and every tool serves a distinct and necessary role.
The toolset fully covers the intended workflow for both reports and database endpoints: discover available options, inspect detailed parameters, and execute the operation. There are no obvious missing operations or dead ends, as call_endpoint handles all HTTP methods and reports are predefined resources.
Maintenance
Related MCP Connectors
Provide seamless access to Appfolio Property Manager Reporting API through a standardized MCP serv…
Work with your AppFolio® portfolio: tenants, vacancies, reports, maintenance, financials, and more.
Siftable MCP server for governed work, knowledge, calendar, people, datasets, and Vault.
AppFolio MCP server for ChatGPT, Claude and any AI agent: create work order, assign work order, schedule work order, list open work orders, get tenant ledger and run report in your own AppFolio account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to AppFolio yourself; Cotlet does not store your password and you need no AppFolio API key. About the official AppFolio API: Partly. AppFolio announced a Realm-X connector for Claude on 9 Jun 2026, which hands a job to Realm-X inside AppFolio, and its pricing page lists an AppFolio API on the Plus (read only) and Max (read/write) plans (checked 6 Nov 2026). Setup and FAQ: https://cotlet.dev/integrations/appfolio-api-mcp-server
Related MCP Servers
- AlicenseAqualityCmaintenanceA read-only MCP server for AppDynamics that exposes 12 task-oriented tools to query applications, topology, metrics, snapshots, health rules, anomalies, events, alerting config, analytics events, and dependency maps via OAuth API-client credentials.121MIT
- AlicenseAqualityBmaintenanceA read-only MCP server providing 56 tools to query Qobrix real-estate CRM data, covering listings, leads, viewings, offers, contracts, analytics, and more, with RESO Data Dictionary alignment and caching support.643Apache 2.0
- AlicenseNot gradedqualityDmaintenanceUnified MCP server for ArcGIS Online and Enterprise providing tools for user/group management, item management, geoprocessing, feature layer queries/editing, and server administration.3MIT
- FlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server that wraps AppFolio's REST API so Claude can call it natively in any conversation. 38 tools covering portfolio structure, leasing, financials, maintenance, and admin.1-