Rentvine MCP
Click on "Install 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., "@Rentvine MCPWhat are the open work orders at 123 Main St?"
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.
Rentvine MCP (Rentor fork)
MCP server for Rentvine — gives Claude (and any MCP client such as Voice Agents) live access to your property management data.
Rentvine stopped maintaining their MCP Server on Apr 25, 2026 leaving Property Management Companies to fork it and continue maintaing it themselves.
Fork notice. This is Rentor's fork of the upstream
rentvine-mcpnpm package (v1.3.2, MIT, by Base Homes). Upstream is deprecated on npm and its GitHub repo has been deleted, so this repo is now the maintained line. TypeScript sources here were reconstructed from the publisheddist/— the original package shipped compiled JS only.Do not
npm install rentvine-mcp— that pulls the dead upstream. Build from this repo instead.
Available Tools
Tool | Description |
| All properties with address, type, and active status |
| Units for a named property with vacancy and rent |
| All leases with tenant, rent, dates, and status |
| Rental applications with applicant and status |
| Maintenance inspections with date and inspector |
| Work orders with status and priority |
| Create a new maintenance work order |
| Update status, priority, cost, or scheduling on a work order |
| All tenants with contact details and status; |
| Ledger balance for a named tenant |
| All property owners |
| All vendors with full contact, insurance, billing, and audit fields (45 fields) |
| Single vendor's full detail record — includes |
| Vendors within N miles of a property, sorted by distance (ZIP-centroid approximation) |
| All portfolios |
| All bills |
| Create a new bill |
| Search accounting transactions by date, amount, or keyword |
| Chart of accounts |
| Rentvine object type IDs (for file attachment) |
| Upload a file and attach it to a property, unit, lease, or work order |
| Files attached to any Rentvine object (by object ID + type) |
| Images and files attached to a specific work order |
| Metadata for a single file (name, size, mime type) — no download |
| Download a file as base64 (images, PDFs, up to ~375 KB) |
Related MCP server: Property MCP Server
Install
This is a hosted service, not a local tool. Deploy it once on a Linux server under pm2, front it with nginx over HTTPS, and point every client at that URL. Claude, ChatGPT, voice agents, and teammates all connect to the same endpoint with a bearer token.
The server holds your Rentvine API credentials. Clients hold only the endpoint
URL and MCP_AUTH_TOKEN — no keys are distributed to laptops.
Run one process per Rentvine account, each on its own port:
Environment | Public (nginx) | Internal (node) |
prod |
|
|
dev |
|
|
Prerequisites: Ubuntu (or similar), Node.js 18+, nginx, and a TLS certificate for your host (certbot is fine). Plus your Rentvine API credentials from Settings → Users, Roles & API.
1. Clone and build
cd /opt # or wherever you keep services
git clone https://github.com/Rentor-CA/Rentvine-MCP.git
cd Rentvine-MCP
npm install # do NOT set NODE_ENV=production here
npm run buildDo not set
NODE_ENV=productionfor the install. npm skips devDependencies, TypeScript never installs, andnpm run builddies withtsc: not found. Install normally, build, then setNODE_ENVwhen you run the server. To slim the install afterwards:npm prune --omit=dev.
Use the HTTPS clone URL — the repo is public, so it needs no credentials.
The SSH form (git@github.com:…) requires a key on the machine regardless of
repo visibility, so save it for boxes where you intend to push.
This runs from the clone and installs nothing globally, so it won't disturb an
existing rentvine-mcp (the legacy upstream package) already on the box — run
both on different ports while you migrate, then retire the old one.
2. Create the launcher
cp start-mcp.sh.example start-mcp.sh
chmod +x start-mcp.sh
$EDITOR start-mcp.sh # fill in keys, subdomains, and MCP_AUTH_TOKENGenerate a token per environment with openssl rand -hex 32. start-mcp.sh is
gitignored — it holds live credentials and must never be committed.
The script resolves dist/http.js relative to itself, validates that every
credential is set, and execs node so pm2 supervises the server directly
instead of a wrapper shell.
3. Start under pm2
npx pm2 start ./start-mcp.sh --name rentvine-prod -- prod
npx pm2 start ./start-mcp.sh --name rentvine-dev -- dev
npx pm2 save # persist the process list
npx pm2 startup # prints a command to run — restarts pm2 on bootThe -- prod after the script name is what gets passed to the script as $1,
selecting the credential block. Everything before -- is a pm2 flag.
pm2 save plus pm2 startup are what make this survive a reboot. save writes
the current process list to ~/.pm2/dump.pm2; startup prints a sudo command
you must actually run to install the systemd unit. Run both, or the processes
are gone after a restart. Re-run pm2 save any time you add or rename a
process.
pm2 command reference
Inspect
npx pm2 list # status table: name, pid, uptime, restarts, cpu, memory
npx pm2 describe rentvine-dev # full details for one process: script path, args, log paths, env
npx pm2 monit # live dashboard (cpu/mem/logs); q to quit
npx pm2 jlist # same as list but JSON — for scripting/monitoring
npx pm2 prettylist # JSON, human-formatteddescribe is the one to reach for when a process behaves unexpectedly — it
shows the resolved script path, the -- prod/-- dev argument it started with,
its restart count, and where its logs live.
Logs
npx pm2 logs # tail all processes, interleaved
npx pm2 logs rentvine-prod # tail one
npx pm2 logs rentvine-prod --lines 200 # last 200 lines then follow
npx pm2 logs --err # stderr only — startup failures land here
npx pm2 flush # truncate all log filesLogs are written to ~/.pm2/logs/<name>-out.log and <name>-error.log. They
are not rotated by default; install pm2-logrotate to avoid filling the disk:
npx pm2 install pm2-logrotateLifecycle
npx pm2 restart rentvine-prod # restart one
npx pm2 restart all # restart everything
npx pm2 stop rentvine-dev # stop but keep it in the list
npx pm2 start rentvine-dev # start a stopped process by name
npx pm2 delete rentvine-dev # remove from pm2 entirely (then pm2 save)restart fully replaces the process, so it re-reads start-mcp.sh and picks up
credential changes. Editing the script alone changes nothing until you restart.
pm2 reload (zero-downtime) does not help here — it is for clustered Node
apps, and these are forked shell scripts.
Persistence
npx pm2 save # snapshot current process list
npx pm2 resurrect # restore from the snapshot
npx pm2 startup # print the boot-persistence install command
npx pm2 unstartup # undo itUpgrading to a new version
cd /opt/Rentvine-MCP
git pull
npm install
npm run build
npx pm2 restart all
npx pm2 logs --lines 20 # confirm both came back clean4. Expose it over HTTPS
The Node server listens on loopback only — reachable from the server itself, not from the internet. nginx holds the public TLS port and forwards inward. One public port per environment:
internet ──▶ your-host:8003 (nginx, TLS) ──▶ 127.0.0.1:18003 (node) prod
internet ──▶ your-host:8004 (nginx, TLS) ──▶ 127.0.0.1:18004 (node) dev
public loopback, unreachable
from outsideCertificates and TLS termination live in nginx; Node never faces raw internet traffic. The endpoint is still fully public — the proxy is what makes it so.
Responses are Server-Sent Events, so proxy buffering must be off. With
default buffering the connection appears to hang and clients time out. The four
lines that matter are proxy_http_version 1.1, proxy_set_header Connection "",
proxy_buffering off, and a long proxy_read_timeout.
# ---- prod : https://your-host.example.com:8003/mcp ----
server {
listen YOUR.SERVER.IP:8003 ssl;
server_name your-host.example.com;
ssl_certificate /etc/letsencrypt/live/your-host.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-host.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
access_log /var/log/nginx/mcp-prod.access.log;
error_log /var/log/nginx/mcp-prod.error.log;
location / {
proxy_pass http://127.0.0.1:18003;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Connection "";
# SSE: buffering off, or streamed responses stall.
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
}
# ---- dev : https://your-host.example.com:8004/mcp ----
# Same block with 8004 -> 127.0.0.1:18004 and its own log files.Enable and reload:
sudo ln -s /etc/nginx/sites-available/rentvine-mcp /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginxlocation / proxies everything, so /health and /mcp both pass through.
listen is pinned to a specific IP here; plain listen 8003 ssl; binds all
interfaces. Open the ports if a firewall is active: sudo ufw allow 8003/tcp.
nginx does not authenticate anything here. It forwards every request straight through, so
MCP_AUTH_TOKENin the Node process is the only access control on the endpoint. See the warning below.
5. Verify
HOST=https://your-host.example.com:8003
INIT='{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"t","version":"1"}}}'
# 1. Health — public by design, returns only {"ok":true}
curl -sS $HOST/health
# 2. No token — MUST be 401
curl -sS -o /dev/null -w '%{http_code}\n' -X POST $HOST/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' -d "$INIT"
# 3. With token — expect the initialize result
curl -sS -X POST $HOST/mcp \
-H "Authorization: Bearer $MCP_AUTH_TOKEN" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' -d "$INIT"
# event: message
# data: {"result":{...,"serverInfo":{"name":"rentvine",...}},...}If step 2 returns anything other than 401, stop and fix it — your Rentvine account is exposed to the internet. See the warning below.
⚠️
MCP_AUTH_TOKENis mandatory hereThe server refuses to start without a token only when binding to a non-loopback address. This deployment binds to
127.0.0.1, which is exempt from that check — so an emptyMCP_AUTH_TOKENstarts happily and the reverse proxy then publishes an unauthenticated/mcpto the world. The built-in guard cannot save you behind a proxy.Anyone reaching that endpoint gets full read/write access to your Rentvine account: tenant PII, ledgers, and the ability to create work orders and bills.
start-mcp.sh.examplerefuses to start on an empty or placeholder token for this reason — keep that check.
/healthis intentionally unauthenticated and returns only{"ok":true}.
6. Connect clients
Every client uses the same two values — the URL and the bearer token. No Rentvine credentials ever leave the server.
URL |
|
Transport | Streamable HTTP |
Auth |
|
Claude Code / Claude Desktop / Cursor / Windsurf / VS Code
{
"mcpServers": {
"rentvine": {
"type": "http",
"url": "https://your-host.example.com:8003/mcp",
"headers": { "Authorization": "Bearer your_mcp_auth_token" }
}
}
}Config locations — Claude Code: ~/.claude.json or project .mcp.json ·
Cursor: Settings → MCP → Add new server · Windsurf:
~/.codeium/windsurf/mcp_config.json · VS Code (Copilot): .vscode/mcp.json.
Restart the client; you should see rentvine with all 25 tools.
Vapi / voice agents
Add as a custom MCP tool provider with the URL above and an Authorization
header of Bearer <MCP_AUTH_TOKEN>. Voice agents call tools with no human
reviewing arguments first, so give them a token you can rotate independently
and consider a read-only Rentvine API key — create_work_order, create_bill,
update_work_order, and upload_file all write to live data.
ChatGPT (Business / Enterprise / Edu)
An admin enables Workspace Settings → Permissions & Roles → Developer Mode,
then: Settings → Connectors → Advanced → Add custom MCP server, URL as
above, Auth Bearer → the MCP_AUTH_TOKEN. Pick Developer mode from the
Plus menu in a new chat and select the rentvine connector. Not available on
Plus or Free.
Anything else
Any MCP client supporting Streamable HTTP works — point it at the URL with the bearer header.
Sessions live in memory, keyed by the
mcp-session-idheader. Apm2 restartdrops active sessions and clients reinitialize on their next call. If you ever run more than one replica behind the proxy, you need sticky routing on that header.
Environment Variables
Variable | Description |
| Your Rentvine API key |
| Your Rentvine API secret |
| Your subdomain (e.g. |
| Bearer token clients must present on |
| HTTP server port (default: |
| Bind address (default: |
All of these are set in start-mcp.sh, one block per environment.
Testing
After install, ask Claude things like:
List all my properties.
How many units are vacant across all properties?
Which leases expire in the next 60 days?
Show me all open work orders sorted by priority.
What is the balance for tenant [name]?
Create a work order for the leaking roof at 123 Main St, high priority.
Upload this invoice and attach it to work order #1042.
Show me all unpaid bills.
Which vendors have liability insurance expiring in the next 60 days?
Find vendors within 25 miles of property [ID].
Show me all photos attached to work order [ID].
Download the inspection report file [ID].Development
SSH clone here, since contributors push:
git clone git@github.com:Rentor-CA/Rentvine-MCP.git
cd Rentvine-MCP
npm install
npm run build # tsc → dist/
npm run typecheck # tsc --noEmit, no outputSmoke-test the HTTP transport the same way it runs in production:
HOST=127.0.0.1 PORT=18009 MCP_AUTH_TOKEN=dev-token \
RENTVINE_API_KEY=... RENTVINE_API_SECRET=... RENTVINE_COMPANY=... \
node dist/http.js
# another shell
curl -sS localhost:18009/health
curl -sS -X POST localhost:18009/mcp -H 'Authorization: Bearer dev-token' \
-H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Deploy by pushing, then on the server: git pull && npm install && npm run build && npx pm2 restart all.
Layout
src/
index.ts stdio entrypoint
http.ts Streamable-HTTP entrypoint (Express, in-memory sessions)
createServer.ts tool registry — 24 registerTool() calls + zod schemas
tools.ts projections: Rentvine camelCase → our snake_case contract
client.ts HTTP layer: Basic auth, envelope unwrapping, timeouts
apiDocs.ts Rentvine API reference, served as rentvine://api-docs
types/ ambient .d.ts for untyped deps (zipcodes)Adding a tool
Three edits, in order:
src/client.ts— add afetchX()that calls the endpoint and returns the raw rows.src/tools.ts— add an exported function projecting raw → snake_case.src/createServer.ts—server.registerTool("x", { description, inputSchema }, handler).
Endpoints documented in src/apiDocs.ts but not yet wrapped include the eleven
/accounting/diagnostics/* routes, /maintenance/vendor-trades,
/leases/{leaseID}, /properties/units/export, and
/accounting/transactions/entries/search.
Known issues
Work-order enum maps are unverified.
WO_STATUS/WO_PRIORITY/LEASE_STATUSinsrc/tools.tsdisagree with the enum tables insrc/apiDocs.ts(which document status as 1=Pending, 2=Open, 3=Closed, 4=On Hold and priority as 1–3 only, with noemergency). If the docs are right,update_work_order(status: "cancelled")sets the work order to On Hold. Verify againstGET /maintenance/work-order/statusesbefore trusting either.No pagination on list tools.
list_properties,list_leases,list_work_orders,list_bills,list_vendors, andlist_accountssend nopage/pageSize, and Rentvine defaults to 15–25 rows. They will silently truncate as the portfolio grows. Onlysearch_transactionsexposes paging.unwrap()returns[]on unrecognized shapes (src/client.ts), so an API contract change reads as "no results" rather than an error.Fuzzy lookups take first match.
list_unitsandget_tenant_balancesubstring-match names and silently pick the first hit.list_tenantspaging is unverified.page/page_sizeare passed through toGET /tenants, but that endpoint's paging behavior is unconfirmed. If Rentvine ignores them, results are silently capped at its default page size.searchandactive_onlyare applied client-side, after the fetch, so they filter only what came back on that page.
Handling tenant PII
Rentvine serves tenants, vendors, and owners from one shared contact schema, so
every tenant record carries birthDate, identificationNumber,
identificationTypeID, and achAccountNumberTruncated — real PII on a consumer.
list_tenants therefore splits its projection: identity, contact, status, and
audit fields by default; date of birth, government ID, tax/payee, and
payout/ACH fields only when include_sensitive=true. Without that split, a bare
"list the tenants" request would put every tenant's DOB and bank details into
the model's context window.
If you'd rather have the full record by default, drop the include_sensitive
branch at the end of listTenants() in src/tools.ts and always spread
projectTenantSensitive(c).
Troubleshooting
{"error":"unauthorized"} from /mcp — the client's bearer token doesn't
match MCP_AUTH_TOKEN. This is the server's own 401, not Rentvine's.
Rentvine 401 Unauthorized inside a tool result — wrong RENTVINE_API_KEY,
RENTVINE_API_SECRET, or RENTVINE_COMPANY. Verify in Rentvine → Settings →
Users, Roles & API.
Client connects but hangs on the first call — nginx is buffering. Confirm
proxy_buffering off, proxy_http_version 1.1, and proxy_set_header Connection ""
are in the location block; responses are SSE and stall without them.
502 Bad Gateway — node isn't running or is on a different port than
proxy_pass. Check with npx pm2 list and:
sudo ss -tlnp | grep -E ':(8003|8004|18003|18004)'
npx pm2 logs rentvine-prod --lines 50Server won't start — npx pm2 logs <name>. FATAL: MCP_AUTH_TOKEN must be set… means HOST isn't loopback and no token is set. FATAL: <VAR> is unset or still CHANGE_ME is the launcher's own check. tsc: not found during build means
NODE_ENV=production was set during npm install.
Gone after a reboot — npx pm2 save and npx pm2 startup were never run.
Confirm the token is actually set in the live process (prints 1 or 0,
never the secret):
sudo tr '\0' '\n' < /proc/$(pgrep -f 'dist/http.js' | head -1)/environ \
| grep -c '^MCP_AUTH_TOKEN=.\+'Empty results — your Rentvine account may have no data in that category, the
list endpoint truncated at Rentvine's default page size, or the API returned an
unexpected envelope (see unwrap() under Known issues).
Available Tools
25 toolscreate_billA
Create a bill in Rentvine (live data, write). Requires a payee contact ID (from list_vendors or list_owners), bill date, due date, and bill type ID. Optionally link to a work order.
| Name | Required | Description | Default |
|---|---|---|---|
| charges | No | Line item charges array. Each charge should include accountID, amount, and description. | |
| due_date | Yes | Payment due date (YYYY-MM-DD). | |
| bill_date | Yes | Date of the bill (YYYY-MM-DD). | |
| reference | No | Invoice or reference number. | |
| bill_type_id | Yes | Rentvine bill type ID. Check your Rentvine settings for valid values. | |
| payment_memo | No | Memo to include on payment. | |
| work_order_id | No | Link this bill to a work order ID. | |
| payee_contact_id | Yes | Rentvine contact ID of the payee (vendor or owner). Get from list_vendors or list_owners. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the behavioral disclosure burden. It does disclose that this operates on 'live data' and is a 'write', which is meaningful. However, it does not mention irreversibility, permissions, error conditions, or what happens on success, leaving the write side effects partly undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The core action and live-data warning are front-loaded, and the prerequisite and optional linkage are stated in a compact, readable way. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 8 parameters and no output schema, yet the description does not explain what the tool returns (e.g., created bill ID or confirmation). It covers prerequisites and optional linkage well, but for a write operation with no output schema, the missing return-value information leaves an agent uncertain about how to confirm success.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, so the baseline is 3. The description repeats schema information about required fields and the payee contact source, but adds no new meaning beyond the schema's own descriptions. It does not compensate for any schema gaps because there are none.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Create' and the resource 'a bill in Rentvine', and adds a distinct scope marker with '(live data, write)'. It references sibling tools 'list_vendors or list_owners' for input, which helps differentiate from read-only listing tools. An agent can confidently identify this as the write operation for bills.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states the required inputs and where to obtain them ('from list_vendors or list_owners'), and notes the optional work-order linkage. It gives clear context for when to invoke the tool but does not explicitly exclude alternatives or state 'use list_bills instead for reading'. The prerequisite guidance is strong enough for an agent to proceed correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_work_orderA
Create a new maintenance work order in Rentvine (live data, write). Requires description, property_id, and priority. Rentvine auto-fills unitID for single-unit properties and defaults status to 'open'. Returns the new work_order_id and work_order_number.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Initial status. Defaults to 'open' if omitted. | |
| unit_id | No | Rentvine unit ID. Optional for single-unit properties (Rentvine auto-fills); required to disambiguate on multi-unit properties. | |
| priority | Yes | Priority level. | |
| description | Yes | Description of the issue, e.g. 'Dishwasher leaking'. | |
| property_id | Yes | Rentvine property ID (from list_properties). | |
| scheduled_end | No | Scheduled end date/time. | |
| scheduled_start | No | Scheduled start date/time. | |
| estimated_amount | No | Estimated cost in dollars, e.g. 1999. | |
| is_owner_approved | No | Whether the owner has pre-approved the work order. | |
| vendor_contact_id | No | Rentvine contact ID of the assigned vendor. Omit to leave unassigned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the transparency burden. The description indicates this is a live, write operation, explains Rentvine's auto-fill of unitID for single-unit properties, states that status defaults to 'open', and discloses the return values work_order_id and work_order_number. This is strong behavioral disclosure for a creation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three efficient sentences deliver purpose, required inputs, important runtime behavior, and output identifiers. There is no filler or redundant commentary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter tool with no output schema, the description covers the essential operational context: write side effects, required fields, auto-fill rules, default status, and return values. Remaining details like scheduled_start or vendor_contact_id are fully documented in the schema, so the description is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description adds minimal parameter-level meaning beyond the schema. It highlights required fields and auto-fill behavior, but most of that is already present in the schema, so the description mostly reinforces rather than extends the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with 'Create a new maintenance work order in Rentvine (live data, write),' stating a specific verb, resource, and side-effect. It naturally stands apart from sibling tools like update_work_order and list_work_orders by making the creation action explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for invoking the tool and lists the three required fields. However, it does not explicitly point to alternatives such as update_work_order for existing work orders or list_work_orders for viewing, so the usage guidance is implied rather than directly comparative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_fileA
Download a Rentvine file as base64 (live data, read). Returns mime_type, size_bytes, is_image, and content_base64. Supports images and other binary attachments up to ~1MB. Large files may fill the context window — prefer list_attachments first to check file_size.
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | Yes | Rentvine fileID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and it does so: it states the operation is a read of live data, enumerates the four returned fields, and warns that large downloads can fill the context window. This goes beyond a bare 'download' and accurately sets expectations about payload size and side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences front-load the core action and return shape, then end with a practical caveat and routing hint. There is no filler or repetition of schema fields beyond what is useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description enumerates the return fields (mime_type, size_bytes, is_image, content_base64), states the supported file types and ~1MB limit, and warns about context-window risk. For a single-parameter read tool, this gives an agent enough behavioral and return information to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully documents file_id as 'Rentvine fileID', so the description doesn't need to add parameter-level semantics. The description adds minimal context by tying file_id to the file being downloaded, but it adds no format, constraints, or allowed values beyond the schema. Schema coverage is 100%, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact operation ('Download a Rentvine file as base64') and clarifies it is a live read, making the action unambiguous. It also contrasts with list_attachments by describing what this tool returns versus what that workflow step is for. However, it does not explicitly differentiate itself from the similarly named sibling get_file, so the distinction is clear but not fully spelled out.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete guidance on when to pause before using it: if the file may be large, the agent should call list_attachments first to check file_size. This is an explicit condition and an explicit alternative, which helps an agent decide between tools. The ~1MB mention reinforces the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fileA
Get metadata for a single Rentvine file by file_id (live data, read). Returns name, size, mime type, and attachment info — but not file contents. Use download_file to fetch the actual bytes.
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | Yes | Rentvine fileID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It clearly states that this is a 'live data, read' operation, explicitly mentioning 'read' and that it returns metadata but not contents. This effectively discloses the behavioral trait of being a non-destructive read operation, which is sufficient given the simplicity of the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (three sentences) and front-loaded with the core purpose. It mentions the key detail about not returning contents and points to the sibling tool, with no wasted words. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (single parameter, no output schema, no annotations), the description is complete. It covers what the tool does, what it returns (metadata fields), what it doesn't return (contents), and how it differs from download_file. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 the parameter (file_id) with a description. The description also mentions 'by file_id', which is redundant with the schema. It doesn't add extra semantics like format or constraints beyond what the schema provides, so a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get metadata for a single Rentvine file by file_id', specifying the action (get), the resource (file), and the identifier (file_id). It also explicitly says it returns metadata (name, size, mime type, attachment info) but not contents, distinguishing it from download_file.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool (to get metadata) and explicitly mentions the alternative (download_file) for fetching content. It doesn't explicitly state when not to use it, but the exclusion is implied by naming the alternative and noting 'but not file contents'. This is clear enough for an agent to select correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tenant_balanceA
Get the current ledger balance for a tenant from Rentvine (live data). Returns balance and ledger data.
| Name | Required | Description | Default |
|---|---|---|---|
| tenant_name | Yes | The tenant's full name as it appears in your Rentvine roster. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It usefully states that the data is live and that the response contains balance and ledger data. It does not mention permissions, error behavior, or what exactly 'ledger data' includes, which prevents a higher score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler. Every phrase adds value: the operation, the resource, the live-data nature, and the expected return content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool, this is nearly complete: the required input is clear and the return payload is summarized. It would be fully complete if it specified the format or scope of 'ledger data,' especially since no output schema is provided.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter tenant_name is already fully described in the schema, so schema description coverage is 100%. The tool description adds no further parameter-level meaning, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly names the verb and resource: it gets a tenant's current ledger balance from Rentvine. It is unambiguous next to siblings like list_tenants and search_transactions, but it never explicitly differentiates itself from those alternatives, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The wording implies this is the correct tool when a tenant's current live balance is needed, and no sibling appears to offer the same balance-specific operation. However, it gives no explicit when-to-use or when-not-to-use guidance, nor does it name alternatives such as list_tenants or search_transactions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_vendorA
Get a single vendor's full details from Rentvine (live data). Calls /vendors/{id} which returns ~20 fields not available via list_vendors — notably code (100-char free-text identifier used as a catch-all for metadata Rentvine's schema can't hold, such as trade/hourly-rate), website_url, name components (first/middle/last/suffix), discount tiers, QuickBooks linkage, and contact_type. Also parses the packed code field into a code_metadata object when it uses the pipe-delimited k=v convention.
| Name | Required | Description | Default |
|---|---|---|---|
| vendor_id | Yes | Rentvine vendor contactID (from list_vendors or vendors_near). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral disclosure burden. It discloses that data is live, identifies the underlying endpoint, enumerates key returned fields, and explains the special `code` parsing behavior. It doesn't cover errors or auth, but for a single-resource GET this is substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, with the core action front-loaded and the detail sentence providing only behavior-relevant information. The field enumeration is somewhat long but earns its place by helping the agent predict what the tool returns.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has one required parameter, no output schema, and no annotations; the description covers the input source, the live-data nature, and the important return fields including the unusual code_metadata parsing. An agent has enough to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for vendor_id, so the schema already documents the parameter. The description adds context about where vendor_id comes from and what kind of ID it is, but doesn't need to do more given the schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get'), names the resource ('a single vendor's full details'), and clarifies it returns ~20 fields not available via list_vendors. This clearly distinguishes it from sibling list tools without needing to open schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly contrasts this tool with list_vendors by noting the extra fields, and tells the agent that vendor_id comes from list_vendors or vendors_near. It implies the correct use case but doesn't explicitly state when not to use it or why list_vendors would be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsA
List the chart of accounts from Rentvine (live data). Returns account ID, number, name, category, and active status. Useful for identifying accountIDs when creating bill charges.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden. It adds useful behavioral context by specifying 'live data' and by listing the exact fields returned (account ID, number, name, category, active status), which goes beyond a bare 'list accounts' statement. It could mention pagination or limits, but for a simple list tool this is solid coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, no filler, with the primary action and scope in the first sentence and return-value plus use-case context in the second. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter list tool, the description is nearly complete: it names the data source, the returned fields, and a concrete downstream use-case. Without an output schema, the explicit field list compensates well, though a note about ordering or data volume would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema coverage is 100%, so there is nothing for the description to document. Per the rubric, a zero-parameter tool starts at baselinescore 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 the chart of accounts from Rentvine (live data)'), enumerates the returned fields, and distinguishes it from sibling list tools that target other entities. This is immediately actionable and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly identifies a contextual use case: 'Useful for identifying accountIDs when creating bill charges.' It does not explicitly name alternatives or exclusions, but for a zero-parameter listing tool the intended usage is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_applicationsA
List rental applications from Rentvine (live data). Returns applicant name, property, unit, status, and application date.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It does add useful context by stating 'live data' and listing returned fields. However, it does not mention pagination, sorting, filtering, rate limits, or whether all applications are returned regardless of status.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that front-loads the key action and source. Every part earns its place: the verb, the resource, the data source, and the relevant return fields. No unnecessary wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple zero-parameter list tool, the description is complete. It states what the tool does, where the data comes from, and what fields will be returned. No output schema exists, but the description adequately covers the return contract.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no properties, so there are no parameters to document. Per the calibration rule, a zero-parameter tool earns a baseline of 4. The description adds value by listing output fields, which is more than necessary for parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'List rental applications from Rentvine'. It clearly states the resource and distinguishes it from sibling tools like list_properties or list_tenants. Mentioning the returned fields further clarifies the tool's purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for retrieving rental application data from Rentvine, which gives broad usage context. However, it does not explicitly state when to prefer this over alternatives or provide exclusion criteria. The usage guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_attachmentsA
List files attached to any Rentvine object (live data, read). Returns file metadata including file_id, file_name, mime_type, size, and upload date. Use list_object_types to find the correct object_type_id.
| Name | Required | Description | Default |
|---|---|---|---|
| object_id | Yes | ID of the Rentvine object (e.g. workOrderID, propertyID, leaseID, unitID). | |
| object_type_id | Yes | Rentvine object type ID (e.g. 16 = Work Order, 6 = Property, 4 = Lease, 7 = Unit). Use list_object_types for the full table. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states this is a read operation on 'live data,' which is valuable safety context. It also lists the returned metadata fields, though it does not mention pagination or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no wasted words. The main purpose and read-only nature are front-loaded, and the prerequisite guidance is placed at the end, making it easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema or annotations, the description provides return metadata, read semantics, and a pointer to the prerequisite lookup tool. The main missing detail is pagination or result-size behavior, which would be useful for a list operation, but the description is otherwise sufficient for a moderately simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already explains both parameters with examples. The description adds no parameter-specific detail beyond what the schema provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'List files attached to any Rentvine object,' which clearly states what the tool does. The phrase 'any Rentvine object' distinguishes it from sibling tools like list_work_order_attachments, making the scope easy to grasp.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context by stating the tool works with any Rentvine object and provides an explicit prerequisite: 'Use list_object_types to find the correct object_type_id.' It does not explicitly discuss alternatives or exclusion cases, but the scope and prerequisite are clear enough for an agent to know 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.
list_billsA
List all bills from Rentvine (live data). Returns bill ID, payee, dates, voided status, and linked work order. Use this to review outstanding vendor invoices.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does add useful context by noting this is 'live data' and specifying the returned fields, but it does not state whether the operation is read-only, whether there is pagination, or how errors/latency may behave.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The primary action and scope are front-loaded, and the follow-up sentence adds value by listing return fields and a use case.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, parameterless list tool, the description provides all essential context: what it lists, where the data comes from, what fields are returned, and when to use it. No output schema exists, but the description compensates by summarizing the output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so parameter semantics are inherently trivial. The baseline for no-parameter tools is 4, and the description adds no misleading or unnecessary parameter information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List all bills') and clearly identifies the resource (bills from Rentvine) and scope. It also enumerates the returned fields, making the tool's purpose unmistakable even among many sibling list tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Use this to review outstanding vendor invoices' provides a clear context for when to invoke the tool. It does not explicitly exclude alternatives or mention when not to use it, but for a zero-parameter list tool this context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_inspectionsA
List maintenance inspections from Rentvine (live data). Returns title, property, unit, scheduled date, status, and inspector.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description itself must carry behavioral disclosure. It does state 'live data,' which communicates freshness and implies a network call rather than a cache. However, it doesn't disclose pagination, result limits, ordering, or any read-only guarantees. For a simple list tool this is a partial but acceptable disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with the action and source up front, then the return fields. No fluff, no repetition of the tool name beyond what is needed. Every word adds information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter list tool with no output schema, the description covers the main context: what is listed, sourced, and what fields are returned. Pagination or result limits are not mentioned, but for this simple read-only list tool the description is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters)SkipThe input schema is empty and there are no parameters to documentikuha. Baseline for 0 params is 4, and the description does not need to compensate. No parameter semantics are missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb (list) plus a specific resource (maintenance inspections) and clearly names the source (Rentvine). It distinguishes itself from sibling tools by specifying the object type (inspections vs. work orders, properties, etc.) and enumerating the exact fields returned, which disambiguates it from generic list_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states what the tool does but gives no guidance on when to choose it versus the many sibling listing tools. It doesn't mention conditions, prerequisites, or exclusions. The 'maintenance inspections' wording implies the use case, but there is no explicit routing to alternatives or contextual hints about when it is preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_leasesA
List all leases from Rentvine (live data). Returns tenant name, unit address, rent, deposit, bed/bath count, dates, and status. Use this to answer questions about lease expirations, rent amounts, or active tenants.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description owns the burden of behavioral disclosure. It does state the tool retrieves 'live data' and returns 'all leases', which clarifies its scope and data freshness. However, it does not mention pagination, rate limits, or whether the query can be filtered. For a single-purpose list tool this is acceptable but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: the first is a clear statement of the action and data source, the second lists the return fields and typical use cases. No filler or repetition; it is appropriately compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite lacking an output schema and annotations, the description supplies the key elements an agent needs: what data is returned, the data origin, and the use cases. For a zero-parameter list tool, this is nearly complete. It omits pagination or ordering behavior, but those are secondary for a simple list operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema shows no properties, so the description is not expected to add parameter details. With an empty parameter space, the provided description adds meaningful context (what fields come back) that supports interpretation of the result, but it does not need to explain parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-resource pair ('List all leases'), names the data source ('Rentvine live data'), and enumerates the returned fields. It is immediately distinct from sibling tools such as list_tenants or list_properties by the object type, so an agent can tell what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit conditions for using the tool: 'questions about lease expirations, rent amounts, or active tenants.' It does not name alternatives to exclude, but the use cases are clear and actionable, leaving little ambiguity about when to invoke this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_object_typesA
List Rentvine object types. Returns the full table of object_type_id values and names (e.g. 7 = Unit, 16 = Work Order, 4 = Lease). Use this to find the correct object_type_id when uploading files or attaching documents.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It does state that it returns a full table of IDs and names, which covers its output behavior. However, it does not explicitly state that it is a read-only operation or whether there are any side effects, pagination, or permission requirements. For a simple list tool this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, with the purpose stated first and the utility example second. Every sentence contributes: the first defines what the tool does, the second explains the purpose and provides examples. There is no fluff or redundancy with the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless listing tool with no output schema, the description provides everything an agent needs: the target entity, the output shape (ID + name pairs), and the practical use case. The examples '7 = Unit, 16 = Work Order, 4 = Lease' give concrete grounding. There are no gaps that would risk incorrect invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema confirms this with an empty properties object. The description adds no parameter information because none is needed. Per the rubric, 0 parameters yields a baseline of 4, and there is no reason to penalize.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List') and the resource (Rentvine object types), and expands on the output: 'Returns the full table of object_type_id values and names'. It also distinguishes its utility from sibling tools by explicitly connecting it to upload/attach workflows, which no other sibling name suggests.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a direct when-to-use context: 'Use this to find the correct object_type_id when uploading files or attaching documents.' This is clear guidance, even though it does not explicitly mention alternatives or negative cases. Since no sibling tool serves this distinct purpose, the absence of exclusions is acceptable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ownersA
List all property owners from Rentvine (live data). Returns owner name, contact ID, email, phone, and address. Use this to look up who owns a property or to get a contact ID for bill creation.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden. It discloses that this is live data and specifies the returned fields, which conveys a read-only listing behavior. However, it does not mention pagination, result limits, or any other operational caveats that could matter for a tool returning 'all' owners.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two lean sentences with no filler. The primary action and data source are front-loaded, followed by the return fields and concrete usage hints. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only list tool, the description covers purpose, source, fields returned, and use cases. It lacks pagination or scale caveats for 'all' owners, but the absence of an output schema and parameters makes the description largely sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so the description needs no parameter-level detail. Per the rubric, a zero-parameter tool receives a baseline of 4; the description does not undermine this and instead clarifies the output fields, adding slight value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 all property owners from Rentvine (live data)'. It also explicitly names the returned fields (owner name, contact ID, email, phone, address), making it distinguishable from sibling tools like list_properties or list_tenants.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear use cases: look up who owns a property or get a contact ID for bill creation. It does not explicitly state when not to use this tool or name alternatives, but the use-case framing gives the agent enough context to select it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_portfoliosA
List all portfolios from Rentvine (live data). Returns portfolio name, ID, active status, reserve amount, and associated owners.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does mention 'live data' and details the return fields, but it does not explicitly state that it is read-only, comment on authentication, rate limits, pagination, or error behavior. For a simple list operation, this is adequate but not rich; the lack of side-effect disclosure is probably fine, but the absence of any caveats about live data or potential limitations leaves a moderate gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that is front-loaded with the action and resource, followed by the return details. It contains no filler, is immediately understandable, and uses the available space optimally.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that there are no parameters, no output schema, and no annotations, the description does an adequate job of contextualizing the tool. It tells the agent what data to expect in the response (including specific fields) and where the data comes from. However, it could be slightly more explicit about the output shape (e.g., whether owners are an array or a flat list) and about any limits or pagination. For a simple list tool, it is reasonably complete, just missing those minor details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so all parameter semantics are trivially handled by the empty input schema. The description does not need to add parameter explanations. According to the rubric, a 0-parameter tool baseline is 4, and the description adds no clutter. This is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('List'), a resource ('portfolios'), and the source ('Rentvine (live data)'). It also enumerates the returned fields (portfolio name, ID, active status, reserve amount, associated owners), making it distinct from sibling list tools like list_owners or list_properties. An agent immediately knows what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly conveys that this tool is for retrieving all portfolios, which implicitly tells the agent when to use it (i.e., when a complete list of portfolios is needed). While it does not explicitly mention alternatives or exclusions, it is unambiguous about its purpose and distinguishes itself from sibling list tools by its resource focus. Thus, clear context with no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_propertiesA
List all properties from Rentvine (live data). Returns property name, address, type, and active status.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does add the behavioral trait 'live data' and discloses the returned fields, but omits any mention of pagination, ordering, errors, or authentication expectations, which a read tool of this scope might still need.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler. Both sentences earn their place: the first states the action and source, the second states the return fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema tool, the description explains the operation and key return fields. It is mostly complete, though it omits ordering or pagination details; given the simplicity, this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so there is nothing to explain; the schema already covers the empty parameter set. The description's mention of returned fields adds useful context but is separate from parameter semantics, so the baseline of 4 for zero-parameter tools applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('list') and resource ('all properties'), with the source system ('Rentvine') and a 'live data' qualifier. This clearly distinguishes it from sibling list tools like list_units and list_leases by the resource type.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. With many list_* siblings, explicit routing or exclusions would help, but none is present; the description only states what it does, not when it should be selected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tenantsA
List all tenants from Rentvine (live data). Returns contact ID, full name and name components, email, phone, address, active status, linked applicant ID, and audit timestamps. Use this to look up a tenant's contact details or to get a contact_id for other calls. Filter with search (matches name, email, or phone) and active_only. By default this omits personally sensitive fields; set include_sensitive=true only when the task actually requires them — see that parameter's description.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, passed through to Rentvine. This endpoint's paging behavior is unverified. | |
| search | No | Case-insensitive substring filter matched against name, email, and phone. Applied client-side after fetching. | |
| page_size | No | Results per page, passed through to Rentvine as pageSize. This endpoint's paging behavior is unverified; if unsupported, Rentvine's default page size applies and results may be truncated. | |
| active_only | No | If true, return only tenants with isActive=1. Defaults to false (returns all tenants, active and inactive). | |
| include_sensitive | No | If true, additionally return date of birth, government identification number and type, tax/payee details, and payout/ACH banking fields. Defaults to false. Tenants share Rentvine's contact schema with vendors, so these fields exist on every tenant record — leave this off unless the task genuinely requires them, and treat any output as confidential PII. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses that data is live, that filtering is applied via search and active_only, and that sensitive fields are omitted by default unless include_sensitive=true. This is meaningful transparency, though it does not cover paging, ordering, or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then lists return fields, use cases, filtering behavior, and the sensitive-field caveat. Every sentence contributes useful information, and the pointer to the parameter description avoids unnecessary duplication.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with five optional parameters and no output schema, the description covers purpose, return fields, filters, and sensitive-field handling. Paging behavior is left to the schema descriptions, which is acceptable, though a brief mention of pagination/truncation risks would have made it more complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 every parameter. The description adds a little context by summarizing search and active_only and emphasizing the sensitive-data caveat, but it mostly repeats what the schema already says. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 all tenants from Rentvine (live data).' It enumerates the exact returned fields and explicitly names two use cases (look up contact details, get a contact_id for other calls), which clearly distinguishes it from sibling list tools like list_owners and list_vendors.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete guidance on when to use the tool: 'Use this to look up a tenant's contact details or to get a contact_id for other calls.' It does not explicitly state when not to use it or name alternatives, but the intended context is clear enough for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_unitsA
List units for a property from Rentvine (live data). Returns unit address, vacancy status, rent amount, and deposit.
| Name | Required | Description | Default |
|---|---|---|---|
| property_name | Yes | The property name or address fragment as it appears in your Rentvine portfolio. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It adds one behavioral clue: 'live data', which indicates a real‑time fetch rather than cached data. However, it does not disclose error behavior (e.g., unknown property), permissions, pagination, or any side effects, though the word 'list' implies a read-only operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences. The first sentence names the action and resource; the second lists the returned fields. There is no redundant or vague wording, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (1 required parameter, no output schema). The description compensates for the missing output schema by enumerating the returned fields. It falls short in not describing potential error or empty-list behavior, but that is not critical for a basic list endpoint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has 100% parameter coverage with a clear description of 'property_name'. The tool description only restates that units are 'for a property' and does not add extra meaning or constraints beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List units'), the resource ('units'), and the context ('for a property'). It also names the specific returned fields (address, vacancy status, rent amount, deposit), making it distinct from sibling list tools like list_properties or list_leases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the phrase 'for a property' and the required 'property_name' parameter, but no explicit guidance or exclusions are provided. The description does not mention when to prefer this tool over list_properties or how to first obtain a property name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_vendorsA
List all vendors from Rentvine (live data). Returns every field the /vendors/search endpoint exposes — contact details (name, email, phone, address, city, state, postal_code, country), billing/payout (tax_payer_name, payout_type_id, ach_account_number_truncated, hold_payments), full insurance coverage (liability and workers-comp policy numbers + expirations, days_until_insurance_expires), discount terms, identification documents, active status, and audit timestamps. Use to find vendors for work-order assignment, bill creation, or compliance review. Note: Rentvine does not expose trade categories or service areas via the public API. SENSITIVE: response includes PII and financial fields (birth_date, identification_number, ACH details) — treat output as confidential.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full behavioral disclosure burden. It discloses that data is live, that the response contains sensitive PII and financial fields (birth_date, identification_number, ACH details), and that trade categories/service areas are not exposed by the API. This is meaningful transparency beyond the schema, though it does not mention pagination or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: the lead sentence states the core action, the next summarizes the return fields, the third gives concrete use cases, and the final sentence warns about data sensitivity. The description is long but densely informative known, with the main purpose front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero parameters and no output schema, the description carries the full burden of informing the agent. It compensates by enumerating the major field categories, noting live data, listing realistic use cases, calling out a known API limitation (no trade categories/service areas), and warning about PII and financial sensitivity. There is no missing information needed to invoke or interpret the tool's result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parametersaren an empty schema, and schema description coverage is 100%, so there are no parameter semantics for the description to clarify. The baseline for 0-param tools is 4, and the description appropriately focuses on the return payload rather than inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and resource: 'List all vendors from Rentvine (live data).' It clearly distinguishes this list tool from a single-record getter by saying it returns every field the /vendors/search endpoint exposes, and it names recognizable vendor fields. The purpose is unambiguous even 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: 'Use to find vendors for work-order assignment, bill creation, or compliance review.' It does not explicitly say when not to use it or compare it against the sibling get_vendor tool, but the use cases and 'all vendors' scope imply the distinction. A brief exclusion note would make it fully comprehensive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_work_order_attachmentsA
List images and files attached to a specific work order (live data, read). Convenience wrapper around list_attachments with object_type_id fixed to 16.
| Name | Required | Description | Default |
|---|---|---|---|
| work_order_id | Yes | Rentvine workOrderID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description notes 'live data, read', which conveys a read-only behavior, and explains the fixed object_type_id=16. However, with no annotations provided, it does not disclose details like whether the response includes metadata, pagination, or file types. The read-only hint is useful but minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The core purpose is front-loaded, and the wrapper detail is concise and informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool, the description is nearly complete. It lacks an explicit note about the return format or pagination, but the simplicity of the tool and the clear wrapper explanation make it adequate. The absence of an output schema is not a major gap here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single parameter, so the schema already documents work_order_id as the Rentvine workOrderID. The description adds no additional parameter semantics beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists images and files attached to a specific work order, using a specific verb and resource. It also distinguishes itself from the generic list_attachments sibling by noting it is a convenience wrapper with object_type_id fixed to 16.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: when you need attachments for a specific work order, versus list_attachments for other object types. It does not explicitly state when not to use it or name alternatives beyond the wrapper relationship, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_work_ordersA
List all maintenance work orders from Rentvine (live data). Returns description, property, status, priority, estimated cost, and scheduling details.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral disclosure burden. It does state that data is live and lists the returned fields, which is useful. However, it does not mention pagination, authentication requirements, rate limits, or whether the list is filtered or sorted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the action and resource, then follows with a compact list of return fields. There is no filler, redundancy, or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless, read-only list tool with no output schema, the description covers source, scope, and the main returned fields. It could have mentioned pagination or the absence of filtering, but given the low complexity, this is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema coverage is 100%, so there is no parameter meaning for the description to add. With 0 params, the baseline is 4, and the description adds useful context about the output fields instead.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List'), a clear object ('all maintenance work orders'), and a source system ('Rentvine'), then names the returned fields. This clearly distinguishes it from sibling tools like list_owners or list_inspections, though it does not explicitly contrast it with list_work_order_attachments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage context is implied: use this when you need all maintenance work orders and their key details. However, the description does not explicitly state when not to use it or how it differs from alternatives such as update_work_order or list_work_order_attachments.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_transactionsA
Search accounting transactions in Rentvine (live data). Filter by keyword, date range, or amount range. Returns transaction type, amount, description, date, and associated property/ledger. Paginated — use page and page_size for large result sets.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1). | |
| search | No | Filter by description, name, amount, or address. | |
| date_max | No | Latest posted date (YYYY-MM-DD). | |
| date_min | No | Earliest posted date (YYYY-MM-DD). | |
| is_voided | No | Filter to voided (true) or active (false) transactions only. | |
| page_size | No | Results per page (default 15). | |
| amount_max | No | Maximum transaction amount. | |
| amount_min | No | Minimum transaction amount. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It usefully discloses that this queries live data, supports pagination via page/page_size, and returns specific fields. It does not mention rate limits or sort behavior, but for a read-oriented search tool this is solid coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, purposeful sentences: scope and live-data warning first, then filters, then return shape and pagination. Every sentence earns its place and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the description states the main returned fields. It covers the core search scenarios, filter categories, and pagination behavior, while the schema handles parameter formats. The tool is fully selectable and invokable from this description alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each of the 8 parameters is already documented. The description adds value by grouping parameters into keyword, date-range, and amount-range categories and by calling out pagination, but it adds no format or constraint details beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb + resource: 'Search accounting transactions in Rentvine (live data).' It names the exact filters (keyword, date range, amount range) and the returned fields, making it immediately distinct from the flat list_* sibling tools. No tautology or ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: searching live accounting transactions with flexible filters, and using pagination for large result sets. It does not explicitly name alternative tools or state when not to use it, so it stops just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_work_orderA
Update a maintenance work order in Rentvine (live data, write). Use this to change status (e.g. mark completed/cancelled to close a WO), priority, scheduling dates, estimated cost, description, or owner-approval flag. Setting status to 'completed' or 'cancelled' auto-stamps dateClosed to today unless date_closed is supplied. Find work_order_id via list_work_orders.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | New status. Use 'completed' or 'cancelled' to close the work order. | |
| priority | No | New priority level. | |
| actual_end | No | Actual end date/time. | |
| date_closed | No | Date the work order was closed (YYYY-MM-DD). Auto-set to today when status becomes completed/cancelled if omitted. | |
| description | No | New description text. | |
| actual_start | No | Actual start date/time. | |
| scheduled_end | No | Scheduled end date/time. | |
| work_order_id | Yes | Rentvine work order ID (the `work_order_id` field from list_work_orders, not the human-facing work order number). | |
| scheduled_start | No | Scheduled start date/time (ISO 8601 or Rentvine-accepted format). | |
| estimated_amount | No | Estimated cost in dollars, e.g. 259.00. | |
| is_owner_approved | No | Whether the owner has approved the work order. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description rightly carries the burden. It discloses that this is a live write operation and reveals a meaningful side effect: setting status to completed/cancelled auto-stamps date_closed to today unless explicitly provided. It doesn't cover reversibility or permissions, but the critical behavior is surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense, purposeful sentences: the first states purpose and enumerates editable fields; the second discloses a subtle auto-behavior. Zero filler, info-rich and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of annotations and output schema, the description covers the key agent-relevant points: side effects, ID source, editable fields. It doesn't mention permissions or whether partial updates preserve untouched fields, but it is strong enough to support correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema itself already documents the parameters well-hat. The description adds a valuable warning about work_order_id being the Rentvine system ID, not the human-facing number, but otherwise mostly restates what the schema conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource — 'Update a maintenance work order in Rentvine (live data, write)' — and clearly enumerates the mutable fields. It distinguishes itself from list_work_orders by explicitly positioning itself as the mutate counterpart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says exactly when to use the tool ('use this to change status, priority, scheduling dates...') and references list_work_orders as the source for the correct work_order_id. It doesn't state exclusions for when not to use it, but the guidance is concrete and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_fileA
Upload a file to Rentvine and optionally attach it to a work order, property, lease, or unit (live data, write). ALWAYS use file_path when the file exists on disk — pass the absolute path and the server reads it directly. NEVER use file_content_base64 for local files; it is extremely slow and fills the context window. file_content_base64 exists only for remote/HTTP deployments with no shared filesystem. Use list_object_types to get valid object_type_id values.
| Name | Required | Description | Default |
|---|---|---|---|
| file_name | No | Override the file name. If omitted, inferred from file_path. | |
| file_path | No | Absolute path to the file on disk (e.g. '/Users/you/Downloads/invoice.pdf'). USE THIS for any file you can reference by path. The server reads it directly — no encoding needed. | |
| object_id | No | ID of the object to attach the file to (e.g. unitID, workOrderID). | |
| object_type_id | No | Rentvine object type ID to attach the file to. Use list_object_types to find valid values (e.g. 7 = Unit). | |
| file_content_base64 | No | LAST RESORT ONLY — base64-encoded file content for remote deployments with no filesystem access. Do not use this for local files; use file_path instead. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses performance characteristics (base64 is extremely slow and fills the context window), the server-side read behavior for file_path, and the existence of a fallback for remote deployments. It doesn't explicitly state whether the upload is a write/destructive operation, but the verb 'upload' and the context make that clear enough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the primary use case, then the key decision rule, then the fallback. Every sentence earns its place. Slight redundancy between the description and the schema's file_content_base64 description, but the emphasis is intentional and useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter tool with no output schema and no annotations, the description covers the main decision (file_path vs base64), the attachment semantics, and how to find valid object_type_id values. It doesn't describe the response format, but with no output schema that is a minor gap. It also doesn't mention whether object_id is required when attaching, but the schema marks no parameters as required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 adds value by explaining the trade-off between file_path and file_content_base64, and by giving an example object_type_id (7 = Unit). It also clarifies that file_name is an override and inferred from file_path if omitted, which is beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Upload a file to Rentvine') and resource, and clarifies optional attachment to a work order, property, lease, or unit. It distinguishes itself from sibling tools like get_file and download_file by focusing on upload, and from list_attachments by focusing on creation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 file_path for local files, use file_content_base64 only for remote/HTTP deployments with no shared filesystem, and use list_object_types to get valid object_type_id values. It also explicitly says NEVER use file_content_base64 for local files, which is strong exclusionary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vendors_nearA
Find vendors within a radius of a property (live data). Uses the property's Rentvine-geocoded latitude/longitude as the center and approximates each vendor's location from their ZIP-code centroid (offline US lookup — Rentvine does not store per-vendor lat/lon). Returns vendors sorted by distance ascending, each annotated with distance_miles. Defaults: radius_mi=25, active_only=true. Coarse filter — not a precise distance.
| Name | Required | Description | Default |
|---|---|---|---|
| radius_mi | No | Search radius in miles. Defaults to 25. | |
| active_only | No | If true (default), only returns vendors with isActive=1. | |
| property_id | Yes | Rentvine property ID (from list_properties). Must have a geocoded latitude/longitude in Rentvine. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses valuable behavioral traits: the property's geocoded center, vendor ZIP-centroid approximation, 'coarse filter' limitation, and distance sorting. Yet it does not state whether it is strictly read-only, any permissions needed, or what happens when a property lacks geocoding – a noticeable gap given zero annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately lengthy but each sentence serves a purpose: purpose, algorithm, output ordering, defaults, and caveat. It would be slightly better if defaults were not already in schema descriptions, but it's well-structured and front‑loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with no output schema, the description covers the core mechanics: geocoding source, approximation, distance annotation, randomness, defaults, and precision. It omits edge-case behavior (missing geocoding), pagination, and error responses, but given its relative simplicity, it's reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and parameter descriptions already define radius_mi (default 25) and active_only (default true). The tool description repeats some defaults but adds no new parametric insight, so it does not go beyond the schema. The baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb-resource pair: 'Find vendors within a radius of a property' and includes unique details like radius and distance sorting that distinguish it from siblings such as list_vendors/get_vendor. The tool's purpose is immediately clear and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly conveys when to use this tool – when you need vendors near a property – and even details the approximation method, implying it's a specialized alternative to general list_vendors. However, it does not explicitly mention when NOT to use it or alternative tools, but the context is strong enough to infer.
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.
25 tool updates
v1.3.2- First observed
create_bill - First observed
create_work_order - First observed
download_file - First observed
get_file - First observed
get_tenant_balance - First observed
get_vendor - First observed
list_accounts - First observed
list_applications - First observed
list_attachments - First observed
list_bills - First observed
list_inspections - First observed
list_leases - First observed
list_object_types - First observed
list_owners - First observed
list_portfolios - First observed
list_properties - First observed
list_tenants - First observed
list_units - First observed
list_vendors - First observed
list_work_order_attachments - First observed
list_work_orders - First observed
search_transactions - First observed
update_work_order - First observed
upload_file - First observed
vendors_near
TDQS
Scored across 25 tools
Most tools cleanly target distinct entities or actions: list_owners, list_tenants, list_vendors, list_leases, etc. are all clearly differentiated by resource type. The main potential confusion is between list_attachments and list_work_order_attachments, and get_file vs download_file, but the descriptions explicitly clarify the wrapper relationship and metadata-vs-content distinction.
The tool names predominantly follow a consistent verb_noun pattern: list_*, get_*, create_*, update_*, search_*, upload_file, download_file. The main outlier is vendors_near, which breaks the pattern with a noun_qualifier structure, and list_work_order_attachments is a longer but still predictable compound.
At 25 tools, the server is on the heavy end of the acceptable range. The breadth is somewhat justified by the many entity types in Rentvine (owners, properties, leases, tenants, vendors, work orders, bills, transactions, files), but the count still feels larger than a tightly-scoped integration.
The tool set covers read access to many core Rentvine entities and provides targeted write operations for work orders and bills. However, there are notable gaps: no create/update/delete for properties, units, leases, tenants, or vendors, and no update/void/delete path for bills, so full lifecycle coverage is incomplete.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Property management AI: work orders, vendors, appliances, and triage for Claude and ChatGPT.
Provide seamless access to Appfolio Property Manager Reporting API through a standardized MCP serv…
Let AI agents query data and act across all your business apps via MCP.
Ask your Rent Manager portfolio anything: live, read-only financials, rent roll, leasing.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceA Model Context Protocol (MCP) server that wraps AppFolio's REST API so Claude can call it natively in any conversation. 38 tools covering portfolio structure, leasing, financials, maintenance, and admin.1-
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to operate property management systems via natural language, covering repair orders, owner info, payments, notices, and inspections. Features a full agentic workflow with human-in-the-loop and observability.MIT
- AlicenseAqualityBmaintenanceEnables AI assistants to securely interact with rental management data (leases, rent status, tenant records, tax filings) through a per-user OAuth 2.0 authenticated MCP server, with human-in-the-loop for sensitive actions.5AGPL 3.0
- AlicenseNot gradedqualityCmaintenanceExposes multifamily rental data including average rent by market, occupancy anomalies, and property summaries to LLM tools via MCP.1MIT