AppFolio MCP server Let your AI agent run your AppFolio work orders.

Your AI agent logs maintenance requests as work orders, dispatches them to vendors once you approve, and pulls the ledgers and reports behind your calls. Sign in to AppFolio once in your own Cloud Browser. No API credentials and no developer setup, and it works inside ChatGPT and Claude.

  • Free 7-day trial, no card
  • Unofficial, not affiliated with AppFolio
AppFolio logo AppFolio Cloud Browser

10 tools Read, work orders write

Requests to reports

What can your AI agent do in AppFolio? The property office jobs that repeat every week.

  • Log maintenance requests as work orders

  • Chase work orders left open too long

  • Dispatch work orders to vendors

  • Schedule a visit on the calendar

  • Read a tenant ledger before a call

  • Run reports and rank the balances

Official route exists

Does AppFolio have an MCP server or an API? Yes, for Claude and on higher plans. Cotlet adds ChatGPT and no setup.

AppFolio announced a Realm-X connector for Claude on 9 Jun 2026 (checked 6 Nov 2026), and its pricing page lists an AppFolio API on Plus (read only) and Max (read/write). Cotlet runs 10 AppFolio tools hosted, over MCP for agents and REST for scripts, in your own login: no API credentials, no developer setup, available in ChatGPT and Claude, running 24/7, with one account for many apps.

  • The Realm-X connector for Claude is an agent-to-agent link: Claude hands a job to Realm-X and AppFolio runs it inside the platform. AppFolio says it exposes "operational jobs", not API endpoints. We found no ChatGPT version.
  • AppFolio lists "AppFolio API (read only)" on Plus and "AppFolio API (read/write)" on Max; Core lists none. A System Administrator creates the credentials, and a community MCP server then needs them in a config file.
  • The Stack API, with 35 endpoint groups including work orders, vendors and tenant ledgers, is built for AppFolio Stack partners. No Zapier or Make app and no n8n node exist.
AppFolio with its Realm-X connector, its API and Cotlet compared
What you need Realm-X connectorAppFolio APICotlet
Read work orders, vendors and properties Through a Realm-X job Yes Yes
Create, assign and schedule work orders Through a Realm-X job On Max, you build it Yes, after your OK
Run reports and read tenant ledgers Through a Realm-X job Yes Yes
Works in ChatGPT Claude only Only if you build it Yes, and Claude
What you need first AppFolio access to the connector Plus or Max, admin credentials Your AppFolio login

Checked 6 Nov 2026. Sources: AppFolio connects Realm-X to Anthropic's Claude (AppFolio newsroom, 9 Jun 2026) · AppFolio pricing · AppFolio Stack API endpoints · NightSquawk/appfolio-mcp-server on GitHub

Set up once

How does the AppFolio MCP server work? Your agent works in your own AppFolio login.

  1. 1Sign in to AppFolio

    Once, in a browser we host for you.

  2. 2Connect your AI agent

    Paste one address into its settings.

  3. 3Ask about your properties

    It reads, and asks before it creates or assigns.

We never keep your AppFolio password, and no work order is created, assigned or scheduled before you approve it. Who can see your session

Any MCP client

How to connect AppFolio to your AI agent

  1. 1

    Sign in to AppFolio in a Cloud Browser. Create a Cotlet account, open AppFolio in its Cloud Browser, sign in with your own property manager login, then press Enable for agents.

  2. 2

    Add the Cotlet address. Paste https://cotlet.dev/mcp/v1 into the MCP server or connector field of your agent.

  3. 3

    Approve the connection. Chat apps show a Cotlet sign-in page. Code editors, n8n and scripts send an API key from the console.

https://cotlet.dev/mcp/v1 serves every app you enable on Cotlet, AppFolio included. Enable AppFolio after you connect, then refresh the connector to load its tools.

Claude
Settings > Connectors > Add custom connector
URL: https://cotlet.dev/mcp/v1/connect

Claude Code:
claude mcp add --transport http cotlet \
  https://cotlet.dev/mcp/v1 \
  --header "Authorization: Bearer $COTLET_API_KEY"
ChatGPT
Settings > Apps & Connectors > Create
MCP server URL: https://cotlet.dev/mcp/v1/connect
Authentication: OAuth
Cursor
// ~/.cursor/mcp.json
{
  "mcpServers": {
    "cotlet": {
      "url": "https://cotlet.dev/mcp/v1",
      "headers": { "Authorization": "Bearer ${env:COTLET_API_KEY}" }
    }
  }
}
Codex
# ~/.codex/config.toml
[mcp_servers.cotlet]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY"
n8n
MCP Client Tool (inside an AI Agent)
Transport: HTTP Streamable
URL: https://cotlet.dev/mcp/v1
Auth: Bearer, <your key>
Tool: appfolio_read
Make, Zapier
Make: MCP Client > Call a tool
Zapier: MCP Client by Zapier > Run Tool
Server URL: https://cotlet.dev/mcp/v1
Token: <your key>
Tool: appfolio_write
7 read, 3 write

All 10 AppFolio MCP tools

Properties and vendors2

Read only. Use the names these return in the work order tools.

  • list_properties Properties in your AppFolio account with address and units. read

    Returns the properties your user can see, with address and unit count. Search matches the property name or address. Use the names it returns in the other tools.

    MCP callappfolio_read → list_properties

    REST endpointGET https://cotlet.dev/api/v1/appfolio/properties

    Parameters

    Parameters: list_properties
    NameTypeDescription
    search string string Match on property name or address.
    cursor string string Next page cursor from the previous call.

    Example response

    {
      "properties": [
        {
          "name": "Maple Court",
          "address": "120 Maple St, Springfield",
          "units": 12
        }
      ],
      "next_cursor": null
    }
  • list_vendors Vendors saved in AppFolio with trade and contact. read

    Returns the vendors in your account with name, trade and contact details. Search matches the vendor name. Use the exact name in assign_work_order.

    MCP callappfolio_read → list_vendors

    REST endpointGET https://cotlet.dev/api/v1/appfolio/vendors

    Parameters

    Parameters: list_vendors
    NameTypeDescription
    search string string Match on vendor name.
    cursor string string Next page cursor from the previous call.

    Example response

    {
      "vendors": [
        {
          "name": "Ortiz Plumbing",
          "trade": "Plumbing",
          "phone": "555-0142"
        }
      ],
      "next_cursor": null
    }

Work orders5

The three writes live here. An assignment or a scheduled visit can notify the assignee and the resident, so each one waits for your OK.

  • list_work_orders Work orders with property, unit, status, assignee and age, newest first. read

    Returns work orders the way the app lists them: property, unit, issue, status, who it is assigned to and the date created. Filter by status or property. Use work_order_id from here in the other work order tools.

    MCP callappfolio_read → list_work_orders

    REST endpointGET https://cotlet.dev/api/v1/appfolio/work-orders

    Parameters

    Parameters: list_work_orders
    NameTypeDescription
    status string string Status as named in your AppFolio, for example New or Completed. Default: all open.
    property string string Only this property, by name or address as listed in list_properties.
    cursor string string Next page cursor from the previous call.

    Example response

    {
      "work_orders": [
        {
          "work_order_id": "WO-1042",
          "property": "Maple Court",
          "unit": "7",
          "issue": "Kitchen sink leaking",
          "status": "New",
          "assigned_to": null,
          "created": "2026-11-02"
        }
      ],
      "next_cursor": null
    }
  • get_work_order One work order with its description, vendor, schedule and history. read

    Returns the full work order: description, property and unit, status, assignee, scheduled time and the history of edits the app keeps. Use it to check what was already done before assigning or scheduling.

    MCP callappfolio_read → get_work_order

    REST endpointGET https://cotlet.dev/api/v1/appfolio/work-orders/{work_order_id}

    Parameters

    Parameters: get_work_order
    NameTypeDescription
    work_order_id string required string Work order ID from list_work_orders.

    Example input

    {
      "work_order_id": "work_order_8c41d2"
    }

    Example response

    {
      "work_order_id": "WO-1042",
      "property": "Maple Court",
      "unit": "7",
      "issue": "Kitchen sink leaking",
      "description": "Water under the sink after each use.",
      "status": "New",
      "assigned_to": null,
      "scheduled": null,
      "history": [
        {
          "at": "2026-11-02T09:10:00Z",
          "event": "Created"
        }
      ]
    }
  • create_work_order New work order for a property and unit. writeasks first

    Creates a work order with the issue, property, unit and description you give. It appears in the work order list and can notify the people the app is set to notify. Check list_work_orders first so the same request is not logged twice. By default you confirm each call; you can switch that off for this tool.

    MCP callappfolio_write → create_work_order

    REST endpointPOST https://cotlet.dev/api/v1/appfolio/work-orders

    Parameters

    Parameters: create_work_order
    NameTypeDescription
    property string required string Property name from list_properties.
    unit string string Unit the issue concerns.
    issue string required string Short title.
    description string string Details for whoever does the work.

    Example input

    {
      "property": "Maple Court",
      "unit": "7",
      "issue": "Kitchen sink leaking",
      "description": "Water under the sink after each use."
    }

    Example response

    {
      "work_order_id": "WO-1043",
      "property": "Maple Court",
      "unit": "7",
      "issue": "Kitchen sink leaking",
      "status": "New"
    }
  • assign_work_order Assign a work order to a technician or a vendor. writeasks first

    Assigns the work order to an in-house technician or a vendor from your account. It hands the job to another person, so the assignee is told as the app is set up to tell them. The response shows the work order after the change. By default you confirm each call; you can switch that off for this tool.

    MCP callappfolio_write → assign_work_order

    REST endpointPOST https://cotlet.dev/api/v1/appfolio/work-orders/{work_order_id}/assign

    Parameters

    Parameters: assign_work_order
    NameTypeDescription
    work_order_id string required string Work order ID from list_work_orders.
    assignee string required string Technician or vendor name as listed in AppFolio.

    Example input

    {
      "work_order_id": "work_order_8c41d2",
      "assignee": "assignee"
    }

    Example response

    {
      "work_order_id": "WO-1043",
      "assigned_to": "Ortiz Plumbing",
      "status": "Assigned"
    }
  • schedule_work_order Put a work order on the calendar for a date and time. writeasks first

    Schedules the work order on the app's calendar for the date and time you give. The assignee and the resident can see the visit, so the call needs your OK. The response shows the scheduled time. By default you confirm each call; you can switch that off for this tool.

    MCP callappfolio_write → schedule_work_order

    REST endpointPOST https://cotlet.dev/api/v1/appfolio/work-orders/{work_order_id}/schedule

    Parameters

    Parameters: schedule_work_order
    NameTypeDescription
    work_order_id string required string Work order ID from list_work_orders.
    start string required string Local date and time, ISO format.
    duration_minutes integer integer Planned length of the visit.

    Example input

    {
      "work_order_id": "work_order_8c41d2",
      "start": "start"
    }

    Example response

    {
      "work_order_id": "WO-1043",
      "scheduled": "2026-11-05T09:00:00",
      "assigned_to": "Ortiz Plumbing",
      "status": "Scheduled"
    }

Tenant ledgers and reports3

Read only. Which reports you see depends on your AppFolio user role.

  • get_tenant_ledger Charges, payments and balance for one tenant. read

    Returns the ledger of a tenant: charges and payments in date order, each with the amount, and the balance at the end. Give the property, unit and tenant name. Use it before calling a tenant about money.

    MCP callappfolio_read → get_tenant_ledger

    REST endpointGET https://cotlet.dev/api/v1/appfolio/tenant-ledger

    Parameters

    Parameters: get_tenant_ledger
    NameTypeDescription
    property string required string Property name from list_properties.
    unit string required string Unit name.
    tenant string string Tenant name, when the unit has more than one.

    Example input

    {
      "property": "property",
      "unit": "unit"
    }

    Example response

    {
      "tenant": "Marcus Hale",
      "property": "Maple Court",
      "unit": "2B",
      "transactions": [
        {
          "date": "2026-11-01",
          "type": "Charge",
          "description": "Rent",
          "amount": "1450.00"
        }
      ],
      "balance": "1450.00"
    }
  • list_reports Reports available in your AppFolio Reports menu. read

    Returns the report names your user role can open. Use a name from here in run_report. Which reports appear depends on your role.

    MCP callappfolio_read → list_reports

    REST endpointGET https://cotlet.dev/api/v1/appfolio/reports

    Parameters

    Parameters: list_reports
    NameTypeDescription
    search string string Match on report name.

    Example response

    {
      "reports": [
        {
          "name": "Delinquency"
        },
        {
          "name": "Work Order"
        },
        {
          "name": "Rent Roll"
        }
      ]
    }
  • run_report Run one report with a property filter and return its rows. read

    Opens the report, applies the property filter you give and returns its rows with the column headings the app shows. Leaving the property out includes all properties. Long reports come back in pages.

    MCP callappfolio_read → run_report

    REST endpointGET https://cotlet.dev/api/v1/appfolio/reports/run

    Parameters

    Parameters: run_report
    NameTypeDescription
    report string required string Report name from list_reports.
    property string string Only this property, by name or address as listed in list_properties.
    cursor string string Next page cursor from the previous call.

    Example input

    {
      "report": "report"
    }

    Example response

    {
      "report": "Delinquency",
      "columns": [
        "Tenant",
        "Property",
        "Unit",
        "Balance"
      ],
      "rows": [
        [
          "Marcus Hale",
          "Maple Court",
          "2B",
          "1450.00"
        ],
        [
          "Rosa Lin",
          "Maple Court",
          "7",
          "320.00"
        ]
      ],
      "next_cursor": null
    }
Encrypted, revocable

Who can see my AppFolio session, and how do I revoke it?

  • What we store

    Your signed-in AppFolio browser profile, AES-256-GCM encrypted, in Finland. Never the password.

  • What your agent gets

    The 10 AppFolio tools, never the cookie or the login.

  • What the session sees

    The properties and screens your AppFolio user role opens to you.

  • What no tool touches

    Charges, payments, bills, owner and tenant records, user rights.

  • If AppFolio signs you out

    You get an email with a sign-in link and sign in yourself, 2-step verification included.

  • How to cut access

    Disable for agents, reset the browser or delete the API key.

The Cotlet site scores A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory (live results); there is no SOC 2 report or third-party pentest yet.

Tested every 12 h

What happens when AppFolio changes? We repair the tool, and your prompts keep working.

between tests of the AppFolio work order, vendor, ledger and report reads
12 h
between tests of work order writes
24 h
for a call to an AppFolio tool paused for a fix
$0

AppFolio keeps adding to Realm-X, its own AI layer, and the Claude connector arrived on 9 Jun 2026. When an AppFolio screen changes, we repair the tool and its name stays the same. status.cotlet.dev checks the site, console and API every 3 minutes.

3 tools ask first

Approvals, undo and mistakes Work orders change only after your OK.

  1. 01 Reads the queue Open work orders per property, each opened in full with its history.
  2. 02 Checks for duplicates A request already logged is not created twice.
  3. 03 Waits for your OK Each new, assigned or scheduled work order waits in your Cotlet console until you approve it.
  4. 04 Reports back Which work order was created, who got it and when the visit is.
Which AppFolio changes can be undone
ActionUndo
Create a work orderCancel or delete it in AppFolio; check first whether anyone was notified
Assign a work orderAssign the previous technician or vendor back; the first assignee may have been told
Schedule a work orderMove or clear the visit on the calendar; the resident may have seen it

All 3 write tools ask first, because an assignee or a resident can be told. The other 7 tools only read and run at once. For a scheduled run you can switch the wait off per tool.

MCP call
{
  "name": "create_work_order",
  "arguments": {
    "property": "Maple Court",
    "unit": "7",
    "issue": "Kitchen sink leaking",
    "description": "Water under the sink after each use."
  }
}
REST
curl -X POST https://cotlet.dev/api/v1/appfolio/work-orders \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"property":"Maple Court","unit":"7","issue":"Kitchen sink leaking","description":"Water under the sink after each use."}'
Response
{
  "work_order_id": "WO-1043",
  "property": "Maple Court",
  "unit": "7",
  "issue": "Kitchen sink leaking",
  "status": "New"
}

A nightly job or a maintenance form can call the same tools over REST at /api/v1/appfolio, with one key and one price. A call your AppFolio user has no rights for returns an error and costs nothing. Each tool row above shows its REST path.

Pay per call

How much does the AppFolio MCP server cost?

About $26 a monthfor a manager with 3 properties and about 425 units, 4,460 credits. Cotlet needs no particular AppFolio plan; AppFolio itself starts at $1.49 per unit a month on Core.

A month of AppFolio jobs for a 3-property portfolio, in credits
JobCallsCredits
Check new work orders, each workday6 × 221,320
Log tenant messages as work orders2 × 12240
Dispatch work orders to vendors3 × 10300
Stale work orders per property, weekly7 × 4280
Delinquency report, weekly4 × 4160
Tenant ledger before a collection call3 × 22660
Cloud Browser, 30 days1,500
Total4,460
  • Free 7-day trial, no card
  • 10 credits per successful call, MCP or REST
  • 50 credits a day for the Cloud Browser
  • No API credentials, no Stack partner application

The month is our example: 3 properties, a work order check each workday, 12 tenant messages logged, 10 dispatches, weekly stale-order and delinquency runs, and a ledger look-up before each of 22 calls. AppFolio reported 9.4 million units and 22,096 property management customers at the end of 2025, about 425 units each (our division of its 10-K figures). Dollars at the $29 pack rate.

Cotlet credit packs: price, credits and calls at 10 credits each
Credits Price, one time Calls at 10 credits Per 1,000 credits
5,000 $29 500 $5.80
15,000 $79 1,500 $5.27
32,000 $149 3,200 $4.66
60,000 $249 6,000 $4.15

Only successful calls use credits; failed calls and timeouts cost nothing. At a balance of 0 calls pause, never a surprise charge. Authenticate with the Authorization: Bearer header.

Other options

AppFolio MCP server on GitHub, Realm-X or hosted: which to use Several GitHub servers exist. Each needs AppFolio API credentials.

Other AppFolio MCP options, checked 6 Nov 2026
OptionWhat it doesWhere it stops
NightSquawk/appfolio-mcp-server137 reports and 156 Database API endpoints behind 6 tools, AGPL-3.0. 0 stars, last push 31 Oct 2026.Runs on your computer with Reports and Database API credentials.
CryptoCultCurt/appfolio-mcp-serverReporting API only, ISC. 10 stars, last push 13 Sep 2026.Reports only, and you host it with your own credentials.
swagger3x/appfolio-mcpWraps the AppFolio REST API in 38 tools. 1 star, last push 4 Jul 2026.Needs API access on your plan and runs on your computer.
AppFolio Realm-X connector for ClaudeAppFolio's own link: Claude hands a job to Realm-X, which runs it inside AppFolio.Claude only; you ask for a job, not a specific tool call.

If you want Realm-X to do the job inside AppFolio from Claude, use the connector. If you have Plus or Max and a developer, the API or a community server works. If you want one hosted address for ChatGPT and Claude, with no credentials to manage, Cotlet does that.

EU company, since 2019

Who runs Cotlet A company you can look up.

Take Group sp. z o.o. runs Cotlet: a software company registered in Poland, EU (VAT PL6342984273), in business since 2019. The founders are Bart Krawczyk (Co-founder, CTO) and Jake Slugocki (Co-founder, SEO, sales and marketing). Questions about the AppFolio tools go to contact@cotlet.dev.

AppFolio MCP server: questions

How do I connect AppFolio to ChatGPT or Claude?

Sign up at cotlet.dev, log in to AppFolio once in its Cloud Browser and add Cotlet to ChatGPT or Claude, following the steps in your console. No API key is needed. ChatGPT and Claude then work in your AppFolio account through Cotlet, in their phone apps too.

What can ChatGPT do in AppFolio?

With Cotlet, ChatGPT, Claude and other AI agents handle jobs like these in AppFolio: log maintenance requests as work orders; chase stale work orders; dispatch work orders to vendors. You ask in plain words, and anything that reaches other people waits for your OK first.

How do I get access?

Sign up free at https://cotlet.dev, open AppFolio under Integrations in the console and sign in to AppFolio in its Cloud Browser. The trial starts with your first app and needs no card.

Do I need to be an AppFolio Stack partner to use Cotlet?

No. AppFolio's Stack API is built for approved Stack partners (appfolio.com/stack/partners/api). Cotlet works in your own AppFolio session, and your agent can do what your AppFolio user role can do.

Can the agent contact residents or owners?

Only through the actions above. A work order, an assignment or a scheduled visit can notify people as your AppFolio is set up, so each of these waits for your OK by default.

Does AppFolio have an official MCP server?

AppFolio announced a Realm-X connector for Claude on 9 Jun 2026 (checked 6 Nov 2026). It hands a job to AppFolio's own Realm-X agent. We found no ChatGPT version. Cotlet gives your agent individual AppFolio tools in ChatGPT, Claude, Cursor and n8n.

Do I need the Plus or Max plan?

Not for Cotlet. AppFolio lists its API on Plus (read only) and Max (read/write). Cotlet works in your own AppFolio login, so your agent does what your user role can do on any plan.

Is the MCP server different from the REST API?

Only in how you call it. Both expose the same 10 tools with the same inputs, answers, key and price. Agents use MCP; scripts and forms use REST.

Is Cotlet affiliated with AppFolio?

No. Cotlet is independent and not affiliated with AppFolio, Inc.

Give your agent access to AppFolio.

Free 7-day trial with 2,000 credits, no card needed.