mcpField
J
jobber-mcp

jobber-mcp

本地服务
github.com/chrischall商业与营销05 天前更新

关于 jobber-mcp

面向 Jobber Client Hub 客户的只读 MCP 服务,可读取服务商提供的预约、发票、报价和工单请求。它通过已登录浏览器桥接访问客户门户,而非面向商家的 Developer API。

主要功能

  1. 01列出预约、发票和报价
  2. 02读取已提交的工单请求
  3. 03读取门户页面及详情页
  4. 04支持多个服务商门户
  5. 05检查桥接、配置和门户状态

适用场景

  1. 01查看即将到来的服务预约
  2. 02检查发票及付款状态
  3. 03查找过往报价详情
  4. 04回顾之前提交的工单请求

MCP 相关

向 MCP 客户端提供只读的 Jobber Client Hub 工具。页面由已登录的浏览器标签页和 ContextMint Bridge 扩展获取;服务不提供写入操作。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"chrischall-jobber": {
"command": "npx",
"args": [
"-y",
"@chrischall/jobber-mcp"
],
"env": {
"JOBBER_HUB_ID": "<JOBBER_HUB_ID>",
"JOBBER_HUB_LABEL": "<JOBBER_HUB_LABEL>",
"JOBBER_HUBS": "<JOBBER_HUBS>",
"JOBBER_WS_PORT": "<JOBBER_WS_PORT>",
"JOBBER_DEBUG_LOG": "<JOBBER_DEBUG_LOG>",
"FETCHPROXY_WS_HOST": "<FETCHPROXY_WS_HOST>",
"FETCHPROXY_IDENTITY_DIR": "<FETCHPROXY_IDENTITY_DIR>"
}
}
}
}
启动命令npx -y @chrischall/jobber-mcp
需要配置的环境变量
JOBBER_HUB_ID密钥Single hub UUID, from your hub URL: clienthub.getjobber.com/client_hubs/<UUID>/. Treat it like a password.
JOBBER_HUB_LABELName for that hub (default `default`).
JOBBER_HUBS密钥JSON array of {label, hubId} for several providers. Labels must be unique ignoring case (including the JOBBER_HUB_ID hub's label). Treat it like a password.
JOBBER_WS_PORTfetchproxy concentrator port (default 37149 — don't change it).
JOBBER_DEBUG_LOGBridge debug logging to stderr.
FETCHPROXY_WS_HOSTBind interface for the fetchproxy concentrator (default 127.0.0.1; a literal IP only). For a hosted child in its own network namespace only — never bind a laptop's concentrator to the network.
FETCHPROXY_IDENTITY_DIRAbsolute path where fetchproxy stores its long-term identity keypair (default ~/.fetchproxy/identity/). For a host that runs a separate child per caller, so they share one identity.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@chrischall/jobber-mcp1.0.8

工具

7

收录的工具列表 · 更新于 2 周前

参数类型必填说明
hubstring否要读取的服务提供商 Hub,按标签指定。仅配置了一个时省略。

详细介绍

Jobber Client Hub MCP

CI npm license

一个 Model Context Protocol 服务,可将 Claude 连接到 Jobber Client Hub——这是家庭服务企业(虫害防治、草坪养护、暖通空调、清洁)用来向你发送预约、报价和发票的客户门户。

警告

由 AI 开发的项目。 此代码库由 Claude Code 构建并积极维护。没有人类审查过其实现。使用前请检查所有代码和工具权限。

这是面向客户的一侧,而不是面向企业的一侧

Jobber 有两个界面,彼此互不相通:

开发者 APIClient Hub(本仓库)
服务对象使用 Jobber 经营的企业该企业的客户
身份验证你注册的 OAuth2 应用服务提供商通过邮件发送给你的门户链接
是否可从服务端访问可以不可以——Cloudflare

如果你在 Jobber 上经营企业,你需要的是 Developer API——justinvogel 的 jobber-mcp 覆盖了该界面。本服务面向作为他人客户的用户,相关原因详见 skills/jobber-fpx/references/why-not-the-api.md。

你可以做什么

  • “灭虫人员下次什么时候来?”
  • “我还欠 Queen Bee's 多少钱吗?”
  • “列出他们今年发给我的所有发票。”
  • “我上次的服务请求里让他们做什么?”

本服务只读,这并非遗漏所致——请参阅为何没有写入操作。

要求

  • Claude Desktop 或 Claude Code
  • Node.js 22 或更高版本
  • 安装 ContextMint Bridge 浏览器扩展,可从其发布页面获取(Chrome:解压 Chrome zip 后加载。Safari 暂不可用——它将随 ContextMint 应用一起发布,但该应用没有公开下载渠道——因此目前请使用 Chrome),并允许访问 getjobber.com,且已登录 Client Hub 标签页。ContextMint Bridge 是 fetchproxy 浏览器扩展的新名称,由同一维护者开发——fetchproxy 自己的 README 中提供了相关链接。其源代码公开于 https://github.com/nullnet-app/contextmint-bridge:你可以自行构建,或将发布版 zip 与其旁边发布的 .sha256 文件进行校验(shasum -a 256 -c contextmint-bridge-chrome-<version>.zip.sha256)。
  • 服务提供商发来的 Client Hub 链接——他们任意一封邮件中的“View Details”按钮

设置

{
  "mcpServers": {
    "jobber": {
      "command": "npx",
      "args": ["-y", "@chrischall/jobber-mcp"],
      "env": { "JOBBER_HUB_ID": "<the UUID from your hub URL>" }
    }
  }
}

你的 hub URL 格式如下:clienthub.getjobber.com/client_hubs/<UUID>/。UUID 就是完整凭据——任何持有它的人都能读取该 hub,因此请像对待密码一样保管。

有多个服务提供商、多个 hub(没有合并视图):

"env": {
  "JOBBER_HUBS": "[{\"label\":\"queenbee\",\"hubId\":\"…\"},{\"label\":\"greenworx\",\"hubId\":\"…\"}]"
}

然后在任意工具中传入 hub: "greenworx"。配置了一个 hub 时,无需传入该参数。

从 .mcpb bundle 安装到 Claude Desktop 后,会显示相同的三个设置项:Client Hub ID、Client Hub label 和 Several Client Hubs (JSON)——将上面的 JSON 数组粘贴到最后一项即可。

变量含义
JOBBER_HUB_ID单个 hub 的 UUID
JOBBER_HUB_LABEL该 hub 的名称(默认为 default)
JOBBER_HUBS多个服务提供商对应的 {label, hubId} JSON 数组。标签忽略大小写后必须唯一(包括 JOBBER_HUB_ID hub 的标签)
JOBBER_WS_PORTfetchproxy 集中器端口(默认为 37149——请勿更改)
JOBBER_DEBUG_LOG将 Bridge 调试日志输出到 stderr

工具

工具返回内容
jobber_list_appointments按今天/即将进行/过去分组的访问
jobber_list_invoices发票,包含编号、主题和分区(Paid、Overdue,……)
jobber_list_quotes报价及其审批分区
jobber_list_work_requests你提交的请求
jobber_read_page预约、发票、报价或工作请求页面的可读文本,包括详情页
jobber_list_hubs已配置的 hub(仅标签,不包含 ID)
jobber_healthcheck哪一层发生故障:桥接、配置或 hub

jobber_list_* 会将每条记录的元数据行原样放入 details,而不是强行套用固定架构。卡片显示哪些行取决于其状态——未付款的发票包含余额行,已付款的则没有——因此,固定架构会为某些记录虚构字段,并丢弃其他记录的行。

为什么浏览器桥接不可或缺

已于 2026-08-09 验证:clienthub.getjobber.com 位于 Cloudflare 管理的质询机制之后,该机制会识别TLS 客户端,而非 User-Agent。curl 和 Node 都会收到带有 Just a moment 插页的 403;即使提供当前 Chrome UA 和完整的浏览器 Accept* 标头集,也仍然如此。从真实标签页发出的相同请求则会返回 200。

此外,也没有可回退使用的 JSON API:该 hub 是服务端渲染的 Rails 应用,不会向其自身源站发出任何 API 调用。clienthub.getjobber.com/api/graphql 虽然存在并响应 introspection,但它提供的与 Developer API 相同,都是员工架构,并非面向客户端的端点。

在 mcp-host 上托管

mcp-host 可以将此服务作为桥接子进程运行,从而连接 claude.ai 和手机。hub 页面仍由你已登录的浏览器标签页获取:ContextMint Bridge 扩展会通过网络与托管的子进程配对,因此 Cloudflare 质询看到的是真实浏览器,而非数据中心。整个过程不会重放提取出的 cookie,所以这里刻意不使用 @fetchproxy/bootstrap 的“一次性提取会话”模式。

mint.yaml 包含注册所需的内容:使用 bridge: true 注册,并将 JOBBER_WS_PORT 设为 bridgePortEnv(runner 会通过该变量注入每个注册项专属的集中器端口;在本地运行时,readPortEnv 默认使用整个服务群共享的 37149);保留 state.dataDir,以便桥接身份和配对信息在重启后仍然有效;并让 egress 保持为空,因为进程本身不会连接 getjobber.com。

为什么不提供写入功能

hub 可以提交工作请求、批准报价和支付发票,但这里不包含这些功能:

  • 这些流程会发送携带 CSRF 令牌的表单 POST 请求;某些路径还会读取 DOM 中的 Turnstile 令牌。桥接只执行 fetch(),不会读取 DOM,因此无法完成这些流程——写入工具只会不可预测地失败,而无法正常工作。
  • 支付发票需要处理银行卡或银行账户信息。这应由你在浏览器中亲自操作,而不是通过 Agent 的工具调用完成。

不使用 MCP

skills/jobber-fpx/ 可通过 shell 和 fpx CLI 执行相同的读取操作,无需启动服务进程。桥接相同、页面相同,只需一条命令。

开发

npm install
npm run build
npm test

整个测试套件会完全模拟网络;tests/server-boot.test.ts 还会启动真实的构建产物——包括在没有 node_modules 的目录中运行的 bundle(与 .mcpb 的运行方式相同)——并完成完整的 initialize + tools/list 握手。

条款确认

1. 此服务访问的是你自己的 Client Hub。 每个请求都会通过 ContextMint Bridge 扩展,借助你自己已登录的浏览器会话进行分发,复用你已有的会话。它不会也无法访问其他人的 Hub。

2. Jobber 的服务条款 约束你对本服务的使用,与约束你直接在浏览器中使用 Hub 的方式完全相同。请仔细阅读;如果你的使用方式不符合条款,请停止使用本服务。

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。