Skip to main content
Glama

Crisphive MCP

glama score npm

The official MCP (Model Context Protocol) server for the Crisphive APIagentic AI scheduling infrastructure for field operations.

Lets AI agents — Claude, ChatGPT, Gemini, Cursor or any MCP client — match schedules between customers and businesses and route crews to jobs by location, skills, and real-time availability: job booking & appointment scheduling, work-order tracking, availability from a live dispatch & scheduling engine, customer (CRM) sync, service catalogs, technician & crew rosters, geographic service territories and fleet — for trades and home services such as HVAC, plumbing, electrical, cleaning, appliance repair and property maintenance. Scheduling is constraint-based on a deterministic solver: the agent handles the conversation, the solver makes the decision — same inputs, same plan, never an LLM guessing at a calendar. Hosted remote server; nothing to install or run (this repository holds the documentation and registry manifest).

https://api.crisphive.com/mcp

Try these first

Connect (a chsk_test_ sandbox key is enough), then paste any of these straight into your agent:

  1. Job creation"Schedule a 2-hour HVAC job at 145 Laurier Ave W tomorrow for Marie Tremblay, 613-555-0142." (createCustomer → listJobRequestBookingWindows → createJobRequest → quoteJobRequest → confirmJobRequest)

  2. Emergency insertion"Emergency plumbing job now at 99 Bank St for David Okafor (613-555-0198) — show me what gets rescheduled." (listEmergencyCandidates → previewEmergencyReschedule → commitEmergencyReschedule)

  3. Daily outline"Outline my day tomorrow and flag anything at risk." (listJobRequests → getTechnicianSchedule)

  4. Availability discovery"Find 3 hours this week for a bike ride with my wife without risking any jobs." (getTechnicianSchedule → the agent reasons over the slack)

The same prompts appear on every Crisphive listing and docs page, so what you see here is exactly the first-run experience everywhere.

→ Full overview, tool table and one-click connect: https://crisphive.com/claude

Related MCP server: Servicialo

Requirements

Any MCP client that supports remote servers over Streamable HTTP — claude.ai, Claude Desktop, Claude Code, ChatGPT, Gemini CLI, Cursor, VS Code, Windsurf, Cline, Zed, LM Studio, ….

Installation

claude.ai / Claude Desktop (OAuth — no key needed)

Settings → Connectors → Add custom connector, paste https://api.crisphive.com/mcp. Sign in as the Crisphive business owner when the consent screen opens. (Custom connectors require a Claude plan that supports them.)

Claude Code

# OAuth (you'll be prompted to authorize in the browser)
claude mcp add --transport http crisphive https://api.crisphive.com/mcp

# or with an API key (sandbox key shown — safe to experiment)
claude mcp add --transport http crisphive https://api.crisphive.com/mcp \
  --header "Authorization: Bearer chsk_test_YOUR_KEY"

Cursor

Add to Cursor

Or add to .cursor/mcp.json:

{
  "mcpServers": {
    "crisphive": { "url": "https://api.crisphive.com/mcp" }
  }
}

VS Code

code --add-mcp '{"name":"crisphive","url":"https://api.crisphive.com/mcp"}'

ChatGPT

Settings → Connectors (developer mode) → add MCP server with URL https://api.crisphive.com/mcp (OAuth).

Gemini CLI

Add to ~/.gemini/settings.json (note: Gemini CLI uses httpUrl for Streamable HTTP servers):

{
  "mcpServers": {
    "crisphive": {
      "httpUrl": "https://api.crisphive.com/mcp",
      "headers": { "Authorization": "Bearer chsk_test_YOUR_KEY" }
    }
  }
}

Other MCP clients (Windsurf, Cline, Zed, LM Studio, …)

Most clients accept the standard remote-server shape:

{
  "mcpServers": {
    "crisphive": {
      "url": "https://api.crisphive.com/mcp",
      "headers": { "Authorization": "Bearer chsk_test_YOUR_KEY" }
    }
  }
}

Only the URL field name varies in a few clients:

Client

Config file

URL field

Cline / Roo Code

cline_mcp_settings.json

url

Windsurf

~/.codeium/windsurf/mcp_config.json

serverUrl

Gemini CLI

~/.gemini/settings.json

httpUrl

Zed

settings.jsoncontext_servers

url

Clients that only speak stdio can bridge with mcp-remote:

{
  "mcpServers": {
    "crisphive": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://api.crisphive.com/mcp"]
    }
  }
}

Local server (npm — @crisphive/mcp)

This repository also ships a thin local stdio server: the same 57 tools (same names, same schemas — generated from the same /v1 OpenAPI spec as the hosted endpoint), where each call is an HTTPS request to the Crisphive API with your key. No business logic runs locally.

{
  "mcpServers": {
    "crisphive": {
      "command": "npx",
      "args": ["-y", "@crisphive/mcp"],
      "env": { "CRISPHIVE_API_KEY": "chsk_test_YOUR_KEY" }
    }
  }
}

Environment variables:

Variable

Required

Meaning

CRISPHIVE_API_KEY

for tool calls

chsk_live_… = production data, chsk_test_… = isolated sandbox. Create keys in the dashboard (Developers → API keys).

CRISPHIVE_BASE_URL

no

API origin override (default https://api.crisphive.com).

Prefer the hosted remote server (https://api.crisphive.com/mcp) when your client supports it — OAuth, no key handling, always current. The local package exists for stdio-only clients and self-hosted setups.

Developing in this repo: npm ci && npm test. The tool registry (src/tools.generated.json) is generated — npm run generate refreshes it from the live spec; CI fails if it drifts from /v1.

Authentication

Every request is authenticated with a secret API key sent as a bearer token. Create keys from your Crisphive business dashboard. The key prefix selects the data environment:

  • chsk_live_… → live (production) data

  • chsk_test_… → sandbox (isolated test) data

Load keys from the environment — never commit them.

Keys expire. The lifetime is chosen when the key is created — 30 days by default, up to 365 — and is fixed for that key's life; it cannot be extended later. To renew, create a second key, point your agent at it, then revoke the first: a business can hold several active keys at once, so the changeover has no downtime and needs no special endpoint (the same procedure AWS documents for access keys). Read expires_at from the dashboard or the key API and schedule the swap. An aged-out key fails with API_KEY_EXPIRED, distinct from API_KEY_INVALID, so you can alert on a missed renewal separately from a revocation.

Crisphive emails the business's owners 7 days before a key expires (14 days for an OAuth connection), so an expiry should not be a surprise — but the mail goes to the business, not necessarily to you, so track expires_at yourself. A key deliberately created for less than 7 days gets no advance notice; it would have arrived at creation.

The MCP endpoint additionally supports OAuth 2.1 for end-user connectors (claude.ai, ChatGPT, …): the business owner authorizes your agent on a consent screen and no key is ever handled. A compliant MCP client runs the whole flow automatically — discovery, dynamic client registration, authorization code + PKCE. Full flow, scopes and token lifetimes: docs/integration.md.

Tools

57 tools, one per operation of the public /v1 API — same names as the SDK methods (listCustomers, createJobRequest, …), derived from the same OpenAPI spec so REST and MCP never drift. Full reference: docs/tools.md.

Group

Tools

Customers (CRM sync, full CRUD)

listCustomers · createCustomer · getCustomer · updateCustomer · deleteCustomer

Bookings (create & track)

createJobRequest · listJobRequests · getJobRequest · getJobRequestTimeline · listJobRequestBookingWindows · listJobRequestChanges

Catalog (read-only)

listJobTypes · getJobType · listSkills · listSkillCategories · listSkillsByCategory · listServiceAreas · getServiceArea

Team & fleet (reads)

listTechnicians · getTechnician · listVehicles · getVehicle

Team roster management (HR-system sync)

createTechnician · updateTechnician · deleteTechnician · replaceTechnicianBuddies · replaceTechnicianLeads · replaceTechnicianVehicles · replaceTechnicianServiceAreas · replaceTechnicianSkills · listTechnicianSkills

Matching & scheduling (read-only, engine-computed)

listMatchingSlots · listCrewCandidates · getTechnicianSchedule · listNearbyTechnicians

Scheduling actions (drive the schedule)

quoteJobRequest · confirmJobRequest · previewJobRequestMove · commitJobRequestMove

Priority & emergency dispatch (P0–P3, SLA, cascade)

updateJobPriority · listEmergencyCandidates · previewEmergencyReschedule · commitEmergencyReschedule

Typical agent flow:

listSkills / listJobTypes                → discover reference IDs
createCustomer                           → { customer_id }
listJobRequestBookingWindows             → offer only the returned windows
createJobRequest                         → booking created
quoteJobRequest → confirmJobRequest      → scheduled (auto or forced technician)
getJobRequest / listJobRequestChanges    → track status

Emergency (P0) flow:

createJobRequest (priority: "p0") → quoteJobRequest
listEmergencyCandidates                  → ranked techs + crew_recommendation
previewEmergencyReschedule               → what moves (or reassigns)
commitEmergencyReschedule                → inserted + auto-confirmed

Pagination

List tools accept page / limit and return a meta object (total, count, per_page, current_page, total_pages).

Idempotency

Create/commit tools (createCustomer, createTechnician, createJobRequest, confirmJobRequest, commitJobRequestMove, commitEmergencyReschedule) accept an idempotency_key argument so retries never create a duplicate — pass the same value when retrying.

Errors

Every tool returns the Crisphive response envelope (as text and as structuredContent): error_code is 0 on success, a stable string on failure (CUSTOMER_NOT_FOUND, API_KEY_INVALID, …). Match codes, never message strings.

Documentation

Privacy & support

  • Privacy policy: https://crisphive.com/privacy-policy — Crisphive processes the business data reachable through the API (customers, bookings, technicians, fleet) solely to operate the Service; it does not sell personal information. Data is retained while the account is active and shared only with service providers/sub-processors as necessary. An agent connected over MCP acts on behalf of the authorizing business and is scoped to that business's data, environment (live vs sandbox) and granted permissions.

  • Support: support@crisphive.com

License

MIT

Available Tools

53 tools
commitEmergencyRescheduleCommit emergency insert + cascade rescheduleAInspect

Commit emergency insert + cascade reschedule

Applies the cascade previewed by /emergency/preview: assigns the emergency job to the technician and pushes the displaced jobs back (or, with displacement_mode=reassign, re-staffs them onto their previewed alternates first), atomically. Supports Idempotency-Key. The server recomputes the plan under a lock and fences each job on its status_version — if anything changed since the preview it returns 409 EMERGENCY_RESCHEDULE_PLAN_DRIFTED (re-preview). Same body as preview + optional emergency_expected_version. Isolated feature (see EMERGENCY_RESCHEDULE_DESIGN.md). 409 NEXT STEPS: EMERGENCY_RESCHEDULE_PLAN_DRIFTED — the schedule changed between your preview and this commit (another booking/move won a lane): call /preview again, show the fresh plan, then commit. EMERGENCY_RESCHEDULE_SLOT_OCCUPIED — landing window blocked by an immovable anchor (P0/crew/multi-day): another tech or time. Other codes — same remedies as /candidates.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYesCascade mode: overtime | next_day (must match the preview).
start_atYesDesired start — business-local naive datetime, no offset. Must be in the future and match the preview.
technician_idYesTarget technician (must belong to the business).
idempotency_keyNoUnique key making retries safe: a repeat send with the same key replays the original response (header Idempotent-Replayed: true) instead of re-running the operation. Reusing a key with a different body returns 422 IDEMPOTENCY_KEY_REUSE. (sent as the Idempotency-Key header)
emergency_job_idYesID of the P0 job to insert.
displacement_modeNoFate of displaced jobs: reschedule (default) or reassign — must match the preview.
expected_move_idsNoExpectedMoveIDs — the displaced job IDs the preview returned (echo BOTH data.days[].moves[].job_id AND data.reassignments[].job_id). RECOMMENDED: if the recomputed cascade would touch a different set (a job booked onto the lane since the preview), the commit is rejected with EMERGENCY_RESCHEDULE_PLAN_DRIFTED instead of displacing a job the coordinator never saw. Omit to opt out.
emergency_expected_versionNoOptimistic-lock fence from the previewed job (0 = fence on the server-read version).

TDQS

A4/5.0
Behavior1/5

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

Description claims it supports Idempotency-Key and replays original responses, implying idempotent behavior, but annotation idempotentHint=false contradicts this. Flagged as Annotation Contradiction.

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

Conciseness4/5

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

Front-loaded with purpose, but includes extensive detail on errors and next steps. Somewhat lengthy but necessary for clarity; well-structured.

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

Completeness5/5

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

Comprehensive given no output schema: explains atomicity, locking, version fencing, error codes, and references design doc. All parameters fully described in schema.

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

Parameters4/5

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

Schema coverage is 100%, description adds extra context for expected_move_ids (recommended usage) and idempotency_key (header transmission). Adds value beyond schema.

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

Purpose5/5

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

Clearly states it applies the cascade previewed by /emergency/preview, assigning the emergency job and displacing others. Differentiates from sibling previewEmergencyReschedule by being the commit step.

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

Usage Guidelines5/5

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

Explicitly ties to preview step, provides error handling for 409 codes, and recommends using expected_move_ids to avoid plan drift. Gives clear next steps on failure.

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

commitJobRequestMoveCommit a schedule-board job moveAInspect

Commit a schedule-board job move

Applies the move previewed by /move/preview: places the job on the technician at the new time and pushes the displaced jobs back, atomically (per-tech advisory lock; the server recomputes the plan and fences each job on its status_version — drift since the preview returns 409 SCHEDULE_MOVE_PLAN_DRIFTED, re-preview). Same body as preview + optional expected_version. See SCHEDULE_BOARD_DESIGN.md. 409 NEXT STEPS: SCHEDULE_MOVE_PLAN_DRIFTED — the schedule changed since your preview (or expected_move_ids no longer match): re-preview, show the fresh plan, commit again. All other codes — same remedies as /move/preview.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesJob request ID (UUID or short_code)
modeYesCascade mode: overtime | next_day (must match the preview).
start_atYesNew start — business-local naive datetime, no offset. Must match the preview and be in the future.
technician_idYesTarget technician (must match the preview).
idempotency_keyNoUnique key making retries safe: a repeat send with the same key replays the original response (header Idempotent-Replayed: true) instead of re-running the operation. Reusing a key with a different body returns 422 IDEMPOTENCY_KEY_REUSE. (sent as the Idempotency-Key header)
expected_versionNoExpectedVersion — the moved job's status_version from the preview (0 = fence on the fresh plan-read value; negatives rejected).
expected_move_idsNoExpectedMoveIDs — the displaced job IDs the preview returned (echo data.days[].moves[].job_id). Optional but RECOMMENDED: if the schedule changed so the commit would push a different set (e.g. a job booked onto the target tech since the preview), the commit is rejected with SCHEDULE_MOVE_PLAN_DRIFTED instead of silently pushing an unseen job.
expected_member_idsNoExpectedMemberIDs — crew moves only: the FULL member set the preview staffed (echo data.members[].technician_id). If the commit's re-plan would staff a DIFFERENT set (a previewed replacement got booked in the meantime), the commit is rejected with SCHEDULE_MOVE_PLAN_DRIFTED — crew swaps are never approved unseen. Omit to opt out.

TDQS

A4.5/5.0
Behavior5/5

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

The description reveals atomic behavior, advisory lock, status_version fencing, and drift detection (409). It also explains idempotency key behavior. Annotations are minimal, so description adds substantial context.

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

Conciseness4/5

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

The description is well-structured and front-loaded. While a bit long, each sentence adds value. Could be slightly more concise but is effective.

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

Completeness4/5

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

Covers the main use case, error handling, and references a design document. Lacks output schema details but tool complexity is high and description is sufficient for correct invocation.

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

Parameters4/5

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

Schema coverage is 100%, but description adds essential context: mode must match preview, start_at must be future, expected_version from preview, expected_move_ids are displaced job IDs. Adds value beyond schema.

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

Purpose5/5

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

The description clearly states 'Commit a schedule-board job move' and explains it applies a previewed move. It uses a specific verb+resource and distinguishes from sibling tools like previewJobRequestMove.

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

Usage Guidelines4/5

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

The description explains the tool is to be used after a preview and provides guidance on parameters like expected_version and expected_move_ids. It also gives next steps for 409 errors, but lacks explicit alternative suggestions.

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

confirmJobRequestConfirm a booking on behalf of the customerAInspect

Confirm a booking on behalf of the customer

Fires the customer-actor confirm_booking action from the BUSINESS surface (audited as business_on_behalf). Two uses: (1) LIVE — staff confirm a slot for a customer who booked by phone; (2) SANDBOX — the customer magic-token surface is live-only (a sandbox job's link can never reach a real customer), so this is the ONLY way to drive a sandbox test job past booking (book → quote → confirm → assign → complete). Body carries the customer-chosen scheduled_at (business-local naive datetime). DECISION TABLE — every 409 this endpoint returns, and the correct NEXT STEP (branch on error_code, never on the HTTP status): • JOB_REQUEST_STAGE_CONFLICT — the job changed since you read it (NOTE: every FAILED confirm attempt also bumps status_version by design). Next: re-GET the job, retry with the fresh status_version. • JOB_REQUEST_ACTION_NOT_PENDING — the job is no longer at the confirm step (usually: already confirmed). Next: re-GET and show current status; do not retry. • JOB_REQUEST_NO_TECHNICIAN_AVAILABLE — the TIME is infeasible for everyone (outside working hours / the customer window, or nobody qualifies). Next: pick another time via booking-windows / time-segments. NOT an emergency case — displacement cannot conjure capacity. • JOB_REQUEST_TECH_INFEASIBLE — the FORCED technician can never take the job then; data.reason says why: cannot_arrive_in_time (commute/shift-start — data.earliest_feasible_at (RFC3339 UTC) is the first same-day time they CAN be on site → offer it) | missing_required_skills | not_available_today | not_lead_tier. Next: keep the tech and reschedule to earliest_feasible_at+, OR keep the time and drop technician_id (auto-pick) / choose another tech from time-segments. NOT an emergency case. • JOB_REQUEST_P0_REQUIRES_DISPLACEMENT — the ONLY code that routes to the EMERGENCY flow: the job is P0, the tech qualifies, but the lane is genuinely occupied. Next: POST emergency/candidates → preview → commit (the commit auto-confirms). Caveat: if the occupying jobs are themselves P0 the preview will reject with EMERGENCY_RESCHEDULE_SLOT_OCCUPIED (P0 never displaces P0) — then pick another tech/time.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesJob request ID
scheduled_atNoChosen start time — business-local naive datetime, no offset (the business_time.datetime value from the time-segments picker). The server converts to UTC using the job's business timezone.
technician_idNoTechnicianID (BUSINESS confirm only — ignored on the customer surface): force-assign the job to this technician instead of the ranked auto-pick. Ranking is bypassed; feasibility (hours/time-off/geo/skills), the TierLead rule and the double-booking guard still apply — an infeasible forced tech rejects the confirm (P0 gets the displacement hint).
status_versionNoOptimistic-lock fence: the status_version from your last read. Omitted/0 = fence on the row's current version (no race protection).
idempotency_keyNoUnique key making retries safe: a repeat send with the same key replays the original response (header Idempotent-Replayed: true) instead of re-running the operation. Reusing a key with a different body returns 422 IDEMPOTENCY_KEY_REUSE. (sent as the Idempotency-Key header)
arrival_window_minutesNoArrivalWindowMinutes = width (phút) của arrival-window ô khách bấm ở slot-picker (chính là time_slot_step_minutes, mặc định 30). Persist để post-confirm detail render lại đúng window. Optional; bounds ([5, 240], khớp slot-picker step) validate ở usecase — single authority, một error code (JOB_REQUEST_INVALID_INPUT).

TDQS

A4/5.0
Behavior4/5

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

The description discloses important behavioral details beyond annotations: it fires the 'confirm_booking' action, is audited as business_on_behalf, and explains that failed attempts bump status_version. It also describes the optimistic locking mechanism (status_version) and the idempotency key behavior. However, the idempotentHint=false annotation seems to contradict the description's claim that the key makes retries safe, creating a minor inconsistency.

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

Conciseness4/5

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

The description is front-loaded with the main purpose and structured with clear sections for use cases and a decision table. While it is somewhat lengthy, every part contributes information, and the table format is efficient for error handling. Minor redundancy exists, but overall it is well-organized for its complexity.

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

Completeness4/5

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

Given no output schema, the description adequately covers the tool's behavior, error codes, and next steps. It lacks explicit mention of the success response structure, but the decision table compensates by guiding post-call actions. The two use cases are fully explained, making the tool's role clear in the workflow.

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

Parameters4/5

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

With 100% schema coverage, the description still adds value by clarifying parameter semantics: scheduled_at is business-local naive datetime, technician_id forces assignment despite bypassing ranking, idempotency_key is sent as a header, and arrival_window_minutes provides derivation context. This enriches the schema definitions meaningfully.

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

Purpose4/5

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

The description clearly states the tool confirms a booking on behalf of the customer and outlines two specific use cases (LIVE and SANDBOX). While it does not explicitly differentiate from sibling tools like 'commitEmergencyReschedule', the decision table provides context for when to use this tool vs other actions. The purpose is specific and actionable, but lacks explicit sibling distinction.

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

Usage Guidelines4/5

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

The description explicitly says when to use the tool (LIVE staff confirmation, SANDBOX testing) and provides a detailed decision table mapping error codes to next steps. It does not, however, directly compare to alternative tools like 'quoteJobRequest' or 'commitJobRequestMove', leaving some ambiguity about when to choose this over others. Overall, it gives clear context and recovery actions.

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

createCustomerCreate a customerAInspect

Create a customer

Creates a customer record — the client/account profile a job request (work order) is booked against; use it to import or sync customers from your own CRM, website lead form or intake flow. Address (street, city, postal_code, ...) and coordinates (latitude/longitude) live under the nested address object. service_area_id must be a valid service area UUID belonging to this business.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidNoYour external reference for this customer (your own system's ID). Optional; max 32 chars.
tierNoLoyalty tier. Defaults to "regular" if omitted.
emailNoEmail address. Optional, but at least one of phone/email is required.
phoneNoPhone number in E.164 international format: a leading `+` and the country code, e.g. `+16135550188`. A bare national number (`6135550188`) is REJECTED with PHONE_INVALID — there is no default region to guess the country from. Separators (spaces, dashes, parentheses) are stripped before validation. Optional, but at least one of phone/email is required; 10–20 chars.
addressNoPostal address and coordinates.
full_nameYesCustomer's full name. Required; max 255 chars.
sms_opt_inNoSMS consent: set true ONLY when the customer explicitly agreed to receive SMS (e.g. ticked a non-pre-checked consent box, or gave verbal/written consent you keep a record of). SMS notifications are suppressed while false.
idempotency_keyNoUnique key making retries safe: a repeat send with the same key replays the original response (header Idempotent-Replayed: true) instead of re-running the operation. Reusing a key with a different body returns 422 IDEMPOTENCY_KEY_REUSE. (sent as the Idempotency-Key header)
service_area_idNoUUID of the service area for this customer. Must belong to this business.
preferred_technician_idNoUUID of the technician this customer prefers. Must belong to this business.

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already indicate this is a write operation (readOnlyHint=false), so the description does not need to restate mutation. It adds useful business context (customer records are tied to job requests) and flags the service_area_id ownership constraint, but it stops short of describing response behavior or idempotency semantics, which are not covered by annotations.

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

Conciseness4/5

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

The description is compact and front-loaded, with no wasted sentences. The opening 'Create a customer' is redundant with the title, but the rest of the description earns its place by explaining the purpose and key constraints.

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

Completeness4/5

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

For a create tool with no output schema, the description gives enough context about what the customer record is, when to use it, and where key parameters live. It doesn't mention the response shape, but the rich schema and clear purpose make the tool callable without that detail.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all parameters fully. The description highlights the nested address object and the service_area_id ownership rule, but these details are also present in the schema, so it adds only marginal value beyond structured definitions.

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

Purpose5/5

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

The description identifies the specific action (creates a customer record) and the resource's role: the client/account profile a job request is booked against. This clearly distinguishes it from other create_* siblings and from read/update/delete operations.

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

Usage Guidelines4/5

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

It gives a clear use context: import or sync customers from a CRM, website lead form, or intake flow. It doesn't explicitly state when to use updateCustomer or getCustomer instead, but the intended context is specific enough for an agent to choose correctly.

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

createJobRequestCreate a job requestAInspect

Create a job request

Books a field-operations job — the work order that enters the dispatch & scheduling pipeline. Send the customer's UUID plus requested job_dates (date + morning/afternoon/evening periods, ideally offered from GET /job-requests/booking-windows), optional job_type_id (service catalog), skill_ids (required technician qualifications) and a free-text description. Quoting, technician/crew assignment and completion then advance the work order through the business's workflow.

ParametersJSON Schema
NameRequiredDescriptionDefault
priorityNoScheduling priority. Optional; omitted bookings receive the business's default_priority setting (assignment settings, default p2). p0=emergency (interrupt-driven insert), p1=top (displaced only by p0), p2=standard, p3=deferrable (first candidate for displacement).
job_datesYesRequested date(s) + period(s) the customer wants the job. At least one, up to 12.
skill_idsNoUUIDs of the skills the customer desires for this job. Optional; up to 20.
x_timezoneNoCustomer IANA timezone (sent as the X-Timezone header)
customer_idYesUUID of an existing customer of this business to book the job for. Required.
descriptionNoFree-text description of the work requested. Optional; max 2000 chars.
job_type_idNoUUID of the job type to classify this job. Optional; null leaves the job unclassified.
sla_deadlineNoSLA deadline (business-local naive datetime, e.g. "2030-06-14T17:00:00"). Optional; ONLY valid together with priority=p1 — arms the auto-escalation clock (the job escalates to p0 as breach risk crosses the business's safety buffer). Must be in the future.
idempotency_keyNoUnique key making retries safe: a repeat send with the same key returns the original booking instead of creating a duplicate (sent as the Idempotency-Key header)

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already signal this is a mutable, non-destructive operation. The description adds meaningful behavioral context: the created work order enters the dispatch & scheduling pipeline, and quoting/assignment/completion follow. This goes beyond the bare mutation hint and helps the agent understand side effects and lifecycle.

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

Conciseness4/5

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

The substantive description is compact and front-loaded with the core action. The only minor waste is the opening line 'Create a job request', which simply repeats the title. Otherwise every sentence earns its place.

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

Completeness4/5

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

Given the 9-parameter schema with full descriptions, the tool description adds the most valuable missing context: the scheduling-pipeline placement and the workflow stages that follow. It does not describe the response shape, but with no output schema that is a minor gap for a creation operation whose schema is already thorough.

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

Parameters4/5

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

Schema description coverage is 100%, so the schema carries the full parameter documentation. The description adds useful selection guidance beyond the schema, particularly the recommendation to source job_dates from GET /job-requests/booking-windows and the note that skill_ids represent required technician qualifications.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Books a field-operations job — the work order that enters the dispatch & scheduling pipeline.' This clearly differentiates createJobRequest from sibling read/update/confirm/quote tools and states exactly what object is being created.

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

Usage Guidelines4/5

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

The description gives concrete guidance on what to send and even points to the booking-windows endpoint as the ideal source for job_dates. It does not explicitly name alternatives or say 'use quoteJobRequest instead when...', but it implies quoting is a downstream step, which helps an agent route correctly.

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

createJobTypeCreate a job typeAInspect

Create a job type

Adds a new job type to the business catalog

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesJob-type name (required) — what the booking form shows as the kind of work. Stored as the canonical English value; per-locale names are a dashboard authoring feature.
statusNoLifecycle status. Defaults to active; inactive types cannot be selected for new job requests.
idempotency_keyNoUnique key making retries safe: a repeat send with the same key replays the original response (header Idempotent-Replayed: true) instead of re-running the operation. Reusing a key with a different body returns 422 IDEMPOTENCY_KEY_REUSE. (sent as the Idempotency-Key header)

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already provide the side-effect profile (readOnlyHint false, destructiveHint false, idempotentHint false), and the description's 'Adds' is consistent with those annotations. It adds the 'business catalog' context but does not disclose additional behaviors such as auth requirements or response shape.

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

Conciseness4/5

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

The meaningful content is compact and clear. However, the opening sentence 'Create a job type' merely restates the title, giving the description a small redundant start while remaining appropriately short overall.

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

Completeness4/5

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

For a simple 3-parameter create operation with full schema coverage and annotations covering the safety profile, the description is mostly sufficient for correct invocation. The main gap is the lack of any stated return value, though no output schema is present.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already documents the name requirement, status enum/default, and idempotency-key behavior in detail. The tool description itself adds no parameter-specific meaning, so the baseline applies.

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

Purpose5/5

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

The description states a specific verb, 'Adds', a specific resource, 'a new job type', and a target, 'the business catalog'. Sibling tools such as deleteJobType, getJobType, and listJobTypes make clear this is the create variant, so there is no ambiguity about what it does.

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

Usage Guidelines3/5

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

The description offers no explicit when-to-use guidance or alternatives, so an agent must infer usage from the verb 'Adds'. It is not misleading, but it does not specify conditions or exclusions relative to other tools.

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

createServiceAreaCreate a new service areaAInspect

Create a new service area

Creates a service area with optional polygon boundary for the business

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name
nameYesArea name (required)
countyNoCounty name
countryNoCountry name
boundaryNoGeoJSON polygon boundary (optional)
districtNoDistrict name
descriptionNoOptional description
postal_codeNoPostal code
state_provinceNoState / province name
idempotency_keyNoUnique key making retries safe: a repeat send with the same key replays the original response (header Idempotent-Replayed: true) instead of re-running the operation. Reusing a key with a different body returns 422 IDEMPOTENCY_KEY_REUSE. (sent as the Idempotency-Key header)

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already cover read-only, idempotency, and destructive traits, so the description is not required to restate those. It adds the domain context that the service area belongs to 'the business' and that boundaries are optional, but it does not disclose side effects such as duplicate-name handling or response behavior.

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

Conciseness3/5

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

The description is short, but the first sentence repeats the title almost verbatim. The second sentence adds the only substantive detail, optional polygon boundary, so the structure is acceptable but not maximally efficient.

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

Completeness3/5

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

With 10 parameters and a nested boundary object, the schema provides enough detail for calling the tool, and the description names the key optional boundary concept. It omits expectations about return values and gives no explicit duplicate-handling context, but these are not essential for basic invocation.

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

Parameters3/5

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

The input schema provides 100% coverage with descriptions and examples for all parameters, so the schema carries the parameter documentation burden. The description only reinforces that the boundary parameter is optional and adds no meaning beyond the schema.

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

Purpose5/5

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

The description uses the explicit verb 'creates' with the resource 'service area', clearly identifying the operation type. It also mentions the optional polygon boundary, which distinguishes it from sibling get/list/delete service-area tools.

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

Usage Guidelines3/5

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

The usage is implied: an agent would use this tool when a new service area needs to be created, and sibling names make the resource category clear. However, the description does not explicitly state when not to use it or contrast it with alternatives like update or delete.

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

createSkillCreate a skillAInspect

Create a skill

Creates a skill under the given category. New skills are active by default. Skill names must be unique within their category.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSkill category ID (UUID)
nameYesSkill name (required). The matching engine hard-filters technicians on skills when a booking carries skill_ids.
descriptionNoWhat the skill covers. Optional.
idempotency_keyNoUnique key making retries safe: a repeat send with the same key replays the original response (header Idempotent-Replayed: true) instead of re-running the operation. Reusing a key with a different body returns 422 IDEMPOTENCY_KEY_REUSE. (sent as the Idempotency-Key header)

TDQS

A3.9/5.0
Behavior4/5

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

Beyond the annotations, the description discloses non-obvious behavior: skills are active by default and names must be unique within a category. It does not cover response shape or failure handling, but the annotations already establish the mutating nature of the operation.

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

Conciseness4/5

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

The description is short and front-loaded with the primary action, followed by two valuable behavioral notes. The main redundancy is the opening 'Create a skill,' which repeats the title and tool name, but this is minor.

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

Completeness4/5

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

For a four-parameter create tool with full schema coverage and annotation support, the description adds the missing behavioral constraints needed for correct invocation. The absence of output/response information is a small gap, but it does not block correct use.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline of 3 applies. The description reinforces that the skill belongs to a category and that names are unique, but it does not add significant parameter-level meaning beyond the already detailed schema.

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

Purpose5/5

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

The description clearly states a specific action and object: 'Creates a skill under the given category.' It also adds scope ('under the given category') and domain constraints (active by default, unique names), which distinguishes it from category-level tools like createSkillCategory.

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

Usage Guidelines3/5

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

The description implies when the tool should be used but never names alternatives or exclusion conditions. It provides useful context such as category scoping and name uniqueness, but an agent is left to infer the difference from the overall tool family rather than being told.

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

createSkillCategoryCreate a skill categoryAInspect

Create a skill category

Creates a skill category for the current business. Categories group skills (e.g. "Plumbing", "Electrical"). Names must be unique within a business.

ParametersJSON Schema
NameRequiredDescriptionDefault
iconNoIcon slug for the dashboard's catalog tree. Optional.
nameYesCategory name (required), e.g. a trade: Plumbing, Electrical, HVAC.
idempotency_keyNoUnique key making retries safe: a repeat send with the same key replays the original response (header Idempotent-Replayed: true) instead of re-running the operation. Reusing a key with a different body returns 422 IDEMPOTENCY_KEY_REUSE. (sent as the Idempotency-Key header)

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already provide the readOnly, idempotent, and destructive safety profile. The description adds useful behavioral context: the operation is scoped to the current business and category names must be unique within that business. It does not contradict any annotation, though it does not describe duplicate-name failure behavior.

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

Conciseness4/5

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

The description is mostly tight and front-loaded, with the real definition in the first sentence and useful examples and constraints afterward. It loses one point because the opening line 'Create a skill category' simply repeats the title before the substantive description begins.

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

Completeness5/5

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

For a simple create operation with three fully documented parameters and annotations covering the safety profile, the description is complete enough to select and invoke correctly. The schema covers the required name and the optional icon and idempotency_key, while the description supplies business scope and uniqueness context.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds value beyond the schema by clarifying that name is a business-scoped unique category label and by explaining the category-skill grouping relationship. It does not discuss icon or idempotency_key, but those are already fully described in the schema.

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

Purpose5/5

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

The description clearly states a specific action and resource: 'Creates a skill category for the current business.' It also distinguishes this from the sibling createSkill by explaining that categories group skills, and it gives concrete trade examples. The uniqueness constraint further clarifies the tool's exact domain.

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

Usage Guidelines3/5

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

The intended use is implied rather than explicit: an agent can infer to use this when creating a category, not a skill, because 'Categories group skills.' However, the description does not name alternatives like createSkill, say when not to use it, or advise checking existing categories before using it despite the uniqueness requirement.

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

createTechnicianAdd a technicianAInspect

Add a technician

Creates a technician membership under the current business. If the phone/email matches an existing user, their account is linked. Otherwise a new user identity is created. Either way the membership starts active. The new member is notified (live mode only, best-effort): an email when email is supplied, an SMS when phone is supplied, both when both — informational only, no activation step (login stays passwordless: magic link / OTP). Re-adding someone: if the person is currently SUSPENDED on this business (a dashboard action — not reachable via this API), the create REACTIVATES that existing membership (same technician id, their existing group; also notified). A technician REMOVED with deleteTechnician is a closed membership: re-adding the same email/phone links the SAME underlying person (no duplicate identity) but creates a FRESH membership with a NEW id — history stays under the old one. Owner/Administrator groups cannot be assigned via API key, and not at all in sandbox mode.

Optional relations (all validated; any missing id → 404 TECHNICIAN_NOT_FOUND with missing_ids): buddy_ids sets this technician's buddy list (use when creating a lead); lead_ids adds this technician as a buddy of each named lead (use when creating a buddy — the buddy-side way to attach the same lead↔buddy relation); service_area_ids assigns the technician to those service areas.

start_location_type=office snapshots the business address + coordinates into the technician at create time; address, start_location_lat, start_location_long in the body are ignored. Requires the business to have coordinates set (else 400 BUSINESS_LOCATION_MISSING). start_location_type=home (or empty) uses the address + coordinates from the body.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailNoEmail address. At least one of phone/email is required (identity resolution key).
phoneNoPhone number in E.164 international format: a leading `+` and the country code, e.g. `+16135550188`. A bare national number (`6135550188`) is REJECTED with PHONE_INVALID — there is no default region to guess the country from. At least one of phone/email is required (identity resolution key).
addressNoHome address (the day-start point when start_location_type=home).
lead_idsNoLeads this technician is a buddy of (set when creating a buddy; the technician is appended to each lead's buddy list). Optional; max 50 technician ids.
buddy_idsNoBuddies of this technician (set when creating a lead). Optional; max 50 technician ids.
full_nameYesThe person's full display name. Required; max 255 chars.
job_titleNoDisplay title (e.g. "Senior HVAC Technician").
join_dateNoFirst working day (YYYY-MM-DD).
assignment_tierNoCrew tier the matching engine assigns by: lead (can head a job), buddy (crew helper), float (excluded from auto crew-assign).
idempotency_keyNoUnique key making retries safe: a repeat send with the same key replays the original response (header Idempotent-Replayed: true) instead of re-running the operation. Reusing a key with a different body returns 422 IDEMPOTENCY_KEY_REUSE. (sent as the Idempotency-Key header)
service_area_idsNoService areas to assign the technician to. Optional; max 50. Discover via GET /service-areas.
business_group_idYesRole group for the new member. Discover IDs via GET /permission/groups (Owner/Administrator groups are rejected in sandbox mode).
start_location_latNoExplicit day-start latitude in decimal degrees (-90..90); when set it wins over the address geocode.
start_location_longNoExplicit day-start longitude in decimal degrees (-180..180); when set it wins over the address geocode.
start_location_typeNoWhere the technician starts their day: home (their address) or office (the business location). Drives the engine's travel estimates.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only provide basic flags, so the description carries the full burden and does so richly: best-effort notifications, no activation step, reactivation vs new-membership semantics, group restrictions, and start-location precedence with the 400 BusinessLocationMissing condition. This is far more transparent than the annotations alone.

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

Conciseness5/5

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

The description is long but organized by lifecycle behavior, relation parameters, and start-location rules. Each section earns its place and adds non-obvious detail; there is no filler, repetition of the schema, or vague prose.

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

Completeness4/5

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

The invocation-side guidance is exceptionally complete: lifecycle, identity linking, notifications, group restrictions, relations, and location edge cases are all covered. The only notable gap is that the return/payload semantics are not described, and with no output schema present the description could have stated what the successful response contains.

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

Parameters5/5

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

Even with 100% schema coverage, the description adds crucial meaning: it explains that buddy_ids and lead_ids form the same relation from opposite sides, that phone/email act as identity-resolution keys, and that address/lat/long are ignored when start_location_type=office. This materially helps an agent choose correct parameter combinations.

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

Purpose5/5

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

The description opens with 'Creates a technician membership under the current business,' giving a specific verb, resource, and scope. It also distinguishes membership creation from the related update/delete and customer-creation tools, so an agent can tell exactly what this operation accomplishes.

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

Usage Guidelines4/5

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

The description gives strong contextual guidance: it explains identity linking, reactivation of suspended memberships, fresh membership creation after deleteTechnician, and actions that are not reachable via this API. It names deleteTechnician and points to lookup endpoints for group/service-area IDs, though it does not explicitly name updateTechnician as the alternative for modifying an existing technician.

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

createVehicleCreate a new vehicleCInspect

Create a new vehicle

Creates a vehicle for the business fleet

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesVehicle display name (required). The only mandatory field — a fleet import needs nothing but names to get vehicles into the system.
yearNoModel year. Optional.
brandNoManufacturer / make. Optional.
modelNoModel name. Optional.
owner_idNoUUID of the technician who owns (has claimed) this vehicle. Optional. The owner must be a lead technician or a management role — a buddy- or float-tier profile is refused with VEHICLE_OWNER_TIER_NOT_ALLOWED. Assigning which vehicles a technician USES is a different relation: PUT /technicians/{id}/vehicles.
plate_numberNoLicense plate. Optional.
vehicle_typeNo
current_mileageNoOdometer reading. Optional; must be >= 0 when sent.
idempotency_keyNoUnique key making retries safe: a repeat send with the same key replays the original response (header Idempotent-Replayed: true) instead of re-running the operation. Reusing a key with a different body returns 422 IDEMPOTENCY_KEY_REUSE. (sent as the Idempotency-Key header)

TDQS

C2.8/5.0
Behavior2/5

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

The annotations already signal a non-read-only, non-idempotent, non-destructive operation, and the description only restates that it creates a vehicle. It adds no behavioral detail beyond the annotation surface, such as owner-tier validation, idempotency-key behavior, or what a successful creation returns.

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

Conciseness2/5

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

The description is short but redundant: Create a new vehicle repeats the title and name, and Creates a vehicle for the business fleet restates the same idea with only a small amount of added context. Both sentences do not earn their place.

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

Completeness3/5

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

The input schema and annotations carry most of the contextual load, making the tool callable with minimal risk. However, the prose leaves out return-value behavior and high-level side-effect or ownership guidance, so the definition is adequate but not complete.

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

Parameters3/5

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

Schema description coverage is 89% and the individual parameter descriptions are rich, with examples, constraints, requiredness, and domain notes. The tool description itself adds no parameter-level meaning, so it lands at the schema-heavy baseline without exceeding it.

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

Purpose4/5

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

The description states a specific action, create, and a specific resource, vehicle, and adds the business fleet scope, so an agent can distinguish it from delete/get/list vehicle tools. The first sentence repeats the title, but the body still communicates the intended operation clearly.

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

Usage Guidelines2/5

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

There is no when-to-use guidance and no mention of alternatives. The description implies adding a vehicle to the fleet, but it does not explain when createVehicle is appropriate versus related operations such as replaceTechnicianVehicles or updateTechnician, even though some of those distinctions exist in parameter notes.

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

deleteCustomerDelete a customerA
DestructiveIdempotent
Inspect

Delete a customer

Soft-deletes a customer record, removing it from the active customer directory; existing bookings keep their customer snapshot.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCustomer ID

TDQS

A4/5.0
Behavior4/5

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

Annotations already mark this tool as destructive and idempotent. The description adds value by specifying it's a soft-delete and explaining the impact on existing bookings, which is beyond the annotation hints and helps the agent understand side effects.

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

Conciseness4/5

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

The description is short, with two sentences. The first sentence is repetitive of the title, which could be omitted, but overall it is efficiently structured without unnecessary detail.

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

Completeness3/5

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

The description covers the core behavior (soft-delete) but does not explain return values, error cases, or requirements like permissions. With no output schema, more detail on expected outcomes would improve completeness.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already describes the parameter (id). The description does not add any meaning beyond what the schema provides for the parameter itself, achieving only the baseline for high coverage.

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

Purpose5/5

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

The description clearly states the action (delete) and resource (customer), and explicitly mentions it's a soft-delete, which distinguishes it from a hard delete. It also contrasts with sibling tools like createCustomer and updateCustomer.

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

Usage Guidelines4/5

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

The description implies usage for removing a customer, and the soft-delete behavior provides context. However, it does not explicitly state when not to use it or when to prefer alternatives, such as updateCustomer.

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

deleteJobTypeDelete a job typeA
DestructiveIdempotent
Inspect

Delete a job type

Soft-deletes a job type. System rows cannot be deleted.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesJob Type ID

TDQS

A4/5.0
Behavior4/5

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

The annotations already indicate destructive and idempotent behavior, so the bar is lower. The description adds meaningful context beyond the annotations: the deletion is soft, and system rows are protected from deletion. No contradiction with 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.

Conciseness5/5

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

Two brief sentences, front-loaded with the core purpose and followed by a key behavioral constraint. Every sentence earns its place with no unnecessary text.

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

Completeness4/5

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

For a simple one-parameter delete operation with strong annotations, the description is mostly complete. It covers the essential soft-delete behavior and the system-row restriction, though it does not mention what happens if a system-row ID is passed or describe the response.

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

Parameters3/5

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

Schema coverage is 100%, with the single 'id' parameter already documented as 'Job Type ID'. The description adds no new parameter-level details, but it does contextualize the parameter by noting that system rows cannot be deleted, which is useful but not required for the parameter itself.

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

Purpose5/5

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

States the specific operation (delete) and resource (job type), and adds the important distinction that it is a soft delete. The resource is clearly named, so an agent can distinguish it from the many other delete* sibling tools.

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

Usage Guidelines3/5

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

The description implies usage: call this when you need to delete a non-system job type. It also provides one exclusion, stating that system rows cannot be deleted, but it does not explicitly contrast with alternatives or describe when a different tool should be used.

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

deleteServiceAreaDelete a service areaB
DestructiveIdempotent
Inspect

Delete a service area

Soft deletes a service area

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesService Area ID

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered by structured data. The description adds the 'soft deletes' nuance, which is useful, but does not explain what soft deletion means for downstream references or whether it is reversible.

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

Conciseness4/5

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

The description is very short and front-loaded. The second sentence adds a meaningful distinction ('soft deletes'), though it is partially redundant with the title.

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

Completeness3/5

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

For a simple one-parameter delete tool with strong annotations, the description is mostly adequate. However, it leaves out effects of soft deletion on existing assignments or related resources, and with no output schema a brief note on return behavior would have improved completeness.

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

Parameters3/5

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

The schema covers the single required id parameter fully with the description 'Service Area ID', so the description need not add much. It adds no extra meaning 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.

Purpose4/5

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

The description uses a specific verb ('delete') and resource ('service area'), making the tool's function immediately clear. It is distinguishable from sibling delete tools by naming the service area resource, though it does not go far beyond the title's level of specificity.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives such as deleteCustomer, deleteTechnician, or deleteVehicle. The description gives no context about prerequisites, when soft deletion is appropriate, or when a different delete tool should be chosen.

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

deleteSkillDelete a skillA
DestructiveIdempotent
Inspect

Delete a skill

Permanently deletes a skill. Returns SKILL_HAS_MEMBERS (409) if any active technicians are still assigned — unassign all technicians first.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSkill ID (UUID)

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already mark the tool as destructive and idempotent, so the description adds value by specifying that deletion is permanent, identifying the exact error code SKILL_HAS_MEMBERS (409), and explaining the blocking condition. This goes beyond the structured hints without contradicting them.

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

Conciseness4/5

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

The substantive description is only two sentences, front-loads the permanent-deletion behavior, and includes the key constraint. The first line 'Delete a skill' duplicates the title and adds no real information, which keeps the score from being a 5.

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

Completeness5/5

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

For a simple one-parameter destructive operation with no output schema, the description covers the core behavior, the failure mode, and the required prerequisite. An agent has enough context to call the tool correctly and interpret the primary error response.

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

Parameters3/5

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

The input schema has 100% coverage for the single 'id' parameter and already describes it as a Skill ID (UUID). The description adds no additional parameter-level detail, so the schema carries the full burden and 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.

Purpose5/5

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

The description states a specific verb and resource: 'Permanently deletes a skill.' This clearly distinguishes the operation from sibling tools like deleteSkillCategory and deleteTechnician, and adds a concrete error condition that defines the operation's scope.

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

Usage Guidelines4/5

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

The description gives clear operational guidance: it warns that the deletion will fail with SKILL_HAS_MEMBERS if active technicians are assigned and instructs the caller to unassign all technicians first. It does not explicitly contrast alternatives or state when not to use the tool, but the precondition is clear.

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

deleteSkillCategoryDelete a skill categoryA
DestructiveIdempotent
Inspect

Delete a skill category

Permanently deletes a skill category. Returns SKILL_CATEGORY_NOT_EMPTY (409) if any skills still belong to the category — remove or move all skills first.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSkill category ID (UUID)

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already mark the tool as destructive and non-read-only. The description adds the meaningful behavioral detail that calling it returns SKILL_CATEGORY_NOT_EMPTY (409) if skills remain, which helps the agent anticipate failure modes. It does not contradict any annotation.

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

Conciseness4/5

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

The core guidance is compact and valuable, with the permanent-deletion fact and error condition in one clear sentence. The opening line 'Delete a skill category' merely repeats the title, but the overall description remains tight and readable.

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

Completeness4/5

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

For a single-parameter destructive tool with no output schema, the description covers the essential behavior and the main failure case. It could mention the success response shape, but this is not critical for correct invocation.

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

Parameters3/5

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

The schema already documents the single id parameter with 100% coverage, so the baseline is 3. The description references the category context but does not add further parameter-level meaning beyond the schema.

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

Purpose5/5

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

The description states a specific verb and resource: 'Permanently deletes a skill category.' It clearly distinguishes from sibling tools like deleteSkill by referring to the category concept and the skills-belonging dependency.

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

Usage Guidelines4/5

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

The description gives clear usage context by stating the prerequisite: remove or move all skills before deleting the category. It does not explicitly name alternatives, but the condition for successful use is concrete and actionable.

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

deleteTechnicianRemove a technicianB
DestructiveIdempotent
Inspect

Remove a technician

Soft-removes a technician from the business by setting status to deactive

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTechnician ID

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already indicate destructiveHint=true and readOnlyHint=false. Description adds the 'soft-remove' detail (sets status to deactive), which is beyond annotations, but lacks other behavioral context like reversibility or permission requirements.

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

Conciseness4/5

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

Two sentences, no filler. Could be slightly more concise but overall well-structured and efficient.

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

Completeness2/5

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

No output schema provided, and description does not mention return value or confirmation. As a destructive tool, more completeness would be expected (e.g., what happens on success/failure, idempotence implications).

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

Parameters3/5

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

Schema covers the 'id' parameter completely (100% coverage). Description does not add additional meaning to the parameter, so baseline score of 3 applies.

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

Purpose5/5

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

Description clearly states verb (remove) and resource (technician), and specifies it's a soft-remove by setting status to deactive. This distinguishes it from createTechnician or updateTechnician.

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

Usage Guidelines2/5

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

No guidance on when to use this tool vs alternatives (e.g., updateTechnician to deactivate instead). No exclusion criteria or prerequisites mentioned.

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

deleteVehicleDelete a vehicleA
DestructiveIdempotent
Inspect

Delete a vehicle

Soft deletes a vehicle

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesVehicle ID

TDQS

A3.8/5.0
Behavior4/5

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

The description discloses that the operation is a soft delete, adding nuance beyond the annotations' destructiveHint and idempotentHint. It clarifies that the vehicle is not permanently purged, though it does not explain the observable consequences such as visibility in list calls or restoration behavior.

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

Conciseness4/5

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

The description is extremely short and the key detail 'soft deletes' is present, but the first line 'Delete a vehicle' is redundant with the title. Apart from that minor waste, the definition is appropriately sized and easy to parse.

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

Completeness3/5

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

For a single-parameter tool with annotations covering safety and idempotency, the definition is largely sufficient to invoke it. However, 'soft deletes' is left unexplained—there is no statement about what happens to the record, whether it can be restored, or what response to expect, and there is no output schema to fill the gap.

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

Parameters3/5

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

Schema description coverage is 100% and the only parameter, id, is documented as 'Vehicle ID'. The description adds no parameter-specific meaning, but at this coverage level it does not need to; the baseline of 3 applies.

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

Purpose5/5

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

The description uses the specific verb 'soft deletes' and identifies the resource 'vehicle', clarifying both the action and the object. This distinguishes it from hard-delete operations and from sibling delete tools for other resource types, even without opening the schema.

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

Usage Guidelines3/5

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

Usage is implied by the resource name and 'soft deletes' phrasing, but the description gives no explicit when-to-use guidance, exclusions, or alternatives. Sibling delete tools exist for other resources, but the description does not explain when to choose this tool over them or mention any prerequisites.

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

getCustomerGet a customerA
Read-only
Inspect

Get a customer

Returns the full customer record: profile, contact details, tier and lifetime spending summary — a 360° client view for support, upsell or CRM enrichment. contact.preferred_technician includes {id, name}. contact.service_area includes {id, name}. contact.address.latitude / contact.address.longitude are null if no coordinates saved.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCustomer ID (UUID)

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds specific returned fields (preferred_technician, service_area, address coordinates) and notes that coordinates can be null. No contradiction.

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

Conciseness4/5

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

The description is clear and front-loaded, but includes some detail that could be more concise. Still, it is well-structured and informative.

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

Completeness4/5

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

Description compensates for missing output schema by listing key returned fields and noting nullability. It is fairly complete for a read tool with one parameter.

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

Parameters3/5

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

Only one parameter 'id' with schema description 'Customer ID (UUID)'. The description does not add further semantics beyond the schema. Schema coverage is 100%, so baseline is 3.

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

Purpose5/5

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

The description clearly states 'Get a customer' and elaborates that it returns the full customer record including profile, contact details, tier, and spending summary. It distinguishes from siblings like listCustomers (list) and updateCustomer (modify).

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

Usage Guidelines4/5

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

The description mentions use cases: 'for support, upsell or CRM enrichment', providing context on when to use. However, it does not explicitly state when not to use or list alternative tools.

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

getJobRequestGet a job requestA
Read-only
Inspect

Get a job request

Returns the full work order: current workflow status, quoted duration, confirmed schedule, customer contact snapshot and the assigned technician / crew — everything a dispatcher or an external field-operations system needs to track one job.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesJob request ID (UUID or short_code)

TDQS

A3.6/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful context about the response contents, but it does not disclose error behavior, authorization requirements, or any other non-obvious traits beyond what annotations provide.

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

Conciseness5/5

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

The description is concise and well-structured: a short identifying opener followed by a compact enumeration of returned fields and the intended use case. No filler or redundant content is present.

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

Completeness4/5

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

For a simple get-by-id tool with one parameter, the description adequately covers the return value and use case. There is no output schema, so the explicit list of fields helps compensate. It stops short of noting potential error conditions, but given the low complexity this is a minor gap.

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

Parameters3/5

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

The schema has 100% description coverage for the single 'id' parameter, including that it accepts a UUID or short_code. The description does not need to add parameter detail and does not go 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.

Purpose4/5

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

The description uses the specific verb 'Get' with the resource 'job request' and then details the contents of the returned work order (status, duration, schedule, customer contact, technician/crew). This makes the tool's purpose clear and helps distinguish it from listJobRequests or getJobRequestTimeline, though it does not explicitly name those siblings.

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

Usage Guidelines3/5

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

The phrase 'everything a dispatcher or an external field-operations system needs to track one job' implies this is the go-to tool for retrieving a single job request's full details. However, it does not explicitly state when to prefer this over getJobRequestTimeline or listJobRequests, nor does it mention any exclusions.

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

getJobRequestTimelineJob timelineA
Read-only
Inspect

Job timeline

Per-status progress of a job's lifecycle (e.g. booked → confirmed → on the way → arrived → completed, following the business's configured workflow) — render it as a job-tracking timeline. Each status carries its state (completed | current | upcoming), when the job entered it, and the actions fired within it. entered_at may be null for upcoming steps and for older jobs predating the backfill.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesJob request ID (UUID or short_code)

TDQS

A4/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, aligning with timeline retrieval. The description adds key behavioral context, such as that entered_at may be null for upcoming steps and older jobs, which goes beyond annotations.

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

Conciseness4/5

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

The description is front-loaded with the core purpose and is within 5 sentences. However, it redundantly repeats the title 'Job timeline' as the first line and could be slightly more economical.

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

Completeness5/5

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

Despite no output schema, the description fully explains the return format: each status includes state, entered_at, and actions. This provides sufficient context for the agent to handle the output correctly.

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

Parameters3/5

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

Schema coverage is 100%, with the parameter 'id' fully described in the schema. The tool description does not add extra semantic meaning beyond what the schema already provides.

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

Purpose5/5

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

The tool is explicitly described as providing a per-status progress of a job's lifecycle, with a specific sequence and detailed state information. This clearly distinguishes it from sibling tools, none of which are timeline-oriented.

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

Usage Guidelines3/5

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

The description states 'render it as a job-tracking timeline,' implying its use for displaying job progress. However, it neither explicitly states when to use this tool over alternatives nor provides exclusions or when-not-to-use guidance.

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

getJobTypeGet a job typeA
Read-only
Inspect

Get a job type

Returns one entry of the business's service catalog (job/work-order type) with its localized display name — e.g. an HVAC tune-up, drain cleaning or electrical inspection offering.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesJob Type ID

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true. The description adds value by explaining the return includes a localized display name and provides concrete examples. No contradictions.

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

Conciseness5/5

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

Two sentences with no extra words. Front-loaded with the tool's purpose. Efficient and clear.

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

Completeness5/5

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

For a simple, single-parameter, read-only tool without output schema, the description is complete. It explains the return value (one entry with localized name) and gives examples. No missing information.

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

Parameters3/5

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

Schema coverage is 100% with a single parameter 'id' described as 'Job Type ID'. The description does not add additional parameter meaning beyond the schema, so baseline score of 3 is appropriate.

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

Purpose5/5

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

The description clearly states 'Get a job type' and explains it returns one entry of the service catalog with a localized display name. Examples (HVAC tune-up, drain cleaning) add clarity. It distinguishes from sibling listJobTypes by specifying single entry retrieval.

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

Usage Guidelines3/5

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

The description implies use for retrieving a single job type by ID, but does not explicitly state when to use this tool versus listJobTypes or other siblings. No when-not or alternative guidance is provided.

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

getServiceAreaGet a service areaA
Read-only
Inspect

Get a service area

Returns one service area — a geographic coverage zone (service territory) the business operates in, with its name and geometry metadata. Reference its UUID as service_area_id on customer records for territory-aware dispatch.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesService Area ID

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=true, so safety is clear. Description adds that it returns geometry metadata but does not detail other behavioral aspects. With annotations covering safety, a score of 3 is appropriate.

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

Conciseness5/5

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

Two sentences, no redundancy. First sentence states purpose, second adds detail about return value and usage. Efficient and well-structured.

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

Completeness5/5

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

For a single-parameter, no-output-schema tool, the description adequately explains return fields (name, geometry metadata) and use case (territory-aware dispatch). Sufficient for an agent to invoke correctly.

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

Parameters3/5

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

Schema coverage is 100% with description 'Service Area ID'. Description mentions 'UUID' and 'reference its UUID', adding slight context beyond schema. However, this is minimal enhancement over baseline 3.

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

Purpose5/5

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

The description clearly specifies the verb 'Get' and resource 'service area', explaining it returns a geographic coverage zone with name and geometry metadata. It distinguishes from 'listServiceAreas' by targeting a single record via ID.

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

Usage Guidelines4/5

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

The description provides context for use: referencing the UUID as `service_area_id` on customer records for territory-aware dispatch. While not explicitly stating when not to use, the sibling 'listServiceAreas' implies alternative for listing.

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

getTechnicianGet a technicianA
Read-only
Inspect

Get a technician

Returns one technician's full profile: contact info, employment status, assignment tier, skills/qualifications, buddy (crew) relations and assigned vehicles — the dispatch-ready view of a field worker.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTechnician ID

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is clear. The description adds value by detailing the returned data ('full profile', 'dispatch-ready view'), which is beyond what annotations provide. No contradictions.

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

Conciseness4/5

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

The description is short and to the point, with a clear title and a list of returned fields. It front-loads the purpose. One could argue the title repeats the name, but overall it is efficient.

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

Completeness4/5

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

Given the simple one-parameter input and no output schema, the description sufficiently explains what is returned. It lists the key fields, which helps the agent understand the tool's output. However, it could mention potential error conditions like 'invalid ID'.

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

Parameters3/5

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

Schema coverage is 100% with one parameter 'id' described as 'Technician ID'. The description does not add additional meaning to the parameter beyond what the schema provides. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states 'Get a technician' and lists the specific fields returned ('contact info, employment status, assignment tier, skills/qualifications, buddy relations, assigned vehicles'). The verb is 'Get', resource is 'technician', and it distinguishes from siblings like listTechnicians (list) and updateTechnician (update).

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

Usage Guidelines3/5

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

No explicit when-to-use or when-not-to-use guidance. The description implies usage for fetching a single technician's full profile, but does not mention alternatives or context where other tools would be more appropriate.

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

getTechnicianScheduleOne technician's real schedule (sessions + time off)A
Read-only
Inspect

One technician's real schedule (sessions + time off)

The technician's ACTUAL occupancy over a date range: every job session on their lane (solo/lead and crew) plus approved time-off blocks. Weekly recurring working hours come from the technician-availability endpoints — combine both for the full availability picture ("get crew availability"). from/to are business-local dates (YYYY-MM-DD, inclusive); omitted = today .. +7 days; range max 31 days.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTechnician ID
toNoEnd date (YYYY-MM-DD, inclusive; default from+7d; max range 31 days)
fromNoStart date (YYYY-MM-DD, business-local; default today)

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true. Description adds details about date range behavior (defaults, inclusive, 31-day max), which are not in annotations. No contradictions.

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

Conciseness4/5

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

The description is two sentences, front-loaded with the core purpose. The second sentence is dense but packed with necessary details. Could be slightly more concise but not overly verbose.

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

Completeness3/5

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

No output schema, so description should explain return format. It mentions 'job session on their lane (solo/lead and crew) plus approved time-off blocks' but lacks structure details (e.g., list of objects). Could be more complete.

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

Parameters4/5

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

Schema coverage is 100%, but description adds meaning beyond schema: explains 'business-local' dates, defaults, and inclusive ranges. This helps clarify usage beyond the schema descriptions.

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

Purpose5/5

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

The description clearly states it shows a technician's actual occupancy including job sessions and time-off blocks. It uses specific verbs like 'real schedule' and distinguishes it from the 'get crew availability' endpoint.

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

Usage Guidelines5/5

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

Explicitly explains when to use (to see actual occupancy over a date range) and suggests combining with technician-availability endpoints for full availability. Also specifies default date ranges and maximum range.

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

getVehicleGet a vehicleA
Read-only
Inspect

Get a vehicle

Returns one fleet vehicle (service van/truck): identity, plate, operational status (idle, on job, maintenance) and which technicians use it — the fleet-management view of a single asset.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesVehicle ID

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds value by specifying the returned fields (identity, plate, status, technicians) and the fleet-management context, without contradicting annotations.

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

Conciseness4/5

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

Two sentences, front-loaded with the core purpose. The second sentence adds relevant detail. Could be slightly more concise but not wasteful.

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

Completeness4/5

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

Given no output schema, the description reasonably covers the return structure (key fields). A simple getter with one parameter, this is adequate for an AI agent.

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

Parameters3/5

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

Schema has 100% coverage with parameter 'id' described as 'Vehicle ID'. The description does not add additional meaning or constraints beyond the schema.

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

Purpose5/5

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

The title 'Get a vehicle' and description clearly state it returns a single fleet vehicle with specific details (identity, plate, status, technicians). It distinguishes from siblings like listVehicles (which lists all).

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

Usage Guidelines3/5

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

The description implies usage for retrieving a single vehicle but does not explicitly state when to use versus alternatives (e.g., listVehicles). No exclusions or prerequisites mentioned.

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

listCrewCandidatesMatching crew candidates for a jobA
Read-only
Inspect

Matching crew candidates for a job

RE-STAFFING candidates for a CONFIRMED, SCHEDULED job (not yet completed/archived) — any earlier or later stage returns 409 JOB_REQUEST_INVALID_TRANSITION. This is the pool of technicians who could REPLACE the current crew: the currently assigned lead and buddies are deliberately excluded (they are the status quo, not an option), so on a small roster an empty leads list is a normal answer, not an error. For pre-booking discovery ("who could take this job before it is confirmed?") use listJobRequestBookingWindows / listMatchingSlots / the time-segments grid instead. Candidates are matched and ranked by the smart-assignment engine — skills per crew slot, weekly availability, existing schedule, time off and travel are all checked; each carries a score breakdown (distance, travel, matched skills) plus the exact on-site session plan they would work. NOT a raw roster list (use GET /technicians for that). Returns the ranked feasible LEAD pool by default; pass include_buddies=true to also return per-slot buddy pools, include_vehicle=true to include the available-vehicle list. force_lead_id checks one specific technician: returns only that lead (with their crew combo) if feasible, else 409 JOB_REQUEST_NO_TECHNICIAN_AVAILABLE.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesJob request ID or short_code
force_lead_idNoCheck a specific technician as lead — returns only that lead if feasible, else 409
include_buddiesNoAlso return buddy candidate pools
include_vehicleNoAlso return the available-vehicle list

TDQS

A5/5.0
Behavior5/5

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

Annotations already mark this as read-only, and the description adds meaningful behavior beyond that: the current lead and buddies are deliberately excluded, an empty leads list is normal on small rosters, 409 errors are possible, and candidates carry a score breakdown and on-site session plan. No contradiction with annotations exists.

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

Conciseness5/5

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

The description is dense but every sentence adds a distinct fact: purpose, stage constraints, exclusions, alternatives, matching criteria, response content, defaults, and force_lead_id behavior. The core purpose is front-loaded and no filler is present.

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

Completeness5/5

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

Despite lacking an output schema, the description effectively communicates the return payload (ranked leads, per-slot buddy pools, vehicle list, score breakdown, session plan), error semantics, and normal empty case. All four parameters are behaviorally covered, and sibling-tool routing is complete.

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

Parameters5/5

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

Although the input schema has 100% description coverage, the tool description enriches the parameters by explaining defaults ('returns the ranked feasible LEAD pool by default'), the effect of include_buddies/include_vehicle, and force_lead_id's behavior including the 409 NO_TECHNICIAN_AVAILABLE fallback. This goes well beyond the schema's basic field descriptions.

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

Purpose5/5

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

The description clearly identifies the tool as matching/listing re-staffing candidates for a confirmed scheduled job, with the specific resource being the crew candidate pool. It further distinguishes itself from sibling tools by stating it is NOT a raw roster list and names the pre-booking discovery alternatives.

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

Usage Guidelines5/5

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

Explicitly states when to use: for RE-STAFFING a CONFIRMED, SCHEDULED job not yet completed/archived, and that any other stage yields 409 JOB_REQUEST_INVALID_TRANSITION. It also directs users to listJobRequestBookingWindows/listMatchingSlots for pre-booking and GET /technicians for raw roster, giving clear exclusions and alternatives.

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

listCustomersList customersA
Read-only
Inspect

List customers

Returns a paginated, searchable directory of the business's customer records — the customer database (CRM) behind every booking and work order. Supports the since/next_since cursor for incremental sync into an external CRM, ERP or marketing tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoSearch name, UID, phone, email
pageNoPage number (default 1)
sortNoSort: created_at_desc|created_at_asc|name_asc|name_desc|uid_asc|uid_desc (default: created_at_desc)
tierNoFilter by tier: regular|vip (repeatable)
limitNoPage size (default 15, max 1000)
sinceNoRFC3339 cursor for short-polling; echo back next_since from prior response
statusNoFilter by status: active|inactive
preferred_technician_idNoFilter by preferred technician UUID

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true and destructiveHint=false. Description adds behavioral details: pagination, searchability, and cursor-based incremental sync, which are beyond 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.

Conciseness5/5

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

Description is two concise sentences, front-loaded with the core purpose, and no unnecessary words.

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

Completeness4/5

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

Given 8 parameters and no output schema, the description adequately frames the tool's purpose, pagination, and incremental sync capability. It lacks output details but is sufficient for most use cases.

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

Parameters3/5

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

Schema coverage is 100% with individual parameter descriptions. The description provides overall context (searchable directory, cursor sync) but does not add significant meaning beyond what the schema already offers for each parameter.

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

Purpose5/5

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

Title and description clearly state 'List customers' and elaborate that it returns a paginated, searchable directory. It distinguishes itself from sibling tools like getCustomer (single record), createCustomer, and deleteCustomer.

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

Usage Guidelines4/5

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

Description highlights usage for CRM, booking, and work order contexts, and mentions incremental sync via cursor. However, it does not explicitly state when not to use it or provide direct alternatives.

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

listEmergencyCandidatesRank technicians for a P0 emergency insertAInspect

Rank technicians for a P0 emergency insert

Returns the technicians who could take the emergency job at the requested start, ranked FASTEST-ARRIVAL first (arrival beats route efficiency for a P0). The response also carries a historical crew_recommendation (median crew size on comparable completed jobs + mandatory disclaimer — AC-2). Booked technicians are still candidates — each entry carries the displacement preview (which lower-priority jobs would be pushed, per day) that committing to them would cause; total_moves=0 means a free slot. P0 jobs are never displaced; P1 only by a P0. ETA is estimated from the technician's start location (no live GPS). Feed the chosen technician_id into emergency/preview + emergency/commit. 409 NEXT STEPS: EMERGENCY_RESCHEDULE_NOT_ELIGIBLE — the job cannot be emergency-inserted (not P0, already started/completed/archived, or not quoted): fix the job state or use a normal confirm. EMERGENCY_RESCHEDULE_CREW_UNSUPPORTED — crew jobs cannot use the emergency flow (v1): staff via confirm/reassign instead. EMERGENCY_RESCHEDULE_MULTIDAY_UNSUPPORTED — a confirmed multi-day job cannot be re-inserted (v1): use the normal reassign flow. EMERGENCY_RESCHEDULE_NO_WORKING_DAY — the chosen date has no working hours: pick a working day. EMERGENCY_RESCHEDULE_IN_PAST — start time already passed: pick a future time.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYesCascade mode each candidate's displacement preview assumes: overtime = displaced jobs stay same-day; next_day = overflow rolls to the next working day.
limitNoMax candidates to return (default 5, max 10).
start_atYesDesired start — business-local naive datetime, no offset. Must be in the future.
idempotency_keyNoOptional idempotency key (forwarded as the Idempotency-Key header). Reuse the same value when retrying so the operation runs at most once.
emergency_job_idYesID of the P0 job to place.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations are consistent (not readOnly, not destructive). Description adds behavioral details: ETA from start location, no live GPS, displacement preview, crew_recommendation, and error conditions. No contradictions.

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

Conciseness4/5

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

Well-structured with front-loaded purpose and ranking logic. Error codes are clearly listed. Slightly long but every sentence adds value; could be more concise.

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

Completeness5/5

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

No output schema, but description thoroughly explains return values (ranked technicians, crew_recommendation, displacement preview, total_moves, ETA) and error handling (409 codes). Complete for a complex tool.

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

Parameters4/5

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

Schema covers all 5 parameters with descriptions (100% coverage). Description adds context for mode (cascade behavior) and start_at (business-local naive datetime), slightly exceeding schema info.

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

Purpose5/5

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

The description clearly states the tool ranks technicians for a P0 emergency insert, sorted by fastest arrival. It differentiates from siblings like listCrewCandidates and listNearbyTechnicians by focusing on emergency dispatch with displacement previews.

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

Usage Guidelines5/5

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

Explicitly states when to use (P0 emergency), ranking logic, and what the response includes. Provides detailed 409 error codes with next steps and alternative flows (normal confirm, reassign) for unsupported cases.

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

listJobRequestBookingWindowsBooking availabilityA
Read-only
Inspect

Booking availability

Real-time appointment availability from the scheduling engine: returns the bookable date + time-period windows given technician capacity, working hours and service-territory coverage. Call this before creating a job request and offer the customer ONLY the returned windows — it prevents unschedulable bookings.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd YYYY-MM-DD
fromNoStart YYYY-MM-DD
x_timezoneYesCustomer IANA timezone (sent as the X-Timezone header)

TDQS

A3.8/5.0
Behavior4/5

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

The description adds behavioral context beyond the readOnlyHint annotation, explaining the real-time nature of the data (based on technician capacity, working hours, service territory) and the purpose of preventing unschedulable bookings. No contradictions with annotations.

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

Conciseness4/5

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

The description is relatively concise (4 sentences), but the first sentence is redundant as it repeats the title. The remaining sentences provide value. Could be slightly shorter by removing the first line.

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

Completeness3/5

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

Given no output schema, the description lacks details on the return format (e.g., structure of time windows, pagination, error handling). It covers the core purpose and usage but leaves some gaps for a comprehensive understanding.

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

Parameters3/5

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

Input schema already describes all 3 parameters (to, from, x_timezone) with 100% coverage. The description does not add parameter-specific details beyond that, but implies a date range context. Baseline score of 3 is appropriate as schema does the heavy lifting.

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

Purpose4/5

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

The description specifies the verb 'list' and resource 'booking windows' clearly. It explains that it returns bookable date/time windows based on technician capacity, working hours, and service territory coverage. While it doesn't explicitly differentiate from sibling 'listMatchingSlots', the context implies a distinct role in preventing unschedulable bookings.

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

Usage Guidelines4/5

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

The description explicitly advises calling this before creating a job request and offering only the returned windows to prevent unschedulable bookings. This provides clear when-to-use guidance, though it does not list when not to use or mention alternatives.

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

listJobRequestChangesPoll for new & changed job requests (sync feed)A
Read-only
Inspect

Poll for new & changed job requests (sync feed)

Keep an external system (your CRM, ERP or field-operations tool) in sync with bookings WITHOUT re-listing everything: returns the job requests (work orders) whose state changed (created, status transition, reschedule, soft-delete/archive) at or after the since cursor, ordered oldest-change-first (updated_at ASC).

How to use it: (1) On your first poll OMIT since — the server primes the cursor at "now", returns no items and a next_since. (2) Store next_since and pass it as since on the next poll. (3) Apply each returned item to your store by UPSERTING on id (the server re-scans a ~5s safety window, so the same job may appear again — never blindly append). (4) If has_more is true the page filled to limit and more changes are already waiting — poll again immediately; otherwise wait your normal interval (e.g. 5–15s).

This is NOT pagination — it is a time-keyed change feed. Use the paginated GET /job-requests for the initial bulk load, then this endpoint to stay live. Filters (status_keys, customer_id, …) narrow the feed to the slice you care about.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax changes per poll (default 15, max 1000). If the page fills, has_more=true.
sinceNoRFC3339 cursor from the prior response's next_since. OMIT on the first poll to prime the cursor at server-now.
priorityNoPriority filter (p0|p1|p2|p3)
customer_idNoOnly changes to this customer's jobs (UUID)
status_keysNoComma-separated status slugs — only surface changes to jobs in these statuses
scheduled_toNoFilter to (YYYY-MM-DD = end of that day in the business timezone, or RFC3339), exclusive
technician_idNoOnly changes to jobs assigned to this technician (UUID)
scheduled_fromNoFilter from (YYYY-MM-DD = start of that day in the business timezone, or RFC3339); range is [from, to)

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, but the description adds materially beyond that: the server primes the cursor at 'now' on first poll, re-scans a ~5s safety window causing duplicate deliveries, orders results by updated_at ASC, and includes soft-delete/archive changes. No contradiction with annotations.

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

Conciseness5/5

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

The description is long but every sentence is load-bearing: it teaches a stateful protocol that is easy to get wrong. The content is front-loaded with the core concept, then organized as a numbered how-to, with the important caveat ('never blindly append') placed inline. No fluff.

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

Completeness5/5

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

Despite having no output schema, the description fully specifies return mechanics (next_since, has_more, item ordering, duplicate re-delivery) and usage lifecycle. For a stateful sync-feed tool this is exactly the information an agent needs to call it correctly without guessing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description earns an extra point by explaining cursor lifecycle (omit `since` to prime, use `next_since` from the response), `limit`/`has_more` interaction, and how filters narrow the feed. It doesn't enumerate each filter parameter, but the schema already documents those adequately.

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

Purpose5/5

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

States a specific verb ('Poll'), resource ('job requests'), and the distinguishing property ('new & changed', sync feed). It explicitly contrasts with paginated listing, and the title reinforces the purpose. An agent can tell it apart from listJobRequests without opening the schema.

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

Usage Guidelines5/5

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

Provides a numbered usage protocol: omit `since` on first poll, store `next_since`, pass it back, upsert on `id`, and re-poll when `has_more` is true. It also tells the agent when NOT to use it ('This is NOT pagination') and directs the initial bulk load to GET /job-requests.

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

listJobRequestsList job requestsA
Read-only
Inspect

List job requests

Paginated list of the business's bookings (work orders) with dispatch-oriented filters: workflow status, customer, assigned technician, scheduled date range and free-text search over code/description. This is also the SCHEDULE query: combine technician_id + scheduled_from/scheduled_to to read one technician's agenda for a day or week (e.g. "what is Alex doing tomorrow"), or just the date range for the whole team's calendar.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoSearch short_code or description (case-insensitive, partial match)
pageNoPage number
sortNoSort key: created_at:desc (default) | created_at:asc | scheduled_at:asc | scheduled_at:desc | priority:asc (P0 first) | priority:desc
limitNoPage size
statusNoactive (default) | archived | all
priorityNoPriority filter (p0|p1|p2|p3)
customer_idNoCustomer UUID
status_keysNoComma-separated status slugs
completed_toNoFilter by completion time to (YYYY-MM-DD = end of that day in the business timezone, or RFC3339), exclusive
scheduled_toNoFilter to (YYYY-MM-DD = end of that day in the business timezone, or RFC3339), exclusive
technician_idNoTechnician UUID
completed_fromNoFilter by completion time from (YYYY-MM-DD = start of that day in the business timezone, or RFC3339); range is [from, to). Counts jobs by when they were completed regardless of reschedules.
scheduled_fromNoFilter from (YYYY-MM-DD = start of that day in the business timezone, or RFC3339); range is [from, to)
service_area_idNoService-area UUID (board zone filter)

TDQS

A4.7/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true and destructiveHint=false. The description adds valuable behavioral details: pagination, date range semantics (end-of-day, exclusive boundaries), and the distinction for completed_from/to. No contradictions.

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

Conciseness5/5

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

The description is concise: two short paragraphs, no superfluous text. It front-loads the core purpose and then elaborates on the schedule use case. Every sentence is informative.

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

Completeness5/5

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

Given 14 parameters, no output schema, and readOnlyHint annotation, the description covers all essential aspects: purpose, filters, pagination, scheduling use case, and date semantics. It is complete enough for an agent to use effectively.

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

Parameters4/5

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

Input schema has 100% coverage with descriptions for all 14 parameters, so the baseline is 3. The description adds context on combining parameters for scheduling and explains date range behavior, providing additional value.

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

Purpose5/5

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

The description clearly states the tool lists job requests (bookings) with dispatch-oriented filters, and explicitly identifies it as the schedule query for reading technician agendas. This distinguishes it from siblings like listTechnicians and getTechnicianSchedule.

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

Usage Guidelines4/5

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

The description gives explicit usage guidance, e.g., combining technician_id + scheduled_from/scheduled_to for schedule queries, and listing filters. It does not explicitly mention when not to use it or compare to alternatives, but the context is sufficient for an agent.

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

listJobTypesList job typesA
Read-only
Inspect

List job types

Returns the business's service catalog — the job/work-order types it offers (e.g. installation, repair, maintenance, inspection for trades like HVAC, plumbing, electrical, cleaning). Use it to discover the job_type_id accepted when booking a job request, or to render a services menu on your own site.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoFilter by status (active|inactive)

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the agent knows it's safe. The description adds value by describing the return content (service catalog with examples) and the filter parameter. It does not mention pagination or ordering, but for a simple catalog list this is acceptable.

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

Conciseness5/5

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

Two sentences with no wasted words. First sentence states the action, second provides context and examples. Well-structured and front-loaded.

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

Completeness4/5

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

Given the simplicity of the tool (one optional parameter, no output schema, clear annotations), the description is fairly complete. It covers purpose, use cases, and return values. Minor omission: no mention of pagination or ordering, but not critical for this type of tool.

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

Parameters3/5

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

Schema coverage is 100% and the schema description already explains the status parameter. The description adds no additional parameter details beyond the schema, but the overall context of the tool's return values helps usage. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool lists job types and returns the business's service catalog. It provides examples (installation, repair, maintenance) and distinguishes from getJobType by emphasizing the list behavior and use cases like discovering job_type_id.

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

Usage Guidelines4/5

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

The description explicitly says to use it to discover job_type_id or render a services menu. While it doesn't mention when not to use it, the context is clear and the sibling tool getJobType is implied for single type lookup.

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

listMatchingSlotsMatching time slots for a quoted jobA
Read-only
Inspect

Matching time slots for a quoted job

Bookable arrival-window slots for a quoted job, computed by the smart-assignment matching engine: each slot lists the technicians actually available to start then (skills, weekly availability, existing schedule, time off and travel all checked), with a per-technician match score. Use it to find and offer appointment times an agent or integration can then confirm (POST /job-requests/{id}/confirm with the slot's business_time.datetime). Same grid the end-customer's slot picker shows; slot width defaults to the business's arrival window — override via ?step_minutes (5–240). The job must be quoted first (the quote sets the visit duration the matcher schedules).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesJob request ID (UUID or short_code)
step_minutesNoSlot step in minutes (default: business arrival window, 5–240)

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=true), the description adds rich behavioral detail: the engine checks skills, availability, schedule, time off, travel, and provides per-technician match scores. It also explains slot width override. No contradictions.

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

Conciseness4/5

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

The description is front-loaded with purpose and provides details in a structured paragraph. It is efficient but slightly verbose; each sentence adds value. No redundancy.

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

Completeness4/5

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

Despite no output schema, the description explains the output structure (technician availability and match scores) and compares it to the customer slot picker. It covers the return format and usage flow adequately.

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

Parameters3/5

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

Schema coverage is 100%, so baseline is 3. The description provides no additional meaning beyond what the schema already states for both parameters (id and step_minutes).

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

Purpose5/5

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

The title and description clearly state the tool computes matching time slots for a quoted job using a smart-assignment engine, distinguishing it from sibling tools like listJobRequestBookingWindows. It specifies the resource (time slots) and the action (list matching).

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

Usage Guidelines4/5

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

The description explicitly says to use it after quoting the job and mentions the next step (confirm via POST endpoint). It provides context for use but does not list when not to use or alternative conditions.

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

listNearbyTechniciansFind nearby feasible technicians (job-less location query)A
Read-only
Inspect

Find nearby feasible technicians (job-less location query)

Ranks who could serve a hypothetical visit at (lat,lng) starting at for duration_minutes — the engine applies the REAL hard filters (weekly hours, existing schedule, approved time-off, geographic service areas, optional skill floor) and returns candidates nearest-arrival first. ETA origin is each technician's start location (no live GPS). Use before creating a booking to propose realistic arrivals.

ParametersJSON Schema
NameRequiredDescriptionDefault
atNoVisit start (RFC3339, e.g. 2026-07-20T14:00:00Z; default now)
latYesLatitude of the service location
lngYesLongitude of the service location
limitNoMax candidates (default 10, max 20)
skill_idsNoComma-separated skill UUIDs to require/match
duration_minutesNoVisit length in minutes (default 60; 15–480)

TDQS

A4.3/5.0
Behavior5/5

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

Description details ETA origin (no live GPS), application of real hard filters (hours, schedule, time-off, service areas, skill), and return order. Annotations read-only hint is consistent.

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

Conciseness5/5

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

Two concise sentences plus usage note, front-loaded with purpose. No unnecessary words.

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

Completeness3/5

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

Adequate for a query tool but lacks output structure details. Mentions return order and filters but not fields returned (e.g., technician ID, ETA). No error handling info.

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

Parameters3/5

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

Schema has 100% coverage with parameter descriptions. Description adds no extra per-parameter meaning; it explains overall behavior but not syntax or constraints beyond schema.

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

Purpose5/5

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

The description clearly states the tool finds nearby feasible technicians for a hypothetical visit, with ranking and filtering. It distinguishes from sibling tools like listTechnicians (no location filter) and listEmergencyCandidates.

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

Usage Guidelines4/5

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

Explicitly advises use before creating a booking to propose realistic arrivals. Context implies not for emergencies or listing all technicians, but no explicit when-not-to-use.

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

listServiceAreasList service areasA
Read-only
Inspect

List service areas

Returns the business's geographic coverage: paginated service areas (service territories / coverage zones) used for routing jobs to the right teams. Discover the service_area_id values accepted on customer create/update here.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number (default 1)
limitNoItems per page (default 15, max 1000)

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already indicate read-only and non-destructive. Description adds that results are paginated, but does not reveal additional behavioral traits beyond what is already covered by annotations.

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

Conciseness5/5

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

Description is two sentences, front-loaded with title and then adds context. No unnecessary words, efficient and clear.

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

Completeness5/5

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

For a simple list tool with good annotations and full schema coverage, this description is complete: it explains the return value, pagination, and a key use case.

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

Parameters3/5

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

Schema coverage is 100%, and description does not add extra meaning for page/limit beyond what is in the schema. Baseline score of 3 is appropriate.

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

Purpose5/5

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

Clearly states it lists service areas; explains it returns geographic coverage for routing and provides a specific use case (discovering service_area_id for customer create/update). Distinguishes from sibling getServiceArea.

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

Usage Guidelines4/5

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

Implies usage for discovering IDs for customer operations, which guides when to use. Does not explicitly mention alternatives, but the context is clear given sibling tools.

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

listSkillCategoriesList skill categoriesA
Read-only
Inspect

List skill categories

Returns paginated skill categories — how the business groups technician qualifications by trade or specialty (e.g. HVAC, plumbing, electrical) — ordered alphabetically.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number (default: 1)
limitNoPage size (default: 15, max: 1000)

TDQS

A4/5.0
Behavior4/5

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

Annotations indicate readOnlyHint=true and destructiveHint=false. The description adds value by noting paginated results and alphabetical ordering, providing behavioral context beyond the structured fields.

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

Conciseness5/5

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

Two sentences with no waste. The title is repeated efficiently, and the key details (paginated, alphabetical, explanation of categories) are front-loaded and concise.

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

Completeness4/5

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

Given the tool's simplicity, annotations covering safety, and schema covering parameters, the description is largely complete. The explanation of what skill categories represent adds useful context. No output schema exists, but for a paginated list tool this is acceptable.

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

Parameters3/5

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

Schema coverage is 100% with well-described page and limit parameters. The description adds no additional parameter meaning beyond what the schema already provides, meeting the baseline but not exceeding it.

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

Purpose5/5

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

The description clearly states the tool lists skill categories and explains they represent technician qualification groupings by trade or specialty (e.g., HVAC, plumbing). This specific verb+resource definition distinguishes it from sibling tools like listSkills, which list individual skills, not categories.

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

Usage Guidelines3/5

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

The description implies this tool is for browsing categories, but it does not explicitly state when to use it versus alternatives like listSkillsByCategory. Sibling names provide context, but the description lacks direct usage guidance.

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

listSkillsList all skillsA
Read-only
Inspect

List all skills

Returns the flat list of all active technician skills / qualifications for the current business — the vocabulary the dispatch engine uses for skill-based matching when assigning technicians and crews. Use it to discover the skill UUIDs accepted in skill_ids when creating a job request. (For a category-grouped view, use GET /skill-categories and GET /skill-categories/{id}/skills.)

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the tool is safe. The description adds behavioral context: returns flat list of active skills, used for dispatch matching, and purpose of UUID discovery. No contradictions.

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

Conciseness5/5

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

Two sentences, no wasted words. First sentence front-loads the main action, second provides context and alternative. Highly concise.

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

Completeness5/5

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

Given zero parameters and no output schema, the description fully covers purpose, use case, and relationship to siblings. No gaps remain.

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

Parameters4/5

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

No parameters exist; schema coverage is 100%. The description does not need to add parameter details. It appropriately focuses on the tool's purpose.

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

Purpose5/5

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

The description clearly states it lists all active technician skills/qualifications, using specific verb+resource. It distinguishes from sibling listSkillsByCategory by mentioning the category-grouped alternative.

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

Usage Guidelines5/5

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

The description explicitly tells when to use this tool (discover skill UUIDs for creating job requests) and provides an alternative (listSkillsByCategory) for a different view.

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

listSkillsByCategoryList skills in a categoryA
Read-only
Inspect

List skills in a category

Returns paginated skills (technician qualifications/certifications) belonging to the given trade/specialty category, ordered alphabetically. The members field on each skill is the count of active technicians currently holding it — a quick capacity check per capability.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSkill category ID (UUID)
pageNoPage number (default: 1)
limitNoPage size (default: 15, max: 1000)

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds valuable behavioral context: pagination behavior, alphabetical ordering, and meaning of the 'members' field. No contradictions.

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

Conciseness5/5

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

Two sentences efficiently convey purpose and key details. No redundant phrases. Front-loaded with the core action.

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

Completeness4/5

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

With 3 parameters, no output schema, and high schema coverage, the description adequately explains pagination, ordering, and field meaning. It lacks return structure but the explanation of 'members' field partially compensates. Slightly more detail on response format would improve completeness.

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

Parameters3/5

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

Schema documentation covers all 3 parameters (id, page, limit) with clear descriptions. The description adds no new parameter-level information beyond restating the category context for id. Baseline 3 is appropriate due to high schema coverage.

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

Purpose5/5

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

The description clearly states it lists skills in a category, specifying they are technician qualifications/certifications, paginated, ordered alphabetically. This distinguishes it from sibling tools like listSkills (all skills) and listSkillCategories (categories only).

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

Usage Guidelines4/5

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

The description indicates when to use (for a given category) by mentioning 'belonging to the given trade/specialty category'. However, it does not explicitly state when not to use or contrast with listSkills for unfiltered listing, leaving some ambiguity.

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

listTechniciansList techniciansA
Read-only
Inspect

List technicians

Returns the field workforce roster: paginated technicians (field workers / engineers) with status, assignment tier (lead, buddy, float), skills and crew relations — the people the dispatch engine schedules onto jobs. Discover the preferred_technician_id accepted on customer records here. Supports the since cursor for incremental workforce sync.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number (default 1)
sortNoSort: created_at_desc|created_at_asc|name_asc|name_desc (default: created_at_desc)
limitNoItems per page (default 15, max 1000)
sinceNoRFC3339 cursor for short-polling; echo back next_since from prior response
statusNoFilter by status (active, onboarding, deactive)
keywordNoSearch by full name, email, phone, or address
assignment_tierNoFilter by assignment tier (lead, buddy, float)

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already mark as readOnlyHint=true and non-destructive. Description adds behavioral details: pagination, cursor support, and specific output fields (status, tier, skills, crew relations). No contradiction with annotations.

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

Conciseness4/5

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

Four sentences with slight redundancy (first sentence repeats title). Still efficient and front-loaded with key information. Could trim the first sentence without loss.

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

Completeness5/5

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

Provides a complete picture for a list tool: explains returned fields, pagination, cursor for sync, and a practical use case (preferred_technician_id). No output schema needed; description suffices.

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

Parameters4/5

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

Schema covers all 7 parameters (100% coverage). Description adds value by explaining `since` cursor usage and linking to preferred_technician_id, going beyond schema descriptions.

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

Purpose5/5

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

The description clearly states it lists technicians (field workers) with status, tier, skills, crew relations, and explicitly links to dispatch scheduling. It distinguishes from sibling tools like getTechnician or createTechnician by focusing on roster listing.

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

Usage Guidelines4/5

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

Provides usage guidance such as discovering preferred_technician_id and using `since` cursor for incremental sync. Lacks explicit when-not-to-use or alternatives among similar list tools like listNearbyTechnicians or listTechnicianSkills.

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

listTechnicianSkillsList skills for a technicianA
Read-only
Inspect

List skills for a technician

Returns paginated skills assigned to the technician. By default (eligible_only omitted or true) only active skills are returned — pass eligible_only=false to include inactive skills.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTechnician ID — business_user_profiles.id (UUID)
pageNoPage number (default: 1)
limitNoPage size (default: 15, max: 1000)
eligible_onlyNotrue (default) = active skills only; false = all assigned skills including inactive

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already signal readOnly. The description adds value by clarifying pagination and the default filtering for active skills via eligible_only. No contradictions.

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

Conciseness5/5

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

Two concise sentences with no fluff. The key information (purpose and filtering nuance) is front-loaded.

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

Completeness4/5

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

For a simple read-only list tool with complete schema coverage, the description adequately explains pagination and filtering. No output schema exists, so return format is not expected.

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

Parameters4/5

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

Schema provides full parameter descriptions. The description adds meaning for eligible_only by explaining its default and effect, enhancing the schema's description.

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

Purpose5/5

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

The description clearly states it lists skills for a specific technician, differentiating from listing all skills (e.g., listSkills). The verb 'list' and resource 'skills for a technician' are specific.

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

Usage Guidelines3/5

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

The description explains the default behavior of eligible_only but does not explicitly state when to use this tool versus alternatives like listSkillsByCategory or listSkills. Usage context is implied but not contrasted.

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

listVehiclesList vehiclesA
Read-only
Inspect

List vehicles

Returns the business's fleet: paginated service vehicles (vans/trucks) with operational status (idle, on job, maintenance) — the fleet inventory behind crew carpooling and job mobilization. Supports the since cursor for incremental fleet sync.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number (default 1)
limitNoItems per page (default 15, max 1000)
sinceNoRFC3339 cursor for short-polling; echo back next_since from prior response
statusNoFilter by status (inactive, idle, on_job, maintenance)
keywordNoSearch by name, brand, model, or plate number

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true. Description adds key behavioral traits: pagination, status filtering, and cursor-based incremental sync.

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

Conciseness5/5

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

Extremely concise: one sentence for purpose, one for key capability. No filler. Front-loaded.

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

Completeness4/5

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

Covers pagination, filtering, and incremental sync. No output schema, but description adequately explains returns (fleet with status). Minor: could mention response shape.

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

Parameters3/5

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

Schema description coverage is 100%, so description adds little beyond confirming the `since` cursor's purpose. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states it lists vehicles and returns the fleet with operational status. It distinguishes from siblings like getVehicle (singular) and listTechnicians, etc.

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

Usage Guidelines4/5

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

Context is clear: returns fleet with pagination and incremental sync. No explicit when-not or alternatives, but the purpose is unambiguous given sibling context.

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

previewEmergencyReschedulePreview emergency insert + cascade rescheduleBInspect

Preview emergency insert + cascade reschedule

Computes (WITHOUT writing) the cascade of inserting an emergency job onto a technician at a chosen time: where the emergency lands + every job pushed back, grouped per business-local day. displacement_mode=reassign instead hands each displaced job to another feasible technician at its ORIGINAL window (same-day promise) — jobs with no alternate capacity fall back to reschedule and stay in days. mode=overtime keeps everyone same-day (tech works late); mode=next_day rolls overflow to the next working day(s). Read-only — safe to call repeatedly; commit is a separate endpoint. Isolated feature (see EMERGENCY_RESCHEDULE_DESIGN.md). 409 NEXT STEPS: EMERGENCY_RESCHEDULE_SLOT_OCCUPIED — the landing window is blocked by a job the cascade may NOT move (another P0, a crew or multi-day job): choose another technician (walk the /candidates ranking) or another time; displacement never touches P0/crew/multi-day anchors. EMERGENCY_RESCHEDULE_NOT_ELIGIBLE / CREW_UNSUPPORTED / MULTIDAY_UNSUPPORTED / NO_WORKING_DAY / IN_PAST — same remedies as /candidates.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYesCascade mode: overtime = displaced jobs stay same-day (tech works late); next_day = overflow rolls to the next working day.
start_atYesDesired start — business-local naive datetime, no offset. Must be in the future.
technician_idYesTarget technician (must belong to the business).
idempotency_keyNoOptional idempotency key (forwarded as the Idempotency-Key header). Reuse the same value when retrying so the operation runs at most once.
emergency_job_idYesID of the P0 job to insert.
displacement_modeNoFate of displaced jobs: reschedule (default — pushed to later windows) or reassign (handed to another feasible technician at their ORIGINAL time; no-capacity jobs fall back to reschedule).

TDQS

B3.4/5.0
Behavior1/5

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

Description claims 'Read-only' and 'Computes (WITHOUT writing)' but annotation readOnlyHint is false, constituting a direct contradiction. This undermines agent trust.

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

Conciseness4/5

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

Well-structured with front-loaded purpose, mode details, safety note, and error codes. Slightly long but every section earns its place.

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

Completeness3/5

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

Covers essential behavior and error handling, but no output schema exists and description does not explain the return format (e.g., the structure of the preview). Adequate for a preview tool but could be more complete.

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

Parameters3/5

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

Schema coverage is 100% (all parameters described). Description adds contextual explanation of modes and displacement but does not provide significant value beyond the schema descriptions.

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

Purpose5/5

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

Clearly states it computes a cascade preview without writing, distinguishes from commit sibling via explicit 'Read-only — safe to call repeatedly; commit is a separate endpoint.'

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

Usage Guidelines4/5

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

Provides error codes and next steps, mentions isolation feature reference. Could explicitly contrast with previewJobRequestMove or state when not to use, but context is adequate.

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

previewJobRequestMovePreview a schedule-board job moveAInspect

Preview a schedule-board job move

Computes (WITHOUT writing) the outcome of moving a confirmed job to a new time and/or technician: where it lands, every later job pushed back per mode, and the warnings the coordinator would accept (displaced jobs leaving their confirmed windows, overtime). Same technician = pure time move; different technician = manual reassign. Read-only — safe to call repeatedly while dragging; commit is a separate endpoint. See SCHEDULE_BOARD_DESIGN.md. Warning detail: a TECH_NOT_FEASIBLE warning carries reason = cannot_arrive_in_time (commute from the tech day-start location / shift start; earliest_feasible_at (RFC3339 UTC) is the first same-day time they CAN be on site — suggest it as the drop slot) | missing_required_skills | not_available_today (no working hours, approved time off, or outside the service area) | not_lead_tier. For a P0 move this warning is advisory (coordinator may commit anyway); for p1/p2/p3 the same condition is the hard 409 SCHEDULE_MOVE_TECH_INFEASIBLE. 409 NEXT STEPS: SCHEDULE_MOVE_NOT_ELIGIBLE (job unconfirmed/unquoted/archived/completed — not movable) · SCHEDULE_MOVE_IN_PROGRESS (tech already executing — do not move) · SCHEDULE_MOVE_IN_PAST (pick a future time) · SCHEDULE_MOVE_SLOT_OCCUPIED (landing window blocked by an immovable anchor — another tech/time) · SCHEDULE_MOVE_TECH_INFEASIBLE (non-P0 hard block: target tech not qualified/available — its data carries technician_id, reason (same catalog as the TECH_NOT_FEASIBLE warning) and, for cannot_arrive_in_time, earliest_feasible_at (RFC3339 UTC) to suggest as the drop slot; change tech or time) · SCHEDULE_MOVE_MULTIDAY_UNSUPPORTED (multi-day jobs not movable v1) · SCHEDULE_MOVE_NO_WORKING_DAY (pick a working day) · SCHEDULE_MOVE_REQUIRES_FREE_SLOT (non-P0 moves may not displace — free capacity only, unless the owner enables allow_non_p0_displacement) · SCHEDULE_MOVE_CREW_UNSTAFFABLE (a crew slot has no feasible replacement at the new time — another time). A landing outside the customer-confirmed window is NOT an error — it returns 200 with a MOVED_OUTSIDE_WINDOW warning (customer_window attached) that the coordinator overrides.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesJob request ID (UUID or short_code)
modeYesCascade mode for displaced jobs: overtime = stay same-day (tech works late); next_day = overflow rolls to the next working day.
start_atYesNew start — business-local naive datetime, no offset. Must be in the future.
technician_idYesTarget technician — may equal the current tech (pure time move) or differ (manual reassign).
idempotency_keyNoOptional idempotency key (forwarded as the Idempotency-Key header). Reuse the same value when retrying so the operation runs at most once.

TDQS

A3.6/5.0
Behavior1/5

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

Annotation Contradiction: the description repeatedly states 'WITHOUT writing', 'Read-only — safe to call repeatedly', yet the annotations declare `readOnlyHint: false` and `idempotentHint: false`. This directly contradicts the most important behavioral trait of the tool. Per the rubric, a contradiction with annotations forces a score of 1 despite the otherwise rich behavioral detail.

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

Conciseness3/5

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

The description is well-structured and front-loaded, with the core purpose in the first sentence and organized sections for warnings and errors. However, it is very long and repeats some schema-supplied details such as mode semantics and technician equality. The exhaustive 409 error catalog is valuable but could be condensed or placed in referenced documentation without losing much utility.

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

Completeness4/5

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

For a complex preview operation with no output schema, the description is remarkably complete: it covers outcome computation, cascade behavior, warning semantics, error conditions, and temporal constraints. The one significant gap is not in the text itself but in the contradictory read-only annotation, which prevents the overall definition from being fully trustworthy.

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

Parameters4/5

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

The input schema already covers all parameters at 100%, setting the baseline at 3. The description adds meaningful interpretive value by explaining that `mode` determines how later jobs are pushed back, that `technician_id` distinguishes pure time moves from manual reassigns, and that `earliest_feasible_at` should be suggested as a drop slot for infeasible moves. This goes beyond schema definitions.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Computes (WITHOUT writing) the outcome of moving a confirmed job to a new time and/or technician.' It clearly distinguishes preview from execution by saying 'commit is a separate endpoint' and from emergency reschedule by naming the job-move context. This is unambiguous and differentiates well from sibling tools.

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

Usage Guidelines4/5

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

The description explicitly frames the tool as a read-only preview safe for repeated calls while dragging and points to commit as a separate endpoint, giving clear situational context. It does not name the exact sibling `commitJobRequestMove`, but the intent is obvious. It also gives extensive 409 error conditions that help the agent decide whether a move is even viable.

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

quoteJobRequestFire quote (FIXED action — business)AInspect

Fire quote (FIXED action — business)

Sends the quote: sets quoted_at + duration cols, advances pending_action to confirm_booking. Status stays booking.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesJob request ID
crewNoCrew — multi-person plan (tech lead + buddies). Omit / empty = single person (lead 100%). When present must have exactly one is_lead and wrench_percent summing to 100. See MULTIPERSON_CREW_DESIGN.md.
status_versionNoOptimistic-lock fence: the status_version from your last read. Omitted/0 = fence on the row's current version (no race protection).
idempotency_keyNoOptional idempotency key (forwarded as the Idempotency-Key header). Reuse the same value when retrying so the operation runs at most once.
job_duration_minutesYesHands-on work duration in minutes (man-minutes for a crew job). Required, min 1.
mobilization_minutesNoMobilization (setup/travel-prep) minutes added before the work. Optional, min 0.
demobilization_minutesNoDemobilization (teardown) minutes added after the work. Optional, min 0.

TDQS

A3.9/5.0
Behavior4/5

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

The description reveals that the tool mutates state (sets columns, advances pending_action) and notes that status remains 'booking'. Annotations already mark it as non-read-only and non-destructive. The description adds context about the idempotency key parameter, which aligns with the idempotentHint false annotation properly.

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

Conciseness4/5

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

The description is short and to the point. The first line repeats the title unnecessarily, but the second line provides the core functionality. It is efficiently structured with minimal waste.

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

Completeness4/5

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

For a tool with 7 parameters and no output schema, the description covers the main behavioral effects and state changes. It does not explain failure scenarios or prerequisites (e.g., job request must be in 'booking' status), but given the detailed schema descriptions, it is sufficiently complete for an agent to understand the tool's purpose.

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

Parameters3/5

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

Schema coverage is 100%, so all parameters are described in the schema. The description adds minimal additional meaning beyond stating the overall effect (e.g., 'sets duration cols' relates to job_duration_minutes). It does not elaborate on parameter details or constraints beyond what's in the schema.

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

Purpose5/5

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

The description clearly states the tool's action: 'Sends the quote' and specifies the exact effects (sets quoted_at + duration columns, advances pending_action to confirm_booking). This distinguishes it from sibling tools like confirmJobRequest, which handles the next step.

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

Usage Guidelines3/5

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

The description implies this tool is used after creating a job request and before confirming a booking, but it does not explicitly state when to use it versus alternatives like confirmJobRequest or commitJobRequestMove. No exclusions or prerequisites are mentioned.

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

replaceTechnicianBuddiesReplace a technician's buddiesA
Idempotent
Inspect

Replace a technician's buddies

Overwrites the technician's buddy list with the provided set of technician IDs. Sending an empty list clears all buddies. Each buddy ID must be an active technician of the same business; a technician cannot be their own buddy.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTechnician ID
buddy_idsNoTechnician ids to set as this lead's buddies (max 50; self-buddy rejected).

TDQS

A4.3/5.0
Behavior4/5

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

Annotations indicate idempotentHint=true and destructiveHint=false, which are consistent. The description adds important behavioral details: buddy IDs must be active technicians of same business and no self-buddy. No contradictions.

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

Conciseness4/5

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

The description is concise with two short paragraphs. The first line repeats the title but the second adds essential details. It is well-structured and front-loaded.

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

Completeness4/5

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

With 2 parameters and no output schema, the description provides sufficient behavioral context including edge case (empty list) and constraints. It covers the essential information for correct usage.

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

Parameters4/5

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

Schema coverage is 100%, baseline 3. The description adds semantic value beyond the schema: clarifies that empty list clears buddies and imposes constraints (active technician, no self-buddy) that are not in the parameter descriptions.

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

Purpose5/5

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

The description clearly states the action 'Replace a technician's buddies' and explains it overwrites the buddy list. The purpose is specific and distinct from sibling tools like replaceTechnicianLeads or replaceTechnicianServiceAreas.

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

Usage Guidelines4/5

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

The description explains that an empty list clears all buddies, providing clear context. It does not explicitly mention when not to use it or compare with alternatives, but the sibling tools have distinct purposes making the guideline adequate.

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

replaceTechnicianLeadsReplace a buddy's leaders (buddy side)A
Idempotent
Inspect

Replace a buddy's leaders (buddy side)

Sets the full set of leads this buddy belongs to (many-to-many favorites). Replace-semantics — lead_ids is the complete new list; [] clears every leader. Managed by business staff.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesBuddy technician ID
lead_idsNoLead technician ids this buddy assists (max 50).

TDQS

A4.2/5.0
Behavior4/5

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

Beyond annotations (idempotentHint=true, destructiveHint=false), the description explains that lead_ids is the complete new list and that [] clears all leaders, providing key behavioral context for a replace operation.

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

Conciseness5/5

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

The description is concise with two sentences plus a title, each sentence providing essential information without redundancy.

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

Completeness4/5

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

The description covers purpose, behavior, parameter semantics, and access context (business staff), which is adequate for a replace tool with good annotations.

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

Parameters4/5

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

Schema coverage is 100% with descriptions, but the description adds value by clarifying replace semantics and the clearing behavior for empty array, which is not explicit in the schema.

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

Purpose5/5

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

The description clearly states the verb 'replace' and resource 'buddy's leaders', and distinguishes from sibling tools like replaceTechnicianBuddies. It explains replace semantics and the scope of the operation.

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

Usage Guidelines3/5

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

The description implies usage context through replace-semantics and mention of business staff, but does not explicitly state when to use vs alternatives or provide when-not guidance.

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

replaceTechnicianServiceAreasReplace a technician's service areasA
Idempotent
Inspect

Replace a technician's service areas

Overwrites the technician's service-area assignments with the provided set of service area IDs. Sending an empty list clears all. Each service area ID must belong to the same business — any missing id → 404 SERVICE_AREA_NOT_FOUND with missing_ids and no writes. The resolved set is returned and also embedded as service_areas in the technician GET/list response. Managed by business staff (Booking Coordinator), not tech self-service.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTechnician ID
service_area_idsNoService-area ids (max 50). Discover via GET /service-areas.

TDQS

A4.7/5.0
Behavior5/5

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

The description adds significant behavioral details beyond annotations: overwriting semantics, clearing via empty list, atomic partial failure (404 with no writes), and that the result is returned and embedded in technician responses. Annotations confirm idempotent and non-destructive nature, no contradiction.

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

Conciseness4/5

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

The description is a single paragraph that is well-structured and front-loaded with the main action. It contains necessary details without fluff, though it could be slightly more concise by merging some sentences. Still, it is efficient and clear.

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

Completeness5/5

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

Given the tool's low complexity (2 parameters, no output schema) and the presence of annotations, the description covers all essential aspects: purpose, behavior, error handling, side effects (embedded in get/list), and access control. It is fully adequate for an agent to use correctly.

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

Parameters5/5

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

Schema covers both parameters with descriptions. The description adds valuable context: clearing with empty list, error handling for missing service_area_ids, and that the resolved set is returned. This goes beyond what the schema provides, enhancing understanding.

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

Purpose5/5

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

The description uses a specific verb 'Replace' and resource 'technician's service areas', and clearly states the action: overwriting assignments with provided IDs. This distinguishes it from sibling tools like replaceTechnicianBuddies or replaceTechnicianLeads, which operate on different resources.

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

Usage Guidelines4/5

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

The description provides clear context: it's managed by business staff (Booking Coordinator) and not for tech self-service. It also explains behavior for empty input and error handling. While it doesn't explicitly compare with alternatives, the sibling tools are distinct enough that no further guidance is needed.

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

replaceTechnicianSkillsReplace a technician's skillsAInspect

Replace a technician's skills

Sets the technician's full skill set in one call (replace semantics): skills not in the list are removed, new ones added. Pass an empty list to clear all. All skills must be active and belong to the business — on SKILL_NOT_FOUND (404) the data field contains {"missing_ids": ["uuid", ...]}; on SKILL_INACTIVE (409) it contains {"inactive_ids": ["uuid", ...]}.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTechnician ID — business_user_profiles.id (UUID)
skill_idsNoSkill ids (max 100). Discover via GET /skills.

TDQS

A4.7/5.0
Behavior5/5

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

The description fully discloses the behavioral traits beyond the minimal annotations. It explains the replace semantics (removing/adding), constraints that all skills must be active and belong to the business, and specific error responses (SKILL_NOT_FOUND with missing_ids, SKILL_INACTIVE with inactive_ids). No contradictions with annotations.

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

Conciseness4/5

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

The description is concise with only two sentences in the second paragraph, but the first line is a header-like repetition. The structure is clear with a brevity introduction followed by detailed behavioral notes. Minor verbosity is acceptable, but could be slightly tighter.

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

Completeness5/5

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

Given the tool's low complexity (2 parameters, no output schema), the description covers all essential aspects: operation semantics, parameter constraints, error conditions, and clearing behavior. It is fully self-contained and requires no additional information for correct usage.

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

Parameters5/5

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

With 100% schema description coverage, the baseline is 3, but the description adds significant value beyond the schema. It explains the replace semantics apply to both parameters, clarifies that skill_ids must be active and belong to the business, and details the error response structures. The example and maxItems in schema are complemented by practical usage guidance.

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

Purpose5/5

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

The name and title clearly indicate the action: replacing a technician's skills. The description explicitly states 'replace semantics' and details that skills not in the list are removed and new ones added, distinguishing it from sibling tools like listSkillsByCategory or replaceTechnicianBuddies, which target different resources.

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

Usage Guidelines4/5

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

The description explains the replace semantics and mentions passing an empty list to clear all skills, providing clear context for usage. However, it does not explicitly state when not to use this tool or suggest alternatives, which is a minor gap. The context from sibling tool names partially compensates.

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

replaceTechnicianVehiclesReplace a technician's vehiclesA
Idempotent
Inspect

Replace a technician's vehicles

Overwrites the technician's vehicle list with the provided set of vehicle IDs (the vehicles this technician uses). Sending an empty list clears all. Each vehicle ID must belong to the same business. The list is also embedded as vehicle_ids in the technician GET/list response.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTechnician ID
vehicle_idsNoVehicle ids (max 50). Discover via GET /vehicles.

TDQS

A4.6/5.0
Behavior4/5

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

The description discloses that the operation is an overwrite, which is idempotent as per annotations. It adds value by noting that the vehicle list is embedded in the technician GET/list response. No contradictions with annotations.

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

Conciseness5/5

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

The description is concise: a short title followed by two sentences that efficiently convey the core behavior and constraints. No unnecessary words.

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

Completeness5/5

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

Given the tool's simplicity (2 parameters, no output schema, no nested objects), the description sufficiently explains the operation: overwrite behavior, clearing via empty list, business consistency, and where to find vehicle IDs. It also mentions the response embedment.

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

Parameters5/5

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

The description adds significant context beyond the schema: for vehicle_ids, it explains that an empty list clears all, each ID must be from the same business, and suggests discovering via GET /vehicles. For id, it simply states 'Technician ID'. With 100% schema coverage, this is excellent.

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

Purpose5/5

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

The description clearly states the action ('Replace a technician's vehicles') and resource, elaborating with 'Overwrites the technician's vehicle list with the provided set of vehicle IDs'. This distinguishes it from sibling tools like replaceTechnicianBuddies and replaceTechnicianSkills.

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

Usage Guidelines4/5

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

The description provides guidance on usage: 'Sending an empty list clears all' and 'Each vehicle ID must belong to the same business'. It also suggests discovering vehicle IDs via GET /vehicles. However, it does not explicitly state when to use this tool versus alternatives, which is implicit given the specific resource.

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

updateCustomerUpdate a customerA
Idempotent
Inspect

Update a customer

PARTIAL update — send only the fields you are changing; anything you OMIT is left exactly as stored (two-way CRM sync friendly: push one field from your system of record without re-sending the record). To CLEAR a field, send it as an empty string: uid, phone, email, notes, preferred_technician_id, service_area_id. tier and status are enums with no empty member, so an empty value there is ignored rather than stored. full_name cannot be set to empty. The nested address object is all-or-nothing: omit it to leave the stored address (and its coordinates) untouched; when present it REPLACES the whole block, and missing latitude/longitude are geocoded from the address. A customer must keep at least one contact channel — an update that would clear both phone and email is refused with PHONE_OR_EMAIL_REQUIRED.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCustomer ID (UUID)
uidNoYour external reference for this customer. Omit to leave unchanged, "" to clear. Max 32 chars.
tierNoLoyalty tier. Omit to leave unchanged; "" is ignored (an enum has no empty member).
emailNoEmail address. Omit to leave unchanged, "" to clear.
notesNoFree-form internal notes about the customer. Omit to leave unchanged, "" to clear; max 4000 chars.
phoneNoPhone number in E.164 international format (`+16135550188`); a bare national number is rejected with PHONE_INVALID — see createCustomerReq.Phone. Omit to leave unchanged, "" to clear. 10–20 chars.
statusNoLifecycle status. Omit to leave unchanged; "" is ignored.
addressNoPostal address and coordinates. Omit the whole object to leave the stored address untouched; when present it REPLACES the address block.
full_nameNoCustomer's full name. Omit to leave unchanged; an empty or blank value is ignored (a customer cannot be left nameless). Max 255 chars.
sms_opt_inNoSMS consent, tri-state: omit/null = leave unchanged; true = grant (only when the customer explicitly consented — the original consent timestamp is preserved); false = revoke (opt-out, stops SMS immediately).
service_area_idNoUUID of the service area for this customer. Omit to leave unchanged, "" to clear. Must belong to this business.
preferred_technician_idNoUUID of the technician this customer prefers. Omit to leave unchanged, "" to clear. Must belong to this business.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnly=false, idempotent=true, destructive=false. The description adds substantial behavioral detail: omitted fields are left unchanged, empty strings clear fields, enum empty values are ignored, full_name cannot be emptied, address replacement is all-or-nothing with geocoding, and clearing both contact channels is refused. This is rich, non-obvious behavior that the annotations alone cannot convey.

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

Conciseness5/5

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

The description is dense but every clause earns its place. The most important caveat — partial update semantics — is front-loaded, and the subsequent rules cover clearing, enums, address replacement, and validation without repetition or filler.

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

Completeness5/5

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

For a complex 12-parameter mutation with many edge cases, the description covers all critical update behaviors, including an explicit error condition. No output schema exists, so the absence of return-value documentation is not a significant gap given how thoroughly the operation's semantics are specified.

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

Parameters5/5

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

Although schema coverage is 100%, the description adds cross-cutting parameter semantics that tie the schema together: which fields accept empty-string clearing, how enum empty values are handled, the tri-state nature of sms_opt_in, and the all-or-nothing address object. This materially improves an agent's ability to construct correct update payloads.

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

Purpose5/5

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

The description states a clear verb and resource: update an existing customer. It goes further by immediately characterizing the operation as a PARTIAL update, which distinguishes it from create/delete/get siblings even without naming them.

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

Usage Guidelines4/5

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

The title and lead sentence establish clear context for modifying an existing customer, and the partial-update semantics make the intended use unambiguous. However, it does not explicitly contrast with createCustomer, getCustomer, or deleteCustomer, so it lacks an explicit when-not-to-use statement.

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

updateJobPrioritySet job priority (scheduling staff)AInspect

Set job priority (scheduling staff)

Sets the P0–P3 priority on a non-archived, non-completed job (Owner / Administrator / Booking Coordinator). Allowed values: "p0" (emergency, interrupt-driven) | "p1" (top — displaced only by p0; may carry an sla_deadline arming auto-escalation) | "p2" (standard) | "p3" (deferrable, first displacement victim). sla_deadline is only valid with p1 and must be in the future (business-local naive datetime); moving away from p1 disarms the SLA clock. Accepts UUID or short_code in :id.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesJob request ID or short_code
noteNoOptional justification (max 500 chars) — recorded on the activity trail and the priority_changed webhook. Recommended when de-escalating an SLA-escalated job (audit provenance).
priorityYesNew P0–P3 priority level. p0=emergency, p1=top, p2=standard, p3=deferrable.
sla_deadlineNoSLA deadline (business-local naive datetime) — only with priority=p1; (re)arms the auto-escalation clock. Omitted on a p1 change keeps any stored deadline; changing away from p1 disarms SLA entirely.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint=false, etc.), the description reveals behavioral traits: it modifies the job, triggers SLA auto-escalation, disarms SLA when changing away from p1, and records notes on activity trail and webhook. No contradictions.

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

Conciseness5/5

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

The description is well-structured with a title line and a paragraph. Every sentence provides necessary information without fluff, making it concise yet comprehensive.

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

Completeness5/5

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

Despite no output schema, the description fully covers the tool's behavior, constraints, prerequisites, and side effects. It is complete for a mutation tool of this complexity.

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

Parameters4/5

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

With 100% schema coverage, the description adds context beyond the schema: clarifies that sla_deadline is only valid with p1, must be future, and is business-local naive datetime. Also explains note's audit purpose.

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

Purpose5/5

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

The description clearly states the verb 'set' and the resource 'job priority', and specifies constraints (non-archived, non-completed). It distinguishes from sibling tools, which are mainly CRUD operations for other entities.

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

Usage Guidelines4/5

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

The description explains when to use the tool (for setting P0-P3 priorities), details allowed priority values with their meanings, and specifies constraints (sla_deadline only with p1). It lacks explicit when-not-to-use or alternatives, but context is clear.

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

updateTechnicianUpdate a technicianA
Idempotent
Inspect

Update a technician

Updates mutable technician profile fields. start_location_type=office re-snapshots the current business address + coordinates (body address/start_location_lat/start_location_long ignored; requires business coordinates, else 400 BUSINESS_LOCATION_MISSING). start_location_type=home (or empty) uses the address + coordinates from the body.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTechnician ID
emailNoEmail address. At least one of phone/email is required.
phoneNoPhone number in E.164 international format (`+16135550188`); a bare national number is rejected with PHONE_INVALID — see AddTechnicianReq.Phone. At least one of phone/email is required — enforced in the usecase; see the note on AddTechnicianReq.Phone for why no binding rule may decide it.
addressNoHome address (the day-start point when start_location_type=home).
full_nameYesThe person's full display name. Required; max 255 chars.
job_titleNoDisplay title.
join_dateNoFirst working day (YYYY-MM-DD).
assignment_tierNoCrew tier: lead / buddy / float (float = excluded from auto crew-assign).
business_group_idYesRole group. Discover IDs via GET /permission/groups.
start_location_latNoExplicit day-start latitude in decimal degrees (-90..90); when set it wins over the address geocode.
start_location_longNoExplicit day-start longitude in decimal degrees (-180..180); when set it wins over the address geocode.
start_location_typeNoDay-start point: home or office; explicit coordinates win when set.

TDQS

A3.8/5.0
Behavior4/5

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

The description discloses non-obvious behavior beyond the annotations: when start_location_type=office, body address and coordinates are ignored and the business address is re-snapshotted, which may fail with BUSINESS_LOCATION_MISSING. This is valuable behavioral context that annotations alone do not provide.

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

Conciseness4/5

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

The description is compact and front-loaded with the purpose before diving into conditional behavior. The only minor issue is the redundant opening line repeating the title, but the rest of the description earns its place.

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

Completeness4/5

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

For a 12-parameter update tool, the description covers the key non-obvious interaction that could cause incorrect calls. The rich schema covers parameter details, so the absence of return-value details is acceptable. It could be slightly stronger with an explicit statement about the typical response or required preconditions.

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

Parameters4/5

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

Schema description coverage is complete, so the baseline is 3. The description adds meaningful interaction semantics between start_location_type and address/coordinate fields, clarifying which values are ignored and when an error can occur, which goes beyond the schema's individual field descriptions.

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

Purpose4/5

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

The description clearly states the tool updates mutable technician profile fields, which identifies the operation and resource. It does not explicitly name sibling alternatives but the verb and resource scope make the purpose distinguishable from create/delete/list tools.

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

Usage Guidelines3/5

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

The description provides contextual parameter usage guidance, especially for start_location_type, but does not explicitly state when to use this tool versus alternatives like createTechnician or deleteTechnician. Usage is implied rather than directly stated.

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. Dates show when Glama detected each change.

  1. 14 tool updatesv0.1.1
    • ChangedcreateCustomer1 field changed
      • changedInput schema / properties / phone / description
        Previous value: -"Phone number. Optional, but at least one of phone/email is required; 10–20 chars."New value: +"Phone number in E.164 international format: a leading `+` and the country\ncode, e.g. `+16135550188`. A bare national number (`6135550188`) is\nREJECTED with PHONE_INVALID — there is no default region to guess the\ncountry from. Separators (spaces, dashes, parentheses) are stripped before\nvalidation. Optional, but at least one of phone/email is required; 10–20 chars."
    • AddedcreateJobType
    • AddedcreateServiceArea
    • AddedcreateSkill
    • AddedcreateSkillCategory
    • ChangedcreateTechnician1 field changed
      • changedInput schema / properties / phone / description
        Previous value: -"At least one of phone/email is required (identity resolution key)."New value: +"Phone number in E.164 international format: a leading `+` and the country\ncode, e.g. `+16135550188`. A bare national number (`6135550188`) is\nREJECTED with PHONE_INVALID — there is no default region to guess the\ncountry from. At least one of phone/email is required (identity resolution key)."
    • AddedcreateVehicle
    • AddeddeleteJobType
    • AddeddeleteServiceArea
    • AddeddeleteSkill
    • AddeddeleteSkillCategory
    • AddeddeleteVehicle
    • ChangedupdateCustomer11 fields changed
      • changedInput schema / properties / address / description
        Previous value: -"Postal address and coordinates."New value: +"Postal address and coordinates. Omit the whole object to leave the stored address untouched; when present it REPLACES the address block."
      • changedInput schema / properties / email / description
        Previous value: -"Email address."New value: +"Email address. Omit to leave unchanged, \"\" to clear."
      • changedInput schema / properties / full_name / description
        Previous value: -"Customer's full name. Required; max 255 chars."New value: +"Customer's full name. Omit to leave unchanged; an empty or blank value is ignored (a customer cannot be left nameless). Max 255 chars."
      • changedInput schema / properties / notes / description
        Previous value: -"Free-form internal notes about the customer; max 4000 chars."New value: +"Free-form internal notes about the customer. Omit to leave unchanged, \"\" to clear; max 4000 chars."
      • changedInput schema / properties / phone / description
        Previous value: -"Phone number. 10–20 chars."New value: +"Phone number in E.164 international format (`+16135550188`); a bare\nnational number is rejected with PHONE_INVALID — see createCustomerReq.Phone.\nOmit to leave unchanged, \"\" to clear. 10–20 chars."
      • changedInput schema / properties / preferred_technician_id / description
        Previous value: -"UUID of the technician this customer prefers. Must belong to this business."New value: +"UUID of the technician this customer prefers. Omit to leave unchanged, \"\" to clear. Must belong to this business."
      • changedInput schema / properties / service_area_id / description
        Previous value: -"UUID of the service area for this customer. Must belong to this business."New value: +"UUID of the service area for this customer. Omit to leave unchanged, \"\" to clear. Must belong to this business."
      • changedInput schema / properties / status / description
        Previous value: -"Lifecycle status."New value: +"Lifecycle status. Omit to leave unchanged; \"\" is ignored."
      • changedInput schema / properties / tier / description
        Previous value: -"Loyalty tier."New value: +"Loyalty tier. Omit to leave unchanged; \"\" is ignored (an enum has no empty member)."
      • changedInput schema / properties / uid / description
        Previous value: -"Your external reference for this customer. Optional; max 32 chars."New value: +"Your external reference for this customer. Omit to leave unchanged, \"\" to clear. Max 32 chars."
      • changedInput schema / required
        Previous value: -[
        -  "id",
        -  "full_name"
        -]New value: +[
        +  "id"
        +]
    • ChangedupdateTechnician1 field changed
      • changedInput schema / properties / phone / description
        Previous value: -"At least one of phone/email is required."New value: +"Phone number in E.164 international format (`+16135550188`); a bare\nnational number is rejected with PHONE_INVALID — see AddTechnicianReq.Phone.\nAt least one of phone/email is required — enforced in the usecase; see\nthe note on AddTechnicianReq.Phone for why no binding rule may decide it."
  2. 43 tool updatesv0.1.0
    • First observedcommitEmergencyReschedule
    • First observedcommitJobRequestMove
    • First observedconfirmJobRequest
    • First observedcreateCustomer
    • First observedcreateJobRequest
    • First observedcreateTechnician
    • First observeddeleteCustomer
    • First observeddeleteTechnician
    • First observedgetCustomer
    • First observedgetJobRequest
    • First observedgetJobRequestTimeline
    • First observedgetJobType
    • First observedgetServiceArea
    • First observedgetTechnician
    • First observedgetTechnicianSchedule
    • First observedgetVehicle
    • First observedlistCrewCandidates
    • First observedlistCustomers
    • First observedlistEmergencyCandidates
    • First observedlistJobRequestBookingWindows
    • First observedlistJobRequestChanges
    • First observedlistJobRequests
    • First observedlistJobTypes
    • First observedlistMatchingSlots
    • First observedlistNearbyTechnicians
    • First observedlistServiceAreas
    • First observedlistSkillCategories
    • First observedlistSkills
    • First observedlistSkillsByCategory
    • First observedlistTechnicians
    • First observedlistTechnicianSkills
    • First observedlistVehicles
    • First observedpreviewEmergencyReschedule
    • First observedpreviewJobRequestMove
    • First observedquoteJobRequest
    • First observedreplaceTechnicianBuddies
    • First observedreplaceTechnicianLeads
    • First observedreplaceTechnicianServiceAreas
    • First observedreplaceTechnicianSkills
    • First observedreplaceTechnicianVehicles
    • First observedupdateCustomer
    • First observedupdateJobPriority
    • First observedupdateTechnician

TDQS

B3.4/5.0
Disambiguation3/5

Most tools pair a unique action with a unique resource, but the scheduling/candidate cluster—listJobRequestBookingWindows, listMatchingSlots, listNearbyTechnicians, listCrewCandidates, and listEmergencyCandidates—has overlapping concepts that could cause misselection. The preview/commit and quote/confirm pairs are distinguishable but demand close reading.

Naming Consistency5/5

All 53 tools use the same verb-first camelCase pattern (create/get/list/update/delete plus preview/commit/replace/quote), with no snake_case or inconsistent verb styles. Minor semantic quirks like listTechnicianSkills versus listSkillsByCategory do not break the predictable pattern.

Tool Count1/5

With 53 tools, the surface is in the extreme range and creates a heavy tool-selection and context burden for agents. Even though the domain is broad, this set should be split into focused servers (customers, scheduling, technicians, fleet, catalog) rather than exposed as one monolithic tool set.

Completeness2/5

Scheduling and emergency-rescheduling flows are richly covered, but several resources are missing standard updates (no updateVehicle, updateJobType, updateServiceArea, updateSkill, or updateSkillCategory), and job requests lack explicit cancel/archive/advance-status endpoints despite a lifecycle-driven design. These are significant gaps an agent will hit when trying to manage work orders end to end.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/crisphive/crisphive-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server