Connect Jobber to Claude: Track Work Requests and Service Bookings
Learn how to connect Jobber to Claude using a managed MCP server. Automate service requests, client tracking, and job scheduling workflows with AI.
If you need to connect Jobber to Claude to automate field service operations, triage incoming work requests, or track service job statuses, you need a Model Context Protocol (MCP) server. This server acts as the translation layer between Claude's tool calls and Jobber's APIs. You can either build and maintain this infrastructure yourself, or use a managed integration platform like Truto to dynamically generate a secure, authenticated MCP server URL.
If your team uses ChatGPT, check out our guide on connecting Jobber to ChatGPT or explore our broader architectural overview on connecting Jobber to AI Agents.
Giving a Large Language Model (LLM) read and write access to a complex field service ecosystem like Jobber is an engineering challenge. You have to handle OAuth 2.0 token lifecycles, map massive JSON schemas to MCP tool definitions, and deal with Jobber's strict workflow rules and dual REST/GraphQL architectures. Every time Jobber updates an endpoint or deprecates a field, you have to update your server code, redeploy, and test the integration.
This guide breaks down exactly how to use Truto to generate a secure, managed MCP server for Jobber, connect it natively to Claude Desktop, and execute complex dispatch and scheduling workflows using natural language.
The Engineering Reality of the Jobber API
A custom MCP server is a self-hosted integration layer. While the open MCP standard provides a predictable way for models to discover tools, the reality of implementing it against Jobber's APIs requires navigating a highly opinionated platform designed around physical field service workflows.
If you decide to build a custom MCP server for Jobber, you own the entire API lifecycle. Here are the specific challenges you will face:
The REST vs. GraphQL Paradigm Split
Jobber operates dual APIs, and your LLM needs access to both to be effective. The REST API is excellent for listing records and triggering basic actions. However, creating a fully fleshed-out client using the standard POST /clients REST endpoint only accepts scalar fields. If you want to attach emails, phone numbers, billing addresses, or status tags during creation, you must execute a GraphQL clientCreate mutation. An effective MCP server must abstract this reality, exposing clear, typed REST tools for standard CRUD, while providing a GraphQL escape hatch for nested object mutations.
Strict Workflow State Machines
An LLM cannot simply force a work request into a completed state by sending a PATCH request with "requestStatus": "converted". Jobber's statuses are derived from its internal workflow engine. A request converts only when a quote is generated and approved. A client remains a "lead" (isLead: true) until their first job is booked, at which point Jobber automatically flips the boolean. Your MCP tools must be carefully documented so Claude understands it cannot directly mutate these derived status fields, avoiding endless hallucinated API calls that return 400 Bad Request errors.
Complex Archival Dependencies
Data deletion in Jobber is heavily guarded to protect accounting and service histories. If an AI agent attempts to archive a client, Jobber will refuse the request if the client has open jobs, active quotes, or pending work requests, returning a strict userErrors response. Your AI needs tools to query rollups - like jobs.totalCount - before attempting state changes to handle these guarded actions gracefully.
Generating the Jobber MCP Server
Truto handles the heavy lifting of API translation through a dynamic, documentation-driven architecture. Instead of hand-coding tool definitions for every Jobber endpoint, Truto derives them from internal resource definitions and documentation records.
This means a tool only appears in the MCP server if it has a corresponding documentation entry, ensuring the LLM only sees curated, AI-ready tools. Truto manages the OAuth token refresh lifecycle and proxies the execution directly to Jobber.
A critical factual note on rate limits: Truto does not swallow or automatically retry rate-limited requests. When Jobber returns an HTTP 429 error, Truto passes that error directly to the caller. Truto normalizes upstream rate limit info into standardized headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset) per the IETF spec. Your client application or agent framework is responsible for handling retry and backoff logic.
You can generate an MCP server for Jobber via the Truto dashboard or programmatically via the API.
Method 1: Via the Truto UI
For teams testing workflows or setting up internal agents, the UI is the fastest path.
- Navigate to the Integrated Accounts page in your Truto dashboard.
- Select your connected Jobber account.
- Click the MCP Servers tab.
- Click Create MCP Server.
- Select your desired configuration (e.g., allow all methods, or restrict to read-only).
- Copy the generated MCP server URL (e.g.,
https://api.truto.one/mcp/a1b2c3d4...).
Method 2: Via the Truto API
For production use cases where you need to provision MCP servers dynamically for your end-users, use the REST API. This request validates the underlying tools, generates a secure cryptographic token, and schedules an automatic cleanup alarm if an expiration is set.
curl -X POST https://api.truto.one/integrated-account/{integrated_account_id}/mcp \
-H "Authorization: Bearer YOUR_TRUTO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Jobber Dispatch Agent",
"config": {
"methods": ["read", "write", "custom"]
}
}'The API returns a payload containing the secure connection URL:
{
"id": "mcp-jobber-890",
"name": "Jobber Dispatch Agent",
"config": { "methods": ["read", "write", "custom"] },
"expires_at": null,
"url": "https://api.truto.one/mcp/a1b2c3d4e5f6g7h8..."
}Keep this URL secure. It contains a cryptographic token that maps directly to the specific Jobber tenant connection.
Connecting the MCP Server to Claude
Once you have your Truto MCP URL, connecting it to Claude is a matter of configuration. The standard JSON-RPC 2.0 protocol handles tool discovery automatically.
Method A: Via the Claude UI (or ChatGPT UI)
If you are using Claude's web interface or ChatGPT's custom connectors, you can add the server directly through the UI settings.
- In Claude: Go to Settings -> Integrations -> Add MCP Server. Paste your Truto MCP URL and click Add.
- In ChatGPT: Go to Settings -> Apps -> Advanced settings -> Enable Developer mode. Under MCP servers, click add new, provide a name (e.g., "Jobber Production"), paste the URL, and save.
Method B: Via the Claude Desktop Config File
For developers building local agentic workflows with Claude Desktop, you can mount the server via your configuration file using the official MCP SSE transport.
Locate your claude_desktop_config.json file:
- Mac:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Add the Jobber MCP server using the @modelcontextprotocol/server-sse package:
{
"mcpServers": {
"jobber": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-sse",
"https://api.truto.one/mcp/a1b2c3d4e5f6g7h8..."
]
}
}
}Restart Claude Desktop. You will see a new hammer icon indicating the Jobber tools have been successfully ingested.
High-Leverage Hero Tools for Jobber
Truto exposes Jobber operations as strictly typed tools with combined query and body schemas. Here are six high-leverage hero tools that unlock dispatching and field service automation.
1. list_all_jobber_requests
Requests are inbound enquiries for work. This tool allows the LLM to pull all pending enquiries, filter by status, and identify which clients need immediate attention.
Usage note: Use the filter parameter to narrow down the list. For example, passing {"status": "new"} returns only un-actioned requests.
"Pull all 'new' work requests from Jobber. For each one, tell me the company name, contact details, and the assigned salesperson."
2. get_single_jobber_client_by_id
Fetches a comprehensive profile of a specific client, including their outstanding balance, phone numbers, tags, and total counts for jobs and invoices.
Usage note: A client where jobs.totalCount equals 0 has never had work booked. Jobber enforces the isLead status based on this metric, meaning the LLM can infer client maturity simply by checking the job count.
"Look up client ID 849201. Have they had any actual jobs completed with us, or are they still just a lead? What is their current outstanding balance?"
3. list_all_jobber_jobs
Retrieves scheduled and completed work orders. This is the core operational entity in Jobber, allowing the AI to see job statuses, totals, scheduled dates, and the associated property.
Usage note: This is critical for agents acting in a dispatch or customer service capacity. If a customer calls in asking about their service window, this tool provides the exact scheduling timestamps.
"List all recent jobs. Find the one for 'Acme Corp' and tell me its current status and the scheduled start time."
4. create_a_jobber_request
Allows the LLM to programmatically log a new work enquiry against an existing client. The new request will automatically be given the requestStatus of "new".
Usage note: The client_id is required in the body. This tool only accepts scalar fields (like the title or basic details). If you need to attach complex line items or nested property details upon creation, you must use the GraphQL tool.
"Log a new work request for client ID 10924. The title should be 'Emergency HVAC repair - No cooling'."
5. update_a_jobber_request_by_id
Once a request is generated, this tool allows the agent to update specific assignments.
Usage note: You can update the title, assigned property, referring client, and the salesperson. You cannot manually update the requestStatus - that requires moving the request through the Jobber workflow (e.g., quoting it).
"Update request ID 5820. Assign 'Sarah Jenkins' as the salesperson and confirm the update was successful."
6. create_a_jobber_graphql
This is the ultimate escape hatch. For anything the typed REST tools cannot express - like setting nested addresses during client creation, applying status tags, or interacting with deep Jobber configurations - the LLM can construct and fire an arbitrary GraphQL mutation or query.
Usage note: The tool accepts {query, variables} in the body. It returns Jobber's raw GraphQL response, including the data object and any nested userErrors arrays.
"Use the GraphQL tool to run a clientEdit mutation on client ID 9921. Add the tag 'VIP-Customer' to their profile."
For the complete tool inventory, including detailed JSON Schemas for every operation, check out the Jobber integration page.
Workflows in Action
Connecting Jobber to Claude transforms static field service data into actionable, agentic workflows. Here is how specific personas use these tools in practice.
sequenceDiagram
participant Claude as Claude Desktop
participant Truto as Truto MCP Router
participant Proxy as Truto Proxy API
participant Jobber as Jobber API
Claude->>Truto: tools/call (list_all_jobber_requests)<br>filter: {"status": "new"}
Truto->>Proxy: Execute Proxy Handler
Proxy->>Jobber: GET /requests?status=new
Jobber-->>Proxy: 200 OK (Requests Data)
Proxy-->>Truto: Normalized API Response
Truto-->>Claude: JSON-RPC ResultScenario 1: The Dispatcher Triaging New Leads
Field service dispatchers need to move fast when new work enquiries come in. Instead of clicking through the Jobber interface to identify new requests and assign them, they can ask Claude to handle the triage.
"Check Jobber for any new work requests that haven't been assigned yet. Give me a summary of who the client is, and then assign all of them to salesperson ID 445."
Execution flow:
- Claude calls
list_all_jobber_requestswith the filter{"status": "new"}. - The model parses the returned array of requests, noting the missing salesperson assignments.
- Claude loops through the array, calling
update_a_jobber_request_by_idfor each unassigned request, passing the specified salesperson ID. - Claude returns a text summary confirming exactly which requests were updated and assigned.
Scenario 2: The Service Manager Auditing High-Value Leads
Managers need to separate noise from high-value prospects. Jobber tracks lead status implicitly through the absence of booked jobs.
"Find all our clients who are currently tagged as leads. Filter for any that have a balance greater than 0, meaning they might have paid a deposit but haven't had a job logged yet. If you find any, use GraphQL to add the tag 'Needs-Follow-Up'."
Execution flow:
- Claude calls
list_all_jobber_clientswith the filter{"isLead": true}. - The model evaluates the returned
balancefields, filtering out anyone with a 0 balance. - For matching clients, Claude formats a GraphQL mutation string.
- Claude calls
create_a_jobber_graphqlwith theclientEditmutation to append the "Needs-Follow-Up" tag. - Claude replies with a list of the updated high-value leads.
Security and Access Control
When exposing B2B APIs to LLMs, security and blast-radius containment are paramount. Truto's MCP servers provide strict boundaries at the token level, ensuring agents only access what they explicitly require.
- Method Filtering (
methods): Restrict an MCP server to read-only access by passing["read"]during server creation. This exposes onlygetandlistoperations, physically preventing the LLM from mutating Jobber data. - Tag Filtering (
tags): Group tools by business function. If you only want an agent to handle work requests and ignore invoicing, specify relevant tags to drop unrelated tools from the server payload entirely. - Expiration Controls (
expires_at): Generate short-lived MCP servers for contractors or temporary AI workflows. Once the ISO datetime is reached, Truto automatically cleans up the database record and invalidates the edge KV storage. - Double Authentication (
require_api_token_auth): For strict security environments, toggle this flag to true. The caller must possess the secret MCP URL and pass a valid Truto API token in the Authorization header to execute tools.
Architecting AI-Driven Field Service
Connecting Jobber to Claude via MCP moves your operational data out of isolated dashboards and into natural language workflows. Whether you are automating dispatch logic, auditing lead statuses via GraphQL, or triaging emergency service requests, a managed MCP server removes the friction of OAuth token management and documentation mapping.
Instead of wasting engineering cycles reading Jobber API docs and maintaining brittle REST wrappers, you can focus on writing better agent prompts and orchestrating faster service delivery.
FAQ
- Does Truto handle Jobber's API rate limits automatically?
- No. Truto passes HTTP 429 rate limit errors directly back to the caller and normalizes the upstream limit info into standardized IETF headers. Your application or agent framework must handle the retry and backoff logic.
- How do I update nested fields like tags or emails in Jobber using MCP?
- Jobber's standard REST endpoints only support scalar field creation. To update nested objects or append status tags, your LLM must use the `create_a_jobber_graphql` tool to execute a standard Jobber mutation.
- Can I prevent Claude from deleting Jobber records?
- Yes. When generating the MCP server via Truto, you can pass `methods: ["read"]` to enforce a read-only token, or filter by specific tags to heavily restrict which tools are exposed to the LLM.