@nightsquawktech/appfolio-mcp-server 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/COMMERCIAL.md +35 -0
- package/LICENSE +661 -0
- package/README.md +127 -0
- package/dist/catalog/index.json +1511 -0
- package/dist/catalog/report-spec.js +27 -0
- package/dist/catalog/reports/account_totals.json +112 -0
- package/dist/catalog/reports/additional_fees.json +73 -0
- package/dist/catalog/reports/aged_payables_summary.json +124 -0
- package/dist/catalog/reports/aged_receivables_detail.json +132 -0
- package/dist/catalog/reports/amenities_by_property.json +73 -0
- package/dist/catalog/reports/annual_budget_comparative.json +138 -0
- package/dist/catalog/reports/annual_budget_forecast.json +125 -0
- package/dist/catalog/reports/appfolio_stack_usage.json +112 -0
- package/dist/catalog/reports/association_work_order.json +232 -0
- package/dist/catalog/reports/balance_sheet.json +124 -0
- package/dist/catalog/reports/balance_sheet_comparative.json +126 -0
- package/dist/catalog/reports/balance_sheet_comparison.json +113 -0
- package/dist/catalog/reports/bank_account_association.json +94 -0
- package/dist/catalog/reports/bill_detail.json +183 -0
- package/dist/catalog/reports/board_of_directors.json +87 -0
- package/dist/catalog/reports/budget_comparative.json +162 -0
- package/dist/catalog/reports/budget_comparison.json +141 -0
- package/dist/catalog/reports/cancelled_processes.json +122 -0
- package/dist/catalog/reports/cash_flow.json +158 -0
- package/dist/catalog/reports/cash_flow_comparison.json +158 -0
- package/dist/catalog/reports/cash_flow_detail.json +129 -0
- package/dist/catalog/reports/charge_detail.json +198 -0
- package/dist/catalog/reports/chart_of_accounts.json +22 -0
- package/dist/catalog/reports/check_register.json +181 -0
- package/dist/catalog/reports/check_register_detail.json +181 -0
- package/dist/catalog/reports/completed_processes.json +117 -0
- package/dist/catalog/reports/delinquency.json +164 -0
- package/dist/catalog/reports/delinquency_as_of.json +155 -0
- package/dist/catalog/reports/deposit_register.json +51 -0
- package/dist/catalog/reports/dues_roll.json +89 -0
- package/dist/catalog/reports/dues_roll_itemized.json +113 -0
- package/dist/catalog/reports/eligible_debt_summary.json +73 -0
- package/dist/catalog/reports/email_delivery_errors.json +104 -0
- package/dist/catalog/reports/expense_distribution.json +109 -0
- package/dist/catalog/reports/expense_register.json +149 -0
- package/dist/catalog/reports/fixed_assets.json +111 -0
- package/dist/catalog/reports/flows_assigned_tasks.json +103 -0
- package/dist/catalog/reports/fund_balance_sheet.json +113 -0
- package/dist/catalog/reports/fund_balance_sheet_active_funds.json +113 -0
- package/dist/catalog/reports/fund_income_statement.json +132 -0
- package/dist/catalog/reports/general_ledger.json +166 -0
- package/dist/catalog/reports/gross_potential_rent_enhanced.json +102 -0
- package/dist/catalog/reports/guest_card_inquiries.json +177 -0
- package/dist/catalog/reports/guest_cards.json +161 -0
- package/dist/catalog/reports/historical_advertised_rent.json +92 -0
- package/dist/catalog/reports/homeowner_delinquency.json +143 -0
- package/dist/catalog/reports/homeowner_delinquency_as_of.json +161 -0
- package/dist/catalog/reports/homeowner_directory.json +126 -0
- package/dist/catalog/reports/homeowner_ledger.json +59 -0
- package/dist/catalog/reports/homeowner_prepayment_balance.json +127 -0
- package/dist/catalog/reports/homeowner_resale.json +107 -0
- package/dist/catalog/reports/homeowner_vehicle_info.json +104 -0
- package/dist/catalog/reports/import_variances.json +41 -0
- package/dist/catalog/reports/in_progress_workflows.json +181 -0
- package/dist/catalog/reports/inactive_guest_cards.json +134 -0
- package/dist/catalog/reports/income_register.json +131 -0
- package/dist/catalog/reports/income_statement.json +130 -0
- package/dist/catalog/reports/income_statement_comparative.json +140 -0
- package/dist/catalog/reports/income_statement_comparison.json +135 -0
- package/dist/catalog/reports/income_statement_date_range.json +134 -0
- package/dist/catalog/reports/inspection_detail.json +107 -0
- package/dist/catalog/reports/insurance_enforcement.json +22 -0
- package/dist/catalog/reports/insurance_usage.json +92 -0
- package/dist/catalog/reports/inventory_status.json +73 -0
- package/dist/catalog/reports/inventory_usage.json +131 -0
- package/dist/catalog/reports/keys_detail.json +131 -0
- package/dist/catalog/reports/late_fee_policy_comparison.json +135 -0
- package/dist/catalog/reports/lease_expiration_detail.json +147 -0
- package/dist/catalog/reports/lease_expiration_summary.json +95 -0
- package/dist/catalog/reports/lease_history.json +147 -0
- package/dist/catalog/reports/leasing_agent_performance.json +54 -0
- package/dist/catalog/reports/leasing_funnel_performance.json +113 -0
- package/dist/catalog/reports/leasing_summary.json +92 -0
- package/dist/catalog/reports/loans.json +95 -0
- package/dist/catalog/reports/occupancy_custom_fields.json +73 -0
- package/dist/catalog/reports/occupancy_summary.json +95 -0
- package/dist/catalog/reports/owner1099.json +135 -0
- package/dist/catalog/reports/owner1099_detail.json +156 -0
- package/dist/catalog/reports/owner_custom_fields.json +73 -0
- package/dist/catalog/reports/owner_directory.json +101 -0
- package/dist/catalog/reports/owner_leasing.json +115 -0
- package/dist/catalog/reports/owner_withholdings.json +170 -0
- package/dist/catalog/reports/payment_plans.json +128 -0
- package/dist/catalog/reports/premium_leads_billing_detail.json +70 -0
- package/dist/catalog/reports/project_budget_detail.json +56 -0
- package/dist/catalog/reports/project_directory.json +144 -0
- package/dist/catalog/reports/property_budget.json +83 -0
- package/dist/catalog/reports/property_custom_fields.json +73 -0
- package/dist/catalog/reports/property_directory.json +73 -0
- package/dist/catalog/reports/property_group_directory.json +85 -0
- package/dist/catalog/reports/property_performance.json +115 -0
- package/dist/catalog/reports/property_staff_assignments.json +73 -0
- package/dist/catalog/reports/prospect_source_tracking.json +92 -0
- package/dist/catalog/reports/purchase_order.json +163 -0
- package/dist/catalog/reports/receivables_activity.json +138 -0
- package/dist/catalog/reports/renewal_summary.json +134 -0
- package/dist/catalog/reports/rent_roll.json +114 -0
- package/dist/catalog/reports/rent_roll_commercial.json +106 -0
- package/dist/catalog/reports/rent_roll_itemized.json +125 -0
- package/dist/catalog/reports/rentable_items.json +97 -0
- package/dist/catalog/reports/rental_applications.json +118 -0
- package/dist/catalog/reports/renter_directory.json +60 -0
- package/dist/catalog/reports/resident_financial_activity.json +107 -0
- package/dist/catalog/reports/screening_assessments.json +104 -0
- package/dist/catalog/reports/screening_usage.json +92 -0
- package/dist/catalog/reports/security_deposit_funds_detail.json +141 -0
- package/dist/catalog/reports/showings.json +123 -0
- package/dist/catalog/reports/student_housing_rent_roll_by_bed.json +125 -0
- package/dist/catalog/reports/surveys_summary.json +118 -0
- package/dist/catalog/reports/tenant_debt_collections_status.json +90 -0
- package/dist/catalog/reports/tenant_directory.json +120 -0
- package/dist/catalog/reports/tenant_ledger.json +72 -0
- package/dist/catalog/reports/tenant_tickler.json +102 -0
- package/dist/catalog/reports/tenant_transactions_summary.json +97 -0
- package/dist/catalog/reports/tenant_unpaid_charges_summary.json +147 -0
- package/dist/catalog/reports/tenant_vehicle_info.json +107 -0
- package/dist/catalog/reports/trial_balance.json +104 -0
- package/dist/catalog/reports/trial_balance_by_property.json +104 -0
- package/dist/catalog/reports/trust_account_balance.json +116 -0
- package/dist/catalog/reports/trust_account_balance_detail.json +112 -0
- package/dist/catalog/reports/twelve_month_cash_flow.json +157 -0
- package/dist/catalog/reports/twelve_month_income_statement.json +147 -0
- package/dist/catalog/reports/unit_custom_fields.json +73 -0
- package/dist/catalog/reports/unit_directory.json +80 -0
- package/dist/catalog/reports/unit_inspection.json +95 -0
- package/dist/catalog/reports/unit_turn_detail.json +104 -0
- package/dist/catalog/reports/unit_vacancy.json +143 -0
- package/dist/catalog/reports/unpaid_balances_by_month.json +181 -0
- package/dist/catalog/reports/upcoming_activities.json +142 -0
- package/dist/catalog/reports/vendor1099.json +84 -0
- package/dist/catalog/reports/vendor_custom_fields.json +22 -0
- package/dist/catalog/reports/vendor_directory.json +134 -0
- package/dist/catalog/reports/vendor_ledger.json +122 -0
- package/dist/catalog/reports/vendor_ledger_enhanced.json +122 -0
- package/dist/catalog/reports/violation_detail.json +122 -0
- package/dist/catalog/reports/work_order.json +254 -0
- package/dist/catalog/reports/work_order_labor_summary.json +148 -0
- package/dist/catalog-db/endpoint-spec.js +22 -0
- package/dist/catalog-db/endpoints/delete_inspections_inspectionid.json +21 -0
- package/dist/catalog-db/endpoints/delete_inventories_id.json +21 -0
- package/dist/catalog-db/endpoints/delete_properties_propertyid_marketing_photos_marketingphotoid.json +27 -0
- package/dist/catalog-db/endpoints/delete_properties_propertyid_photos_photoid.json +27 -0
- package/dist/catalog-db/endpoints/delete_units_unitid_photos_photoid.json +27 -0
- package/dist/catalog-db/endpoints/delete_work_orders_workorderid_attachments_attachmentid.json +27 -0
- package/dist/catalog-db/endpoints/get_bank_accounts.json +58 -0
- package/dist/catalog-db/endpoints/get_bills.json +185 -0
- package/dist/catalog-db/endpoints/get_ca_associations.json +106 -0
- package/dist/catalog-db/endpoints/get_ca_bank_balances.json +101 -0
- package/dist/catalog-db/endpoints/get_ca_board_members.json +146 -0
- package/dist/catalog-db/endpoints/get_ca_homeowner_ledgers.json +70 -0
- package/dist/catalog-db/endpoints/get_ca_homeowners.json +151 -0
- package/dist/catalog-db/endpoints/get_ca_renters.json +132 -0
- package/dist/catalog-db/endpoints/get_ca_rules.json +76 -0
- package/dist/catalog-db/endpoints/get_ca_units.json +130 -0
- package/dist/catalog-db/endpoints/get_ca_violations.json +119 -0
- package/dist/catalog-db/endpoints/get_charges.json +76 -0
- package/dist/catalog-db/endpoints/get_corporate_entities.json +88 -0
- package/dist/catalog-db/endpoints/get_custom_fields.json +120 -0
- package/dist/catalog-db/endpoints/get_delinquent_charges.json +88 -0
- package/dist/catalog-db/endpoints/get_gl_accounts.json +115 -0
- package/dist/catalog-db/endpoints/get_gl_details.json +154 -0
- package/dist/catalog-db/endpoints/get_inventories.json +131 -0
- package/dist/catalog-db/endpoints/get_inventory_locations.json +70 -0
- package/dist/catalog-db/endpoints/get_jobs.json +79 -0
- package/dist/catalog-db/endpoints/get_journal_entries.json +137 -0
- package/dist/catalog-db/endpoints/get_late_fee_policies.json +148 -0
- package/dist/catalog-db/endpoints/get_leads.json +248 -0
- package/dist/catalog-db/endpoints/get_leads_notes.json +83 -0
- package/dist/catalog-db/endpoints/get_leases.json +70 -0
- package/dist/catalog-db/endpoints/get_leases_renewal_pricings.json +52 -0
- package/dist/catalog-db/endpoints/get_listings.json +259 -0
- package/dist/catalog-db/endpoints/get_occupancies_documents.json +70 -0
- package/dist/catalog-db/endpoints/get_owner_groups.json +230 -0
- package/dist/catalog-db/endpoints/get_owners.json +258 -0
- package/dist/catalog-db/endpoints/get_owners_attachments.json +82 -0
- package/dist/catalog-db/endpoints/get_owners_notes.json +71 -0
- package/dist/catalog-db/endpoints/get_owners_ownerid.json +247 -0
- package/dist/catalog-db/endpoints/get_payables.json +138 -0
- package/dist/catalog-db/endpoints/get_portfolios.json +70 -0
- package/dist/catalog-db/endpoints/get_properties.json +267 -0
- package/dist/catalog-db/endpoints/get_properties_attachments.json +76 -0
- package/dist/catalog-db/endpoints/get_properties_marketing_photos.json +76 -0
- package/dist/catalog-db/endpoints/get_properties_notes.json +71 -0
- package/dist/catalog-db/endpoints/get_properties_photos.json +76 -0
- package/dist/catalog-db/endpoints/get_property_groups.json +84 -0
- package/dist/catalog-db/endpoints/get_recurring_charges.json +106 -0
- package/dist/catalog-db/endpoints/get_rental_applications.json +186 -0
- package/dist/catalog-db/endpoints/get_rental_applications_notes.json +71 -0
- package/dist/catalog-db/endpoints/get_showings.json +99 -0
- package/dist/catalog-db/endpoints/get_tenant_ledgers.json +82 -0
- package/dist/catalog-db/endpoints/get_tenants.json +273 -0
- package/dist/catalog-db/endpoints/get_tenants_notes.json +71 -0
- package/dist/catalog-db/endpoints/get_unit_types.json +168 -0
- package/dist/catalog-db/endpoints/get_units.json +359 -0
- package/dist/catalog-db/endpoints/get_units_attachments.json +76 -0
- package/dist/catalog-db/endpoints/get_units_notes.json +71 -0
- package/dist/catalog-db/endpoints/get_units_photos.json +70 -0
- package/dist/catalog-db/endpoints/get_users.json +88 -0
- package/dist/catalog-db/endpoints/get_vendors.json +317 -0
- package/dist/catalog-db/endpoints/get_vendors_notes.json +71 -0
- package/dist/catalog-db/endpoints/get_work_orders.json +322 -0
- package/dist/catalog-db/endpoints/get_work_orders_attachments.json +83 -0
- package/dist/catalog-db/endpoints/patch_bills_billid.json +156 -0
- package/dist/catalog-db/endpoints/patch_ca_violations_violationid.json +71 -0
- package/dist/catalog-db/endpoints/patch_inspections_inspectionid.json +77 -0
- package/dist/catalog-db/endpoints/patch_inventories_id.json +113 -0
- package/dist/catalog-db/endpoints/patch_inventory_locations_id.json +52 -0
- package/dist/catalog-db/endpoints/patch_journal_entries_journalentryid.json +90 -0
- package/dist/catalog-db/endpoints/patch_leads_guestcardid_notes_id.json +46 -0
- package/dist/catalog-db/endpoints/patch_leads_leadid.json +162 -0
- package/dist/catalog-db/endpoints/patch_leases_leaseid.json +52 -0
- package/dist/catalog-db/endpoints/patch_owner_groups_id.json +72 -0
- package/dist/catalog-db/endpoints/patch_owners_ownerid.json +344 -0
- package/dist/catalog-db/endpoints/patch_owners_ownerid_notes_id.json +46 -0
- package/dist/catalog-db/endpoints/patch_portfolios_portfolioid.json +46 -0
- package/dist/catalog-db/endpoints/patch_properties_propertyid.json +333 -0
- package/dist/catalog-db/endpoints/patch_properties_propertyid_marketing_photos_marketingphotoid.json +46 -0
- package/dist/catalog-db/endpoints/patch_properties_propertyid_notes_id.json +46 -0
- package/dist/catalog-db/endpoints/patch_properties_propertyid_photos_photoid.json +46 -0
- package/dist/catalog-db/endpoints/patch_property_groups_propertygroupid.json +40 -0
- package/dist/catalog-db/endpoints/patch_recurring_charges_recurringchargeid.json +89 -0
- package/dist/catalog-db/endpoints/patch_rental_applications_rentalapplicationid.json +47 -0
- package/dist/catalog-db/endpoints/patch_rental_applications_rentalapplicationid_notes_id.json +46 -0
- package/dist/catalog-db/endpoints/patch_showings_showingid.json +69 -0
- package/dist/catalog-db/endpoints/patch_tenants_bulk.json +131 -0
- package/dist/catalog-db/endpoints/patch_tenants_tenantid.json +48 -0
- package/dist/catalog-db/endpoints/patch_tenants_tenantid_notes_id.json +46 -0
- package/dist/catalog-db/endpoints/patch_unit_types_unittypeid.json +126 -0
- package/dist/catalog-db/endpoints/patch_units_unitid.json +296 -0
- package/dist/catalog-db/endpoints/patch_units_unitid_notes_id.json +46 -0
- package/dist/catalog-db/endpoints/patch_units_unitid_photos_photoid.json +46 -0
- package/dist/catalog-db/endpoints/patch_vendors_vendorid.json +263 -0
- package/dist/catalog-db/endpoints/patch_vendors_vendorid_notes_id.json +46 -0
- package/dist/catalog-db/endpoints/patch_work_orders_workorderid.json +273 -0
- package/dist/catalog-db/endpoints/patch_work_orders_workorderid_notes_id.json +46 -0
- package/dist/catalog-db/endpoints/post_bank_accounts_bulk.json +167 -0
- package/dist/catalog-db/endpoints/post_bills.json +160 -0
- package/dist/catalog-db/endpoints/post_bills_billid_attachments.json +40 -0
- package/dist/catalog-db/endpoints/post_bills_bulk.json +185 -0
- package/dist/catalog-db/endpoints/post_bills_bulk_async.json +192 -0
- package/dist/catalog-db/endpoints/post_ca_violations.json +63 -0
- package/dist/catalog-db/endpoints/post_ca_violations_violationid_attachments.json +41 -0
- package/dist/catalog-db/endpoints/post_charges.json +56 -0
- package/dist/catalog-db/endpoints/post_charges_bulk.json +70 -0
- package/dist/catalog-db/endpoints/post_charges_bulk_async.json +70 -0
- package/dist/catalog-db/endpoints/post_charges_chargeid_attachments.json +40 -0
- package/dist/catalog-db/endpoints/post_corporate_gl_accounts_bulk.json +71 -0
- package/dist/catalog-db/endpoints/post_gl_accounts_bulk.json +77 -0
- package/dist/catalog-db/endpoints/post_inspections.json +70 -0
- package/dist/catalog-db/endpoints/post_inspections_bulk.json +76 -0
- package/dist/catalog-db/endpoints/post_inspections_inspectionid_attachments.json +41 -0
- package/dist/catalog-db/endpoints/post_inventories.json +105 -0
- package/dist/catalog-db/endpoints/post_inventories_bulk.json +119 -0
- package/dist/catalog-db/endpoints/post_inventory_locations.json +44 -0
- package/dist/catalog-db/endpoints/post_inventory_locations_bulk.json +58 -0
- package/dist/catalog-db/endpoints/post_journal_entries.json +101 -0
- package/dist/catalog-db/endpoints/post_journal_entries_bulk.json +115 -0
- package/dist/catalog-db/endpoints/post_journal_entries_journalentryid_attachments.json +41 -0
- package/dist/catalog-db/endpoints/post_late_fee_policies_bulk.json +115 -0
- package/dist/catalog-db/endpoints/post_leads.json +204 -0
- package/dist/catalog-db/endpoints/post_leads_guestcardid_notes.json +40 -0
- package/dist/catalog-db/endpoints/post_occupancies_occupancyid_attachments.json +41 -0
- package/dist/catalog-db/endpoints/post_owner_groups.json +96 -0
- package/dist/catalog-db/endpoints/post_owners.json +330 -0
- package/dist/catalog-db/endpoints/post_owners_bulk.json +203 -0
- package/dist/catalog-db/endpoints/post_owners_ownerid_attachments.json +40 -0
- package/dist/catalog-db/endpoints/post_owners_ownerid_notes.json +40 -0
- package/dist/catalog-db/endpoints/post_properties_bulk.json +245 -0
- package/dist/catalog-db/endpoints/post_properties_propertyid_attachments.json +40 -0
- package/dist/catalog-db/endpoints/post_properties_propertyid_marketing_photos.json +52 -0
- package/dist/catalog-db/endpoints/post_properties_propertyid_notes.json +40 -0
- package/dist/catalog-db/endpoints/post_properties_propertyid_photos.json +40 -0
- package/dist/catalog-db/endpoints/post_recurring_charges.json +81 -0
- package/dist/catalog-db/endpoints/post_recurring_charges_bulk.json +95 -0
- package/dist/catalog-db/endpoints/post_rental_applications_rentalapplicationid_attachments.json +41 -0
- package/dist/catalog-db/endpoints/post_rental_applications_rentalapplicationid_notes.json +40 -0
- package/dist/catalog-db/endpoints/post_showings.json +62 -0
- package/dist/catalog-db/endpoints/post_tenants_bulk.json +161 -0
- package/dist/catalog-db/endpoints/post_tenants_tenantid_notes.json +40 -0
- package/dist/catalog-db/endpoints/post_unit_types_bulk.json +138 -0
- package/dist/catalog-db/endpoints/post_units_bulk.json +236 -0
- package/dist/catalog-db/endpoints/post_units_unitid_attachments.json +40 -0
- package/dist/catalog-db/endpoints/post_units_unitid_notes.json +40 -0
- package/dist/catalog-db/endpoints/post_units_unitid_photos.json +40 -0
- package/dist/catalog-db/endpoints/post_vendors.json +279 -0
- package/dist/catalog-db/endpoints/post_vendors_bulk.json +279 -0
- package/dist/catalog-db/endpoints/post_vendors_vendorid_notes.json +40 -0
- package/dist/catalog-db/endpoints/post_work_orders.json +251 -0
- package/dist/catalog-db/endpoints/post_work_orders_workorderid_attachments.json +41 -0
- package/dist/catalog-db/endpoints/post_work_orders_workorderid_notes.json +40 -0
- package/dist/catalog-db/endpoints/put_leases_renewal_pricings_bulk.json +58 -0
- package/dist/catalog-db/endpoints/put_units_pricing_matrices_bulk.json +58 -0
- package/dist/catalog-db/endpoints/put_units_pricing_matrices_bulk_async.json +46 -0
- package/dist/catalog-db/endpoints/put_units_unitid_pricing_matrices.json +66 -0
- package/dist/catalog-db/index.json +1894 -0
- package/dist/clients/appfolio-client.js +131 -0
- package/dist/clients/appfolio-db-client.js +186 -0
- package/dist/helpers/register-db-tools.js +27 -0
- package/dist/helpers/register-report-tools.js +27 -0
- package/dist/index.js +10 -0
- package/dist/server/appfolio-mcp-server.js +18 -0
- package/dist/tools/call-endpoint.js +109 -0
- package/dist/tools/describe-endpoint.js +63 -0
- package/dist/tools/describe-report.js +55 -0
- package/dist/tools/list-endpoints.js +90 -0
- package/dist/tools/list-reports.js +58 -0
- package/dist/tools/run-report.js +102 -0
- package/package.json +42 -0
package/README.md
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# AppFolio MCP Server
|
|
2
|
+
|
|
3
|
+
[](https://scorecard.dev/viewer/?uri=github.com/NightSquawk/appfolio-mcp-server)
|
|
4
|
+
|
|
5
|
+
MCP server for AppFolio property management data, covering **two** AppFolio APIs, each through **3 consolidated catalog-backed tools** rather than one tool per endpoint:
|
|
6
|
+
|
|
7
|
+
- **Reporting API v2**: all **137** read-only reports (`list_reports` / `describe_report` / `run_report`). See [Reporting API Overview](https://help.appfolio.com/s/article/Reporting-API-Overview).
|
|
8
|
+
- **Database API v0**: all **156** record/CRUD endpoints (`list_endpoints` / `describe_endpoint` / `call_endpoint`). Reads (GET) **and** writes (POST/PATCH/PUT/DELETE) against `https://api.appfolio.com/api/v0`.
|
|
9
|
+
|
|
10
|
+
Six tools total. Each API has its own catalog (`src/catalog/` for reports, `src/catalog-db/` for the database) and its own credentials.
|
|
11
|
+
|
|
12
|
+
## Prerequisites
|
|
13
|
+
|
|
14
|
+
- Node.js 18+
|
|
15
|
+
- **Reporting API**: credentials (Client ID + Client Secret) from **Account Settings > Manage API Settings > Reports API Credentials**
|
|
16
|
+
- **Database API**: a Developer ID (Admin > Developer ID) plus Basic Auth credentials (Client ID + Client Secret) generated under **API Credentials > Basic Auth**
|
|
17
|
+
|
|
18
|
+
## Setup
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install
|
|
22
|
+
npm run build
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Environment Variables
|
|
26
|
+
|
|
27
|
+
| Variable | Required | Description |
|
|
28
|
+
|----------|----------|-------------|
|
|
29
|
+
| `APPFOLIO_VHOST` | Reporting API | Your AppFolio database name (the subdomain in `{vhost}.appfolio.com`) |
|
|
30
|
+
| `APPFOLIO_CLIENT_ID` | Reporting API | Reports API Client ID |
|
|
31
|
+
| `APPFOLIO_CLIENT_SECRET` | Reporting API | Reports API Client Secret |
|
|
32
|
+
| `APPFOLIO_DB_DEVELOPER_ID` | Database API | Your AppFolio Developer ID (Admin > Developer ID) |
|
|
33
|
+
| `APPFOLIO_DB_CLIENT_ID` | Database API | Database API Basic Auth Client ID |
|
|
34
|
+
| `APPFOLIO_DB_CLIENT_SECRET` | Database API | Database API Basic Auth Client Secret |
|
|
35
|
+
|
|
36
|
+
Each API's tools only need their own credentials; the other set's tools simply error at call time if their vars are unset. Configure one or both. See `.env.example`.
|
|
37
|
+
|
|
38
|
+
## MCP Client Configuration
|
|
39
|
+
|
|
40
|
+
Add to your MCP client config (`.mcp.json` for Claude Code, `claude_desktop_config.json` for Claude Desktop):
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"mcpServers": {
|
|
45
|
+
"appfolio": {
|
|
46
|
+
"command": "npx",
|
|
47
|
+
"args": ["-y", "@nightsquawktech/appfolio-mcp-server"],
|
|
48
|
+
"env": {
|
|
49
|
+
"APPFOLIO_VHOST": "yourcompany",
|
|
50
|
+
"APPFOLIO_CLIENT_ID": "<reports-client-id>",
|
|
51
|
+
"APPFOLIO_CLIENT_SECRET": "<reports-client-secret>",
|
|
52
|
+
"APPFOLIO_DB_DEVELOPER_ID": "<developer-id>",
|
|
53
|
+
"APPFOLIO_DB_CLIENT_ID": "<db-client-id>",
|
|
54
|
+
"APPFOLIO_DB_CLIENT_SECRET": "<db-client-secret>"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
For multiple AppFolio databases, add separate entries with different names and credentials.
|
|
62
|
+
|
|
63
|
+
## Tools
|
|
64
|
+
|
|
65
|
+
### Reporting API (read-only)
|
|
66
|
+
|
|
67
|
+
Three tools cover all 137 reports. The expected flow is **discover, describe, run**:
|
|
68
|
+
|
|
69
|
+
| Tool | Purpose |
|
|
70
|
+
|------|---------|
|
|
71
|
+
| `list_reports(category?)` | List reports (slug, name, category, required filters). Optionally filter by category. |
|
|
72
|
+
| `describe_report(report_name)` | Full parameter spec for one report: required/optional filters, types, enums, defaults, nested attributes, and response columns. |
|
|
73
|
+
| `run_report(report_name, filters?, columns?, paginate_results?, page?, limit?)` | Run a report. Validates the report name, required filters, and parameter names against the catalog before calling AppFolio. |
|
|
74
|
+
|
|
75
|
+
`run_report` rejects unknown reports (with fuzzy suggestions), unknown parameters (listing the valid ones), and missing required filters, all before any network call. Enum values are advisory (surfaced via `describe_report`) and not hard-enforced, to avoid rejecting valid inputs over documentation quirks.
|
|
76
|
+
|
|
77
|
+
### Report catalog
|
|
78
|
+
|
|
79
|
+
The reports are described in a generated catalog under `src/catalog/`:
|
|
80
|
+
|
|
81
|
+
- `src/catalog/reports/<slug>.json`: one fully-documented spec per report (parameters, requiredFilters, requestSample, responseColumns), generated from the AppFolio Reports API v2 reference documentation.
|
|
82
|
+
- `src/catalog/index.json`: aggregate index (slug, name, category, required filters) plus the universal pagination params.
|
|
83
|
+
|
|
84
|
+
The build copies the catalog into `dist/`. Regenerate the index after editing report specs with `node scripts/assemble-catalog.mjs`.
|
|
85
|
+
|
|
86
|
+
Reports span these categories: **Financial** (34), **Property & Unit** (19), **Association / HOA** (16), **Leasing** (16), **Tenant** (13), **Maintenance & Workflow** (12), **Registers & Transactions** (9), **Owner** (6), **Rent Roll** (5), **Vendor** (5), **Other** (2). Run `list_reports` for the full list.
|
|
87
|
+
|
|
88
|
+
### Database API (read + write)
|
|
89
|
+
|
|
90
|
+
Three tools cover all 156 v0 endpoints. Same flow: **discover, describe, call**.
|
|
91
|
+
|
|
92
|
+
| Tool | Purpose |
|
|
93
|
+
|------|---------|
|
|
94
|
+
| `list_endpoints(category?, resource?, method?, reads_only?)` | List endpoints (operationId, method, path, category, description). |
|
|
95
|
+
| `describe_endpoint(operation_id)` | Full spec for one endpoint: path params, query filters, request-body schema (with nested attributes), response fields, and a request sample. |
|
|
96
|
+
| `call_endpoint(operation_id, path_params?, filters?, body?, query?, page?, paginate_results?)` | Execute the endpoint. Validates the operationId and required path params against the catalog, then calls AppFolio. |
|
|
97
|
+
|
|
98
|
+
The `filters` argument is keyed by filter name (the `filters[...]` wrapper is added automatically), e.g. `{ LastUpdatedAtFrom: "2020-01-01T00:00:00Z" }`. Most GET list endpoints expect at least a `filters[Id]` or `filters[LastUpdatedAtFrom]` value. Filters are **advisory**: the AppFolio reference rarely enumerates every filter, so unknown filters are not rejected.
|
|
99
|
+
|
|
100
|
+
> ⚠️ **Writes are live and ungated.** `call_endpoint` executes POST/PATCH/PUT/DELETE (including bulk creates and deletes) directly against your AppFolio database. There is no confirmation gate. Use `describe_endpoint` to confirm the body schema first.
|
|
101
|
+
|
|
102
|
+
Endpoints span these categories: **Properties** (40), **Accounting** (30), **Maintenance** (29), **People** (21), **Leasing** (20), **Community Associations** (12), **Corporate Accounting** (2), **Custom Fields** (1), **System** (1). By method: 58 GET, 55 POST, 33 PATCH, 6 DELETE, 4 PUT.
|
|
103
|
+
|
|
104
|
+
#### Endpoint catalog
|
|
105
|
+
|
|
106
|
+
The endpoints are described in a generated catalog under `src/catalog-db/`:
|
|
107
|
+
|
|
108
|
+
- `src/catalog-db/endpoints/<operationId>.json`: one fully-documented spec per endpoint (method, path, pathParams, queryFilters, requestBody with nested attributes, responseFields, requestSample), generated from the AppFolio Database API reference documentation.
|
|
109
|
+
- `src/catalog-db/index.json`: aggregate index (operationId, resource, category, method, path).
|
|
110
|
+
|
|
111
|
+
The build copies the catalog into `dist/`. Regenerate the index after editing endpoint specs with `node scripts/assemble-catalog-db.mjs` (it validates all 156 expected operationIds are present).
|
|
112
|
+
|
|
113
|
+
## Rate Limiting
|
|
114
|
+
|
|
115
|
+
- **Reporting API**: 7 requests per 15 seconds. The client throttles to stay within this; pagination URL fetches are exempt per the API spec.
|
|
116
|
+
- **Database API**: 8/sec, 256/min, 4096/hour per credential set. The client throttles across all three windows and honors the `Retry-After` header on 429 responses (with bounded retries).
|
|
117
|
+
|
|
118
|
+
## Pagination
|
|
119
|
+
|
|
120
|
+
- **Reporting API**: reports >5,000 rows auto-paginate; the client follows `next_page_url` links (valid 30 min) and aggregates pages. Set `paginate_results: false` to disable.
|
|
121
|
+
- **Database API**: GET list endpoints auto-paginate by following `next_page_path` and aggregating `data` arrays (default page size 1000). Set `paginate_results: false` for a single page, or pass `page: { number, size }`.
|
|
122
|
+
|
|
123
|
+
## License
|
|
124
|
+
|
|
125
|
+
Licensed under the [GNU AGPL v3.0](./LICENSE). Free for personal and open-source use.
|
|
126
|
+
|
|
127
|
+
Organizations that cannot comply with the AGPL can purchase a commercial license. See [COMMERCIAL.md](./COMMERCIAL.md) or contact hello@nightsquawk.tech.
|