buildium-mcp
This server exposes Buildium's property-management API through 20 MCP tools, letting you search, inspect, read, and write Buildium data with strong safety guardrails.
Discover the API: list resource areas (
buildium_list_tags), search all 462 operations (buildium_search_endpoints), and inspect endpoint/schema contracts (buildium_describe_endpoint,buildium_describe_schema).Read anything: call any GET endpoint with
buildium_get, including pagination, field filtering, and count-only queries.Write to Buildium: create, update, and delete records via
buildium_call_endpoint, with fixture-mode protections, delete confirmation, and full request auditing.Use curated shortcuts: list/get rentals, units, leases, lease transactions, work orders, tenants, GL accounts, and a lease roster (
buildium_lease_roster) for "who is on lease X" questions.Handle files: upload and download Buildium files through its presigned-URL flow (
buildium_upload_file,buildium_download_file), confined to safe local paths.Check environment health: verify sandbox vs. production mode, write mode, download location, and credential status via
buildium_health.Track test fixtures: list records created this session (
buildium_created_fixtures) and exclude test data from list results withexclude_fixtures.Stay safe: sandbox is the default; production requires two deliberate settings, and read-only modes block writes at the transport layer.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@buildium-mcp List all open work orders for the Oakwood property"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
buildium-mcp
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 writeReads 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-mcpReleases 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:
$BUILDIUM_ENV_FILEthe 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
your platform config directory —
buildium_healthreports which files were actually read, underenv_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 | |
| platform config dir |
|
| platform state dir |
|
| platform state dir |
|
downloaded files |
|
|
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 # stdioRegister 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:
|
| |
Create, payload has a name | every name in it must start with | 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 | requires |
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 only | allowed, further constrained by | yes |
| sandbox + production | blocked in the transport | no |
| sandbox + production | blocked in the transport | yes, 7 endpoints |
| 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.pyTests
pytest # offline, no credentials
.venv/bin/python tests/stdio_check.py # live sandboxThe 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.mdThe 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 toolsbuildium_call_endpointBuildium Call EndpointADestructive
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.
Inputs: path (required), method (required), body, query, +4 more. Returns: object
buildium_created_fixturesBuildium Created FixturesARead-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.
Inputs: no named parameters. Returns: object
buildium_describe_endpointBuildium Describe EndpointARead-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.
Inputs: path (required), method (required). Returns: object
buildium_describe_schemaBuildium Describe SchemaARead-onlyIdempotent
Expand a named schema from the spec. Useful when buildium_describe_endpoint hit its depth limit and emitted a bare $ref.
Inputs: name (required). Returns: object
buildium_download_fileBuildium Download FileADestructive
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.
Inputs: file_id (required), save_to, overwrite, download_path. Returns: object
buildium_getBuildium GetARead-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.
Inputs: path (required), query, fields, all_pages, +1 more. Returns: object
buildium_get_leaseBuildium Get LeaseARead-onlyIdempotent
Get one lease by ID, including tenants and rent terms.
Inputs: lease_id (required), fields. Returns: object
buildium_get_rentalBuildium Get RentalARead-onlyIdempotent
Get one rental property by ID.
Inputs: rental_id (required), fields. Returns: object
buildium_healthBuildium HealthARead-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.
Inputs: no named parameters. Returns: object
buildium_lease_rosterBuildium Lease RosterARead-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.
Inputs: limit, lease_id, property_id, lease_status, +1 more. Returns: object
buildium_list_gl_accountsBuildium List Gl AccountsARead-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.
Inputs: limit, fields, offset, all_pages, +2 more. Returns: object
buildium_list_leasesBuildium List LeasesARead-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.
Inputs: limit, fields, offset, all_pages, +4 more. Returns: object
buildium_list_lease_transactionsBuildium List Lease TransactionsARead-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.
Inputs: lease_id (required), limit, fields, offset, +3 more. Returns: object
buildium_list_rentalsBuildium List RentalsBRead-onlyIdempotent
List rental properties. Pass fields to narrow large records.
To count, use count_only; for totals, all_pages.
Inputs: limit, fields, offset, all_pages, +2 more. Returns: object
buildium_list_tagsBuildium List TagsARead-onlyIdempotent
List every resource area in the Buildium API with its operation count (Leases, Work Orders, General Ledger, ...). Use this to orient before searching.
Inputs: no named parameters. Returns: object
buildium_list_tenantsBuildium List TenantsARead-onlyIdempotent
List rental tenants.
To count, use count_only; for totals, all_pages.
Inputs: limit, fields, offset, all_pages, +2 more. Returns: object
buildium_list_unitsBuildium List UnitsARead-onlyIdempotent
List rental units, optionally filtered to one property.
To count, use count_only; for totals, all_pages.
Inputs: limit, fields, offset, all_pages, +3 more. Returns: object
buildium_list_work_ordersBuildium List Work OrdersARead-onlyIdempotent
List work orders (maintenance jobs).
To count, use count_only; for totals, all_pages.
Inputs: limit, fields, offset, all_pages, +2 more. Returns: object
buildium_search_endpointsBuildium Search EndpointsARead-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.
Inputs: query (required), limit, method. Returns: object
buildium_upload_fileBuildium Upload FileADestructive
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.
Inputs: title (required), file_path (required), category_id (required), entity_id, +3 more. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 20 tools
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.
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.
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.
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
Related MCP Connectors
Every Canopy public API operation as a tool, run as you after a browser sign-in or on an API key.
17 pay-per-call web, finance, legal and onchain tools for AI agents. USDC on Base via x402/MPP.
Discover, inspect and run 63,000+ agent tools from one balance. Pay per call, no subscriptions.
Verified, pay-per-use API tools for AI agents through one authenticated connection.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables 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.2331 npm3MIT
- AlicenseCqualityBmaintenanceEnables interaction with Buildium property management software through natural language, supporting operations on associations, leases, rentals, tenants, and more.816MIT
- AlicenseBqualityCmaintenanceEnables interaction with Appfolio Property Manager through the Reporting API, allowing property management tasks and data retrieval via natural language commands.4711 npm10ISC
- AlicenseAqualityAmaintenanceEnables AI assistants to manage BuchhaltungsButler bookkeeping through all 48 API endpoints, with safety-categorized tools for read, write, and destructive operations.4620 npm9MIT