jobber-mcp
Default read-only Jobber connector for approved reads/reports; optional write capabilities require explicit enablement and approval.
Authenticate, check auth status, and log out.
Search and fetch Jobber clients, properties, requests, quotes, jobs, invoices, visits, catalog items, and team members.
Run reports: client history, overdue invoices, outstanding quotes, job/revenue summaries, schedule lookup, requests inbox.
Read the server's local redacted audit log.
When writes are explicitly enabled: create/update notes, records, draft invoices, visits, mark sent, close/reopen jobs, update job line-item descriptions; all require confirm_write and are audited/no-retry.
No raw GraphQL, payment, refund, delete, archive, bulk mutation, webhook, expense, or timesheet tools are exposed.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@jobber-mcpshow me overdue invoices"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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=trueis the default and registers no write tools.Writes require both
JOBBER_READ_ONLY=falseand a deliberateJOBBER_WRITE_CAPABILITIESallowlist:records,scheduling, and/orcommunications.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 testSet 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-secretsThis 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 toolsauthenticateB
Trigger the Jobber OAuth login flow
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It 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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It 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.
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.
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.
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.
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.
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.
catalog_searchARead-only
List a bounded page of Jobber products and services for selecting approved line items.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | Cursor from a previous response's next_cursor, to fetch the next page | |
| page_size | No | ||
| returned_so_far | No | Items already returned by prior pages of this same query - echo back the previous response's returned_so_far; omit on the first call. |
TDQS
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 this is a safe, read-only operation with an open world (results may change). The description adds the 'bounded page' behavior and the 'selecting approved line items' purpose, which are useful. However, it does not disclose details like whether the catalog is filtered by default, how 'approved' is determined, or what happens when the cursor is invalid. With annotations covering the safety profile, a 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the core action ('List a bounded page') and includes the purpose ('for selecting approved line items'). Every word earns its place; no filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only paginated list tool with no output schema, the description is adequate but not complete. It tells the agent the tool lists a bounded page of catalog items, but it does not describe the return shape (beyond the schema's next_cursor and returned_so_far hints), nor does it explain how 'approved' is determined or how to handle empty results. Given the openWorldHint and readOnlyHint annotations, the safety profile is covered, but the operational details are thin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%: cursor and returned_so_far have descriptions, while page_size has only a default and min/max. The description adds the concept of a 'bounded page' and 'selecting approved line items', which gives some context for why pagination exists. However, it does not explain the relationship between returned_so_far and cursor beyond what the schema already says, nor does it clarify the meaning of 'approved' in relation to parameters. Baseline 3 is fair since the schema covers most parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List'), a resource ('Jobber products and services'), and a scope ('bounded page', 'for selecting approved line items'). It is clear about what the tool does, though it does not explicitly differentiate from sibling tools like search_records or get_record. The phrase 'for selecting approved line items' adds useful context about its intended use.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context: it is for browsing a bounded page of catalog items, likely for selection workflows. However, it does not explicitly state when to use this tool versus alternatives like search_records or get_record, nor does it mention any exclusions or prerequisites. The pagination parameters imply iterative usage, but the description itself does not guide the agent on when to choose this tool over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
client_historyARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | Yes | The Jobber client ID, obtained from a prior find_client call's clients[].id | |
| page_size | No | Max items per section (1-20) | |
| jobs_cursor | No | Cursor from a previous response's jobs.next_cursor | |
| quotes_cursor | No | Cursor from a previous response's quotes.next_cursor | |
| invoices_cursor | No | Cursor from a previous response's invoices.next_cursor | |
| payments_cursor | No | Cursor 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_far | No | Echo back the previous response's jobs.returned_so_far | |
| quotes_returned_so_far | No | Echo back the previous response's quotes.returned_so_far | |
| invoices_returned_so_far | No | Echo back the previous response's invoices.returned_so_far | |
| payments_returned_so_far | No | Echo back the previous response's payments.returned_so_far |
TDQS
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.
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.
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.
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.
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.
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_clientBRead-only
Search Jobber clients by name, email, or phone. Returns contact info and addresses.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | Cursor from a previous response's next_cursor, to fetch the next page | |
| page_size | No | Max results to return (1-20) | |
| search_term | Yes | Name, email, or phone number to search for | |
| returned_so_far | No | Items already returned by prior pages of this same query - echo back the previous response's returned_so_far; omit on the first call. |
TDQS
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.
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.
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.
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.
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.
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_logARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max entries to return (default 500, max 1000) | |
| offset | No | Entries to skip, for pagination - echo back next_offset | |
| date_to | No | Only entries on/before this date (YYYY-MM-DD) | |
| date_from | No | Only entries on/after this date (YYYY-MM-DD) |
TDQS
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.
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.
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.
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.
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.
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_recordARead-only
Get one Jobber client, property, request, quote, job, invoice, or visit with the workflow fields needed to prepare a safe change.
| Name | Required | Description | Default |
|---|---|---|---|
| record_id | Yes | ||
| record_type | Yes |
TDQS
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.
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.
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.
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.
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.
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_summaryARead-only
Return Jobber jobs grouped by status, filtered by job creation date (not scheduling or completion date), with counts and totals per status.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | Cursor from a previous response's next_cursor, to fetch the next page | |
| date_to | Yes | End of the date range (ISO 8601) | |
| date_from | Yes | Start of the date range (ISO 8601) | |
| page_size | No | Max jobs to scan (1-20) | |
| returned_so_far | No | Items already returned by prior pages of this same query - echo back the previous response's returned_so_far; omit on the first call. |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden 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.
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.
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.
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.
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.
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_invoicesARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | Cursor from a previous response's next_cursor, to fetch the next page | |
| page_size | No | Max invoices to return (1-20) | |
| returned_so_far | No | Items already returned by prior pages of this same query - echo back the previous response's returned_so_far; omit on the first call. |
TDQS
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.
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.
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.
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.
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.
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_outstandingARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | Cursor from a previous response's next_cursor, to fetch the next page | |
| page_size | No | Max quotes to return (1-20) | |
| returned_so_far | No | Items already returned by prior pages of this same query - echo back the previous response's returned_so_far; omit on the first call. |
TDQS
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.
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.
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.
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.
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.
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_inboxBRead-only
Return new and unscheduled Jobber requests.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | Cursor from a previous response's new_requests.next_cursor | |
| page_size | No | Max requests per section (1-20) | |
| returned_so_far | No | Echo back the previous response's new_requests.returned_so_far | |
| unscheduled_cursor | No | Cursor from a previous response's unscheduled_requests.next_cursor | |
| unscheduled_returned_so_far | No | Echo back the previous response's unscheduled_requests.returned_so_far |
TDQS
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.
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.
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.
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.
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.
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_summaryBRead-only
Return paid Jobber invoices grouped by month and by quarter, with totals.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | Cursor from a previous response's next_cursor, to fetch the next page | |
| date_to | Yes | End of the date range (ISO 8601) | |
| date_from | Yes | Start of the date range (ISO 8601) | |
| page_size | No | Max invoices to scan (1-20) | |
| returned_so_far | No | Items already returned by prior pages of this same query - echo back the previous response's returned_so_far; omit on the first call. |
TDQS
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.
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.
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.
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.
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.
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_lookupBRead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | Cursor from a previous response's next_cursor, to fetch the next page | |
| date_to | Yes | End of the date range (ISO 8601, include a UTC offset for precise range boundaries) | |
| timezone | No | IANA timezone (e.g. 'America/Toronto') to group days by; defaults to the server's local timezone | |
| date_from | Yes | Start of the date range (ISO 8601, include a UTC offset for precise range boundaries) | |
| page_size | No | Max scheduled items to scan (1-20) | |
| returned_so_far | No | Items already returned by prior pages of this same query - echo back the previous response's returned_so_far; omit on the first call. |
TDQS
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.
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.
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.
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.
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.
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_recordsCRead-only
Search a bounded Jobber record type using fixed reviewed queries. Use get_record before any write.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | Cursor from a previous response's next_cursor, to fetch the next page | |
| page_size | No | ||
| record_type | Yes | ||
| search_term | No | ||
| returned_so_far | No | Items already returned by prior pages of this same query - echo back the previous response's returned_so_far; omit on the first call. |
TDQS
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.
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.
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.
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.
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.
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_listARead-only
List Jobber team members available for assignment.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | Cursor from a previous response's next_cursor, to fetch the next page | |
| page_size | No |
TDQS
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.
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.
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.
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.
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.
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.
16 tool updates
v2.0.0- First observed
auth_status - First observed
authenticate - First observed
catalog_search - First observed
client_history - First observed
find_client - First observed
get_audit_log - First observed
get_record - First observed
jobs_summary - First observed
logout - First observed
overdue_invoices - First observed
quotes_outstanding - First observed
requests_inbox - First observed
revenue_summary - First observed
schedule_lookup - First observed
search_records - First observed
team_list
TDQS
Scored across 16 tools
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.
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.
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.
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
Related MCP Connectors
View client requests, prepare actions and approve work within your firm's permissions.
Tenant-scoped credentials, training and business records with owner-controlled write approvals.
Supervised API-write gateway for AI agents with policy, human approval and execution receipts.
Authenticated FieldRobin workspace tools, including scope-authorized customer and job creation.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables 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-
- AlicenseNot gradedqualityBmaintenanceEnables ChatGPT to inspect Jobber data and manage controlled automations with scheduling, approval workflows, and audit trails.1MIT
- AlicenseNot gradedqualityCmaintenanceEnables 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.1MIT
- FlicenseNot gradedqualityCmaintenanceEnables read-only Meta Ads reporting and diagnostics, plus safe, preview-before-apply mutations such as campaign creation, duplication, targeting replacement, and attribution changes.-