Skip to content

MCP Server Setup

Syntra ODBC includes a built-in MCP (Model Context Protocol) server that lets AI assistants query, write, and run QuickBooks Desktop’s native reports through natural language or direct tool calls.

Any MCP-compatible tool works, including:

  • Claude Code (CLI)
  • Claude Desktop
  • Cursor
  • Windsurf
  • VS Code (with MCP extensions)
  • JetBrains IDEs
  • Gemini CLI

The AI tool spawns syntra-odbc.exe --mcp-stdio as a subprocess. Zero configuration, instant connection.

Add this to your MCP settings:

{
"mcpServers": {
"quickbooks": {
"command": "syntra-odbc.exe",
"args": ["--mcp-stdio"]
}
}
}

Where to put this:

  • Claude Code: ~/.claude/settings.json or project .claude/settings.json
  • Cursor: Settings → MCP Servers
  • Windsurf: MCP configuration file

When the Syntra ODBC GUI is running, an MCP endpoint is exposed on port 5434 by default. The endpoint speaks the MCP Streamable HTTP transport, which is SSE-compatible.

Step 1. Enable the network MCP server in config.toml:

[mcp]
enabled = true
host = "127.0.0.1"
port = 5434

Or toggle it in the GUI: SettingsMCP ServerEnable.

Step 2. Point your AI tool’s MCP settings at the URL:

{
"mcpServers": {
"quickbooks": {
"type": "http",
"url": "http://127.0.0.1:5434/"
}
}
}

The MCP server exposes tools grouped by purpose.

ToolDescription
list_tablesDiscover all QuickBooks entity tables, including line tables and singletons
describe_tableGet column definitions, types, writability, and required-for-insert flags
accounting_guideBuilt-in QuickBooks knowledge base covering AR, AP, chart of accounts, sales tax, inventory, job costing, payroll, reconciliation, and more
list_native_reportsList every native QuickBooks report currently exposed through Syntra’s shared report engine
ToolDescription
queryRun SQL directly against Syntra’s PostgreSQL-compatible interface

These tools return accountant-friendly JSON shaped for common workflows, while still using the native QuickBooks report engine where applicable.

ToolDescription
customer_balanceOpen balances by customer, optionally filtered to one customer name
net_sales_by_periodNet sales matching QuickBooks sales summary logic over a date range
profit_and_lossNative QuickBooks Profit & Loss for the requested date range, returned as structured income / COGS / expense sections
balance_sheetNative QuickBooks Balance Sheet for the requested as-of date, grouped into assets, liabilities, and equity
trial_balanceNative QuickBooks Trial Balance with debit and credit columns for the requested as-of date
ar_aging_reportAR aging from open invoices and statement charges
ap_aging_reportAP aging from open bills

These tools expose QuickBooks Desktop’s report engine directly.

ToolDescription
qb_reportRun any supported native report and return a human-oriented wide JSON shape with one row object per report line
qb_report_rawRun any supported native report and return the raw normalized columns-and-cells JSON shape
general_ledger_reportNative General Ledger report for a date range
journal_reportNative Journal report for a date range
audit_trail_reportNative Audit Trail report for a date range
inventory_valuation_summaryNative Inventory Valuation Summary for an as-of date
inventory_valuation_detailNative Inventory Valuation Detail for a date range
ToolDescription
insert_recordCreate new records. Supports nested _lines arrays for invoices, sales receipts, credit memos, bills, inventory adjustments, journal entries, estimates, sales orders, purchase orders, and build assemblies in one call
update_recordModify existing records by SQL WHERE clause, with automatic edit-sequence handling
delete_recordDelete records by ID (ListID or TxnID)
void_transactionVoid invoices, checks, bill payments, sales receipts, and credit memos
preview_journal_entryValidate accounts and confirm debits = credits before any write
ToolDescription
cache_statusCheck per-entity sync freshness and last sync timestamps
connection_statusView QuickBooks connection state, company file, edition, and QBXML version

Persistent, scoped memory that survives across MCP sessions. Use these to give your AI assistant durable context about your vendors, customers, and naming conventions.

ToolDescription
get_customer_contextLoad confirmed line aliases, profile, and recent decisions for a customer in one call. Use at the start of any AR workflow
get_vendor_contextLoad confirmed line aliases, profile, and recent decisions for a vendor in one call. Use at the start of any AP workflow (bill booking, statement reconciliation)
learn_customer_line_aliasRemember that a raw customer PO line text maps to an internal inventory item
learn_vendor_line_aliasRemember that a raw vendor invoice line text maps to an internal inventory item
recall_factsSearch scoped key-value facts using SQL LIKE patterns
record_factPersist a scoped key-value fact across sessions

Native report parameters and customization

Section titled “Native report parameters and customization”

qb_report and the report-specific wrappers accept the same date arguments you would expect from QuickBooks:

  • range reports: start_date + end_date
  • as-of reports: as_of_date
  • no-date reports: no dates at all

The generic qb_report tool accepts:

  • report_type
  • start_date
  • end_date
  • as_of_date
  • options_json

options_json is a string containing JSON, not a nested object. Use it for native QuickBooks modifiers and filters such as:

  • report_basis
  • report_date_macro
  • report_detail_level_filter
  • report_posting_status_filter
  • account_filter
  • entity_filter
  • item_filter
  • class_filter
  • txn_type_filter_list
  • summarize_columns_by
  • include_subcolumns
  • return_rows
  • return_columns
  • summarize_rows_by
  • include_column_list
  • include_accounts
  • report_open_balance_as_of

Example qb_report parameters:

{
"report_type": "InventoryValuationSummary",
"as_of_date": "2026-03-31",
"options_json": "{\"report_basis\":\"Accrual\"}"
}

Example with an account filter:

{
"report_type": "MissingChecks",
"start_date": "2026-01-01",
"end_date": "2026-03-31",
"options_json": "{\"account_filter\":{\"full_names\":[\"Bank of America\"]}}"
}
  • MissingChecks requires an explicit account selection by full_names, list_ids, full_name_with_children, or list_id_with_children. type_filter alone is not enough.
  • PhysicalInventoryWorksheet must be called with no dates.
  • Some reports depend on QuickBooks features or setup. When Syntra knows a report would otherwise trigger a QuickBooks modal dialog, it blocks the request and returns an explicit error instead of freezing the session.
  • qb_report returns the human-oriented wide JSON shape. Use qb_report_raw if you need the underlying normalized report columns and cells.

For the full SQL-side procedure reference and more examples, see Native Reports.

Line-bearing transactions (invoices, bills, inventory adjustments, journal entries, and more) must be inserted as a single qbXML Add request containing the header and every line item. The MCP server exposes this through a _lines array on the insert_record payload.

Inventory adjustment (set CUSTOM ITEM 3 to 500 pcs from 615)

Section titled “Inventory adjustment (set CUSTOM ITEM 3 to 500 pcs from 615)”
{
"table": "inventory_adjustments",
"data": {
"account_ref_list_id": "8000002F-1754012118",
"txn_date": "2026-04-07",
"memo": "Adjust CUSTOM ITEM 3 to 500 pcs",
"_lines": [
{
"item_ref_list_id": "80000042-1719080577",
"quantity_difference": -115
}
]
}
}
{
"table": "invoices",
"data": {
"customer_ref_full_name": "Acme:Job 1",
"txn_date": "2026-04-07",
"_lines": [
{ "item_ref_full_name": "Hours", "quantity": 4, "rate": 150.00 },
{ "item_ref_full_name": "Travel", "quantity": 1, "amount": 75.00 }
]
}
}
{
"table": "journal_entries",
"data": {
"txn_date": "2026-04-07",
"_lines": [
{ "journal_line_type": "Debit", "account_ref_full_name": "Office Supplies", "amount": 100.00, "memo": "April supplies" },
{ "journal_line_type": "Credit", "account_ref_full_name": "Checking", "amount": 100.00, "memo": "April supplies" }
]
}
}
{
"table": "invoices",
"data": [
{ "customer_ref_full_name": "Customer A", "_lines": [ /* ... */ ] },
{ "customer_ref_full_name": "Customer B", "_lines": [ /* ... */ ] }
]
}

The response returns the new TxnID or ListID values in the returning array so you can immediately query, void, or delete the record you just created.

The MCP server also exposes resources organized into schema/status, accounting overviews, and per-topic accounting guides.

ResourceURI
Table catalogqb://schema/tables
Per-table schemaqb://schema/{table}
Cache healthqb://status/cache
Connection infoqb://status/connection
ResourceURI
Accounting overviewqb://accounting/overview
Accounting topic listqb://accounting/topics
Accounting query patternsqb://accounting/query-patterns

One resource per accounting_guide topic.

qb://accounting/topic/{topic} where {topic} is one of ar, ap, chart_of_accounts, sales, sales_tax, pricing, multi_currency, inventory, job_costing, payroll, journal_entries, entity_relationships, gotchas, financial_statements, transaction_universe, amount_fields, report_parity, nested_inserts, or reconciliation.

Accounting:

“We paid $500 for office supplies with the company credit card, book it”

The AI can look up your chart of accounts, preview the journal entry, and write the final transaction after confirmation.

Native reporting:

“Show me the inventory valuation summary as of March 31, 2026 on accrual basis”

The AI can call inventory_valuation_summary directly or use qb_report with report_type = InventoryValuationSummary and options_json = {"report_basis":"Accrual"}.

Data lookup:

“What’s the email for customer Acme Corp?”

The AI can run a SQL query such as SELECT email, phone FROM customers WHERE full_name LIKE '%Acme%'.

  • Built on the official MCP SDK from the Model Context Protocol maintainers
  • Shares the same session context, cache, and QuickBooks COM session as the SQL server
  • Exposes both curated accounting tools and QuickBooks native reports through the same application
  • Uses the same write pipeline for insert_record, update_record, delete_record, and void_transaction as the SQL server