Guía MCP de Uproc

¿Qué es esto?

MCP permite que clientes de IA como OpenCode, Claude Code, Codex, Cursor u otras herramientas similares se conecten directamente a tu espacio de Uproc.

En la práctica, esto significa que tu cliente puede:

  • listar los módulos disponibles
  • leer KPIs y colecciones de datos
  • obtener registros como facturas, envíos o leads
  • usar Uproc como fuente de datos en vivo en lugar de texto copiado

La mayoría de usuarios solo necesita los ejemplos de configuración del cliente y los ejemplos de uso común que aparecen abajo.

Qué necesitas

Usa estos valores de ejecución:

  • UPROC_API_URL: https://api.uproc.io/api/v1/external/mcp
  • CUSTOMER_USER_API_KEY: $CUSTOMER_USER_API_KEY

La autenticación es Bearer con tu API key de usuario (sin email ni dominio). Genera o rota tu key desde tu perfil, pestaña Integraciones → API key. Si ya tienes una, se usa tal cual.

Envía Authorization: Bearer <user API key> en todas las peticiones HTTP, incluidas las que ya llevan la cabecera Mcp-Session-Id: el servidor valida la key en cada llamada y vincula cada sesión al usuario que la creó. Si una sesión se pierde o caduca, reinicializa; el servidor también puede refrescarla automáticamente (cabecera de respuesta Mcp-Session-Refreshed: true).

Protocolo: el servidor soporta las versiones de protocolo MCP 2025-03-26 y 2025-06-18. La inicialización negocia la versión (las peticiones con versiones no soportadas caen a la más reciente soportada). Los clientes deberían enviar la versión negociada en la cabecera MCP-Protocol-Version en las peticiones posteriores; si la cabecera falta el servidor asume 2025-03-26, y un valor no soportado devuelve HTTP 400.

Conecta tu cliente

OpenCode

Añade este servidor MCP remoto en opencode.json:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "uproc": {
      "type": "remote",
      "url": "https://api.uproc.io/api/v1/external/mcp",
      "oauth": false,
      "headers": {
        "Authorization": "Bearer $CUSTOMER_USER_API_KEY"
      },
      "enabled": true
    }
  }
}

Comprueba que funciona:

opencode mcp list
opencode mcp debug uproc

Claude Code

Añade el servidor MCP remoto:

claude mcp add --transport http uproc "https://api.uproc.io/api/v1/external/mcp" \
  --header "Authorization: Bearer $CUSTOMER_USER_API_KEY"

Comprueba que funciona:

claude mcp list
claude mcp get uproc

Codex CLI

Añade esto a ~/.codex/config.toml o .codex/config.toml:

[mcp_servers.uproc]
url = "https://api.uproc.io/api/v1/external/mcp"
enabled = true
env_http_headers = { "Authorization" = "CUSTOMER_USER_API_KEY" }

Exporta la key con el prefijo Bearer antes de iniciar Codex (Codex envía el valor del header tal cual):

export CUSTOMER_USER_API_KEY="Bearer $CUSTOMER_USER_API_KEY"
codex

Otros clientes MCP

Clientes como Cursor, Cline y Windsurf suelen aceptar la misma forma MCP HTTP remota: URL más cabeceras.

{
  "mcpServers": {
    "uproc": {
      "type": "http",
      "url": "https://api.uproc.io/api/v1/external/mcp",
      "headers": {
        "Authorization": "Bearer $CUSTOMER_USER_API_KEY"
      }
    }
  }
}

Si tu cliente espera streamable-http en lugar de http, mantén la misma URL y cabeceras y cambia solo la etiqueta del transporte.

Prueba estos prompts

Estos ejemplos suelen ser más útiles que los payloads MCP en bruto:

  • List my Uproc modules
  • Search the right module for last received invoices
  • Resolve get last received invoices at uproc
  • Show KPI summary for invoice ingest
  • Get the last invoices
  • List the available collections for invoice ingest
  • Show the latest records in lead management
  • Show the latest form generator submissions

La detección en lenguaje natural ya está disponible en el servidor mediante modules.search y modules.resolve.

Los atajos semánticos con permisos también se exponen directamente en tools/list con el patrón module-slug.collection.action, por ejemplo:

  • purchase-invoices.invoices.list
  • purchase-invoices.emails.search
  • document-generator.documents.list
  • document-signing.requests.list
  • purchase-invoices.invoices.upload
  • lead-management.leads.create

Los atajos exactos disponibles dependen de las colecciones de módulo expuestas por la metadata del servidor para tu workspace.

Llamadas directas comunes

Listar módulos

{
  "name": "modules.list",
  "arguments": {}
}

Buscar módulos con lenguaje natural

{
  "name": "modules.search",
  "arguments": {
    "query": "last received invoices",
    "limit": 5
  }
}

Resolver una petición en lenguaje natural a una llamada sugerida

{
  "name": "modules.resolve",
  "arguments": {
    "query": "get last received invoices at uproc",
    "mode": "discover"
  }
}

Resolver y ejecutar una consulta de lectura con alta confianza

{
  "name": "modules.resolve",
  "arguments": {
    "query": "get last received invoices at uproc",
    "mode": "execute"
  }
}

Usar un atajo semántico directamente

{
  "name": "purchase-invoices.invoices.list",
  "arguments": {
    "page": 1,
    "sort_field": "created_at",
    "sort_order": "desc"
  }
}

Crear un lead con un atajo semántico

{
  "name": "lead-management.leads.create",
  "arguments": {
    "item": {
      "company": "Cliente X",
      "contact": "Laura Navarro",
      "email": "[email protected]"
    }
  }
}

Crear un perfil de candidatura con module.create

{
  "name": "module.create",
  "arguments": {
    "module_slug": "candidate-evaluation",
    "collection_name": "profiles",
    "item": {
      "full_name": "Eva Ruiz",
      "email": "[email protected]"
    }
  }
}

Crear una submission de formulario con module.create

{
  "name": "module.create",
  "arguments": {
    "module_slug": "form-generator",
    "collection_name": "submissions",
    "item": {
      "form_id": 10,
      "payload": {
        "email": "[email protected]"
      }
    }
  }
}

Actualmente module.create soporta estos pares de colección escribibles:

  • lead-management.leads
  • candidate-evaluation.job_openings
  • candidate-evaluation.profiles
  • candidate-evaluation.applications
  • candidate-evaluation.evaluations
  • form-generator.forms
  • form-generator.fields
  • form-generator.submissions

Obtener KPIs de un módulo

{
  "name": "module.kpis",
  "arguments": {
    "module_slug": "purchase-invoices"
  }
}

Describir capacidades del módulo

{
  "name": "module.capabilities",
  "arguments": {
    "module_slug": "purchase-invoices"
  }
}

Listar entidades y alias del módulo

{
  "name": "module.entities",
  "arguments": {
    "module_slug": "purchase-invoices"
  }
}

Listar colecciones de un módulo

{
  "name": "module.collections",
  "arguments": {
    "module_slug": "purchase-invoices"
  }
}

Obtener las últimas facturas

{
  "name": "module.data",
  "arguments": {
    "module_slug": "purchase-invoices",
    "collection_name": "invoices",
    "sort_field": "created_at",
    "sort_order": "desc",
    "page": 1
  }
}

Obtener los últimos leads

{
  "name": "module.data",
  "arguments": {
    "module_slug": "lead-management",
    "collection_name": "leads",
    "page": 1
  }
}

Crear un lead con la herramienta genérica de módulo

{
  "name": "module.create",
  "arguments": {
    "module_slug": "lead-management",
    "collection_name": "leads",
    "item": {
      "company": "Acme"
    }
  }
}

Listar acciones disponibles de un módulo

{
  "name": "module.actions",
  "arguments": {
    "module_slug": "lead-management"
  }
}

Ejecutar una acción genérica de módulo

{
  "name": "module.action",
  "arguments": {
    "module_slug": "lead-management",
    "action": "generate_lead_proposal",
    "item": {
      "lead_id": 123
    }
  }
}

Generar una propuesta para un lead

{
  "name": "lead-management.generate_lead_proposal",
  "arguments": {
    "lead_id": 123,
    "title": "Commercial proposal",
    "description": "Short summary",
    "output_format": "pdf"
  }
}

Enviar una propuesta a un lead

{
  "name": "lead-management.send_lead_proposal",
  "arguments": {
    "lead_id": 123,
    "mailbox_id": 7,
    "to_email": "[email protected]",
    "subject": "Proposal",
    "body": "Please find the proposal attached."
  }
}

Reejecutar inteligencia de lead

{
  "name": "lead-management.rerun_lead_intelligence",
  "arguments": {
    "lead_id": 123
  }
}

Ejecutar discovery de prospeccion

{
  "name": "lead-prospecting.run_discovery",
  "arguments": {
    "strategy_id": 55,
    "company": "Acme",
    "domain": "acme.com"
  }
}

Enviar una oportunidad de prospeccion a leads

{
  "name": "lead-prospecting.send_opportunity_to_leads",
  "arguments": {
    "opportunity_id": 77
  }
}

Hacer una pregunta de negocio al data chatbot

{
  "name": "data-chatbot.send_chat_query",
  "arguments": {
    "domain": "sales",
    "question": "How many leads did we create this week?"
  }
}

List data-chatbot domains and available questions

{
  "name": "data-chatbot.list_domains",
  "arguments": {}
}

Continue a data-chatbot conversation

{
  "name": "data-chatbot.follow_up",
  "arguments": {
    "origin_session_id": "web:7:S-1",
    "question": "And compared to last month?"
  }
}

Previsualizar una audiencia de campana

{
  "name": "campaign-automation.preview_audience",
  "arguments": {
    "campaign_id": 12,
    "limit": 5
  }
}

Anadir una audiencia a una campana

{
  "name": "campaign-automation.add_audience",
  "arguments": {
    "campaign_id": 12,
    "mode": "snapshot"
  }
}

Importar una audiencia desde CSV

{
  "name": "campaign-automation.import_audience_csv",
  "arguments": {
    "campaign_id": 12,
    "file_name": "audience.csv",
    "content": "<base64>"
  }
}

Registrar un evento de ejecucion de campana

{
  "name": "campaign-automation.record_execution_event",
  "arguments": {
    "campaign_id": 12,
    "execution_id": 33,
    "channel": "email",
    "event_type": "opened"
  }
}

Obtener estadisticas de ejecucion de campana

{
  "name": "campaign-automation.get_execution_stats",
  "arguments": {
    "campaign_id": 12,
    "channel": "email"
  }
}

Pausar una campana

{
  "name": "campaign-automation.pause_campaign",
  "arguments": {
    "campaign_id": 12
  }
}

Activar una campana

{
  "name": "campaign-automation.activate_campaign",
  "arguments": {
    "campaign_id": 12
  }
}

Aprobar una senal de negocio

{
  "name": "market-signals.approve_signal",
  "arguments": {
    "signal_id": 44
  }
}

Generar una propuesta editorial

{
  "name": "editorial-engine.generate_proposal",
  "arguments": {
    "opportunity_id": 31
  }
}

Ejecutar un workflow de data-sync

{
  "name": "data-sync.run_workflow",
  "arguments": {
    "workflow_id": 44
  }
}

Previsualizar un workflow de data-sync

Vista previa inline (sin necesidad de workflow guardado) con paginación y filtros server-side (los campos no soportados por el proveedor se ignoran y se reportan en unsupported_filters):

{
  "name": "data-sync.preview_workflow",
  "arguments": {
    "source_credential_id": 44,
    "source_resource": "invoices",
    "page_size": 25,
    "filters": { "status": "issued" }
  }
}

Pasa next_page_state de la respuesta anterior para obtener la página siguiente:

{
  "name": "data-sync.preview_workflow",
  "arguments": {
    "source_credential_id": 44,
    "source_resource": "invoices",
    "page_state": { "cursor": "..." }
  }
}

Un workflow guardado también puede previsualizarse con workflow_id (mismo contrato paginado).

Hacer dry-run de un workflow de data-sync

{
  "name": "data-sync.dry_run_workflow",
  "arguments": {
    "workflow_id": 44,
    "limit": 10
  }
}

Sincronización ERP (nivel módulo)

sales-invoices and purchase-invoices expose configure_erp_sync (set erp_sync_mode: none/full/pull/push), export_to_erp (send a specific record; requires full or push) and run_erp_sync (run the linked workflows now).

{
  "name": "sales-invoices.configure_erp_sync",
  "arguments": { "mode": "push" }
}
{
  "name": "sales-invoices.export_to_erp",
  "arguments": { "invoice_id": 9 }
}

data-sync.push_to_erp writes a record to an ERP provider using a stored credential:

{
  "name": "data-sync.push_to_erp",
  "arguments": {
    "credential_id": 3,
    "resource": "invoices",
    "operation": "create",
    "item": { "number": "H-1", "total": 121 }
  }
}

VeriFactu (España)

{
  "name": "sales-invoices.resubmit_verifactu",
  "arguments": { "invoice_id": 9 }
}
{
  "name": "sales-invoices.backfill_verifactu",
  "arguments": {}
}
{
  "name": "sales-invoices.get_verifactu_xml",
  "arguments": { "invoice_id": 9 }
}

Previsualizar una importacion de data-management

{
  "name": "data-management.preview_import",
  "arguments": {
    "collection_name": "providers",
    "file_name": "providers.csv",
    "content": "<base64>",
    "entity_id": 3
  }
}

Encolar una importacion de data-management

{
  "name": "data-management.enqueue_import",
  "arguments": {
    "collection_name": "providers",
    "file_name": "providers.csv",
    "content": "<base64>",
    "entity_id": 3,
    "mapping": {
      "Email": "email"
    }
  }
}

Consultar un upload de data-management

{
  "name": "data-management.get_upload_status",
  "arguments": {
    "upload_id": 9
  }
}

Listar tablas de data-management

{
  "name": "data-management.list_tables",
  "arguments": {}
}

Crear una tabla de data-management

{
  "name": "data-management.create_table",
  "arguments": {
    "item": {
      "name": "providers",
      "description": "Vendor master"
    }
  }
}

Listar columnas de una tabla de data-management

{
  "name": "data-management.list_columns",
  "arguments": {
    "entity_id": 3
  }
}

Crear una columna de data-management

{
  "name": "data-management.create_column",
  "arguments": {
    "entity_id": 3,
    "item": {
      "key": "email",
      "label": "Email",
      "type": "text"
    }
  }
}

Transferir todo el esquema y las filas Data Management

data-management.export_transfer devuelve un ZIP portable en zip_base64. Guardalo fuera de la maquina origen y llama a data-management.import_transfer contra el customer destino. La primera llamada de importacion es una vista previa; establece confirm: true solo tras revisarla. La transferencia reemplaza exclusivamente entidades, columnas y filas Data Management. Excluye usuarios, credenciales, ajustes del customer y adjuntos. Ambas tools requieren una API key de usuario admin autorizada.

{
  "name": "data-management.import_transfer",
  "arguments": {
    "zip_base64": "<portable-zip-base64>",
    "confirm": false
  }
}

Regenerar un plan de normalizacion

{
  "name": "data-management.regenerate_plan",
  "arguments": {
    "plan_id": 18
  }
}

Crear un ticket de customer-care

{
  "name": "customer-care.create_ticket",
  "arguments": {
    "item": {
      "subject": "Delayed shipment",
      "status": "open"
    }
  }
}

Actualizar el estado de un ticket de customer-care

{
  "name": "customer-care.update_ticket_status",
  "arguments": {
    "ticket_id": 17,
    "status": "closed"
  }
}

Asignar un ticket de customer-care

{
  "name": "customer-care.assign_ticket",
  "arguments": {
    "ticket_id": 17,
    "assignee": "[email protected]"
  }
}

Responder a un ticket de customer-care

{
  "name": "customer-care.reply_to_ticket",
  "arguments": {
    "ticket_id": 17,
    "message": "We are reviewing this now."
  }
}

Marcar un ticket de customer-care como resuelto

{
  "name": "customer-care.mark_resolved",
  "arguments": {
    "ticket_id": 17
  }
}

Cerrar un ticket de customer-care

{
  "name": "customer-care.close_ticket",
  "arguments": {
    "ticket_id": 17
  }
}

Reabrir un ticket de customer-care

{
  "name": "customer-care.reopen_ticket",
  "arguments": {
    "ticket_id": 17
  }
}

Aprobar una solicitud de aprobacion

{
  "name": "approval-management.approve_request",
  "arguments": {
    "request_id": 21
  }
}

Reasignar una solicitud de aprobacion

{
  "name": "approval-management.reassign_request",
  "arguments": {
    "request_id": 21,
    "approver": "Eve Manager",
    "note": "handoff needed"
  }
}

Rechazar una solicitud de aprobacion

{
  "name": "approval-management.reject_request",
  "arguments": {
    "request_id": 21
  }
}

Cancelar una solicitud de aprobacion

{
  "name": "approval-management.cancel_request",
  "arguments": {
    "request_id": 21
  }
}

Marcar un pedido de inventario como recibido

{
  "name": "inventory-planning.mark_received",
  "arguments": {
    "order_id": 301
  }
}

Cancelar un pedido de inventario

{
  "name": "inventory-planning.cancel_order",
  "arguments": {
    "order_id": 301
  }
}

Enviar un recordatorio sobre un pedido de inventario

{
  "name": "inventory-planning.send_reminder",
  "arguments": {
    "order_id": 301
  }
}

Marcar un pedido trazado como recibido

{
  "name": "order-track.mark_received",
  "arguments": {
    "order_id": 44
  }
}

Cancelar un pedido trazado

{
  "name": "order-track.cancel_order",
  "arguments": {
    "order_id": 44
  }
}

Enviar un recordatorio sobre un pedido trazado

{
  "name": "order-track.send_reminder",
  "arguments": {
    "order_id": 44
  }
}

Crear un perfil de candidatura

{
  "name": "candidate-evaluation.create_profile",
  "arguments": {
    "item": {
      "full_name": "Eva Ruiz",
      "email": "[email protected]"
    }
  }
}

Crear una candidatura

{
  "name": "candidate-evaluation.create_application",
  "arguments": {
    "item": {
      "profile_id": 8,
      "job_opening_id": 12,
      "stage": "applied"
    }
  }
}

Crear una vacante

{
  "name": "candidate-evaluation.create_job_opening",
  "arguments": {
    "item": {
      "title": "Senior Backend Engineer",
      "department": "Engineering"
    }
  }
}

Mover la etapa de una candidatura

{
  "name": "candidate-evaluation.move_application_stage",
  "arguments": {
    "application_id": 15,
    "stage": "screening"
  }
}

Actualizar el estado de una candidatura

{
  "name": "candidate-evaluation.update_application_status",
  "arguments": {
    "application_id": 15,
    "status": "hired"
  }
}

Crear una evaluacion de candidatura

{
  "name": "candidate-evaluation.create_evaluation",
  "arguments": {
    "item": {
      "application_id": 15,
      "round_name": "HR",
      "score_total": 8.5
    }
  }
}

Publicar un formulario

{
  "name": "form-generator.publish_form",
  "arguments": {
    "form_id": 10
  }
}

Archivar un formulario

{
  "name": "form-generator.archive_form",
  "arguments": {
    "form_id": 10
  }
}

Restaurar un formulario

{
  "name": "form-generator.restore_form",
  "arguments": {
    "form_id": 10
  }
}

Marcar una submission como procesada

{
  "name": "form-generator.mark_submission_processed",
  "arguments": {
    "submission_id": 25
  }
}

Archivar una submission

{
  "name": "form-generator.archive_submission",
  "arguments": {
    "submission_id": 25
  }
}

Reprocesar un pedido ingerido

{
  "name": "order-ingest.reprocess_order",
  "arguments": {
    "order_id": 12
  }
}

Validar un pedido ingerido

{
  "name": "order-ingest.validate_order",
  "arguments": {
    "order_id": 12
  }
}

Enviar un pedido ingerido al ERP

{
  "name": "order-ingest.send_order_to_erp",
  "arguments": {
    "order_id": 12
  }
}

Marcar un correo como procesado

{
  "name": "email-assistant.mark_processed",
  "arguments": {
    "email_id": 5
  }
}

Archivar un correo

{
  "name": "email-assistant.archive_email",
  "arguments": {
    "email_id": 5
  }
}

Reintentar un paso de proceso

{
  "name": "process-visibility.retry_step",
  "arguments": {
    "process_id": 77
  }
}

Reasignar el flujo propietario de un proceso

{
  "name": "process-visibility.reassign_owner",
  "arguments": {
    "process_id": 77
  }
}

Cancelar un proceso

{
  "name": "process-visibility.cancel_process",
  "arguments": {
    "process_id": 77
  }
}

Enviar un recordatorio de firma

{
  "name": "document-signing.send_reminder",
  "arguments": {
    "request_id": 52
  }
}

Sincronizar el estado de una solicitud de firma

{
  "name": "document-signing.sync_status",
  "arguments": {
    "request_id": 52
  }
}

Reabrir una solicitud de firma

{
  "name": "document-signing.reopen_request",
  "arguments": {
    "request_id": 52
  }
}

Cancelar una solicitud de firma

{
  "name": "document-signing.cancel_request",
  "arguments": {
    "request_id": 52
  }
}

Marcar un documento generado como listo

{
  "name": "document-generator.mark_ready",
  "arguments": {
    "document_id": 61
  }
}

Devolver un documento generado a revision

{
  "name": "document-generator.mark_review",
  "arguments": {
    "document_id": 61
  }
}

Regenerar un documento

{
  "name": "document-generator.regenerate_document",
  "arguments": {
    "document_id": 61
  }
}

Archivar un documento generado

{
  "name": "document-generator.archive_document",
  "arguments": {
    "document_id": 61
  }
}

Restaurar un documento generado

{
  "name": "document-generator.restore_document",
  "arguments": {
    "document_id": 61
  }
}

Rectificar una factura

{
  "name": "sales-invoices.rectify_invoice",
  "arguments": {
    "invoice_id": 98,
    "reason": "Correction"
  }
}

Obtener el PDF de una factura

{
  "name": "sales-invoices.get_invoice_pdf",
  "arguments": {
    "invoice_id": 98
  }
}

Anadir una linea de factura

{
  "name": "sales-invoices.add_invoice_line",
  "arguments": {
    "invoice_id": 98,
    "concept": "Consulting",
    "quantity": 2,
    "unit_price": 100
  }
}

Actualizar una linea de factura

{
  "name": "sales-invoices.update_invoice_line",
  "arguments": {
    "invoice_id": 98,
    "line_id": 3,
    "quantity": 4
  }
}

Eliminar una linea de factura

{
  "name": "sales-invoices.delete_invoice_line",
  "arguments": {
    "invoice_id": 98,
    "line_id": 3
  }
}

Emitir una factura

{
  "name": "sales-invoices.issue_invoice",
  "arguments": {
    "invoice_id": 98
  }
}

Previsualizar el PDF de una factura

{
  "name": "sales-invoices.preview_invoice_pdf",
  "arguments": {
    "invoice": {
      "series": "A"
    },
    "lines": [
      {
        "concept": "Consulting"
      }
    ]
  }
}

Enviar una factura

{
  "name": "sales-invoices.send_invoice",
  "arguments": {
    "invoice_id": 98,
    "email": "[email protected]",
    "subject": "Invoice",
    "message": "Please find the invoice attached."
  }
}

Cambiar el estado de una factura de compra (validar/pagar)

{
  "name": "purchase-invoices.change_status",
  "arguments": {
    "item_id": 5,
    "status": "paid",
    "reason": "Bank transfer"
  }
}

Asignar una factura de compra desde ingest

{
  "name": "purchase-invoices.assign_from_ingest",
  "arguments": {
    "invoice_id": 42
  }
}

Ejecutar conciliacion financiera

{
  "name": "financial-reconciliation.reconcile",
  "arguments": {
    "process_id": 5
  }
}

Actualizar un contrato

{
  "name": "contract-lifecycle.update_contract",
  "arguments": {
    "contract_id": 12,
    "data": {
      "status": "renewal"
    }
  }
}

Subir un documento contractual

{
  "name": "contract-lifecycle.upload_contract_document",
  "arguments": {
    "contract_id": 12,
    "file_name": "nda.pdf",
    "content": "<base64>"
  }
}

Crear una nota de caso

{
  "name": "case-lifecycle.create_case_note",
  "arguments": {
    "case_id": 14,
    "content": "Customer called back"
  }
}

Herramientas de data-process y perfil

  • data-process.search — busca en el catálogo de tools (query opcional, busca por key/nombre/descripción).
  • data-process.tool — detalle completo de una tool (tool key): params con accepted/format, output, cost, extended_description.
  • data-process.execute — ejecuta una tool de data-process inline (sin límite diario de llamadas; aplican saldo y presupuesto diario). Params de ejemplo: {"processor":"check-creditcard-checksum","params":{"credit_card":"4024007151839544"}}. Gratis (no se cobra: la respuesta incluye free/free_reason y real_price: 0) cuando el resultado viene de la caché del back, la tool responde result: false o su precio es 0 — controlado por DATA_PROCESS_CHARGE_ON_FALSE.
  • data-process.batch — encola un batch sobre una entidad de data-management (tool, source_entity_id).
  • module.data data-process runs — lista runs recientes de data-process (data-process ya es un módulo catalogado).
  • profile.get / profile.update — lee/actualiza el perfil del usuario conectado (identificado por la API key de usuario).
  • sales-invoices.generate_recurring_invoice, purchase-invoices.generate_recurring_invoice, purchase-invoices.create_recurring_from_invoice — conversión entre facturas y plantillas recurrentes.

Las tools de data-process migradas se sirven con la implementación nativa en Python y las respuestas de catálogo/ejecución incluyen execution_mode (native o legacy_bypass). Las tools aún no migradas vuelven automáticamente a la plataforma legacy (DATA_PROCESS_TOOLS_MODE=auto).

Solución de problemas

  • Si el cliente no conecta, verifica la URL y la cabecera de Authorization.
  • La cabecera Authorization debe ser exactamente Bearer <user API key> — sin cabeceras de email ni dominio.
  • Todas las peticiones deben incluir la cabecera Authorization: las peticiones con Mcp-Session-Id válido pero sin Bearer se rechazan con el error JSON-RPC -32001.
  • Si recibes HTTP 400 Unsupported MCP-Protocol-Version, envía la versión negociada en la cabecera MCP-Protocol-Version (soportadas: 2025-03-26, 2025-06-18).
  • Si tu cliente soporta depuración MCP, ejecuta primero su comando de estado o debug.
  • Si falla una consulta directa de módulo, llama antes a module.collections para ese módulo y verifica el nombre de la colección.

Referencia MCP avanzada

La mayoría de usuarios no necesita las secciones siguientes salvo que esté construyendo una integración propia o depurando el transporte.

Endpoints MCP

EndpointMétodoDescripción
/api/v1/external/mcpPOSTTransporte JSON-RPC (initialize, tools/list, tools/call, resources/read)
/api/v1/external/mcp/toolsGETLista herramientas canónicas
/api/v1/external/mcp/resourcesGETLista recursos de contrato
/api/v1/external/mcp/resources/readPOSTLee un recurso de contrato
/api/v1/external/mcp/callPOSTEjecuta una herramienta sin gestión de sesión

Nombres canónicos de herramientas

Herramientas de módulo

  • modules.list
  • modules.search
  • modules.resolve
  • module.get
  • module.capabilities
  • module.entities
  • module.kpis
  • module.collections
  • module.collection
  • module.data
  • module.create
  • module.update
  • module.actions
  • module.action
  • module.upload
  • module.webhook

Herramientas concretas de acciones de negocio

  • lead-management.generate_lead_proposal
  • lead-management.send_lead_proposal
  • lead-management.rerun_lead_intelligence
  • lead-prospecting.run_discovery
  • lead-prospecting.send_opportunity_to_leads
  • data-chatbot.send_chat_query
  • data-chatbot.list_domains
  • data-chatbot.follow_up
  • campaign-automation.preview_audience
  • campaign-automation.add_audience
  • campaign-automation.import_audience_csv
  • campaign-automation.record_execution_event
  • campaign-automation.get_execution_stats
  • campaign-automation.pause_campaign
  • campaign-automation.activate_campaign
  • data-sync.run_workflow
  • data-sync.preview_workflow
  • data-sync.dry_run_workflow
  • sales-invoices.rectify_invoice
  • sales-invoices.get_invoice_pdf
  • sales-invoices.issue_invoice
  • sales-invoices.add_invoice_line
  • sales-invoices.update_invoice_line
  • sales-invoices.delete_invoice_line
  • sales-invoices.preview_invoice_pdf
  • sales-invoices.send_invoice
  • purchase-invoices.change_status
  • purchase-invoices.assign_from_ingest
  • financial-reconciliation.reconcile
  • contract-lifecycle.update_contract
  • contract-lifecycle.upload_contract_document
  • contract-lifecycle.renew_contract
  • contract-lifecycle.terminate_contract
  • case-lifecycle.create_case_note
  • case-lifecycle.close_case
  • case-lifecycle.reopen_case
  • data-management.preview_import
  • data-management.enqueue_import
  • data-management.get_upload_status
  • data-management.get_latest_upload
  • data-management.list_tables
  • data-management.create_table
  • data-management.update_table
  • data-management.list_columns
  • data-management.create_column
  • data-management.update_column
  • data-management.reorder_columns
  • data-management.export_transfer
  • data-management.import_transfer
  • data-management.regenerate_plan
  • customer-care.create_ticket
  • customer-care.update_ticket_status
  • customer-care.assign_ticket
  • customer-care.reply_to_ticket
  • customer-care.mark_resolved
  • customer-care.close_ticket
  • customer-care.reopen_ticket
  • approval-management.approve_request
  • approval-management.reassign_request
  • approval-management.reject_request
  • approval-management.cancel_request
  • inventory-planning.mark_received
  • inventory-planning.cancel_order
  • inventory-planning.send_reminder
  • order-track.mark_received
  • order-track.cancel_order
  • order-track.send_reminder
  • candidate-evaluation.create_profile
  • candidate-evaluation.create_application
  • candidate-evaluation.create_job_opening
  • candidate-evaluation.move_application_stage
  • candidate-evaluation.update_application_status
  • candidate-evaluation.create_evaluation
  • form-generator.publish_form
  • form-generator.archive_form
  • form-generator.restore_form
  • form-generator.mark_submission_processed
  • form-generator.archive_submission
  • order-ingest.reprocess_order
  • order-ingest.validate_order
  • order-ingest.send_order_to_erp
  • email-assistant.mark_processed
  • email-assistant.archive_email
  • process-visibility.retry_step
  • process-visibility.reassign_owner
  • process-visibility.cancel_process
  • market-signals.approve_signal
  • market-signals.discard_signal
  • market-signals.mark_pending_review
  • market-signals.activate_signal
  • market-signals.close_signal
  • editorial-engine.generate_proposal
  • editorial-engine.generate_article
  • editorial-engine.publish
  • editorial-engine.schedule
  • editorial-engine.discard
  • tax-compliance.generate_report
  • tax-compliance.recalculate_report
  • tax-compliance.validate_report
  • tax-compliance.export_report
  • document-signing.cancel_request
  • document-signing.reopen_request
  • document-signing.send_reminder
  • document-signing.sync_status
  • document-generator.mark_ready
  • document-generator.mark_review
  • document-generator.archive_document
  • document-generator.restore_document
  • document-generator.regenerate_document

Atajos semánticos con permisos

Patrón: module-slug.collection.action

Ejemplos:

  • purchase-invoices.invoices.list
  • purchase-invoices.invoices.get
  • purchase-invoices.invoices.search
  • purchase-invoices.invoices.upload
  • lead-management.leads.list
  • lead-management.leads.create

Estos atajos se generan dinámicamente a partir de los módulos, colecciones y operaciones de escritura permitidas externamente para el usuario autenticado.

module_slug siempre se pasa en arguments para herramientas de módulo.

Recursos

Los recursos MCP exponen los contratos activos usados por el servidor:

  • contract://modules/<action>

Ejemplo:

{
  "uri": "contract://modules/kpis"
}

JSON-RPC bruto con curl

Inicializa una sesión:

curl -i -X POST "https://api.uproc.io/api/v1/external/mcp" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $CUSTOMER_USER_API_KEY" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "initialize",
    "params": {
      "protocolVersion": "2025-03-26",
      "capabilities": {},
      "clientInfo": {"name": "curl", "version": "1.0"}
    }
  }'

Llama a una herramienta después de copiar la cabecera Mcp-Session-Id de la respuesta:

curl -X POST "https://api.uproc.io/api/v1/external/mcp" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $CUSTOMER_USER_API_KEY" \
  -H "Mcp-Session-Id: <SESSION_ID>" \
  -d '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "tools/call",
    "params": {
      "name": "modules.list",
      "arguments": {}
    }
  }'

Fallback directo sin sesión:

curl -X POST "https://api.uproc.io/api/v1/external/mcp/call" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $CUSTOMER_USER_API_KEY" \
  -d '{
    "name": "module.kpis",
    "arguments": {"module_slug": "purchase-invoices"}
  }'

Formato de error

{
  "success": false,
  "message": "validation.error",
  "data": {
    "errors": []
  }
}

Sesiones de data chatbot

Lista las sesiones del usuario conectado, opcionalmente filtradas por origen.

{
  "name": "data-chatbot.list_sessions",
  "arguments": { "source": "mcp" }
}

Cancelación de factura de venta (VeriFactu)

{
  "name": "sales-invoices.cancel_invoice",
  "arguments": { "invoice_id": 9, "reason": "Duplicada" }
}

Ejecutar el workflow de VeriFactu AEAT

{
  "name": "sales-invoices.run_verifactu",
  "arguments": {}
}

Activar verifactu_enabled en sales-invoices crea automáticamente el workflow VeriFactu AEAT · sales-invoices (programado + manual desde ventas); run_verifactu envía ahora los registros pendientes a AEAT.

Transferencia FileSync

{
  "name": "file-sync.run_transfer",
  "arguments": { "transfer_id": 1 }
}