Laravel QuickBooks MCP

Un paquete Composer de PHP/Laravel de primera parte que expone QuickBooks Online (QBO) como un servidor del Protocolo de Contexto de Modelo (MCP).

Documentación

Laravel QuickBooks MCP

Un paquete Composer de PHP/Laravel de primera parte que expone QuickBooks Online (QBO) como un servidor de Model Context Protocol (MCP). Los clientes de IA — Claude, Cursor, n8n y otros — se conectan a través de HTTP y realizan operaciones CRUD completas sobre entidades de QBO usando lenguaje natural.

Esta es la primera implementación de QuickBooks MCP en PHP/Laravel del ecosistema.


Características

  • 50 herramientas MCP que cubren 11 entidades de QBO (clientes, proveedores, facturas, cuentas por pagar, presupuestos, compras, empleados, artículos, cuentas, asientos de diario y pagos de facturas)
  • Transporte HTTP remoto — no es stdio local, por lo que funciona con cualquier cliente de IA alojado
  • Multiinquilino — múltiples empresas de QBO por instalación de Laravel
  • Resolución de nombre a ID — los agentes pasan nombres legibles por humanos; las búsquedas de ID ocurren automáticamente
  • Flujo OAuth 2.0 completo — cualquier usuario de SaaS puede conectar su propia empresa de QBO
  • Listo para producción desde el primer día (sandbox también compatible)
  • Autenticación nativa de Laravel — funciona con Passport o Sanctum, sin suposiciones

Requisitos

RequisitoVersión
PHP>= 8.2
Laravel>= 11.x
laravel/mcp^1.0
spinen/laravel-quickbooks-client^4.0

Tu aplicación anfitriona también debe tener:

  • Una tabla users con una columna id (Laravel estándar)
  • El trait HasQuickBooksToken de spinen/laravel-quickbooks-client en el modelo User
  • Al menos un guard de autenticación configurado que resuelva auth()->user() a partir de un token Bearer (Passport o Sanctum)

Instalación

1. Instalar vía Composer

composer require rajurayhan/laravel-quickbooks-mcp-server

2. Publicar los assets del paquete

# 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. Ejecutar las migraciones

php artisan migrate

Esto crea una tabla: quickbooks_connections.

4. Configurar tu .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 las rutas publicadas

Abre routes/quickbooks-mcp.php (publicado en la carpeta routes/ de tu aplicación) y regístralo en tu aplicación. Elige una de las siguientes opciones:

Opción A — en app/Providers/AppServiceProvider.php:

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

Opción B — al final de routes/web.php o routes/api.php:

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

6. Configurar tu guard de autenticación

Dentro de routes/quickbooks-mcp.php, cambia auth:api para que coincida con el guard de token Bearer de tu aplicación:

// 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 tu URI de callback OAuth de Intuit

En la configuración de tu aplicación de desarrollador de Intuit, añade esta URI de redirección:

https://yourdomain.com/quickbooks/callback

Debe coincidir exactamente con la ruta /quickbooks/callback.

8. Añadir HasQuickBooksToken a tu modelo User

use Spinen\QuickBooks\HasQuickBooksToken;

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

Flujo OAuth

Una vez instalado, un usuario de SaaS conecta su empresa de QBO a través de tu aplicación:

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

Rutas de gestión de conexiones

MétodoRutaDescripción
GET/quickbooks/connectRedirigir a la pantalla de consentimiento OAuth de Intuit
GET/quickbooks/callbackGestionar el callback de OAuth y almacenar los tokens
DELETE/quickbooks/disconnectRevocar los tokens de QBO y eliminar la conexión
GET/quickbooks/connectionsListar las conexiones activas de QBO del usuario

Configuración

config/quickbooks-mcp.php:

ClavePredeterminadoDescripción
pathmcp/quickbooksRuta URL donde se expone el servidor MCP
multi_tenanttrueResolver el realm desde el usuario autenticado
search_limit20Límite de resultados predeterminado para las herramientas de búsqueda
search_limit_max100Límite máximo de resultados para las herramientas de búsqueda
environmentproductionEntorno de QBO (production o development)
redirect_uriAPP_URL/quickbooks/callbackURI de redirección de OAuth
token_refresh_buffer_minutes5Minutos antes de la expiración para renovar de forma proactiva

Herramientas disponibles

Cuenta (3 herramientas)

HerramientaDescripción
create_accountCrear una nueva cuenta en el plan de cuentas
search_accountsBuscar cuentas por nombre o tipo
update_accountActualizar una cuenta existente

Cuenta por pagar (5 herramientas)

HerramientaDescripción
create_billCrear una nueva cuenta por pagar
get_billObtener una cuenta por pagar por ID
search_billsBuscar cuentas por pagar por proveedor, rango de fechas o estado de impago
update_billActualizar una cuenta por pagar existente
delete_billEliminar permanentemente una cuenta por pagar

Pago de cuentas por pagar (5 herramientas)

HerramientaDescripción
create_bill_paymentPagar una o más cuentas por pagar abiertas
get_bill_paymentObtener un pago de cuenta por pagar por ID
search_bill_paymentsBuscar pagos de cuentas por pagar por proveedor o rango de fechas
update_bill_paymentActualizar un pago de cuenta por pagar existente
delete_bill_paymentEliminar permanentemente un pago de cuenta por pagar

Cliente (5 herramientas)

HerramientaDescripción
create_customerCrear un nuevo cliente
get_customerObtener un cliente por ID
search_customersBuscar clientes por nombre, correo electrónico o empresa
update_customerActualizar un cliente existente
delete_customerDesactivar un cliente (borrado suave de QBO)

Empleado (4 herramientas)

HerramientaDescripción
create_employeeCrear un nuevo registro de empleado
get_employeeObtener un empleado por ID
search_employeesBuscar empleados por nombre o correo electrónico
update_employeeActualizar un empleado existente

Presupuesto (5 herramientas)

HerramientaDescripción
create_estimateCrear un nuevo presupuesto / cotización
get_estimateObtener un presupuesto por ID
search_estimatesBuscar presupuestos por cliente, estado o rango de fechas
update_estimateActualizar o cambiar el estado de un presupuesto
delete_estimateEliminar permanentemente un presupuesto

Factura (4 herramientas)

HerramientaDescripción
create_invoiceCrear una nueva factura
read_invoiceLeer una factura completa con todas sus líneas de detalle
search_invoicesBuscar facturas por cliente, rango de fechas o estado de pago
update_invoiceActualizar una factura existente

Las facturas no se pueden eliminar permanentemente en QBO.

Artículo (4 herramientas)

HerramientaDescripción
create_itemCrear un nuevo artículo de producto o servicio
read_itemLeer un registro completo de artículo con precios y asignaciones de cuentas
search_itemsBuscar artículos por nombre o tipo
update_itemActualizar un artículo existente (establecer active: false para desactivar)

Los artículos no se pueden eliminar permanentemente en QBO.

Asiento de diario (5 herramientas)

HerramientaDescripción
create_journal_entryCrear un asiento de diario (los débitos deben ser iguales a los créditos)
get_journal_entryObtener un asiento de diario por ID
search_journal_entriesBuscar asientos de diario por rango de fechas o número de documento
update_journal_entryActualizar un asiento de diario existente
delete_journal_entryEliminar permanentemente un asiento de diario

Compra (5 herramientas)

HerramientaDescripción
create_purchaseCrear una transacción de compra / gasto
get_purchaseObtener una compra por ID
search_purchasesBuscar compras por tipo de pago o rango de fechas
update_purchaseActualizar una compra existente
delete_purchaseEliminar permanentemente una compra

Proveedor (5 herramientas)

HerramientaDescripción
create_vendorCrear un nuevo proveedor
get_vendorObtener un proveedor por ID
search_vendorsBuscar proveedores por nombre, correo electrónico o empresa
update_vendorActualizar un proveedor existente
delete_vendorDesactivar un proveedor (borrado suave de QBO)

Resolución de nombres

Las herramientas que hacen referencia a entidades relacionadas (proveedor, cliente, cuenta, artículo) aceptan tanto un nombre como un ID numérico. El paquete resuelve los nombres a IDs automáticamente antes de llamar a la API de QBO.

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

Si no se encuentra un nombre, la herramienta devuelve un error descriptivo con una sugerencia para usar primero la herramienta de búsqueda correspondiente.


Comportamiento de eliminación

QBO tiene dos categorías de eliminación:

ComportamientoEntidades
Borrado suave — establece Active = falseCliente, Proveedor, Empleado, Artículo, Cuenta
Borrado duro — eliminado permanentementeBill, BillPayment, Estimate, JournalEntry, Purchase
No se puede eliminarInvoice, Item (usar update_item con active: false)

Arquitectura multiinquilino

Cada usuario autenticado tiene exactamente una conexión activa de QBO registrada en la tabla quickbooks_connections. El middleware ResolveQuickBooksRealm limita automáticamente cada llamada de herramienta a la empresa de QBO correcta — nunca se necesita un parámetro realm_id por parte del agente de IA.


Arquitectura del paquete

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/

Licencia

MIT — consulta LICENSE para más detalles.


Autor

Raju Rayhan — github.com/rajurayhan