Buildium MCP Server
Manage Buildium property-management data via an MCP server with 81 tools across 12 categories.
Associations: list, get, create, update associations; list board members and ownership accounts.
Leases: list, get, create, update leases; list lease transactions.
Rentals: list, get, create, update rental properties; list unit listings.
Applicants: manage applicants, applications, and applicant groups.
Tenants: manage rental and association tenants.
Owners: manage rental and association owners.
Units: manage rental and association units.
Vendors: manage vendors and vendor categories.
Tasks: list/get tasks and manage task categories.
Bills: manage bills and bill payments.
Files: manage file metadata, upload/download requests, and file categories.
Bank Accounts: manage bank accounts; list/get transactions.
Configure selective tool categories with BUILDIUM_CATEGORIES; uses Buildium API key auth over stdio MCP.
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., "@Buildium MCP Server show me all rental properties"
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.
Buildium MCP Server
Experimental Model Context Protocol (MCP) server for Buildium Property Management API, built with Python + FastMCP. Uses API key authentication for server-to-server communication.
⚠️ Status & Disclaimers
Experimental: Not production-ready; no SLA; APIs and behavior may change.
No affiliation with Buildium: This is a community integration. Buildium is a trademark of Buildium, LLC.
Security: Do not commit secrets. Treat client IDs and secrets as sensitive; use a secrets manager. Use at your own risk.
Related MCP server: Appfolio MCP Server
Features
🔐 API Key Authentication - Secure server-to-server authentication via headers
🏘️ 81 Tools Across 12 Categories - Comprehensive property management coverage
📋 Selective Tool Loading - Enable only the categories you need
🏢 Multi-Property Types - Rentals, associations, and units
🔌 MCP Protocol - Compatible with Claude Desktop, Cursor, and other MCP clients
Requirements
Python 3.11+
uvpackage manager (orpip)Buildium API credentials (client ID and client secret)
Installation
Using uv (Recommended)
# Install uv if you haven't already
curl -LsSf https://astral.sh/uv/install.sh | sh
# Install the package
uv pip install -e "git+https://github.com/luthersystems/mcp-server-buildium.git"Using pip
pip install git+https://github.com/luthersystems/mcp-server-buildium.gitConfiguration
Configure the server using environment variables:
# API Base URL (no /v1 suffix - SDK adds it automatically)
BUILDIUM_BASE_URL=https://api.buildium.com # Production
# BUILDIUM_BASE_URL=https://apisandbox.buildium.com # Sandbox
# API Key Credentials
BUILDIUM_CLIENT_ID=your-client-id
BUILDIUM_CLIENT_SECRET=your-client-secret
# Optional: Selective Tool Categories (comma-separated)
# If not specified, all categories are enabled
BUILDIUM_CATEGORIES=associations,leases,rentalsBUILDIUM_BASE_URL must be an https:// URL without credentials, a query or a
fragment, because every request carries the client secret in a header. The
server refuses to start otherwise. An empty value means the production URL.
Tool Categories
Control which tool categories are enabled using the BUILDIUM_CATEGORIES environment variable:
Category | Tools | Description |
| 6 | Homeowner association management |
| 5 | Lease agreements and transactions |
| 5 | Rental properties and listings |
| 10 | Rental applicants and applications |
| 7 | Tenant management (rental & association) |
| 8 | Property owner management |
| 7 | Individual unit management |
| 7 | Vendor and service provider management |
| 5 | Task and to-do management |
| 7 | Bill and payment management |
| 8 | Document and file management |
| 6 | Bank account and transaction management |
Total: 81 tools
If BUILDIUM_CATEGORIES is not set, all 81 tools across all 12 categories are enabled.
Environment File
Create a .env file (copy from .env.example):
cp .env.example .env
# Edit .env with your credentialsUsage
Running the Server
# With uv
uv run mcp-server-buildium
# Or with Python
python -m mcp_server_buildium.serverUsing with Claude Desktop
Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"buildium": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/luthersystems/mcp-server-buildium",
"mcp-server-buildium"
],
"env": {
"BUILDIUM_BASE_URL": "https://apisandbox.buildium.com/",
"BUILDIUM_CLIENT_ID": "your-client-id",
"BUILDIUM_CLIENT_SECRET": "your-client-secret"
}
}
}
}Available Tools (81 total)
Associations (6 tools)
list_associations- List all associationsget_association- Get association details by IDcreate_association- Create a new associationupdate_association- Update an existing associationlist_association_board_members- List board members for an associationlist_association_ownership_accounts- List ownership accounts for an association
Leases (5 tools)
list_leases- List leases with optional filtersget_lease- Get lease details by IDcreate_lease- Create a new leaseupdate_lease- Update an existing leaselist_lease_transactions- List transactions for a lease
Rentals (5 tools)
list_rentals- List rental propertiesget_rental- Get rental property details by IDcreate_rental- Create a new rental propertyupdate_rental- Update an existing rental propertylist_unit_listings- List unit listings for rentals
Applicants (10 tools)
list_applicants- List rental applicantsget_applicant- Get applicant details by IDcreate_applicant- Create a new applicantupdate_applicant- Update an existing applicantlist_applicant_applications- List applications for an applicantget_application- Get application details by IDupdate_application- Update an applicationlist_applicant_groups- List applicant groupscreate_applicant_group- Create a new applicant groupupdate_applicant_group- Update an applicant group
Tenants (7 tools)
list_rental_tenants- List rental tenantsget_rental_tenant- Get rental tenant details by IDcreate_rental_tenant- Create a new rental tenantupdate_rental_tenant- Update a rental tenantlist_association_tenants- List association tenantscreate_association_tenant- Create a new association tenantupdate_association_tenant- Update an association tenant
Owners (8 tools)
list_rental_owners- List rental property ownersget_rental_owner- Get rental owner details by IDcreate_rental_owner- Create a new rental ownerupdate_rental_owner- Update a rental ownerlist_association_owners- List association ownersget_association_owner- Get association owner details by IDcreate_association_owner- Create a new association ownerupdate_association_owner- Update an association owner
Units (7 tools)
list_rental_units- List rental unitsget_rental_unit- Get rental unit details by IDcreate_rental_unit- Create a new rental unitupdate_rental_unit- Update a rental unitlist_association_units- List association unitscreate_association_unit- Create a new association unitupdate_association_unit- Update an association unit
Vendors (7 tools)
list_vendors- List vendorsget_vendor- Get vendor details by IDcreate_vendor- Create a new vendorupdate_vendor- Update an existing vendorlist_vendor_categories- List vendor categoriescreate_vendor_category- Create a new vendor categoryupdate_vendor_category- Update a vendor category
Tasks (5 tools)
list_tasks- List tasksget_task- Get task details by IDlist_task_categories- List task categoriescreate_task_category- Create a new task categoryupdate_task_category- Update a task category
Bills (7 tools)
list_bills- List billsget_bill- Get bill details by IDcreate_bill- Create a new billupdate_bill- Update an existing billlist_bill_payments- List payments for billsget_bill_payment- Get bill payment details by IDcreate_bill_payment- Create a new bill payment
Files (8 tools)
list_files- List filesget_file- Get file details by IDupdate_file- Update file metadatacreate_file_upload_request- Create a file upload requestcreate_file_download_request- Create a file download requestlist_file_categories- List file categoriescreate_file_category- Create a new file categoryupdate_file_category- Update a file category
Bank Accounts (6 tools)
list_bank_accounts- List bank accountsget_bank_account- Get bank account details by IDcreate_bank_account- Create a new bank accountupdate_bank_account- Update a bank accountlist_bank_account_transactions- List transactions for a bank account in a date range (start_date,end_date; default: the last 30 days)get_bank_account_transaction- Get bank account transaction details by ID
Tool Request/Response Examples
This section provides detailed schemas and examples for key MCP tools.
Example: List Leases
Query leases with optional filters (property, unit, status).
Parameters:
property_id(int, optional): Filter by property IDunit_id(int, optional): Filter by unit IDlease_status(str, optional): Filter by status (e.g., "Active", "Future", "Past", "Expired")limit(int, optional): Maximum results (default: 100)offset(int, optional): Pagination offset (default: 0)
Example Request (no filters):
{
"name": "list_leases",
"arguments": {}
}Example Request (with filters):
{
"name": "list_leases",
"arguments": {
"property_id": 123,
"lease_status": "Active",
"limit": 50
}
}List tools return {"<items>": [...], "count": n}. Records use Buildium's
field names, as in its API reference; the examples below show only some fields.
Example Response:
{
"leases": [
{
"Id": 12345,
"PropertyId": 123,
"UnitId": 456,
"LeaseType": "Fixed",
"LeaseFromDate": "2024-01-01",
"LeaseToDate": "2024-12-31",
"LeaseStatus": "Active",
"CurrentTenants": [
{
"Id": 789,
"FirstName": "John",
"LastName": "Doe"
}
]
}
],
"count": 1
}Example: Get Lease
Retrieve details of a specific lease by ID.
Parameters:
lease_id(int, required): The lease ID
Example Request:
{
"name": "get_lease",
"arguments": {
"lease_id": 12345
}
}Example Response:
{
"Id": 12345,
"PropertyId": 123,
"UnitId": 456,
"LeaseType": "Fixed",
"LeaseFromDate": "2024-01-01",
"LeaseToDate": "2024-12-31",
"LeaseStatus": "Active",
"CurrentTenants": [
{
"Id": 789,
"FirstName": "John",
"LastName": "Doe",
"Email": "john.doe@example.com"
}
],
"CreatedDateTime": "2024-01-01T10:00:00Z",
"LastUpdatedDateTime": "2024-01-01T10:00:00Z"
}Example: Create Lease
Create a new lease agreement.
Required Parameters:
lease_type(str): Lease type -"AtWill"(month-to-month),"Fixed"(specific dates), or"FixedWithRollover"unit_id(int): Unit ID for the leaselease_from_date(str): Start date (format:YYYY-MM-DD)send_welcome_email(bool): Whether to send welcome email to tenants
Optional Parameters:
lease_to_date(str): End date (required for Fixed/FixedWithRollover leases)tenant_ids(list[int]): Existing tenant IDs to add (max 5)tenants(list[object]): New tenants to create (max 5)applicant_ids(list[int]): Approved applicant IDs to convert to tenants (max 5)rent(object): Rent configuration with cycle and chargessecurity_deposit(object): Security deposit detailsprorated_first_month_rent(float): Prorated first month rentprorated_last_month_rent(float): Prorated last month rentcosigners(list[object]): Cosigner details
Example Request (Minimal - Using Existing Tenant):
{
"name": "create_lease",
"arguments": {
"lease_data": {
"lease_type": "Fixed",
"unit_id": 456,
"lease_from_date": "2025-01-01",
"lease_to_date": "2025-12-31",
"send_welcome_email": true,
"tenant_ids": [789]
}
}
}Example Request (Complete with New Tenant and Rent):
{
"name": "create_lease",
"arguments": {
"lease_data": {
"lease_type": "Fixed",
"unit_id": 456,
"lease_from_date": "2025-01-01",
"lease_to_date": "2025-12-31",
"send_welcome_email": true,
"tenants": [
{
"first_name": "Jane",
"last_name": "Smith",
"email": "jane.smith@example.com",
"phone_numbers": {
"home": "555-0200"
},
"address": {
"address_line1": "123 Main St",
"city": "Springfield",
"state": "IL",
"postal_code": "62701",
"country": "US"
}
}
],
"rent": {
"cycle": "Monthly",
"charges": [
{
"gl_account_id": 1001,
"amount": 2000.00
}
]
},
"security_deposit": {
"due_date": "2025-01-01",
"amount": 2000.00
}
}
}
}Example Response:
{
"Id": 12346,
"PropertyId": 123,
"UnitId": 456,
"LeaseType": "Fixed",
"LeaseFromDate": "2025-01-01",
"LeaseToDate": "2025-12-31",
"LeaseStatus": "Active",
"CurrentTenants": [
{
"Id": 790,
"FirstName": "Jane",
"LastName": "Smith",
"Email": "jane.smith@example.com"
}
],
"CreatedDateTime": "2024-11-07T00:00:00Z"
}Field Descriptions:
Lease Types:
AtWill: Month-to-month lease with no end date. Automatic transactions continue until manually ended.Fixed: Lease with specific start/end dates. Moves to expired on end date, stops automatic transactions.FixedWithRollover: Lease that converts to AtWill status at end date, continuing automatic transactions.
Rent Configuration:
cycle: Rent frequency -"Monthly","Weekly","Every2Weeks","Quarterly","Yearly","Every2Months","Daily","Every6Months","OneTime"charges: Array of rent charges with GL account ID and amount
Tenant Creation:
Can provide up to 5 tenants via
tenant_ids(existing),tenants(new), orapplicant_ids(approved applicants)Required tenant fields:
first_name,last_name,addressOptional:
email,phone_numbers,date_of_birth,emergency_contact, etc.
Example Usage
Example Prompts
"List all rental properties in Buildium"
"Show me lease #12345"
"Create a new lease for property 100, unit 205"
"List all associations"
Development
Setting Up Development Environment
# Clone the repository
git clone https://github.com/luthersystems/mcp-server-buildium.git
cd mcp-server-buildium
# Install uv if needed
curl -LsSf https://astral.sh/uv/install.sh | sh
# Install dependencies (from uv.lock)
uv sync --extra devRunning Tests
make check # everything CI runs, except the integration tests
make test # offline unit tests (no credentials, no network)
make lint # ruff: style, bugbear and bandit security rules
make typecheck # mypy --strict
make audit # pip-audit over uv.lock
make format # apply ruff's formatting and fixesThe unit tests replace the SDK's HTTP client, so they check the method, path and query each tool sends without calling Buildium. The type checker matters here: it is what proves each tool calls an SDK method, with keyword arguments and a request model, that the generated SDK actually has.
CI
.github/workflows/ci.yml runs lint, mypy, the unit tests on Python 3.11 to
3.13, a package build with a wheel smoke test, and, on main, weekly and by
hand, the integration tests against the live Buildium API.
.github/workflows/vulnerability-scan.yml runs pip-audit on every pull
request, on main and daily. Dependabot keeps the Python dependencies and the
SHA-pinned GitHub Actions current.
When pip-audit reports a vulnerable dependency, upgrade it
(uv lock --upgrade-package NAME) and, if the vulnerable version still meets
the floor in pyproject.toml, raise the floor too: connectorhub installs this
server with uvx --from git+..., which resolves from pyproject.toml, not
uv.lock.
Integration Tests (Optional)
Integration tests validate real Buildium API authentication. They are skipped by default and only run when you provide real credentials.
To enable integration tests:
Copy
.env.exampleto.env:cp .env.example .envFill in your Buildium credentials in
.env:BUILDIUM_BASE_URL=https://apisandbox.buildium.com/ BUILDIUM_CLIENT_ID=your-client-id BUILDIUM_CLIENT_SECRET=your-client-secretRun integration tests:
uv run pytest tests/test_integration.py -v
CI/CD Setup (GitHub Actions)
To run integration tests in GitHub Actions:
Add GitHub repository secrets:
Go to your repo → Settings → Secrets and variables → Actions
Add the following secrets:
BUILDIUM_BASE_URL:https://apisandbox.buildium.com/BUILDIUM_CLIENT_ID: Your client IDBUILDIUM_CLIENT_SECRET: Your client secret
The CI workflow runs the integration tests on pushes to
main, every Monday, and when started by hand (Actions → CI → Run workflow, which also works on a pull request's branch). Without the secrets they skip.
Note: Pull requests do not run the integration tests, so a merge never waits on the Buildium key. The offline unit tests check the request every tool sends.
What the integration tests verify:
✅ API key authentication works with your credentials
✅ API calls work (tests
list_associations,list_rentals,list_leases)
Note: Integration tests require a Buildium developer account (sandbox environment recommended).
Generating SDK from OpenAPI Spec
If you want to generate a Python SDK from the Buildium OpenAPI spec:
# Generate SDK (runs OpenAPI Generator in Docker)
make generate-sdk
# Then let response models accept enum values the spec does not list
make patch-sdkBuildium returns some enum fields as integers or as values its spec omits, and
the generated validators reject them. make patch-sdk relaxes the validators
of response models only; request models stay strict. tests/test_sdk_enums.py
fails if the SDK is regenerated without it.
See Makefile for more details.
Project Structure
mcp-server-buildium/
├── src/mcp_server_buildium/
│ ├── __init__.py
│ ├── server.py # Main FastMCP server
│ ├── config.py # Configuration management
│ ├── buildium_client.py # SDK client with the API key headers
│ ├── buildium_sdk/ # Generated from specs/buildium-openapi.json; not linted
│ └── tools/ # One module per tool category
├── tests/
│ ├── test_config.py
│ ├── test_client.py
│ ├── test_tools.py # Offline request checks for every tool
│ └── test_integration.py # Real API; needs credentials
├── pyproject.toml
└── README.mdTroubleshooting
"base_url must be an https:// URL with a host"
Set
BUILDIUM_BASE_URLtohttps://api.buildium.comorhttps://apisandbox.buildium.com
"401 Unauthorized"
Check the client ID and secret are valid for that environment (sandbox keys do not work in production)
Check the API key has access to the resource in Buildium's API settings
"Connection timeout"
Check internet connectivity
Verify firewall settings
Try sandbox environment first
API Endpoints
Production:
https://api.buildium.com/Sandbox:
https://apisandbox.buildium.com/
Security Best Practices
Never commit credentials - Use
.gitignoreand environment variablesUse secrets management - Store credentials in secure vaults (AWS Secrets Manager, etc.)
Rotate credentials regularly - Generate new client secrets periodically
Use least privilege - Give the API key only the Buildium permissions and set
BUILDIUM_CATEGORIESto the tool categories you needMonitor API usage - Check Buildium dashboard for unusual activity
Use sandbox environment - Test with sandbox accounts before production
Architecture
Language: Python 3.11+
Framework: FastMCP
Auth: API key headers (
x-buildium-client-id,x-buildium-client-secret)Transport: stdio (MCP protocol)
HTTP Client: httpx
Testing: pytest with a mocked HTTP transport; mypy --strict; ruff
References
License
MIT
Contributing
Contributions welcome! Please:
Fork the repository
Create a feature branch
Add tests for new functionality
Ensure all tests pass
Submit a pull request
Support
This is an experimental community project. For Buildium API issues, consult the Buildium Developer Center.
Available Tools
81 toolscreate_applicantB
Create a new applicant.
Args: applicant_data: Applicant data dictionary with required fields.
Returns: Created applicant details.
Inputs: applicant_data (required). Returns: object
create_applicant_groupC
Create a new applicant group.
Args: group_data: Applicant group data dictionary.
Returns: Created applicant group details.
Inputs: group_data (required). Returns: object
create_associationB
Create a new association.
Args: association_data: Association data dictionary with required fields.
Returns: Created association details.
Inputs: association_data (required). Returns: object
create_association_ownerC
Create a new association owner.
Inputs: owner_data (required). Returns: object
create_association_tenantC
Create a new association tenant.
Inputs: tenant_data (required). Returns: object
create_association_unitC
Create a new association unit.
Inputs: unit_data (required). Returns: object
create_bank_accountC
Create a new bank account.
Inputs: bank_account_data (required). Returns: object
create_billC
Create a new bill.
Inputs: bill_data (required). Returns: object
create_bill_paymentC
Create a payment for a bill.
Inputs: bill_id (required), payment_data (required). Returns: object
create_file_categoryC
Create a new file category.
Inputs: category_data (required). Returns: object
create_file_download_requestB
Create a file download request to get a download URL.
Inputs: file_id (required). Returns: object
create_file_upload_requestC
Create a file upload request to get an upload URL.
Inputs: upload_request (required). Returns: object
create_leaseC
Create a new lease.
Args: lease_data: Lease data dictionary with required fields (propertyId, unitId, etc.).
Returns: Created lease details.
Inputs: lease_data (required). Returns: object
create_rentalC
Create a new rental property.
Args: rental_data: Rental property data dictionary with required fields.
Returns: Created rental property details.
Inputs: rental_data (required). Returns: object
create_rental_ownerC
Create a new rental owner.
Inputs: owner_data (required). Returns: object
create_rental_tenantC
Create a new rental tenant.
Inputs: tenant_data (required). Returns: object
create_rental_unitC
Create a new rental unit.
Inputs: unit_data (required). Returns: object
create_task_categoryC
Create a new task category.
Inputs: category_data (required). Returns: object
create_vendorC
Create a new vendor.
Inputs: vendor_data (required). Returns: object
create_vendor_categoryC
Create a new vendor category.
Inputs: category_data (required). Returns: object
get_applicantA
Get a specific applicant by ID.
Args: applicant_id: The applicant ID.
Returns: Applicant details as dictionary.
Inputs: applicant_id (required). Returns: object
get_applicationC
Get a specific application by ID.
Args: applicant_id: The applicant ID. application_id: The application ID.
Returns: Application details as dictionary.
Inputs: applicant_id (required), application_id (required). Returns: object
get_associationA
Get a specific association by ID.
Args: association_id: The association ID.
Returns: Association details as dictionary.
Inputs: association_id (required). Returns: object
get_association_ownerA
Get a specific association owner by ID.
Inputs: owner_id (required). Returns: object
get_bank_accountB
Get a specific bank account by ID.
Inputs: bank_account_id (required). Returns: object
get_bank_account_transactionB
Get a specific bank account transaction by ID.
Inputs: transaction_id (required), bank_account_id (required). Returns: object
get_billA
Get a specific bill by ID.
Inputs: bill_id (required). Returns: object
get_bill_paymentA
Get a specific bill payment by ID.
Inputs: bill_id (required), payment_id (required). Returns: object
get_fileA
Get a specific file by ID.
Inputs: file_id (required). Returns: object
get_leaseA
Get a specific lease by ID.
Args: lease_id: The lease ID.
Returns: Lease details as dictionary.
Inputs: lease_id (required). Returns: object
get_rentalA
Get a specific rental property by ID.
Args: property_id: The property ID.
Returns: Rental property details as dictionary.
Inputs: property_id (required). Returns: object
get_rental_ownerB
Get a specific rental owner by ID.
Inputs: owner_id (required). Returns: object
get_rental_tenantB
Get a specific rental tenant by ID.
Inputs: tenant_id (required). Returns: object
get_rental_unitA
Get a specific rental unit by ID.
Inputs: unit_id (required). Returns: object
get_taskA
Get a specific task by ID.
Inputs: task_id (required). Returns: object
get_vendorA
Get a specific vendor by ID.
Inputs: vendor_id (required). Returns: object
list_applicant_applicationsB
List applications for a specific applicant.
Args: applicant_id: The applicant ID.
Returns: Dictionary with applications list.
Inputs: applicant_id (required). Returns: object
list_applicant_groupsA
List applicant groups from Buildium.
Args: limit: Maximum number of results (default: 100). offset: Offset for pagination (default: 0).
Returns: Dictionary with applicant groups list.
Inputs: limit, offset. Returns: object
list_applicantsA
List rental applicants from Buildium.
Args: email: Optional email address to filter by. limit: Maximum number of results (default: 100). offset: Offset for pagination (default: 0).
Returns: Dictionary with applicants list and metadata.
Inputs: email, limit, offset. Returns: object
list_association_board_membersB
List board members for a specific association.
Args: association_id: The association ID. limit: Maximum number of results (default: 100). offset: Offset for pagination (default: 0).
Returns: Dictionary with board members list.
Inputs: association_id (required), limit, offset. Returns: object
list_association_ownersC
List association owners from Buildium.
Inputs: limit, offset, status, property_id. Returns: object
list_association_ownership_accountsA
List ownership accounts for a specific association.
Args: association_id: The association ID. limit: Maximum number of results (default: 100). offset: Offset for pagination (default: 0).
Returns: Dictionary with ownership accounts list.
Inputs: association_id (required), limit, offset. Returns: object
list_associationsA
List associations from Buildium.
Args: limit: Maximum number of results (default: 100). offset: Offset for pagination (default: 0).
Returns: Dictionary with associations list and metadata.
Inputs: limit, offset. Returns: object
list_association_tenantsC
List association tenants from Buildium.
Inputs: limit, offset, status, property_id. Returns: object
list_association_unitsC
List association units from Buildium.
Inputs: limit, offset, property_id. Returns: object
list_bank_accountsC
List bank accounts from Buildium.
Inputs: limit, offset. Returns: object
list_bank_account_transactionsB
List transactions for a specific bank account.
Inputs: bank_account_id (required), limit, offset. Returns: object
list_bill_paymentsB
List payments for a specific bill.
Inputs: bill_id (required). Returns: object
list_billsC
List bills from Buildium.
Inputs: limit, offset, status, vendor_id. Returns: object
list_file_categoriesA
List file categories from Buildium.
Inputs: no named parameters. Returns: object
list_filesC
List files from Buildium.
Inputs: limit, offset, entity_id, category_id, +1 more. Returns: object
list_leasesA
List leases from Buildium.
Args: property_id: Optional property ID to filter by. unit_id: Optional unit ID to filter by. lease_status: Optional lease status filter (e.g., "Active", "Future", "Past"). limit: Maximum number of results (default: 100). offset: Offset for pagination (default: 0).
Returns: Dictionary with leases list and metadata.
Inputs: limit, offset, unit_id, property_id, +1 more. Returns: object
list_lease_transactionsA
List transactions for a specific lease.
Args: lease_id: The lease ID. limit: Maximum number of results (default: 100). offset: Offset for pagination (default: 0).
Returns: Dictionary with transactions list.
Inputs: lease_id (required), limit, offset. Returns: object
list_rental_ownersC
List rental owners from Buildium.
Inputs: limit, offset, property_id. Returns: object
list_rentalsA
List rental properties from Buildium.
Args: limit: Maximum number of results (default: 100). offset: Offset for pagination (default: 0).
Returns: Dictionary with rentals list and metadata.
Inputs: limit, offset. Returns: object
list_rental_tenantsC
List rental tenants from Buildium.
Inputs: limit, offset, status, unit_id, +1 more. Returns: object
list_rental_unitsC
List rental units from Buildium.
Inputs: limit, offset, property_id. Returns: object
list_task_categoriesA
List task categories from Buildium.
Inputs: no named parameters. Returns: object
list_tasksC
List tasks from Buildium.
Inputs: limit, offset, task_type, assigned_to_user_id. Returns: object
list_unit_listingsA
List unit listings from Buildium.
Args: limit: Maximum number of results (default: 100). offset: Offset for pagination (default: 0).
Returns: Dictionary with listings list.
Inputs: limit, offset. Returns: object
list_vendor_categoriesA
List vendor categories from Buildium.
Inputs: no named parameters. Returns: object
list_vendorsB
List vendors from Buildium.
Inputs: limit, offset. Returns: object
update_applicantC
Update an existing applicant.
Args: applicant_id: The applicant ID. applicant_data: Updated applicant data dictionary.
Returns: Updated applicant details.
Inputs: applicant_id (required), applicant_data (required). Returns: object
update_applicant_groupB
Update an applicant group.
Args: group_id: The applicant group ID. group_data: Updated group data dictionary.
Returns: Updated applicant group details.
Inputs: group_id (required), group_data (required). Returns: object
update_applicationC
Update an application status.
Args: applicant_id: The applicant ID. application_id: The application ID. application_data: Updated application data dictionary.
Returns: Updated application details.
Inputs: applicant_id (required), application_id (required), application_data (required). Returns: object
update_associationB
Update an existing association.
Args: association_id: The association ID. association_data: Association data dictionary with fields to update.
Returns: Updated association details.
Inputs: association_id (required), association_data (required). Returns: object
update_association_ownerC
Update an existing association owner.
Inputs: owner_id (required), owner_data (required). Returns: object
update_association_tenantC
Update an existing association tenant.
Inputs: tenant_id (required), tenant_data (required). Returns: object
update_association_unitC
Update an existing association unit.
Inputs: unit_id (required), unit_data (required). Returns: object
update_bank_accountC
Update an existing bank account.
Inputs: bank_account_id (required), bank_account_data (required). Returns: object
update_billC
Update an existing bill.
Inputs: bill_id (required), bill_data (required). Returns: object
update_fileD
Update file metadata.
Inputs: file_id (required), file_data (required). Returns: object
update_file_categoryC
Update a file category.
Inputs: category_id (required), category_data (required). Returns: object
update_leaseB
Update an existing lease.
Args: lease_id: The lease ID. lease_data: Lease data dictionary with fields to update.
Returns: Updated lease details.
Inputs: lease_id (required), lease_data (required). Returns: object
update_rentalB
Update an existing rental property.
Args: property_id: The property ID. rental_data: Rental property data dictionary with fields to update.
Returns: Updated rental property details.
Inputs: property_id (required), rental_data (required). Returns: object
update_rental_ownerC
Update an existing rental owner.
Inputs: owner_id (required), owner_data (required). Returns: object
update_rental_tenantC
Update an existing rental tenant.
Inputs: tenant_id (required), tenant_data (required). Returns: object
update_rental_unitC
Update an existing rental unit.
Inputs: unit_id (required), unit_data (required). Returns: object
update_task_categoryC
Update a task category.
Inputs: category_id (required), category_data (required). Returns: object
update_vendorC
Update an existing vendor.
Inputs: vendor_id (required), vendor_data (required). Returns: object
update_vendor_categoryC
Update a vendor category.
Inputs: category_id (required), category_data (required). Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 81 tools
Most tools are clearly separated by resource prefixes like rental_, association_, applicant_, bill_, and bank_account_, making their targets easy to identify. A few pairs could cause hesitation, such as list_rentals vs list_rental_units vs list_unit_listings, and list_association_owners vs list_association_ownership_accounts, but the names are generally distinct enough for an agent.
Tool names follow a very consistent verb_noun pattern throughout: list_, get_, create_, and update_ combine with predictable entity names. Even multi-word entities like list_association_board_members and create_file_upload_request follow the same convention, so there are no stylistic clashes or mixed casing.
At 81 tools, this is far beyond the recommended range and creates a heavy selection surface for an agent, even though Buildium is a broad property-management platform. The repetitive CRUD patterns across many entity types suggest some consolidation or sub-tool organization would be appropriate.
The core entities such as associations, leases, rentals, applicants, vendors, bills, files, and bank accounts have solid list/get/create/update coverage. However, there are no delete operations at all, and several secondary resources like tasks, unit listings, board members, ownership accounts, and lease transactions only support listing or partial operations, leaving notable lifecycle gaps.
Maintenance
Related MCP Connectors
Read Buildium properties, units, leases, tenants, balances and bills; manage work orders.
Work with your AppFolio® portfolio: tenants, vacancies, reports, maintenance, financials, and more.
Buildium MCP server for ChatGPT, Claude and any AI agent: record lease payment, list outstanding balances, send text message, create task, add work order and send announcement in your own Buildium account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to Buildium yourself; Cotlet does not store your password and you need no Buildium API key. About the official Buildium API: Yes, Buildium has an official REST API, the Open API, but only on the Premium plan (checked 27 Oct 2026). Buildium's developer guide says "To take advantage of the Buildium Open API you must have a Premium Subscription", and an administrator has to switch it on under Settings > Application settings > Api settings before anyone can create a key. Setup and FAQ: https://cotlet.dev/integrations/buildium-api-mcp-server
Ask your Rent Manager portfolio anything: live, read-only financials, rent roll, leasing.
Related MCP Servers
- FlicenseAqualityDmaintenanceConnects AI assistants to the Lanten property management API, allowing them to manage tenants, units, and work orders using natural language.1511 npm-
- AlicenseBqualityCmaintenanceEnables interaction with Appfolio Property Manager through the Reporting API, allowing property management tasks and data retrieval via natural language commands.4711 npm10ISC
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to manage rental properties on TenantCloud via natural language, including contacts, messaging, maintenance, and financials.-
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to operate property management systems via natural language, covering repair orders, owner info, payments, notices, and inspections. Features a full agentic workflow with human-in-the-loop and observability.1MIT