luthersystems/mcp-server-buildium
If you are the rightful owner of mcp-server-buildium and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to dayong@mcphub.com.
The Buildium MCP Server is an experimental Model Context Protocol server designed for integrating with the Buildium Property Management API using Python and FastMCP. It facilitates secure server-to-server communication through API key authentication.
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.
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.git
Configuration
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,rentals
Tool Categories
Control which tool categories are enabled using the BUILDIUM_CATEGORIES environment variable:
| Category | Tools | Description |
|---|---|---|
associations | 6 | Homeowner association management |
leases | 5 | Lease agreements and transactions |
rentals | 5 | Rental properties and listings |
applicants | 10 | Rental applicants and applications |
tenants | 7 | Tenant management (rental & association) |
owners | 8 | Property owner management |
units | 7 | Individual unit management |
vendors | 7 | Vendor and service provider management |
tasks | 5 | Task and to-do management |
bills | 7 | Bill and payment management |
files | 8 | Document and file management |
bank_accounts | 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 credentials
Usage
Running the Server
# With uv
uv run mcp-server-buildium
# Or with Python
python -m mcp_server_buildium.server
Using 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 accountget_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
}
}
Example Response:
{
"leases": [
{
"id": 12345,
"propertyId": 123,
"unitId": 456,
"leaseType": "Fixed",
"leaseFromDate": "2024-01-01",
"leaseToDate": "2024-12-31",
"status": "Active",
"tenants": [
{
"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",
"status": "Active",
"rentCycle": "Monthly",
"rentAmount": 2000.00,
"securityDepositAmount": 2000.00,
"tenants": [
{
"id": 789,
"firstName": "John",
"lastName": "Doe",
"email": "john.doe@example.com",
"phoneNumbers": {
"home": "555-0100"
}
}
],
"createdDateTime": "2024-01-01T10:00:00Z",
"lastModifiedDateTime": "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",
"status": "Active",
"rentCycle": "Monthly",
"rentAmount": 2000.00,
"securityDepositAmount": 2000.00,
"tenants": [
{
"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,address - Optional:
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
uv pip install -e ".[dev]"
Running Tests
# Run unit tests (no credentials needed)
uv run pytest tests/ --ignore=tests/test_integration.py
# Run with coverage
uv run pytest --cov=mcp_server_buildium --cov-report=html
# Run linter
uv run ruff check .
# Format code
uv run ruff format .
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 .env -
Fill in your Buildium credentials in
.env:BUILDIUM_BASE_URL=https://apisandbox.buildium.com/ BUILDIUM_CLIENT_ID=your-client-id BUILDIUM_CLIENT_SECRET=your-client-secret -
Run integration tests:
uv run pytest tests/test_integration.py -v
Test Credentials (Sandbox):
- Client ID:
54f6ac5b-5629-4934-a930-d2c8174fcf4a - Client Secret:
tHXJx7mFoCEXtqCvBL3oV1Fv6hHb5WVokKHIvT1cUIA= - Base URL:
https://apisandbox.buildium.com/
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 will automatically run integration tests when these secrets are present
Note: The integration tests will be skipped in PRs from forks (for security), but will run on pushes to main/develop branches.
What the integration tests verify:
- ✅ OAuth authentication works with your credentials
- ✅ Access token can be obtained successfully
- ✅ API calls work (tests
list_associations,list_rentals,list_leases) - ✅ Token refresh mechanism works
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 (requires Java for OpenAPI Generator)
make generate-sdk
# The generated SDK will be in buildium_sdk/ directory
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 # OAuth auth & API client
│ └── tools/
│ ├── associations.py # Association tools
│ ├── leases.py # Lease tools
│ └── rentals.py # Rental tools
├── tests/
│ ├── test_buildium_client.py
│ └── test_integration.py
├── pyproject.toml
└── README.md
Troubleshooting
"Failed to obtain access token"
- Verify client ID and secret are correct
- Check base URL is correct (sandbox vs production)
- Ensure token URL is accessible
- Verify scopes are correct
"401 Unauthorized"
- Check credentials are valid
- Verify API endpoint URLs
- Ensure OAuth scopes include required permissions
"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 variables - Use secrets management - Store credentials in secure vaults (AWS Secrets Manager, etc.)
- Rotate credentials regularly - Generate new client secrets periodically
- Limit token lifetime - Use shorter expiration for sensitive operations
- Monitor 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: OAuth 2.0 client credentials flow
- Transport: stdio (MCP protocol)
- HTTP Client: httpx
- Testing: pytest with mocks
References
- Buildium Developer Documentation
- Model Context Protocol
- FastMCP Framework
- OAuth 2.0 Client Credentials Flow
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.