AppFolio MCP Server
Click on "Install 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 Servershow 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: appd-mcp
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 |
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 catalogAPI 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.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseCqualityDmaintenanceAn MCP server that provides LLMs with access to Acquia's Customer Data Platform API. It offers approximately 300 tools for managing CDP tenants, campaigns, workflows, reports, and other administrative tasks, along with eight playbook resources that guide multi-step workflows.Last updated100
- AlicenseAqualityBmaintenanceA 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.Last updated121MIT
- Alicense-qualityAmaintenanceA 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.Last updated3Apache 2.0
- Alicense-qualityBmaintenanceUnified MCP server for ArcGIS Online and Enterprise providing tools for user/group management, item management, geoprocessing, feature layer queries/editing, and server administration.Last updated2MIT
Related MCP Connectors
Provide seamless access to Appfolio Property Manager Reporting API through a standardized MCP servā¦
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
34 production API tools over one hosted MCP endpoint.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/NightSquawk/appfolio-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server