jobber-mcp
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-mcpwhich invoices are overdue right now?"
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.
jobber-mcp
A read-only MCP server connecting AI assistants (Claude, ChatGPT, Gemini, Copilot) to Jobber - field/home-services business software - via Jobber's official GraphQL API. Ask your assistant things like "which invoices are overdue?" or "what's on the schedule this week?" and get answers from your real account.
Not affiliated with Jobber. This is an independent, community-built integration. "Jobber" is a trademark of Jobber Software Corp. Use of the name here is nominative - it describes what the tool connects to.
Tools (read-only v1)
Tool | What it does |
| Connect your Jobber account — one time, in-chat, via browser OAuth |
| Find jobs (work orders) by client, status, date range; paginated |
| Overdue/balanced-owing invoices, days overdue, total AR outstanding |
| Client profile + outstanding balance + recent jobs and invoices |
| Upcoming visits in a date range (default today → +7 days) |
| Quote pipeline grouped by status |
| Compose a payment reminder / follow-up draft enriched with live invoice facts - never sends |
Related MCP server: Jobber MCP Server
Why this one
Several Jobber MCP servers exist; most are weekend prototypes that break in week two. This one is built for the failures that actually kill Jobber integrations:
Silent token refresh - access tokens expire; renewal just works when a refresh token and app credentials are configured
Throttle-aware retries - Jobber's GraphQL API uses a query-cost budget (10,000 points, +500/sec); bursts wait and retry instead of erroring
API-version pinning + drift fallback - sends the required
X-JOBBER-GRAPHQL-VERSIONheader, and if a schema change rejects our filters, queries degrade gracefully instead of failingVerified against the live schema (
2026-05-12) -EncodedIdidentifiers, enum statuses,amountsmoney shape, scalar sort inputsCorrect details - money in your account's own currency (₹/€/£/…, not a hardcoded
$), visit times in your local timezoneTests - an offline end-to-end suite (mock Jobber API + in-memory MCP client) and a live read-only smoke script
Trust posture - strictly read-only, least-privilege scopes, your tokens never leave your machine, drafts never send
Requirements
For the Claude Desktop extension: nothing but Claude Desktop and a Jobber account
For other MCP clients: Node.js 18.17+
A free developer app from https://developer.getjobber.com (created during setup, ~5 minutes)
Install
Claude Desktop — no coding (easiest)
Download
jobber-mcp.mcpbfrom this repo's releases.In Claude Desktop: Settings → Extensions → Install extension → select the file.
In a chat, say "authenticate with Jobber" and follow the one-time setup: create a free app at https://developer.getjobber.com with read-only scopes (Clients, Jobs, Quotes, Scheduled Items, Invoices — leave the Callback URL blank), then paste the app's Client ID and Secret when asked.
Your browser opens; log into Jobber and approve. Done — try "Which invoices are overdue?"
No Node.js, no terminal, no config files. Tokens are stored locally at ~/.jobber-mcp/tokens.json and refreshed automatically.
Building the extension yourself:
npm run build:extensionproducesdist/jobber-mcp.mcpbfrom source.
Any other MCP client (developers)
Works with anything that speaks MCP over stdio (Cursor, VS Code Copilot, Claude Code, …).
Create a Jobber developer app at https://developer.getjobber.com (free). Note your
CLIENT ID/CLIENT SECRET. Enable read-only scopes for Clients, Jobs, Quotes, Scheduled Items, and Invoices. Leave the Callback URL blank - Jobber allowslocalhostredirects automatically on any port.Install & configure (or skip this entirely and just call the
authenticatetool from your assistant):git clone https://github.com/buildminimal/jobber-mcp.git cd jobber-mcp npm install cp .env.example .env # fill in JOBBER_CLIENT_ID / JOBBER_CLIENT_SECRET npm run auth # opens browser → prints tokens → paste into .envConnect your AI client. Claude Desktop (
claude_desktop_config.json):{ "mcpServers": { "jobber": { "command": "node", "args": ["/absolute/path/to/jobber-mcp/dist/src/index.js"], "env": { "JOBBER_ACCESS_TOKEN": "<from npm run auth>", "JOBBER_REFRESH_TOKEN": "<optional, enables silent renewal>", "JOBBER_CLIENT_ID": "<optional, needed for renewal>", "JOBBER_CLIENT_SECRET": "<optional, needed for renewal>" } } } }Other MCP clients: run
node dist/src/index.jsover stdio with the same env vars.
Then try: "Which invoices are overdue? Draft a polite reminder for each."
Optional: set JOBBER_TIMEZONE (IANA name, e.g. Asia/Kolkata) so visit
times display in your local timezone.
Schema verification & maintenance
The queries are verified against the live schema as of API version
2026-05-12 (the version Jobber's response extensions.versioning reports).
Two things matter when something breaks after an API bump:
The API requires an
X-JOBBER-GRAPHQL-VERSIONheader (default set viaJOBBER_API_VERSIONin.envif Jobber ships a newer version).All GraphQL documents live in
src/jobber/queries.ts- re-runnpm run introspect(dumps root queries + type/input fields), align that file, then check withnpm run test:wiring(offline) andnpm run smoke(live, read-only).
Development
npm run build # tsc, typechecks src + scripts
npm run test:wiring # offline end-to-end: mock Jobber API + in-memory MCP client, all 6 tools (no token needed)
npm run smoke # live read-only check that all queries still validate (needs token)
npm run dev # run server from source
npm run auth # local OAuth code-flow helper (localhost callback)
npm run introspect # dump live schema surface (needs token)Layout: src/index.ts (entry) · src/tools.ts (tool definitions + local
filtering/formatting) · src/jobber/client.ts (GraphQL fetch, version header,
401 refresh, throttle retry, filter fallback) · src/jobber/queries.ts (all
GraphQL documents, schema-verified) · src/config.ts (env/.env) · scripts/
(auth, introspect, smoke, wiring test).
See CONTRIBUTING.md for the full development guide, COMPETITORS.md for the landscape survey this project positions itself in, CHANGELOG.md for release history, and SECURITY.md for the trust model and how to report issues.
Principles
Read-only first; write tools (
create_quote,quote_to_invoice, send) only after validation, behind an explicit confirm-before-send design.Customer-held OAuth tokens - never store secrets server-side; tokens live in the customer's env/config.
Opinionated workflow tools, not thin CRUD wrappers.
Open-source core; a hosted version may come later.
License
MIT - see LICENSE.
Available Tools
7 toolsauthenticateConnect your Jobber accountA
Connect this assistant to the user's Jobber account via OAuth (one time). PREREQUISITE the user must have done once: create a free app at https://developer.getjobber.com and enable READ-ONLY scopes for Clients, Jobs, Quotes, Scheduled Items and Invoices (leave the Callback URL blank - localhost is allowed automatically). Call this tool with that app's client_id and client_secret: it opens the user's browser to log in and approve, then stores tokens locally. If the tool is called without credentials, relay the setup instructions it returns to the user.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | No | Client ID from the user's Jobber developer app | |
| client_secret | No | Client secret from the user's Jobber developer app |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses the OAuth browser flow, local token storage, that it is a one-time operation, the exact scopes required, and the fallback behavior when credentials are absent. This is unusually rich behavioral disclosure for an auth tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then the prerequisite, then the invocation contract, then the no-credentials fallback. Length is justified by the multi-step setup the agent must relay; no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the full setup and invocation path including the degraded no-credential case, and with no output schema or annotations it is nearly complete. It stops short of describing token lifetime, refresh, or what happens if stored tokens expire, which an agent may need for follow-up calls.
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 client_id and client_secret are already documented, giving a baseline of 3. The description adds real meaning by tying the values to the user's Jobber developer app and explaining that calling without them is valid (consistent with required=0), which the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (connect/authenticate) and resource (the user's Jobber account) via OAuth, and explicitly frames it as a one-time setup action. This clearly separates it from every sibling, all of which are read/query tools for jobs, invoices, quotes, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite (create a developer app with read-only scopes, leave Callback URL blank) and an explicit no-credential path: calling without credentials returns setup instructions to relay to the user. The agent knows both when and how to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_client_messageDraft a client messageA
Compose a DRAFT message (email or SMS) to a client, enriched with facts pulled live from Jobber (invoice number, balance owing, due date, days overdue, client name). Nothing is ever sent or written to Jobber - the draft is returned for human review. Provide message if you already wrote the body (the tool attaches verified facts); omit it to get a template based on purpose.
| Name | Required | Description | Default |
|---|---|---|---|
| tone | No | Desired tone, e.g. "polite but firm" (default "friendly, professional") | |
| signer | No | Sign-off name/company | |
| channel | No | Draft format (default email) | |
| message | No | Pre-written body from the assistant; used verbatim if provided | |
| purpose | Yes | Why this message exists | |
| client_id | No | Jobber client ID - resolves the client's name | |
| invoice_id | No | Jobber invoice ID - pulls amount/due-date facts (payment reminders) | |
| key_points | No | Points the message must cover (used by templates) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does the important part well: 'Nothing is ever sent or written to Jobber - the draft is returned for human review,' which rules out the main side-effect risk. It also discloses that facts are pulled live rather than from cached/stale data. It stops short of covering failure behavior (invalid client_id/invoice_id, missing facts) or auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action and the no-side-effects guarantee, then the message-vs-template conditional. No filler, no restating of the title, and every clause carries information an agent needs before invoking.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with no annotations, the description covers purpose, mode selection, and side-effect safety, which is the bulk of what's needed. The remaining gap is the return shape: there is no output schema, and the description only says 'the draft is returned' without indicating whether verified facts or a rendered template come back alongside it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 and the schema already documents all 8 parameters. The description adds real meaning on top: `message` is 'used verbatim' and suppresses template generation, while `purpose` drives template selection, and `invoice_id` facts matter mainly for payment reminders. That interaction between parameters is not in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Compose a DRAFT message (email or SMS) to a client') and immediately scopes it as draft-only, distinguishing it from any send action. It also names the concrete enrichment source (Jobber invoice number, balance owing, due date, days overdue, client name), so an agent knows exactly what this tool produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit branch: 'Provide `message` if you already wrote the body ... omit it to get a template based on `purpose`.' That tells the agent when to use which mode. It doesn't name alternatives among the siblings (e.g. fetch facts with get_unpaid_invoices first), but no sibling actually overlaps this compose capability.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_client_detailsGet client detailsA
Full profile for one client by Jobber client_id: name, email/phone, outstanding balance, member-since, recent jobs and recent invoices. Find the client_id first via search_jobs (results include client ids) when you only know the name.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | Yes | Jobber client ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the returned data shape, which is genuinely useful, but says nothing about permissions/auth needs, rate limits, or how 'recent' is bounded for jobs and invoices.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the purpose and return contents followed by the prerequisite. 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?
With no output schema, the description correctly enumerates the return fields, so an agent knows what it gets back. The only gap is the vague 'recent jobs and recent invoices', which leaves the time window or count unspecified.
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% for the single parameter, so the baseline is 3; the description goes beyond the schema by explaining how to obtain the client_id via search_jobs, which is practical guidance the schema field itself does not provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Full profile for one client') and enumerates exactly what the profile contains: name, contact info, balance, member-since, recent jobs and invoices. This is clearly distinguishable from siblings like search_jobs or get_unpaid_invoices.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite and workflow: find the client_id via search_jobs when you only know the name. It names the right alternative for name-based lookup, though it stops short of stating when NOT to use this tool (e.g., bulk retrieval).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_quotesGet quotesA
Quote pipeline grouped by status, with quote number, client, total, and job. Use for pipeline questions like "which quotes are awaiting a response?". Optional server-side filters: status (one of: draft, awaiting_response, archived, approved, converted, changes_requested) and client_id.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size (default 25) | |
| cursor | No | Pagination cursor from a previous get_quotes result | |
| status | No | One of: draft, awaiting_response, archived, approved, converted, changes_requested | |
| client_id | No | Jobber client ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. It discloses that results are grouped by status and that filters are optional and server-side, but it does not mention authentication requirements, read-only safety, pagination behavior, or result ordering. The core behavior is implied but not fully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three tight sentences: it front-loads the return shape and grouping, then gives the usage scenario, then lists filters. Every sentence earns its place with no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description does a good job explaining the return fields and the grouping behavior. It omits details about pagination (cursor/limit) and safety/permissions, but those are either covered by the schema or adequately implied for a read-only retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters. The description restates the status enum options and client_id filter but adds no syntax, format, or behavioral details beyond what is already in the schema. Baseline 3 is appropriate when 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 the specific resource (quote pipeline) and the grouping behavior (grouped by status) along with the fields returned (quote number, client, total, job). It does not explicitly differentiate this tool from siblings like get_unpaid_invoices or search_jobs, but the resource is clear enough to distinguish it in practice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete usage scenario: 'Use for pipeline questions like "which quotes are awaiting a response?"'. This provides clear context for when to use the tool, though it does not state when to prefer alternatives or any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_scheduleGet scheduleA
Visits/appointments in a date range (default today through +7 days), sorted by start time, with the job and client for each. Dates are YYYY-MM-DD. Filtering happens server-side on visit start time.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Range end inclusive, YYYY-MM-DD (default from + 7 days) | |
| from | No | Range start, YYYY-MM-DD (default today) | |
| limit | No | Page size (default 50) | |
| cursor | No | Pagination cursor from a previous get_schedule result |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose meaningful behavior: the default range, sort order, embedded job/client data, and critically that filtering happens server-side on visit start time. It omits auth requirements and pagination mechanics despite limit/cursor parameters, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with no filler, and the most important scoping facts (resource, default range) are front-loaded. The date-format sentence partly duplicates the schema, but it is brief and harmless.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, so the description must stand on its own, and it does describe what comes back (visits with job and client) and how filtering works. It stops short of documenting pagination behavior or access requirements, which an agent paging through results would benefit from.
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 four parameters (from, to, limit, cursor) are already documented in the schema, making 3 the baseline. The description adds the server-side filtering semantics and restates defaults and the YYYY-MM-DD format, but does not explain cursor paging flow or how limit interacts with the cursor.
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 resource (visits/appointments) along with the scope (date range), ordering (sorted by start time), and the included relations (job and client). It is clearly a schedule/visit-listing tool, but it never states an explicit verb and doesn't differentiate itself from sibling retrieval tools like search_jobs or get_client_details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: you call it to see visits/appointments over a date range, and the default window (today through +7 days) is given. There is no statement of when to prefer this over search_jobs, no exclusions, and no prerequisites, so the agent must infer the selection rationale.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_unpaid_invoicesGet unpaid invoicesA
List invoices with a balance owing (status past_due / awaiting_payment), sorted oldest-due first, with days overdue and the total outstanding. Use for accounts-receivable questions like "which invoices are overdue?". Scans the most recent invoices (default 50) and filters on balance.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many recent invoices to scan (default 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the crucial caveat that it scans only the most recent invoices (default 50) and filters on balance, so older unpaid invoices can be missed. It also names the sort order and derived fields. It stops short of stating read-only status explicitly, auth requirements, or whether results are paginated beyond the scan cap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, each earning its place: the first defines the result set and ordering, the second gives the trigger scenario, the third exposes the scan-limit behavior. The most decision-relevant information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description usefully compensates by naming the derived return values (days overdue, total outstanding) and the scan-window behavior. What remains thin is the read-only assumption and any pagination beyond the limit cap, but for a single-parameter list tool this is close to complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter and schema description coverage is 100%, so the schema already documents that limit controls how many recent invoices are scanned. The description repeats that same 'scans the most recent invoices (default 50)' semantics rather than adding new meaning, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list invoices) plus the exact filter (status past_due / awaiting_payment, balance owing), the sort order (oldest-due first), and the returned fields (days overdue, total outstanding). Nothing about the tool's scope is left ambiguous, and it is clearly distinct from the sibling tools (jobs, clients, schedule, quotes).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit use case with an example question: 'Use for accounts-receivable questions like
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_jobsSearch jobsA
Search Jobber jobs (work orders) with job number, title, status, client and created/updated dates. Server-side filters: status (one of: requires_invoicing, archived, late, today, upcoming, action_required, on_hold, unscheduled, active, expiring_within_30_days), created_after / created_before (YYYY-MM-DD), and free-text search across job fields. Filter by client locally with client_id. Returns up to limit results (default 25, max 100) plus a cursor when more pages exist.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size (default 25) | |
| cursor | No | Pagination cursor from a previous search_jobs result | |
| search | No | Free-text search term (job title, etc.) | |
| status | No | One of: requires_invoicing, archived, late, today, upcoming, action_required, on_hold, unscheduled, active, expiring_within_30_days | |
| client_id | No | Jobber client ID to restrict results to (local filter) | |
| created_after | No | Only jobs created on/after this date (YYYY-MM-DD) | |
| created_before | No | Only jobs created on/before this date (YYYY-MM-DD) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries most of the behavioral burden by explaining server-side vs local filtering, default/max page size, and cursor pagination. It does not explicitly state read-only or authentication requirements, though 'Search' strongly implies a read 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?
Front-loaded with purpose and filters, then pagination details. The status value list duplicates the schema, but the overall paragraph is bounded and no framing sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the return explanation: up to limit results plus a cursor, and which fields are searched. It is adequate for a 7-parameter read search, though it omits auth or rate-limit context.
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 reinforces status enum values, date formats, default/max limit, and that client_id is a local filter, but adds little meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb 'Search' and resource 'Jobber jobs (work orders)', and enumerates searchable fields plus filter dimensions. No sibling tool provides job search, so it is readily distinguishable from get_quotes, get_schedule, and get_client_details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains that status, created date, and free-text filters are applied server-side and that client_id is a local filter, giving clear operational context. It does not name an alternative tool or state when not to use it, keeping it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v1.1.0- First observed
authenticate - First observed
draft_client_message - First observed
get_client_details - First observed
get_quotes - First observed
get_schedule - First observed
get_unpaid_invoices - First observed
search_jobs
TDQS
Scored across 7 tools
Each tool covers a distinct resource/action: job search, unpaid invoices, client profile, schedule, quotes, message drafting, and auth. The only mild adjacency (search_jobs results containing client ids that feed get_client_details) is explicitly documented rather than ambiguous.
Most tools follow a verb_noun pattern (search_jobs, get_unpaid_invoices, get_client_details, get_quotes, draft_client_message). Minor deviations exist: 'authenticate' is a bare verb with no noun, and pluralization is uneven (get_schedule singular vs get_quotes/get_client_details plural), but overall it's readable and predictable.
Seven tools is well-scoped for a read-only Jobber assistant covering jobs, invoices, clients, schedule, quotes, and messaging. Every tool earns its place with no bloat.
Covers the core read-only surface: jobs, unpaid invoices, client profiles, schedule, quotes, draft messaging, plus OAuth. Minor gaps remain — no single-job/invoice detail fetch, no listing of paid/settled invoices, and no direct client search (clients are only reachable via job results) — but agents can work around these.
Maintenance
Related MCP Connectors
The HubSpot MCP Server acts as a bridge that enables AI assistants and Large Language Models to securely interact with HubSpot CRM data through natural conversation, without requiring users to understand complex API structures. It provides read-only access to standard CRM objects (contacts, companies, deals, tickets, products, invoices, and more) and their associations, secured via OAuth 2.0, allowing AI agents to perform tasks like summarizing deals, fetching company updates, and looking up record changes.
Let AI agents query data and act across all your business apps via MCP.
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
Run field service from Claude, ChatGPT or Copilot: dispatch, billing, customer messages, photos, and change the software itself, with a confirm step before every change. This address is the India region; US East, Canada, Norway and NZ addresses are at fieldproxy.ai/mcp.
Related MCP Servers
- AlicenseAqualityDmaintenanceCustomer-hosted, read-only MCP server for Jobber operations workflows. It helps owners query Jobber for action lists, overdue invoices, stale requests, estimate/job follow-up, and safe read-only GraphQL validation.644 npm1MIT
- AlicenseAqualityFmaintenanceEnables AI assistants to access and manage Jobber field-service data including clients, jobs, invoices, and quotes through natural language interactions.633 npmMIT
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to manage multiple HighLevel CRM sub-accounts through a single OAuth-based MCP server, providing read-only access to contacts, conversations, opportunities, calendars, payments, blogs, emails, and social media.-
- AlicenseAqualityFmaintenanceMCP server for Jobber home service management software enabling read/write of clients, jobs, quotes, invoices via GraphQL API.71MIT