From d1cd3d8f62342113ecbddbb6df0976bb9d4660d1 Mon Sep 17 00:00:00 2001 From: djiang-jq Date: Tue, 20 Oct 2026 14:44:30 -0700 Subject: [PATCH] feat(third_party): add Jobber plugin Co-authored-by: Cursor --- .cursor-plugin/marketplace.json | 5 ++ README.md | 1 + third_party/jobber/.cursor-plugin/plugin.json | 56 ++++++++++++++ third_party/jobber/CHANGELOG.md | 9 +++ third_party/jobber/LICENSE | 21 ++++++ third_party/jobber/README.md | 69 ++++++++++++++++++ third_party/jobber/assets/logo.png | Bin 0 -> 14668 bytes third_party/jobber/mcp.json | 12 +++ 8 files changed, 173 insertions(+) create mode 100644 third_party/jobber/.cursor-plugin/plugin.json create mode 100644 third_party/jobber/CHANGELOG.md create mode 100644 third_party/jobber/LICENSE create mode 100644 third_party/jobber/README.md create mode 100644 third_party/jobber/assets/logo.png create mode 100644 third_party/jobber/mcp.json diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index 6cdebe40f..1aa824039 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -592,6 +592,11 @@ "grokbot": "0.49.0", "sand": "0.49.0" } + }, + { + "name": "jobber", + "source": "third_party/jobber", + "description": "Work with clients, requests, quotes, jobs, visits, and invoices." } ] } diff --git a/README.md b/README.md index 6bd1a7797..c22f01748 100644 --- a/README.md +++ b/README.md @@ -108,6 +108,7 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc | `tiktok-for-business` | [TikTok for Business](third_party/tiktok-for-business/) | Cursor | Integrations | Manage TikTok ad campaigns, ad groups, ads, audiences, creatives, and reports. | | `gusto` | [Gusto](third_party/gusto/) | Cursor | Integrations | Work with payroll, employees, contractors, time off, and reports. | | `gopuff` | [Gopuff](third_party/gopuff/) | Cursor | Integrations | Shop Gopuff from Grok Bot through Gopuff's official MCP server. Sign in with your Gopuff account; Gopuff handles the sign-in, and your searches, carts, and orders go to Gopuff under that account, so any order you place is charged and delivered like a normal Gopuff order. | +| `jobber` | [Jobber](third_party/jobber/) | Cursor | Integrations | Work with clients, requests, quotes, jobs, visits, and invoices. | Author values match each plugin’s `plugin.json` `author.name` (Cursor lists `plugins@cursor.com` in the manifest). ## Repository structure diff --git a/third_party/jobber/.cursor-plugin/plugin.json b/third_party/jobber/.cursor-plugin/plugin.json new file mode 100644 index 000000000..072e90160 --- /dev/null +++ b/third_party/jobber/.cursor-plugin/plugin.json @@ -0,0 +1,56 @@ +{ + "name": "jobber", + "displayName": "Jobber", + "version": "1.0.0", + "minClientVersions": { + "cursor": "3.13.0" + }, + "description": "Work with clients, requests, quotes, jobs, visits, and invoices.", + "author": { + "name": "Cursor", + "email": "plugins@cursor.com" + }, + "homepage": "https://www.getjobber.com/", + "repository": "https://github.com/cursor/plugins", + "license": "MIT", + "logo": "assets/logo.png", + "keywords": [ + "jobber", + "field service", + "home service", + "clients", + "requests", + "quotes", + "jobs", + "visits", + "invoices", + "scheduling", + "mcp" + ], + "category": "integrations", + "tags": [ + "jobber", + "field service", + "mcp" + ], + "variables": { + "type": "object", + "properties": { + "CLIENT_ID": { + "type": "string", + "title": "Jobber Client ID", + "description": "Client ID from your app in the Jobber Developer Center." + }, + "CLIENT_SECRET": { + "type": "string", + "title": "Jobber Client Secret", + "description": "Client Secret from the same Jobber Developer Center app." + } + }, + "required": [ + "CLIENT_ID", + "CLIENT_SECRET" + ] + }, + "mcpServers": "./mcp.json" +} diff --git a/third_party/jobber/CHANGELOG.md b/third_party/jobber/CHANGELOG.md new file mode 100644 index 000000000..a7c03cd94 --- /dev/null +++ b/third_party/jobber/CHANGELOG.md @@ -0,0 +1,9 @@ +# Changelog + +All notable changes to this plugin will be documented here. + +## 1.0.0 — initial release + +- Logo: Jobber's official mark, provided by Jobber. +- Added the `jobber` MCP server pointing at `https://mcp.getjobber.com/mcp`. +- Declared `CLIENT_ID` and `CLIENT_SECRET` plugin variables and forwarded them through MCP auth, since Jobber requires manual OAuth client registration. diff --git a/third_party/jobber/LICENSE b/third_party/jobber/LICENSE new file mode 100644 index 000000000..ca2bba771 --- /dev/null +++ b/third_party/jobber/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Cursor + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/third_party/jobber/README.md b/third_party/jobber/README.md new file mode 100644 index 000000000..c2eddf75c --- /dev/null +++ b/third_party/jobber/README.md @@ -0,0 +1,69 @@ +# Jobber + +Cursor plugin that connects agents to [Jobber](https://www.getjobber.com/) through Jobber's official remote [Model Context Protocol](https://modelcontextprotocol.io/) server. + +Look up and manage clients, requests, and quotes, and read jobs, visits, and invoices in the signed-in Jobber account. + +## Install + +1. Open **Cursor Settings → Plugins**. +2. Search for **Jobber**. +3. Click **Install**, then set the Client ID and Client Secret (below) and complete the Jobber sign-in prompt. + +Or run `/add-plugin jobber` in chat. + +## MCP + +```json +{ + "mcpServers": { + "jobber": { + "type": "http", + "url": "https://mcp.getjobber.com/mcp", + "auth": { + "CLIENT_ID": "${CLIENT_ID}", + "CLIENT_SECRET": "${CLIENT_SECRET}" + } + } + } +} +``` + +## Setup + +Jobber's OAuth server does not support Dynamic Client Registration and authenticates clients with a secret, so a Jobber app has to be registered before anyone can connect. + +1. Sign in to the [Jobber Developer Center](https://developer.getjobber.com/) and create an app. +2. Register both redirect URIs on that app: + - Desktop: `http://localhost:8787/callback` + - Web and Cloud Agents: `https://www.cursor.com/agents/mcp/oauth/callback` +3. Grant the MCP scopes the connection should have (listed below), then copy the app's **Client ID** and **Client Secret**. +4. In **Dashboard → Plugins → Configure**, set **Jobber Client ID** and **Jobber Client Secret** from that app. +5. Complete the Jobber OAuth login when Cursor prompts. + +On a team marketplace an admin can set the credentials once for everyone; each member still completes their own Jobber OAuth login, so tool calls run with that member's Jobber permissions. + +## What agents can do + +| Area | Scopes | +| --- | --- | +| Clients | `mcp:read_clients`, `mcp:write_clients` | +| Requests | `mcp:read_requests`, `mcp:write_requests` | +| Quotes | `mcp:read_quotes`, `mcp:write_quotes` | +| Jobs | `mcp:read_jobs` | +| Invoices | `mcp:read_invoices` | +| Visits | `mcp:read_visits` | + +Jobs, invoices, and visits are read-only. The hosted runtime is the source of truth for tool names and schemas. + +## Docs + +- Jobber: https://www.getjobber.com/ +- Jobber Developer Center: https://developer.getjobber.com/ +- Server URL: https://mcp.getjobber.com/mcp + +Logo is Jobber's official mark, provided by Jobber. + +## License + +MIT diff --git a/third_party/jobber/assets/logo.png b/third_party/jobber/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bf4a1cc4d18b2a8845d4359620a0cf3da50ac591 GIT binary patch literal 14668 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 j>)(lCe>=stKEOUOe