Skip to main content
Glama
BuildMinimal

jobber-mcp

jobber-mcp

License Node Jobber API Access

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

authenticate

Connect your Jobber account — one time, in-chat, via browser OAuth

search_jobs

Find jobs (work orders) by client, status, date range; paginated

get_unpaid_invoices

Overdue/balanced-owing invoices, days overdue, total AR outstanding

get_client_details

Client profile + outstanding balance + recent jobs and invoices

get_schedule

Upcoming visits in a date range (default today → +7 days)

get_quotes

Quote pipeline grouped by status

draft_client_message

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-VERSION header, and if a schema change rejects our filters, queries degrade gracefully instead of failing

  • Verified against the live schema (2026-05-12) - EncodedId identifiers, enum statuses, amounts money shape, scalar sort inputs

  • Correct details - money in your account's own currency (₹/€/£/…, not a hardcoded $), visit times in your local timezone

  • Tests - 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)

  1. Download jobber-mcp.mcpb from this repo's releases.

  2. In Claude Desktop: Settings → Extensions → Install extension → select the file.

  3. 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.

  4. 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:extension produces dist/jobber-mcp.mcpb from source.

Any other MCP client (developers)

Works with anything that speaks MCP over stdio (Cursor, VS Code Copilot, Claude Code, …).

  1. 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 allows localhost redirects automatically on any port.

  2. Install & configure (or skip this entirely and just call the authenticate tool 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 .env
  3. Connect 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.js over 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:

  1. The API requires an X-JOBBER-GRAPHQL-VERSION header (default set via JOBBER_API_VERSION in .env if Jobber ships a newer version).

  2. All GraphQL documents live in src/jobber/queries.ts - re-run npm run introspect (dumps root queries + type/input fields), align that file, then check with npm run test:wiring (offline) and npm 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

  1. Read-only first; write tools (create_quote, quote_to_invoice, send) only after validation, behind an explicit confirm-before-send design.

  2. Customer-held OAuth tokens - never store secrets server-side; tokens live in the customer's env/config.

  3. Opinionated workflow tools, not thin CRUD wrappers.

  4. Open-source core; a hosted version may come later.

License

MIT - see LICENSE.

Available Tools

7 tools
authenticateConnect 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
client_idNoClient ID from the user's Jobber developer app
client_secretNoClient secret from the user's Jobber developer app

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
toneNoDesired tone, e.g. "polite but firm" (default "friendly, professional")
signerNoSign-off name/company
channelNoDraft format (default email)
messageNoPre-written body from the assistant; used verbatim if provided
purposeYesWhy this message exists
client_idNoJobber client ID - resolves the client's name
invoice_idNoJobber invoice ID - pulls amount/due-date facts (payment reminders)
key_pointsNoPoints the message must cover (used by templates)

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3 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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
client_idYesJobber client ID

TDQS

A4.2/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size (default 25)
cursorNoPagination cursor from a previous get_quotes result
statusNoOne of: draft, awaiting_response, archived, approved, converted, changes_requested
client_idNoJobber client ID

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all four parameters. 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.

Purpose4/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoRange end inclusive, YYYY-MM-DD (default from + 7 days)
fromNoRange start, YYYY-MM-DD (default today)
limitNoPage size (default 50)
cursorNoPagination cursor from a previous get_schedule result

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many recent invoices to scan (default 50)

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size (default 25)
cursorNoPagination cursor from a previous search_jobs result
searchNoFree-text search term (job title, etc.)
statusNoOne of: requires_invoicing, archived, late, today, upcoming, action_required, on_hold, unscheduled, active, expiring_within_30_days
client_idNoJobber client ID to restrict results to (local filter)
created_afterNoOnly jobs created on/after this date (YYYY-MM-DD)
created_beforeNoOnly jobs created on/before this date (YYYY-MM-DD)

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description 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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 7 tool updatesv1.1.0
    • First observedauthenticate
    • First observeddraft_client_message
    • First observedget_client_details
    • First observedget_quotes
    • First observedget_schedule
    • First observedget_unpaid_invoices
    • First observedsearch_jobs

TDQS

A4.1/5.0

Scored across 7 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Customer-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.
    6
    44 npm
    1
    MIT
  • A
    license
    A
    quality
    F
    maintenance
    Enables AI assistants to access and manage Jobber field-service data including clients, jobs, invoices, and quotes through natural language interactions.
    6
    33 npm
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables 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.
    -
  • A
    license
    A
    quality
    F
    maintenance
    MCP server for Jobber home service management software enabling read/write of clients, jobs, quotes, invoices via GraphQL API.
    7
    1
    MIT