Contractor Foreman MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Contractor Foreman MCP Serverfind projects with Oak St in the name"
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.
Contractor Foreman API and MCP server, self-hosted
A Contractor Foreman API and a Contractor Foreman MCP server you run on your own computer, in Python, on the session of your own Google Chrome. All 89 Contractor Foreman tools we run in production at Cotlet: projects, schedule, daily logs, punchlists, to-dos, estimates, change orders, invoices, payments, job costing, directory, leads, time cards, bills, purchase orders, sub-contracts, work orders, service tickets, RFIs, submittals and inspections.
Contractor Foreman has no public API and no official MCP server. This repo gives you both:
MCP server for Claude Code, Claude Desktop, Cursor, Codex and any MCP client, over stdio or HTTP. Setup
REST API on
http://127.0.0.1:8787/api/v1/contractor-foreman, with OpenAPI docs at/docs. SetupPython:
call("list_projects", search="Oak St"), plus 10 ready scripts inexamples/.
It is for technical people who want to run it themselves, for personal use only (license). If you want it running 24/7 on a server, kept working when Contractor Foreman changes its app, for a team or a business, use the hosted version at cotlet.dev.
git clone https://github.com/cotletdev/contractor-foreman-api-mcp-server.git && cd contractor-foreman-api-mcp-server
python3 -m venv .venv && . .venv/bin/activate && pip install -e .
contractor-foreman-mcp connect # reads your Contractor Foreman session from Chrome
contractor-foreman-mcp call list_projects
claude mcp add contractor-foreman -- "$PWD/.venv/bin/contractor-foreman-mcp" mcpContents
Related MCP server: AKIMCP
How it works
AI agent (MCP) / script (REST, Python) ──▶ contractor-foreman-mcp on your computer ──your cookies──▶ app.contractorforeman.net
▲
contractor-foreman-mcp connect ──┘ reads them once from your Chrome (DevTools Protocol)You sign in to Contractor Foreman in your own Chrome, the way you always do.
contractor-foreman-mcp connectattaches to that Chrome through the Chrome DevTools Protocol, reads the contractorforeman.net cookies and your browser's time zone, and saves them to~/.config/contractor-foreman-api-mcp/session.json, readable by your user only. It never sees or stores your password.Every tool call is a request to the same
/api/...endpoints the Contractor Foreman web app calls, with those cookies, sent with curl_cffi, which copies Chrome's TLS fingerprint. No browser runs for a call.
Contractor Foreman answers a signed-out request with HTTP 200 and a "signed out" body, and the tools turn that into auth_expired. The server then reads the cookies from Chrome again, if Chrome is open with remote debugging on. Times you send are saved in the time zone connect read from Chrome.
Requirements
Python 3.11 or newer.
Google Chrome 144 or newer, signed in to Contractor Foreman. Any Chrome or Chromium works with a debugging port.
macOS, Linux or Windows.
A Contractor Foreman role with access to the modules you use. A tool on a module your role cannot open fails with the app's own message.
Install
git clone https://github.com/cotletdev/contractor-foreman-api-mcp-server.git
cd contractor-foreman-api-mcp-server
python3 -m venv .venv
. .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e .
contractor-foreman-mcp --versionWith uv: uv venv && uv pip install -e ., then uv run contractor-foreman-mcp ....
Setting it up with an AI agent (Claude Code, Codex, Cursor)? Open it in this folder and ask it to set up the repo: AGENTS.md tells it every step, and it asks you only for the steps in Chrome.
To update: git pull && pip install -e .. We copy every change of the hosted Contractor Foreman tools into this repo.
Connect your Chrome
Option A: your everyday Chrome (recommended)
Open
chrome://inspect/#remote-debuggingin Chrome and switch remote debugging on. Chrome then accepts DevTools connections from programs on this computer, and asks you before each one.Make sure you are signed in at app.contractorforeman.net.
Run:
contractor-foreman-mcp connectChrome asks whether to allow the connection. Click Allow.
Saved 34 Contractor Foreman cookies to /Users/you/.config/contractor-foreman-api-mcp/session.json
Signed in to Contractor Foreman as Mike Turner (mike@turnerbuilds.com)You can switch remote debugging off again afterwards. Leave it on if you want the server to pick up a new session by itself after Contractor Foreman signs you out.
connect looks for Chrome's DevToolsActivePort file in the default profile folder. For Chrome Beta, Canary or a custom profile folder, pass --profile-dir "<folder>".
Option B: a Chrome with a debugging port
Chrome does not open a debugging port on your default profile, so start a separate one, sign in to Contractor Foreman there once, and connect to it:
# macOS
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --remote-debugging-port=9222 --user-data-dir="$HOME/.chrome-contractor-foreman"
# Linux
google-chrome --remote-debugging-port=9222 --user-data-dir="$HOME/.chrome-contractor-foreman"
# Windows
"C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222 --user-data-dir="%USERPROFILE%\.chrome-contractor-foreman"
contractor-foreman-mcp connect --cdp http://127.0.0.1:9222--cdp also takes a ws:// DevTools URL, for example of a Chrome on another machine reached over an SSH tunnel.
Option C: paste the cookies by hand
For a server with no Chrome: in Chrome open DevTools on app.contractorforeman.net, Application > Cookies, and copy two values: _session__240322 (under https://app.contractorforeman.net) and auth_data_session (under .contractorforeman.net). Then:
contractor-foreman-mcp connect --token # paste "_session__240322=...; auth_data_session=...", input is hidden
# or, without a session file:
export CONTRACTOR_FOREMAN_AUTH_TOKEN='_session__240322=...; auth_data_session=...'Pasted cookies are not refreshed on their own. Paste new ones when Contractor Foreman signs you out. Without Chrome the time zone is this machine's (TZ or the system setting).
Check the session at any time:
contractor-foreman-mcp statusMCP server
The MCP server lists every tool with its input schema, a description written for agents, and hints: read tools are marked read-only, and tools that email documents to clients are marked so your client asks before running them.
Claude Code
claude mcp add contractor-foreman -- /path/to/contractor-foreman-api-mcp-server/.venv/bin/contractor-foreman-mcp mcp
# read only:
claude mcp add contractor-foreman -- /path/to/contractor-foreman-api-mcp-server/.venv/bin/contractor-foreman-mcp mcp --read-onlyClaude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"contractor-foreman": {
"command": "/path/to/contractor-foreman-api-mcp-server/.venv/bin/contractor-foreman-mcp",
"args": ["mcp"]
}
}
}Cursor
~/.cursor/mcp.json, the same block as Claude Desktop. A ready copy is in mcp.json.
Codex
~/.codex/config.toml:
[mcp_servers.contractor-foreman]
command = "/path/to/contractor-foreman-api-mcp-server/.venv/bin/contractor-foreman-mcp"
args = ["mcp"]Over HTTP
contractor-foreman-mcp serve also serves MCP over streamable HTTP at http://127.0.0.1:8787/mcp, for clients that take a URL:
contractor-foreman-mcp serve
claude mcp add --transport http contractor-foreman http://127.0.0.1:8787/mcpThen ask your agent things like:
Here is Mike's voice note from the Maple St remodel. Turn it into today's daily log: framing crew of 4, one electrician, drywall delivered, rain stopped work at 2:30.
Turn this scope list from the Johnson bathroom walkthrough into an estimate with 20% markup on materials, show me the total, then email it to the client.
Which open projects have cost codes running over the estimate? Show the biggest overruns first.
List overdue invoices with the balance and days late, then record the $1,200 check from Burger Palace against invoice 11.
REST API
contractor-foreman-mcp serve # http://127.0.0.1:8787, MCP at /mcp, docs at /docsEach tool has its own route under /api/v1/contractor-foreman, the same paths as the hosted API at cotlet.dev, so code written against one works with the other. Path parts and the query string are arguments, and a JSON body adds the rest.
curl 'http://127.0.0.1:8787/api/v1/contractor-foreman/projects?search=Oak%20St'
curl 'http://127.0.0.1:8787/api/v1/contractor-foreman/projects/1678164/job-costing'
curl 'http://127.0.0.1:8787/api/v1/contractor-foreman/invoices?unpaid_only=true'
curl -X POST http://127.0.0.1:8787/api/v1/contractor-foreman/daily-logs \
-H 'Content-Type: application/json' \
-d '{"project_id": "1678164", "date": "2026-10-20", "notes": "Hung and taped drywall in the dining area.", "people": {"Drywall crew": 3}}'Any tool by name, body as its arguments:
curl -X POST http://127.0.0.1:8787/api/v1/contractor-foreman/tools/list_todos -d '{"status": "open"}'GET /api/v1/contractor-foreman/tools: every tool with its route, input schema and an example answer.GET /docs: interactive OpenAPI docs,GET /openapi.jsonthe schema, for n8n, Postman or a generated client.Answers are JSON. Lists return
next_cursor; pass it back ascursorfor the next page.
The server listens on 127.0.0.1 only. To reach it from another device of yours, set a token, and every request then needs Authorization: Bearer <token>:
CONTRACTOR_FOREMAN_MCP_TOKEN=$(openssl rand -hex 24) contractor-foreman-mcp serve --host 0.0.0.0Python and the example scripts
Straight from Python, no server needed:
from contractor_foreman_api_mcp import call
from contractor_foreman_api_mcp.scripting import paginate, write_rows
projects = list(paginate("list_projects", {"include_completed": True, "limit": 100}, "projects"))
write_rows(projects, "projects.csv")
costing = call("get_job_costing", project_id=projects[0]["project_id"])
call("create_daily_log", project_id=projects[0]["project_id"], date="2026-10-20", notes="Framed the east wall.")Or one tool from the shell: contractor-foreman-mcp call list_invoices unpaid_only=true limit=10, or with a JSON object.
Ready scripts in examples/. Each prints JSON or a short report, takes --out file.csv or --out file.json where it makes sense, and --help:
Script | What it does |
Projects to CSV or JSON: customer, stage, dates, contract amount, costs, percent complete. | |
A daily log from a site note, crews and deliveries, after checking the day has no log yet. | |
An estimate from a scope list in CSV with markup. Prints the total, | |
A change order or change order request from a client request; | |
Moves a schedule task by N days and every task that depends on it. | |
Cost codes of open projects whose actual cost runs past the estimate, biggest overrun first. | |
Past-due invoices with a balance, oldest first, with days overdue and the total outstanding. | |
Records a check or transfer against an invoice found by its number, prints the new balance. | |
Hours and labor cost per project and employee from time cards, for the last N days or a date range. | |
Open to-dos due in the next N days or already late, by project. |
python examples/overdue_invoices.py --out overdue.csv
python examples/add_daily_log.py --project-id 1678164 --notes "Framed second floor east wall." --people "Framing crew=4" --dry-runOn a schedule, cron on your own computer works while it is on: 0 8 * * 1 cd ~/contractor-foreman-api-mcp-server && .venv/bin/python examples/overdue_invoices.py --out overdue.csv.
All 89 tools
Ids come from the list tools: project_id from list_projects, invoice_id from list_invoices and so on. contractor-foreman-mcp tools prints this list, contractor-foreman-mcp tools --json adds the input schemas. Every tool of the hosted version is in this repo.
Projects, schedule, daily logs, punchlists and to-dos (18)
Tool | Access | REST route | What it does |
| write |
| New daily log on a project: work notes, people, deliveries, weather notes and delays. |
| write |
| New project for a customer, with number, type, stage, address and dates. |
| write |
| New, empty punchlist on a project. |
| write |
| New to-do, optionally on a project, with due date, priority and assignees. |
| read |
| One daily log: work notes, people and visitors, materials, equipment, weather and delays. |
| read |
| Estimated and actual cost per cost code for one project, with the difference and totals. |
| read |
| One project: customer, address, stage, dates, contract amounts, costs, billing and retainage. |
| read |
| One punchlist: project, address, customer and how many items are open and completed. |
| read |
| One to-do: description, project, priority, status, due date, assignees and checklist. |
| read |
| Daily logs by date, optionally for one project and a date range. |
| read |
| Projects with customer, stage, dates, contract amount, costs and percent complete. |
| read |
| Punchlists with project, status, open and completed item counts and who the items are assigned to. |
| read |
| Gantt schedule tasks of a project: dates, duration, dependencies, assignees, percent complete. |
| read |
| To-dos with project, priority, status, due date and assignees. |
| write |
| Change the notes, times, people, deliveries, weather notes or delays of a daily log. |
| write |
| Change a project's name, stage, type, address, dates or description. |
| write |
| Change the name, dates, length or percent complete of a task on the project schedule. |
| write |
| Change a to-do's name, description, due date, priority or status, e.g. mark it complete. |
Estimates, change orders, invoices and payments (27)
Tool | Access | REST route | What it does |
| write |
| Adds priced line items to a change order or change order request. |
| write |
| Adds priced line items to an existing estimate. |
| write |
| Adds priced line items to an invoice. |
| write |
| Creates a change order or change order request on a project, with line items. |
| write |
| Creates a draft estimate on a project or for a customer, with priced line items. |
| write |
| Creates a draft invoice for a project or customer, with priced line items. |
| write |
| Makes a short internal link that opens an estimate, change order or invoice for your signed-in team. |
| write |
| Deletes a change order or change order request for good. |
| write |
| Deletes an estimate for good. |
| write |
| Deletes an invoice that has no payments, for good. |
| read |
| One change order or request with description, status, total and line items. |
| read |
| One estimate with customer, dates, terms, totals and every line item. |
| read |
| One invoice with customer, dates, terms, line items, payments and balance due. |
| read |
| Change orders and change order requests, newest first, with status, project and total. |
| read |
| The company's cost codes, to put on estimate, change order and invoice items. |
| read |
| Saved cost items with unit, unit cost and markup, to price estimate and change order lines. |
| read |
| Estimates, newest first, with status, project, customer and total. |
| read |
| Invoices, newest first, with status, totals, balance due and an overdue flag. |
| read |
| Payments received on invoices, newest first, with amount, method and invoice. |
| write |
| Records a payment you received against an invoice. |
| write |
| Deletes line items from an estimate. |
| write |
| Emails the change order as a PDF to the customer or to the addresses you give. |
| write |
| Emails the estimate as a PDF to the customer or to the addresses you give. |
| write |
| Emails the invoice as a PDF to the customer or to the addresses you give. |
| write |
| Changes a change order's status, title, reason or date. |
| write |
| Changes an estimate's status, title, dates, description, inclusions or exclusions. |
| write |
| Changes an invoice's status, invoice date, due date or description. |
Directory, leads, time cards, purchasing and field work (44)
Tool | Access | REST route | What it does |
| write |
| Adds a note to a project's Notes tab. |
| write |
| Records a vendor bill with its line items, optionally against a project. |
| write |
| Adds a customer, employee, contractor, vendor or misc contact to the Directory. |
| write |
| Records an expense (receipt, purchase, fee) with amount, date, vendor and project. |
| write |
| Logs an inspection on a project with type, date, agency, inspector and notes. |
| write |
| Adds a sales lead with contact details and a pipeline stage. |
| write |
| Adds a sales opportunity for a customer with stage, score, budget and expected sale date. |
| write |
| Creates a draft purchase order to a supplier with line items, optionally for a project. |
| write |
| Drafts a request for information on a project, with the question and a reply-by date. |
| write |
| Opens a service ticket for a customer, optionally scheduled for a date and time. |
| write |
| Creates a draft sub-contract with a subcontractor on a project. |
| write |
| Creates an Open work order on a project with subject, description and dates. |
| read |
| One vendor bill with its line items, dates, total, balance due and status. |
| read |
| Who is clocked in right now, whether you are, and this and last week's crew hours. |
| read |
| One Directory record in full: contact details, status, services, terms and additional contacts. |
| read |
| One expense with amount, date, vendor, project, cost type, cost code and reason. |
| read |
| One inspection with type, project, date, result, agency, inspector and notes. |
| read |
| One opportunity in full: customer contact, stage, score, budget, notes and last activity. |
| read |
| One purchase order with supplier, dates, status and its line items. |
| read |
| One RFI with its question, dates, answer and status. |
| read |
| One service ticket with customer, service address, schedule, technicians and priority. |
| read |
| One sub-contract with subcontractor, amounts, retainage, scope of work and items. |
| read |
| One submittal with plan sheet, specification section, status, dates and its items. |
| read |
| One time card or crew sheet with hours per employee and cost code. |
| read |
| One work order with project, customer, status, dates, location, notes and items. |
| read |
| Vendor bills with vendor, project, dates, total, balance due and status. |
| read |
| Customers, employees, contractors, vendors and misc contacts from the Directory. |
| read |
| Expenses with amount, date, vendor, project, cost type and who paid. |
| read |
| Inspections with project, type, date, result, agency and permit number. |
| read |
| Sales leads with contact details, stage and quality score. |
| read |
| Sales opportunities with customer, stage, score, budget and expected sale date. |
| read |
| Hours and labor cost logged on one project, per employee and per day and cost code. |
| read |
| Photos and documents on a project, with name, size and a download link. |
| read |
| The notes on a project's Notes tab, with author and time. |
| read |
| Purchase orders with supplier, project, order date, total and status. |
| read |
| Requests for information with question, project, dates, answer and status. |
| read |
| Service tickets with customer, status, service date and time and technicians. |
| read |
| Sub-contracts with subcontractor, project, amount, billed, paid, balance and status. |
| read |
| Submittals with project, status, date received, due date and approver. |
| read |
| Time cards with employee or crew, project, clock-in and clock-out times and hours, newest first. |
| read |
| Work orders with project, customer, status, dates, total and assignee. |
| write |
| Marks an inspection passed, failed or to re-inspect, optionally with notes. |
| write |
| Moves a service ticket to scheduled, en route, checked in, completed, closed and so on. |
| write |
| Moves a work order to open, estimating, submitted, approved, canceled or completed. |
Never built, on purpose: your Contractor Foreman sign-in, password, email and two-factor settings, company settings, the subscription and billing, and the demo data switch. Every request passes a guard that refuses those Contractor Foreman paths.
Configuration
Variable | Default | What it does |
|
| Folder of |
| The session cookies as | |
| Proxy for every request to Contractor Foreman, e.g. | |
|
| |
| Bearer token required by | |
|
| Address of |
Security and your Contractor Foreman account
Your password never reaches this code. Only cookies are read, and only those of contractorforeman.net.
The session file is yours.
session.jsonis created with mode 0600. Anyone who has it can act as you in Contractor Foreman, so keep it out of git and shared folders.Local by default.
servebinds to127.0.0.1and refuses another address withoutCONTRACTOR_FOREMAN_MCP_TOKEN.contractorforeman.net only. Requests and redirects to other hosts are refused.
Read-only mode.
--read-onlyorCONTRACTOR_FOREMAN_MCP_READ_ONLY=1exposes the 48 read tools only.Some actions reach clients.
send_estimate,send_change_orderandsend_invoiceemail a PDF from your account, and a new to-do shows up in its assignees' app. MCP clients ask before running them. A script does not, so try it on a test project first.Deletes are final.
delete_estimate,delete_change_orderanddelete_invoiceremove the record as the app's own delete does.
Errors
The REST API answers {"error": "<code>", "message": "..."}. The MCP server returns the same code and message as a tool error.
Status | Code | What to do |
401 |
| No session, or Contractor Foreman signed you out. Sign in in Chrome and run |
403 |
| Your Contractor Foreman role cannot open that module. |
403 |
| The server runs read-only, or the request would change account settings or billing. |
403 |
| Contractor Foreman refused the request or showed a bot check. Open the app in Chrome once, then retry. |
409 |
| Contractor Foreman asks for a CAPTCHA. Solve it in Chrome. |
422 |
| An argument is missing or wrong; the message names it. |
429 |
| Contractor Foreman is limiting the account. Wait a few minutes. |
502 |
| Contractor Foreman answered with an error (the message quotes it), or changed its app. |
Self-hosted or hosted
This repo | ||
Tools | the same 89 | the same 89 |
Runs | on your computer, while it is on | in the cloud, 24/7 |
Contractor Foreman session | your Chrome, cookies in a local file | your own Cloud Browser in the EU, profile encrypted with AES-256-GCM |
When Contractor Foreman changes its app |
| fixed for you, every tool tested daily |
Approvals | your MCP client asks per call | emails to clients wait for your OK, switchable per tool |
Works with | MCP clients on your machine, local scripts | Claude.ai and ChatGPT connectors, n8n, Make, Zapier, any HTTP client |
Who may use it | you, for personal use | teams, businesses, agencies |
Price | free | free 7-day trial with 2,000 credits, no card; then one-time packs from $29 for 5,000 credits |
On the hosted version a successful call uses 20 to 30 credits (25 for most tools), failed calls are free, and the Cloud Browser uses 50 credits a day while it has an app enabled for agents. Full pricing.
FAQ
Does Contractor Foreman have an official API? No public one: no REST API, developer docs or API keys (checked 11 Oct 2026). The only programmatic access is a Zapier app with 7 triggers for leads, customers and file uploads, and 2 actions, Create Lead and Create Customer. It cannot read or write estimates, change orders, daily logs, the schedule, invoices or job costing. Details: cotlet.dev/integrations/contractor-foreman-api-mcp-server.
Is there a Contractor Foreman MCP server for Claude, ChatGPT or Cursor?
Yes, this one runs on your machine: contractor-foreman-mcp mcp for Claude Code, Claude Desktop, Cursor and Codex. ChatGPT and Claude.ai connectors need a public HTTPS URL, which the hosted Contractor Foreman MCP server gives you.
Is this a scraper? It does what people want a scraper for (export projects, invoices and time cards to CSV) but parses no HTML. It calls the same JSON endpoints the Contractor Foreman web app calls, in your own account.
Can I export projects, invoices or crew hours to CSV?
Yes: python examples/export_projects.py --out projects.csv, python examples/overdue_invoices.py --out overdue.csv or python examples/crew_hours.py --days 30 --out hours.csv. Pages are followed automatically.
Can an agent write my daily logs?
Yes. create_daily_log takes the notes, crews with headcounts, deliveries and weather remarks. Contractor Foreman records the weather for the date and address itself. examples/add_daily_log.py first checks that the day has no log yet.
Why does it need my Chrome? To read your Contractor Foreman session without your password. Chrome is used once per sign-in, not for each call.
What happens when Contractor Foreman signs me out?
Calls fail with auth_expired. With Chrome remote debugging on, the server reads the new cookies on the next call (click Allow when Chrome asks). Otherwise run contractor-foreman-mcp connect again.
Can it run on a VPS or in Docker?
Technically yes, with CONTRACTOR_FOREMAN_AUTH_TOKEN. Contractor Foreman then sees your session from a datacenter IP, which looks less like you, and the license allows it only on a server you alone use. For an always-on setup the hosted version keeps your session in your own Cloud Browser on a fixed IP.
Can I use it at work or for my clients? No, the license is for personal use by one person, and running your own contracting business on it is business use. For a team, a company or client work, use Cotlet or write to contact@cotlet.dev.
Is it open source? The source is public, the license is not an open source license: personal use only, no business use, no hosting for others.
A tool broke or I need another one. Open an issue with the tool name and the error message.
License
Cotlet Personal Use License 1.0. In short:
Allowed: one person, on their own computers, with their own Contractor Foreman accounts, for their own purposes. Changing the code for yourself, and a GitHub fork under the same license.
Not allowed: any use in or for a company or organization, your own business included; letting other people use your instance (shared server, team machine, cloud service); selling or offering it or a service built on it.
Maintained by Cotlet (@cotletdev). Contractor Foreman is a trademark of its owner. This project is unofficial and not affiliated with, endorsed or sponsored by Contractor Foreman.
Available Tools
89 toolsadd_change_order_itemsAdd change order itemsA
Adds priced line items to a change order or change order request.
Adds line items at the end of the change order's first section: name, type (material, labor, equipment, subcontractor, other), quantity, unit, unit cost in dollars and markup percent. The app computes totals. Returns the saved items and the new total.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | ||
| change_order_id | Yes | From list_change_orders. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare that this is not read-only, is open-world, and is not idempotent. The description adds useful behavioral context: items are appended to the first section, the app computes totals, and the result includes saved items plus the new total. It does not discuss permissions or error behavior, but the annotations carry the safety profile.
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 tightly written sentences with no filler. The core action and scope are front-loaded, followed by item details and return behavior.
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 mutation tool with annotations and no output schema, the description covers what is added, where it is added, that totals are computed, and what is returned. Minor omissions like item limits or error conditions are handled by the schema or are not essential for 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?
Schema description coverage is 50%, so the description should compensate more than it does. It names most item fields and the allowed type values, which is helpful, but it omits the cost_code_id and description fields and does not clarify top-level parameters beyond their schema descriptions.
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 and resource: adds priced line items to a change order or change order request. It is clearly distinguishable from generic change-order tools, but it does not explicitly contrast with sibling item-adding tools such as add_estimate_items or add_invoice_items.
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 by 'adds line items at the end of the change order's first section,' but there is no explicit when-to-use guidance, prerequisites, or alternatives. An agent can infer this is for adding items to an existing change order, but the description does not route it against siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_estimate_itemsAdd estimate itemsA
Adds priced line items to an existing estimate.
Adds line items at the end of an estimate section (the first one unless section_id says otherwise). Each item has a name, a type (material, labor, equipment, subcontractor, other), quantity, unit, your unit cost in dollars and a markup percent. Contractor Foreman computes the totals. cost_code_id comes from list_cost_codes. Returns the saved items and the new estimate total.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | ||
| section_id | No | From get_estimate. Default: the first section. | |
| estimate_id | Yes | From list_estimates or create_estimate. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the safety profile (mutating, non-destructive, non-idempotent, open-world), and the description usefully adds that items are appended rather than replacing anything and that the server computes totals and returns both the saved items and the new estimate total. This is genuine value beyond the annotations; it doesn't cover permission prerequisites or behavior against a locked/sent estimate.
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 tight paragraphs, purpose first, then mechanics and return value. No filler, no restatement of the schema's defaults and enums that would waste tokens.
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 3-parameter mutation with no output schema, the description covers purpose, insertion behavior, field meanings, ID provenance, and what comes back. The remaining gap is operational edge cases such as item limits, locked estimates, or partial-failure behavior, which an agent might want before calling.
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 coverage is 67%, so the description has real work to do, and it does it: it enumerates the meaningful item fields, clarifies that unit_cost is the agent's cost in dollars while markup is applied server-side to produce totals, and ties cost_code_id and section_id to their source tools. The nested item object is the crux of the call and it is described accurately.
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 and resource ('Adds priced line items to an existing estimate') and scopes it to existing estimates. An agent can distinguish it from siblings like add_invoice_items or add_change_order_items purely by the resource named, without opening any 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?
Explains the insertion point ('at the end of an estimate section (the first one unless section_id says otherwise)') and where prerequisite IDs come from (cost_code_id from list_cost_codes, estimate_id from list_estimates/create_estimate). It gives clear context but never names exclusions or alternatives, e.g. that update_estimate is the tool for editing existing items.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_invoice_itemsAdd invoice itemsA
Adds priced line items to an invoice.
Adds plain priced lines at the end of an invoice: name, type, quantity, unit, unit cost in dollars, markup percent. Items billed from an estimate, change order or schedule of values are added in the app. Returns the saved items, the new total and the balance due.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | ||
| invoice_id | Yes | From list_invoices or create_invoice. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare mutation, non-idempotent, non-destructive, open-world. The description adds real value beyond them: it discloses append-to-end semantics ('at the end of an invoice') and the response payload (saved items, new total, balance due), which matters because there is no output schema. It does not warn that retries duplicate items (only implied by idempotentHint=false), which keeps it off a 5.
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 sentences, front-loaded with the action and followed by scope and return values. The item-field enumeration partially repeats the schema, but it is compact enough to justify its space.
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 no output schema, the description correctly covers returns, and with 50% schema coverage it covers most item fields plus the append behavior. Only the undocumented cost_code_id/description fields and duplicate-on-retry behavior are left unaddressed, which are minor given the annotations.
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 coverage is 50%, so the description needs to carry weight; it enumerates item fields (name, type, quantity, unit, unit cost in dollars, markup percent), which helps, but omits cost_code_id and the per-item description field and adds no syntax beyond the schema. Adequate but leaves gaps at a borderline coverage level.
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+resource (add priced line items to an invoice) and scopes it to 'plain priced lines,' explicitly noting that estimate / change order / schedule-of-values items are added in the app rather than here. That indirectly but effectively separates it from sibling tools like add_estimate_items and add_change_order_items.
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?
Gives a clear condition for what belongs here ('plain priced lines at the end of an invoice') and an exclusion ('Items billed from an estimate, change order or schedule of values are added in the app'). It does not name alternative siblings directly or discuss when to use update_invoice instead, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_project_noteAdd project noteB
Adds a note to a project's Notes tab.
Writes a note on a Contractor Foreman project's Notes tab as the signed-in user, with an optional title. It is visible to the company's users with access to the project. Nobody is notified. Returns the saved note.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| title | No | ||
| project_id | Yes | The project's numeric id (list_projects). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish mutation and open-world behavior, while the description adds concrete visibility ('company's users with access'), notification behavior ('Nobody is notified'), actor ('signed-in user'), and return value ('saved note'). It omits permission scopes and duplicate/rate-limit behavior, so it is strong 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 front-loaded and generally concise. The first sentence largely duplicates the second ('Adds a note...' / 'Writes a note...'), which is a minor redundancy.
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 mutation tool with annotations but no output schema, the description covers purpose, visibility, notification, actor, and return value. Missing duplicate handling or edit restrictions are modest gaps.
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 33%; only project_id has a schema description. The prose mentions an optional title but does not explain text body semantics or limits, and does not compensate for the low 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 and resource: 'Adds a note to a project's Notes tab.' The write operation is unmistakable, though it does not explicitly name the read sibling list_project_notes, so sibling differentiation is implicit rather than stated.
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 explicit when-to-use, when-not-to-use, or alternative tools are named. Visibility and notification details describe behavior, but they do not route the agent between add_project_note and list_project_notes or other note-related actions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_billCreate billA
Records a vendor bill with its line items, optionally against a project.
Enters a bill from a vendor in Contractor Foreman: the vendor's invoice number, bill and due date, subject, notes and line items (description, quantity, unit, unit cost, cost type). With a project_id the cost shows in that project's job costing. The bill starts Open and nothing is paid or sent. Returns the saved bill.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | Line items. The total is the sum of quantity times unit cost. | |
| notes | No | ||
| number | Yes | The vendor's invoice number. | |
| subject | No | ||
| due_date | No | YYYY-MM-DD. | |
| bill_date | No | YYYY-MM-DD. Default: today. | |
| vendor_id | Yes | A vendor's contact_id (list_contacts type vendor). | |
| project_id | No | The project the cost belongs to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the write/safe/idempotency profile, and the description adds genuinely new behavioral facts: the bill starts in Open status, nothing is paid or sent, and it returns the saved bill. It does not mention prerequisites such as the vendor record existing or any permission requirements, so a 4 rather than a 5.
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 sentences, front-loaded with the one-line summary before the detail, and no filler. Mild redundancy between the opening sentence and the more specific second sentence keeps it from a 5.
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 an 8-parameter mutation with no output schema, the description covers the important unknowns: what the call creates, its initial state, and that it returns the saved bill. Missing are prerequisite notes (vendor must pre-exist) and any indication of failure modes, which keeps it just under 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?
At 75% schema coverage the schema does much of the work, but the description reinforces the non-obvious mappings ('the vendor's invoice number' for number, the line-item fields including cost type) and explains the consequence of project_id on job costing, which the schema only states flatly. It does not clarify defaults like bill_date=today beyond what the schema provides.
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 first sentence names a specific verb and resource ('Records a vendor bill with its line items, optionally against a project'), and the second expands on the exact payload. It never explicitly distinguishes itself from the sibling create_invoice, which is the nearest ambiguity, so it stops short of a 5.
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 'Enters a bill from a vendor in Contractor Foreman' and by the note that supplying project_id routes the cost into job costing, which is real selection context. There is no explicit when-not-to-call or named alternative (e.g. create_invoice for customer-side billing, create_expense for non-vendor costs), so routing remains inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_change_orderCreate change orderA
Creates a change order or change order request on a project, with line items.
Saves a new change order (status open) or change order request (status draft) on a project, for the project's customer. description records the reason. items are priced lines (name, type, quantity, unit, unit cost in dollars, markup percent, cost code). The app computes the total. Nothing is sent. send_change_order emails it after your OK, update_change_order sets the status.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Default: today. | |
| kind | No | request = a change order request (COR) to price before it becomes a change order. | change_order |
| items | No | ||
| title | Yes | ||
| number | No | Your own number. Default: the app's next, or COR-<requests on the project + 1>. | |
| project_id | Yes | From list_projects. | |
| description | No | Why it changes: who asked, when, what. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write/safe/non-idempotent profile, and the description adds real context beyond them: the resulting status (open for change orders, draft for requests), that the app computes the total, and that nothing is emailed. It does not address duplicate-number behavior despite idempotentHint=false, which is the one meaningful 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 core action and the no-send guarantee are front-loaded in the first two sentences, and the total length is appropriate for a seven-parameter create tool. The middle sentence about items is a dense parenthetical list that is slightly run-on but still readable.
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 create tool with nested line items and no output schema, the description covers the important semantics: what gets created, what status it lands in, how totals are derived, and that nothing is dispatched. The only missing piece is what the call returns (presumably the created change order with computed total), which an agent must infer.
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 coverage is a moderate 71% and the description largely restates what the schema already says about items (name, type, quantity, unit, unit cost in dollars, markup percent, cost code). The one genuine addition is 'description records the reason', but parameters like date, number, and kind are already documented in-schema, so this sits at the baseline.
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 opening sentence gives a specific verb (creates) and resource (change order / change order request) with the key qualifier 'with line items'. The second sentence distinguishes the two variants by resulting status (open vs draft), and the closing sentence names the two adjacent tools (send_change_order, update_change_order) so an agent can place this tool in the workflow 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 last sentence explicitly routes the agent: 'Nothing is sent. send_change_order emails it after your OK, update_change_order sets the status' — a clear statement of what this tool does not do and which sibling does it. However there is no explicit guidance on prerequisites (project must exist, cost codes must be listed first) or exclusions beyond the send/update split.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_contactCreate contactA
Adds a customer, employee, contractor, vendor or misc contact to the Directory.
Creates a Contractor Foreman Directory record as the Add drawer does. Employees need a first and last name, contractors and vendors a company name, the others a name or a company. The record gets no app access and nobody is invited or emailed. Giving an employee a login stays a step in the app. Returns the new contact_id.
| Name | Required | Description | Default |
|---|---|---|---|
| zip | No | ||
| cell | No | ||
| city | No | ||
| type | Yes | What kind of contact. | |
| No | |||
| phone | No | ||
| state | No | ||
| address1 | No | ||
| address2 | No | ||
| last_name | No | ||
| first_name | No | ||
| company_name | No | Required for contractors and vendors. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, idempotentHint=false, destructiveHint=false) by disclosing that the created record has no app access, no invitation email is sent, and login provisioning is out of scope. It also states the return value ('Returns the new contact_id'), which matters because no output schema exists.
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?
Five tight sentences, front-loaded with the core action and followed by requirements then side-effect exclusions. 'Creates a Contractor Foreman Directory record as the Add drawer does' slightly restates the opening sentence but it establishes the UI-equivalence context.
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 non-idempotent mutation with no output schema, the description covers what is created, what is not created (access/invites), conditional field requirements, and the return value. It does not address duplicate handling despite idempotentHint=false, which is the one remaining 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?
With only 17% schema coverage across 12 parameters, the description compensates by spelling out the type-conditional requirements: employees need first and last name, contractors and vendors need a company name, others need a name or a company. That is the single most error-prone part of the call. The address/phone/email fields are left unaddressed, but they are self-explanatory.
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 and resource ('Adds a ... contact to the Directory') and enumerates exactly which contact types are supported, matching the schema enum. An agent can immediately tell this is the create-side counterpart to get_contact/list_contacts 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?
Explains the operational context ('as the Add drawer does') and, importantly, the boundary conditions: no app access is granted, nobody is invited or emailed, and granting a login remains a separate step in the app. It does not explicitly name alternative tools, which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_daily_logCreate daily logA
New daily log on a project: work notes, people, deliveries, weather notes and delays.
Adds a daily log to the project for the date you give (arrival 07:00 unless you say otherwise) and returns it as get_daily_log shows it. Contractor Foreman records the weather for the date and the project address itself, and weather_notes sits next to it. notes must not be empty. people takes a headcount per crew or free text. The log reaches no client or crew and update_daily_log can edit it, so this tool runs without asking. One project can have several logs on one date: check list_daily_logs first.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Log date. | |
| notes | Yes | Work done and site notes (the log's Work Performed). | |
| people | No | Crews, subcontractors and visitors on site: headcount per crew, or free text. | |
| visitors | No | Visitors on site (inspector, owner, architect). | |
| project_id | Yes | project_id from list_projects. | |
| arrival_time | No | Arrival on site, e.g. 07:00 or 7:00 AM. | |
| jobsite_notes | No | Jobsite condition notes. | |
| weather_delay | No | What the weather delayed. Marks a weather delay. | |
| weather_notes | No | Your own notes next to the recorded weather. | |
| departure_time | No | Departure from site, e.g. 15:30. | |
| schedule_delay | No | What else held the schedule up. Marks a schedule delay. | |
| materials_delivered | No | Materials delivered or used, one line each. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, non-destructive, open-world, non-idempotent, and the description adds real behavior: default arrival of 07:00, weather auto-recorded from the date/address, the notes non-empty constraint, and the visibility scope ('reaches no client or crew') that justifies running without confirmation. This is context beyond the annotation flags.
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?
Purpose is front-loaded in the first sentence and every sentence carries information (defaults, constraints, alternatives). It is dense and slightly run-on, packing several facts per sentence, but no line is wasteful.
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 12-parameter creation tool with no output schema, the description covers return contract ('returns it as get_daily_log shows it'), required-field constraint, defaults, side effects (system weather recording), and visibility. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds value the schema lacks: the 07:00 default for arrival_time, the notes-must-not-be-empty constraint, the headcount-per-crew-or-free-text shape of people, and that weather_notes sits beside the system-recorded weather. Only modest gaps (no format hints for delay fields) remain.
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+resource ('New daily log on a project') and enumerates the content it captures. It distinguishes itself from get_daily_log, update_daily_log, and list_daily_logs by name, so an agent can tell which daily-log tool to pick without opening 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?
Gives an explicit precondition ('check list_daily_logs first' since one project can have several logs on one date) and an explicit alternative ('update_daily_log can edit it'). Both the when and the why-not are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_estimateCreate estimateA
Creates a draft estimate on a project or for a customer, with priced line items.
Saves a new estimate in the Estimating status, unit-price billing, dated today. With project_id it belongs to that project and its customer. Without one, customer_id is required. items are priced lines (name, type, quantity, unit, unit cost in dollars, markup percent, cost code). The app computes totals. Nothing is sent: send_estimate does that after your OK. More lines later with add_estimate_items, other fields with update_estimate.
| Name | Required | Description | Default |
|---|---|---|---|
| items | No | ||
| title | Yes | ||
| exclusions | No | ||
| inclusions | No | ||
| project_id | No | From list_projects. Its customer is used. | |
| customer_id | No | Directory customer id. Needed without a project. | |
| description | No | Scope shown on the estimate. | |
| expire_date | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that the estimate is saved as a draft in Estimating status, uses unit-price billing, is dated today, and has totals computed by the app. It also clarifies that nothing is sent until send_estimate is invoked, which is important behavioral context for a create 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 front-loaded with the core action and then efficiently covers status, billing, required relationships, item structure, and next-step tools. There is no wasted text, and each sentence adds useful context.
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 create tool with annotations and no output schema, the description covers most critical behavior: draft status, billing mode, date, totals computation, and no automatic sending. It could be slightly more complete by indicating what is returned after creation or how the new estimate id is used, but the overall context is strong.
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 description adds useful meaning for the core inputs: items are priced lines with name, type, quantity, unit, unit cost, markup, and cost code, and project_id versus customer_id is explained. However, with schema description coverage at 38%, several optional parameters such as exclusions, inclusions, expire_date, and the required title are not clarified in the description.
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 gives a specific verb and resource: creates a draft estimate on a project or for a customer, with priced line items. It clearly distinguishes this from send_estimate, add_estimate_items, and update_estimate by describing their separate roles.
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 explicitly states the project_id versus customer_id rule and names the alternative tools for sending, adding lines, and updating fields. The agent knows when to use this tool and when to use siblings instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_expenseCreate expenseA
Records an expense (receipt, purchase, fee) with amount, date, vendor and project.
Enters an expense in Contractor Foreman as the signed-in user: name, amount, date, vendor, project, cost type, reason and whether it is billable to the customer. The project is required by the app, and the expense shows in that project's job costing. No receipt file is attached. Returns the saved expense.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | YYYY-MM-DD. Default: today. | |
| name | Yes | What was bought or paid. | |
| type | No | material | |
| amount | Yes | In the account currency. | |
| reason | No | ||
| billable | No | Bill it on to the customer. | |
| vendor_id | No | The vendor's contact_id (list_contacts type vendor). | |
| project_id | Yes | The project the cost belongs to (list_projects). The app refuses an expense without one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, so the safety profile is known. The description adds genuinely non-obvious behavior: the expense feeds the project's job costing (a downstream side effect), the project is hard-required and rejected without one, the actor is the signed-in user, and no receipt file is attached. It does not address duplicate creation despite idempotentHint=false, which is the one material 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 leading sentence is front-loaded with verb, resource and key fields, and the second sentence carries the behavioral detail. There is some duplication, since the field list appears in the first sentence and is re-enumerated in the second, but the total length is reasonable for an 8-parameter mutation.
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 non-idempotent create with 8 params and no output schema, the description covers the essentials: required project, actor identity, job-costing side effect, absence of receipt upload, and an explicit return statement ('Returns the saved expense'). Remaining gaps are duplicate handling and post-creation editability.
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 75%, so the schema already carries most parameter meaning (currency, enum values, vendor_id -> contact_id, project_id requirement). The description mostly restates the field list ('name, amount, date, vendor, project, cost type, reason and whether it is billable') rather than adding semantics beyond it; only 'no receipt file is attached' clarifies an absent field.
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 and resource ('Records an expense') and enumerates the domain fields (receipt, purchase, fee; amount, date, vendor, project), so the agent knows this is a create operation aimed at cost entry, not a listing or retrieval. It does not explicitly contrast with create_bill or create_purchase_order, which are the genuinely confusable siblings in this domain, so it stops short of a 5.
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?
Gives useful preconditions: 'The project is required by the app' and 'No receipt file is attached', plus it runs 'as the signed-in user'. But it never says when to choose this over create_bill / create_purchase_order, which matters because all three create cost records in the same product. Usage is implied rather than routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_inspectionCreate inspectionA
Logs an inspection on a project with type, date, agency, inspector and notes.
Creates a Contractor Foreman inspection in Draft status on a project: inspection type, day, agency (internal, county, city or independent agency), inspector and notes. record_inspection_result sets pass, fail or re-inspect afterwards. Nobody is notified. Returns the saved inspection.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Inspection day, YYYY-MM-DD. Default: today. | |
| type | Yes | e.g. Framing, Rough Electrical. | |
| notes | No | ||
| agency | No | ||
| project_id | Yes | The project being inspected. | |
| inspected_by | No | Inspector or office. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations give the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true), and the description adds real value on top: the record is created in Draft status, no one is notified, the saved inspection is returned, and a separate tool must be called to set the outcome. Those are exactly the post-call state facts an agent needs. Minor gap: with idempotentHint=false, a note on duplicate handling would help.
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 short but front-loaded with a sentence that repeats the field list that the next sentence lists again (type, date, agency, inspector, notes). That duplication is the main waste; the genuinely useful facts (Draft status, no notification, follow-up tool) are buried in the second paragraph.
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 6-parameter mutation with no output schema, the description covers the important behavioral context: resulting status, notification behavior, return value, and the sibling needed to complete the workflow. The remaining gap is that one undocumented parameter (notes) is not explained anywhere.
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 coverage is 67%, and the description mostly restates the field list already visible in the schema. It does add a bit of semantic gloss for agency (internal, county, city, independent agency), which clarifies the enum values. But notes has no schema description and the description supplies nothing about what belongs there, leaving the coverage gap unfilled.
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 (creates/logs) and resource (a Contractor Foreman inspection on a project) plus the identity fields that define the record. It explicitly distinguishes itself from the sibling record_inspection_result, which handles the pass/fail outcome, so an agent can pick correctly without opening either 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 names the follow-up tool (record_inspection_result) and what it covers, and narrows the use case to a Draft-status inspection. It also says nobody is notified, which is useful for deciding whether an extra notification step is needed. It stops short of stating exclusions such as when to use get_inspection or list_inspections instead, but the create-vs-fetch split is fairly obvious from the names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_invoiceCreate invoiceA
Creates a draft invoice for a project or customer, with priced line items.
Saves a new invoice in the Draft status. With project_id it bills that project's customer. Without one, customer_id is required. A description needs due_date in the same call. items are plain priced lines (name, type, quantity, unit, unit cost in dollars, markup percent). It is not sent. update_invoice with status submitted marks it sent and lets record_payment take payments. send_invoice emails it after your OK.
| Name | Required | Description | Default |
|---|---|---|---|
| items | No | ||
| number | No | Your own number. Default: the app's next. | |
| due_date | No | ||
| project_id | No | From list_projects. Its customer is billed. | |
| customer_id | No | Directory customer id. Needed without a project. | |
| description | No | Shown on the invoice. Needs due_date in the same call. | |
| invoice_date | No | Default: today. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only, non-destructive, non-idempotent, open-world write; the description adds the crucial behavior that the invoice lands in Draft and is not sent, and lays out the downstream lifecycle. It does not warn that repeated calls will create duplicate drafts (non-idempotent) or mention any limits, so it falls slightly short of full 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?
The core behavior is front-loaded in the first two sentences, and every subsequent sentence carries a routing rule. The later sentences are telegraphic fragments ('It is not sent.', 'send_invoice emails it after your OK.') and there is mild repetition around 'not sent'/'marks it sent', but the content density is high.
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 create mutation with no output schema and no required parameters (conditional requirements instead), the description covers the draft state, the project/customer branch, line item shape, and the lifecycle to sending and payment. The main missing piece is what the call returns (e.g., the new invoice id) that later update_invoice/record_payment calls would need.
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 coverage is 71%, and the description adds real meaning: the project_id/customer_id dependency, the description–due_date coupling, and the contents of each item line (name, type, quantity, unit, unit cost in dollars, markup percent). It omits number, invoice_date, and cost_code_id, so it does not fully compensate for the uncovered parameters.
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 first sentence gives a specific verb and resource ('Creates a draft invoice') plus scope ('for a project or customer, with priced line items'). It is immediately distinguishable from send_invoice and update_invoice by the explicit Draft status and 'It is not sent.'
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 the exact branching rule: with project_id the project's customer is billed; without one customer_id is required. It also names the follow-on tools (update_invoice with status submitted, record_payment, send_invoice) and the ordering constraint that description requires due_date in the same call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_leadCreate leadA
Adds a sales lead with contact details and a pipeline stage.
Creates a lead in the Contractor Foreman Directory as the Leads Add drawer does: a name or a company, contact details, address and the stage (received by default). Nobody is emailed. Returns the new contact_id, which list_leads and get_contact read.
| Name | Required | Description | Default |
|---|---|---|---|
| zip | No | ||
| cell | No | ||
| city | No | ||
| No | |||
| phone | No | ||
| stage | No | received | |
| state | No | ||
| address1 | No | ||
| address2 | No | ||
| last_name | No | ||
| first_name | No | ||
| company_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the bar is lower, yet the description still adds real value: 'Nobody is emailed' rules out a side effect the agent might otherwise assume, the default stage is called out, and the returned contact_id is named. It stops short of saying what validation happens if neither name nor company is supplied, despite the schema marking nothing as required.
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, front-loaded with the action and payload, then the behavioral caveats and return value. Nothing is repeated from the schema or annotations and no sentence is 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?
For a twelve-parameter mutation with no output schema, the description is nearly sufficient: it explains what is created, that no one is notified, the default stage, and what is returned. The remaining gap is the 'a name or a company' constraint, which reads as a requirement but conflicts with a schema that marks nothing required, leaving the agent unsure what a minimal valid call looks like.
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?
With 0% schema description coverage, the description has to carry the load and largely does: it groups the twelve fields into name/company, contact details, address and stage, and restates the 'received' default from the enum. It doesn't map the groups to individual parameter names (e.g. which of first_name/last_name/cell/phone counts as 'contact details'), which keeps it below a 5.
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 and resource ('Adds a sales lead') and enumerates the payload it accepts — contact details, address, pipeline stage. It also names the sibling readers that consume the result (list_leads, get_contact), so an agent can place it in the workflow without opening another 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?
Usage is implied by 'Creates a lead in the Contractor Foreman Directory as the Leads Add drawer does', which frames the scenario, but there is no explicit when-to-use/when-not guidance. With siblings like create_contact, create_opportunity and create_service_ticket in the same space, an agent gets no routing rule for choosing this one over those.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_opportunityCreate opportunityA
Adds a sales opportunity for a customer with stage, score, budget and expected sale date.
Creates an opportunity in Contractor Foreman as the Opportunities Add drawer does, for a customer from the Directory. It is assigned to the signed-in user. Nobody is emailed. The opportunity number must be unique. Without one it gets OPP- and the UTC date and time (OPP-261021-1213). Returns the saved opportunity.
| Name | Required | Description | Default |
|---|---|---|---|
| zip | No | ||
| city | No | ||
| name | Yes | ||
| score | No | ||
| stage | No | received | |
| state | No | ||
| budget | No | Expected value in the account currency. | |
| number | No | Your opportunity number. Left out: OPP- and the UTC date and time, as OPP-261021-1213. | |
| address1 | No | ||
| customer_id | Yes | A customer's contact_id (list_contacts type customer). | |
| project_type | No | commercial | |
| est_sales_date | No | Expected sale date, YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond the annotations: it states that the record is assigned to the signed-in user, nobody is emailed, the opportunity number must be unique, a fallback number is generated from the UTC timestamp, and the saved opportunity is returned. These are exactly the side effects and postconditions an agent needs for a create operation, and none contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose, followed by operational details and return behavior. It is appropriately sized for a create tool, though the 'Creates an opportunity ... as the Opportunities Add drawer does' sentence partially repeats the opening.
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 there is no output schema, the description usefully states that it returns the saved opportunity and covers assignment, email behavior, and numbering. It is nearly complete for the operation, with the main gap being that several of the 12 input parameters are only documented in the schema.
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 only 33% across 12 parameters, so the description needs to compensate. It helps by naming key fields, tying customer_id to the Directory, and explaining number uniqueness/default generation, but it leaves address fields, project_type, name requirements, and stage/score semantics largely to 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 opens with a specific verb and resource: 'Adds a sales opportunity' for a customer, and names the core fields stage, score, budget and expected sale date. That is enough for an agent to distinguish this create tool from get_opportunity and list_opportunities 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?
It gives clear usage context: the customer must come from the Directory, the opportunity is assigned to the signed-in user, and it mirrors the Opportunities Add drawer. It does not explicitly say when to use this instead of create_lead or another create sibling, but the context is strong enough that an agent should not confuse the use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_projectCreate projectA
New project for a customer, with number, type, stage, address and dates.
Adds a project in the stage you give (default pending) for a customer from your Directory. Without number the account's next project number is used. Accounts that number projects by hand need one. The project reaches nobody outside your company, so this tool runs without asking. Returns the project as get_project shows it.
| Name | Required | Description | Default |
|---|---|---|---|
| zip | No | ||
| city | No | ||
| name | Yes | Project name, e.g. Kitchen remodel - Oak St. | |
| type | No | residential | |
| state | No | ||
| number | No | Project number. Default: the next number when the account numbers projects itself. | |
| status | No | pending | |
| street | No | ||
| street2 | No | ||
| end_date | No | ||
| start_date | No | ||
| customer_id | Yes | The customer's contact_id from list_contacts. | |
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a non-read-only, non-destructive, non-idempotent mutation. The description adds practical behavior: default status, automatic project numbering, the manual-numbering exception, no external visibility, no confirmation prompt, and that the result matches get_project. It does not reconcile the openWorldHint=true annotation, but the added context is substantial.
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-loads the core purpose before adding defaults, numbering behavior, safety context, and return shape. The first sentence is slightly fragmentary, but overall every sentence carries useful 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 13-parameter create tool with no output schema, the description covers the essential operational context: required customer source, default stage, numbering behavior, no external side effects, and return shape. The main remaining gap is detailed semantics for the address and date parameters, but the schema provides field names and formats.
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 coverage is only 23%, so the description must compensate, and it does add meaning for key fields: customer_id comes from the Directory, number has automatic default behavior, and status defaults to pending. It still leaves many of the 13 parameters such as address fields, dates, and description without added semantic guidance 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 a specific verb and resource: it creates a new project for a customer, and it names the main data categories (number, type, stage, address, dates). It is distinct enough from siblings like update_project, but it does not explicitly contrast itself with related creation tools such as create_lead or create_opportunity.
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 useful creation context: the customer must come from the Directory, the project is created in the specified stage with pending as default, and manual-numbering accounts must supply a number. However, it does not explicitly say when to use this rather than update_project, list_projects, or other create tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_punchlistCreate punchlistA
New, empty punchlist on a project.
Adds an empty punchlist to the project and returns it as get_punchlist shows it. Items cannot be added through this tool yet, so add them in Contractor Foreman. Nobody is assigned or notified, so this tool runs without asking.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Punchlist name, e.g. Final walkthrough - kitchen. | |
| project_id | Yes | project_id from list_projects. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond the annotations: the created object is empty, it cannot be populated here, no one is assigned or notified, and it can run without confirmation. Those are exactly the side-effect facts an agent needs. It does not address what happens on duplicate names or whether repeats create multiple punchlists, despite idempotentHint=false.
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?
Short and front-loaded, with the scope statement first and limitations after. The opening sentence is a fragment ('New, empty punchlist on a project.') that reads slightly as a title restatement rather than a full clause.
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 no output schema, the description compensates by saying the result is what get_punchlist returns, and it covers side effects and limitations. Only re-creation behavior for non-idempotent calls is left unexplained.
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 coverage is 100%, with both project_id and name documented in the schema, so the baseline applies. The description adds only the 'empty' characteristic and no naming or format guidance for the two parameters.
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 and resource ('Adds an empty punchlist to the project') and scopes it with 'empty', which differentiates it from get_punchlist/list_punchlists. It references get_punchlist only to describe the returned shape rather than to route the agent, so sibling differentiation is implied rather than 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?
Gives a clear when-not: items cannot be added through this tool, they must be added in Contractor Foreman. That is actionable context an agent would otherwise have to guess. It stops short of naming sibling alternatives such as list_punchlists or get_punchlist for follow-up.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_purchase_orderCreate purchase orderA
Creates a draft purchase order to a supplier with line items, optionally for a project.
Creates a Contractor Foreman purchase order in Draft status, ordered by the signed-in user: subject, supplier, project, order date, notes and line items (description, quantity, unit, unit cost, cost type). The supplier is not notified. Sending the PO stays a step in the app. Returns the saved order.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | Line items. The total is the sum of quantity times unit cost. | |
| notes | No | ||
| subject | Yes | ||
| vendor_id | Yes | The supplier's contact_id (list_contacts type vendor). | |
| order_date | No | YYYY-MM-DD. Default: today. | |
| project_id | No | The project the order is for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, open-world, non-idempotent, non-destructive mutation. The description adds important behavior beyond that: the order is created in Draft status, ordered by the signed-in user, the supplier is not notified, and sending remains a separate app step. It also says the saved order is returned.
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 and appropriately sized for a create tool. There is some redundancy between the first sentence and the second sentence, which both say it creates a purchase order, but the repetition is minor and the key behavioral caveats are clear.
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 six-parameter mutation tool with no output schema, the description covers the core behavior: draft status, supplier notification, sending as a separate step, and returning the saved order. The return value is only described as 'the saved order' without shape details, but the essential call context is present.
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 67%, and the description lists the main fields (subject, supplier, project, order date, notes, line items and line-item fields) but mostly restates what the schema already documents. It adds little detail about required fields, vendor_id semantics, date formatting, 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 states a specific verb and resource: creates a draft purchase order to a supplier with line items, optionally for a project. It also distinguishes the action from sending the PO, which it explicitly says remains an app step. An agent can tell what this tool does 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 makes clear this is for creating a draft PO, not for sending it, and notes the supplier is not notified. That provides useful usage context. It does not explicitly compare against sibling creation tools such as create_bill, so it falls short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_rfiCreate RFIA
Drafts a request for information on a project, with the question and a reply-by date.
Creates a Contractor Foreman RFI in Draft status on a project, from the signed-in user, dated now: title, question, the area and plan sheet it refers to and the date a response is needed by. It is not sent to anyone. Submitting it to the architect or owner stays a step in the app. Returns the saved RFI.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| question | Yes | The information requested. | |
| plan_sheet | No | Plan sheet number. | |
| project_id | Yes | The project the question is about. | |
| reference_area | No | Area or element it refers to. | |
| response_needed_by | No | YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral context beyond the annotations: the record is created in Draft status, attributed to the signed-in user, dated now, and no notification is dispatched — none of which the readOnly/destructive/openWorld hints convey. It does not address what happens on repeat calls, which matters given idempotentHint=false, leaving a small 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?
Two front-loaded sentences with no wasted filler, and the critical 'not sent to anyone' caveat is prominent. There is mild redundancy between the opening sentence and the second sentence's field enumeration.
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 no output schema, the description correctly closes the loop with 'Returns the saved RFI,' and it covers status, attribution, and notification behavior. It omits failure modes (e.g., an invalid project_id) but nothing essential for a correct call is missing.
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 coverage is 83% and five of six properties already carry descriptions, so the schema does the heavy lifting. The description only restates the field set (title, question, area, plan sheet, reply-by date) in prose without adding format or constraint detail beyond what the schema provides — baseline 3.
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 and resource ('Creates a Contractor Foreman RFI ... on a project') plus the resulting status ('Draft'), which distinguishes it from get_rfi/list_rfis and from the many other create_* siblings. An agent can tell exactly what is produced 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?
Explicitly bounds the tool's role: 'It is not sent to anyone. Submitting it to the architect or owner stays a step in the app,' which tells the agent when this tool suffices and when a further app-side action is needed. It doesn't name a sibling alternative (none exists for send), so it falls slightly 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.
create_service_ticketCreate service ticketA
Opens a service ticket for a customer, optionally scheduled for a date and time.
Creates a Contractor Foreman service ticket for a customer from the Directory: title, description, an optional project and the planned service date and time. The service address is the customer's (or the project's). With a date it is Scheduled, without one Unscheduled. Technicians are assigned in the app. The customer is not notified. Returns the saved ticket, with service_time on the 12-hour clock (02:00 PM).
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| project_id | No | Links the ticket to a project. The service address is then the project's. | |
| customer_id | Yes | A customer's contact_id (list_contacts type customer). | |
| description | No | What the customer reported. | |
| service_date | No | Planned visit, YYYY-MM-DD. The ticket is then Scheduled. | |
| service_time | No | Planned time on the 24-hour clock, like 13:30. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses that technicians are assigned in the app rather than here, that the customer is not notified, that the service address is inherited from customer or project, and that the status is derived from presence of a date. It even flags that service_time is echoed back on a 12-hour clock while the input takes 24-hour, a non-obvious format switch an agent would otherwise get wrong.
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?
Front-loaded with the action, then the operational details, with no filler. The opening clause is somewhat restated by the following sentence, a minor redundancy in an otherwise dense and purposeful paragraph.
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?
There is no output schema, and the description compensates by describing the return value ('returns the saved ticket, with service_time on the 12-hour clock'). Combined with the notification and assignment caveats, an agent has everything needed to call it and interpret the 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?
Schema coverage is 83%, so the schema already carries most parameter meaning; the description adds value by explaining the customer/project address inheritance and the date-drives-status relationship. It doesn't restate constraints like maxLength or the time pattern, which is appropriate given the schema handles those.
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 and resource ('Opens a service ticket for a customer') and scopes it to a Contractor Foreman service ticket built from a Directory customer. It is trivially distinguishable from get_service_ticket, list_service_tickets, and update_service_ticket_status.
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?
Gives clear context for when the tool applies: customer from the Directory, optional project, and an optional planned visit that flips the ticket between Scheduled and Unscheduled. It does not, however, mention alternatives or exclusions (e.g., when to use create_work_order instead), so it stops short of a full routing statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_sub_contractCreate sub-contractA
Creates a draft sub-contract with a subcontractor on a project.
Creates a Contractor Foreman sub-contract in Draft status, issued by the signed-in user, for a project and a subcontractor from the Directory, with subject, agreement number and date. This API cannot add scope items, terms or send it for signature. Those stay steps in the app. The subcontractor is not notified. Returns the saved sub-contract.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | YYYY-MM-DD. Default: today. | |
| subject | Yes | ||
| project_id | Yes | The project the work is for. | |
| contractor_id | Yes | The subcontractor's contact_id (type contractor). | |
| agreement_number | Yes | Your agreement number, e.g. the project number and a sequence (BP-2001-07). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that the result is created in Draft status, issued by the signed-in user, that the subcontractor is not notified, and that no signature workflow is triggered. These are meaningful behavioral consequences for a mutation 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 front-loaded and well organized, but the first sentence largely duplicates the second sentence's summary of the same action. It is still efficient and readable, with only minor redundancy.
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 draft-creation tool with no output schema, the description covers creation status, required contextual inputs, workflow limitations, notification behavior, and the returned object. An agent has enough information to invoke it correctly and understand what will not happen.
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 coverage is 80%, so most parameter meaning is already documented. The description reinforces that the subcontractor must come from the Directory and lists the key inputs, but it does not add substantial syntax or format detail 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 uses a specific verb and resource ('Creates a draft sub-contract') and clearly distinguishes this operation from retrieval siblings like get_sub_contract or list_sub_contracts. It also states the creation context: project, subcontractor from Directory, subject, agreement number, and date.
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 explicitly limits scope by saying the API cannot add scope items, terms, or send for signature, and notes those remain app steps. It also states the subcontractor is not notified, giving clear when-not guidance and setting expectations about what must happen elsewhere.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_todoCreate to-doADestructive
New to-do, optionally on a project, with due date, priority and assignees.
Adds a to-do and returns it as get_todo shows it. Assignees see it in their Contractor Foreman app.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | What has to be done. | |
| due_date | No | ||
| due_time | No | e.g. 09:00 or 2:30 PM. | |
| priority | No | medium | |
| project_id | No | Project from list_projects. | |
| description | No | ||
| assignee_ids | No | contact_id values from list_contacts of the employees or contacts who should do it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose that this is a non-idempotent, destructive, open-world write. The description adds valuable context beyond that: it states the return shape ('returns it as get_todo shows it') and a side effect ('Assignees see it in their Contractor Foreman app'). It does not explain why the operation is destructive, but the annotations carry that signal.
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 tightly written sentences. The first sentence front-loads what the tool does and key optional fields; the second efficiently adds return behavior and visibility. No wasted words.
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 7 parameters, 1 required, no output schema, and annotations covering safety and openness, the description is nearly complete. It covers return behavior and a key side effect, though it could explicitly note that 'name' is the only required field and what happens if an invalid project_id is supplied.
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 coverage is 57%, so several parameters (name, project_id, assignee_ids) are documented in the schema. The description groups the optional fields ('optionally on a project, with due date, priority and assignees') but adds no syntax or format details beyond what the schema provides, leaving due_time and description unmentioned.
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 ('New') and resource ('to-do') and lists optional fields (project, due date, priority, assignees). This clearly distinguishes it from get_todo, list_todos, and update_todo, though it does not explicitly name alternatives.
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 this tool is for creation but provides no explicit when-to-use guidance, no prerequisites, and no comparison to sibling tools like create_punchlist, create_rfi, or update_todo. An agent must infer its place in the workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_work_orderCreate work orderA
Creates an Open work order on a project with subject, description and dates.
Creates a Contractor Foreman work order in Open status on a project, issued by the signed-in user, for the project's customer: subject, description, start and end date. It has no line items. Nobody is notified, and sending it to the customer stays a step in the app. update_work_order_status moves it on. Returns the saved order.
| Name | Required | Description | Default |
|---|---|---|---|
| subject | Yes | ||
| end_date | No | YYYY-MM-DD, not before start_date. Default: today. | |
| project_id | Yes | The project the work is on. | |
| start_date | No | YYYY-MM-DD. Default: today. | |
| description | No | What has to be done. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses the created status (Open), issuer (signed-in user), recipient (project's customer), that there are no line items, that nobody is notified, and that the order is returned on success. This is rich mutational context the annotations do not carry.
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?
Front-loaded with the outcome, but the second sentence re-states subject, description and dates already given in the first, wasting space. It is efficient in tone but contains noticeable redundancy.
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 create tool with annotations covering safety and no output schema, the description supplies the full behavioral picture plus a return-value note ('Returns the saved order'). Nothing an agent needs to invoke it correctly is missing.
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 coverage is 80% and already documents project_id, subject, description, and date defaults/format. The description names the same fields but adds no syntax or constraint detail beyond the schema, so it sits at the baseline.
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 (Creates) and resource (work order) with the resulting status (Open) and key fields, and distinguishes the operation from the large create_* sibling set. An agent can tell exactly what it produces 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?
Routes the agent to update_work_order_status for advancing status and clarifies that sending to the customer 'stays a step in the app', implicitly steering away from any send tool. No explicit when-not guidance, but the lifecycle context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_change_orderDelete change orderADestructive
Deletes a change order or change order request for good.
Deletes the change order and its items. It cannot be undone. To keep the record, use update_change_order with status denied instead.
| Name | Required | Description | Default |
|---|---|---|---|
| change_order_id | Yes | From list_change_orders. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so the basic safety profile is covered. The description adds important behavioral detail by stating that associated items are also deleted and that the deletion is permanent, though it does not mention permissions or confirmation 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?
Three short sentences with no wasted text. The irreversible consequence is front-loaded, followed by cascade behavior and the safer alternative.
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 destructive delete tool with no output schema, the description covers the essential decision context: permanence, cascade deletion, and the recommended alternative. The parameter source is already covered by the schema.
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 coverage is 100%, and the single parameter is documented in the schema as coming from list_change_orders. The description does not add meaning beyond that, 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 states a specific verb and resource: deleting a change order or change order request, including its items. It clearly distinguishes deletion from the sibling alternative update_change_order.
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 explicitly says the action cannot be undone and names the exact alternative for preserving the record: update_change_order with status denied. This gives the agent a clear when-to-use versus when-not-to-use rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_estimateDelete estimateADestructive
Deletes an estimate for good.
Deletes the estimate and its line items, as Delete in the estimate's menu does. Records made from it (projects, change orders, invoices) stay. It cannot be undone. To keep the history, use update_estimate with status lost instead.
| Name | Required | Description | Default |
|---|---|---|---|
| estimate_id | Yes | From list_estimates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and non-idempotent, but the description adds what annotations cannot: line items are destroyed, downstream records (projects, change orders, invoices) survive, and the deletion mirrors the UI's Delete menu item. It also states irreversibility in plain words.
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?
Four short sentences, front-loaded with the action and consequence, then the cascade scope, then the safer alternative. 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?
For a one-parameter destructive mutation with no output schema, everything an agent needs is present: what is destroyed, what is preserved, irreversibility, and the non-destructive alternative.
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 coverage is 100% and the only parameter is documented as 'From list_estimates,' so the description need not repeat it. Baseline would be 3; the description earns a point for making clear the single identifier targets the estimate whose children are also deleted.
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 and resource ('Deletes an estimate for good') and immediately disambiguates from sibling delete tools (delete_invoice, delete_change_order) by naming the exact object and its cascade semantics.
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?
Gives an explicit when-not with a named alternative: 'To keep the history, use update_estimate with status lost instead.' An agent has a clear decision rule between hard delete and status change.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_invoiceDelete invoiceADestructive
Deletes an invoice that has no payments, for good.
Deletes the invoice and its items. It cannot be undone. An invoice with payments recorded is refused. For that one, or to keep the record, use update_invoice with status write_off or denied.
| Name | Required | Description | Default |
|---|---|---|---|
| invoice_id | Yes | From list_invoices. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds substantive detail: cascading deletion of invoice items, irreversibility ('cannot be undone'), and the payment-based guard. That is exactly the extra context the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and scope in the first sentence, then adds the irreversibility warning and the fallback path. Four short sentences, none wasted.
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 single-parameter destructive tool with no output schema, the description covers consequences, preconditions, and the alternative route. An agent has everything needed to call it safely or avoid it.
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?
Only one parameter with 100% schema coverage, and the schema already states it comes from list_invoices. The description adds no format or sourcing detail beyond that, so baseline 3 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 and resource (deletes an invoice) plus a distinguishing precondition (has no payments, for good). It is clearly separable from sibling deleters like delete_change_order and delete_estimate by naming the resource.
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?
Explicitly names the case where the tool refuses (invoice with payments recorded) and routes the agent to a concrete alternative: update_invoice with status write_off or denied. Both when-to-use and when-not are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_billGet billARead-onlyIdempotent
One vendor bill with its line items, dates, total, balance due and status.
Reads one Contractor Foreman bill by bill_id: what list_bills gives plus the payment terms and every line item with description, cost type, quantity, unit, unit cost, total and cost code.
| Name | Required | Description | Default |
|---|---|---|---|
| bill_id | Yes | bill_id from list_bills. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds the useful disclosure of what the response contains (line items with description, cost type, quantity, unit, unit cost, total, cost code) — genuine value beyond annotations, though permission or rate-limit behavior isn't mentioned.
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 tight sentences, front-loaded with the outcome and immediately followed by the concrete returned fields. 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?
There is no output schema, so the description carries the return-value burden and does so by enumerating the line-item fields and header fields. Combined with annotations covering the safety profile, an agent has enough to call 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% and the single parameter already says 'bill_id from list_bills'. The description repeats the same provenance without adding format, range, or failure semantics, so baseline 3 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 and resource ('Reads one Contractor Foreman bill by bill_id') and explicitly positions it relative to the list tool: 'what list_bills gives plus the payment terms and every line item'. An agent can tell it apart from list_bills and other get_* siblings without opening a 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 reference to list_bills ('bill_id from list_bills', 'what list_bills gives plus...') makes the list-then-detail workflow clear. It never states an explicit exclusion or when-not-to-use case, so it stops 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.
get_change_orderGet change orderARead-onlyIdempotent
One change order or request with description, status, total and line items.
Everything on one change order or change order request: number, title, status, project, customer, date, the reason (description), the estimate it came from, time delay and the priced line items.
| Name | Required | Description | Default |
|---|---|---|---|
| change_order_id | Yes | From list_change_orders. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, open-world behavior, so the safety profile is covered. The description adds useful behavioral context by enumerating what is returned: description, status, total, project, customer, date, reason, source estimate, time delay, and priced line items.
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 short and front-loaded, with the main purpose in the first sentence and return details in the second. There is minor repetition between 'One change order or request' and 'Everything on one change order or change order request', but the field enumeration 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 simple single-record retrieval tool with no output schema, the description provides enough detail about the returned fields and the annotations cover safety and idempotency. It does not mention not-found behavior, but that is a minor gap for this retrieval 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?
There is only one parameter and the schema describes it fully as coming from list_change_orders, giving 100% schema coverage. The description adds no additional parameter semantics beyond what the schema already states, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource as a single change order/change order request and enumerates the data returned, distinguishing it from list_change_orders by emphasizing 'One'. It lacks an explicit action verb like 'retrieve', but the tool name and content make the purpose 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?
Usage is implied by 'One change order or request' and the schema note that the ID comes from list_change_orders, but the description itself gives no explicit when-to-use guidance or alternatives. An agent can infer this is for fetching a single record rather than listing or mutating.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_clock_statusGet clock statusARead-onlyIdempotent
Who is clocked in right now, whether you are, and this and last week's crew hours.
Reads the Contractor Foreman Time Cards dashboard: the employees clocked in at this moment with their project and clock-in time, whether the signed-in user is clocked in (and that card's id), and the regular, overtime and total hours of the whole team and of the signed-in user for this week and last.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so safety is covered by structured data. The description adds real value by disclosing the backing source ('Contractor Foreman Time Cards dashboard') and the exact shape of what comes back, which matters because there is no output schema. It does not mention permission scoping (e.g. whether results are limited to projects the user can see).
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 lead sentence front-loads the three things an agent gets, and the second sentence supplies detail. The second sentence is long and enumerative, but given the absence of an output schema that detail 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?
With no output schema, the description carries the burden of explaining return values and does so thoroughly — current clock-ins, the caller's own status plus card id, and week-over-week hour breakdowns by category. What is missing is any note on empty-state behavior (what happens when nobody is clocked in) or scope/visibility limits.
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 takes zero parameters, so the baseline is 4. The description correctly implies no input is needed, framing the call as a context-free snapshot.
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 concrete verb+resource ('Who is clocked in right now... crew hours') and enumerates exactly what is covered: current clock-ins with project and time, the signed-in user's own status and card id, and team/user regular/overtime/total hours for this and last week. It is clearly distinct from list_time_cards and list_project_crew_hours in substance, though it never names those siblings, which is the only thing keeping it from a 5.
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?
'Right now' implies the snapshot use case, but there is no explicit statement of when to call this versus list_time_cards or list_project_crew_hours, and no prerequisites or exclusions are given. Usage is inferable from the described output rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contactGet contactARead-onlyIdempotent
One Directory record in full: contact details, status, services, terms and additional contacts.
Reads one Contractor Foreman Directory record by contact_id: everything list_contacts gives plus a second phone, fax, website, status, services, tags, default payment terms, referral source, the date it was added and the additional contacts kept under it. For leads also stage and quality. Login details, wages and personal ids of employees are left out.
| Name | Required | Description | Default |
|---|---|---|---|
| contact_id | Yes | contact_id from list_contacts or list_leads. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description usefully adds a disclosure the annotations cannot: login details, wages and personal ids of employees are deliberately omitted, which tells the agent not to expect those fields. It says nothing about permissions or pagination, so a 3 is fair.
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 tight sentences with the resource and full field set front-loaded, followed by the exclusions. The opening fragment 'One Directory record in full' is slightly clipped as a sentence but functions well as a headline; nothing is padded.
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 no output schema, the description carries the return-shape burden and does so by enumerating the fields returned and explicitly naming what is omitted. For a one-parameter read tool with strong annotations, an agent has everything needed to call it and interpret the 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?
Schema coverage is 100% and the single parameter's description already names its source. The description's mention of list_contacts only restates that origin and adds no format or edge-case detail (e.g. what happens with an id from list_leads), so baseline 3 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 ('Reads one ... Directory record by contact_id') and a concrete resource, and the field inventory ('second phone, fax, website, status, services, tags, default payment terms...') makes it unmistakably the single-record counterpart to list_contacts. An agent can distinguish it from sibling get_* tools purely by resource name.
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 'everything list_contacts gives plus...' implicitly routes listing to list_contacts and detail to this tool, and the schema note points at list_leads as another id source. There is no explicit 'do not use when' statement or guidance on lead vs contact selection, keeping it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_daily_logGet daily logARead-onlyIdempotent
One daily log: work notes, people and visitors, materials, equipment, weather and delays.
Returns one daily log in full: the work performed, crew notes and employees on site, visitors, materials, equipment used with hours, the weather Contractor Foreman recorded for the date and the address (temperatures in both scales, the day's conditions), your weather notes and any weather or schedule delay. Read only.
| Name | Required | Description | Default |
|---|---|---|---|
| daily_log_id | Yes | daily_log_id from list_daily_logs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful detail about what fields are returned, but 'Read only' merely repeats the annotation and it does not discuss behavior for invalid IDs, missing permissions, or not-found cases.
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 definition is front-loaded and appropriately sized for a retrieval tool without an output schema. It has minor redundancy between 'One daily log' and 'Returns one daily log in full,' plus a trailing 'Read only' that repeats the annotation, but it remains readable and efficient.
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?
Because there is no output schema, the description carries the burden of explaining return contents and does so thoroughly: work notes, crew, visitors, materials, equipment hours, weather, address, and delays. It is complete enough to call correctly, though it does not address error cases or access requirements.
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 has 100% schema description coverage, and the schema explains that daily_log_id comes from list_daily_logs. The description itself does not add any parameter meaning beyond the schema, so the baseline 3 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?
The description clearly states a specific retrieval action: it returns one daily log in full and enumerates the included data such as work performed, visitors, materials, equipment, weather, and delays. It distinguishes a single daily log from the list-oriented sibling conceptually via 'One daily log,' but does not explicitly name list_daily_logs or update_daily_log as alternatives.
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 'One daily log' and 'Returns one daily log in full,' suggesting it is used to fetch details for a specific daily log ID. However, the description does not explicitly say when to use this tool versus list_daily_logs, create_daily_log, or update_daily_log, nor does it state prerequisites beyond 'Read only.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_estimateGet estimateARead-onlyIdempotent
One estimate with customer, dates, terms, totals and every line item.
Everything on one estimate: status, project, customer contact, estimate and expiry dates, billing type, description, inclusions, exclusions, terms, totals in dollars and the line items by section (type, quantity, unit, unit cost, markup, total, cost code). section_id is what add_estimate_items takes to put new items in a section.
| Name | Required | Description | Default |
|---|---|---|---|
| estimate_id | Yes | From list_estimates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so safety is covered. The description adds real value beyond that by disclosing the shape of the payload — totals in dollars, line items grouped by section with their fields — which matters since no output schema exists.
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?
Front-loaded with the core statement, then a dense but purposeful inventory of returned fields. The long parenthetical enumerating line-item fields is justified given there's no output schema, though it reads as a list dump rather than structured prose.
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 no output schema, the description does the heavy lifting by describing return contents in detail, plus it links section_id to add_estimate_items for follow-up actions. Missing only edge details such as behavior when estimate_id is invalid or permission requirements.
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 coverage is 100% and the single estimate_id parameter is documented as coming 'From list_estimates,' so the description has little left to add. The section_id explanation is about the return payload, not an input parameter, so it doesn't lift this above baseline.
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+resource: fetches a single estimate and enumerates what comes back (customer, dates, terms, totals, line items). The singular framing implicitly contrasts with list_estimates, but it never names that sibling as the way to discover IDs the way a top-tier definition would.
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 only implied — an agent infers this is the detail-fetch for one estimate. The one explicit routing hint ('section_id is what add_estimate_items takes') gives a useful workflow link, but there is no statement of when to prefer this over list_estimates or update_estimate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_expenseGet expenseARead-onlyIdempotent
One expense with amount, date, vendor, project, cost type, cost code and reason.
Reads one Contractor Foreman expense by expense_id: what list_expenses gives plus the cost code and the reason written on it.
| Name | Required | Description | Default |
|---|---|---|---|
| expense_id | Yes | expense_id from list_expenses. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered. The description adds useful field-level context (cost code, reason) but says nothing about error behavior for an invalid expense_id or whether the record is scoped to a contractor. Adequate but with clear gaps for a read tool with annotations present.
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, front-loaded with the returned field set and followed by the sibling comparison. There is mild repetition between 'One expense with...' and 'Reads one ... expense', but no wasted 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 single-parameter read with full annotation coverage and full schema coverage, this is close to complete: it names the resource, the identifier, and the returned fields. Only minor behavioral details (invalid ID handling, scoping) are absent, and no output schema exists, so the field list is a helpful substitute.
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 single expense_id parameter is already documented as coming from list_expenses. The description reinforces the provenance ('Reads ... by expense_id') but adds no syntax, format or constraint detail 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?
States a specific verb and resource ('Reads one Contractor Foreman expense by expense_id') and enumerates the returned fields. It explicitly differentiates itself from the sibling list_expenses by noting it adds the cost code and reason.
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 second sentence clarifies that this tool returns what list_expenses gives plus extra detail, which strongly implies when to choose it over the list tool. It stops short of an explicit 'use this when you need X, not Y' instruction but the routing signal is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_inspectionGet inspectionARead-onlyIdempotent
One inspection with type, project, date, result, agency, inspector and notes.
Reads one Contractor Foreman inspection by inspection_id, with the same fields as list_inspections.
| Name | Required | Description | Default |
|---|---|---|---|
| inspection_id | Yes | inspection_id from list_inspections. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive, so safety is covered. The description adds the field list returned and the source system, which is useful since there is no output schema, but it omits behavior on a missing ID or permission errors.
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, front-loaded with the field inventory, with no filler. The trailing clause 'with the same fields as list_inspections' slightly repeats the opening list.
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 one-parameter read with no output schema, enumerating the returned fields gives the agent what it needs to decide whether to call or list first. Only failure-mode behavior is left out.
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 coverage is 100% and the single parameter is already documented as 'inspection_id from list_inspections.' The description only restates that the read is keyed by inspection_id, adding no new syntax or format detail.
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 and resource ('Reads one Contractor Foreman inspection by inspection_id') and enumerates the returned fields. It is clearly distinguishable from list_inspections, though it never names sibling tools explicitly.
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 only implied: the reference to inspection_id implies a lookup-after-list workflow, but there is no explicit when-to-use, when-not-to-use, or statement of what to do if the ID is unknown or invalid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_invoiceGet invoiceARead-onlyIdempotent
One invoice with customer, dates, terms, line items, payments and balance due.
Everything on one invoice: status, project, customer and their email, invoice and due dates, terms, retainage, total, amount paid and balance due in dollars, the line items and every payment recorded against it (date, amount, method, status).
| Name | Required | Description | Default |
|---|---|---|---|
| invoice_id | Yes | From list_invoices. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds genuine value by disclosing the exact contents of the response (payments with date, amount, method, status; retainage; balance due in dollars), which matters because there is no output schema. It omits error behavior for an invalid/missing invoice_id.
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, front-loaded with the resource and its scope. The second sentence largely restates the first's field list with more detail, so there is mild redundancy, but 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?
With no output schema, the description carries the return-value burden and does so thoroughly. What's missing is minor: behavior on a nonexistent invoice and any permission/scope requirements.
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?
Only one parameter and schema coverage is 100% – the schema itself says 'From list_invoices.' The description adds no format or constraint detail for invoice_id, so baseline 3 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 (get) and resource (invoice) and enumerates the payload: status, project, customer, dates, terms, retainage, totals, line items, payments. An agent can tell it returns a single fully-hydrated invoice rather than a list, though the description never names list_invoices as the contrasting sibling.
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 when-to-use or when-not-to-use guidance, and no explanation of the relationship to list_invoices or update_invoice. Usage is only inferable from the name and the detailed field list; the only routing hint ('From list_invoices') lives in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_job_costingGet job costingARead-onlyIdempotent
Estimated and actual cost per cost code for one project, with the difference and totals.
Sums the project's Job Cost Actual report per cost code: contract value, estimated cost (from the Schedule of Values or the approved estimates, plus change orders), actual cost split into bills, expenses, time cards and equipment, the difference (estimated minus actual, negative means over) and the amount invoiced. Time card hours are priced at labor_rate (default burden_rate). Costs with no cost code are under Unassigned. Amounts are in dollars. Read only.
| Name | Required | Description | Default |
|---|---|---|---|
| labor_rate | No | Rate that prices time card hours as labor cost. | burden_rate |
| project_id | Yes | project_id from list_projects. | |
| budget_from | No | Estimated cost from the Schedule of Values or the approved estimates. Default: the project's own setting. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, idempotent, non-destructive profile, yet the description still adds substantial interpretive context: what each cost bucket contains, that negative difference means over budget, that unpriced costs fall under Unassigned, that time card hours are priced via labor_rate, and that amounts are dollars. This is exactly the behavior an agent needs to interpret the numbers correctly.
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 first sentence front-loads the result shape, and the second packs the derivation rules. It is dense but every clause carries information; only the trailing 'Read only' repeats what the annotations already declare.
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?
There is no output schema, so the description must describe the returned fields, and it does: contract value, estimated, actual split, difference, and invoiced amount. For a 3-parameter aggregation tool this leaves no material 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?
Schema coverage is 100%, so the baseline is 3, but the description genuinely adds meaning: it clarifies that labor_rate prices time card hours and defaults to burden_rate, and that budget_from draws from the Schedule of Values or approved estimates plus change orders. That goes beyond the schema's terser wording.
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 resource and scope: estimated vs. actual cost per cost code for one project, with difference and totals. That is far more precise than the sibling list_cost_items or get_estimate, though it never names a sibling to contrast with explicitly.
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 usage by identifying its source (the Job Cost Actual report) and its aggregate nature, so an agent can infer this is the reporting/roll-up tool rather than a line-item lister. However, it never says when to prefer it over list_cost_items, get_estimate, or get_change_order, and gives no prerequisites beyond the schema's project_id note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_opportunityGet opportunityARead-onlyIdempotent
One opportunity in full: customer contact, stage, score, budget, notes and last activity.
Reads one Contractor Foreman opportunity by opportunity_id: what list_opportunities gives plus the customer's email and phone, the notes and the subject of the last sales activity.
| Name | Required | Description | Default |
|---|---|---|---|
| opportunity_id | Yes | opportunity_id from list_opportunities. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, so the safety profile is covered; the description adds that this is a single-record read keyed by ID and spells out the extra fields returned beyond the list view. It does not say what happens if the ID is unknown or belongs to another tenant, which is the one behavioral 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?
Field list is front-loaded and the two sentences are short. There is mild redundancy: the second sentence re-describes the same payload ('what list_opportunities gives plus…') already implied by the first, costing a few words without adding new 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?
With no output schema, the description carries return-value disclosure and does so adequately by naming the fields an agent will receive. For a one-parameter read-only getter it is nearly sufficient; error/not-found behavior is the only missing piece an agent might need.
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 sole parameter already documents 'opportunity_id from list_opportunities.' The description restates the same keying ('by opportunity_id') without adding format, range, or sourcing detail beyond the schema, so the baseline 3 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+resource ('Reads one Contractor Foreman opportunity by opportunity_id') and enumerates the returned fields in the opening line. It also distinguishes itself from the sibling list_opportunities by describing this as 'what list_opportunities gives plus' the customer's email/phone, notes and last activity subject.
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 clearly implied: this is the single-record counterpart to list_opportunities, and the description ties itself to that sibling both for purpose and for sourcing the ID. It stops short of an explicit 'use this when you already have an ID, otherwise call list_opportunities' exclusion, but the routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_projectGet projectARead-onlyIdempotent
One project: customer, address, stage, dates, contract amounts, costs, billing and retainage.
Returns one project. The revised contract amount is the original contract plus approved change orders, as the project shows it. Costs are budgeted, committed and actual. Billing is invoiced, paid and outstanding invoices, with retainage held shown apart. Amounts are in dollars. Use project_id from list_projects.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | project_id from list_projects. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, so the safety profile is covered; the description adds real value by defining what the returned figures mean (revised contract = original + approved change orders, costs split budgeted/committed/actual, billing split invoiced/paid/outstanding, retainage shown apart) and that amounts are in dollars. It stops short of noting error behavior for an unknown id or any limits, keeping it below a 5.
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 field list is front-loaded and the semantic clarifications are compact, with every sentence carrying information. The opening fragment 'One project:' and the following 'Returns one project' are mildly redundant, costing a small amount of efficiency.
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?
There is no output schema, so the description must carry the return semantics, and it does so thoroughly for a single-record read tool. What is missing is minor: behavior on a nonexistent id and whether any related collections are truncated.
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?
With one parameter at 100% schema description coverage, the schema already documents project_id including its numeric pattern. The description repeats the same 'project_id from list_projects' guidance without adding format or edge-case meaning, so the baseline 3 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?
The description states the resource ('One project') and enumerates the returned facets (customer, address, stage, dates, contract amounts, costs, billing, retainage), which lets an agent distinguish it from list-style siblings. It is specific, though it never uses a crisp verb like 'fetch' and leans on the name for the action.
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 directs the agent to 'Use project_id from list_projects,' which implicitly defines the browse-then-fetch workflow against the sibling lister. However, it states no conditions for when not to use it and does not address alternatives such as get_job_costing for cost detail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_punchlistGet punchlistARead-onlyIdempotent
One punchlist: project, address, customer and how many items are open and completed.
Returns one punchlist with its project, the project address and customer, the number of open and completed items, who made it and when. The items themselves are not returned yet: open the punchlist in Contractor Foreman to see them. Read only.
| Name | Required | Description | Default |
|---|---|---|---|
| punchlist_id | Yes | punchlist_id from list_punchlists. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, and the description is consistent ('Read only.'). It adds real context beyond them: which fields come back, and the important caveat that line items are excluded and must be viewed in Contractor Foreman.
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?
Front-loaded and short, but the first fragment largely restates the second sentence ('project, address, customer' and 'open and completed' appear twice). One sentence of duplication keeps it from a 5.
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?
There is no output schema, so the description carries the burden of describing return values — which it does thoroughly, including the notable absence of line items. Only error behavior for an invalid id is unaddressed.
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 coverage is 100% and the single punchlist_id parameter is already documented with its source ('from list_punchlists'). The description adds no syntax or format guidance beyond what the schema provides, so baseline 3 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?
The description states a specific verb and resource ('Returns one punchlist') and enumerates the fields returned: project, address, customer, open/completed item counts, creator and timestamp. The singular 'one punchlist' implicitly separates it from list_punchlists, but no sibling is named outright.
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 rather than stated: the id comes 'from list_punchlists', and the description warns the items themselves are not returned. It never explicitly says when to call this vs. list_punchlists, but the limitation note effectively steers the agent away from expecting item detail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_purchase_orderGet purchase orderARead-onlyIdempotent
One purchase order with supplier, dates, status and its line items.
Reads one Contractor Foreman purchase order by purchase_order_id: what list_purchase_orders gives plus every line item with description, cost type, quantity, unit, unit cost, total and cost code.
| Name | Required | Description | Default |
|---|---|---|---|
| purchase_order_id | Yes | purchase_order_id from list_purchase_orders. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), so the description spends its words on what extra data comes back – every line item with description, cost type, quantity, unit, unit cost, total and cost code. It omits behavior on a missing/invalid id, which is the main remaining 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?
Two short sentences, front-loaded with the identity of the returned object, then the detail expansion. No filler or repetition of annotation facts.
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 no output schema, the description carries the return-value burden and does so by enumerating line-item fields, though it partly defers to 'what list_purchase_orders gives' rather than naming those base fields outright.
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?
Only one parameter with 100% schema coverage and the schema already says 'purchase_order_id from list_purchase_orders'. The description reinforces that the id identifies a single PO and names its provenance, adding small but consistent meaning.
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+resource ('one purchase order with supplier, dates, status and its line items') and explicitly contrasts it with the list sibling ('what list_purchase_orders gives plus every line item'), so an agent can distinguish the two without opening 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 comparison to list_purchase_orders makes the selection context clear: use this when you need a single PO expanded with line items. It doesn't state exclusions or error conditions, but the sibling contrast does most of the routing work.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_rfiGet RFIARead-onlyIdempotent
One RFI with its question, dates, answer and status.
Reads one Contractor Foreman RFI by rfi_id, with the same fields as list_rfis.
| Name | Required | Description | Default |
|---|---|---|---|
| rfi_id | Yes | rfi_id from list_rfis. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered. The description's added value is listing which fields come back and noting parity with list_rfis; it says nothing about what happens on an unknown rfi_id (error vs empty) or about auth scope.
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 lines, zero waste, with the resource and returned fields front-loaded. The opening line is a verbless fragment, which slightly blunts the action framing but keeps it 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?
For a one-parameter idempotent read with no output schema, the description adequately conveys what comes back and where the id originates. Only edge-case behavior (invalid id, missing RFI) is left unaddressed, which is a minor gap given the rich annotation set.
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 is a single parameter with 100% schema description coverage, and the schema already says 'rfi_id from list_rfis.' The description repeats that the lookup is by rfi_id but adds no type, format, or provenance detail beyond the schema, so the baseline 3 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 and resource ('Reads one Contractor Foreman RFI by rfi_id') and enumerates the fields returned (question, dates, answer, status). It implicitly separates itself from the plural list_rfis and the create_rfi write path, though it never names those siblings directly as alternatives.
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: fetch a single RFI when you already have an rfi_id, vs list_rfis for enumeration. There is no explicit when-to-use/when-not statement or naming of the alternative tool, so the agent must infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_service_ticketGet service ticketARead-onlyIdempotent
One service ticket with customer, service address, schedule, technicians and priority.
Reads one Contractor Foreman service ticket by service_ticket_id: what list_service_tickets gives plus the priority, planned duration, service address, the customer's phone and the hours logged on it.
| Name | Required | Description | Default |
|---|---|---|---|
| service_ticket_id | Yes | service_ticket_id from list_service_tickets. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so safety is covered; the description adds value by enumerating the payload contents (priority, planned duration, service address, customer phone, logged hours), which is exactly the sort of return-shape context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with the resource and key fields. There is mild repetition between the first sentence's field list and the second sentence's 'plus' clause, but nothing wasteful enough to obscure the call.
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 no output schema, the description does the right work by naming the notable fields returned, and the single-parameter surface needs little more. It stops short of describing shape or depth of nested entities (customer, technicians), which would be the remaining 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?
Schema coverage is 100% and the single parameter already documents its own provenance ('service_ticket_id from list_service_tickets'), so the description merely echoes the schema rather than adding format or lookup guidance. Baseline 3 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?
The description states a specific verb and resource ('Reads one Contractor Foreman service ticket by service_ticket_id') and explicitly positions it relative to list_service_tickets, so an agent can tell the two apart 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?
It establishes the relationship to list_service_tickets ('what list_service_tickets gives plus...' and 'service_ticket_id from list_service_tickets'), implying the list-then-get workflow, but never states an explicit when-not or an alternative for bulk retrieval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sub_contractGet sub-contractARead-onlyIdempotent
One sub-contract with subcontractor, amounts, retainage, scope of work and items.
Reads one Contractor Foreman sub-contract by sub_contract_id: what list_sub_contracts gives plus the scope of work text (HTML as saved) and the items added in the app, with quantity, unit cost, total and cost code. paid and balance come back null here. list_sub_contracts has them.
| Name | Required | Description | Default |
|---|---|---|---|
| sub_contract_id | Yes | sub_contract_id from list_sub_contracts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, non-destructive), and the description adds the context they cannot: that paid and balance return null from this endpoint, that scope of work comes back as HTML exactly as saved, and that line items include quantity, unit cost, total and cost code. The nullability caveat is exactly the kind of trait an agent would otherwise misread as missing data.
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 paragraphs, front-loaded with the one-line summary followed by the read semantics and the sibling comparison. No filler sentences; every clause carries either scope or a field-level fact.
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?
There is no output schema, so the description must carry the return shape, and it does: the field groups returned, the HTML format of scope of work, and which fields are null. For a single-parameter read tool this is complete enough to call correctly and interpret the response.
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 coverage is 100% and the schema description already says 'sub_contract_id from list_sub_contracts'; the description restates the same provenance without adding format, sourcing, or error behavior. Baseline 3 is appropriate since the schema does the work.
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 and resource ('Reads one Contractor Foreman sub-contract by sub_contract_id') and enumerates the payload: subcontractor, amounts, retainage, scope of work, items. The second sentence explicitly positions it against list_sub_contracts ('what list_sub_contracts gives plus...'), so the agent can distinguish it from the sibling without opening 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?
Usage is clear from context: this is the detail fetch complementing list_sub_contracts, and the note that paid/balance are null here while list_sub_contracts has them is an implicit routing rule for financial totals. It stops short of an explicit 'use X when / do not use this when' statement, so the agent must infer the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_submittalGet submittalARead-onlyIdempotent
One submittal with plan sheet, specification section, status, dates and its items.
Reads one Contractor Foreman submittal by submittal_id: what list_submittals gives plus the plan sheet and specification section and each submitted item with manufacturer, status and the date it was sent back.
| Name | Required | Description | Default |
|---|---|---|---|
| submittal_id | Yes | submittal_id from list_submittals. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world behavior, so the safety profile is covered. The description adds real value beyond that by enumerating the returned content, including nested submitted items with manufacturer, status, and return date — filling in for the absent output schema.
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, front-loaded with the key outcome (what fields come back) before the mechanism (lookup by submittal_id). There is mild redundancy between the first sentence's field list and the second sentence's restatement, but no wasted framing.
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 no output schema, the description correctly takes on the burden of describing return values and does so with a concrete field inventory. It stops short of noting failure behavior (e.g., invalid or missing submittal_id), which is the only material gap for a single-record read.
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 coverage is 100% and the single parameter already carries a description pointing back to list_submittals. The description restates the same provenance ('by submittal_id') without adding format or edge-case details, so the schema does the heavy lifting — baseline 3 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 and resource ('Reads one Contractor Foreman submittal by submittal_id') and immediately distinguishes itself from list_submittals by describing the extra fields it returns (plan sheet, specification section, items with manufacturer/status/return date). An agent can tell exactly what this returns versus the list sibling.
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 framing 'what list_submittals gives plus ...' implicitly tells the agent this is the detail follow-up to list_submittals, and the schema reinforces the dependency ('submittal_id from list_submittals'). It lacks an explicit when-to-use/when-not statement (e.g., 'use only when you need item-level detail'), so it stops 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.
get_time_cardGet time cardARead-onlyIdempotent
One time card or crew sheet with hours per employee and cost code.
Reads one Contractor Foreman time card by timecard_id: what list_time_cards gives plus one entry per employee and cost code with the hours worked and the entry's notes. A crew sheet lists every crew member.
| Name | Required | Description | Default |
|---|---|---|---|
| timecard_id | Yes | timecard_id from list_time_cards. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world, so the safety profile needs no restating. The description adds substantive non-annotated context about the payload shape — one entry per employee and cost code with hours and per-entry notes, plus the crew-sheet distinction.
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?
Front-loaded with the core purpose in the first sentence, followed by return-shape detail. 'A crew sheet lists every crew member' is slightly tangential but cheaply disambiguates a domain term; otherwise no wasted prose.
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?
No output schema exists, so the description carries the burden of describing the return value, and it does so usefully (per-employee/cost-code entries with hours and notes). It stops short of detailing error behavior for an invalid timecard_id or pagination, which for a single-record read 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?
With one parameter at 100% schema coverage, the schema already documents timecard_id and even its provenance from list_time_cards. The description reinforces that provenance but adds no format or validation detail beyond the schema, so the baseline of 3 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 and resource ('Reads one Contractor Foreman time card by timecard_id') and clarifies the payload relative to the list tool ('what list_time_cards gives plus one entry per employee and cost code'). It is clearly the single-record detail fetch complementing list_time_cards, though it never explicitly contrasts itself with siblings in the same way.
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?
'what list_time_cards gives plus...' establishes the selection logic: use this when you need per-employee/per-cost-code hours rather than the summary list, and it names list_time_cards as the id source. There are no explicit when-not-use cases or alternatives, keeping it just below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_todoGet to-doBRead-onlyIdempotent
One to-do: description, project, priority, status, due date, assignees and checklist.
Returns one to-do with its description, due date and time, assignees and checklist items. Read only.
| Name | Required | Description | Default |
|---|---|---|---|
| todo_id | Yes | todo_id from list_todos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so 'Read only' adds no new information. The description says nothing beyond that — no not-found behavior, no permission requirements, no pagination/limits — leaving the behavior for error cases 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?
Two sentences that restate the same field list twice (description, due date, assignees, checklist). It is short but has visible redundancy rather than front-loaded unique 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 single-parameter read tool with no output schema, the description does the important remaining job of naming the returned fields, which is genuinely useful. An agent has enough to call it correctly; only error/edge-case behavior is missing.
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 coverage is 100% and the todo_id property already states 'todo_id from list_todos', which is more useful than anything in the description. The description adds no format, scope, or sourcing detail beyond the schema, so baseline 3 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 ('Returns one to-do') and resource, and enumerates what is included (description, due date, assignees, checklist). It is clear what the tool does, though it never names list_todos as the sibling it differs from for bulk retrieval.
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 only implied: fetch a single to-do by id, where the id comes from list_todos (that link lives in the parameter schema, not the description). No explicit when/when-not guidance or alternative named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_work_orderGet work orderARead-onlyIdempotent
One work order with project, customer, status, dates, location, notes and items.
Reads one Contractor Foreman work order by work_order_id: what list_work_orders gives plus the location, notes and line items with quantity, unit cost and total.
| Name | Required | Description | Default |
|---|---|---|---|
| work_order_id | Yes | work_order_id from list_work_orders. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile: read-only, idempotent, open-world, non-destructive. The description adds useful return-content detail: project, customer, status, dates, location, notes, and line items with quantity, unit cost, and total. It does not discuss errors or auth, but for an annotated read tool this is reasonably transparent.
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 short and structured, first listing returned fields and then explaining the ID-based read and its delta over list_work_orders. It is slightly fragmentary at the start but contains no wasted sentences.
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 with rich annotations and no output schema, the description supplies enough return-field detail for an agent to understand what it will get. Nothing essential for correct invocation appears to be missing.
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 single parameter is already documented as a work_order_id from list_work_orders. The description reinforces that identifier source but adds no syntax or format detail 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 names a specific verb and resource: it reads one Contractor Foreman work order by work_order_id. It also distinguishes the tool from list_work_orders by saying this returns the list fields plus location, notes, and line items.
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 comparison to list_work_orders gives clear context for when to use this tool: when a single work order with extra detail is needed. It does not explicitly state exclusions or prerequisites, but the intended usage is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_billsList billsARead-onlyIdempotent
Vendor bills with vendor, project, dates, total, balance due and status.
Reads the Contractor Foreman Bills list, newest first: bill number, subject, vendor, project, bill date, due date, total, balance still due and status (Open, Paid). Filter by project or search. get_bill adds the line items.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | next_cursor from the previous call. | |
| search | No | Words to look for. | |
| project_id | No | Only this project's records. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds useful non-annotation behavior: results are newest first, specific status values (Open, Paid), and the exact fields returned. It omits pagination behavior, but the schema covers cursor semantics.
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?
Front-loaded with the resource and key fields, and the second sentence efficiently adds ordering, filtering, and sibling guidance. The first sentence partially repeats the field list in the second, which is mild redundancy.
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 no output schema, the description appropriately specifies the returned fields, statuses, and ordering. Annotations cover safety and idempotency, and the schema covers parameters, so the definition is largely complete despite not explaining pagination or result size.
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 75%, so baseline is 3. The description reinforces filtering by project or search but adds no syntax or format details beyond the schema, and it does not explain limit or clarify cursor usage.
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 and resource ('Reads the Contractor Foreman Bills list') and enumerates the returned fields, ordering, and status values. It explicitly distinguishes itself from the get_bill sibling by noting that get_bill adds line items.
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?
Gives clear usage context: filter by project or search, and use get_bill when line items are needed. It does not explicitly state when not to use it or name other list alternatives, but the sibling differentiation is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_change_ordersList change ordersARead-onlyIdempotent
Change orders and change order requests, newest first, with status, project and total.
The Change Orders list: number, title, kind (change_order or request), status, project, customer, date and total in dollars. Filter by project, kind, status or a search over title and number. Archived ones only with include_archived. Change orders have the statuses open, pending_approval, on_hold, approved, denied, billed. Requests have draft, on_hold, approved, denied, closed. A status that does not fit the kind stops the call. get_change_order gives the line items.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | request = change order requests (COR) not yet turned into a change order. | all |
| limit | No | ||
| cursor | No | next_cursor from the previous call. | |
| search | No | Matches the title or number. | |
| status | No | With kind all or change_order, a change order status. Request statuses need kind request. | |
| project_id | No | Only this project's (list_projects). | |
| include_archived | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the description adds value with new behavior: newest-first ordering, archived records hidden by default, and the failure mode where a status incompatible with the kind aborts the call. It does not cover pagination limits, which the schema handles.
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?
Front-loads the resource and ordering, then layers filters, statuses, and the sibling pointer. The opening clause about change orders/requests slightly duplicates the following field list, but overall it is dense and purposeful.
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 no output schema, the description itself enumerates the returned fields (number, title, kind, status, project, customer, date, total), states the sort order, and documents both filter semantics and the error condition. An agent has what it needs to call and interpret this list 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 coverage is 71%, and the description fills meaningful gaps: it enumerates the valid statuses for each kind and explains the kind/status interaction (a mismatch stops the call), plus that search matches title or number. Only limit/cursor behavior is left entirely to 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?
States the resource (change orders plus change order requests), the sort order (newest first), and the fields returned (status, project, total). It also separates itself from get_change_order by noting that tool carries the line items, so an agent can tell the two apart without opening a 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?
Gives concrete selection context: filter by project/kind/status/search, archived items require include_archived, and line items send the agent to get_change_order. It does not state explicit exclusions beyond that, but the routing information is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_contactsList contactsARead-onlyIdempotent
Customers, employees, contractors, vendors and misc contacts from the Directory.
Reads the Contractor Foreman Directory: active contacts with their type, name, company, title, email, phone, cell and address. Filter by type or search by name, company, email or phone. contact_id is the id other tools ask for as customer_id, vendor_id, contractor_id or employee_id. Leads have their own tool, list_leads.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Only this kind of contact. Left out: all of them, leads excluded. | |
| limit | No | ||
| cursor | No | next_cursor from the previous call. | |
| search | No | Name, company, email or phone to look for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered. The description adds genuinely new behavioral context: that listing excludes leads by default and that contact_id is the shared identifier other tools call customer_id/vendor_id/contractor_id/employee_id. It doesn't cover pagination behavior, keeping it below a 5.
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 tight sentences: what it reads, what you get and how to narrow it, then the identifier mapping and the leads exclusion. No filler, and the core purpose is front-loaded in the first sentence.
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 no output schema, the description compensates by enumerating the returned fields, which is exactly what an agent needs to know. The one remaining gap is pagination behavior — the cursor's role and page-size defaults are only in the schema, not explained 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 coverage is 75% and the description reinforces the type and search semantics, including the useful default that omitting type returns all kinds with leads excluded. It adds the cross-tool meaning of contact_id, which is not in the schema. The cursor parameter is left entirely to schema documentation.
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 and resource ('Reads the Contractor Foreman Directory') and enumerates exactly which entity types come back (customers, employees, contractors, vendors, misc contacts) with their fields. It explicitly excludes leads and points to list_leads, so an agent can distinguish it from siblings without opening any 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?
Gives clear usage context — filter by type or search by name/company/email/phone — and names the alternative for the one overlapping case ('Leads have their own tool, list_leads'). It stops short of stating when to use get_contact instead for a single record, so it's not a full when/when-not map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_cost_codesList cost codesARead-onlyIdempotent
The company's cost codes, to put on estimate, change order and invoice items.
Every active cost code with its code number, name and parent group. cost_code_id is what the item tools take. search narrows by code or name.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | Matches the code or the name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds non-obvious behavior: only ACTIVE cost codes are returned, and the exact fields in the response. It does not mention result volume, ordering, or pagination, which keeps it at 4.
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 paragraphs, no wasted words, and the identifying information comes first. The second paragraph is slightly telegraphic ('Every active cost code with its code number, name and parent group') rather than smoothly integrated, but it is efficient overall.
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 no output schema, the description usefully enumerates the returned fields and the active-only filter, and annotations cover safety. For a zero-required-parameter list tool this is nearly complete; only ordering/result-size expectations are unaddressed.
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 coverage is 100% and the single 'search' param is fully documented there. The description's 'search narrows by code or name' essentially restates the schema description ('Matches the code or the name') with only a mild addition ('narrows' implying subset filtering). 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?
Names the resource (company cost codes), its fields (code number, name, parent group), and its role (attaching to estimate, change order and invoice items). The line 'cost_code_id is what the item tools take' distinguishes it from the sibling item tools (add_estimate_items, add_change_order_items, add_invoice_items). It stops short of explicitly naming an alternative tool to use instead, keeping it at 4.
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 'to put on estimate, change order and invoice items' plus 'cost_code_id is what the item tools take' gives the agent a concrete pre-requisite workflow: call this before the item-adding tools. No explicit exclusions or when-not conditions are given, so it falls short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_cost_itemsList cost itemsARead-onlyIdempotent
Saved cost items with unit, unit cost and markup, to price estimate and change order lines.
The Cost Items Database: name, type, unit, your unit cost in dollars, default markup, cost code, SKU and notes. Use the values as line items in create_estimate, add_estimate_items or create_change_order. Filter by type or a name search. Subcontractor and other items are picked out of each page of all items, so such a page can hold fewer than limit. Keep the cursor going until next_cursor is null.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | ||
| limit | No | ||
| cursor | No | next_cursor from the previous call. | |
| search | No | Matches the item name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent/non-destructive annotations by disclosing a non-obvious filtering quirk — subcontractor and other items are pulled out of each page, so a page can hold fewer than limit — and the loop-termination rule (keep going until next_cursor is null). That is exactly the behavioral context an agent needs to page correctly and not mistake a short page for the end of results.
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?
Front-loads the resource and its fields, then moves to usage, filtering, and pagination in a logical order. The opening clause ('to price estimate and change order lines') is slightly garbled and the field list is dense, but no sentence is wasted.
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, 4-parameter list tool with no output schema, the description covers what is returned, how to filter, how to paginate, and where the values are consumed downstream. Only a fuller description of the returned page envelope (beyond next_cursor) is missing, which is minor.
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?
With 50% schema coverage, the description compensates by explaining the two undocumented-but-important parameters: the type filter's purpose and that search matches the item name. It also clarifies the relationship between limit and short pages. It doesn't restate the default/limit bounds, but those are already in 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?
States a specific verb+resource (list saved cost items) and enumerates the record's fields (name, type, unit, unit cost, markup, cost code, SKU, notes), so the agent knows exactly what is being returned. It ties the tool to downstream use (pricing estimate/change-order lines) rather than differentiating it from the many other list_* siblings, which keeps it just short of a 5.
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?
Gives explicit context for when to reach for it: to source line items for create_estimate, add_estimate_items, or create_change_order. It also explains how to narrow results (filter by type or name search) and how to page through them. No when-not-to-use guidance is offered, but the intended workflow is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_daily_logsList daily logsARead-onlyIdempotent
Daily logs by date, optionally for one project and a date range.
Returns daily logs in the order of the Daily Logs list, with date, arrival time, project and who wrote them, and total, the count of logs that match. Filter by project and by from/to dates (both inclusive). get_daily_log gives one log in full: notes, people, materials, equipment and the weather. Pages hold up to 100 logs; pass next_cursor back as cursor.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Last log date. | |
| from | No | First log date. | |
| limit | No | ||
| cursor | No | next_cursor from the previous call. | |
| search | No | Text to match, as the search box of the Daily Logs list. | |
| project_id | No | Only logs of this project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world, so the safety profile is covered. The description adds genuinely new behavior: result ordering matches the Daily Logs list, a `total` count of matches is returned, and pagination is capped at 100 with a cursor round-trip. It stops short of mentioning permissions or what happens on an invalid cursor.
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 dense sentences: what it lists, what it returns, how to page. Scope and values are front-loaded and no sentence is 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?
With no output schema, the description carries the return shape (date, arrival time, project, author, total) and pagination, which is what an agent needs to consume results. The unmentioned default limit of 30 and search-match behavior are minor residual gaps covered by the schema.
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 coverage is 83%, so the baseline is 3, and the description goes beyond it by clarifying that from/to are both inclusive and by explaining the page-size ceiling and cursor round-trip (next_cursor → cursor). It leaves the `search` semantics and the 30-item default to 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?
States a specific verb (list) and resource (daily logs) with scope: by date, optionally narrowed by project and range. It also names the sibling get_daily_log and how it differs, so an agent can pick between them without opening 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?
Explicitly routes the agent: use this for a date/project-filtered index, and use get_daily_log when the full record (notes, people, materials, equipment, weather) is needed. It also states the filter dimensions and their inclusive semantics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_estimatesList estimatesARead-onlyIdempotent
Estimates, newest first, with status, project, customer and total.
The Estimates list: number, title, status, project, customer, dates and total in dollars. Filter by project, status or a search over title, number and customer. Archived estimates only with include_archived. get_estimate gives the line items.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | next_cursor from the previous call. | |
| search | No | Matches the title, number or customer. | |
| status | No | ||
| project_id | No | Only estimates of this project (list_projects). | |
| include_archived | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered. The description adds genuinely new behavior: default ordering is newest-first, archived estimates are excluded unless opted in, and the summary fields returned. It does not mention pagination limits or cursor behavior, which the schema carries.
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 paragraphs, front-loaded with the resource and ordering, followed by filters and the alternative tool. Minor redundancy: 'status, project, customer and total' appears in both the opening line and the field enumeration.
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?
No output schema exists, and the description compensates by enumerating the returned fields (number, title, status, project, customer, dates, total) and the ordering. Combined with schema-documented limit/cursor, an agent has everything needed to call 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 coverage is 50%, so the description compensates by explaining what search covers (title, number, customer), what status/project filters do, and the non-obvious semantics of include_archived (archived items are hidden by default). limit and cursor are left entirely to the schema, which is acceptable since cursor is described there.
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 and resource ('Estimates, newest first') plus the returned fields, and explicitly distinguishes itself from get_estimate by noting that get_estimate yields line items. An agent can tell this apart from sibling list_* tools without opening any 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?
Gives concrete selection conditions: filter by project, status, or search; archived rows only appear with include_archived; use get_estimate for line-item detail. It lacks an explicit statement of when NOT to use this tool (e.g., versus list_projects or create_estimate), but the routing guidance to the detail tool is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_expensesList expensesARead-onlyIdempotent
Expenses with amount, date, vendor, project, cost type and who paid.
Reads the Contractor Foreman Expenses list, last added first: name, amount with tax, date, vendor, project, cost type (Material, Labor, Equipment ..), who paid it and through what, and whether it is billable to the customer. Filter by project or search.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | next_cursor from the previous call. | |
| search | No | Words to look for. | |
| project_id | No | Only this project's records. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds genuine value beyond that with ordering ('last added first') and the returned field set, but says nothing about page size limits or cursor-based continuation, which matters for a paginated list. Adequate, 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?
It is short and front-loaded, opening with the field summary before the operational detail. The opening clause ('amount, date, vendor, project, cost type and who paid') is then largely repeated in fuller form in the second paragraph, which is mild redundancy but not damaging.
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 no output schema, the description carries the burden of describing returns, and it does so thoroughly — name, amount with tax, date, vendor, project, cost type, payer and billability. Ordering and filtering are both stated, and the remaining mechanics (limits, cursor) are documented in the schema.
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 coverage is 75%: cursor, search and project_id are documented inline, and limit carries default/min/max constraints. The description's 'Filter by project or search' merely restates two of those parameters without adding matching semantics such as whether search spans vendor or project names. Baseline 3 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?
The description states a specific verb and resource with scope: it 'Reads the Contractor Foreman Expenses list, last added first' and enumerates the fields returned. It implicitly distinguishes itself from get_expense (single record) and create_expense (write), but never names a sibling explicitly.
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 closing line 'Filter by project or search' gives an implied usage pattern, but there is no explicit guidance on when to reach for this list versus get_expense, nor any statement about pagination-based iteration or when not 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_inspectionsList inspectionsARead-onlyIdempotent
Inspections with project, type, date, result, agency and permit number.
Reads the Contractor Foreman Inspections list, newest first: number, inspection type, project, date and time, status (Draft, Pass, Fail, Re-Inspect), agency, inspector, permit number, assignee and notes. Filter by project or search.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | next_cursor from the previous call. | |
| search | No | Words to look for. | |
| project_id | No | Only this project's records. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context beyond annotations: results are newest first, and it lists the exact fields returned, including status values like Draft, Pass, Fail, and Re-Inspect.
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 reasonably compact and front-loads the resource, but the opening fragment 'Inspections with project, type, date, result, agency and permit number' largely duplicates the field list that follows in the next sentence. This redundancy weakens conciseness without making the description unclear.
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 annotations covering safety and no output schema, the description provides the essential return fields, ordering, and filtering behavior. It does not explain pagination or limit defaults in prose, but cursor is documented in the schema and the remaining schema coverage is high 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?
Schema description coverage is 75%, so the schema already documents cursor, search, and project_id. The description adds the phrase 'Filter by project or search,' which aligns with those parameters but does not add detail beyond the schema, and it does not clarify limit or cursor pagination behavior. 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 a specific read operation on the inspections list and enumerates the returned fields, including status values and ordering. It is distinguishable from get_inspection by the repeated 'list' framing and filtering, but it does not explicitly name sibling alternatives.
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 'Reads the Contractor Foreman Inspections list' and 'Filter by project or search,' which tells the agent how to narrow the list. However, it does not state when to choose this tool over get_inspection or other inspection-related siblings, nor does it provide exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_invoicesList invoicesARead-onlyIdempotent
Invoices, newest first, with status, totals, balance due and an overdue flag.
The Invoices list: number, status (draft, submitted, on_hold, paid, denied, write_off), project, customer, invoice and due dates, total and balance due in dollars, and overdue (past the due date with a balance). Archived invoices are left out. unpaid_only keeps submitted and on-hold invoices that still have a balance. status, when given, replaces the unpaid_only status filter. unpaid_only and due_before filter the page you get, so a page can hold fewer than limit. Keep the cursor going until next_cursor is null. get_invoice gives the items and payments.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | next_cursor from the previous call. | |
| search | No | Matches the number, project or customer. | |
| status | No | ||
| due_before | No | Only invoices due before this date. | |
| project_id | No | Only this project's (list_projects). | |
| customer_id | No | Only this customer's. | |
| unpaid_only | No | Only submitted or on-hold invoices with a balance due. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld/idempotent annotations, it discloses the non-obvious behaviors an agent would otherwise get wrong: archived records are filtered out, status overrides the unpaid_only status filter, and unpaid_only/due_before are applied after paging so a page may return fewer than limit. That last point is a genuinely valuable warning the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and largely front-loaded, with return shape first and filtering/pagination mechanics after. There is minor redundancy between the opening 'Invoices, newest first, with status, totals, balance due and an overdue flag' and the subsequent field enumeration, which restates the same projection.
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 no output schema, the description carries the return-shape burden and does so fully (number, status enum values, project, customer, dates, total, balance, overdue, exclusion of archived). Pagination termination and filter-override semantics are also covered, so an agent has everything needed to call this 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 description adds real meaning over the 75%-covered schema: it defines unpaid_only's scope, documents the precedence rule when both status and unpaid_only are supplied, warns that due_before/unpaid_only filter the returned page, and tells the agent to loop on cursor until next_cursor is null. limit and search get no extra treatment, but the schema already covers them adequately.
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 opening sentence names the resource, ordering (newest first), and the projected fields (status, totals, balance due, overdue flag), and the following sentence enumerates the returned columns. It explicitly separates itself from get_invoice, which 'gives the items and payments', so an agent can distinguish list vs. detail without opening either 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?
It gives concrete contextual rules: archived invoices are excluded, unpaid_only's meaning is defined, and a get_invoice alternative is named for line items and payments. It never states the inverse condition (e.g. 'use get_invoice when you already have the invoice id'), so the alternative routing is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_leadsList leadsARead-onlyIdempotent
Sales leads with contact details, stage and quality score.
Reads the active leads in the Contractor Foreman Directory: name, company, email, phone, address, stage (received, pending, qualifying, qualified, quoted, awarded, lost) and quality from 1 to 5. Search by name, company, email or phone. Opportunities (deals tied to a customer) are list_opportunities.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | next_cursor from the previous call. | |
| search | No | Name, company, email or phone to look for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is carried. The description adds the meaningful 'active leads' scoping (records are filtered, not everything) and enumerates returned fields, but says nothing about pagination behavior, result caps or ordering, which matters for a paged list.
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 sentences, front-loaded with what the tool returns before alternatives. The opening fragment 'Sales leads with contact details, stage and quality score' partially pre-states the second sentence, a minor redundancy, but nothing is padded.
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 no output schema, the description usefully lists the returned fields and stage values, and annotations cover the safety profile. Completeness would be higher if it described pagination behavior given the cursor parameter and 100-item cap.
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 coverage is 67%; cursor and search are already documented in the schema and the description's 'search by name, company, email or phone' largely restates the search property. The limit parameter (default 25, max 100) has no description text and the description does not compensate for it, so this is baseline territory.
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 and resource (reads active leads) and enumerates the returned fields, including the stage vocabulary and 1-5 quality scale. It also explicitly separates the tool from list_opportunities, so an agent can route between leads and deals without opening either 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 gives concrete search criteria (name, company, email or phone) and names the alternative for deal data ('Opportunities ... are list_opportunities'). It stops short of saying when not to use it (e.g. to create or qualify a lead, which the siblings create_lead/update_* cover), so the exclusion set is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_opportunitiesList opportunitiesARead-onlyIdempotent
Sales opportunities with customer, stage, score, budget and expected sale date.
Reads the Contractor Foreman Opportunities list: deals for a customer before they turn into a project, at every stage, with number, name, stage (received, pending, qualifying, qualified, quoted, awarded, lost), score 1 to 5, budget in the account currency, estimated sales date and who it is assigned to. Search by name, number or customer.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | next_cursor from the previous call. | |
| search | No | Words in the name, number or customer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. The description contributes domain behavior the annotations cannot: deals exist at every stage, budget is in the account currency, score is bounded 1-5. It stops short of disclosing result-set size or pagination expectations, which matters for a list 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 first sentence front-loads the core purpose and returned fields, with the second adding domain context. It is dense but every clause carries real information; the only redundancy is the search sentence echoing the schema.
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 no output schema, the description carries the return-shape burden and does so thoroughly: field list, stage enumeration, score range, currency, date and assignee. An agent can decide relevance and construct a call without additional information.
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 coverage is 67% and the 'Search by name, number or customer' sentence largely restates the search parameter's own description. The description adds no detail on limit bounds or cursor continuation behavior, so it does not compensate for the undocumented parameters. 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?
States a specific verb+resource ('Reads the Contractor Foreman Opportunities list') and defines the domain object precisely: deals for a customer before they become a project. The field inventory (number, name, stage, score, budget, date, assignee) plus the enumerated stage list makes it unambiguously distinct from get_opportunity and list_leads.
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 read/list framing and by 'Search by name, number or customer,' but there is no explicit when-to-use guidance and no named alternative. It never says to call get_opportunity for a single deal, or how this differs from list_leads, which is the nearest sibling by domain.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_paymentsList paymentsARead-onlyIdempotent
Payments received on invoices, newest first, with amount, method and invoice.
The Payments list: date, amount in dollars, method, status (received, in_review, verified, failed), notes, the invoice it pays, customer and project. get_invoice shows the payments of one invoice.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | next_cursor from the previous call. | |
| project_id | No | Only this project's (list_projects). | |
| customer_id | No | Only this customer's. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and openWorld, so safety is covered. The description adds real context beyond that: result ordering (newest first), the exact status vocabulary (received, in_review, verified, failed), and the shape of each record, which matters because there is no output schema.
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 paragraphs, front-loaded with the core behavior and returning field detail where it is most useful. The first line and the field list in the second overlap slightly (both mention amount and invoice), but the redundancy is minor and the field list earns its place given no output schema.
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 four-parameter list tool with no output schema, the description does the important work: it enumerates returned fields and status values. It stops short of describing pagination behavior (the 25 default, 100 cap, how cursor drives the next page), which an agent would need to page 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 coverage is 75% – cursor, project_id and customer_id are documented, though limit (default 25, cap 100) is bare. The description adds no syntax or format for these parameters, but it does implicitly signal that invoice-level filtering is not offered here, which is a small piece of negative guidance. Baseline 3 applies when the schema carries most of the load.
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 first line states a specific verb and resource (listing payments received on invoices) plus the ordering (newest first) and the fields returned (amount, method, invoice). It also names the sibling it is not, get_invoice, so an agent can separate the two without opening either 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 closing sentence gives an explicit alternative and the condition that selects it: get_invoice shows the payments of a single invoice. The project/customer filtering in the schema implies the bulk-use case, but the description never spells out when to prefer this tool over that filtering or over list_invoices.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_project_crew_hoursList project crew hoursARead-onlyIdempotent
Hours and labor cost logged on one project, per employee and per day and cost code.
Reads the time logged on a Contractor Foreman project (the project's Time Cards tab): every entry with the day, employee, cost code, regular and overtime hours and labor cost, plus a sum per employee (most hours first) and the project total. days counts the distinct days an employee logged. Cost uses the wages in the Directory and is 0 when no wage is set. Optional date range.
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | No | Hours up to this day, YYYY-MM-DD. | |
| project_id | Yes | The project's numeric id (list_projects). | |
| start_date | No | Hours from this day on, YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only and idempotent annotations, the description discloses the returned detail: day, employee, cost code, regular/overtime hours and labor cost, per-employee sums sorted by most hours, project total, and the distinct-day count. It also explains that cost comes from Directory wages and is zero when no wage is set.
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 appropriately sized and front-loads the core purpose before detailing the returned records and aggregation behavior. Every sentence contributes useful information for calling or interpreting the tool.
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 no output schema, the description carries the burden of explaining return values and does so thoroughly: it describes the individual entries, aggregate ordering, project total, and cost caveat. For this list tool, no material context is missing.
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 parameters are already documented, including the project_id reference to list_projects and the YYYY-MM-DD date semantics. The description only reiterates that the date range is optional and adds no further parameter meaning.
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 resource and scope: hours and labor cost logged on one project, broken down per employee, day, and cost code, with sums. It is clear and distinct in substance, but it never explicitly contrasts itself with siblings such as list_time_cards or get_job_costing.
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 the tool is useful by explaining that it reads the project's Time Cards tab and supports an optional date range. However, it gives no explicit when-to-use guidance versus alternatives, so the agent must infer the routing decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_project_filesList project filesARead-onlyIdempotent
Photos and documents on a project, with name, size and a download link.
Reads a Contractor Foreman project's Files tab, newest first: file name, title, whether it is an image, size, notes, tags, when it was added and a download link. The app signs the links and they expire about 30 days after the call (the expires parameter). Call again for fresh ones.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | The project's numeric id (list_projects). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, and the description adds genuinely new behavior: results are ordered newest first and download links are signed and expire roughly 30 days after the call. Only a minor flaw: it attributes the expiry to 'the expires parameter', which does not exist in this tool's schema.
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 blocks, front-loaded with the resource and return fields, then operational caveats. The opening sentence largely restates what the second sentence lists (name, size, link), so there is minor redundancy but no padding.
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 no output schema, the description correctly carries the return-value burden by enumerating fields (name, title, is-image, size, notes, tags, added date, download link). The only gap is the misleading reference to an 'expires' parameter and no note on result volume/pagination.
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?
Only one parameter with 100% schema coverage ('The project's numeric id (list_projects).'), so the schema already carries the semantics and baseline 3 applies. The description adds no further meaning about project_id and instead references a nonexistent 'expires' parameter, which is mildly confusing rather than helpful.
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 and resource ('Reads a Contractor Foreman project's Files tab') and enumerates the returned fields, so an agent can tell it apart from list_projects, list_project_notes and other list_* siblings 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?
Implied usage is clear (fetch the files of one project, newest first) and it gives a useful operational cue to call again for fresh links. However, it never states when to prefer a sibling such as list_project_notes or how it relates to the Files tab's other access paths, so routing guidance is only inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_project_notesList project notesARead-onlyIdempotent
The notes on a project's Notes tab, with author and time.
Reads the notes kept on a Contractor Foreman project's Notes tab, oldest first: title, text, who added it, when (in the account's date format) and how many files are attached.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | The project's numeric id (list_projects). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent and non-destructive, so the description isn't burdened with safety disclosure. It still adds real context annotations cannot carry: results are returned oldest first, dates appear in the account's date format, and each record includes a file-attachment count.
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 lead sentence front-loads the resource and the field summary, and the second sentence adds the useful details. The opening phrase is effectively restated in the second sentence ('notes on a project's Notes tab' twice), which is minor waste but not harmful.
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?
There is no output schema, and the description compensates by naming the returned fields (title, text, author, timestamp, attachment count) and the sort order. Only minor gaps remain, such as pagination or whether an empty tab returns an empty list.
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 coverage is 100% and project_id is fully described in the schema, including the hint to use list_projects. The description only implies project scoping through 'a project's Notes tab' and adds no format or constraint details beyond that, so the baseline 3 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 and resource: reads the notes on a Contractor Foreman project's Notes tab, and enumerates what each note contains. It is clear what the tool does, but it never differentiates itself from the sibling add_project_note or from list_project_files, which also surface project-scoped data.
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 'Reads the notes kept on…' and the oldest-first ordering, so an agent can infer this is a read path. There is no explicit when-to-use or when-not-to-use guidance and no pointer to add_project_note for the write counterpart.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsList projectsARead-onlyIdempotent
Projects with customer, stage, dates, contract amount, costs and percent complete.
Returns active (not archived) projects in the order of the Projects list. Completed projects are left out unless include_completed is true or status asks for them. search matches the project name, number or customer. Amounts are in the account's currency: contract amount without tax, budgeted, committed and actual cost, invoiced and paid. Pages hold up to 100 projects; pass next_cursor back as cursor.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | next_cursor from the previous call. | |
| search | No | Match on project name, number or customer. | |
| status | No | Only projects in this stage. | |
| include_completed | No | Include completed projects. Ignored when status is set. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, and the description adds real behavior beyond them: default exclusion of archived/completed rows, list ordering, currency interpretation of amounts (contract without tax, budgeted/committed/actual cost, invoiced/paid), and a 100-per-page cap. It doesn't discuss how large result sets behave beyond cursor paging, but the added context is substantial.
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?
It is dense but organized: returned fields, then default scope, then filters, then amount semantics, then pagination. Every sentence carries information, though the opening fragment is slightly awkward and the two search mentions are redundant.
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 no output schema, the description supplies the shape of results (which project fields are returned), ordering, default filtering, and paging, which is enough for an agent to call it correctly. Only edge behavior such as empty-result or cursor expiry is left implicit.
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 coverage is 80%, so the baseline is 3; the description goes further by explaining the include_completed/status interaction, the meaning of search matching, and the pagination contract (up to 100, pass next_cursor back as cursor). Only limit's default/max isn't restated, which the schema already covers.
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 the resource (projects) and enumerates the returned fields — customer, stage, dates, contract amount, costs, percent complete — and immediately scopes it to non-archived projects. It is clearly a list operation distinct from get_project, though the leading sentence is a noun phrase rather than an explicit verb+resource statement.
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 selection rules: completed projects are omitted unless include_completed is true or status requests them, and search targets name/number/customer. It doesn't name a sibling alternative (e.g. get_project for a single record), so it falls short of explicit when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_punchlistsList punchlistsARead-onlyIdempotent
Punchlists with project, status, open and completed item counts and who the items are assigned to.
Returns punchlists, optionally for one project, with the number of open and completed items and the people their items are assigned to. status is the one the Punchlists list shows. Pages hold up to 100 punchlists; pass next_cursor back as cursor.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | next_cursor from the previous call. | |
| search | No | Text to match, as the search box of the Punchlists list. | |
| project_id | No | Only punchlists of this project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world behavior, so the safety profile is covered structurally. The description adds genuinely useful behavioral detail beyond that: what fields a punchlist row carries and that pages hold up to 100 with a cursor round-trip. It does not mention ordering, rate limits, or whether counts include deleted items.
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 opening fragment ('Punchlists with project, status, open and completed item counts and who the items are assigned to') is essentially restated verbatim in the following sentence, so the first line does not earn its place. The remainder is compact and front-loads the payload shape before pagination.
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 no output schema, the description carries the burden of describing return values, and it does so: row fields, counts, assignees, and paging. It stops short of saying how pagination terminates (whether a null next_cursor signals the end) or the default page size of 30.
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?
With 75% schema description coverage, the schema already documents cursor, search, and project_id. The description reinforces the project filter and the page-size ceiling (100) and cursor round-trip, but adds nothing about the `search` parameter's matching behavior, and the remark about status refers to displayed output rather than an input parameter.
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 and resource (list punchlists) plus the scope of the payload: project association, status, open/completed item counts, and assignees. This is clearly distinguishable from get_punchlist (single record) and create_punchlist (mutation).
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 notes the listing is 'optionally for one project' and explains pagination via next_cursor, which implies when to use it (bulk retrieval, optionally scoped). It never explicitly routes the agent away from get_punchlist for a single record or mentions what to do when there are no results, so guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_purchase_ordersList purchase ordersARead-onlyIdempotent
Purchase orders with supplier, project, order date, total and status.
Reads the Contractor Foreman Purchase Orders list, newest first: PO number, subject, supplier, project, order and delivery date, total, status (Draft, Submitted, Approved, Received, Closed ..) and who ordered it. Filter by project or search. get_purchase_order adds the line items.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | next_cursor from the previous call. | |
| search | No | Words to look for. | |
| project_id | No | Only this project's records. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. The description adds ordering ("newest first") and the concrete status vocabulary (Draft, Submitted, Approved, Received, Closed), which are behaviors the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The returned-field list is front-loaded and the second paragraph carries the operational detail. Slightly redundant in repeating the field list across both paragraphs, but nothing superfluous.
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 no output schema, the description usefully enumerates returned fields and ordering, and points to the detail sibling. Pagination semantics (limit default 25, max 100) live in the schema and are not echoed, which is a minor gap for a list 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 coverage is 75% and cursor/search/project_id are already documented in the schema. The description only restates that project and search filtering exist and says nothing about limit or cursor, so it adds little beyond the structured fields.
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 and resource (reads the Contractor Foreman Purchase Orders list) and enumerates what comes back: PO number, supplier, project, dates, total, status. It also explicitly separates itself from get_purchase_order, which supplies line items.
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?
"Filter by project or search" gives concrete selection guidance, and "get_purchase_order adds the line items" routes the agent to the right sibling when detail is needed. No explicit when-not conditions, but the list-vs-detail split is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_rfisList RFIsARead-onlyIdempotent
Requests for information with question, project, dates, answer and status.
Reads the RFIs in Contractor Foreman's RFI & Notices module, newest first: number, title, the question, area and plan sheet it refers to, project, date, response needed by, response received, the answer and status (Draft, Submitted, Outstanding, Received, Closed). Schedule and compliance notices from the same module are left out, so a page can hold fewer than limit. Filter by project or search.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | next_cursor from the previous call. | |
| search | No | Words to look for. | |
| project_id | No | Only this project's records. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), so the description correctly spends its words elsewhere: it declares newest-first ordering and warns that schedule/compliance notices are excluded from the same module, so a page can hold fewer than limit — a real behavioral caveat an agent needs to avoid misreading a short page as the end of data.
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?
Front-loaded with the resource, then the return payload, then the caveat about excluded notices. The long field enumeration earns its place given there is no output schema, though the opening fragment ('Requests for information with question, project...') is slightly clipped.
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 no output schema, the description compensates well by listing the returned fields, their possible status values, ordering, excluded record types, and filtering options. The only real gap is search scope (which fields the query matches).
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 coverage is 75% and cursor/search/project_id already carry short descriptions there. The description reinforces project and search filtering and adds the important nuance that limit is an upper bound, not a guaranteed page size, but adds nothing on cursor semantics or which fields the search scans.
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 (reads/lists) and resource (RFIs in the RFI & Notices module) and enumerates the returned fields, so an agent knows exactly what it gets. It doesn't explicitly name get_rfi for single-record retrieval, so the list-vs-get distinction is only implied by the plural phrasing.
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 says 'Filter by project or search,' implying the two main retrieval modes, but never states when to prefer this over get_rfi or when the sibling search tools apply. Usage is inferable 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_schedule_tasksList schedule tasksARead-onlyIdempotent
Gantt schedule tasks of a project: dates, duration, dependencies, assignees, percent complete.
Returns the tasks of the project schedule in Gantt order. kind is task, milestone or summary (a group whose dates follow its subtasks). end_date is the task's last day, inclusive. depends_on lists the tasks this one waits for, with the link type and lag in days. Use task_id with update_schedule_task. An empty list means the project has no schedule yet.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | project_id from list_projects. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description correctly spends its words on domain semantics: Gantt ordering, the kind taxonomy including summary groups whose dates follow subtasks, inclusive end_date, and the shape of depends_on with link type and lag. It does not mention permissions, pagination, or result size limits, which keeps it short of a 5.
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?
Purpose and return contents are front-loaded in the first sentence, with field-level clarifications following in compact form. Every sentence carries information, though the mix of result-shape notes and the update cross-reference in one running paragraph makes it slightly denser than ideal.
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?
There is no output schema, so the description must explain return values, and it does so well: ordering, kind values, inclusive end_date, and dependency structure. Only secondary operational details such as pagination or whether large schedules are truncated are absent.
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 is exactly one parameter and schema coverage is 100%, with the schema itself saying 'project_id from list_projects.' The description adds no further meaning about that parameter (the task_id it mentions is an output field, not an input), so the baseline of 3 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 and resource ('Gantt schedule tasks of a project') plus the fields returned (dates, duration, dependencies, assignees, percent complete). It also implicitly distinguishes itself from the mutating sibling by naming update_schedule_task for the write path, so an agent can tell read from write without opening a 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?
Gives concrete follow-up routing ('Use task_id with update_schedule_task') and an interpretation rule ('An empty list means the project has no schedule yet'). It never states an explicit exclusion or an alternative listing tool, but there is no obvious competing sibling for schedule reads, so the guidance is clear rather than exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_service_ticketsList service ticketsBRead-onlyIdempotent
Service tickets with customer, status, service date and time and technicians.
Reads the Contractor Foreman Service Tickets list, newest first: ticket number, title, description, status (Unscheduled, Scheduled, En Route, Checked-In, Completed ..), customer, project, service date and time and the assigned technicians. Filter by project or search.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | next_cursor from the previous call. | |
| search | No | Words to look for. | |
| project_id | No | Only this project's records. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds genuine context — newest-first ordering and the status vocabulary (Unscheduled, Scheduled, En Route, Checked-In, Completed) — but says nothing about page size, default 25, cap of 100, or how paging terminates.
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 lead line ('Service tickets with customer, status, service date and time and technicians.') is a near-verbatim duplicate of the field list in the following sentence, wasting the most valuable front-loaded position. The substantive sentence itself is dense and useful, so the waste is localized.
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 no output schema, the description carries the return-value burden and does so by enumerating every returned field plus sort order. For a zero-required-parameter read list this is close to sufficient; only pagination expectations are left implicit in the schema's cursor description.
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 75%, with cursor, search and project_id already documented; the description only restates 'filter by project or search' and adds no syntax, matching behavior, or interaction rules. The undocumented limit parameter receives no compensating explanation. 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?
States a specific verb (reads/lists) and resource (Contractor Foreman Service Tickets) and enumerates the returned fields, so the agent knows exactly what the tool surfaces. It does not explicitly distinguish itself from get_service_ticket or update_service_ticket_status, which is the only missing piece for a 5.
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?
'Filter by project or search' implies the two narrowing paths, but there is no statement of when this list is the right choice versus fetching a single ticket, nor any guidance on paging through results. Usage is inferable rather than prescribed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sub_contractsList sub-contractsARead-onlyIdempotent
Sub-contracts with subcontractor, project, amount, billed, paid, balance and status.
Reads the Contractor Foreman Sub-Contracts list, newest first: agreement number, subject, subcontractor, project, date, contract total, amount billed and paid, balance, retainage percent and status (Draft, Submitted, Committed, Approved ..). Filter by project or search.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | next_cursor from the previous call. | |
| search | No | Words to look for. | |
| project_id | No | Only this project's records. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/openWorld, so the description focuses on added value: results are returned 'newest first' and include status values (Draft, Submitted, Committed, Approved), plus the full field set including retainage. It does not mention pagination behavior (default 25, max 100) despite exposing a cursor, which is a minor 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?
Two sentences, front-loaded with the resource and its key fields, then the ordering and filter capabilities. The long field enumerations overlap somewhat (subcontractor/project/amount repeated as contract total, billed, paid, balance), which costs a little density.
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 no output schema, the description usefully names the returned fields, the sort order, and the status vocabulary. It is nearly complete for a filtered list tool; only pagination semantics are left to the schema.
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 coverage is 75% and cursor/search/project_id are documented in the schema; the description only restates that project and search filtering exist. It adds nothing about limit defaults or the meaning of cursor ordering beyond what the schema provides.
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+resource ('Reads the Contractor Foreman Sub-Contracts list') and enumerates the returned fields, so it is unmistakably the list counterpart to get_sub_contract. An agent can distinguish it from list_* siblings for other resources 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 closing 'Filter by project or search' implies when the optional filters apply, but there is no explicit guidance on when to use this list tool versus get_sub_contract for a single record, nor any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_submittalsList submittalsARead-onlyIdempotent
Submittals with project, status, date received, due date and approver.
Reads the Contractor Foreman Submittals list, newest first: number, title, project, status (Draft, Submitted, Pending, Response Received, Approved, Rejected), date received, due date, who it is assigned to and who approved it. Filter by project or search.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | next_cursor from the previous call. | |
| search | No | Words to look for. | |
| project_id | No | Only this project's records. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, open-world behavior. The description adds useful behavioral context by stating that results are returned newest first, listing the status values, and naming the filters. It does not discuss pagination behavior, but the ordering detail is a meaningful addition.
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 short, front-loaded, and easy to scan. The first sentence duplicates several fields that are repeated with more detail in the second sentence, which is slightly wasteful but not enough to make the definition bloated.
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 no output schema, the description gives a helpful picture of the returned fields, status values, ordering, and filtering options. It does not mention pagination behavior or the limit maximum, but the cursor parameter description in the schema partially covers that 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?
Schema description coverage is 75%, so the schema already documents most parameters. The description reinforces project and search filtering but adds little beyond the schema, and it does not explain limit or cursor pagination 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 ('Reads') and resource ('Contractor Foreman Submittals list') and names the fields returned. It clearly implies a multi-record list rather than a single record, but it does not explicitly distinguish itself from the sibling get_submittal tool.
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 that results can be filtered by project or search, which gives some usage context. However, it does not say when to use this list tool versus get_submittal for a single record, nor does it explain when not 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_time_cardsList time cardsARead-onlyIdempotent
Time cards with employee or crew, project, clock-in and clock-out times and hours, newest first.
Reads the Contractor Foreman Time Cards list, newest first: employee cards and crew sheets with the project, day, clock-in and clock-out time, hours worked and break hours. A card still running has running true and no hours yet. Filter by a date range, a project or an employee. get_time_card gives one card's entries per person and cost code.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | next_cursor from the previous call. | |
| end_date | No | Cards up to this day, YYYY-MM-DD. | |
| project_id | No | Only this project's cards. | |
| start_date | No | Cards from this day on, YYYY-MM-DD. | |
| employee_id | No | Only this employee's cards (contact_id). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior, and the description adds useful behavioral context: results are newest first, crew sheets and employee cards are both included, and running cards have running true with no hours yet. It does not discuss pagination behavior or permissions, but the main state behavior is disclosed.
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 and appropriately sized for a list tool. It repeats "newest first" in both the opening line and the following paragraph, which is a minor redundancy but not harmful.
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 no output schema, the description carries the return-value burden and does so by naming the included fields and running-card behavior. It is nearly complete for a filtered list tool, with only minor gaps around pagination/limit behavior that are partly covered by the input schema.
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 high at 83%, so the schema already carries most parameter meaning. The description adds a useful grouping by saying the list can be filtered by date range, project, or employee, but it does not add syntax or constraints beyond what the schema provides.
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 pairing: it reads the Contractor Foreman Time Cards list and states the returned fields such as employee/crew, project, clock-in/out, and hours. It also distinguishes the tool from get_time_card, which returns one card's entries per person and cost code.
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 clearly says to filter by date range, project, or employee, and it names get_time_card as the alternative for single-card detail. It does not explicitly cover when to use this versus other related tools such as get_clock_status or list_project_crew_hours, so it falls just short of exhaustive guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_todosList to-dosARead-onlyIdempotent
To-dos with project, priority, status, due date and assignees.
Returns to-dos, optionally for one project, one status (open, incomplete, complete) or only those assigned to you. get_todo gives one with its description and checklist. Pages hold up to 100 to-dos; pass next_cursor back as cursor.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | next_cursor from the previous call. | |
| search | No | Text to match, as the search box of the To-Do list. | |
| status | No | ||
| mine_only | No | Only to-dos assigned to this account's user. | |
| project_id | No | Only to-dos of this project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the description's added value is pagination behavior: pages hold up to 100 and next_cursor is passed back as cursor. That is concrete operational detail the annotations do not supply. It does not mention default page size (30) or what happens with an expired cursor.
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 tight sentences, zero filler, with the resource-and-fields summary front-loaded and the sibling pointer placed before the pagination note. The opening is a verbless fragment ('To-dos with project, priority...'), which is dense but slightly telegraphic.
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 six optional params, no output schema, and a read-only tool, the description covers filters, page size, and the pagination loop an agent must implement — enough to call it correctly. Missing only the `search` semantics and the default limit, both of which live in the schema.
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 coverage is 67%; the description reinforces the status values (open, incomplete, complete), project scoping, and the cursor round-trip. However it never mentions the `search` or `limit` parameters, leaving the text-match behavior to a one-line schema description. Helpful but not a full compensation for the coverage gap.
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 and resource (returns to-dos) and enumerates the fields carried (project, priority, status, due date, assignees), then explicitly distinguishes itself from get_todo by naming that sibling as the single-record detail call. An agent can pick between list_todos and get_todo without opening either 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?
Gives clear conditions for narrowing (one project, one status, or only your assigned to-dos) and redirects to get_todo when the description and checklist are needed. It stops short of stating exclusions, e.g. that keyword search is available via `search`, or which call to prefer when the user wants both a list and details.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_work_ordersList work ordersARead-onlyIdempotent
Work orders with project, customer, status, dates, total and assignee.
Reads the Contractor Foreman Work Orders list, newest first: number, subject, description, project, customer, status (Open, Estimating, Submitted, Approved, Canceled, Completed), start and end date, total and who it is assigned to. Filter by project or search.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | next_cursor from the previous call. | |
| search | No | Words to look for. | |
| project_id | No | Only this project's records. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, so the description's real contribution is the default sort ('newest first'), the enumerable status values (Open, Estimating, Submitted, Approved, Canceled, Completed), and the returned field list in the absence of an output schema. It omits pagination behavior despite a cursor parameter, which is the main remaining 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 opening fragment 'Work orders with project, customer, status, dates, total and assignee.' is immediately restated in fuller form by the next sentence, which is pure repetition. The substantive content is front-loaded and short, but that duplicated first line does not earn 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?
With no output schema, the description correctly compensates by enumerating the returned fields, status values and sort order. Only pagination/limit-default behavior is missing, which is a minor gap for a read-only list tool whose safety profile is already declared in annotations.
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 coverage is 75% (cursor and search already documented in-schema), and limit documents its 1-100 range/default. The description only restates the project and search filters without adding syntax, matching rules, or pagination semantics, so it performs at the baseline for a well-annotated 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?
States a specific verb ('Reads the Contractor Foreman Work Orders list') and resource, plus the exact field set returned, so an agent knows this is the plural/collection counterpart to get_work_order. It stops short of naming get_work_order explicitly, so the differentiation is inferable rather than stated.
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?
'Filter by project or search' implies the two narrowing modes, and 'newest first' implies when the default ordering suffices. But there is no explicit guidance on when to use this versus get_work_order for a single record, and no exclusions or prerequisite notes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_inspection_resultRecord inspection resultAIdempotent
Marks an inspection passed, failed or to re-inspect, optionally with notes.
Sets the status of a Contractor Foreman inspection to pass, fail, re_inspect or back to draft, as the status field on its page does, and optionally replaces its notes (corrections the inspector asked for). Nobody is notified. Returns the inspection as saved.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Replaces the inspection's notes. | |
| result | Yes | ||
| inspection_id | Yes | inspection_id from list_inspections. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It adds genuinely non-obvious behavior beyond the annotations: 'Nobody is notified', and that notes are replaced rather than appended (corrections the inspector asked for). It also states the return ('the inspection as saved'), which matters since there is no output schema. It stops short of permissions/authorization context, so not a full 5.
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, front-loaded with the action and outcome; no filler. There is mild redundancy between sentence one and the opening of sentence two ('passed, failed or to re-inspect' vs 'pass, fail, re_inspect'), which costs a point but the surplus is minor.
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 3-parameter write tool with no output schema, the description covers the action, the side effects (notes replacement, no notifications), and the return shape. Remaining gaps (permissions, what 'saved' object fields look like) are modest given the annotation coverage.
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 coverage is 67% and the 'result' enum has no schema description; the description compensates by spelling out all four enum meanings including 'draft' as going back to draft. It also disambiguates 'notes' as a replacement of the inspector's correction notes, though it adds nothing about the inspection_id parameter (covered by 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 names a specific verb (marks/sets the status of) and resource (a Contractor Foreman inspection) and enumerates the exact resulting states: pass, fail, re_inspect, or back to draft. That makes it trivially separable from siblings like get_inspection, create_inspection, and list_inspections.
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 an implicit mental model ('as the status field on its page does') that tells an agent this is the status-update path, but it never states when to prefer it over reading (get_inspection) or creating, nor any precondition such as needing an existing inspection_id from list_inspections. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_paymentRecord paymentA
Records a payment you received against an invoice.
Adds a payment to an invoice, as Add Payment does: amount in dollars, method (bank_transfer, cash, check, credit_card, other), date, status (received, in_review, verified, failed) and notes. It only records money already received. It charges nobody and emails nobody. The invoice must be submitted (update_invoice) and the amount cannot exceed the balance due. A payment that clears the balance marks the invoice paid.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Default: today. | |
| notes | No | e.g. the check number. | |
| amount | Yes | Dollars, at most the balance due. | |
| method | Yes | ||
| status | No | received | |
| invoice_id | Yes | From list_invoices. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it explains important behavioral effects: no charge is made, no email is sent, the invoice must be submitted first, the amount is capped at the balance due, and clearing the balance marks the invoice paid. These details materially help an agent avoid misuse.
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 and then adds constraints and side effects in a compact form. Every sentence contributes useful invocation guidance.
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 mutation tool with no output schema, the description covers prerequisites, constraints, side effects, and non-effects. An agent has enough information to decide whether and how to call 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 coverage is 67%, and the description adds meaning for the undocumented enum parameters by listing valid payment methods and statuses. It also adds the balance-due constraint on amount, though it does not elaborate on every schema-documented parameter.
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: recording a received payment against an invoice. It clearly separates this from related operations by saying it only records money already received and does not charge or email anyone, which distinguishes it from payment processing or invoice-sending 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?
It gives clear usage conditions: the payment must already be received, the invoice must be submitted, and the amount cannot exceed the balance due. It implies not to use it for charging or emailing, but it does not explicitly name alternative sibling tools such as list_payments for viewing payments.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_estimate_itemsRemove estimate itemsADestructive
Deletes line items from an estimate.
Deletes the given line items (item_id from get_estimate) and returns the new estimate total. An item_id that is not on the estimate stops the call before anything is deleted. The app refuses while the estimate is pending_approval, approved or completed: set it back to estimating with update_estimate first.
| Name | Required | Description | Default |
|---|---|---|---|
| item_ids | Yes | item_id values from get_estimate. | |
| estimate_id | Yes | From list_estimates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, so the safety profile is covered. The description adds non-obvious behavior beyond that: the call is atomic (an unknown item_id aborts before any deletion) and it returns the new estimate total. It does not mention partial-failure nuances or limits, but the key traits are disclosed.
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 tight sentences, front-loaded with the core action, then the failure semantics, then the state prerequisite. No filler; the only redundancy is repeating the item_id-from-get_estimate hint already in the schema.
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 destructive mutation with no output schema, the description covers everything an agent needs: valid inputs, atomicity/abort behavior, the returned value (new estimate total), and the state guard with its workaround.
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 coverage is 100%, so both parameters are already documented, and the description largely restates the item_ids provenance that the schema already states. It adds only the constraint that item_ids must currently belong to the estimate, which is a modest addition over 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 opening sentence names a specific verb (deletes) and resource scope (line items on an estimate), which cleanly separates it from delete_estimate and from add_estimate_items. An agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives the precondition explicitly (estimate must be in 'estimating' state), names the states that cause refusal (pending_approval, approved, completed), and routes the agent to update_estimate as the remediation. It also points to get_estimate as the source of valid item_ids.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_change_orderSend change orderADestructive
Emails the change order as a PDF to the customer or to the addresses you give.
Sends the change order (or request) PDF by email from Contractor Foreman, as the panel's View/Email PDF does. Without to it goes to the project's customer, and a customer without an email stops the call. The status does not change: update_change_order sets pending_approval or approved.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Recipient emails. Default: the project's customer. | |
| copy_me | No | ||
| message | No | Email text above the PDF. | |
| subject | No | Default: the app's 'Change Order #n'. | |
| change_order_id | Yes | From list_change_orders. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (openWorld, non-idempotent, destructive), the description adds the default recipient, the hard failure mode ('a customer without an email stops the call'), and the fact that status is not mutated. It does not describe what a successful call returns or any email/rate constraints, but the added context is substantial.
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 tight sentences with the action front-loaded and the state-mutation caveat at the end where it belongs. The panel/UI reference ('as the panel's View/Email PDF does') is minor filler for an agent but harmless.
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?
No output schema, and the description covers the default path, failure condition, and side-effect boundary — enough to call it correctly. Only the shape of a successful response is left implicit.
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 coverage is 80% and the schema already documents 'to', 'message', 'subject', and 'change_order_id'. The description reinforces the 'to' default and its failure case but says nothing about 'copy_me' or the 10-recipient cap, so baseline 3 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 and resource ('Emails the change order as a PDF') plus the recipient scope, which cleanly separates it from send_estimate, send_invoice, and from update_change_order. An agent can pick it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative and what it does differently ('The status does not change: update_change_order sets pending_approval or approved'), and states the default recipient path when 'to' is omitted. Both when-to-use and when-to-use-something-else are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_estimateSend estimateADestructive
Emails the estimate as a PDF to the customer or to the addresses you give.
Sends the customer version of the estimate PDF by email from Contractor Foreman, as the panel's View/Email PDF does. Without to it goes to the estimate's customer, and a customer without an email stops the call. The estimate's status does not change. update_estimate sets it (pending_approval, approved).
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Recipient emails. Default: the estimate's customer. | |
| copy_me | No | Send a copy to you. | |
| message | No | Email text above the PDF. | |
| subject | No | Default: the app's 'Estimate: <title> (#n)'. | |
| estimate_id | Yes | From list_estimates or create_estimate. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: it discloses the external side effect (email sent from Contractor Foreman), the failure mode for a customer lacking an email, and explicitly that the estimate's status does not change — a fact an agent would otherwise have to guess at, since destructiveHint=true does not imply a status mutation.
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?
Front-loads the core action in the first sentence, then adds recipients, failure mode, and the status clarification. The middle sentence is dense but each clause carries distinct information; the "as the panel's View/Email PDF does" analogy is a small redundancy for API-only agents.
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 fire-and-forget send action with no output schema, the description covers routing, failure behavior, and the state-invariance caveat. It does not say whether a success response carries a message id or delivery result, but that gap is minor.
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 coverage is 100%, so every parameter including `to`, `subject`, `message`, and `copy_me` is already documented in the schema. The description only restates the `to` default, adding no syntax or constraint detail beyond structured data, so the baseline 3 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?
Opens with a specific verb+resource ("Emails the estimate as a PDF") and states the recipient scope (customer or supplied addresses). The resource is unambiguously an estimate, which separates it from send_invoice and send_change_order in the sibling list.
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?
Explains the default routing ("Without to it goes to the estimate's customer") and the blocking condition (customer without an email stops the call), and routes the status-change need to update_estimate with its enum values. It gives clear context but no explicit when-not-to-use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_invoiceSend invoiceADestructive
Emails the invoice as a PDF to the customer or to the addresses you give.
Sends the invoice PDF by email from Contractor Foreman, as the panel's View/Email PDF does. Without to it goes to the invoice's customer, and a customer without an email stops the call. The invoice needs a due date (update_invoice). Sending does not change the status: update_invoice with status submitted marks it sent.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Recipient emails. Default: the invoice's customer. | |
| copy_me | No | ||
| message | No | Email text above the PDF. | |
| subject | No | Default: the app's 'Invoice #n'. | |
| invoice_id | Yes | From list_invoices or create_invoice. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive/openWorld/non-idempotent, and the description adds real context beyond them: sending does NOT change invoice status, and a customer lacking an email aborts the call. It does not explain the irreversibility that the destructiveHint implies, or error behavior for bad addresses.
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 sentences, front-loaded with the core action, and the status clarification earns its place. The comparison to the panel's View/Email PDF is a reference an agent cannot act on and is mild 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?
With no output schema, the description covers preconditions, recipient defaults, blocking conditions, and post-send state so an agent can call it correctly. Minor gaps remain around failure modes beyond the missing-customer-email case.
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 coverage is 80%, so most semantics are already documented. The description largely restates the `to` default that the schema already states, adds the no-email failure mode, but says nothing about copy_me or message.
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 precise verb and resource: the invoice PDF is emailed to the customer or supplied addresses. It also distinguishes itself from status-changing siblings by naming update_invoice as the way to mark an invoice sent.
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?
Gives clear preconditions (invoice needs a due date) and routes to update_invoice for the follow-up status change, plus the blocking case of a customer with no email. It stops short of explicitly naming when to prefer send_estimate or send_change_order instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_change_orderUpdate change orderA
Changes a change order's status, title, reason or date.
Sets only the fields you pass. Change order statuses: open, pending_approval, on_hold, approved (Unbilled/Approved, counts toward the contract), denied, billed. Change order request statuses: draft, on_hold, approved, denied, closed. A status of the other kind stops the call. Nobody is emailed. send_change_order does that.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| title | No | ||
| status | No | ||
| description | No | ||
| change_order_id | Yes | From list_change_orders. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-destructive, non-idempotent, open-world, so the description doesn't owe a safety profile. It still adds real behavior: merge semantics, that a status of the wrong kind aborts the call (a validation error, not a silent mis-set), and that no notification email is fired. Gaps remain on permission requirements and whether status transitions can be reverted.
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?
Front-loaded with the core action and the partial-update rule, then the status taxonomy, then the side-effect caveat. Every sentence carries information; the two status enumerations are slightly redundant against the schema enum but earn their place by explaining the split.
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-param mutation with no output schema, the description covers merge semantics, enum ambiguity, failure mode, and notification side effects — enough to call it correctly. Missing only permission/prerequisite context and any note on reversing a billed/approved status.
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 coverage is only 20% (only change_order_id is documented), so the description must compensate, and it largely does: it enumerates the two families of status values and explains why the single status enum contains both 'open/approved/pending_approval' and 'draft/closed'. The 'reason' vs 'description' naming mismatch is the one place the description misleads rather than clarifies.
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 and resource plus the fields it mutates, so it's clearly distinct from create_change_order, delete_change_order, and send_change_order. Minor flaw: it names 'reason' as an updatable field, but the schema exposes 'description' and no 'reason' property, so an agent could look for a nonexistent field.
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?
Explicitly explains the partial-update contract ('Sets only the fields you pass') and routes the notification case to send_change_order ('Nobody is emailed. send_change_order does that'). It doesn't state hard exclusions (e.g., which status transitions are disallowed beyond the kind mismatch), but the intended context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_daily_logUpdate daily logA
Change the notes, times, people, deliveries, weather notes or delays of a daily log.
Replaces only the fields you pass and returns the log as get_daily_log shows it. Text fields are replaced, not appended: read the log first to add to its notes. materials_delivered replaces the material notes. weather_delay, schedule_delay and visitors can mark a delay or a visit but not clear it. The log date and project do not change. The log reaches no client or crew, so this tool runs without asking.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Work done and site notes (the log's Work Performed). | |
| people | No | Crews, subcontractors and visitors on site: headcount per crew, or free text. | |
| visitors | No | Visitors on site (inspector, owner, architect). | |
| arrival_time | No | Arrival on site, e.g. 07:00 or 7:00 AM. | |
| daily_log_id | Yes | daily_log_id from list_daily_logs. | |
| jobsite_notes | No | Jobsite condition notes. | |
| weather_delay | No | What the weather delayed. Marks a weather delay. | |
| weather_notes | No | Your own notes next to the recorded weather. | |
| departure_time | No | Departure from site, e.g. 15:30. | |
| schedule_delay | No | What else held the schedule up. Marks a schedule delay. | |
| materials_delivered | No | Materials delivered or used, one line each. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile, and the description adds real behavior on top: patch semantics (only passed fields change), replace-not-append for text, materials_delivered overwriting material notes, inability to clear delay/visitor markers, immutability of date and project, and no client/crew notification. That is far more than the annotations convey. One mild tension: 'replaces only the fields you pass' reads as idempotent while idempotentHint=false, but this is not a direct contradiction.
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?
Front-loaded with the purpose, then ordered from semantics to side effects. Every sentence carries information (patch behavior, read-first caveat, field limitations, immutability, no-notification), though the delay/visitor sentence is dense and slightly repetitive with the materials sentence.
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 11 parameters, no output schema, and a mutation, this description does what is needed: it explains patch semantics, the return shape ('as get_daily_log shows it'), the fields that cannot be modified, and the notification side effect. An agent has enough to invoke it safely without further probing.
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 coverage is 100%, so baseline is 3; the description still adds genuine semantics beyond the schema — replacement vs. append on text fields, that materials_delivered overwrites material notes, and that weather_delay/schedule_delay/visitors can only set, not clear. These are behaviors an agent cannot infer from the property descriptions.
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 (change/update) and resource (daily log) plus the exact field families it touches. It differentiates itself by reference to siblings: results match 'get_daily_log' and the id comes from 'list_daily_logs', so an agent can place it among the create/get/list daily-log tools without opening 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?
Gives actionable preconditions: 'read the log first to add to its notes' and 'the log reaches no client or crew, so this tool runs without asking'. It clearly bounds what the tool is not (date/project immutable, delays can't be cleared), but it never explicitly names update vs. create_daily_log as the alternative for a given situation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_estimateUpdate estimateA
Changes an estimate's status, title, dates, description, inclusions or exclusions.
Sets only the fields you pass. status moves the estimate on the Estimates board: estimating, pending_approval, on_hold, re_estimating, approved, completed or lost. Marking it approved here does not email anyone. send_estimate sends it. Line items change with add_estimate_items and remove_estimate_items.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | ||
| status | No | ||
| exclusions | No | ||
| inclusions | No | ||
| description | No | ||
| estimate_id | Yes | From list_estimates. | |
| expire_date | No | ||
| estimate_date | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, but the description adds genuinely useful behavior: partial-update semantics ('Sets only the fields you pass') and the negative side effect ('Marking it approved here does not email anyone'). It stops short of stating permissions or what the response contains, so a 4 rather than a 5.
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 tight sentences; the partial-update rule and status semantics come first, and the sibling routing comes last. No restatement of the name or title, no wasted clauses.
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 an 8-parameter mutation with no output schema, the description covers partial updates, status transitions, side effects, and the related tools well. It omits what the call returns and whether invalid status transitions are rejected, which are the remaining gaps.
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 coverage is only 13% (just estimate_id), so the description must carry the load — and it does, naming the mutable fields and spelling out the full status lifecycle and what 'approved' does not do. It still adds no format detail for inclusions/exclusions/description or the date fields, so not a 5.
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 ('Changes an estimate's...') and enumerates the exact fields that can be modified. It also explicitly separates this tool from send_estimate and the add/remove item tools, so an agent can pick it out of the crowded sibling list without reading 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?
Explicitly routes the agent: status changes happen here, but emailing the estimate requires send_estimate, and line items are handled by add_estimate_items/remove_estimate_items. That is a clear when-to-use / when-not-to-use statement with named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_invoiceUpdate invoiceA
Changes an invoice's status, invoice date, due date or description.
Sets only the fields you pass. Statuses: draft, submitted (sent to the customer, payments can be recorded), on_hold, paid, denied, write_off. Contractor Foreman needs a due date on every change, so an invoice without one needs due_date in the same call. Nobody is emailed. send_invoice does that.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | ||
| due_date | No | ||
| invoice_id | Yes | From list_invoices. | |
| description | No | ||
| invoice_date | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic write profile (readOnly=false, destructive=false, idempotent=false), while the description adds real behavioral context: patch semantics rather than overwrite, no customer notification on status change, and a business rule that the system requires a due date on every change. The parenthetical explaining that 'submitted' means sent to the customer and permits payments is meaningful domain state information.
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?
Four short sentences, front-loaded with the verb and affected fields before the caveats. The status enumeration could have been left to the schema, but the added gloss on 'submitted' makes it earn its space.
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 mutation tool with no output schema, it covers the essentials an agent needs to call it correctly: partial update, no side-effect email, and the due_date precondition. It does not say what is returned or whether status transitions are validated (e.g. paid back to draft), which are the only notable omissions.
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 coverage is low (20% — only invoice_id is documented), so the description must compensate, and it does well for the two hardest parameters: it lists all six status values with meaning for 'submitted' and states the due_date requirement. It adds nothing about invoice_date or description beyond naming them as updatable, which is the remaining gap.
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 (changes) plus the exact resource and the four mutable fields, so the scope of the write is unambiguous. It also implicitly separates itself from the sibling send_invoice by stating that no email goes 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?
Explicitly states partial-update semantics ("Sets only the fields you pass") and names the alternative tool for the excluded behavior ("Nobody is emailed. send_invoice does that."). It also flags a hard precondition: due_date must be included if the invoice has none, which is exactly the kind of routing an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_projectUpdate projectA
Change a project's name, stage, type, address, dates or description.
Changes only the fields you pass and returns the project as get_project shows it. A completed project drops out of list_projects unless include_completed is true. Editing the schedule can move the project dates again. Nothing reaches the customer, so this tool runs without asking.
| Name | Required | Description | Default |
|---|---|---|---|
| zip | No | ||
| city | No | ||
| name | No | ||
| type | No | ||
| state | No | ||
| status | No | New stage, e.g. started or completed. | |
| street | No | ||
| street2 | No | ||
| end_date | No | ||
| project_id | Yes | project_id from list_projects. | |
| start_date | No | ||
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important behavior: only passed fields change, the response matches get_project, completed projects drop out of list_projects, schedule edits can shift project dates, and the operation does not notify the customer and runs without approval. These are substantive side-effect and workflow details that annotations alone do not convey.
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 action and editable fields, then adds return behavior, visibility, scheduling side effects, and approval behavior. Every sentence is relevant, though the paragraph is slightly dense and could separate operational caveats more cleanly.
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 12-parameter mutation tool with no output schema and low schema descriptions, the definition covers patch semantics, return shape, side effects on project visibility and dates, and approval behavior. It still leaves the exact mapping of address parameters and the non-idempotent nature implicit, but the core context is present.
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 only 17%, so the description must help, and it does by naming the categories of editable fields. However, it maps 'address' to street/city/state/zip only implicitly, calls 'status' a 'stage', and does not clarify the enum values or date formats beyond what the schema already provides. This is useful but incomplete compensation for the low 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 states a specific verb and resource ('Change a project's') and enumerates the editable fields: name, stage, type, address, dates, description. It distinguishes itself from get_project and list_projects by explaining the return shape and visibility consequences, so an agent can tell it is the project-mutation tool rather than a read tool.
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 clear usage context: partial updates are supported, completed projects disappear from list_projects unless include_completed is true, and schedule edits can move dates again. It does not explicitly compare itself to nearby alternatives such as update_schedule_task, but the update-project scope is otherwise unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_schedule_taskUpdate schedule taskA
Change the name, dates, length or percent complete of a task on the project schedule.
Changes one task and returns it as the schedule shows it afterwards. start_date alone moves the task and keeps its length; end_date or duration_days change the length. Tasks that depend on it are not moved: check depends_on in list_schedule_tasks and move them too. The project's start and end dates follow the schedule. A schedule edit reaches nobody outside your company and one more call undoes it, so this tool runs without asking.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| task_id | Yes | task_id from list_schedule_tasks. | |
| end_date | No | New last day. | |
| project_id | Yes | project_id from list_projects. | |
| start_date | No | New first day. Alone, it moves the task and keeps its length. | |
| duration_days | No | New length in days, from the start. | |
| percent_complete | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only mark it as a non-readonly, non-idempotent, non-destructive write; the description adds what actually happens: dependents are not shifted, the project start/end dates follow the schedule, and the call is easily undone with one more call. That is exactly the beyond-annotations context an agent needs before mutating a schedule.
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?
Front-loaded with the action, then a tight sequence of behavioral facts, each sentence carrying distinct information with no filler. It runs to five sentences, and the dependency and no-confirmation points could be tightened, but nothing is wasted.
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 7-parameter mutation with no output schema, it covers the outcome ('returns it as the schedule shows it afterwards'), the side effects on dependents and project dates, and the safety/undo story. Nothing an agent needs in order to invoke it correctly is missing.
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 coverage is 71%, so the schema documents most fields, but the description adds cross-parameter semantics the schema cannot express: start_date alone moves the task while preserving length, whereas end_date or duration_days redefine the length. name and percent_complete get no extra semantics, which keeps it from a 5.
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?
A concrete verb plus resource ('Change the name, dates, length or percent complete of a task on the project schedule') and it immediately pins the object as a single schedule task, which separates it from the many update_* siblings. The second sentence reinforces that exactly one task is modified and returned.
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?
Gives real usage guidance: it points to list_schedule_tasks for checking depends_on and tells the agent to move dependents too, and it clarifies that no confirmation prompt is needed because the edit is internal and reversible. It stops short of naming an alternative tool or stating when not to use it, so it is clear context without explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_service_ticket_statusUpdate service ticket statusAIdempotent
Moves a service ticket to scheduled, en route, checked in, completed, closed and so on.
Sets the status of a Contractor Foreman service ticket as the status field on its page does: unscheduled, scheduled, en_route, checked_in, requires_followup, canceled, completed or closed. The app's own en-route and completion emails to the customer are separate buttons and are not sent. Completed moves the service date to today, as the app does. Returns the ticket as saved.
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | ||
| service_ticket_id | Yes | service_ticket_id from list_service_tickets. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds behavior well beyond the annotations: it discloses the side effect that 'completed' moves the service date to today, clarifies that customer-facing emails are NOT sent, and states the return value ('the ticket as saved'). These are exactly the non-obvious consequences an agent needs before mutating a ticket, and nothing contradicts the idempotent/non-destructive hints.
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?
Front-loaded with the core action and includes only decision-relevant details (email caveat, date mutation, return value). Minor redundancy: the status values are enumerated twice, once informally in the first sentence and again in full in the second.
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 two-parameter mutation with no output schema, the description covers what changes, the key side effect, what is deliberately not triggered, and what is returned. An agent has everything needed to call 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 coverage is 50% (only service_ticket_id is described), so the description compensates by restating the full status enum and, importantly, explaining the semantic consequence of the 'completed' value. It does not explain 'requires_followup' or 'closed' beyond the label, leaving some interpretation to the enum names.
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 and resource ('Sets the status of a Contractor Foreman service ticket') and explicitly frames it as the programmatic equivalent of the status field on the ticket page. The full set of target statuses is named, so an agent can distinguish this from get_service_ticket or create_service_ticket 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?
Explains the operational context (mirrors the app's status field) and explicitly warns that the en-route and completion emails are separate actions not triggered here, which tells the agent when this tool is and isn't sufficient. It does not name a sibling alternative or state prerequisites such as permissions, so it falls short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_todoUpdate to-doA
Change a to-do's name, description, due date, priority or status, e.g. mark it complete.
Changes only the fields you pass and returns the to-do as get_todo shows it. status complete closes it, open reopens it. Assignees and checklist items are not changed. Nothing is sent to anyone, so this tool runs without asking.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| status | No | complete closes the to-do. | |
| todo_id | Yes | todo_id from list_todos. | |
| due_date | No | ||
| due_time | No | e.g. 09:00 or 2:30 PM. | |
| priority | No | ||
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses that this is a partial update, describes the return value relative to get_todo, explains status semantics, notes excluded fields, and states that no notification is sent. These details materially improve safe invocation.
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 four focused sentences, front-loads the core action, and then layers update semantics, status behavior, and side effects without wasted text.
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 mutation tool with annotations and no output schema, the description is largely complete: it covers partial update behavior, return shape, status semantics, and exclusions. Minor gaps remain around due_time and permissions, but nothing critical is missing.
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 description covers several updatable fields and clarifies status behavior, which helps offset low schema coverage. However, it omits due_time, and does not add enough detail to fully compensate for the 43% schema description 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 and resource (‘Change a to-do’s…’) and enumerates the mutable fields, making the tool immediately distinguishable from get_todo, list_todos, create_todo, and other update_* 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?
It gives a clear use case (‘e.g. mark it complete’) and states boundaries such as assignees and checklist items not being changed. It does not explicitly name alternatives or when-not-to-use conditions, so it falls 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_order_statusUpdate work order statusAIdempotent
Moves a work order to open, estimating, submitted, approved, canceled or completed.
Sets the status of a Contractor Foreman work order as the status field on its page does. The status in the answer is the label the company uses for it. Nobody is emailed. Returns the work order as saved.
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | ||
| work_order_id | Yes | work_order_id from list_work_orders. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose that this is a non-readonly, idempotent, non-destructive, open-world operation. The description adds useful behavior beyond the annotations: nobody is emailed, the returned status is the company's label, and the tool returns the work order as saved. It does not mention permission requirements, but with annotations present the bar is lower.
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 first sentence is front-loaded and states the operation and allowed statuses. The following sentences add useful behavior with little waste, though listing the status values duplicates the schema enum.
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 two-parameter mutation tool with annotations and no output schema, the description covers the essential operation, return behavior, and side-effect expectation. It could be stronger by explicitly tying work_order_id back to list_work_orders or noting any permission constraints.
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 coverage is 50%: work_order_id is documented in the schema as coming from list_work_orders, and status is an enum. The description repeats the status values but adds little beyond the enum, and it does not elaborate on work_order_id. This is adequate but leaves clear gaps.
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: it moves/sets a work order's status, and it names the exact status values. This makes the operation distinguishable from sibling tools such as get_work_order, list_work_orders, and create_work_order.
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 used to change an existing work order's status, and the schema points to list_work_orders for the ID. However, it does not explicitly state when to use this tool versus get_work_order, list_work_orders, or create_work_order, and it gives no exclusions or prerequisites.
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.
89 tool updates
v1.0.1- First observed
add_change_order_items - First observed
add_estimate_items - First observed
add_invoice_items - First observed
add_project_note - First observed
create_bill - First observed
create_change_order - First observed
create_contact - First observed
create_daily_log - First observed
create_estimate - First observed
create_expense - First observed
create_inspection - First observed
create_invoice - First observed
create_lead - First observed
create_opportunity - First observed
create_project - First observed
create_punchlist - First observed
create_purchase_order - First observed
create_rfi - First observed
create_service_ticket - First observed
create_share_link - First observed
create_sub_contract - First observed
create_todo - First observed
create_work_order - First observed
delete_change_order - First observed
delete_estimate - First observed
delete_invoice - First observed
get_bill - First observed
get_change_order - First observed
get_clock_status - First observed
get_contact - First observed
get_daily_log - First observed
get_estimate - First observed
get_expense - First observed
get_inspection - First observed
get_invoice - First observed
get_job_costing - First observed
get_opportunity - First observed
get_project - First observed
get_punchlist - First observed
get_purchase_order - First observed
get_rfi - First observed
get_service_ticket - First observed
get_sub_contract - First observed
get_submittal - First observed
get_time_card - First observed
get_todo - First observed
get_work_order - First observed
list_bills - First observed
list_change_orders - First observed
list_contacts - First observed
list_cost_codes - First observed
list_cost_items - First observed
list_daily_logs - First observed
list_estimates - First observed
list_expenses - First observed
list_inspections - First observed
list_invoices - First observed
list_leads - First observed
list_opportunities - First observed
list_payments - First observed
list_project_crew_hours - First observed
list_project_files - First observed
list_project_notes - First observed
list_projects - First observed
list_punchlists - First observed
list_purchase_orders - First observed
list_rfis - First observed
list_schedule_tasks - First observed
list_service_tickets - First observed
list_sub_contracts - First observed
list_submittals - First observed
list_time_cards - First observed
list_todos - First observed
list_work_orders - First observed
record_inspection_result - First observed
record_payment - First observed
remove_estimate_items - First observed
send_change_order - First observed
send_estimate - First observed
send_invoice - First observed
update_change_order - First observed
update_daily_log - First observed
update_estimate - First observed
update_invoice - First observed
update_project - First observed
update_schedule_task - First observed
update_service_ticket_status - First observed
update_todo - First observed
update_work_order_status
TDQS
Scored across 89 tools
The tools are mostly organized around distinct resources and actions, so an agent can usually tell a project tool from an estimate, invoice, or change order tool. Some boundaries blur around time tracking (get_clock_status, list_time_cards, get_time_card, list_project_crew_hours) and contacts versus leads, though the descriptions provide enough context.
Every tool name uses snake_case with a verb_noun structure. Verbs such as get, list, create, update, delete, add, remove, send, and record are used predictably by operation type.
With 89 tools, the server is far beyond a typical well-scoped MCP surface and risks overwhelming tool selection. Even for a broad construction ERP domain, this level of granularity is too large for a single cohesive tool set.
Core financial workflows such as estimates, invoices, change orders, and payments have strong lifecycle coverage. However, many modules have notable dead ends: punchlists cannot add items, files cannot be uploaded, and submittals, RFIs, contacts, leads, opportunities, bills, purchase orders, and sub-contracts lack key update, delete, or send operations.
Maintenance
Related MCP Connectors
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Run field service from Claude, ChatGPT or Copilot: dispatch, billing, customer messages, photos, and change the software itself, with a confirm step before every change. This address is the India region; US East, Canada, Norway and NZ addresses are at fieldproxy.ai/mcp.
184 MCP tools for field-service CRM, scheduling and double-entry accounting. Hosted; BYO agent.
Connect any AI agent to 1,000+ apps and 27,000+ actions through one remote MCP server (OAuth).
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceProvides AI agents with 220+ tools for building websites, sending email, managing contacts, invoicing, databases, automation, and more through a single secure connection. Features hardware-bound authentication and works with Claude Desktop, Claude Code, Cursor, and other MCP-compatible clients.MIT
- FlicenseNot gradedqualityAmaintenanceExposes a governed suite of 38 tools over a single OAuth-gated MCP endpoint, letting web AI chat clients such as Claude, ChatGPT, and Grok operate on a local machine — reading and editing files, running whitelisted shell commands, searching, querying SQLite, driving browsers and DevTools, managing background jobs, ports, and clipboard. Local IDEs and Postman can also connect directly over localhost for offline, low-latency access.-
- AlicenseNot gradedqualityAmaintenanceA local MCP server that lets AI coding tools drive your own already-logged-in Chrome through a browser extension, rather than a headless or cookie-copied instance. It exposes 25 tools for snapshotting pages, clicking, typing, reading content, taking screenshots, recording network traffic, and reading cookies or storage, so agents can act on authenticated sites without triggering bot detection.1 npmISC
- AlicenseNot gradedqualityAmaintenanceEnables web-based AI clients like Claude, ChatGPT, and Grok to securely operate a local machine through an OAuth-gated MCP endpoint, covering files, shell commands, search, Git, SQLite, browser automation, DevTools, background tasks, ports, clipboard, notifications, and Postman. Exposes 38 governed tools with a strict command whitelist, folder allowlisting, and rate limiting so browser chats can build projects, inspect databases and local APIs, and manage long-running jobs without granting unrestricted shell access.MIT