buildium-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| BUILDIUM_RUN_LOG | No | Path to the request audit log. Set to 'off' to disable. Default is platform state dir/run.log. | |
| BUILDIUM_BASE_URL | No | Base URL for the Buildium API. Required for production modes. Default is the sandbox URL. | |
| BUILDIUM_ENV_FILE | No | Path to a .env file to load (optional). | |
| BUILDIUM_CLIENT_ID | Yes | Buildium client ID. Create an API key under Settings → Developer Tools. | |
| BUILDIUM_STATE_DIR | No | Directory for state files such as run.log. Optional override. | |
| BUILDIUM_CONFIG_DIR | No | Directory containing .env file (optional). | |
| BUILDIUM_WRITE_MODE | No | Write safety mode. One of: fixtures (default) or open. | fixtures |
| BUILDIUM_ARTIFACT_LOG | No | Path to created-records.log. Set to 'off' to disable. | |
| BUILDIUM_CLIENT_SECRET | Yes | Buildium client secret. | |
| BUILDIUM_DEPLOYMENT_MODE | No | Deployment mode. One of: sandbox (default), production-readonly, production-readonly-files, production-write. | sandbox |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| buildium_healthA | Report which Buildium environment this server is bound to (sandbox, production read-only, production read-only with file downloads, or production with writes), the active write mode, how many operations are indexed, and — if the server is not configured — exactly what to set. Only needed before a WRITE, when the environment is genuinely in doubt, or when another tool reports a startup problem. Read-only questions do not require it. Deliberately not wrapped by _guarded: this is the one tool that must answer when everything else cannot, so it reports status rather than raising. |
| buildium_list_tagsA | List every resource area in the Buildium API with its operation count (Leases, Work Orders, General Ledger, ...). Use this to orient before searching. |
| buildium_search_endpointsA | Find Buildium API endpoints by keyword. Searches paths, summaries, tags, and operation IDs across all 462 operations. Start here when you don't already know the exact path. query: natural keywords, e.g. "work orders", "lease transactions", "gl accounts" method: optionally restrict to get/post/put/patch/delete |
| buildium_describe_endpointA | Show the full contract for one endpoint: parameters, request body schema, and success response schema, with $refs resolved. Call this before buildium_call_endpoint on anything non-trivial — especially writes, where the body schema tells you which fields are required. |
| buildium_describe_schemaA | Expand a named schema from the spec (e.g. "LeasePostMessage"). Useful when buildium_describe_endpoint hit its depth limit and emitted a bare $ref. |
| buildium_call_endpointA | Call any Buildium endpoint. method: GET, POST, PUT, PATCH, or DELETE path: e.g. "/v1/leases" or "/v1/leases/12345" query: query-string parameters body: JSON request body for writes fields: keep only these top-level fields in the response. Buildium records are large — passing e.g. ["Id","Name","PropertyIds"] avoids pulling tax IDs and full addresses you did not ask for. confirm: required (true) for DELETE all_pages: GET only — follow pagination to the end instead of returning the first page. Use it whenever you are counting or aggregating; a count taken from one page is wrong whenever the collection is larger than the page. Write guardrails apply — see buildium_health for the active mode. In the default 'fixtures' mode, created records must carry the fixture prefix in their name, and updates/deletes only work on records created this session. |
| buildium_created_fixturesA | List records created during this session, grouped by collection. These are the only records that updates and deletes are permitted against in 'fixtures' mode. Also appended to created-records.log (see buildium_health for the path) so they can be cleaned up after the process is gone. |
| buildium_upload_fileA | Upload a local file to Buildium, handling both steps of its upload flow. Bytes do not travel through the Buildium API. Buildium issues a short-lived AWS presigned PUT URL, and the file is sent there directly. Doing that by hand with buildium_call_endpoint does not work — call_endpoint would post the metadata and hand you a URL it cannot then PUT to. Use this instead. file_path: path to the file on this machine title: the file's title in Buildium. In 'fixtures' write mode this must start with the fixture prefix (see buildium_health). category_id: from GET /v1/files/categories — required, and Buildium rejects the upload without a real one. entity_type: what the file is attached to — Rental, Lease, Tenant, Vendor, Association, RentalOwner, RentalUnit, and so on. entity_id: the ID of that record. upload_path: for files belonging to a bill, check, or task history, pass that resource's own uploads path, e.g. "/v1/bills/123/files/uploads". Only Buildium's seven upload-request endpoints are accepted here, in every mode. |
| buildium_download_fileA | Download a Buildium file to this machine, handling both steps. Buildium issues a download URL that expires after five minutes and serves the bytes from separate storage, so this cannot be done with buildium_call_endpoint. Note this is refused when the server runs in production-readonly mode: Buildium models a download request as a POST, and that mode blocks every POST at the transport layer without exception. Reading file metadata via GET /v1/files/{id} still works. file_id: from GET /v1/files save_to: where to write the file on this machine download_path: for a file belonging to a bill, check, or task history, that resource's own download path, e.g. "/v1/bills/123/files/456/downloadrequest". Only Buildium's seven download-request endpoints are accepted here, in every mode. |
| buildium_list_rentalsA | List rental properties. Pass Set all_pages=true to follow pagination to the end in one call — do that whenever you are counting or aggregating, since a single page is only the first 50 records and a count taken from it will be wrong. |
| buildium_get_rentalA | Get one rental property by ID. |
| buildium_list_unitsA | List rental units, optionally filtered to one property. Set all_pages=true when counting or aggregating; one page is not the whole collection. |
| buildium_list_leasesA | List leases. lease_status is one of Active, Future, Past, Expired. Each row already carries the rent terms under For who is on each lease, use buildium_lease_roster. Set all_pages=true when counting or aggregating across every lease. |
| buildium_get_leaseA | Get one lease by ID, including tenants and rent terms. |
| buildium_list_lease_transactionsA | List financial transactions (posted charges and payments) for a lease. For the lease's recurring rent amount use buildium_list_leases instead — it is already on every row under AccountDetails.Rent. Set all_pages=true when totalling a ledger. |
| buildium_list_work_ordersA | List work orders (maintenance jobs). Set all_pages=true when counting or aggregating. |
| buildium_list_tenantsB | List rental tenants. Set all_pages=true when counting or aggregating. |
| buildium_lease_rosterA | Who is on which lease — the lease-to-tenant join, done in one call. Use this for any "who lives in / who is on lease X" question, and for counting co-tenants. Buildium makes this awkward: the lease list does not reliably populate tenant names, and the tenant endpoint has no lease filter — so answering it directly means pulling every lease one at a time. Tenant records do carry their lease membership, so this fetches them once and inverts the mapping locally. lease_id: restrict to a single lease property_id: restrict to leases at one property exclude_fixtures: drop tenants created by test tooling (names starting with the fixture prefix — see buildium_health). This sandbox accumulates such records permanently, because Buildium offers DELETE on only 14 of its 462 operations. When any are present the response says so, so a count is never silently wrong. |
| buildium_list_gl_accountsA | List general ledger accounts. You need these IDs to post rent charges and other financial transactions. Set all_pages=true when counting or aggregating. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 19 tools
The convenience tools are carefully differentiated—list_leases, list_lease_transactions, and lease_roster each explicitly say when to use them—and the discovery tools occupy clear stages. The main overlap is buildium_call_endpoint, which can express any GET/list operation and could be selected instead of a typed wrapper, though the descriptions make the wrappers' specific conveniences clear.
Nearly all tools follow the buildium_<verb>_<noun> pattern, mostly list_, get_, describe_, and search_. A few outliers—buildium_health, buildium_created_fixtures, and buildium_lease_roster—break the verb_noun convention, but these are minor and the overall naming is predictable.
At 19 tools this is slightly above the typical sweet spot, but the count is justified: a generic endpoint-calling core, discovery/health tools, file transfer tools, and convenience wrappers for high-frequency Buildium entities. Each wrapper earns its place by simplifying pagination, schema depth, or join logic, so the set feels slightly large rather than bloated.
Because buildium_call_endpoint can reach all 462 Buildium API operations, and buildium_search_endpoints/buildium_describe_endpoint provide discovery and contract details, the server has no dead ends despite offering convenience wrappers for only common objects. Reads, writes, file upload/download, pagination, fixture tracking, and environment health are all covered.