Herramientas MCP
Conecta clientes de IA como OpenCode, Claude o Cursor a Uproc
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/mcpCUSTOMER_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 modulesSearch the right module for last received invoicesResolve get last received invoices at uprocShow KPI summary for invoice ingestGet the last invoicesList the available collections for invoice ingestShow the latest records in lead managementShow 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.listpurchase-invoices.emails.searchdocument-generator.documents.listdocument-signing.requests.listpurchase-invoices.invoices.uploadlead-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.leadscandidate-evaluation.job_openingscandidate-evaluation.profilescandidate-evaluation.applicationscandidate-evaluation.evaluationsform-generator.formsform-generator.fieldsform-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 (queryopcional, busca por key/nombre/descripción).data-process.tool— detalle completo de una tool (toolkey): 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 incluyefree/free_reasonyreal_price: 0) cuando el resultado viene de la caché del back, la tool responderesult: falseo su precio es 0 — controlado porDATA_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(nativeolegacy_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-Idvá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 cabeceraMCP-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.collectionspara 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
| Endpoint | Método | Descripción |
|---|---|---|
/api/v1/external/mcp | POST | Transporte JSON-RPC (initialize, tools/list, tools/call, resources/read) |
/api/v1/external/mcp/tools | GET | Lista herramientas canónicas |
/api/v1/external/mcp/resources | GET | Lista recursos de contrato |
/api/v1/external/mcp/resources/read | POST | Lee un recurso de contrato |
/api/v1/external/mcp/call | POST | Ejecuta una herramienta sin gestión de sesión |
Nombres canónicos de herramientas
Herramientas de módulo
modules.listmodules.searchmodules.resolvemodule.getmodule.capabilitiesmodule.entitiesmodule.kpismodule.collectionsmodule.collectionmodule.datamodule.createmodule.updatemodule.actionsmodule.actionmodule.uploadmodule.webhook
Herramientas concretas de acciones de negocio
lead-management.generate_lead_proposallead-management.send_lead_proposallead-management.rerun_lead_intelligencelead-prospecting.run_discoverylead-prospecting.send_opportunity_to_leadsdata-chatbot.send_chat_querydata-chatbot.list_domainsdata-chatbot.follow_upcampaign-automation.preview_audiencecampaign-automation.add_audiencecampaign-automation.import_audience_csvcampaign-automation.record_execution_eventcampaign-automation.get_execution_statscampaign-automation.pause_campaigncampaign-automation.activate_campaigndata-sync.run_workflowdata-sync.preview_workflowdata-sync.dry_run_workflowsales-invoices.rectify_invoicesales-invoices.get_invoice_pdfsales-invoices.issue_invoicesales-invoices.add_invoice_linesales-invoices.update_invoice_linesales-invoices.delete_invoice_linesales-invoices.preview_invoice_pdfsales-invoices.send_invoicepurchase-invoices.change_statuspurchase-invoices.assign_from_ingestfinancial-reconciliation.reconcilecontract-lifecycle.update_contractcontract-lifecycle.upload_contract_documentcontract-lifecycle.renew_contractcontract-lifecycle.terminate_contractcase-lifecycle.create_case_notecase-lifecycle.close_casecase-lifecycle.reopen_casedata-management.preview_importdata-management.enqueue_importdata-management.get_upload_statusdata-management.get_latest_uploaddata-management.list_tablesdata-management.create_tabledata-management.update_tabledata-management.list_columnsdata-management.create_columndata-management.update_columndata-management.reorder_columnsdata-management.export_transferdata-management.import_transferdata-management.regenerate_plancustomer-care.create_ticketcustomer-care.update_ticket_statuscustomer-care.assign_ticketcustomer-care.reply_to_ticketcustomer-care.mark_resolvedcustomer-care.close_ticketcustomer-care.reopen_ticketapproval-management.approve_requestapproval-management.reassign_requestapproval-management.reject_requestapproval-management.cancel_requestinventory-planning.mark_receivedinventory-planning.cancel_orderinventory-planning.send_reminderorder-track.mark_receivedorder-track.cancel_orderorder-track.send_remindercandidate-evaluation.create_profilecandidate-evaluation.create_applicationcandidate-evaluation.create_job_openingcandidate-evaluation.move_application_stagecandidate-evaluation.update_application_statuscandidate-evaluation.create_evaluationform-generator.publish_formform-generator.archive_formform-generator.restore_formform-generator.mark_submission_processedform-generator.archive_submissionorder-ingest.reprocess_orderorder-ingest.validate_orderorder-ingest.send_order_to_erpemail-assistant.mark_processedemail-assistant.archive_emailprocess-visibility.retry_stepprocess-visibility.reassign_ownerprocess-visibility.cancel_processmarket-signals.approve_signalmarket-signals.discard_signalmarket-signals.mark_pending_reviewmarket-signals.activate_signalmarket-signals.close_signaleditorial-engine.generate_proposaleditorial-engine.generate_articleeditorial-engine.publisheditorial-engine.scheduleeditorial-engine.discardtax-compliance.generate_reporttax-compliance.recalculate_reporttax-compliance.validate_reporttax-compliance.export_reportdocument-signing.cancel_requestdocument-signing.reopen_requestdocument-signing.send_reminderdocument-signing.sync_statusdocument-generator.mark_readydocument-generator.mark_reviewdocument-generator.archive_documentdocument-generator.restore_documentdocument-generator.regenerate_document
Atajos semánticos con permisos
Patrón: module-slug.collection.action
Ejemplos:
purchase-invoices.invoices.listpurchase-invoices.invoices.getpurchase-invoices.invoices.searchpurchase-invoices.invoices.uploadlead-management.leads.listlead-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 }
}