Buildium MCP Server
Enables interaction with Buildium property management software through natural language, supporting operations on associations, leases, rentals, tenants, and more.
README
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.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.