Laravel QuickBooks MCP

Um pacote Composer PHP/Laravel de primeira parte que expõe o QuickBooks Online (QBO) como um servidor Model Context Protocol (MCP).

Documentação

Laravel QuickBooks MCP

Um pacote Composer PHP/Laravel de primeira parte que expõe o QuickBooks Online (QBO) como um servidor Model Context Protocol (MCP). Clientes de IA — Claude, Cursor, n8n e outros — conectam-se via HTTP e realizam operações completas de CRUD em entidades QBO usando linguagem natural.

Esta é a primeira implementação de MCP para PHP/Laravel QuickBooks no ecossistema.


Recursos

  • 50 ferramentas MCP cobrindo 11 entidades QBO (clientes, fornecedores, faturas, contas a pagar, orçamentos, compras, funcionários, itens, contas, lançamentos contábeis e pagamentos de contas)
  • Transporte HTTP remoto — não é stdio local, então funciona com qualquer cliente de IA hospedado
  • Multi-tenant — múltiplas empresas QBO por instalação Laravel
  • Resolução nome-para-ID — agentes passam nomes legíveis; a busca de IDs acontece automaticamente
  • Fluxo OAuth 2.0 completo — qualquer usuário SaaS pode conectar sua própria empresa QBO
  • Pronto para produção desde o primeiro dia (sandbox também é suportado)
  • Autenticação nativa Laravel — funciona com Passport ou Sanctum, sem suposições

Requisitos

RequisitoVersão
PHP>= 8.2
Laravel>= 11.x
laravel/mcp^1.0
spinen/laravel-quickbooks-client^4.0

Seu aplicativo host também deve ter:

  • Uma tabela users com uma coluna id (padrão Laravel)
  • O trait HasQuickBooksToken do spinen/laravel-quickbooks-client no modelo User
  • Pelo menos um guard de autenticação configurado que resolva auth()->user() a partir de um token Bearer (Passport ou Sanctum)

Instalação

1. Instalar via Composer

composer require rajurayhan/laravel-quickbooks-mcp-server

2. Publicar os assets do pacote

# Publish config
php artisan vendor:publish --tag=quickbooks-mcp-config

# Publish migrations
php artisan vendor:publish --tag=quickbooks-mcp-migrations

# Publish routes stub
php artisan vendor:publish --tag=quickbooks-mcp-routes

# Or publish everything at once
php artisan vendor:publish --provider="Raju\QuickBooksMcp\QuickBooksMcpServiceProvider"

3. Executar as migrações

php artisan migrate

Isso cria uma tabela: quickbooks_connections.

4. Configurar seu .env

# Intuit app credentials (from developer.intuit.com)
QUICKBOOKS_CLIENT_ID=your_intuit_app_client_id
QUICKBOOKS_CLIENT_SECRET=your_intuit_app_client_secret
QUICKBOOKS_REDIRECT_URI=https://yourdomain.com/quickbooks/callback
QUICKBOOKS_SCOPE=com.intuit.quickbooks.accounting
QUICKBOOKS_DATA_SOURCE=production   # or: development (sandbox)

# MCP server settings
QBO_MCP_PATH=mcp/quickbooks
QBO_TOKEN_REFRESH_BUFFER=5

5. Registrar as rotas publicadas

Abra routes/quickbooks-mcp.php (publicado na pasta routes/ do seu aplicativo) e registre-o no seu aplicativo. Escolha uma das opções:

Opção A — em app/Providers/AppServiceProvider.php:

public function boot(): void
{
    Route::middleware('web')
        ->group(base_path('routes/quickbooks-mcp.php'));
}

Opção B — no final de routes/web.php ou routes/api.php:

require base_path('routes/quickbooks-mcp.php');

6. Definir seu guard de autenticação

Dentro de routes/quickbooks-mcp.php, altere auth:api para corresponder ao guard de token Bearer do seu aplicativo:

// Change 'api' to 'sanctum' if your app uses Laravel Sanctum
Route::middleware([
    'api',
    'auth:api',   // ← change this line if needed
    ResolveQuickBooksRealm::class,
    RefreshQuickBooksToken::class,
])->group(function () {
    Mcp::server(QuickBooksServer::class)->at(config('quickbooks-mcp.path'));
});

7. Registrar seu URI de callback OAuth da Intuit

Nas configurações do aplicativo Intuit Developer, adicione este URI de redirecionamento:

https://yourdomain.com/quickbooks/callback

Ele deve corresponder exatamente à rota /quickbooks/callback.

8. Adicionar HasQuickBooksToken ao seu modelo User

use Spinen\QuickBooks\HasQuickBooksToken;

class User extends Authenticatable
{
    use HasQuickBooksToken;
    // ...
}

Fluxo OAuth

Uma vez instalado, um usuário SaaS conecta sua empresa QBO através do seu aplicativo:

1. User visits GET /quickbooks/connect
   → Redirected to Intuit consent screen
   → Grants access to their QBO company
   → Redirected back to GET /quickbooks/callback

2. Callback handler:
   → Exchanges auth code for tokens (stored by spinen in quickbooks_tokens)
   → Package records connection in quickbooks_connections (realm_id + company_name)

3. User authenticates your app with their existing Bearer token (Passport or Sanctum)

4. AI client is configured with:
   MCP URL:  https://yourdomain.com/mcp/quickbooks
   Header:   Authorization: Bearer <bearer-token>

5. Every MCP tool call thereafter:
   → Guard authenticates the Bearer token
   → ResolveQuickBooksRealm finds the user's active QBO connection
   → RefreshQuickBooksToken silently refreshes QBO tokens near expiry
   → Tool runs — zero extra params needed from the AI agent

Rotas de gerenciamento de conexão

MétodoRotaDescrição
GET/quickbooks/connectRedirecionar para a tela de consentimento OAuth da Intuit
GET/quickbooks/callbackLidar com o callback OAuth e armazenar tokens
DELETE/quickbooks/disconnectRevogar tokens QBO e remover conexão
GET/quickbooks/connectionsListar conexões QBO ativas do usuário

Configuração

config/quickbooks-mcp.php:

ChavePadrãoDescrição
pathmcp/quickbooksCaminho da URL onde o servidor MCP é exposto
multi_tenanttrueResolver realm a partir do usuário autenticado
search_limit20Limite padrão de resultados para ferramentas de busca
search_limit_max100Limite máximo de resultados para ferramentas de busca
environmentproductionAmbiente QBO (production ou development)
redirect_uriAPP_URL/quickbooks/callbackURI de redirecionamento OAuth
token_refresh_buffer_minutes5Minutos antes da expiração para renovar proativamente

Ferramentas Disponíveis

Conta (3 ferramentas)

FerramentaDescrição
create_accountCriar uma nova conta no plano de contas
search_accountsBuscar contas por nome ou tipo
update_accountAtualizar uma conta existente

Conta a Pagar (5 ferramentas)

FerramentaDescrição
create_billCriar uma nova conta a pagar
get_billObter uma conta a pagar por ID
search_billsBuscar contas a pagar por fornecedor, intervalo de datas ou status de não pago
update_billAtualizar uma conta a pagar existente
delete_billExcluir permanentemente uma conta a pagar

Pagamento de Conta (5 ferramentas)

FerramentaDescrição
create_bill_paymentPagar uma ou mais contas a pagar em aberto
get_bill_paymentObter um pagamento de conta por ID
search_bill_paymentsBuscar pagamentos de contas por fornecedor ou intervalo de datas
update_bill_paymentAtualizar um pagamento de conta existente
delete_bill_paymentExcluir permanentemente um pagamento de conta

Cliente (5 ferramentas)

FerramentaDescrição
create_customerCriar um novo cliente
get_customerObter um cliente por ID
search_customersBuscar clientes por nome, e-mail ou empresa
update_customerAtualizar um cliente existente
delete_customerDesativar um cliente (exclusão suave do QBO)

Funcionário (4 ferramentas)

FerramentaDescrição
create_employeeCriar um novo registro de funcionário
get_employeeObter um funcionário por ID
search_employeesBuscar funcionários por nome ou e-mail
update_employeeAtualizar um funcionário existente

Orçamento (5 ferramentas)

FerramentaDescrição
create_estimateCriar um novo orçamento / cotação
get_estimateObter um orçamento por ID
search_estimatesBuscar orçamentos por cliente, status ou intervalo de datas
update_estimateAtualizar ou alterar o status de um orçamento
delete_estimateExcluir permanentemente um orçamento

Fatura (4 ferramentas)

FerramentaDescrição
create_invoiceCriar uma nova fatura
read_invoiceLer uma fatura completa com todos os itens de linha
search_invoicesBuscar faturas por cliente, intervalo de datas ou status de pagamento
update_invoiceAtualizar uma fatura existente

Faturas não podem ser excluídas permanentemente no QBO.

Item (4 ferramentas)

FerramentaDescrição
create_itemCriar um novo item de produto ou serviço
read_itemLer um registro completo de item com preços e atribuições de conta
search_itemsBuscar itens por nome ou tipo
update_itemAtualizar um item existente (defina active: false para desativar)

Itens não podem ser excluídos permanentemente no QBO.

Lançamento Contábil (5 ferramentas)

FerramentaDescrição
create_journal_entryCriar um lançamento contábil (débitos devem ser iguais a créditos)
get_journal_entryObter um lançamento contábil por ID
search_journal_entriesBuscar lançamentos contábeis por intervalo de datas ou número de documento
update_journal_entryAtualizar um lançamento contábil existente
delete_journal_entryExcluir permanentemente um lançamento contábil

Compra (5 ferramentas)

FerramentaDescrição
create_purchaseCriar uma transação de compra / despesa
get_purchaseObter uma compra por ID
search_purchasesBuscar compras por tipo de pagamento ou intervalo de datas
update_purchaseAtualizar uma compra existente
delete_purchaseExcluir permanentemente uma compra

Fornecedor (5 ferramentas)

FerramentaDescrição
create_vendorCriar um novo fornecedor
get_vendorObter um fornecedor por ID
search_vendorsBuscar fornecedores por nome, e-mail ou empresa
update_vendorAtualizar um fornecedor existente
delete_vendorDesativar um fornecedor (exclusão suave do QBO)

Resolução de Nomes

Ferramentas que referenciam entidades relacionadas (fornecedor, cliente, conta, item) aceitam tanto um nome quanto um ID numérico. O pacote resolve nomes para IDs automaticamente antes de chamar a API QBO.

# These are equivalent when calling create_bill:
vendor: "Office Depot"
vendor: "42"

Se um nome não puder ser encontrado, a ferramenta retorna um erro descritivo com uma sugestão para usar a ferramenta de busca correspondente primeiro.


Comportamento de Exclusão

O QBO tem duas categorias de exclusão:

ComportamentoEntidades
Exclusão suave — define Active = falseCliente, Fornecedor, Funcionário, Item, Conta
Exclusão definitiva — removido permanentementeConta a Pagar, Pagamento de Conta, Orçamento, Lançamento Contábil, Compra
Não pode ser excluídoFatura, Item (use update_item com active: false)

Arquitetura Multi-Tenant

Cada usuário autenticado tem exatamente uma conexão QBO ativa rastreada na tabela quickbooks_connections. O middleware ResolveQuickBooksRealm automaticamente limita cada chamada de ferramenta à empresa QBO correta — nenhum parâmetro realm_id é necessário do agente de IA.


Arquitetura do Pacote

src/
├── QuickBooksMcpServiceProvider.php   — registers service, publishes assets
├── Server/QuickBooksServer.php        — MCP server, registers all 50 tools
├── Services/QuickBooksService.php     — QBO API wrapper, name resolvers
├── Concerns/ResolvesEntityNames.php   — trait for name-to-ID resolution
├── Http/
│   ├── Controllers/QuickBooksOAuthController.php
│   └── Middleware/
│       ├── ResolveQuickBooksRealm.php — scopes QBO service to user's company
│       └── RefreshQuickBooksToken.php — proactive token refresh
├── Models/QuickBooksConnection.php    — tracks user ↔ QBO company links
├── Exceptions/
│   ├── QuickBooksAuthException.php
│   └── QuickBooksToolException.php
└── Tools/                             — 50 tool classes across 11 entities
    ├── Account/, Bill/, BillPayment/, Customer/, Employee/
    ├── Estimate/, Invoice/, Item/, JournalEntry/
    ├── Purchase/, Vendor/

Licença

MIT — veja LICENSE para detalhes.


Autor

Raju Rayhangithub.com/rajurayhan