
QuickBooks Online
io.github.wyre-technology由 GitHub 账号 wyre-technology 发布v1.6.4更新于 Oct 24, 2026
MCP server for QuickBooks Online — accounts, customers, invoices, bills, and reports.
概览
面向 QuickBooks Online 的 MCP 服务器,让助手读写客户、发票、账单、付款等会计数据并生成财务报表。
- 可以做什么
- 查询、创建、更新、作废和搜索销售类记录:客户、发票、估价单、销售收据、贷项通知单和付款
- 管理采购类记录:供应商、账单、账单付款、供应商贷项、采购和采购订单
- 处理银行与资金往来:存款、转账和日记账分录,以及商品、会计科目表、类别、部门、付款条件和付款方式
- 读取税码、税率和公司信息;管理员工和可计费工时;查看附件元数据
- 生成十种财务报表,包括利润表、资产负债表、现金流量表、试算平衡表、总账、应收账龄和应付账龄
- 通过导航工具按业务领域发现工具,并在支持 MCP Apps 的客户端中把发票渲染为只读交互卡片
- 适用场景
- 适合助手需要查询某公司的账务数据,或在 QuickBooks Online 中完成记账工作——查找客户与发票、起草或更新交易、生成标准财务报表——而不必切换到 QuickBooks 界面时使用。
- 运行要求
- 以 stdio 在本地运行(需 Node.js 20 或更高版本,或使用已发布的容器镜像)。需要 Intuit 开发者应用,以及预先获取的 QuickBooks Online OAuth2 访问令牌和公司 realm ID;服务器本身不执行 OAuth 流程。凭据来自 QBO_CLIENT_ID、QBO_CLIENT_SECRET、QBO_REFRESH_TOKEN 和 QBO_REALM_ID,或在 env 模式下使用 QBO_ACCESS_TOKEN 与 QBO_REALM_ID,或在 gateway 模式下由每次请求的请求头提供。HTTP 模式还需 CONDUIT_S2S_SECRET。
安装
在 SourceWeft 中
- 打开 控制台中的 QuickBooks Online,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
QuickBooks Online MCP Server
Model Context Protocol (MCP) server for the QuickBooks Online Accounting API. Exposes 130+ tools across 22 QBO entities plus 10 financial reports for Claude and other MCP-compatible clients.
Features
- Interactive invoice card (MCP Apps, SEP-1865):
qbo_invoices_getrenders as a read-only interactive card in MCP Apps hosts (Claude Desktop/web) — customer, status, dates, line items, totals — neutral by default, brandable viawindow.__BRAND__injection orMCP_BRAND_*env vars. Non-App hosts see the same JSON payload (plus a_cardfield).
One-Click Deployment
[Deploy to Cloudflare Workers]
Note on registry auth: This server depends only on public npm packages, so the Cloudflare and DigitalOcean cloud builders install its dependencies anonymously — no token is required for one-click deploy. (If a future release adds a private
@wyre-ai/*dependency, you would supply a GitHub PAT withread:packagesas a build variable —NODE_AUTH_TOKENfor Cloudflare Workers, a build-timeGITHUB_TOKENsecret for DigitalOcean.)Installing the published package: The released package is published to the GitHub Packages npm registry, which requires authentication on every install (even for public packages). To install it, authenticate npm to
npm.pkg.github.comwith a GitHub PAT that hasread:packages:
Quick Start
Prerequisites
- Node.js >= 20
- QuickBooks Online OAuth2 app credentials (requires an Intuit developer account)
Install and Build
Run (stdio mode)
Run (HTTP mode)
HTTP refuses to start until CONDUIT_S2S_SECRET is set. The listener defaults to 127.0.0.1:8080.
Local HTTP without a secret is development-only. It binds 127.0.0.1 only and logs a warning. A non-loopback MCP_HTTP_HOST is ignored and the override is logged:
Docker
The image listens on 0.0.0.0 inside the container (MCP_HTTP_HOST) and defaults to AUTH_MODE=gateway. Publish the port on loopback and pass a real S2S secret. In gateway mode the access token and realm id arrive on each request as X-Qbo-Access-Token and X-Qbo-Realm-Id; they are not read from the environment.
Compose refuses to start when CONDUIT_S2S_SECRET is unset, defaults AUTH_MODE to gateway, does not inject QBO_ACCESS_TOKEN or QBO_REALM_ID, and publishes 127.0.0.1:8080:8080:
Single-tenant HTTP (AUTH_MODE=env) still requires the S2S secret, then uses QBO_ACCESS_TOKEN and QBO_REALM_ID:
Environment Variables
Authentication
The server does not handle the OAuth flow — it consumes a pre-obtained access token. Two modes:
env mode (process default). Token comes from QBO_ACCESS_TOKEN (or from the file named by QBO_CREDENTIALS_FILE, which wins when both are set). Single tenant. The Docker image and Compose file default to gateway mode instead.
gateway mode. Token comes from per-request HTTP headers, isolated through AsyncLocalStorage so concurrent requests never share credentials. Set AUTH_MODE=gateway and send X-Qbo-Access-Token and X-Qbo-Realm-Id. A request missing either header gets HTTP 401 and does not fall back to QBO_ACCESS_TOKEN / QBO_REALM_ID in the process environment.
/health stays unauthenticated and does not read credentials. The stdio transport does not use CONDUIT_S2S_SECRET.
HTTP authentication
With MCP_TRANSPORT=http and CONDUIT_S2S_SECRET set, every /mcp request must include X-Gateway-S2S. The check is verifyS2sHeader in src/s2s-verify.ts: the header value is t=<unix seconds>,v1=<hex>, where the hex is HMAC-SHA256 of the literal string t=<unix seconds> keyed with CONDUIT_S2S_SECRET (64 lowercase hex characters). The timestamp must be within 300 seconds of the server clock. A missing or invalid header returns HTTP 401 before vendor credentials are read.
In AUTH_MODE=gateway, those X-Qbo-* headers are the only credential source for the request. With AUTH_MODE=env, the signed request uses QBO_ACCESS_TOKEN and QBO_REALM_ID from the environment when the headers are absent.
When QBO rejects the access token, the server returns an MCP error whose text begins with the literal prefix QBO_UNAUTHORIZED:. The intended contract is that the gateway detects this prefix, refreshes the OAuth token, and retries the request.
Token rotation (env mode)
QBO access tokens expire after ~60 minutes, so env-mode deployments typically rotate them with a cron job. A rotated token in a Docker env_file never reaches a running container: Docker injects env_file only at container creation, so docker restart keeps the old environment and the refresh loop silently becomes a no-op until calls start failing with QBO_UNAUTHORIZED / Token revoked (#63).
Set QBO_CREDENTIALS_FILE to skip environment reinjection entirely. The server re-reads the file on every request, so a rotation takes effect immediately — no restart or recreate at all:
Your refresh job then just rewrites ./secrets/qbo.env (dotenv format: QBO_ACCESS_TOKEN=..., optionally QBO_REALM_ID=... and QBO_ENV=...) and is done — drop the docker restart from the script. Mount the containing directory rather than the file itself: tools like sed -i replace the file's inode, and a single-file bind mount would keep pointing at the old one. If the file is missing or unreadable, tool calls fail loudly instead of silently falling back to a stale environment token.
If you'd rather keep plain env_file injection, the rotation script must recreate the container — docker compose up -d --force-recreate — a docker restart is never enough.
Sandbox Testing
Set QBO_ENV=sandbox (env mode) or X-Qbo-Environment: sandbox (gateway mode) to target Intuit's sandbox API at https://sandbox-quickbooks.api.intuit.com instead of production. Unrecognized values fail loudly (no silent fallback to production).
Available Tools
Tools are organized by domain. Call qbo_navigate with a domain name (e.g. customers, vendors, bills) to discover the tools in that domain. All tools are always callable — navigation is a discovery aid, not a prerequisite.
Entities (config-driven, 122 tools across 22 entities)
Each entity exposes some subset of list, get, create, update, void, search. Transactional entities support startDate/endDate filtering on the list operation. Updates are sparse and require the current SyncToken from a prior get. Void is exposed only where the QBO Accounting API supports it (Invoice uses ?operation=void; Payment uses ?operation=update&include=void). Customer has no void or delete — set Active to false on update to deactivate.
Sales workflow
qbo_customers_*— list, get, create, update, search (no void; deactivate withActive: false)qbo_invoices_*— list (Paid/Unpaid/Overdue status filter), get, create, update, void, sendqbo_estimates_*— list, get, create, updateqbo_sales_receipts_*— list, get, create, updateqbo_credit_memos_*— list, get, create, updateqbo_refund_receipts_*— list, get, create, updateqbo_payments_*— list, get, create, update, void
Purchase workflow
qbo_vendors_*— list, get, create, update, searchqbo_bills_*— list, get, create, update, searchqbo_bill_payments_*— list, get, create, updateqbo_vendor_credits_*— list, get, create, updateqbo_purchases_*— list, get, create, update (point-of-sale expenses)qbo_purchase_orders_*— list, get, create, update
Bank & money movement
qbo_deposits_*— list, get, create, updateqbo_transfers_*— list, get, create, updateqbo_journal_entries_*— list, get, create, update (balanced debit/credit)
Products & accounts
qbo_items_*— list, get, create, update, search (products and services)qbo_accounts_*— list, get, create, update, search (chart of accounts)
Classification & terms
qbo_classes_*— list, get, create, update, searchqbo_departments_*— list, get, create, update, searchqbo_terms_*— list, get, create, update, search (Net 30, etc.)qbo_payment_methods_*— list, get, create, update, search
Tax & company
qbo_tax_codes_*— list, get, search (read-only)qbo_tax_rates_*— list, get, search (read-only)qbo_company_info_*— list, get (read-only singleton)
People & time
qbo_employees_*— list, get, create, update, searchqbo_time_activities_*— list, get, create, update (billable time)
Attachments
qbo_attachables_*— list, get, create, update (metadata only; file upload uses a separate QBO endpoint)
Reports (10 tools)
qbo_reports_profit_and_lossqbo_reports_balance_sheetqbo_reports_cash_flowqbo_reports_trial_balanceqbo_reports_general_ledgerqbo_reports_aged_receivablesqbo_reports_aged_payablesqbo_reports_customer_salesqbo_reports_customer_balanceqbo_reports_vendor_expenses
Legacy expense tools (backwards compatibility)
qbo_expenses_list_purchases, qbo_expenses_get_purchase, qbo_expenses_list_bills, qbo_expenses_get_bill remain available. New work should use the dedicated qbo_purchases_* and qbo_bills_* tool families, which add create/update/search.
Testing
The integration suite calls one read tool per entity tier (customers, vendors, accounts, items, journal entries, company info) against Intuit's sandbox API. It only runs when both QBO_SANDBOX_ACCESS_TOKEN and QBO_SANDBOX_REALM_ID are present in the environment. CI wires these from the matching repo secrets and skips the job (with a clear notice) when they're absent — so dependabot/fork PRs don't fail.
License
Apache-2.0
来源:README.md,提交 af9cada
工具
0版本历史
1- v1.6.4最新Sep 16, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分