Jobber MCP server for AI agents

Live

OAUTH 2.0

FIELD SERVICE

CRM & Sales

Jobber gives your agent field service operations in your Jobber account: manage clients and properties, create quotes, jobs, and invoices, read the schedule of visits, and record expenses and notes.

  • Per-user credentials: each call uses the actual user's token, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
Jobber
agent · Acme Q3
Run
What visits are scheduled for tomorrow?
S
jobber_visits_list
104ms
Field service agent
7 visits are scheduled tomorrow across 3 team members. The first starts at 8:00 at 42 Elm Street for the Harper lawn care job.
Sources: Jobber schedule, 7 visits
jobber
7 visits
18:29
Message Claude...

Tools your field service agent reaches for on Jobber, scoped per user.

CALL ANY TOOL
49 tools for field service in Jobber: manage clients and properties, create and update quotes, jobs, and invoices, list visits, time sheets, and payments, and record expenses and notes.
jobber_account_get
Get account
Get the Jobber account (business) that the connection is authorized for. Returns the account id, name, company contact details and the account owner. Use it to confirm which Jobber business you are connected to. Use jobber_users_list for team members.
Parameters
Name
Type
Required
Description
—
No parameters required
jobber_client_archive
Archive client
jobber_client_create
Create client
jobber_client_get
Get client
jobber_client_note_create
Create client note
jobber_client_unarchive
Client unarchive
jobber_client_update
Update client
jobber_clients_list
List clients
jobber_expenses_list
List expenses
jobber_invoice_create
Create invoice
jobber_invoice_note_create
Create invoice note
jobber_invoice_update
Update invoice
jobber_job_get
Get job
jobber_job_note_create
Create job note
jobber_jobs_list
List jobs
jobber_product_create
Create product
jobber_product_update
Update product
jobber_products_list
List products
jobber_property_get
Get property
jobber_quote_approve
Approve quote
jobber_quote_create
Create quote
jobber_quote_note_create
Create quote note
jobber_quote_update
Update quote
jobber_quotes_list
List quotes
jobber_request_get
Get request
jobber_request_note_create
Create request note
jobber_requests_list
List requests
jobber_tax_rates_list
List tax rates
jobber_user_get
Get user
jobber_users_list
List users

For more tools, view docs.

Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// Jobber tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["jobber"], toolNames: [
    "jobber_clients_list",
    "jobber_quote_create",
    "jobber_visits_list"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Create a gutter cleaning quote for Dana Reyes" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["jobber"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Create a gutter cleaning quote for Dana Reyes" }],
  tools,
});

// Execute the tool call with the user's vaulted Jobber OAuth token
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["jobber"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Create a gutter cleaning quote for Dana Reyes" }],
  tools,
});

// Tool call runs with the user's vaulted Jobber OAuth token
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["jobber"] }, pageSize: 100,
});

const agent = new Agent({
  name: "field_service_agent",
  model: "gemini-2.5-pro",
  instruction: "Jobber tools scoped to this user",
  tools,
});

await agent.run("Create a gutter cleaning quote for Dana Reyes");
Try these prompts
Copy any prompt into your agent. Each maps directly to a Jobber tool. Click to copy, paste into your agent, done.
Clients and requests
Copy the prompt
Copied
Create a client for Dana Reyes with her phone and billing address.
Copy the prompt
Copied
List the work requests that came in this week.
Copy the prompt
Copied
Add a service property at 18 Oak Lane to the Reyes client.
Quotes and jobs
Copy the prompt
Copied
Create a draft quote for gutter cleaning at the Reyes property.
Copy the prompt
Copied
Mark quote 1042 as approved.
Copy the prompt
Copied
Close job 311 and remove its incomplete visits.
Schedule and billing
Copy the prompt
Copied
What visits are scheduled for tomorrow?
Copy the prompt
Copied
Create an invoice from job 311.
Copy the prompt
Copied
List invoices that are past due.
SEE HOW AUTH WORKS
Each user signs in to Jobber once, and Scalekit stores and refreshes their tokens. Credentials stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
Jobber
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
Jobber
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
Jobber
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
Jobber
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other CRM and productivity connectors.
GTM and RevOps Teams
CRM AI agent
Reads the Granola transcript after every call, extracts next steps and updates the HubSpot record, drafts the follow-up in Gmail, and confirms in Slack, all on the rep's own delegated OAuth.
Engineering Teams
Slack triage
Polls Slack for new messages, classifies bugs and support requests with a LangGraph router, files GitHub issues or Zendesk tickets, and confirms in the thread.
Test other agents
See the same per-user auth pattern across other CRM and productivity connectors.
GTM
CRM AI agent
Turn each Granola call transcript into a HubSpot record update, a drafted Gmail follow-up, and a Slack recap.
ENGINEERING
Slack triage agent
Classify new Slack messages as bugs or support requests, file the GitHub issue or Zendesk ticket, and reply in the thread.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared Jobber token looks fine in a demo. In production every quote and invoice looks like one service account, and you cannot tell which user triggered it. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared token
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Jobber today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access Jobber as the user or through a shared service account?
As the user. Each user signs in to Jobber once, and Scalekit stores and refreshes their tokens. Every quote, job, and invoice change in your audit trail is attributed to that user, not a shared service account.
Where is the Jobber OAuth token stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. Refresh is automatic. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in Jobber?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example schedule and reporting tools without jobber_client_archive, which hides a client from active lists, or the job and invoice create tools. Scalekit also enforces scope checks before every API call.
What happens when a user revokes Jobber access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.
Which Jobber account does the agent work in?
The Jobber account the user authorized when they signed in. jobber_account_get returns that account, and jobber_user_get with no ID returns the signed-in user.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""jobber"": {
""url"": ""https://mcp.scalekit.com/jobber"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.jobber]
url = ""https://mcp.scalekit.com/jobber""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""jobber"": {
""url"": ""https://mcp.scalekit.com/jobber"",
""type"": ""http""
}
}
}