Skip to main content
Glama
PineappleCare

jobber-mcp

PineappleCare Jobber MCP

An approval-gated MCP connector for Jobber, maintained by PineappleCare for Williams Solutions. It is an MIT-licensed derivative of Adeocode's Jobber MCP; upstream attribution remains in LICENSE.

Safety model

  • JOBBER_READ_ONLY=true is the default and registers no write tools.

  • Writes require both JOBBER_READ_ONLY=false and a deliberate JOBBER_WRITE_CAPABILITIES allowlist: records, scheduling, and/or communications.

  • Every write requires confirm_write: true, uses a fixed reviewed API operation or browser script, is audited with sensitive values hashed, and is never retried after an ambiguous result.

  • The server never exposes raw GraphQL, card charging, refund, delete, archive, bulk-mutation, webhook, expense, or timesheet mutation tools.

The MCP host must require interactive approval for every write tool.

Related MCP server: Jobber Automation MCP

Tools

The original reporting tools remain: client search/history, overdue invoices, outstanding quotes, job and revenue summaries, schedule lookup, requests inbox, and audit-log access.

Foundation reads are search_records, get_record, catalog_search, and team_list. They cover clients, properties, requests, quotes, jobs, invoices, visits, products/services, and assignable users.

list_timesheet_users, list_time_entries, and get_time_entry read native employee labour entries. The roster includes active employees and deactivated employees with entries in the selected dates. The native roster accepts 1–7 inclusive days; entry lists accept 1–31 inclusive days; entry dates default to America/Toronto. Entry selection uses the start date, not overlap: an overnight entry starting before the range is excluded, and a matching entry's full recorded duration is returned without clipping per day. Use finalDuration, not scheduled visit duration or a job note. Running entries return recorded_duration_seconds: null, never a misleading zero or estimated payroll total. An optional employee ID is sent as a native filter; an optional job ID is checked against this account and applied to each returned page. Continue through next_cursor even when a job-filtered page has no matches. No page alone establishes a complete total. Pay rates and time-entry writes, approval, payment, deletion and timer control remain unavailable.

Timesheet reads require the app's Timesheets read scope and appropriate user permissions/feature availability. A scope change can require reauthorization. Permission denials are errors, not empty results or proof of a required plan upgrade. Hermes grants these tools through Williams' existing read connection; other company profiles and neutral default remain excluded.

Property map-pin API check (October 20, 2026): live 2025-04-16 and 2026-09-25 schemas expose Property.address.coordinates for reads, but PropertyEditInput.address accepts only postal address fields and no pin coordinates. Coordinate inputs on billing/contact addresses are not a verified way to edit a selected property's map pin. The optional browser extension below provides native pin editing without changing addresses. A link in a client note does not change a native pin.

list_tasks and get_task expose native tasks with schedules, assignments, links and a content-derived task_version. The scheduling capability enables approval-required create_task and update_task for non-recurring tasks. Use explicit anytime (all-day), timed or unscheduled schedules; timezone defaults to America/Toronto. Optional client/property links are checked against this account. Assignment emails require notify_team: true (default false); they are not SMS and delivery is not verified. Timed assigned tasks may request a supported team reminder. Updates require expected_task_version, preserve omitted fields and reject completed/recurring tasks. No task deletion, completion or recurrence editing is exposed. Creation scans for identical tasks, blocks incomplete scans, and never retries an ambiguous mutation. Returned IDs remain available when readback fails or Jobber reports partial errors.

Job reads include jobType and billing information. create_job defaults to job_type: ONE_OFF, with FIXED_PRICE / ON_COMPLETION billing. This native combination was verified through an explicitly authorized internal live probe; there is no explicit job-type field in Jobber's creation input. Other one-off billing combinations remain unavailable until verified. Jobs start unscheduled, without visits, assignments, team notification or review-request SMS. Create explicitly requested visits separately. Several visits do not imply recurrence. An explicit RECURRING choice requires explicit VISIT_BASED billing and a non-periodic billing schedule; periodic scheduling is outside this tool.

The title is required for complete duplicate checking, bounded at 500 property jobs; incomplete scans block mutation. Source quote/request relationships are checked before creation. Only outcome: created confirms readback of the type, billing, destination/source, title, instructions, line items and unscheduled state. Partial or ambiguous responses preserve returned IDs and reconcile through reads without repeating the mutation. Candidates found after a timeout are evidence to review, not proof of successful creation. Never automatically convert, delete or recreate a mismatched job. See the creation contract.

list_notes returns paginated, versioned notes for clients, requests, quotes, jobs, and invoices. With records enabled, create_note and update_note create or edit text, pinned state, and supported record links after approval. They do not delete notes or add/remove attachments. Note writes verify ownership, version, and readback and never substitute a job or visit instructions field.

With records enabled, the server provides client, property, request, draft quote, job, and draft-invoice creation/update tools. With scheduling, it provides visit creation/update/completion and reviewed job close/reopen. Visit schedules use an explicit mode: anytime for a date without a time, timed for exact start/end times, or unscheduled for no date. Use create_visits to create 1-20 reviewed visits for one job in one mutation; the result reports and verifies each visit separately. With communications, it provides mark_quote_sent and mark_invoice_sent. These record an external send in Jobber; they do not deliver email. Use a separate approved mail tool for customer delivery.

create_draft_invoice accepts signed, nonzero quantities and nonnegative unit prices. A separate named discount uses quantity -1 and unit price 150 to deduct $150; never net that discount into a charge or its description. Present all lines and taxability for approval. subject is required for the bounded duplicate scan (up to 500 client invoices); an incomplete scan blocks creation. tax_mode defaults to hst_13: resolve an account-owned flat 13% HST rate and make omitted line taxability explicitly true, including negative discounts. Include tax_mode in the approval request. Only an explicit operator request uses tax_mode: none, which makes omitted taxability false and requires every line to be non-taxable. Prefer a 0% account rate when available; otherwise retain a verified flat account rate with zero taxable lines. tax_rate_id may disambiguate existing rates, but cannot select an incompatible rate. Missing or ambiguous rates block creation; no tax settings are changed. Quote and job creation still require positive quantities. The invoice stays unsent, and creation does not collect a payment. A fresh invoice read verifies signed quantities, prices, line totals, descriptions, taxability/product links, destination, draft status and the exact due-date instant (equivalent timestamp offsets are accepted). It also verifies the rate, exclusive tax calculation, subtotal, tax, total, balance and absence of unrequested invoice-level discounts, deposits, payments and tips. Only outcome: created confirms successful verified creation. Other outcomes retain any returned invoice ID and require reconciliation before a newly approved write; creation is never retried automatically. The existing guard against another invoice on the source job remains in place.

update_job_line_item_descriptions (records capability) accepts a job ID, its reviewed expected_updated_at, and up to 20 existing line-item IDs with exact replacement descriptions. It checks membership through the job's own paginated line-item connection (bounded at 500 lines), checks the version again, and sends only IDs and descriptions through jobEditLineItems. Readback verifies the descriptions and unchanged financial fields. Concurrent changes cannot be locked atomically by this API; any partial, changed, or ambiguous result requires reconciliation and a new approval. The mutation is never automatically retried.

Local development

npm ci
npm run build
npm test

Set JOBBER_CLIENT_ID and JOBBER_CLIENT_SECRET, then ask the MCP host to run authenticate. OAuth tokens are AES-256-GCM encrypted under JOBBER_STATE_DIR, or ~/.jobber-mcp/ when that variable is unset. Container deployments must mount JOBBER_STATE_DIR on persistent storage and provide a stable vault-supplied ENCRYPTION_KEY. Managed state fails closed without it; keys supplied through the environment are never copied into OS Keychain. OAuth tokens and the audit log both live under that directory. Never commit tokens, client secrets, or an .env file.

The included container image runs the authenticated streamable-HTTP transport. Set TRANSPORT=http, MCP_BASE_URL, MCP_API_KEY, and PORT, and expose only the /mcp endpoint to the intended MCP client. The image runs as an unprivileged user and expects JOBBER_STATE_DIR to be a writable persistent mount.

npm run schema:pull downloads the currently configured Jobber GraphQL schema using the encrypted local OAuth session and writes a versioned public schema snapshot under schema/. Do not use Developer Center's Test in GraphiQL on a live integration: Jobber says that flow invalidates its refresh token.

Release checks

npm test
npm run lint
npm run build
npm run smoke
npm run schema:validate
npm run verify:version-sync
npm run verify:no-secrets

This repository is GitHub-source-only today. It deliberately has no MCP registry server.json entry until the @pineapplecare/jobber-mcp package is actually published.

Private Williams voice API

The optional HTTP surface is separate from staff MCP tools and approvals. Enable with JOBBER_VOICE_ENABLED=true, JOBBER_VOICE_API_KEY (at least 32 characters, different from MCP_API_KEY), JOBBER_VOICE_ACCOUNT_ID, JOBBER_STATE_DIR and vault-supplied ENCRYPTION_KEY. Requires Node 22.13 or newer (node:sqlite); the pinned container runtime supports it. Keep the port on loopback/Tailscale, never a public ingress. The voice credential cannot authenticate MCP requests.

POST /voice/v1/execute accepts these fixed actions with call_id and original caller_number: resolve, status, prepare, preflight, submit, message, email_prepare, contact_email, operation_status, and the server-only end_call. Ermine supplies identity from signed active inbound call state; this is a trusted service interface, not a browser/customer endpoint. The connector verifies the configured account before any action, and again before external mutations. It never accepts arbitrary GraphQL or a tenant selector. See the Ermine release contract for the intake shape, deployment order and acceptance procedure.

submit/message/contact_email require caller confirmation and a UUID operation_id. Bind the ID to the full immutable payload and call. The SQLite journal in JOBBER_STATE_DIR/voice-operations.db records dispatch before every mutation, returned IDs and verified readbacks. Retries return the recorded result. Uncertain writes are reconciled through reads; verified steps may resume undispatched work. Missing evidence remains uncertain for staff review, with no blind mutation replay. This is not an exactly-once claim across network or process failures.

New work creates a Request and intake Note, then an Assessment only with a known property. Assessments have no start/end time, assigned users or team notification. Scheduling preferences remain in the Note. No Jobs, Visits, appointments, prices, status changes or customer notifications are created by this surface. Optional email, single names and incomplete locations are preserved without invented fields.

GET /voice/v1/health requires the voice bearer and returns aggregate operation outcomes and directory refresh progress/failure classifications, without client data. scripts/voice-fixture.mjs is a loopback-only fake Jobber backend for Ermine's opt-in cross-repository test; it isolates all audit and OAuth state from the developer's home directory and Keychain. Mock verification and schema validation do not replace testing scopes and writes on a Jobber test account.

Voice HTTP dispatch returns completed results or durable pending IDs within two seconds. A background worker resumes pending/uncertain operations from the journal; safe prerequisite read failures remain pending instead of becoming permanent write failures. Read-only resolve/status operations are also journaled and freshly reauthorized when polled. Per-operation scan checkpoints preserve completed pages. The complete, account-scoped SQLite phone directory refreshes in the background, including property-level contacts. It provides discovery candidates only; phone, record membership and property restrictions are reread before disclosure/writes. An index miss never authorizes new-client creation: complete duplicate checks still run before creation. /voice/v1/health includes directory completeness, refresh and failure timestamps. All new tables are additive and must survive rollback.

Completed reads remain in the journal when polled. Delivery rechecks account, caller phones, property restrictions and selected record membership; it does not restart full discovery. Slow authorization has one in-flight check and a one-use handoff expiring after two seconds. Pending replies include retry_at; callers must poll promptly to consume a completed check. Expired checks and process restarts require fresh authorization.

Schema rejection returns failed / invalid_input with invalid_fields. submission_rejected: true is returned only when the operation ID never entered the connector journal. Existing IDs cannot use that marker to bypass recovery. Explicit mutation validation errors with no returned record are stored as rejected steps and settle as failed/partial with error details. Transport loss, missing responses and top-level execution errors retain uncertainty. Rejected steps survive restarts and are never redispatched. Index account-check failures are included in refresh health reporting.

Current Ermine submissions bind a ready preflight to the exact intake revision, caller and selected destination. Corrections invalidate readiness. Assessments default to false and require explicit on-site intent; propertyless Requests remain disabled until their API behavior is verified. Phone-index candidates are freshly authorized and returned for explicit destination selection without a directory scan. An index miss stays unresolved; it never establishes a new customer.

Duplicate checks use a complete background generation from the last five minutes as a baseline, then perform a fresh, resumable account census before a new-client decision. Without that baseline, both passes are fresh. Every pass includes property contacts independently of client timestamps. Client pages contain the first contact and paginate all overflow contact, phone, email and property connections; accounts with zero/one-contact clients no longer need one separate HTTP request per client. The pinned API requested cost was measured as 885 for a 20-client page (900 reserved), with no writes during that measurement. Neither a partial census nor a census older than ten minutes permits creation. Transient background refresh failures resume after 15 seconds, preserving the last complete index and saved progress. Worker leases, due times and 15-second to five-minute reconciliation backoff protect pending/uncertain writes. Concurrent preflight reads share an in-flight census only when account, call, caller and every field used by the duplicate predicate match. Description-only corrections retain separate immutable preflight receipts; submission still runs its own fresh census before a client can be created. The staff MCP interface and approval contract remain unchanged.

Customer status is projected through an allowlist: names and relevant contact details, authorized service addresses, titles, reviewed status wording and recorded Visit/Assessment timing. Completed visits require include_history:true; no visit found, unscheduled, date-only and unavailable timing remain distinct. Each appointment's own client/property/parent is checked. Contact-owned phone matches retain the matched contact IDs and property restrictions rather than granting client-wide access. Internal notes, line items and financial states are excluded.

email_prepare returns a freshly authorized destination, consequences and a fingerprint of the complete current email collection. contact_email binds that fingerprint to the confirmed immutable proposal: client_id, optional contact_id, address, explicit make_primary, and intended_use (contact or invoices). It appends or promotes through narrowly defined clientEdit fields, preserves every prior address and verifies readback. Contact-only callers can update only their own matched contact. First-email primary behavior is disclosed before confirmation. Invoice intent is retained for staff where recipient changes are needed; no invoice, billing role, portal, notification or consent is changed. An uncertain email write remains journaled for reconciliation, never blind replay.

Private contact synchronization API

JOBBER_CONTACT_SYNC_ENABLED=true exposes fixed paginated client/contact/email/phone reads at GET /contact-sync/v1/page?kind=clients. Configure a separate JOBBER_CONTACT_SYNC_API_KEY (at least 32 characters), pinned JOBBER_CONTACT_SYNC_ACCOUNT_ID, and existing persistent JOBBER_STATE_DIR. The service credential cannot authenticate /mcp or the voice API. Browser origins and arbitrary operations are rejected. No Jobber mutation is available. Keep this route on the private Docker network. Only the Williams contact worker receives its service credential; the connector remains the sole owner of OAuth/refresh state.

Optional browser-backed staff tools

Opt-in Williams Desktop tools add offline payment recording and native property map-pin edits. preview_invoice_payment and preview_property_map_pin produce complete immutable proposals. record_invoice_payment and update_property_map_pin require the exact full proposal, a stable UUID operation_id, and confirm_write: true after human approval. A preview expires after 30 minutes, browser reauthentication or service restart. A repeated operation returns its recorded result; a proposal cannot be dispatched under a second ID. get_web_operation reconciles through reads only; jobber_web_status reports browser readiness separately from OAuth/API health.

Offline payment methods are cash, cheque, e-transfer, bank transfer and other. Bank transfer is explicitly recorded as Other with a disclosed details prefix. Amounts are positive decimal strings with two places; this release is restricted to the verified Canadian Williams account and CAD. Review the invoice, amount, date, method, reference, details and resulting balance. No card is charged, receipt sent, refund made, or invoice closed without a payment. The script refuses multiple selected invoices and targets the exact Save button. New payments are verified against returned payment IDs and fresh paginated API history; a matching amount/date alone cannot attribute another operator's payment. A lost response without sufficient evidence remains uncertain and blocks overlapping writes until staff reconciliation; never create a new ID to retry automatically.

Map-pin previews accept coordinates or a Google Maps link. Link resolution uses separate unauthenticated requests with checked/pinned network destinations and bounded approved-host redirects. Ambiguous locations and viewport-only links need explicit coordinates. Review the exact client/property and current/proposed pin. Readback checks the new coordinates within one metre and unchanged postal address. Employee labour writes, arbitrary navigation/JavaScript/HTTP, payment deletion, card charging and bulk operations remain unavailable.

Enable discovery with JOBBER_WEB_ENABLED=true, JOBBER_WEB_URL (private browser service URL), JOBBER_WEB_SERVICE_KEY and JOBBER_WEB_ACCOUNT_ID. Writes also need JOBBER_READ_ONLY=false and individually reviewed web_payments / web_properties values in JOBBER_WRITE_CAPABILITIES. Normal API tools work when the browser is unavailable. Browser operations never enter the voice or contact-sync APIs.

Dockerfile.web builds the separate service. Its environment additionally needs JOBBER_WEB_STATE_DIR, a separate 64-hex JOBBER_WEB_ENCRYPTION_KEY, JOBBER_WEB_VIEWER_ORIGIN (including /jobber-browser), JOBBER_WEB_VIEWER_OWNER, and a distinct JOBBER_WEB_VIEWER_KEY. The private API listens on 3100; only 3101 is routed through SSO. The viewer requires both trusted owner identity and the proxy credential on HTTP and WebSocket requests. CSRF Origin checks protect login controls. Manual mode excludes automation, revokes old proposals and closes viewer connections before resuming. Persistent browser authentication and operation/proposal data are encrypted; Chromium's temporary profile is disposable. MFA/login is completed manually and never resumes a write.

See the inspected website contract for source observations, Linux sandbox requirements and live-acceptance limits. Browser and fixture tests use synthetic records and do not establish a successful live business mutation. Ansible's opt-in just play jobber-web rollout is documented in the Hermes guide; stop for release review before deployment and use separately approved genuine business operations for final live acceptance.

Available Tools

16 tools
authenticateB

Trigger the Jobber OAuth login flow

NameRequiredDescriptionDefault

No parameters

TDQS

B3.3/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It says 'Trigger the Jobber OAuth login flow' but doesn't disclose what happens after triggering—whether it returns a URL, redirects, sets a token, or requires user interaction. For an auth flow, this is a significant gap.

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?

One short sentence that is front-loaded with the action verb and resource. No wasted words.

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?

For a tool with no parameters and no output schema, the description is minimal. However, an auth flow typically has side effects (tokens, sessions, redirects) that are not disclosed. The description doesn't explain what the agent should expect after calling it, which is critical 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?

The tool has zero parameters, so the schema is trivially complete. The description doesn't need to explain parameters, and the baseline for 0 params is 4. It correctly implies no input is needed.

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

Purpose4/5

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

The description states a specific verb ('Trigger') and resource ('Jobber OAuth login flow'), making it clear this tool initiates authentication. It doesn't explicitly distinguish from siblings like auth_status or logout, but the action is distinct enough that an agent can infer the purpose.

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 is the entry point for OAuth login, but it doesn't state when to use it versus auth_status or logout. There's no explicit guidance on prerequisites (e.g., needing a redirect URI or prior setup) or when this should be called before other tools.

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

auth_statusA

Check whether the connector is authenticated with Jobber and when the token expires

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It states that the tool checks authentication and token expiry, implying a read-only status check. However, it does not explicitly disclose side effects, whether it makes network calls, or whether it requires prior authentication. The behavioral traits are partially disclosed but not fully.

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 a single, concise sentence that is front-loaded with the core action and resource. Every word is meaningful and there is no redundancy or fluff. It is optimally sized for a simple status check tool.

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 the tool's simplicity (no parameters, no output schema), the description provides the essential information: it checks auth status and token expiry. However, it does not specify the return format (e.g., boolean, timestamp) or whether the token expiry is a timestamp or relative time. This leaves some ambiguity for an agent deciding how to parse the result.

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

Parameters4/5

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

The tool has zero parameters and the schema is empty (100% coverage). The baseline for zero parameters is 4, and the description adds no parameter-specific details because none exist. It appropriately explains the purpose without needing to document parameters.

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 'Check' and the resource 'connector is authenticated with Jobber', plus the additional detail of token expiration. It is distinct from siblings like 'authenticate' (which performs auth) and 'logout' (which terminates it). The purpose is unambiguous.

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

Usage Guidelines3/5

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

The usage is implied: use this when you need to know authentication status or token expiry. However, there is no explicit guidance on when to use this versus alternatives, nor any exclusions or prerequisites. It does not mention that it is a read-only operation or that it does not trigger authentication.

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

client_historyA
Read-only

Return a Jobber client's jobs, quotes, invoices, and payments. Pass payments_cursor alone (with client_id) to continue fetching payments for an invoice that had more than fit on the original page - that call returns only the payments section, not a fresh jobs/quotes/invoices page.

NameRequiredDescriptionDefault
client_idYesThe Jobber client ID, obtained from a prior find_client call's clients[].id
page_sizeNoMax items per section (1-20)
jobs_cursorNoCursor from a previous response's jobs.next_cursor
quotes_cursorNoCursor from a previous response's quotes.next_cursor
invoices_cursorNoCursor from a previous response's invoices.next_cursor
payments_cursorNoCursor from a previous response's payments.next_cursor - continues payments for the invoice(s) that had more, instead of a fresh jobs/quotes/invoices page
jobs_returned_so_farNoEcho back the previous response's jobs.returned_so_far
quotes_returned_so_farNoEcho back the previous response's quotes.returned_so_far
invoices_returned_so_farNoEcho back the previous response's invoices.returned_so_far
payments_returned_so_farNoEcho back the previous response's payments.returned_so_far

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds valuable behavioral detail about cursor mechanics, specifically that payments_cursor alone continues payments instead of fresh page, and that the response is paginated per section. This goes beyond the annotations and helps the agent anticipate results.

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 filler. The primary purpose is front-loaded, and the second sentence addresses the only non-obvious usage pattern. Every word earns its place; the structure is ideal for an agent to parse quickly.

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 10 parameters and no output schema, the description covers the key nuance (pagination continuation) and names all returned data types. It does not explicitly state that clients must be found via find_client first, but that is implied by the client_id parameter description in the schema. For the complexity level, it is sufficiently complete; an agent can invoke it correctly without missing critical details.

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 all parameters are documented individually. The description adds crucial context to the payments_cursor parameter, explaining its special dual role, and implies the other cursors are for standard paging. This enriches understanding beyond what the schema's per-field notes say, justifying a score above the baseline of 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 the tool returns a client's jobs, quotes, invoices, and payments — a specific verb and resource set that distinguishes it from siblings like jobs_summary or revenue_summary. It uses precise nouns and lists the four data sections, leaving no ambiguity about what the tool does.

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

Usage Guidelines4/5

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

The description provides explicit pagination usage, notably the special case for payments_cursor that returns only the payments section. It does not explicitly mention when to prefer alternative tools (e.g., jobs_summary for aggregate data), but the focus on a client's history implies its niche. The cursor guidance is actionable and clear enough for an agent to know when to invoke this pattern.

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

find_clientB
Read-only

Search Jobber clients by name, email, or phone. Returns contact info and addresses.

NameRequiredDescriptionDefault
cursorNoCursor from a previous response's next_cursor, to fetch the next page
page_sizeNoMax results to return (1-20)
search_termYesName, email, or phone number to search for
returned_so_farNoItems already returned by prior pages of this same query - echo back the previous response's returned_so_far; omit on the first call.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds context about what is returned ('contact info and addresses'), but it does not disclose behavioral details such as matching behavior, pagination semantics beyond schema hints, or any open-world implications. This is acceptable but not rich.

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

Conciseness5/5

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

The description is a single, efficient sentence with no filler. It front-loads the core action and searchable fields, and every word contributes to understanding the tool's purpose. It is appropriately sized for a simple search operation.

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 straightforward search tool with four well-documented parameters and read-only/open-world annotations, the description covers the essential behavioral outcome ('Returns contact info and addresses'). It lacks detail on the exact return structure, but there is no output schema and the simple nature of the tool makes this a minor gap. The pagination parameters are already adequately described in the schema.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds meaning to search_term by naming the accepted search fields, but it does not expand on cursor, page_size, or returned_so_far, which the schema already documents well. No additional parameter context is needed beyond the schema.

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

Purpose4/5

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

The description names a specific action ('Search Jobber clients') and the searchable fields ('by name, email, or phone'), which clearly identifies the tool's purpose. It does not explicitly distinguish itself from sibling tools like search_records or get_record, but it is clear enough to avoid significant ambiguity.

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

Usage Guidelines2/5

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

The description implies this is for looking up clients, but it does not state when to choose this over alternatives such as search_records, get_record, or catalog_search. There are no explicit exclusions or routing guidance, leaving the agent to infer the appropriate context.

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

get_audit_logA
Read-only

Read this server's own local audit log (every tool call, success or error). Useful for reviewing what this connector has done. Entries are already redacted (see the audit log docs) before being read.

NameRequiredDescriptionDefault
limitNoMax entries to return (default 500, max 1000)
offsetNoEntries to skip, for pagination - echo back next_offset
date_toNoOnly entries on/before this date (YYYY-MM-DD)
date_fromNoOnly entries on/after this date (YYYY-MM-DD)

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 and openWorldHint=true, so the agent knows it is a safe read operation. The description adds valuable context: entries are already redacted before being read, which is a behavioral trait not visible in the schema or annotations. It also states the log covers every tool call, success or error, which sets expectations about content. This goes beyond the annotations 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.

Conciseness5/5

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

Three sentences, each earning its place: the first states the resource and scope, the second gives the use case, and the third discloses redaction behavior. It is front-loaded with the core purpose and contains zero filler.

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 read-only list tool with 100% schema coverage and no output schema, the description covers the essential context: what the log contains, why you'd use it, and a key behavioral caveat (redaction). It doesn't describe the return format, but since there is no output schema and the tool is a simple list, the description is nearly complete. The only minor gap is not mentioning pagination behavior beyond the offset parameter, which the schema already documents.

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 four parameters (limit, offset, date_to, date_from) with descriptions. The tool description adds no additional parameter-level meaning beyond what the schema provides. Baseline 3 is appropriate because the schema does the heavy lifting.

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 ('Read'), a specific resource ('this server's own local audit log'), and the scope ('every tool call, success or error'). It also distinguishes itself from the sibling tools by clarifying it is about the connector's own activity, not client data. This is clear and unambiguous.

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

Usage Guidelines4/5

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

The description says it is 'useful for reviewing what this connector has done,' which gives clear context for when to use it. It doesn't explicitly name alternatives or exclusions, but the sibling list shows many data-oriented tools, and the description's emphasis on 'this server's own local audit log' implies it is not for querying business data. A clear context is provided, though no explicit 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.

get_recordA
Read-only

Get one Jobber client, property, request, quote, job, invoice, or visit with the workflow fields needed to prepare a safe change.

NameRequiredDescriptionDefault
record_idYes
record_typeYes

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and openWorldHint, so the description does not need to restate read-only behavior. It does add useful context that the result contains workflow fields, but it does not disclose auth needs, error behavior, or what happens for a missing or invalid record_id.

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 a single, front-loaded sentence with no filler. It states the verb, resource, supported types, and purpose without losing conciseness.

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 two-parameter read tool with readOnly and openWorld annotations, the description is mostly complete: it names the entity types, the singular fetch semantics, and the nature of the returned fields. It does not enumerate workflow fields or error cases, but no output schema exists and the description is sufficient for selecting and invoking the tool.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate. It restates the record_type enum and says 'one' record, but it never explains record_id semantics, the relationship between record_type and record_id, or the expected format. The schema's property names and enum values are doing nearly all the work.

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 precise fetch operation: get one Jobber entity across seven enumerated types, and it explains that the result includes workflow fields for preparing a safe change. This clearly distinguishes it from sibling list/search tools like search_records and find_client.

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 the usage context – fetching a single record before making a change – but it does not explicitly state when to prefer this over find_client, search_records, or get_audit_log, nor does it name any exclusions. The context is clear, but alternatives are not discussed.

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

jobs_summaryA
Read-only

Return Jobber jobs grouped by status, filtered by job creation date (not scheduling or completion date), with counts and totals per status.

NameRequiredDescriptionDefault
cursorNoCursor from a previous response's next_cursor, to fetch the next page
date_toYesEnd of the date range (ISO 8601)
date_fromYesStart of the date range (ISO 8601)
page_sizeNoMax jobs to scan (1-20)
returned_so_farNoItems already returned by prior pages of this same query - echo back the previous response's returned_so_far; omit on the first call.

TDQS

A4.2/5.0
Behavior3/5

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

With readOnlyHint and openWorldHint annotations already covering safety and pagination exposure, the description adds useful grouping and date-filter behavior. However, it does not disclose that counts and totals are computed only over jobs scanned in the current page (page_size 'Max jobs to scan'), which could mislead an agent about whether totals are global.

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

Conciseness5/5

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

A single front-loaded sentence communicates the resource, grouping, filter semantics, and output shape with no filler. Every clause earns its place.

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

Completeness4/5

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

The description captures the core purpose, the critical date-field clarification, and the output shape (counts and totals per status). It omits pagination mechanics, but the schema's parameter descriptions fill most of that gap; the lack of an output schema is partially mitigated by the stated counts/totals.

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

Parameters4/5

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

Schema coverage is 100% with detailed parameter descriptions for cursor, page_size, and returned_so_far. The description adds value beyond the schema by specifying that date_from/date_to refer to job creation date, not scheduling or completion date, which is absent from the parameter docs.

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 ('Return') and resource ('Jobber jobs'), then defines the aggregation ('grouped by status') and output ('counts and totals per status'). This clearly differentiates it from report siblings like revenue_summary or schedule_lookup.

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 explicitly clarifies that filtering is by job creation date, not scheduling or completion date, which tells the agent when the date parameters are applicable. However, it does not mention alternative tools or provide when-not-to-use conditions, so it stops short of a 5.

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

logoutA

Log out of Jobber. Attempts to revoke the access token at Jobber via the appDisconnect mutation (best-effort - local tokens are always cleared even if remote revocation fails).

NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior5/5

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

No annotations are provided, so the description carries the full burden of behavior disclosure. It does this well: it says the action is 'best-effort,' explicitly clarifies that local tokens are always cleared even if remote revocation fails, and names the underlying mutation. This is strong behavioral transparency, especially for a mutating/session-changing 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?

One sentence, front-loaded with the primary purpose and then the nuance about best-effort revocation. It earns its place, though the parenthetical could have been a separate sentence for readability. It is still concise and well structured.

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 zero-parameter tool with no output schema, the description covers the key aspects: what it does and what happens on failure. It could mention what the response looks like, but since there is no output schema, adding the response format would be helpful. The core behavior is fully covered though.

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 tool has zero parameters, so there are no parameter semantics to add beyond the schema. The description appropriately notes what is cleared and the mutation used, but with no parameters there's nothing more to explain. Baseline is a 3 here since schema coverage is 100% and no parameters exist.

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: 'Log out of Jobber,' with an explicit mechanism (the appDisconnect mutation). The title 'logout' is expanded into a full statement of what happens, so an agent knows the tool's function, and it is clearly distinct from siblings like authenticate and auth_status.

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 a clear context: use this when ending an authenticated session. It doesn't explicitly state when not to use it or name alternatives (e.g., 'if you need to check authentication state, use auth_status'), but for a logout tool the usage context is fairly evident. The description could have been clearer about whether it is the only way to deauthenticate or if there is another related flow.

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

overdue_invoicesA
Read-only

Return unpaid Jobber invoices past their due date, oldest first, with the total owed on this page at the top (use total_count/next_cursor to page through the rest).

NameRequiredDescriptionDefault
cursorNoCursor from a previous response's next_cursor, to fetch the next page
page_sizeNoMax invoices to return (1-20)
returned_so_farNoItems already returned by prior pages of this same query - echo back the previous response's returned_so_far; omit on the first call.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, which the description does not contradict. The description adds meaningful behavioral context: it returns oldest first, includes the total owed for the page at the top, and instructs to use total_count/next_cursor for pagination. These details go beyond the annotations and help the agent understand the output structure and pagination workflow.

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 a single, efficient sentence. It front-loads the core purpose (return overdue invoices oldest first) and then adds the pagination and summary details, with no wasted words. Every phrase contributes essential information.

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 paginated list tool without an output schema, the description covers the key aspects: what it returns (unpaid overdue invoices), ordering (oldest first), the summary total, and how to paginate via total_count/next_cursor. It does not specify invoice fields, but given the absence of an output schema, this is an acceptable level of completeness for an agent to successfully call the 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?

The input schema provides full descriptions for all three parameters (cursor, page_size, returned_so_far), so the baseline is 3. The description adds minimal extra meaning—mostly referencing pagination variables (total_count/next_cursor) but not directly enriching parameter understanding. It gives slight context on how the parameters interact with pagination, but not enough to raise the score above baseline.

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 explicitly states the action 'Return' and the specific resource 'unpaid Jobber invoices past their due date', with clear ordering ('oldest first') and a summarized total. This clearly distinguishes it from sibling tools like quotes_outstanding (quotes) and jobs_summary (jobs), so an agent can identify it without opening the schema.

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

Usage Guidelines3/5

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

The description implies usage when overdue invoices are needed, but it does not explicitly mention when to use it over alternatives or when not to use it. There is no comparison to sibling tools or exclusions. The clear purpose helps, but explicit guidance is missing.

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

quotes_outstandingA
Read-only

Return Jobber quotes awaiting client response, with quote age and amounts. Excludes quotes the client has already approved but that have not yet been converted to a job.

NameRequiredDescriptionDefault
cursorNoCursor from a previous response's next_cursor, to fetch the next page
page_sizeNoMax quotes to return (1-20)
returned_so_farNoItems already returned by prior pages of this same query - echo back the previous response's returned_so_far; omit on the first call.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds inclusion/exclusion context (quote age, amounts, approved-not-converted exclusion), but does not disclose pagination behavior or response format, which would be useful. 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?

Two sentences with no wasted words. The core action and inclusion criteria are front-loaded, with the exclusion as a clarifying second sentence.

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 paginated read tool with no output schema, the description explains what will be returned (quotes with age and amounts) and its scope. It does not explicitly mention pagination, but the schema's cursor and returned_so_far descriptions cover that. The lack of an output schema is partly mitigated by the high-level return description.

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 all three parameters (cursor, page_size, returned_so_far) are documented in the input schema. The description does not add any parameter-specific meaning beyond what the schema provides, hence 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 states a specific verb ('Return') and resource ('Jobber quotes awaiting client response'), and specifies the included data (quote age and amounts) and an exclusion (approved-but-not-converted). This clearly distinguishes it from siblings like overdue_invoices or requests_inbox.

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 alternative routing is provided. The description implies usage for retrieving outstanding quotes, but does not mention when to prefer this over related tools like requests_inbox or get_record. The exclusion clause provides definitional clarity, not usage guidance.

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

requests_inboxB
Read-only

Return new and unscheduled Jobber requests.

NameRequiredDescriptionDefault
cursorNoCursor from a previous response's new_requests.next_cursor
page_sizeNoMax requests per section (1-20)
returned_so_farNoEcho back the previous response's new_requests.returned_so_far
unscheduled_cursorNoCursor from a previous response's unscheduled_requests.next_cursor
unscheduled_returned_so_farNoEcho back the previous response's unscheduled_requests.returned_so_far

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the description does not need to disclose those. It adds the 'new' and 'unscheduled' scoping, which gives some behavioral framing. However, it does not mention that the tool returns two separate lists (new_requests and unscheduled_requests) or that pagination requires cursors, both of which are implied by the schema parameters. This goes slightly beyond annotations and adds a high-level scope, but leaves an agent inferring the dual-section output.

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 a single clear sentence with no filler. It front-loads the verb and key qualifiers ('new and unscheduled') and is quotable in a tool list. It says exactly what the tool does without wasting tokens.

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?

This tool has 5 parameters, a two-section output (evident from the schema), and no output schema. The description does not tell the agent about the pagination fields, that two sections are returned, or how to interpret next_cursor. It only says 'return new and unscheduled' which is too terse for a legitimate agented invoker to correctly handle pagination without reading the schema and guessing. For paginated tools, the absence of return-shape or pagination notes is a substantial 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 description coverage is 100%, so all five parameters already have precise semantics (cursor paths, 'echo back' requirements, page_size limits). The description adds no information about parameters; it merely names the resource categories. At 100% coverage the baseline is 3, and the description neither raises nor lowers 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 uses a specific verb ('Return') and scope ('new and unscheduled Jobber requests'), which clearly suggests a read-only request inbox. It doesn't explicitly differentiate from sibling tools like 'search_records' or 'schedule_lookup', but the resource and 'unscheduled' qualifier make the purpose evident enough 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 Guidelines2/5

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

No guidance is given about when to use this tool vs. alternatives. The description is purely a statement of functionality with no context on filtering, period, or comparisons to siblings such as 'jobs_summary' or 'schedule_lookup'. An agent cannot tell if this is the right high-level entry point or if another tool would be more appropriate for e.g. all jobs or revenue queries.

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

revenue_summaryB
Read-only

Return paid Jobber invoices grouped by month and by quarter, with totals.

NameRequiredDescriptionDefault
cursorNoCursor from a previous response's next_cursor, to fetch the next page
date_toYesEnd of the date range (ISO 8601)
date_fromYesStart of the date range (ISO 8601)
page_sizeNoMax invoices to scan (1-20)
returned_so_farNoItems already returned by prior pages of this same query - echo back the previous response's returned_so_far; omit on the first call.

TDQS

B3.3/5.0
Behavior4/5

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

The annotations indicate readOnlyHint=true and openWorldHint=true, which already signal that this tool is non-destructive and may return partial results. The description adds behavioral clarity by specifying that only paid invoices are included and that results are grouped, which is useful context. However, it doesn't mention pagination behavior (via cursor, page_size, returned_so_far) that the schema implies.

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 concise sentence that captures the core functionality without excess. It could be improved by front-loading the key filter ('paid') but it is already clear 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?

Given the tool's complexity (5 parameters, pagination, grouping), the description is insufficient. It doesn't explain the pagination mechanism (how cursor and returned_so_far work together), the meaning of 'totals' (are they per group or overall?), or the output format (no output schema). The annotations provide some safety context, but the description leaves gaps that could lead to incorrect 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 has 100% parameter coverage, so each parameter is already described in the schema (e.g., date_from/date_to as ISO 8601, cursor for pagination). The description doesn't add any new meaning to the parameters; it only mentions the date range implicitly via the tool's purpose. Thus, the baseline of 3 is appropriate.

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 verb ('Return') and the resource ('paid Jobber invoices'), and specifies the grouping ('by month and by quarter') and that totals are included. However, it doesn't explicitly distinguish it from sibling tools like 'jobs_summary' or 'overdue_invoices', but the grouping detail helps differentiate it from a plain invoice list.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like 'jobs_summary' or 'overdue_invoices'. It only states what it returns, not the context in which it is appropriate. For example, it doesn't mention that it only covers paid invoices, which is a key differentiator from a general revenue report.

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

schedule_lookupB
Read-only

Return Jobber visits and assessments for a date range, grouped by day. Days are grouped by the server's local calendar day unless a timezone is supplied.

NameRequiredDescriptionDefault
cursorNoCursor from a previous response's next_cursor, to fetch the next page
date_toYesEnd of the date range (ISO 8601, include a UTC offset for precise range boundaries)
timezoneNoIANA timezone (e.g. 'America/Toronto') to group days by; defaults to the server's local timezone
date_fromYesStart of the date range (ISO 8601, include a UTC offset for precise range boundaries)
page_sizeNoMax scheduled items to scan (1-20)
returned_so_farNoItems already returned by prior pages of this same query - echo back the previous response's returned_so_far; omit on the first call.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the read-only nature is covered. The description adds one useful behavioral detail: that days are grouped by the server's local calendar day unless a timezone is supplied. However, it omits pagination behavior (hinted by cursor and returned_so_far params) and the exact output shape. With annotations present, a score of 3 is appropriate because it adds some value but not rich behavioral context.

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 a single sentence that front-loads the action and resource, then specifies the grouping behavior. There is zero waste; every clause carries meaning. It is concise and structured effectively.

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?

There is no output schema, so the description must carry the burden of explaining the return format. It states results are 'grouped by day' but does not detail whether the response contains a list of day objects, each with items, or a flat list with day labels. It also omits any mention of pagination (even though params like cursor, page_size, and returned_so_far imply it) and does not describe what 'visits and assessments' entails. For a tool with 6 parameters and no output schema, these gaps are significant.

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 every parameter is already explained in the input schema. The tool description emphasizes timezone grouping, but that detail is also present in the schema's timezone parameter description ('to group days by; defaults to the server's local timezone'). The description adds marginal value beyond the schema, so baseline 3 is warranted.

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 specific verb ('Return'), the exact resource ('Jobber visits and assessments'), and a defining constraint (date range, grouped by day). This distinguishes it from sibling tools like jobs_summary (summary statistics) or search_records (general search) without needing to open 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 Guidelines2/5

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

No explicit guidance on when to use this tool versus alternatives. While the description implies use for date-range schedule queries, it never mentions when not to use it or points to other tools for different needs (e.g., summaries, single records). An agent must infer usage from the resource type, which is insufficient given the number of sibling tools.

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

search_recordsC
Read-only

Search a bounded Jobber record type using fixed reviewed queries. Use get_record before any write.

NameRequiredDescriptionDefault
cursorNoCursor from a previous response's next_cursor, to fetch the next page
page_sizeNo
record_typeYes
search_termNo
returned_so_farNoItems already returned by prior pages of this same query - echo back the previous response's returned_so_far; omit on the first call.

TDQS

C2.3/5.0
Behavior2/5

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

Annotations already carry readOnlyHint and openWorldHint, so the safety profile is covered. The description only adds the vague phrase 'fixed reviewed queries' and 'bounded', which neither clarifies the actual constraints nor discloses pagination or result set behavior beyond what the annotations suggest that results are not complete.

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. However, the second sentence about 'Use get_record before any write' is not about search_records and adds little value, making its inclusion a slight waste.

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?

This is a 5-parameter tool with pagination, enums, and no output schema. The description fails to explain the pagination contract (cursor, returned_so_far) or the nature of 'fixed reviewed queries' vs. arbitrary search, so an agent would struggle to correctly construct a first call or continue pagination.

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

Parameters1/5

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

With schema description coverage at only 40%, the description carries a heavy burden to explain 5 parameters, but it provides almost no parameter-level meaning. It never explains search_term, cursor, page_size, returned_so_far, or record_type semantics, leaving the agent to guess how to construct a query.

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

Purpose3/5

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

The description states a search over a 'bounded' Jobber record type, which is more specific than a bare name. However, 'fixed reviewed queries' is ambiguous and the description does not clearly distinguish this from sibling tools like find_client or catalog_search; it leaves an agent guessing about what is it about the 'fixed' queries.

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

Usage Guidelines2/5

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

The description says 'Use get_record before any write', but this is a workflow note unrelated to using search_records itself. It does not state when to choose this tool over find_client, catalog_search, or other sibling search tools, nor does it mention exclusions or alternatives.

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

team_listA
Read-only

List Jobber team members available for assignment.

NameRequiredDescriptionDefault
cursorNoCursor from a previous response's next_cursor, to fetch the next page
page_sizeNo

TDQS

A3.7/5.0
Behavior3/5

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

The annotations already provide readOnlyHint and openWorldHint, so the description only needs to add context beyond that. It adds the 'available for assignment' constraint, which clarifies returned records. It omits return format and pagination behavior, which is acceptable given 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?

The description is a single, front-loaded sentence with no filler or redundant clauses. Every part contributes purpose: the verb, resource, and the scope qualifier are all essential. 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?

For a read-only, list, paginated data-tool with optional parameters, the description, annotations, and schema together provide enough context. It omits output format, but given the simple nature and existing annotations, this is not a major gap. A description might benefit from mentioning pagination explicitly, but it isn't critical.

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

Parameters2/5

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

The description adds no meaning for cursor or page_size. The schema covers cursor but leaves page_size without any description. Since schema coverage is only 50%, the description should compensate for the missing parameter semantics, but it does not.

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 and resource: 'List Jobber team members available for assignment.' It clearly distinguishes itself from sibling tools, none of which mention team members. The qualification 'available for assignment' adds useful scope, leaving no ambiguity about what the tool returns.

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 to use this tool (to get assignable team members) but does not explicitly state when not to use it or name alternatives. The sibling list does not contain an obvious competing tool, so misuse risk is low, but there is no explicit routing.

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

Tool Schema Changelog

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

  1. 16 tool updatesv2.0.0
    • First observedauth_status
    • First observedauthenticate
    • First observedcatalog_search
    • First observedclient_history
    • First observedfind_client
    • First observedget_audit_log
    • First observedget_record
    • First observedjobs_summary
    • First observedlogout
    • First observedoverdue_invoices
    • First observedquotes_outstanding
    • First observedrequests_inbox
    • First observedrevenue_summary
    • First observedschedule_lookup
    • First observedsearch_records
    • First observedteam_list

TDQS

B3.2/5.0

Scored across 16 tools

Disambiguation4/5

Tools are mostly distinct by domain: auth, clients, invoices, quotes, jobs, schedule, requests, catalog, and team. There is mild overlap potential among find_client, search_records, and get_record, but their descriptions generally separate search-by-contact, bounded record search, and single-record fetch.

Naming Consistency3/5

Names are readable and consistently snake_case, but the naming convention is mixed: some tools use verb-led names like find_client and get_record, while others use noun-phrase names like jobs_summary and revenue_summary. There is no consistent verb_noun pattern across the set.

Tool Count4/5

16 tools is slightly above the ideal compact range, but the server covers a broad Jobber domain and each tool serves a distinct reporting, lookup, or auth purpose. The count feels reasonable rather than bloated.

Completeness2/5

The tool surface is almost entirely read-only: searches, summaries, history, and lookups. There are no create, update, delete, or workflow tools such as creating a quote, scheduling a visit, or recording a payment, so many common Jobber management tasks would dead-end.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables controlled AI-agent access to enterprise-shaped tools with a deny-by-default gated write path, human approval, dry-run execution, and append-only audit logging.
    1
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants like Claude, ChatGPT, and Copilot to query live Jobber data—clients, jobs, quotes, invoices, revenue, and schedule—using natural language, with read-only access and careful API budget management.
    1
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables read-only Meta Ads reporting and diagnostics, plus safe, preview-before-apply mutations such as campaign creation, duplication, targeting replacement, and attribution changes.
    -