AppFolio MCP server for Claude, Cursor, and AI agents: 137 reports + 156 Database API endpoints behind 6 catalog-backed tools.
Strong catalog-backed design with 6 well-named tools covering discovery, specification, and execution patterns. All tools have descriptions (194 - 250 chars, within baseline 34 - 392 range) and input schemas with typed parameters. Naming follows verb_noun convention (list_, describe_, run_, call_). However, output schemas are not explicitly documented in the source code, responses are inferred from API behavior rather than formally declared. Error handling exists but lacks recovery guidance. No tool annotations (readOnlyHint/destructiveHint) despite clear risk profiles. Parameter descriptions are present but some lack format/constraint details (e.g., 'filters' object lacks nested schema documentation).
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.
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.
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.
Discover AppFolio Database API endpoints by category, resource, or method. Returns all 156 available endpoints with their operationIds, HTTP methods, paths, and descriptions.
Discover AppFolio reports by category. Returns all 137 available reports with their slugs, names, categories, and descriptions.
Output schemas not formally documented. Tool descriptions state what is returned (e.g., 'returns all 137 available reports with their slugs, names, categories, and descriptions') but the actual response structure is not declared in JSON Schema format. LLMs cannot reliably parse or chain results without explicit output schemas.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). call_endpoint is marked WRITE risk but the tool definition lacks destructiveHint annotation. run_report and list_* are READ_ONLY but lack readOnlyHint. Agents cannot infer safety/retry semantics without annotations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Execute an AppFolio report and return its results. Validates parameters against the catalog spec, then executes the report with auto-pagination to aggregate all rows.
Complex parameter 'filters' (object type) lacks nested schema documentation. run_report and call_endpoint accept filters as key-value pairs but do not declare the nested structure, valid keys, or value types. LLMs must call describe_report/describe_endpoint first, which is correct but the parameter description should hint at this dependency.
Error handling lacks recovery guidance. AppfolioClient throws generic errors (e.g., 'Missing required environment variables') but tool responses do not include actionable next steps. Per pattern:recovery-guide, errors should suggest alternatives or retry strategies.
Pagination parameters (page, limit, paginate_results) lack explicit constraints. No min/max bounds documented for page number or limit size. Unbounded numeric parameters invite LLMs to pass absurd values (e.g., page=999999, limit=1000000).