Skip to main content
Glama
blackwaxxx

buildium-mcp

by blackwaxxx

buildium-mcp

An MCP server for the Buildium Open API. All 462 operations across 42 resource areas, exposed through 20 tools.

Sandbox by default. Reaching production takes two deliberate settings, and the read-only modes block writes in the transport rather than by policy.

COVERAGE.md records what is actually proven against a live sandbox: 218 of 462 operations verified, 0 broken. That number is 178 GET operations + 40 writes across twelve entity families. The remaining GETs are marked needs-setup — the sandbox holds no record of the required type, so there was no id to call them with — and each of the 184 unattempted writes carries its own stated reason.

Unofficial. Not affiliated with, endorsed by, or sponsored by Buildium. "Buildium" is a trademark of its owner. See NOTICE for the provenance of the bundled OpenAPI document.

Why 20 tools and not 462

The Buildium spec is 298 paths, 462 operations, 519 schemas. One-tool-per-operation is the obvious approach and it fails at this size — the tool list alone burns tens of thousands of context tokens before the model does any work, and selection accuracy collapses past a few dozen tools.

So the spec is indexed at runtime instead:

search_endpoints("work orders")      → ranked candidates
describe_endpoint("POST", "/v1/...") → params + body schema, $refs resolved
get("/v1/...")                       → any read
call_endpoint("POST", "/v1/...", …)  → a write

Reads and writes are separate tools on purpose. buildium_get is annotated read-only, so a client can approve it once, while buildium_call_endpoint still asks about every write.

Ten curated shortcuts (list_leases, list_work_orders, list_gl_accounts, …) cover frequent reads so routine questions skip the three-step path. Two file tools exist because Buildium's file flow cannot be driven through the gateway at all — see below.

Related MCP server: Buildium MCP Server

Setup

You need a Buildium Premium subscription with the Open API enabled (Settings → Application settings → Api settings) and an API key created under Settings → Developer Tools.

Claude Desktop: one click

Download buildium-mcp-<version>.mcpb from the releases page and double-click it (or drag it onto the Claude Desktop window). Claude Desktop asks for your Client ID and Client Secret in a settings form, stores them securely, and installs everything else itself — including Python, if your machine has none. Sandbox is the default; the same form has a "Connect to production" toggle for when you are ready, and separate toggles for allowing changes and file downloads there. The install dialog labels the bundle unsigned and says it has access to your computer; both are standard for every local extension — see mcpb/ for what this one actually touches and why it is not signed.

Any other MCP client

Requires Python 3.11+.

pip install buildium-mcp

Releases are published to PyPI from this repository's release workflow, with the same files and checksums as the GitHub releases. To run unreleased code, install from GitHub instead: pip install "git+https://github.com/blackwaxxx/Buildium-MCP".

Sandbox is a separate Buildium account from production — production keys do not authenticate against apisandbox.buildium.com.

Credentials

The preferred way is your MCP client's own env block, so the secret lives with the rest of your client configuration:

{
  "mcpServers": {
    "buildium": {
      "command": "buildium-mcp",
      "env": {
        "BUILDIUM_CLIENT_ID": "...",
        "BUILDIUM_CLIENT_SECRET": "..."
      }
    }
  }
}

A .env file works too. Three locations are searched, highest priority first, and the real process environment beats all of them:

  1. $BUILDIUM_ENV_FILE

  2. the root of a source checkout, if this is running from one — found from the package's own location, so it works whatever working directory the MCP client picks

  3. your platform config directory — buildium_health reports which files were actually read, under env_files_loaded

Only BUILDIUM_* variables are read from these files; anything else in them is ignored. The working directory is not searched. An MCP client starts the server wherever it likes, often inside a project whose .env has nothing to do with this one, and variables such as HTTPS_PROXY in a file like that could redirect the traffic that carries your API secret.

BUILDIUM_CLIENT_ID=...
BUILDIUM_CLIENT_SECRET=...

chmod 600 it. If the server cannot find credentials it still starts, and buildium_health reports exactly what is missing and where it looked — the spec-only tools (search_endpoints, describe_endpoint, …) keep working meanwhile.

From a checkout

git clone https://github.com/blackwaxxx/Buildium-MCP && cd Buildium-MCP
uv venv --python 3.11 && uv pip install -e ".[dev]"

Files it writes

Default

Override

.env

platform config dir

BUILDIUM_ENV_FILE, BUILDIUM_CONFIG_DIR

run.log (request audit)

platform state dir

BUILDIUM_RUN_LOG, BUILDIUM_STATE_DIR

created-records.log

platform state dir

BUILDIUM_ARTIFACT_LOG

downloaded files

~/Downloads/Buildium

BUILDIUM_DOWNLOAD_DIR

The logs and downloads are created readable by you only (0600). Set either log variable to off to disable it. If the state directory is not writable the server still runs; buildium_health reports audit_log: null with the reason rather than pretending to log.

Run

.venv/bin/python -m buildium_mcp.server   # stdio

Register it with any MCP client:

{
  "command": "buildium-mcp"
}

or, from a checkout:

{
  "command": "/path/to/buildium-mcp/.venv/bin/python",
  "args": ["-m", "buildium_mcp.server"]
}

The OpenAPI spec ships inside the package, so it is found the same way in a wheel and in an editable checkout. Nothing is resolved relative to a repo root.

Write safety

BUILDIUM_WRITE_MODE — default fixtures:

fixtures

open

Create, payload has a name

every name in it must start with ZZ-MCPTEST-

unrestricted

Create, payload has no name

sandbox host only

unrestricted

Create under an existing record

off the sandbox, only under records created this session

unrestricted

Update / delete

only records created this session

unrestricted

Delete

requires confirm=true

requires confirm=true

Audit

always

always

fixtures is the posture for unattended or agent-driven use: an agent working alone cannot update or delete a record it did not create. Off the sandbox that extends to creates under an existing record — a renewal of a lease, a charge or a note on it — which must hang off a record created this session. What it does not check is a record the payload merely names, such as the UnitId of a new lease; see KNOWN-LIMITATIONS.md. Switch to open for real work.

BUILDIUM_FIXTURE_PREFIX changes the prefix. A blank value means the default, since every name starts with an empty string.

"Every name in it" means the whole payload, not just the top level. Creating a lease creates its tenants, so Tenants[0].FirstName is checked the same way the record's own Name is. A refusal names the exact field.

Most write endpoints have no name field anywhere: charges, payments, journal entries, checks, notes. 84 of the 119 POST operations in the spec. Nothing on those payloads can carry the prefix, so this mode cannot promise the record it creates will be identifiable, and it does not pretend otherwise. Against the sandbox they are allowed, because the data is disposable. Against a production host they are refused; use open to create live records deliberately.

Note that this turns on the host, not on the mode: production-write aimed at the sandbox is still writing to the sandbox. The same payload is also refused when it is too large or too deeply nested to read in full, since "I could not check" must not resolve to "looked fine".

Every request goes to run.log; every created record ID goes to created-records.log. Credentials are never written to either.

Deployment mode

BUILDIUM_DEPLOYMENT_MODE — default sandbox:

Reachable hosts

Writes

File downloads

sandbox (default)

sandbox only

allowed, further constrained by BUILDIUM_WRITE_MODE

yes

production-readonly

sandbox + production

blocked in the transport

no

production-readonly-files

sandbox + production

blocked in the transport

yes, 7 endpoints

production-write

sandbox + production

allowed

yes

An unrecognized value is a startup error listing the valid ones — a typo must not silently pick a mode.

Reaching production takes two independent things, and neither alone is enough: this variable and a BUILDIUM_BASE_URL naming a production host. Setting the mode changes what is permitted, never what is targeted, so a stray mode variable cannot redirect a sandbox server at live data.

The read-only modes are not a policy check a caller can talk its way past. ReadOnlyTransportGuard sits in the httpx transport slot — the last code that runs before a socket is opened. It lets only GET, HEAD and OPTIONS through (an allowlist, so an unknown or malformed verb is refused too), and it refuses any request whose host is not a Buildium host over https, whatever the method. Calling client.post() directly, hand-building an httpx.Request, or bypassing BuildiumClient entirely all hit the same wall. Tested by doing exactly that.

Why production-readonly-files exists

Buildium issues a file download by POSTing for a short-lived signed URL, so a server that refuses every POST cannot read a lease PDF. Rather than weaken production-readonly, this mode exempts exactly seven operations — the downloadrequest and downloadrequests endpoints for files, bill files, task files, rental and unit images, check attachments, and architectural-request files. Everything else is still refused in the transport.

The exemption is scoped by an anchored pattern matched against the raw, still-percent-encoded wire path, so %2f, %2e%2e and %00 cannot smuggle a different path through it, and the host is checked too — an absolute URL cannot aim an allowlisted path at a server of the caller's choosing. A test iterates every POST in the spec and asserts precisely these seven are reachable.

Run read-only for a while before considering production-write. The banner on stderr names the active mode and where it came from on every start.

Verify the guarantee yourself — runs against the sandbox, writes nothing:

.venv/bin/python tests/demo_readonly.py

Tests

pytest                                 # offline, no credentials
.venv/bin/python tests/stdio_check.py               # live sandbox

The unit suite (388 tests) covers spec indexing, path resolution, response shaping, allOf flattening, auto-pagination, deprecation handling, error hints, and every guardrail branch — all four deployment modes, the download allowlist proved exhaustively against the spec, which .env files are read and what they may set, and the packaging and startup paths — with no network access. tests/conftest.py isolates it from any .env on the machine, so the offline suite cannot accidentally make a live call.

Coverage walks, which do hit the sandbox:

.venv/bin/python tests/coverage_matrix.py   # all 238 GETs; read-only by construction
.venv/bin/python tests/coverage_writes.py   # curated write scenarios, ~20 records
.venv/bin/python tests/render_coverage.py   # regenerates COVERAGE.md

The integration suite drives the server over real stdio JSON-RPC and exercises reads, error mapping, all four guardrail refusal paths, and a full create/read/update/delete cycle against live sandbox records. Requires working sandbox credentials.

Tools

All tools carry a buildium_ prefix — this server is meant to run alongside others, and bare names like health would collide.

Gateway — buildium_health, buildium_list_tags, buildium_search_endpoints, buildium_describe_endpoint, buildium_describe_schema, buildium_get, buildium_call_endpoint, buildium_created_fixtures

Files — buildium_upload_file, buildium_download_file

Shortcuts — buildium_list_rentals, buildium_get_rental, buildium_list_units, buildium_list_leases, buildium_get_lease, buildium_list_lease_transactions, buildium_list_work_orders, buildium_list_tenants, buildium_list_gl_accounts, buildium_lease_roster

buildium_lease_roster answers "who is on lease X" and "how many leases have co-tenants" in one call. Buildium's lease list does not reliably populate tenant names and its tenant endpoint has no lease filter, so without this the join costs one request per lease — measured at 24 calls for a single question before it existed, 1 after.

It is built for large accounts. It reads every tenant, following pagination up to 100,000, and says in complete whether that was all of them. Given a lease_id it reads only that lease's unit, which is two requests however big the account is. lease_status=Active skips years of past tenants. Past 300 leases it returns counts (multi_tenant_lease_count and friends) instead of the tenant-by-tenant listing, which would be too large for one tool result; filter by property or lease for names.

Every tool carries MCP annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) so a client can tell reads from writes without parsing descriptions.

Keeping responses small

Buildium records are fat — an owner carries tax IDs, fax numbers, and mailing addresses. Pass fields to keep only what you need:

{"path": "/v1/rentals/owners",
 "fields": ["Id", "FirstName", "LastName", "PropertyIds"]}

Files

Buildium never moves bytes through its API. An upload request returns an AWS S3 presigned PUT URL and a set of x-amz-meta-* headers; the bytes go straight to storage, and every signed header must be reproduced exactly or it fails with SignatureDoesNotMatch. Downloads mirror it through a URL that expires after five minutes. buildium_upload_file and buildium_download_file run both halves. Each accepts a path for the resource the file belongs to, and each is confined to Buildium's seven upload or seven download endpoints in every mode — neither is a way to POST anywhere else.

The signed URL points at a third-party host, so the transfer carries no Buildium credentials — sending the client secret to a host named by an API response would leak it wherever that response pointed.

On this machine, downloads go into one folder and nowhere else: ~/Downloads/Buildium, or BUILDIUM_DOWNLOAD_DIR, which buildium_health reports. save_to is a name or a path inside it; a path outside it is refused before anything is fetched, symlinks included, and an existing file is kept unless you pass overwrite=true. The reason is prompt injection: text in a work order could otherwise have the model save a tenant-uploaded file over ~/.zshrc. For the same reason uploads refuse hidden files and folders (~/.ssh, .env), anything named *.env, and this server's own configuration and logs.

Note that buildium_download_file does not work under PRODUCTION_READONLY: Buildium models a download request as a POST, and that mode blocks every POST without exception. Keeping the guarantee absolute was worth more than the exception; file metadata still reads fine over GET.

Pagination

List tools return pagination metadata alongside the rows:

{"ok": true, "count": 50, "limit": 50, "offset": 0,
 "has_more": true, "next_offset": 50, "data": [...]}

has_more is inferred from a full page — Buildium returns no total count — so it is a hint, not a guarantee.

Pass all_pages=true to follow pagination to the end in one call, which is what you want whenever you are counting or aggregating. It returns complete rather than has_more, caps at 1000 records, and says so explicitly if it truncated:

{"ok": true, "count": 55, "complete": true, "pages_followed": true, "data": [...]}

The cap is about the size of the answer, not the API. A lease record is about 1.6 KB, so a thousand of them is already far more than an MCP client accepts as one tool result.

To count, pass count_only=true instead. It follows every page, up to 100,000 records, and returns only the number, so "how many active leases" is one call in any account:

{"ok": true, "count": 4500, "complete": true, "pages_followed": true, "count_only": true}

It is on every list tool and on buildium_get for any collection, and honours exclude_fixtures. For totals or other figures that need the records themselves, past 1000 of them, narrow the query with the tool's filters and fields, or page by hand with limit (up to 1000) and offset. buildium_lease_roster is not bound by the cap either — see above.

Test fixtures

Buildium supports DELETE on only 14 of its 462 operations, so any account that has been tested against accumulates test records permanently — and every count over it becomes ambiguous.

Rather than leave that to inference, list tools and buildium_lease_roster report fixture_count whenever records matching the fixture prefix are present, along with a note saying what it means. buildium_lease_roster also precomputes multi_tenant_lease_count_excluding_fixtures, and the matching lease ids when the roster is small enough to list. Pass exclude_fixtures=true to filter them out.

Nothing is dropped unless you ask, and next_offset keeps counting the rows the server returned rather than the ones left after filtering, so excluding fixtures never causes the next page to skip records.

Deprecated endpoints

Sixteen operations — every appliance path — start returning 410 Gone on 2026-10-19. search_endpoints and describe_endpoint report deprecated: true with the retirement date and the replacement path, and deprecated endpoints rank below equivalent live ones without being hidden: at the time of writing the replacement API returns nothing, so the deprecated endpoints are still the only place the records exist.

Notes

Buildium authenticates with two static headers — x-buildium-client-id and x-buildium-client-secret. There is no OAuth flow, no token endpoint, and no refresh, despite what some third-party integrations claim.

Only 14 of the 462 operations support DELETE. Most resources — vendor categories among them — can be created but never removed via the API.

Unaffiliated with Buildium, LLC.

Available Tools

20 tools
buildium_call_endpointBuildium Call EndpointA
Destructive

Call any Buildium endpoint: the tool for writes.

For reads use buildium_get, which is read-only and so can be approved once.

Write guardrails apply — see buildium_health for the active mode. In the default 'fixtures' mode, every name in a create payload must carry the fixture prefix, nested ones included; a create whose payload has no name field at all is allowed against the sandbox but refused against production, since nothing on it could carry the prefix. Updates and deletes only work on records created this session, and off the sandbox so do creates under an existing record, such as a lease renewal.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoJSON request body. Usually an object; a few endpoints, such as custom field values, take a list. buildium_describe_endpoint shows which.
pathYesBuildium API path, e.g. "/v1/vendors" or "/v1/leases/12345".
queryNoQuery-string parameters, e.g. {"statuses": "Active"}.
fieldsNoKeep only these top-level fields in each record, e.g. ["Id", "Name"]. Buildium records are large and carry tax IDs and addresses you may not need.
methodYesPOST, PUT, PATCH or DELETE. GET also works, but buildium_get is the tool for reads.
confirmNoMust be true for DELETE.
all_pagesNoGET only; see buildium_get.
count_onlyNoGET only; see buildium_get.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry destructiveHint=true and readOnlyHint=false, but the description goes well beyond them by detailing fixture-prefix requirements for names in create payloads, session-scoped updates/deletes, and the sandbox/production differences. This materially clarifies what happens at write time without contradicting the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and the read/write split, then packs in dense guardrail rules. It earns most of its length, though the final sentence about updates/deletes and creates under existing records is somewhat convoluted and could be clearer.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's broad scope and high parameter count, the description covers the essentials: when to use it, when not to, the active guardrail mode, fixture-prefix rules, session restrictions, and sandbox/production differences. With an output schema present and annotations carrying the destructive/read-only profile, nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real semantic constraints on payload values: every name in a create payload must carry the fixture prefix, nested ones included, and creates with no name field behave differently on sandbox vs. production. This supplements the schema's generic body description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Call any Buildium endpoint: the tool for writes,' which names a clear verb and resource and immediately positions it as the write-oriented counterpart to read tools. It further distinguishes itself from buildium_get by explicitly labeling that tool as read-only.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states 'For reads use buildium_get' and notes that GET also works but buildium_get is the preferred read tool. It also directs the agent to buildium_health for the active write-guardrail mode and explains sandbox-versus-production restrictions, giving concrete when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buildium_created_fixturesBuildium Created FixturesA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true and idempotentHint=true, and the description is consistent. It adds a non-obvious side effect: the tool appends to created-records.log, which is beyond the annotations. It also explains the purpose of that side effect (cleanup after the process), providing valuable behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the core purpose, and immediately follows with the critical usage context and side-effect. No fluff or redundancy; every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters, an output schema present, and annotations covering safety, the description adds the essential context about fixtures mode, permitted operations, and log behavior. The agent has everything needed to decide when to call this tool and what to expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so schema coverage is trivially 100%. The description adds no parameter-specific detail, but none is needed. The baseline for 0 params is 4, and the description fully suffices; there is no missing parameter meaning to compensate for.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List') and resource ('records created during this session'), and clarifies the grouping by collection. It clearly differentiates from siblings like buildium_list_tenants or buildium_list_leases by focusing on session-created fixtures, which is a distinct scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when this tool is relevant: 'These are the only records that updates and deletes are permitted against in fixtures mode.' This tells the agent when to consult this list before performing updates/deletes, and implicitly that other tools are for different operations. It also mentions the log append for cleanup, adding practical context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buildium_describe_endpointBuildium Describe EndpointA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesBuildium API path, e.g. "/v1/vendors" or "/v1/leases/12345".
methodYesHTTP method: GET, POST, PUT, PATCH or DELETE.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds the useful detail that $refs are resolved, but otherwise it mostly restates the tool's purpose rather than revealing additional behavioral traits such as auth needs, rate limits, or edge cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, both purposefulcars. The core contract is front-loaded, and the usage guidance follows naturally. No filler or redundant restatement of the tool name exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an introspection tool with only two fully documented parameters, a strong usage pointer, and an output schema present, the description covers everything needed. There is no missing context that would prevent an agent from invoking it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already explains both parameters well: path includes an example and method lists allowed HTTP verbs. The description adds no additional parameter-level meaning beyond calling them 'parameters,' so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Show'), a clear resource ('the full contract for one endpoint'), and enumerates exactly what is included: parameters, request body schema, and success response schema with $refs resolved. It is clearly distinguishable from sibling tools like buildium_describe_schema by focusing on an endpoint's full contract.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The second sentence provides explicit, actionable guidance: 'Call this before buildium_call_endpoint on anything non-trivial — especially writes.' It names the relevant sibling tool and gives a concrete condition for when this tool is the right choice, which is exactly what an agent needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buildium_describe_schemaBuildium Describe SchemaA
Read-onlyIdempotent

Expand a named schema from the spec. Useful when buildium_describe_endpoint hit its depth limit and emitted a bare $ref.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesSchema name from the spec, e.g. "LeasePostMessage".

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds the behavioral context of resolving a depth-limit artifact, which is useful beyond the annotations. It does not mention output format or error handling, but the presence of an output schema reduces the burden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no redundant wording. The primary action is front-loaded, and the usage condition is placed in the second sentence. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only tool with annotations covering safety and an output schema, the description provides the purpose and the exact scenario. Nothing an agent needs to decide when to invoke it is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'name' is fully described in the input schema (100% coverage) with an example, so the schema carries the meaning. The tool description does not add extra parameter details, but that is not necessary given the high schema coverage. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear action ('Expand a named schema from the spec') and ties it to a specific need: when buildium_describe_endpoint hits its depth limit and emits a bare $ref. This distinctly separates it from the sibling describe_endpoint tool and conveys the resource (schema) and the operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit trigger condition: use this when buildium_describe_endpoint has a depth limit and returns a bare $ref. This implicitly names the alternative (describe_endpoint) and clearly defines when to use this tool instead. No other tool is needed for this scenario.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buildium_download_fileBuildium Download FileA
Destructive

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_get.

Files are written only inside the download folder — ~/Downloads/Buildium unless BUILDIUM_DOWNLOAD_DIR moves it; buildium_health reports where. An existing file is never replaced unless overwrite is true.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_idYesThe file's ID, from GET /v1/files.
save_toNoA file name, or a path inside the download folder; relative paths are taken relative to it. Omit to save as buildium-file-<id> with an extension from the content type.
overwriteNoReplace a file that already exists at that name.
download_pathNoFor 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 endpoints are accepted.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: explains the two-step download flow, file location (~/Downloads/Buildium), overwrite semantics tied to destructiveHint=true, and the transport-layer POST block. No contradiction with annotations; it adds meaningful behavioral context the annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place. The main purpose is front-loaded, then constraints and exceptions are layered logically. It is detailed but not redundant; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with a two-step flow, special mode restrictions, and an output schema, the description covers all essentials: how the flow works, where files go, overwrite behavior, and failure modes. The presence of an output schema relieves it from describing return values, and nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description enriches each parameter: save_to's default naming and relative path handling, download_path's constraint to seven endpoints, and overwrite's default false. This is genuine added meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb and resource: 'Download a Buildium file to this machine,' and immediately differentiates from buildium_get by explaining why that tool cannot be used (expiring URL, separate storage). This unambiguously identifies the tool's purpose and distinguishes it from a close sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states that buildium_get cannot handle this task and why, giving the agent a clear routing rule. It also discloses the production-readonly mode refusal and notes that metadata reading via GET still works, providing concrete when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buildium_getBuildium GetA
Read-onlyIdempotent

Read any Buildium endpoint (GET). Cannot change anything.

Use this for every read that has no curated shortcut. It is a separate tool from buildium_call_endpoint so that a client can approve reads once and still ask about each write.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesBuildium API path, e.g. "/v1/vendors" or "/v1/leases/12345".
queryNoQuery-string parameters, e.g. {"statuses": "Active"}.
fieldsNoKeep only these top-level fields in each record, e.g. ["Id", "Name"]. Buildium records are large and carry tax IDs and addresses you may not need.
all_pagesNoFollow pagination and return the records, up to 1000. Use it for totals and other aggregates; a figure from one page is wrong whenever there is more than one page.
count_onlyNoFollow every page, up to 100,000 records, and return only how many there are. Use it for "how many" questions.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, so the safety profile is fully known. The description repeats 'Cannot change anything' and adds the approval-workflow rationale, but it does not add new behavioral detail such as error behavior, rate limits, or response characteristics beyond what schema/annotations already imply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences achieve a lot: they state the domain, the safety constraint, the usage rule, and the distinguishing rationale versus the write-capable sibling. There is no filler or repetition that does meaningful work.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a generic endpoint-reading tool with 5 richly described parameters, an output schema, and strong annotations, the description is complete enough. It would be hard for an agent to misuse this tool for a read when a curated shortcut is available, or to confuse it with the write-capable endpoint tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameters are already well documented. The description adds no parameter-level meaning beyond the schema, which is the expected baseline when the schema carries the full burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Read any Buildium endpoint (GET).' It immediately distinguishes itself from curated read shortcuts and from buildium_call_endpoint, so an agent can tell exactly what this tool is for. The phrase 'Cannot change anything' reinforces the read-only scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance: 'Use this for every read that has no curated shortcut.' It also explains the split from buildium_call_endpoint in terms of client approval of reads versus writes. This clearly routes an agent between generic reads, curated reads, and write calls.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buildium_get_leaseBuildium Get LeaseA
Read-onlyIdempotent

Get one lease by ID, including tenants and rent terms.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNoKeep only these top-level fields in each record, e.g. ["Id", "Name"]. Buildium records are large and carry tax IDs and addresses you may not need.
lease_idYesThe lease's ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, fully covering safety and idempotency. The description adds minimal behavioral context beyond 'including tenants and rent terms', which relates to response content rather than side effects. With annotations present, the bar is lower, and this modest addition earns a 3.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, focused sentence that conveys the core purpose without redundancy. It is front-loaded with the action and resource, making it easy to scan. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists (so return structure is defined), the annotations cover safety, and the schema documents parameters fully, the description is sufficient for an agent to invoke the tool correctly. It states exactly what the tool does, and the schema fills in the rest. Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters (lease_id and fields) are already described in the schema. The fields parameter's schema description is notably detailed, explaining its purpose and why it's useful. The tool description itself does not add any parameter-specific information, but since the schema carries the burden, the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Get'), the specific resource ('one lease'), and the key included details ('tenants and rent terms'). It is distinguishable from siblings like buildium_list_leases, which implies retrieving multiple leases, and from buildium_get_rental, which targets a different resource.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: use this when you need a single lease by ID. It does not explicitly name alternatives or exclusions, but the phrase 'one lease by ID' sets clear context. A slight gap is the lack of guidance on when to prefer list_leases or other tools, but the purpose is clear enough for most agents.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buildium_get_rentalBuildium Get RentalA
Read-onlyIdempotent

Get one rental property by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNoKeep only these top-level fields in each record, e.g. ["Id", "Name"]. Buildium records are large and carry tax IDs and addresses you may not need.
rental_idYesThe rental property's ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already report read-only, idempotent, and non-destructive behavior, so the description does not need to repeat them. The main text adds no behavioral detail; only the schema's fields description notes that Buildium records can be large and carry sensitive fields, which is modest additional context. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. It conveys the essential operation and selection criterion immediately, and every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-by-ID read tool, the description, together with the fully described parameters, output schema, and read-only/idempotent annotations, gives an agent everything needed to call it correctly. The only optional improvement would be explicit sibling routing, but this is not required for correctness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents rental_id and fields. The description's 'by ID' only reinforces rental_id and adds no meaning beyond the schema; the helpful fields guidance lives in the schema, not the tool description, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Get'), a precise resource ('one rental property'), and the selection criterion ('by ID'). It distinguishes itself from sibling buildium_list_rentals by emphasizing a single record lookup, so an agent can select it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'one rental property by ID' establishes clear context: use this when the agent has a rental_id and needs a single entity. It does not explicitly name alternatives or exclusions (e.g., buildium_list_rentals for multiple properties), so it stops short of full explicit guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buildium_healthBuildium HealthA
Read-onlyIdempotent

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, where downloads go, 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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, and the description adds useful context about what the report contains, including startup misconfiguration and exact settings to apply. It does not contradict the annotations and gives enough behavioral detail for a zero-parameter health check.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the first sentence enumerates the report contents, and the second sentence gives crisp usage guidance. Every sentence earns its place with no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that the tool has no parameters, an output schema exists, and annotations already cover safety and idempotency, the description is complete. It explains what the tool returns, when to call it, and what it will do if the server is not configured.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema fully covers inputs by construction. The description's detail about what the report covers compensates for any need to explain parameter context, earning the baseline of 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Report') and names the exact resource: the Buildium environment binding, write mode, indexed operation count, download location, and configuration guidance. This clearly distinguishes it from the data-access and endpoint siblings like buildium_get and buildium_list_rentals.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use the tool: before a write, when the environment is in doubt, or after a startup problem. It also gives a clear exclusion (read-only questions do not require it), though it does not name a specific alternative tool to use instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buildium_lease_rosterBuildium Lease RosterA
Read-onlyIdempotent

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 reads them and inverts the mapping locally.

Every matching tenant is read, following pagination; complete says whether that covered them all. Above 300 leases only the counts are returned (multi_tenant_lease_count and friends); narrow with property_id or lease_id for lease ids and names.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size used while reading tenants, 1-1000. It does not cap the roster.
lease_idNoOnly this lease. Reads just that lease's unit: two requests however large the account.
property_idNoOnly this rental property.
lease_statusNoActive, Past or Future: only tenants with a lease term in that state. Active is usually what "who lives here" means, and skips years of past tenants.
exclude_fixturesNoLeave out tenants created by test tooling, whose names start with the fixture prefix (see buildium_health). When any are present the response says so either way.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false. The description goes beyond these by disclosing pagination behavior: 'Every matching tenant is read, following pagination; `complete` says whether that covered them all.' It also reveals a threshold: 'Above 300 leases only the counts are returned (multi_tenant_lease_count and friends); narrow with property_id or lease_id for lease ids and names.' This is valuable behavioral context that the annotations alone do not provide, and it does not contradict them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single paragraph of about 120 words. It is front-loaded with the core purpose and usage, then provides background on Buildium's limitations, and finally describes behavior. Every sentence carries information; there is no fluff. However, it is slightly longer than necessary—the Buildium explanation, while useful, could be condensed. Overall, it is well-structured and concise enough for its complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema (though not shown here), and the description covers key output details like the `complete` flag and the count fields (multi_tenant_lease_count). It also explains edge cases (300-lease threshold, fixture exclusion) and how parameters affect behavior. Given the tool's complexity (joining leases and tenants, pagination, limits), the description is complete enough for an agent to understand what to expect and how to call it correctly. No important gaps are apparent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description mentions 'narrow with property_id or lease_id' but this is already stated in the schema descriptions. It adds no new parameter meaning beyond what the schema provides. For example, the `limit` parameter's schema already explains it is a page size and does not cap the roster; the description repeats this implicitly but does not add extra detail. Thus, the description does not compensate for any gap because there is none, but it also does not add value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise statement of what the tool does: 'Who is on which lease — the lease-to-tenant join, done in one call.' It clearly identifies the resource (leases and tenants) and the operation (joining them). It also distinguishes itself from siblings by explicitly stating its intended use: 'Use this for any "who lives in / who is on lease X" question, and for counting co-tenants.' This is a specific verb+resource and differentiates from tools like buildium_list_leases or buildium_list_tenants.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: 'Use this for any "who lives in / who is on lease X" question, and for counting co-tenants.' It also explains why it is needed (Buildium's limitations: lease list doesn't reliably populate tenant names, tenant endpoint has no lease filter). It further instructs on narrowing results: 'narrow with property_id or lease_id for lease ids and names.' This provides clear context for when to use this tool versus alternatives, even if it doesn't name a specific sibling to avoid.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buildium_list_gl_accountsBuildium List Gl AccountsA
Read-onlyIdempotent

List general ledger accounts. You need these IDs to post rent charges and other financial transactions.

To count, use count_only; for totals, all_pages.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoRecords per page, 1-1000.
fieldsNoKeep only these top-level fields in each record, e.g. ["Id", "Name"]. Buildium records are large and carry tax IDs and addresses you may not need.
offsetNoHow many records to skip. Use next_offset from the previous page.
all_pagesNoFollow pagination and return the records, up to 1000. Use it for totals and other aggregates; a figure from one page is wrong whenever there is more than one page.
count_onlyNoFollow every page, up to 100,000 records, and return only how many there are. Use it for "how many" questions.
exclude_fixturesNoLeave out test records, whose names start with the fixture prefix (see buildium_health). When any are present the response says so either way.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds value by explaining why you need the IDs (for posting transactions), which goes beyond the annotations. It also mentions that using all_pages for totals is necessary to avoid wrong figures, but it doesn't deeply describe the response format or edge cases like the fixture exclusion behavior, which are partly covered by the parameter descriptions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded with the main purpose in the first sentence. The second sentence provides critical usage guidance on two key parameters, and the entire description is under 50 words. Every sentence earns its place, with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of 6 parameters and the presence of an output schema, the description is complete. The parameter descriptions in the schema cover the detailed semantics, and the tool description adds the key context about why the IDs are needed and how to count vs. get totals. The annotations already cover the safety profile, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage, so each parameter is already well-documented with details like defaults and usage guidance (e.g., 'Follow pagination and return the records, up to 1000. Use it for totals'). The description adds only a small amount of extra guidance in the body, such as the 'count_only' and 'all_pages' usage hints. Since the schema already does the heavy lifting, the description doesn't need to add much, so a baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists general ledger accounts and that the IDs are needed for posting transactions. It distinguishes itself from siblings by focusing on GL accounts, which is a specific resource type. The verb 'List' is precise and the resource is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to use count_only for counting and all_pages for totals. It clearly indicates the when-not conditions for those two parameters, which is essential for correct usage. This instruction prevents the agent from misusing the default pagination or getting incorrect aggregate figures.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buildium_list_leasesBuildium List LeasesA
Read-onlyIdempotent

List leases.

Each row already carries the rent terms under AccountDetails (including AccountDetails.Rent, the recurring monthly amount) and the lease dates. You do NOT need to open the transaction ledger to read a lease's rent — buildium_list_lease_transactions is for actual posted charges and payments, which is a different question.

For who is on each lease, use buildium_lease_roster.

To count, use count_only; for totals, all_pages.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoRecords per page, 1-1000.
fieldsNoKeep only these top-level fields in each record, e.g. ["Id", "Name"]. Buildium records are large and carry tax IDs and addresses you may not need.
offsetNoHow many records to skip. Use next_offset from the previous page.
all_pagesNoFollow pagination and return the records, up to 1000. Use it for totals and other aggregates; a figure from one page is wrong whenever there is more than one page.
count_onlyNoFollow every page, up to 100,000 records, and return only how many there are. Use it for "how many" questions.
property_idNoOnly this rental property.
lease_statusNoActive, Future, Past or Expired.
exclude_fixturesNoLeave out test records, whose names start with the fixture prefix (see buildium_health). When any are present the response says so either way.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Among the annotations (readOnlyHint, openWorldHint, idempotentHint, destructiveHint), the read-only safety profile is already disclosed. The description adds useful behavioral context beyond annotations: each row already includes rent under AccountDetails, so no need to open the transaction ledger. It also clarifies pagination behavior by directing to count_only and all_pages. This goes beyond the structured data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tightly written sentences with zero filler. The first sentence states the core action, the next delivers the most useful non-obvious fact (rent is already in AccountDetails), and the following sentences route to alternatives and usage flags. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and 100% schema coverage, the description needn't explain return fields. It addresses the two most likely mistakes an agent could make (opening the wrong endpoint for rent/occupants, or computing aggregates from a single page) and handles them explicitly. For a list tool of this complexity, this is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all 8 parameters are already well documented. The description reinforces the purpose of count_only and all_pages but doesn't introduce new semantic meaning beyond what the schema already provides. It also doesn't mention fields, limit, or property_id, but those are self-explanatory from the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'List leases.' — a clear verb plus resource. It then distinguishes itself from siblings by stating that buildium_list_lease_transactions handles actual posted charges and that buildium_lease_roster handles occupants, so an agent can immediately tell this tool apart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: use buildium_list_lease_transactions for transactions, buildium_lease_roster for who is on the lease, and count_only/all_pages for counts and totals. It also states when NOT to use this tool (for reading rent, you don't need the ledger). This is model guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buildium_list_lease_transactionsBuildium List Lease TransactionsA
Read-onlyIdempotent

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, and count_only=true to learn only how many transactions there are.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoRecords per page, 1-1000.
fieldsNoKeep only these top-level fields in each record, e.g. ["Id", "Name"]. Buildium records are large and carry tax IDs and addresses you may not need.
offsetNoHow many records to skip. Use next_offset from the previous page.
lease_idYesThe lease's ID.
all_pagesNoFollow pagination and return the records, up to 1000. Use it for totals and other aggregates; a figure from one page is wrong whenever there is more than one page.
count_onlyNoFollow every page, up to 100,000 records, and return only how many there are. Use it for "how many" questions.
exclude_fixturesNoLeave out test records, whose names start with the fixture prefix (see buildium_health). When any are present the response says so either way.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, and non-destructive behavior, so the description need not repeat those. It adds useful behavioral context by defining the result as posted charges and payments, and by relating pagination modes to user intent. There is no contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences: purpose first, then sibling routing, then pagination guidance. Every sentence earns its place, and the most important scoping information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a rich output schema, detailed parameter descriptions, and strong annotations, the description covers the key decision points an agent needs: what this endpoint returns, when to use a sibling instead, and how to choose between all_pages and count_only. Nothing essential is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents each parameter. The description adds value by explaining the practical difference between all_pages and count_only, and by warning against using a single page for totals. This goes beyond the baseline without needing to restate the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'List financial transactions (posted charges and payments) for a lease.' It clarifies what kind of records are returned and distinguishes itself from the sibling buildium_list_leases by explicitly noting that recurring rent belongs to that other tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description directly states when to prefer buildium_list_leases instead (recurring rent amount) and provides concrete conditions for all_pages (totalling a ledger) and count_only (learning only how many transactions exist). This is explicit routing guidance with minimal ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buildium_list_rentalsBuildium List RentalsB
Read-onlyIdempotent

List rental properties. Pass fields to narrow large records.

To count, use count_only; for totals, all_pages.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoRecords per page, 1-1000.
fieldsNoKeep only these top-level fields in each record, e.g. ["Id", "Name"]. Buildium records are large and carry tax IDs and addresses you may not need.
offsetNoHow many records to skip. Use next_offset from the previous page.
all_pagesNoFollow pagination and return the records, up to 1000. Use it for totals and other aggregates; a figure from one page is wrong whenever there is more than one page.
count_onlyNoFollow every page, up to 100,000 records, and return only how many there are. Use it for "how many" questions.
exclude_fixturesNoLeave out test records, whose names start with the fixture prefix (see buildium_health). When any are present the response says so either way.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds a minor behavioral note about narrowing large records via fields, which is useful but not substantial; it doesn't contradict annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short lines with zero fluff. The main purpose is front-loaded, and the additional guidance on count_only/all_pages is relevant. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has 6 parameters and an output schema, so much is already structured. The description is adequate for a simple list operation but lacks sibling routing and any mention of the response structure or when pagination is implicitly required. It's not misleading, but an agent could benefit from knowing how this relates to other list tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and each parameter already has a detailed description explaining its purpose and usage (e.g., offset explains next_offset, all_pages warns about page-figure inaccuracies). The description's one-line tip about fields adds negligible value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'List rental properties', a clear verb+resource that identifies the tool's function. It differentiates from siblings like buildium_list_units and buildium_list_leases by naming 'rental properties', though it doesn't explicitly call out alternatives as the best examples do.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description only gives parameter-level guidance ('To count, use count_only; for totals, all_pages') and doesn't explain when to prefer this tool over siblings such as buildium_get_rental or buildium_list_units. There is no mention of context, prerequisites, or exclusion conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buildium_list_tagsBuildium List TagsA
Read-onlyIdempotent

List every resource area in the Buildium API with its operation count (Leases, Work Orders, General Ledger, ...). Use this to orient before searching.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile: readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds the scope of the operation (comprehensive resource-area listing with operation counts) but does not disclose further behavioral details such as output size or pagination. With annotations carrying the safety burden, this is acceptable but not exceptional.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with no filler. The core action and output are stated first, and the usage guidance is appended in a clear directive. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only orientation tool with an output schema present, the description covers the essential context: what it lists, what each item includes, and when to use it. Nothing critical is missing for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema is empty, so there is no parameter information that the description must supply. The baseline of 4 applies because no parameter documentation burden exists; the description does not need to compensate for anything.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List') and resource ('every resource area in the Buildium API with its operation count'), with concrete examples. It distinguishes itself from search-oriented siblings by framing itself as an orientation tool rather than a search/discovery tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use this to orient before searching' gives clear usage context and timing. It does not explicitly name alternatives or state when not to use the tool, but the guidance is unambiguous enough for an agent to select it in the intended workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buildium_list_tenantsBuildium List TenantsA
Read-onlyIdempotent

List rental tenants.

To count, use count_only; for totals, all_pages.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoRecords per page, 1-1000.
fieldsNoKeep only these top-level fields in each record, e.g. ["Id", "Name"]. Buildium records are large and carry tax IDs and addresses you may not need.
offsetNoHow many records to skip. Use next_offset from the previous page.
all_pagesNoFollow pagination and return the records, up to 1000. Use it for totals and other aggregates; a figure from one page is wrong whenever there is more than one page.
count_onlyNoFollow every page, up to 100,000 records, and return only how many there are. Use it for "how many" questions.
exclude_fixturesNoLeave out test records, whose names start with the fixture prefix (see buildium_health). When any are present the response says so either way.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already communicate read-only, open-world, idempotent, and non-destructive behavior, so the description's disclosure burden is low. The description adds little behavioral context beyond a redundant count_only/all_pages hint, but it does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very short and front-loaded: the core purpose comes first, followed by the two most important usage hints. It has no filler, though the second sentence is terse enough that it could be slightly clearer on its own.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite the minimal description, the overall tool definition is well covered by rich parameter descriptions, a complete annotation set, and an output schema. The description need not explain return values or parameter behavior further; the main remaining gap is clarifying potential conflicts or exclusions between count_only and all_pages.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and each parameter already has a detailed description, so the baseline of 3 applies. The description's mention of count_only and all_pages adds no meaning beyond what the input schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List') and a specific resource ('rental tenants'), which is enough to distinguish it from siblings like buildium_list_units or buildium_list_leases. It does not explicitly differentiate it from buildium_list_rentals or call out scope, so it stops just short of full clarity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit parameter-level guidance: use count_only for counting and all_pages for totals. However, it never says when to choose this tool over alternatives or when not to use it, so sibling selection is left mostly to inference from the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buildium_list_unitsBuildium List UnitsA
Read-onlyIdempotent

List rental units, optionally filtered to one property.

To count, use count_only; for totals, all_pages.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoRecords per page, 1-1000.
fieldsNoKeep only these top-level fields in each record, e.g. ["Id", "Name"]. Buildium records are large and carry tax IDs and addresses you may not need.
offsetNoHow many records to skip. Use next_offset from the previous page.
all_pagesNoFollow pagination and return the records, up to 1000. Use it for totals and other aggregates; a figure from one page is wrong whenever there is more than one page.
count_onlyNoFollow every page, up to 100,000 records, and return only how many there are. Use it for "how many" questions.
property_idNoOnly this rental property.
exclude_fixturesNoLeave out test records, whose names start with the fixture prefix (see buildium_health). When any are present the response says so either way.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is clear. The description adds behavioral context about pagination via all_pages and count_only, noting limits and that single pages are insufficient for totals. This is valuable but not exhaustive, as it doesn't mention response shape or error cases, but given annotations, a 4 is justified.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, with two sentences: one states the core purpose, the other directs usage for counts and totals. The key usage guidance is front-loaded. Every word is functional, with no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (7 optional parameters), the description covers the main decision points (when to use count vs totals) and the schema covers parameters in detail. There is an output schema, so return values are not the description's job. The only minor gap is that it doesn't mention the `exclude_fixtures` parameter's role, but the schema and health tool reference cover it, so completeness is high.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with detailed parameter descriptions, so baseline is 3. The description adds value by explaining the purpose of all_pages ('for totals') and count_only ('for how many questions'), and mentions the `fields` parameter in the schema to filter large records. This goes beyond schema basics, justifying a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists rental units with optional filtering by property, using a specific verb ('List') and a resource ('rental units'). It distinguishes itself from siblings like buildium_list_rentals by focusing on units, and from count_only/all_pages modes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly specifies when to use count_only for counting and all_pages for totals, and warns against using single-page results for aggregates. This guides the agent on mode selection, though it doesn't explicitly mention alternatives for listing rentals, but the sibling context is implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buildium_list_work_ordersBuildium List Work OrdersA
Read-onlyIdempotent

List work orders (maintenance jobs).

To count, use count_only; for totals, all_pages.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoRecords per page, 1-1000.
fieldsNoKeep only these top-level fields in each record, e.g. ["Id", "Name"]. Buildium records are large and carry tax IDs and addresses you may not need.
offsetNoHow many records to skip. Use next_offset from the previous page.
all_pagesNoFollow pagination and return the records, up to 1000. Use it for totals and other aggregates; a figure from one page is wrong whenever there is more than one page.
count_onlyNoFollow every page, up to 100,000 records, and return only how many there are. Use it for "how many" questions.
exclude_fixturesNoLeave out test records, whose names start with the fixture prefix (see buildium_health). When any are present the response says so either way.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is established. The description adds little behavioral detail beyond the schema: it restates count and totals guidance already present in parameter descriptions. It does not contradict annotations, and no additional side-effect disclosure is needed for a read-only tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely compact: one sentence establishes purpose, and a second sentence highlights the two parameter modes that matter most. There is no filler or redundant detail; every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is sufficient for this tool given the rich input schema, output schema, and annotations. It names the resource and the key usage nuances. It could explicitly mention when to prefer a sibling tool, but the tool name and schema already carry most of the contextual burden.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description's parameter-related advice ("use count_only", "all_pages") restates what the schema already says rather than adding new meaning. It adds no parameter semantics beyond the structured schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: "List work orders (maintenance jobs)." This clearly identifies what the tool does and distinguishes it from sibling list tools like buildium_list_rentals and buildium_list_units by naming the entity. The parenthetical synonym adds helpful clarity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear guidance on the two main usage modes: "To count, use count_only; for totals, all_pages." This orients the agent toward the right parameters for the right questions. It does not explicitly compare this tool to alternatives, but the resource-specific name makes the primary use case obvious.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buildium_search_endpointsBuildium Search EndpointsA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMost results to return.
queryYesNatural keywords, e.g. "work orders", "lease transactions", "gl accounts".
methodNoOnly endpoints with this HTTP method: get, post, put, patch or delete.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the behavioral detail that it searches across all 462 operations and returns matching endpoints, which is useful. It doesn't describe result ranking or pagination, but with annotations covering safety, a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with zero waste. The primary purpose and usage guidance are front-loaded, and the scope detail ('across all 462 operations') earns its place by conveying breadth. No redundant phrasing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a search tool with a rich output schema, annotations covering safety, and 100% schema parameter coverage, the description is nearly complete. It tells the agent when to use it and what it searches. It could mention that results are endpoint matches rather than data records, but the output schema likely covers that, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all three parameters. The description adds the example keyword style ('work orders', 'lease transactions') and clarifies that query is natural keywords, which is slightly beyond the schema. However, it doesn't add meaning for limit or method beyond what the schema provides, so baseline 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Find'), a resource ('Buildium API endpoints'), and a clear scope ('by keyword' across paths, summaries, tags, and operation IDs across all 462 operations). It also explicitly positions itself as the starting point when the exact path is unknown, which distinguishes it from sibling tools like buildium_describe_endpoint and buildium_call_endpoint.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: 'Start here when you don't already know the exact path.' This implies the alternative is to go directly to a specific endpoint tool when the path is known. It doesn't explicitly name alternatives or exclusions, but the guidance is strong enough for an agent to decide when to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buildium_upload_fileBuildium Upload FileA
Destructive

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 — it would post the metadata and hand you a URL it cannot then PUT to. Use this instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesThe file's title in Buildium. In 'fixtures' write mode it must start with the fixture prefix (see buildium_health).
entity_idNoThe ID of that record.
file_pathYesPath to the file on this machine. Hidden files, *.env files and this server's own configuration are refused.
category_idYesFile category, from GET /v1/files/categories. Buildium rejects the upload without a real one.
descriptionNoOptional description stored with the file.
entity_typeNoWhat the file is attached to: Rental, Lease, Tenant, Vendor, Association, RentalOwner, RentalUnit, and so on.Rental
upload_pathNoFor a file belonging to a bill, check or task history, that resource's own uploads path, e.g. "/v1/bills/123/files/uploads". Only Buildium's seven upload endpoints are accepted./v1/files/uploads

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds meaningful behavioral context beyond the annotations by disclosing that bytes do not travel through the Buildium API and that the upload uses a short-lived AWS presigned PUT URL. It also warns about the generic endpoint's limitation, which is valuable non-obvious behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact sentences deliver the purpose, the underlying mechanism, and the routing guidance away from buildium_call_endpoint. There is no filler or redundant repetition of schema information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the full schema coverage, the presence of an output schema, and annotations covering safety hints, the description adds the critical non-obvious context about the presigned URL flow. An agent has everything needed to invoke the tool correctly and avoid the common alternative mistake.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All seven parameters already have full descriptions in the input schema, so the description does not need to repeat them. The description adds no parameter-specific details, but the schema fully covers parameter semantics, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the specific action 'Upload a local file to Buildium' and highlights that it handles both steps of the upload flow. It also distinguishes itself from buildium_call_endpoint by explaining why that alternative cannot complete the upload.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names buildium_call_endpoint as the wrong alternative and explains exactly why it fails: it posts metadata and hands you a presigned URL it cannot PUT to. The description then directs the agent to use this tool instead, leaving no ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 17 tool updatesv0.2.1
    • Changedbuildium_call_endpoint9 fields changed
      • addedInput schema / properties / all_pages / description
        Added value: +"GET only; see buildium_get."
      • changedInput schema / properties / body / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / body / description
        Added value: +"JSON request body. Usually an object; a few endpoints, such as custom field values, take a list. buildium_describe_endpoint shows which."
      • addedInput schema / properties / confirm / description
        Added value: +"Must be true for DELETE."
      • addedInput schema / properties / count_only / description
        Added value: +"GET only; see buildium_get."
      • addedInput schema / properties / fields / description
        Added value: +"Keep only these top-level fields in each record, e.g. [\"Id\", \"Name\"]. Buildium records are large and carry tax IDs and addresses you may not need."
      • addedInput schema / properties / method / description
        Added value: +"POST, PUT, PATCH or DELETE. GET also works, but buildium_get is the tool for reads."
      • addedInput schema / properties / path / description
        Added value: +"Buildium API path, e.g. \"/v1/vendors\" or \"/v1/leases/12345\"."
      • addedInput schema / properties / query / description
        Added value: +"Query-string parameters, e.g. {\"statuses\": \"Active\"}."
    • Changedbuildium_describe_endpoint2 fields changed
      • addedInput schema / properties / method / description
        Added value: +"HTTP method: GET, POST, PUT, PATCH or DELETE."
      • addedInput schema / properties / path / description
        Added value: +"Buildium API path, e.g. \"/v1/vendors\" or \"/v1/leases/12345\"."
    • Changedbuildium_describe_schema1 field changed
      • addedInput schema / properties / name / description
        Added value: +"Schema name from the spec, e.g. \"LeasePostMessage\"."
    • Changedbuildium_download_file4 fields changed
      • addedInput schema / properties / download_path / description
        Added value: +"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 endpoints are accepted."
      • addedInput schema / properties / file_id / description
        Added value: +"The file's ID, from GET /v1/files."
      • addedInput schema / properties / overwrite / description
        Added value: +"Replace a file that already exists at that name."
      • addedInput schema / properties / save_to / description
        Added value: +"A file name, or a path inside the download folder; relative paths are taken relative to it. Omit to save as buildium-file-<id> with an extension from the content type."
    • Changedbuildium_get5 fields changed
      • addedInput schema / properties / all_pages / description
        Added value: +"Follow pagination and return the records, up to 1000. Use it for totals and other aggregates; a figure from one page is wrong whenever there is more than one page."
      • addedInput schema / properties / count_only / description
        Added value: +"Follow every page, up to 100,000 records, and return only how many there are. Use it for \"how many\" questions."
      • addedInput schema / properties / fields / description
        Added value: +"Keep only these top-level fields in each record, e.g. [\"Id\", \"Name\"]. Buildium records are large and carry tax IDs and addresses you may not need."
      • addedInput schema / properties / path / description
        Added value: +"Buildium API path, e.g. \"/v1/vendors\" or \"/v1/leases/12345\"."
      • addedInput schema / properties / query / description
        Added value: +"Query-string parameters, e.g. {\"statuses\": \"Active\"}."
    • Changedbuildium_get_lease2 fields changed
      • addedInput schema / properties / fields / description
        Added value: +"Keep only these top-level fields in each record, e.g. [\"Id\", \"Name\"]. Buildium records are large and carry tax IDs and addresses you may not need."
      • addedInput schema / properties / lease_id / description
        Added value: +"The lease's ID."
    • Changedbuildium_get_rental2 fields changed
      • addedInput schema / properties / fields / description
        Added value: +"Keep only these top-level fields in each record, e.g. [\"Id\", \"Name\"]. Buildium records are large and carry tax IDs and addresses you may not need."
      • addedInput schema / properties / rental_id / description
        Added value: +"The rental property's ID."
    • Changedbuildium_lease_roster5 fields changed
      • addedInput schema / properties / exclude_fixtures / description
        Added value: +"Leave out tenants created by test tooling, whose names start with the fixture prefix (see buildium_health). When any are present the response says so either way."
      • addedInput schema / properties / lease_id / description
        Added value: +"Only this lease. Reads just that lease's unit: two requests however large the account."
      • addedInput schema / properties / lease_status / description
        Added value: +"Active, Past or Future: only tenants with a lease term in that state. Active is usually what \"who lives here\" means, and skips years of past tenants."
      • addedInput schema / properties / limit / description
        Added value: +"Page size used while reading tenants, 1-1000. It does not cap the roster."
      • addedInput schema / properties / property_id / description
        Added value: +"Only this rental property."
    • Changedbuildium_list_gl_accounts6 fields changed
      • addedInput schema / properties / all_pages / description
        Added value: +"Follow pagination and return the records, up to 1000. Use it for totals and other aggregates; a figure from one page is wrong whenever there is more than one page."
      • addedInput schema / properties / count_only / description
        Added value: +"Follow every page, up to 100,000 records, and return only how many there are. Use it for \"how many\" questions."
      • addedInput schema / properties / exclude_fixtures / description
        Added value: +"Leave out test records, whose names start with the fixture prefix (see buildium_health). When any are present the response says so either way."
      • addedInput schema / properties / fields / description
        Added value: +"Keep only these top-level fields in each record, e.g. [\"Id\", \"Name\"]. Buildium records are large and carry tax IDs and addresses you may not need."
      • addedInput schema / properties / limit / description
        Added value: +"Records per page, 1-1000."
      • addedInput schema / properties / offset / description
        Added value: +"How many records to skip. Use next_offset from the previous page."
    • Changedbuildium_list_lease_transactions7 fields changed
      • addedInput schema / properties / all_pages / description
        Added value: +"Follow pagination and return the records, up to 1000. Use it for totals and other aggregates; a figure from one page is wrong whenever there is more than one page."
      • addedInput schema / properties / count_only / description
        Added value: +"Follow every page, up to 100,000 records, and return only how many there are. Use it for \"how many\" questions."
      • addedInput schema / properties / exclude_fixtures / description
        Added value: +"Leave out test records, whose names start with the fixture prefix (see buildium_health). When any are present the response says so either way."
      • addedInput schema / properties / fields / description
        Added value: +"Keep only these top-level fields in each record, e.g. [\"Id\", \"Name\"]. Buildium records are large and carry tax IDs and addresses you may not need."
      • addedInput schema / properties / lease_id / description
        Added value: +"The lease's ID."
      • addedInput schema / properties / limit / description
        Added value: +"Records per page, 1-1000."
      • addedInput schema / properties / offset / description
        Added value: +"How many records to skip. Use next_offset from the previous page."
    • Changedbuildium_list_leases8 fields changed
      • addedInput schema / properties / all_pages / description
        Added value: +"Follow pagination and return the records, up to 1000. Use it for totals and other aggregates; a figure from one page is wrong whenever there is more than one page."
      • addedInput schema / properties / count_only / description
        Added value: +"Follow every page, up to 100,000 records, and return only how many there are. Use it for \"how many\" questions."
      • addedInput schema / properties / exclude_fixtures / description
        Added value: +"Leave out test records, whose names start with the fixture prefix (see buildium_health). When any are present the response says so either way."
      • addedInput schema / properties / fields / description
        Added value: +"Keep only these top-level fields in each record, e.g. [\"Id\", \"Name\"]. Buildium records are large and carry tax IDs and addresses you may not need."
      • addedInput schema / properties / lease_status / description
        Added value: +"Active, Future, Past or Expired."
      • addedInput schema / properties / limit / description
        Added value: +"Records per page, 1-1000."
      • addedInput schema / properties / offset / description
        Added value: +"How many records to skip. Use next_offset from the previous page."
      • addedInput schema / properties / property_id / description
        Added value: +"Only this rental property."
    • Changedbuildium_list_rentals6 fields changed
      • addedInput schema / properties / all_pages / description
        Added value: +"Follow pagination and return the records, up to 1000. Use it for totals and other aggregates; a figure from one page is wrong whenever there is more than one page."
      • addedInput schema / properties / count_only / description
        Added value: +"Follow every page, up to 100,000 records, and return only how many there are. Use it for \"how many\" questions."
      • addedInput schema / properties / exclude_fixtures / description
        Added value: +"Leave out test records, whose names start with the fixture prefix (see buildium_health). When any are present the response says so either way."
      • addedInput schema / properties / fields / description
        Added value: +"Keep only these top-level fields in each record, e.g. [\"Id\", \"Name\"]. Buildium records are large and carry tax IDs and addresses you may not need."
      • addedInput schema / properties / limit / description
        Added value: +"Records per page, 1-1000."
      • addedInput schema / properties / offset / description
        Added value: +"How many records to skip. Use next_offset from the previous page."
    • Changedbuildium_list_tenants6 fields changed
      • addedInput schema / properties / all_pages / description
        Added value: +"Follow pagination and return the records, up to 1000. Use it for totals and other aggregates; a figure from one page is wrong whenever there is more than one page."
      • addedInput schema / properties / count_only / description
        Added value: +"Follow every page, up to 100,000 records, and return only how many there are. Use it for \"how many\" questions."
      • addedInput schema / properties / exclude_fixtures / description
        Added value: +"Leave out test records, whose names start with the fixture prefix (see buildium_health). When any are present the response says so either way."
      • addedInput schema / properties / fields / description
        Added value: +"Keep only these top-level fields in each record, e.g. [\"Id\", \"Name\"]. Buildium records are large and carry tax IDs and addresses you may not need."
      • addedInput schema / properties / limit / description
        Added value: +"Records per page, 1-1000."
      • addedInput schema / properties / offset / description
        Added value: +"How many records to skip. Use next_offset from the previous page."
    • Changedbuildium_list_units7 fields changed
      • addedInput schema / properties / all_pages / description
        Added value: +"Follow pagination and return the records, up to 1000. Use it for totals and other aggregates; a figure from one page is wrong whenever there is more than one page."
      • addedInput schema / properties / count_only / description
        Added value: +"Follow every page, up to 100,000 records, and return only how many there are. Use it for \"how many\" questions."
      • addedInput schema / properties / exclude_fixtures / description
        Added value: +"Leave out test records, whose names start with the fixture prefix (see buildium_health). When any are present the response says so either way."
      • addedInput schema / properties / fields / description
        Added value: +"Keep only these top-level fields in each record, e.g. [\"Id\", \"Name\"]. Buildium records are large and carry tax IDs and addresses you may not need."
      • addedInput schema / properties / limit / description
        Added value: +"Records per page, 1-1000."
      • addedInput schema / properties / offset / description
        Added value: +"How many records to skip. Use next_offset from the previous page."
      • addedInput schema / properties / property_id / description
        Added value: +"Only this rental property."
    • Changedbuildium_list_work_orders6 fields changed
      • addedInput schema / properties / all_pages / description
        Added value: +"Follow pagination and return the records, up to 1000. Use it for totals and other aggregates; a figure from one page is wrong whenever there is more than one page."
      • addedInput schema / properties / count_only / description
        Added value: +"Follow every page, up to 100,000 records, and return only how many there are. Use it for \"how many\" questions."
      • addedInput schema / properties / exclude_fixtures / description
        Added value: +"Leave out test records, whose names start with the fixture prefix (see buildium_health). When any are present the response says so either way."
      • addedInput schema / properties / fields / description
        Added value: +"Keep only these top-level fields in each record, e.g. [\"Id\", \"Name\"]. Buildium records are large and carry tax IDs and addresses you may not need."
      • addedInput schema / properties / limit / description
        Added value: +"Records per page, 1-1000."
      • addedInput schema / properties / offset / description
        Added value: +"How many records to skip. Use next_offset from the previous page."
    • Changedbuildium_search_endpoints3 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Most results to return."
      • addedInput schema / properties / method / description
        Added value: +"Only endpoints with this HTTP method: get, post, put, patch or delete."
      • addedInput schema / properties / query / description
        Added value: +"Natural keywords, e.g. \"work orders\", \"lease transactions\", \"gl accounts\"."
    • Changedbuildium_upload_file7 fields changed
      • addedInput schema / properties / category_id / description
        Added value: +"File category, from GET /v1/files/categories. Buildium rejects the upload without a real one."
      • addedInput schema / properties / description / description
        Added value: +"Optional description stored with the file."
      • addedInput schema / properties / entity_id / description
        Added value: +"The ID of that record."
      • addedInput schema / properties / entity_type / description
        Added value: +"What the file is attached to: Rental, Lease, Tenant, Vendor, Association, RentalOwner, RentalUnit, and so on."
      • addedInput schema / properties / file_path / description
        Added value: +"Path to the file on this machine. Hidden files, *.env files and this server's own configuration are refused."
      • addedInput schema / properties / title / description
        Added value: +"The file's title in Buildium. In 'fixtures' write mode it must start with the fixture prefix (see buildium_health)."
      • addedInput schema / properties / upload_path / description
        Added value: +"For a file belonging to a bill, check or task history, that resource's own uploads path, e.g. \"/v1/bills/123/files/uploads\". Only Buildium's seven upload endpoints are accepted."
  2. 11 tool updatesv0.2.0
    • Changedbuildium_call_endpoint1 field changed
      • addedInput schema / properties / count_only
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
    • Changedbuildium_download_file5 fields changed
      • addedInput schema / properties / overwrite
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedInput schema / properties / save_to / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / save_to / default
        Added value: +null
      • removedInput schema / properties / save_to / type
        Removed value: -"string"
      • changedInput schema / required
        Previous value: -[
        -  "file_id",
        -  "save_to"
        -]New value: +[
        +  "file_id"
        +]
    • Addedbuildium_get
    • Changedbuildium_lease_roster2 fields changed
      • addedInput schema / properties / lease_status
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • changedInput schema / properties / limit / default
        Previous value: -100New value: +1000
    • Changedbuildium_list_gl_accounts1 field changed
      • addedInput schema / properties / count_only
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
    • Changedbuildium_list_lease_transactions1 field changed
      • addedInput schema / properties / count_only
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
    • Changedbuildium_list_leases1 field changed
      • addedInput schema / properties / count_only
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
    • Changedbuildium_list_rentals1 field changed
      • addedInput schema / properties / count_only
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
    • Changedbuildium_list_tenants1 field changed
      • addedInput schema / properties / count_only
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
    • Changedbuildium_list_units1 field changed
      • addedInput schema / properties / count_only
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
    • Changedbuildium_list_work_orders1 field changed
      • addedInput schema / properties / count_only
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
  3. 19 tool updatesv0.1.0
    • First observedbuildium_call_endpoint
    • First observedbuildium_created_fixtures
    • First observedbuildium_describe_endpoint
    • First observedbuildium_describe_schema
    • First observedbuildium_download_file
    • First observedbuildium_get_lease
    • First observedbuildium_get_rental
    • First observedbuildium_health
    • First observedbuildium_lease_roster
    • First observedbuildium_list_gl_accounts
    • First observedbuildium_list_lease_transactions
    • First observedbuildium_list_leases
    • First observedbuildium_list_rentals
    • First observedbuildium_list_tags
    • First observedbuildium_list_tenants
    • First observedbuildium_list_units
    • First observedbuildium_list_work_orders
    • First observedbuildium_search_endpoints
    • First observedbuildium_upload_file

TDQS

A4.1/5.0

Scored across 20 tools

Disambiguation5/5

Each tool targets a distinct resource or action: list_* vs get_* for different entities, plus specialized tools for uploads, downloads, schema, health, and session tracking. The generic get/call_endpoint are clearly separated by read vs write, and meta-tools (search, describe, health) are unambiguous.

Naming Consistency4/5

All tools share the buildium_ prefix, and most follow a verb_noun pattern (list_X, get_X). Minor deviations like health, search_endpoints, describe_endpoint, describe_schema, upload_file, download_file, created_fixtures, and lease_roster are still readable and consistent in style, though not all are strict verb_noun. The pattern is predictable enough.

Tool Count4/5

20 tools is slightly above the typical well-scoped range but justified given the broad Buildium API. The set includes curated shortcuts for common resources, generic get/call endpoints, and meta-tools for navigation, making each tool purposeful. It's not excessive for the domain complexity.

Completeness5/5

The tool set covers the main read operations for rentals, units, leases, tenants, work orders, GL accounts, and transactions, plus file transfer. Writes are handled generically via buildium_call_endpoint, and meta-tools provide schema/endpoint discovery. There are no obvious dead ends; any missing operation can be reached through the generic endpoint.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Enables LLMs to interact with Billforward's billing and subscription management API, providing tools for accounts, subscriptions, invoices, payments, and more with read-only safety by default.
    23
    25 npm
    3
    MIT
  • A
    license
    C
    quality
    D
    maintenance
    Enables interaction with Buildium property management software through natural language, supporting operations on associations, leases, rentals, tenants, and more.
    81
    6
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    Enables interaction with Appfolio Property Manager through the Reporting API, allowing property management tasks and data retrieval via natural language commands.
    47
    23 npm
    10
    ISC
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI assistants to manage BuchhaltungsButler bookkeeping through all 48 API endpoints, with safety-categorized tools for read, write, and destructive operations.
    46
    11 npm
    6
    MIT