Skip to main content
Glama
ortizl20

qbo-mcp

by ortizl20

qbo-mcp

MCP connector so agents can operate QuickBooks Online for a bookkeeping tenant.

Bring your own Intuit app (BYOK). Door 1 ships a recorded Acme Bookkeeping fixture so you can prove the map without a live company. Payroll is dry-run only: confirm-screen defaults on, and this server never submits pay.

Clone: YOUR_GITHUB_ORG/qbo-mcp

Install

Node 20+.

git clone https://github.com/YOUR_GITHUB_ORG/qbo-mcp.git
cd qbo-mcp
cp .env.example .env
npm install
npm run build

.env.example is placeholders only. Leave them as-is to stay on the fixture path.

Related MCP server: QuickBooks Online MCP Server

Fixture path (no live tenant)

npm run oauth:fixture
node dist/index.js company
node dist/index.js employees
node dist/index.js salary emp-001 84000 --confirm
node dist/index.js payroll-status
node dist/index.js payroll-preview

Fixture employees are Jordan Lee and Sam Patel. Example annual salaries are round teaching numbers (60000, 72000) labeled EXAMPLE.

Screenshot-ready dry-run output:

  • fixtures/acme/payroll-preview.md

  • fixtures/acme/payroll-preview.html

MCP install (stdio)

Claude Desktop / Cursor mcp.json:

{
  "mcpServers": {
    "qbo": {
      "command": "node",
      "args": ["/absolute/path/to/qbo-mcp/dist/index.js"],
      "env": {
        "INTUIT_CLIENT_ID": "replace_with_your_intuit_client_id",
        "INTUIT_CLIENT_SECRET": "replace_with_your_intuit_client_secret",
        "INTUIT_REDIRECT_URI": "http://localhost:8000/callback",
        "INTUIT_ENV": "sandbox",
        "QBO_DRY_RUN": "1"
      }
    }
  }
}

Placeholder client id selects the recorded fixture automatically. Inspector:

npx @modelcontextprotocol/inspector node dist/index.js

Tools

Tool

What it does

qbo_oauth

Fixture sandbox completes immediately. Live mode returns your Intuit authorize URL.

qbo_read_company

Read company profile.

qbo_list_employees

List employees.

qbo_update_employee_salary

Set one employee's example annual salary. confirm defaults false.

qbo_payroll_status

Payroll run status (always not submitted).

qbo_payroll_preview

Dry-run totals and writes the preview files.

There is no submit-payroll tool.

Official Intuit contracts

Door 1 is mapped to published Intuit docs (not only MCP SDK docs). See docs/intuit-map.md.

node dist/index.js intuit-map

Area

Official source

Door 1

OAuth 2.0

Set up OAuth 2.0 + discovery

Authorize URL / token exchange builders. Fixture OAuth does not call Intuit.

Company + employees

Accounting REST CompanyInfo and SELECT * FROM Employee

Fixture returns official-shaped JSON.

Pay rates

Workforce GraphQL payrollEmployeeCompensations (Silver+, not in sandbox)

Recorded Acme fixture.

Payroll run

Payslips after a human runs payroll. No public create-run mutation.

Preview totals only. QBO_DRY_RUN=1.

No App Store submission. No production keys in this repo.

BYOK live app (optional)

Fill .env with your own Intuit app, keep INTUIT_ENV=sandbox and QBO_DRY_RUN=1, then call qbo_oauth with fixture=false to get the official authorize URL (response_type=code, scope com.intuit.quickbooks.accounting). Door 1 is proven on the fixture; live pay is out of scope.

Prove

bash scripts/prove-door1.sh
bash scripts/prove-firewall.sh

prove-door1.sh installs, builds, walks the fixture map over MCP, and runs the firewall grep. It exits 0 on success.

Out of scope

Live pay submit, social posts, Intuit App Store listing, and any household bank or bookkeeping login.

Available Tools

6 tools
qbo_list_employeesA

List employees for the connected company (Acme Bookkeeping fixture names on the prove path).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description must fully disclose behavior, but it only states the action 'List'. It does not explicitly confirm read-only safety, mention output format, or note any error conditions (e.g., missing connection). While 'List' implies a non-mutating operation, the lack of explicit disclosure leaves significant gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, focused sentence with no wasted words. It front-loads the core action and scope, and the additional parenthetical about fixture names is relevant context. This is appropriately concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple parameterless list tool, the description is mostly adequate, but it omits prerequisites (authentication/connection setup) and any details about the response. The mention of 'prove path' is ambiguous without further explanation, and the tool's behavior in error cases is unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is no schema or description burden to explain parameter meaning. A baseline of 4 is appropriate because the description correctly reflects the parameterless nature without adding unnecessary detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the verb 'List' and the resource 'employees', making the primary action unambiguous. It also names the specific context ('connected company') and test fixture ('Acme Bookkeeping'), clearly distinguishing it from sibling tools like qbo_update_employee_salary or qbo_oauth.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided about when to use this tool versus alternatives. The description only implies a prerequisite ('connected company') but does not mention that OAuth may be required first, nor does it contrast with other listing/reading tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qbo_oauthA

Connect OAuth. With placeholder Intuit app env this completes the recorded Acme fixture sandbox. Live mode returns an authorize URL for your own Intuit app.

ParametersJSON Schema
NameRequiredDescriptionDefault
fixtureNoUse the recorded fixture sandbox. Default true for Door 1.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure. It does explain the difference between placeholder env behavior (completes fixture) and live mode (returns authorize URL), which is valuable. However, it omits potential side effects, required credentials, or what the flow entails beyond the URL response.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences convey the purpose, behavior, and mode distinction with no filler. The key information is front-loaded and every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and no output schema, the description covers the essential behavioral modes. Minor gaps like required environment variables or how to use the returned URL are not critical for invocation, so the description is reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the parameter is already documented. The description adds context about fixture vs live mode but does not directly explain the 'fixture' parameter beyond implying its role. The schema already provides a clear description, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action ('Connect OAuth') and the resource, distinguishing it from sibling tools that read/update payroll data. However, it does not explicitly compare itself to siblings, so it misses the full differentiation mark.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains two modes (fixture sandbox vs live mode) with conditions implied by the environment, but it does not explicitly state when to use this tool over alternatives or provide any when-not-to-use guidance. Some context is given, but no exclusions or alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qbo_payroll_previewA

Fetch dry-run payroll preview totals and write screenshot-ready markdown/html. Confirm-screen defaults ON. Never submits payroll.

ParametersJSON Schema
NameRequiredDescriptionDefault
writeNoWrite payroll-preview.md and .html into the fixture directory.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It transparently discloses the dry-run nature, the side effect of writing files, the default behavior ('Confirm-screen defaults ON'), and the critical safety guarantee ('Never submits payroll'). This is strong transparency for a payroll-related tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the primary action, followed by critical safety and default info. Every sentence earns its place; no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is concise yet covers the essential behavior, safety, default settings, and output artifacts. It lacks explicit mention of return values, but no output schema exists and the tool's purpose is clear enough for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already fully documents the 'write' parameter with its default and description. The tool description adds context about writing markdown/html but does not directly explain the parameter's effect beyond what the schema states. Baseline 3 applies since schema coverage is 100%.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses specific verbs ('Fetch', 'write') and names the resource (dry-run payroll preview totals, markdown/html). It clearly distinguishes itself from siblings by emphasizing it never submits payroll, so the agent knows exactly what this tool does and does not do.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use case (dry-run preview before actual submission) and states a key exclusion ('Never submits payroll'), but does not explicitly say when to choose this tool over alternatives or mention any prerequisites. Usage context is implied rather than directly stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qbo_payroll_statusB

Fetch payroll run status. Door 1 is always dry-run / not submitted.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses a key invariant: 'Door 1 is always dry-run / not submitted,' which adds behavioral context beyond a simple status fetch. However, with no annotations provided, the description carries the full burden of explaining side effects, output structure, or other behavioral nuances. It does not clarify whether this is a read-only operation or describe the response format, though 'fetch' implies read-only.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with no redundant filler. The primary action is stated upfront, and the Door 1 caveat is a concise but essential addition that earns its place. Every word contributes value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description would need to clarify what the tool returns to make it fully complete. It mentions 'status' and the Door 1 rule, but does not describe the overall return shape, possible statuses, or whether multiple doors are included. Without that, an agent may struggle to correctly interpret the response, though the simplicity of the tool mitigates the gap. The description is adequate for initiating a call but leaves some ambiguity for downstream use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the input schema is empty, so there is no parameter complexity to document. Per the baseline for 0-parameter tools, a score of 4 is appropriate; the description adds no parameter information because none is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'fetch' with resource 'payroll run status', clearly identifying the tool's function. The additional note about Door 1 provides scoping detail, but it does not explicitly differentiate from the sibling qbo_payroll_preview, leaving some ambiguity about the exact boundary between them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives like qbo_payroll_preview. The Door 1 note is a behavioral caveat, not a usage directive. Without explicit 'use when' or 'instead of' information, an agent must infer the appropriate context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qbo_read_companyA

Read the connected QuickBooks Online company profile.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. 'Read' clearly signals a non-mutating operation, and 'connected' hints at an authentication prerequisite, but the description does not disclose what the profile contains, what happens if no connection exists, or any other runtime behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence states the verb, object, and connection context with zero filler. Every word contributes meaning, making this appropriately concise for such a simple tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read operation with no output schema and no annotations, the description provides enough information for an agent to select and invoke the tool correctly. Minor gaps are the lack of explicit return-value detail and any statement about ordering relative to qbo_oauth, but neither is necessary for basic invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, so schema-description coverage is vacuously 100%. With no parameters to document, the description does not need to add parameter-level detail, and the 0-parameter baseline of 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Read') and a specific resource ('connected QuickBooks Online company profile'), making the tool's purpose immediately obvious. The resource is distinct from the sibling tools, which target OAuth, employees, salary, and payroll, so there is no ambiguity about what this tool retrieves.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'connected' implies this tool should be used after OAuth has been established, but the description does not explicitly state when to use it versus alternatives or mention any exclusions. For a simple read-only tool, the usage context is reasonably implied, but no explicit routing guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qbo_update_employee_salaryA

Update one employee's example annual salary. Confirm-screen defaults ON; pass confirm=true to apply. Never submits payroll.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be true to apply. Default false (confirm screen).
employee_idYesFixture employee id, e.g. emp-001
annual_salaryYesExample annual salary. Use a round teaching number such as 60000.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and discloses the most important behaviors: default confirm-screen state, the confirm=true requirement to apply, and the 'never submits payroll' limitation. It doesn't discuss auth, side effects, or return values, but the key operational traits are covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, front-loaded sentences with no filler. It states the action, then the confirmation requirement, then the key non-payroll boundary. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple 3-parameter tool with no annotations or output schema, it provides essential context: what is updated, that it's an example salary, the confirm gate, and that it never submits payroll. It omits return behavior and auth requirements, but the confirmation-flow disclosure makes the call behavior sufficiently clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents employee_id, annual_salary, and confirm. The description's confirm wording largely restates the schema's 'Must be true to apply. Default false (confirm screen).' and adds little beyond what is already structured.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb ('Update') plus resource ('one employee's example annual salary') and an explicit boundary ('Never submits payroll'), which distinguishes it from the payroll-related sibling tools. An agent can tell exactly what this tool does and what it is not for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear operational guidance: confirm screen is default behavior, pass confirm=true to apply, and never submit payroll. It gives a useful when-not-to-use signal, though it doesn't explicitly name a sibling alternative for payroll submission.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

A3.8/5.0
Disambiguation4/5

Each tool targets a distinct area: OAuth, company read, employee listing, salary update, payroll status, and payroll preview. The only potential confusion is qbo_payroll_status vs qbo_payroll_preview, since both concern the dry-run payroll path, but the descriptions clarify that one reports run status while the other produces preview totals and output artifacts.

Naming Consistency4/5

All tools share the qbo_ prefix and snake_case style, and most follow a verb_noun pattern (read_company, list_employees, update_employee_salary). Minor deviations exist: qbo_oauth is a bare noun and the two payroll tools are noun phrases, but the overall pattern remains predictable and readable.

Tool Count5/5

Six tools is well-scoped for a QuickBooks employee/payroll integration. Each tool earns its place, covering a step in the auth → company → employees → payroll workflow without padding or bloat.

Completeness4/5

The core workflow is covered: authenticate, read company, list employees, update salary, preview payroll, and check status. Minor gaps like employee creation/deletion, company update, and actual payroll submission are absent, but the payroll submission omission appears intentional given the repeated 'never submits payroll' notes, so agents can still complete the intended workflow.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to query and manage QuickBooks Online data through natural language, including customers, invoices, bills, vendors, accounts, and financial reports.
    7
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Enables interaction with the QuickBooks Online Accounting API to manage customers, invoices, expenses, and payments through MCP-compatible clients. It supports comprehensive financial workflows and the generation of reports like Profit and Loss or Balance Sheets.
    133
    2
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables full CRUD operations on 29 QuickBooks Online entity types and 11 financial reports via natural language, allowing users to manage customers, invoices, payments, and more through MCP-compatible clients.
    Apache 2.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables QuickBooks Online integration for financial management with CRUD operations, reporting, real-time updates, and automation.
    30
    3
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ortizl20/qbo-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server