Skip to main content
Glama
wyre-technology

QuickBooks Online MCP Server

qbo_navigate

Navigate to a QuickBooks Online domain to enable tools for managing customers, invoices, expenses, payments, or reports.

Instructions

Navigate to a specific domain in QuickBooks Online. Call this first to select which area you want to work with. After navigation, domain-specific tools will be available.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
domainYesThe domain to navigate to: - customers: Customer management - list, get, create, and search customers - invoices: Invoice management - list, get, create invoices and send them by email - expenses: Expense tracking - list and view purchases and bills - payments: Payment management - list, get, and create payments linked to invoices - reports: Financial reports - profit & loss, balance sheet, aged receivables/payables, customer sales

Implementation Reference

  • Tool definition and input schema for 'qbo_navigate'. Defines the tool name, description, and input schema with a required 'domain' enum property (customers, invoices, expenses, payments, reports).
    const navigateTool: Tool = {
      name: "qbo_navigate",
      description:
        "Navigate to a specific domain in QuickBooks Online. Call this first to select which area you want to work with. After navigation, domain-specific tools will be available.",
      inputSchema: {
        type: "object",
        properties: {
          domain: {
            type: "string",
            enum: [
              "customers",
              "invoices",
              "expenses",
              "payments",
              "reports",
            ],
            description: `The domain to navigate to:
    - customers: ${domainDescriptions.customers}
    - invoices: ${domainDescriptions.invoices}
    - expenses: ${domainDescriptions.expenses}
    - payments: ${domainDescriptions.payments}
    - reports: ${domainDescriptions.reports}`,
          },
        },
        required: ["domain"],
      },
    };
  • src/index.ts:160-173 (registration)
    Registration of qbo_navigate via ListToolsRequestSchema handler. When state.currentDomain is null, the navigateTool is pushed into the available tools list, making it the entry point tool.
    server.setRequestHandler(ListToolsRequestSchema, async () => {
      const tools: Tool[] = [];
    
      if (state.currentDomain === null) {
        // At root - show navigation tool only
        tools.push(navigateTool);
      } else {
        // In a domain - show domain tools plus back navigation
        tools.push(backTool);
        tools.push(...getDomainTools(state.currentDomain));
      }
    
      return { tools };
    });
  • Handler for 'qbo_navigate' tool call (line 183-198). Extracts the 'domain' argument, sets state.currentDomain to it, retrieves domain-specific tools, and returns a success message listing available tools for that domain.
    server.setRequestHandler(CallToolRequestSchema, async (request) => {
      const { name, arguments: args } = request.params;
    
      try {
        // Handle navigation
        if (name === "qbo_navigate") {
          const { domain } = args as { domain: Domain };
          state.currentDomain = domain;
    
          const domainTools = getDomainTools(domain);
          const toolNames = domainTools.map((t) => t.name).join(", ");
    
          return {
            content: [
              {
                type: "text",
                text: `Navigated to ${domain} domain. Available tools: ${toolNames}`,
              },
            ],
          };
        }
    
        // Handle back navigation
        if (name === "qbo_back") {
          state.currentDomain = null;
          return {
            content: [
              {
                type: "text",
                text: "Returned to domain selection. Use qbo_navigate to select a domain: customers, invoices, expenses, payments, reports",
              },
            ],
          };
        }
    
        // Route to appropriate domain handler
        const toolArgs = (args ?? {}) as Record<string, unknown>;
    
        if (name.startsWith("qbo_customers_")) {
          return await handleCustomerTool(name, toolArgs);
        }
        if (name.startsWith("qbo_invoices_")) {
          return await handleInvoiceTool(name, toolArgs);
        }
        if (name.startsWith("qbo_expenses_")) {
          return await handleExpenseTool(name, toolArgs);
        }
        if (name.startsWith("qbo_payments_")) {
          return await handlePaymentTool(name, toolArgs);
        }
        if (name.startsWith("qbo_reports_")) {
          return await handleReportTool(name, toolArgs);
        }
    
        // Unknown tool
        return {
          content: [
            {
              type: "text",
              text: `Unknown tool: ${name}. Use qbo_navigate to select a domain first.`,
            },
          ],
          isError: true,
        };
      } catch (error) {
        const message = error instanceof Error ? error.message : String(error);
        return {
          content: [{ type: "text", text: `Error: ${message}` }],
          isError: true,
        };
      }
    });
Behavior2/5

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

No annotations are provided, so the description must carry the burden. It does not disclose any behavioral traits beyond navigation, such as whether the tool is read-only, destructive, or if it changes state. The absence of side effect description leaves the agent uninformed about safety implications.

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 concise with only two sentences, each serving a distinct purpose: stating the action and providing usage guidance. No redundant or unnecessary words are present.

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 is largely complete. It explains the tool's role and the effect of navigation. A minor gap is the lack of information about behavior if already in the target domain, but overall it is sufficient.

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 has 100% coverage and includes detailed descriptions for the 'domain' parameter. The tool description adds no additional semantics beyond what is already in the schema. Baseline score of 3 is appropriate.

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 clearly states the tool's purpose with a specific verb ('Navigate') and resource ('domain in QuickBooks Online'). It also explains the context: 'Call this first to select which area you want to work with.' This provides clarity on its role as an initial selector.

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?

The description explicitly tells when to use the tool ('call this first') and what follows ('domain-specific tools will be available'). However, it does not mention when not to use it or provide alternatives, which is acceptable given the lack of sibling tools.

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

Install Server

Other Tools

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/wyre-technology/qbo-mcp'

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