Referencia de herramientas MCP
Herramientas, operaciones, scopes y permisos de los servidores MCP: aplicaciones externas y credenciales, CRM, Finanzas y RRHH.
Actualizado el . 40 min de lectura
Esta referencia reúne el contrato de las herramientas MCP que más usan los integradores: las cuatro del dominio de integraciones (aplicaciones externas, credenciales, ajustes de integración de la organización y estado del dominio), las ampliaciones del CRM, el servidor de Finanzas y el calendario laboral de RRHH. Para cada operación indica el permiso que necesita tu usuario, el scope que necesita el token y si exige confirmación.
Otras herramientas tienen página propia: Marketing, tickets, AI Studio y el buscador global y los avisos. Si es tu primera conexión, empieza por Primeros pasos con MCP.
Cómo se autoriza cada operación
Cada operación pasa por estas comprobaciones, en este orden. Las tablas de esta página dan, para cada una, el permiso, el scope y si exige confirm.
Qué comprueba el servidor en cada operación
Tu organización
Aplicativo en el plan
Ningún permiso ni scope lo sustituye.Si no: la herramienta no se anuncia y la llamada se rechaza.
El token
Scope de la operación
Ver la herramienta en tools/list no basta para ejecutar todas sus operaciones.Si no: la respuesta nombra el scope y el conjunto más pequeño que lo concede.
Tu usuario
Permiso de la operación
Si la tabla da dos permisos separados por «o», basta con uno.Si no: error -32602 «Permiso denegado. Requiere: ...».
La llamada · Opcional
Confirmación
Solo en las operaciones que borran, rotan secretos o no se pueden deshacer: confirm: true.Si no: se rechaza sin tocar nada.
Tu alcance
Ejecución
Sobre las filas que tu alcance te deja ver, igual que en la aplicación.
Aplicaciones externas y credenciales
Cuatro herramientas cubren el dominio de integraciones:
| Herramienta | Servidor | Operaciones | Para qué sirve |
|---|---|---|---|
integrations | utilia-work | 32 | Aplicaciones externas: ciclo de vida, OAuth saliente, webhooks, métricas de uso de la API y facturación por aplicación |
api_credentials | utilia-work | 7 | Credenciales v2: personales, de cuenta de servicio y de aplicación externa |
org_integrations_settings | utilia-crm | 31 | Claves de API v1 de la organización, formularios de captación y otros ajustes de integración |
integrations_overview | utilia-work | 3 | Estado del dominio en una sola llamada, de solo lectura |
En la aplicación, las aplicaciones externas se gestionan en Ajustes › Integraciones › Aplicaciones externas, necesitas entrar con tu cuenta.
integrations
Es la herramienta con la que registras tu propia integración, la suscribes a eventos y vigilas su salud.
| Operación | Qué hace | Permiso | Scope | confirm |
|---|---|---|---|---|
apps_list | Lista las aplicaciones externas de la organización, paginadas. | INTEGRATIONS_APPS_VIEW o EXTERNAL_APPS_VIEW | integrations:apps:view | no |
apps_get | Detalle de una aplicación. | INTEGRATIONS_APPS_VIEW o EXTERNAL_APPS_VIEW | integrations:apps:view | no |
apps_create | Crea una aplicación. Devuelve su clave y su secreto de webhook una sola vez. | INTEGRATIONS_APPS_MANAGE o EXTERNAL_APPS_CREATE | integrations:apps:manage | no |
apps_update | Cambia los datos descriptivos de la aplicación. | INTEGRATIONS_APPS_MANAGE o EXTERNAL_APPS_EDIT | integrations:apps:manage | no |
apps_delete | Borra la aplicación con sus credenciales, entregas y métricas. | INTEGRATIONS_APPS_MANAGE o EXTERNAL_APPS_DELETE | integrations:apps:manage | sí |
apps_toggle_active | Activa o desactiva la aplicación sin borrarla. | INTEGRATIONS_APPS_MANAGE o EXTERNAL_APPS_EDIT | integrations:apps:manage | sí |
apps_regenerate_api_key | Rota la clave de la aplicación. | INTEGRATIONS_APPS_MANAGE o EXTERNAL_APPS_EDIT | integrations:apps:manage | sí |
apps_update_scopes | Sustituye el conjunto entero de scopes de la aplicación y deja el cambio en el registro de auditoría. Añadir scopes críticos de datos personales exige el rol Super Administrador y un reason de al menos 20 caracteres. | INTEGRATIONS_APPS_MANAGE o EXTERNAL_APPS_EDIT | integrations:apps:manage | sí |
apps_get_stats | Resumen de la aplicación: clave, webhook, usuarios externos y entregas. | INTEGRATIONS_APPS_VIEW o EXTERNAL_APPS_VIEW | integrations:apps:view | no |
apps_list_users | Usuarios externos que ha registrado la aplicación. | INTEGRATIONS_APPS_VIEW o EXTERNAL_APPS_VIEW | integrations:apps:view | no |
apps_oauth_get | Configuración OAuth saliente de la aplicación. | INTEGRATIONS_APPS_VIEW, EXTERNAL_APPS_VIEW u OAUTH_APPS_VIEW | integrations:apps:view | no |
apps_oauth_enable | Activa el OAuth saliente. | OAUTH_APPS_MANAGE o INTEGRATIONS_APPS_MANAGE | integrations:apps:manage | sí |
apps_oauth_update | Cambia la configuración OAuth. | OAUTH_APPS_MANAGE o INTEGRATIONS_APPS_MANAGE | integrations:apps:manage | no |
apps_oauth_disable | Desactiva el OAuth saliente y conserva el historial de tokens. | OAUTH_APPS_MANAGE o INTEGRATIONS_APPS_MANAGE | integrations:apps:manage | sí |
apps_oauth_regenerate_secret | Rota el secreto de cliente OAuth. | OAUTH_APPS_MANAGE o INTEGRATIONS_APPS_MANAGE | integrations:apps:manage | sí |
apps_webhooks_get_config | Configuración actual del webhook. | INTEGRATIONS_APPS_VIEW o EXTERNAL_APPS_VIEW | integrations:apps:webhooks:view | no |
apps_webhooks_update_config | Cambia webhookUrl, webhookEvents y webhookEnabled. | INTEGRATIONS_WEBHOOKS_MANAGE o EXTERNAL_APPS_EDIT | integrations:apps:webhooks:manage | no |
apps_webhooks_regenerate_secret | Rota el secreto con el que se firman los webhooks. | INTEGRATIONS_WEBHOOKS_MANAGE o EXTERNAL_APPS_EDIT | integrations:apps:webhooks:manage | sí |
apps_webhooks_test | Envía una entrega de prueba, firmada igual que las reales. Si los webhooks están desactivados, no envía nada y lo dice. | INTEGRATIONS_WEBHOOKS_MANAGE o EXTERNAL_APPS_EDIT | integrations:apps:webhooks:manage | no |
apps_webhooks_list_deliveries | Historial de entregas, con filtros. | INTEGRATIONS_APPS_VIEW o EXTERNAL_APPS_VIEW | integrations:apps:webhooks:view | no |
apps_webhooks_get_delivery | Detalle de una entrega. | INTEGRATIONS_APPS_VIEW o EXTERNAL_APPS_VIEW | integrations:apps:webhooks:view | no |
apps_webhooks_retry_delivery | Vuelve a encolar una entrega FAILED o FAILED_PERMANENTLY. | INTEGRATIONS_WEBHOOKS_MANAGE o EXTERNAL_APPS_EDIT | integrations:apps:webhooks:manage | sí |
apps_webhooks_list_supported_events | Catálogo de eventos a los que se puede suscribir. | INTEGRATIONS_APPS_VIEW o EXTERNAL_APPS_VIEW | integrations:apps:webhooks:view | no |
apps_metrics_requests | Serie temporal de peticiones a la API externa. | INTEGRATIONS_METRICS_VIEW o EXTERNAL_APPS_VIEW | integrations:apps:metrics:view | no |
apps_metrics_latency | Latencia agregada (p50, p95 y p99). | INTEGRATIONS_METRICS_VIEW o EXTERNAL_APPS_VIEW | integrations:apps:metrics:view | no |
apps_metrics_errors | Errores por código de estado. | INTEGRATIONS_METRICS_VIEW o EXTERNAL_APPS_VIEW | integrations:apps:metrics:view | no |
apps_metrics_top_endpoints | Endpoints más usados. | INTEGRATIONS_METRICS_VIEW o EXTERNAL_APPS_VIEW | integrations:apps:metrics:view | no |
apps_metrics_webhooks_health | Salud de los webhooks de la aplicación. | INTEGRATIONS_METRICS_VIEW o EXTERNAL_APPS_VIEW | integrations:apps:metrics:view | no |
apps_billing_get_config | Configuración de facturación de la aplicación. | INTEGRATIONS_BILLING_MANAGE o EXTERNAL_APPS_VIEW | integrations:apps:billing:view | no |
apps_billing_update_config | Activa o desactiva la facturación de la aplicación. | INTEGRATIONS_BILLING_MANAGE o EXTERNAL_APPS_EDIT | integrations:apps:billing:manage | sí |
apps_billing_list_invoices | Facturas generadas para la aplicación. | INTEGRATIONS_BILLING_MANAGE o EXTERNAL_APPS_VIEW | integrations:apps:billing:view | no |
apps_billing_list_payments | Cobros de la aplicación. | INTEGRATIONS_BILLING_MANAGE o EXTERNAL_APPS_VIEW | integrations:apps:billing:view | no |
El SDK de JavaScript no tiene todavía un método para apps_update_scopes (appsUpdate solo cambia los datos descriptivos): para sustituir los scopes de una aplicación, invoca la herramienta por JSON-RPC.
Ejemplo: crear una aplicación y configurar su webhook. Los SDK necesitan una sesión OAuth autorizada para el servidor utilia-work, como se explica en Primeros pasos con MCP.
const created = await sdk.mcp.integrations.appsCreate({
name: 'Mi integración',
slug: 'mi-integracion',
description: 'Integración personalizada.',
websiteUrl: 'https://miempresa.com',
});
await sdk.mcp.integrations.appsWebhooksUpdateConfig(created.app.id, {
webhookUrl: 'https://miempresa.com/webhooks/utilia',
webhookEnabled: true,
webhookEvents: ['TICKET_CREATED', 'INVOICE_PAID'],
});
const test = await sdk.mcp.integrations.appsWebhooksTest(created.app.id);
console.log(test.success ? `Entregado: ${test.statusCode}` : test.error);Cómo verificar en tu servidor la firma de las entregas se explica en Firma HMAC de los webhooks.
api_credentials
Gestiona el ciclo de vida de las credenciales v2 de tu organización. Hay tres tipos:
PERSONAL: va atada a un usuario y hereda sus permisos.SERVICE_ACCOUNT: de máquina a máquina, para integraciones internas que no representan a una persona.EXTERNAL_APP: credencial recortada de una aplicación externa, con scopes propios.
Al rotar, el secreto nuevo se muestra una sola vez y el anterior sigue valiendo 24 horas, para que puedas cambiarlo sin cortar el servicio.
| Operación | Qué hace | Permiso | Scope | confirm |
|---|---|---|---|---|
list | Lista credenciales con filtros por tipo, estado y aplicación. | API_CREDENTIALS_MANAGE | integrations:credentials:view | no |
get | Detalle de una credencial. | API_CREDENTIALS_MANAGE | integrations:credentials:view | no |
get_usage | Uso de la credencial: peticiones, último uso y veces que tocó el límite. | API_CREDENTIALS_MANAGE | integrations:credentials:view | no |
create | Crea una credencial. Devuelve el secreto una sola vez. | API_CREDENTIALS_MANAGE | integrations:credentials:manage | sí |
rotate | Rota el secreto y deja el anterior 24 horas en gracia. | API_CREDENTIALS_MANAGE | integrations:credentials:manage | sí |
revoke | Revoca la credencial al momento, sin gracia. | API_CREDENTIALS_MANAGE | integrations:credentials:manage | sí |
scopes_catalog | Catálogo de scopes v2 disponibles. | API_CREDENTIALS_MANAGE | integrations:credentials:view | no |
const { secret, previousValidUntil } = await sdk.mcp.apiCredentials.rotate(
credentialId,
{ reason: 'Rotación trimestral' },
);
console.log('Secreto nuevo:', secret);
console.log('El anterior vale hasta:', previousValidUntil);org_integrations_settings
Agrupa ajustes de integración de la organización anteriores al dominio de aplicaciones externas. Vive en el servidor utilia-crm. Si vienes de una versión antigua de los SDK, esta herramienta es la que antes se llamaba integrations: consulta la guía de migración.
La herramienta aparece en tools/list con los conjuntos crm:read, crm:full, dev:read o dev:full, o con cualquier scope de lectura del CRM, pero cada operación exige además su propio scope, que es el de la tabla.
Claves de API v1 de la organización (7). Además del permiso, la clave tiene que haberla creado tu usuario y pertenecer a tu organización.
| Operación | Qué hace | Permiso | Scope | confirm |
|---|---|---|---|---|
api_keys_list | Lista tus claves de API v1. | INTEGRATIONS_APPS_VIEW o API_CREDENTIALS_MANAGE | integrations:credentials:view | no |
api_keys_get | Detalle de una clave. | INTEGRATIONS_APPS_VIEW o API_CREDENTIALS_MANAGE | integrations:credentials:view | no |
api_keys_toggle | Activa o desactiva una clave. | API_CREDENTIALS_MANAGE | integrations:credentials:manage | no |
api_keys_delete | Borra una clave. | API_CREDENTIALS_MANAGE | integrations:credentials:manage | sí |
api_keys_regenerate | Rota la clave y devuelve el valor nuevo una sola vez. | API_CREDENTIALS_MANAGE | integrations:credentials:manage | sí |
api_keys_get_notifications | Avisos configurados por departamento. | INTEGRATIONS_APPS_VIEW o API_CREDENTIALS_MANAGE | integrations:credentials:view | no |
api_keys_update_notifications | Cambia los destinatarios de esos avisos. | API_CREDENTIALS_MANAGE | integrations:credentials:manage | no |
Por compatibilidad con las integraciones anteriores al 28 de agosto de 2026, un token con scopes del CRM o del dominio de trabajo puede leer las claves aunque no lleve integrations:credentials:view. Para gestionarlas hay que pedir siempre integrations:credentials:manage.
Formularios de captación (11). Se corresponden con Ajustes › Integraciones › Formularios de captación, necesitas entrar con tu cuenta.
| Operación | Qué hace | Permiso | Scope | confirm |
|---|---|---|---|---|
lead_forms_list | Lista los formularios de la organización. | LEAD_FORMS_VIEW | crm:lead-forms:view | no |
lead_forms_get | Detalle de un formulario. | LEAD_FORMS_VIEW | crm:lead-forms:view | no |
lead_forms_create | Crea un formulario. | LEAD_FORMS_CREATE | crm:lead-forms:manage | no |
lead_forms_update | Cambia los campos, el vínculo con el CRM o los webhooks del formulario. | LEAD_FORMS_EDIT | crm:lead-forms:manage | no |
lead_forms_delete | Borra el formulario; las respuestas recibidas se conservan. | LEAD_FORMS_DELETE | crm:lead-forms:manage | sí |
lead_forms_publish | Publica el formulario. | LEAD_FORMS_PUBLISH | crm:lead-forms:manage | no |
lead_forms_pause | Pausa el formulario. | LEAD_FORMS_EDIT | crm:lead-forms:manage | no |
lead_forms_archive | Archiva el formulario sin borrar su historial. | LEAD_FORMS_EDIT | crm:lead-forms:manage | no |
lead_forms_unarchive | Devuelve a borrador un formulario archivado y conserva su slug. | LEAD_FORMS_EDIT | crm:lead-forms:manage | no |
lead_forms_get_stats | Estadísticas agregadas. | LEAD_FORMS_VIEW | crm:lead-forms:view | no |
lead_forms_get_snippet | Fragmento HTML y JavaScript para insertar el formulario en tu web. | LEAD_FORMS_VIEW | crm:lead-forms:view | no |
integrations_overview
Da el estado del dominio de integraciones en una sola llamada, pensado para un copiloto o un panel. Es de solo lectura y su respuesta se guarda en caché 30 segundos por organización y operación.
| Operación | Qué devuelve | Permiso | Scope |
|---|---|---|---|
status | Cifras agregadas: aplicaciones, credenciales por tipo, entregas de las últimas 24 horas y catálogo de eventos. | INTEGRATIONS_OVERVIEW_VIEW o EXTERNAL_APPS_VIEW | integrations:overview:view |
health | Salud: la aplicación con más errores, errores críticos abiertos, entregas fallidas y reintentos pendientes. Su veredicto es healthy, degraded o critical. | INTEGRATIONS_OVERVIEW_VIEW o EXTERNAL_APPS_VIEW | integrations:overview:view |
quickstart | La siguiente acción recomendada y la lista de lo que queda pendiente. | INTEGRATIONS_OVERVIEW_VIEW o EXTERNAL_APPS_VIEW | integrations:overview:view |
const status = await sdk.mcp.integrationsOverview.status();
const health = await sdk.mcp.integrationsOverview.health();
console.log(`Aplicaciones activas: ${status.apps.active}/${status.apps.total}`);
if (health.overall !== 'healthy') {
console.warn('El dominio de integraciones tiene problemas.');
console.warn('Aplicación con más errores:', health.worstApp?.name);
}Permisos por rol
De los seis roles de UTILIA OS, solo dos traen permisos de integraciones por defecto: Super Administrador, todos, y Gerente, solo los de consulta. Vendedor, Asistente, Visualizador y Comercial Externo («Otros roles» en la figura) no traen ninguno.
Permisos de integraciones por rol
| Scope | Super Administrador | Gerente | Otros roles |
|---|---|---|---|
| Aplicaciones externas | |||
| integrations:apps:viewINTEGRATIONS_APPS_VIEW o EXTERNAL_APPS_VIEW | Sí | Sí | No |
| integrations:apps:manageINTEGRATIONS_APPS_MANAGE o EXTERNAL_APPS_EDIT; en OAuth saliente, OAUTH_APPS_MANAGE o INTEGRATIONS_APPS_MANAGE | Sí | No | No |
| integrations:apps:webhooks:viewINTEGRATIONS_APPS_VIEW o EXTERNAL_APPS_VIEW | Sí | Sí | No |
| integrations:apps:webhooks:manageINTEGRATIONS_WEBHOOKS_MANAGE o EXTERNAL_APPS_EDIT | Sí | No | No |
| integrations:apps:metrics:viewINTEGRATIONS_METRICS_VIEW o EXTERNAL_APPS_VIEW | Sí | Sí | No |
| integrations:apps:billing:viewINTEGRATIONS_BILLING_MANAGE o EXTERNAL_APPS_VIEW | Sí | Sí | No |
| integrations:apps:billing:manageINTEGRATIONS_BILLING_MANAGE o EXTERNAL_APPS_EDIT | Sí | No | No |
| Credenciales | |||
| integrations:credentials:viewAPI_CREDENTIALS_MANAGE | Sí | No | No |
| integrations:credentials:manageAPI_CREDENTIALS_MANAGE | Sí | No | No |
| Estado del dominio | |||
| integrations:overview:viewINTEGRATIONS_OVERVIEW_VIEW o EXTERNAL_APPS_VIEW | Sí | Sí | No |
- Aplicaciones externasintegrations:apps:viewINTEGRATIONS_APPS_VIEW o EXTERNAL_APPS_VIEWSí
- integrations:apps:manageINTEGRATIONS_APPS_MANAGE o EXTERNAL_APPS_EDIT; en OAuth saliente, OAUTH_APPS_MANAGE o INTEGRATIONS_APPS_MANAGESí
- integrations:apps:webhooks:viewINTEGRATIONS_APPS_VIEW o EXTERNAL_APPS_VIEWSí
- integrations:apps:webhooks:manageINTEGRATIONS_WEBHOOKS_MANAGE o EXTERNAL_APPS_EDITSí
- integrations:apps:metrics:viewINTEGRATIONS_METRICS_VIEW o EXTERNAL_APPS_VIEWSí
- integrations:apps:billing:viewINTEGRATIONS_BILLING_MANAGE o EXTERNAL_APPS_VIEWSí
- integrations:apps:billing:manageINTEGRATIONS_BILLING_MANAGE o EXTERNAL_APPS_EDITSí
- Credencialesintegrations:credentials:viewAPI_CREDENTIALS_MANAGESí
- integrations:credentials:manageAPI_CREDENTIALS_MANAGESí
- Estado del dominiointegrations:overview:viewINTEGRATIONS_OVERVIEW_VIEW o EXTERNAL_APPS_VIEWSí
- Aplicaciones externasintegrations:apps:viewINTEGRATIONS_APPS_VIEW o EXTERNAL_APPS_VIEWSí
- integrations:apps:manageINTEGRATIONS_APPS_MANAGE o EXTERNAL_APPS_EDIT; en OAuth saliente, OAUTH_APPS_MANAGE o INTEGRATIONS_APPS_MANAGENo
- integrations:apps:webhooks:viewINTEGRATIONS_APPS_VIEW o EXTERNAL_APPS_VIEWSí
- integrations:apps:webhooks:manageINTEGRATIONS_WEBHOOKS_MANAGE o EXTERNAL_APPS_EDITNo
- integrations:apps:metrics:viewINTEGRATIONS_METRICS_VIEW o EXTERNAL_APPS_VIEWSí
- integrations:apps:billing:viewINTEGRATIONS_BILLING_MANAGE o EXTERNAL_APPS_VIEWSí
- integrations:apps:billing:manageINTEGRATIONS_BILLING_MANAGE o EXTERNAL_APPS_EDITNo
- Credencialesintegrations:credentials:viewAPI_CREDENTIALS_MANAGENo
- integrations:credentials:manageAPI_CREDENTIALS_MANAGENo
- Estado del dominiointegrations:overview:viewINTEGRATIONS_OVERVIEW_VIEW o EXTERNAL_APPS_VIEWSí
- Aplicaciones externasintegrations:apps:viewINTEGRATIONS_APPS_VIEW o EXTERNAL_APPS_VIEWNo
- integrations:apps:manageINTEGRATIONS_APPS_MANAGE o EXTERNAL_APPS_EDIT; en OAuth saliente, OAUTH_APPS_MANAGE o INTEGRATIONS_APPS_MANAGENo
- integrations:apps:webhooks:viewINTEGRATIONS_APPS_VIEW o EXTERNAL_APPS_VIEWNo
- integrations:apps:webhooks:manageINTEGRATIONS_WEBHOOKS_MANAGE o EXTERNAL_APPS_EDITNo
- integrations:apps:metrics:viewINTEGRATIONS_METRICS_VIEW o EXTERNAL_APPS_VIEWNo
- integrations:apps:billing:viewINTEGRATIONS_BILLING_MANAGE o EXTERNAL_APPS_VIEWNo
- integrations:apps:billing:manageINTEGRATIONS_BILLING_MANAGE o EXTERNAL_APPS_EDITNo
- Credencialesintegrations:credentials:viewAPI_CREDENTIALS_MANAGENo
- integrations:credentials:manageAPI_CREDENTIALS_MANAGENo
- Estado del dominiointegrations:overview:viewINTEGRATIONS_OVERVIEW_VIEW o EXTERNAL_APPS_VIEWNo
API_CREDENTIALS_MANAGE solo lo trae el rol Super Administrador: un Gerente no gestiona credenciales aunque su token lleve el scope.
Conjuntos de scopes:
| Conjunto | Incluye | Para quién |
|---|---|---|
integrations:full | Los siete integrations:apps:* e integrations:overview:view. No incluye credenciales. | Clientes OAuth que gestionan aplicaciones externas |
api_credentials:full | integrations:credentials:view e integrations:credentials:manage | Clientes OAuth dedicados a credenciales |
admin:full | dev:full, integrations:full y api_credentials:full | Administración avanzada |
dev:full | Todo el dominio de trabajo, soporte, integraciones y credenciales | Quien opera todo el servidor utilia-work |
Eventos y conexiones con otros módulos
Tu aplicación puede suscribirse, en webhookEvents, a eventos de todo el ecosistema. El catálogo completo, con el contenido de cada aviso, está en Avisos: contenido y catálogo de eventos, y apps_webhooks_list_supported_events lo devuelve por MCP. Algunos ejemplos:
- Leads:
LEAD_CREATED,LEAD_QUALIFIED,LEAD_DISQUALIFIEDyLEAD_CONVERTED. Un formulario de captación crea un lead en el CRM, y con él llegaLEAD_CREATED. - Clientes y contactos:
CLIENT_CREATED,CLIENT_UPDATEDyCONTACT_CREATED. - Facturas y presupuestos:
INVOICE_PAID,INVOICE_PAYMENT_FAILED,INVOICE_REFUNDEDyBUDGET_SIGNED. - Tickets de soporte:
TICKET_CREATED,TICKET_REPLIED,TICKET_RESOLVEDyTICKET_CONVERTED. - Archivos:
FILE_UPLOADED. - Errores de tu aplicación:
ERROR_REPORTED,ERROR_RESOLVEDyERROR_REOPENED. Tu aplicación los reporta enPOST /api/external/v1/errors/report; se agrupan por huella,ERROR_REPORTEDse emite la primera vez yintegrations_overview: healthlos tiene en cuenta en su veredicto.
Cada aviso lleva la versión de su contenido en la cabecera X-Utilia-Schema-Version y en payload.meta.schemaVersion. Los eventos broadcast llegan a todas las aplicaciones suscritas; los directed, solo a la aplicación dueña del recurso.
La facturación por aplicación se apoya en el módulo de Finanzas: sus facturas y cobros se consultan con apps_billing_list_invoices y apps_billing_list_payments, y los eventos INVOICE_PAID, INVOICE_PAYMENT_FAILED e INVOICE_REFUNDED te avisan del resultado de cada cobro.
CRM (servidor utilia-crm)
Las herramientas canónicas del CRM tienen operaciones que comparten reglas con la API externa (/external/v1/leads y /external/v1/clients). Esta sección recoge las que más usan los integradores.
Cualificar, descartar y convertir leads; desactivar clientes
| Herramienta | Operación | Qué hace | Permiso | Scope | confirm |
|---|---|---|---|---|---|
crm_leads | set_qualified | Pasa el lead a QUALIFIED. Idempotente. | LEADS_EDIT | crm:leads:update | no |
crm_leads | set_disqualified | Pasa el lead a LOST. Es la única baja lógica de un lead por esta vía. | LEADS_EDIT | crm:leads:update | no |
crm_leads | convert_to_contact | Crea un contacto y, si lo pides, una oportunidad, y deja el lead como CONVERTED. Exige un motivo de al menos 20 caracteres. | LEADS_CONVERT | crm:leads:convert o crm:leads:update | sí |
crm_clients | deactivate | Pasa el cliente a INACTIVE: deja de poder recibir facturas y conserva su historial. No existe un borrado real. | CLIENTS_EDIT | crm:clients:update | sí |
Los conjuntos crm:write y crm:full incluyen crm:leads:update y crm:clients:update.
El motivo de set_qualified y de set_disqualified viaja en reason, y se guarda en las notas internas del lead. set_qualified acepta también notes como alias heredado, que es el que usan hoy los métodos setQualified y set_qualified de los SDK; si llegan los dos, manda reason.
Anotar un correo sin enviarlo
crm_interactions_quick: log_email deja constancia de un correo saliente en el historial del cliente, pero no envía nada. Su respuesta trae delivered: false, que es su estado normal, no un fallo. to y body son obligatorios, y con scheduledFor la interacción queda programada en vez de completada.
Anotar no es avisar. Si un asistente usa log_email para «avisar al cliente», dará por comunicado algo que nadie ha recibido. Los correos de verdad salen por las herramientas que los envían: el presupuesto con crm_budgets, la factura con crm_invoices, la campaña con marketing_campaigns.
Grupos de empresas
El CRM agrupa empresas bajo una matriz, en dos niveles: matriz y filiales.
get y list de crm_clients devuelven parentClientId, hierarchyRole (PARENT, SUBSIDIARY o STANDALONE) y parent { id, name }; el nombre de la matriz solo llega si la matriz está dentro de tu alcance. list acepta los filtros parentClientId y hierarchyRole, y la búsqueda por texto encuentra las filiales también por el nombre de su matriz, solo entre las matrices que puedes ver.
Operaciones de grupo en crm_clients_info:
| Operación | Qué hace | Permiso | Scope |
|---|---|---|---|
list_group | Filiales visibles de la matriz, con sus datos básicos. | CLIENTS_VIEW | crm:clients:view |
get_group_stats | Consolidado del grupo, solo sobre la matriz: contactos, proyectos, oportunidades, presupuestos, facturas y tickets de las empresas visibles. Los importes llegan solo con los permisos financieros correspondientes. | CLIENTS_VIEW | crm:clients:view |
link_subsidiary | Vincula una filial a su matriz. | CLIENTS_MANAGE_HIERARCHY | crm:clients:update |
unlink_subsidiary | Desvincula una filial de su matriz. | CLIENTS_MANAGE_HIERARCHY | crm:clients:update |
list_group_assignments | Asignaciones del grupo (id es la matriz): empresas visibles y personas con su asignación en cada empresa ({ clientId, role, isPrimary }). Las personas desactivadas no salen. | CLIENTS_VIEW | crm:clients:view |
assign_group | Asigna hasta 20 personas (userIds) a las empresas del grupo (id es la matriz). role es opcional y vale ASSIGNED por defecto; targetClientIds acota las empresas. Las asignaciones que ya existen conservan su rol y su condición de responsable principal, la operación es idempotente y las empresas fuera de tu alcance se omiten como skippedOutOfScope. Devuelve summary (companiesTargeted, skippedOutOfScope, created y alreadyAssigned) y el desglose por empresa. | CLIENTS_ASSIGN | crm:clients:update |
crm_clients acepta parentClientId en create y en update, y en los dos casos exige CLIENTS_MANAGE_HIERARCHY sobre las dos empresas. En create, el permiso se comprueba antes de crear y el vínculo se aplica después del alta: si el vínculo falla, el cliente queda creado y el error lo dice con su identificador. En update, la jerarquía se procesa primero y, si no puedes gestionarla, no se aplica ningún cambio.
convert_to_invoice de crm_budgets acepta receiverClientId (alias receiver_client_id) para emitir la factura a la matriz del cliente del presupuesto en lugar de a la propia empresa; cualquier otro receptor se rechaza. Pide BUDGETS_EDIT o INVOICES_CREATE (con receptor alternativo, además INVOICES_CREATE y acceso a la matriz) y el scope crm:budgets:update o crm:invoices:create.
Campos personalizados
Cada organización define campos personalizados para clientes, contactos, leads y oportunidades. crm_clients, crm_contacts, crm_leads y crm_opportunities exponen ese catálogo y permiten escribir sus valores.
list_custom_fields devuelve el catálogo activo de la entidad de la herramienta. Consúltalo antes de escribir para conocer las claves válidas y sus tipos.
| Herramienta | Permiso | Scope |
|---|---|---|
crm_clients | CLIENTS_VIEW, CUSTOM_FIELDS_VIEW o CUSTOM_FIELDS_MANAGE | crm:clients:view o crm:custom-fields:view |
crm_contacts | CONTACTS_VIEW, CUSTOM_FIELDS_VIEW o CUSTOM_FIELDS_MANAGE | crm:contacts:view o crm:custom-fields:view |
crm_leads | LEADS_VIEW, CUSTOM_FIELDS_VIEW o CUSTOM_FIELDS_MANAGE | crm:leads:view o crm:custom-fields:view |
crm_opportunities | OPPORTUNITIES_VIEW, CUSTOM_FIELDS_VIEW o CUSTOM_FIELDS_MANAGE | crm:opportunities:view o crm:custom-fields:view |
Cada campo trae key, label, type (TEXT, NUMBER, DATE, BOOLEAN, SELECT, MULTISELECT, CURRENCY, URL, EMAIL o PHONE), description, isRequired, isMultiline, sortOrder y, en las listas, sus options activas ({ value, label }).
Para escribir valores, create y update aceptan customFields con la forma { clave: valor }. El servicio valida el tipo, la obligatoriedad, la opción y el formato, y sus errores llegan legibles. Los valores vuelven también en get y list.
{
"operation": "update",
"id": "cli_123",
"customFields": {
"sector_vertical": "retail",
"fecha_alta_manual": "2026-07-01",
"cliente_estrategico": true
}
}Escribir valores exige el scope de escritura de la entidad (crm:clients:update, crm:contacts:create...); crm:custom-fields:view solo lee el catálogo. Crear, editar o archivar campos no se hace por MCP, sino en la aplicación, con CUSTOM_FIELDS_MANAGE. Filtrar listados por el valor de un campo personalizado tampoco está disponible por MCP.
Automatizaciones del CRM
crm_automations gestiona las automatizaciones sobre leads y oportunidades. Solo trabaja con automatizaciones del CRM, y marketing_automations, solo con las de Marketing: ningún token de un lado ve ni toca las del otro.
| Operaciones | Permiso | Scope |
|---|---|---|
list, get, describe_catalog, validate, list_templates, list_runs, get_run, stats | CRM_AUTOMATIONS_VIEW | crm:automations:view |
create, update, replace_steps, delete, activate, pause, bulk_set_status, test_trigger, duplicate, add_step, update_step, remove_step, create_from_template, retry_run, cancel_run | CRM_AUTOMATIONS_MANAGE | crm:automations:manage |
Cómo usarla:
- El orden recomendado es
describe_catalog,validate,createyactivateconconfirm: true. describe_catalogdevuelve los disparadores y acciones disponibles con su configuración, los límites del validador y los datos reales de tu organización: etapas de cada embudo, formularios de captación activos, etiquetas y estados de lead y de oportunidad. Así no hay que adivinar claves.validatecomprueba una definición entera sin guardar nada, con los mismos validadores que el guardado y la activación, y devuelvevalid,problemsynotesen castellano.- Las automatizaciones nacen en borrador.
activateexigeconfirm: truey revalida todos los pasos;deletetambién exigeconfirm: true. updateconstepsyreplace_stepssustituyen el flujo entero: solo en borrador o en pausa, y cancelan las ejecuciones en curso. Las ramas de un pasoCONDITIONviajan enbranchTrueOrderybranchFalseOrder. Para un paso suelto,add_step,update_stepyremove_step.bulk_set_statusactiva o pausa hasta 25 automatizaciones a la vez y devuelve el resultado de cada una enresultsysummary: un fallo no detiene al resto y reintentar solo los fallidos es seguro. Para activar exigeconfirm: true.test_triggerprueba el flujo con un contacto, como el botón «Probar flujo» de la aplicación. CondryRun: true(por defecto) solo simula; condryRun: falsecrea una ejecución de prueba real, marcada como prueba y fuera de las métricas. La prueba se hace siempre sobre un contacto, aunque el disparador sea de lead o de oportunidad.duplicatecrea una copia en borrador con el nombre «X (copia)» o el que indiques.- En el CRM, el paso
SEND_EMAILexige ademásEMAIL_MARKETING_VIEW, porque usa las plantillas de Marketing. create_from_templateaceptacrm-lead-cooling-alert,crm-form-lead-welcome,crm-negotiation-follow-up-taskycrm-unresponsive-lead-reassign, que también devuelvelist_templates.- Lo que cambies por MCP se refleja solo en la página de automatizaciones del CRM que tengas abierta.
marketing_automations tiene las mismas operaciones de eficiencia: validate con EMAIL_MARKETING_VIEW y marketing:automations:view; replace_steps y bulk_set_status con EMAIL_MARKETING_EDIT, y duplicate con EMAIL_MARKETING_CREATE, las tres con marketing:automations:manage.
Analítica y cualificación de leads
crm_leads_stats es de solo lectura. Pide LEADS_VIEW y el scope crm:leads:view, y cada persona agrega solo las filas que vería en un listado. El período se indica con days (de 1 a 366, 90 por defecto) y se calcula en la zona horaria de la organización.
| Operación | Qué devuelve |
|---|---|
funnel | Cifras del embudo de lead a oportunidad y a cliente: leads nuevos, contactados, cualificados y convertidos, tasas de conversión y reparto por etapa. |
sources | Conversión por source, por utm_source, por campaña y por formulario de captación. El valor estimado solo llega con LEADS_VIEW_FINANCIALS. |
response_time | Tiempo hasta la primera respuesta: media, mediana, percentil 90, porcentaje sin respuesta y tramos (menos de 1, 4, 24 y 72 horas, y más). |
En crm_leads:
set_temperaturefija la temperatura del lead a mano (temperature) o la devuelve al cálculo automático (auto: true, incompatible contemperature). Fijarla marcatemperatureIsManual, y la puntuación deja de recalcularla. PideLEADS_EDITycrm:leads:update.listacepta los filtrostemperature,scoreMinyscoreMax(de 0 a 100),source,industry,leadFormIdyutmSource.getincluyeprofileScore,behaviorScore,temperatureIsManualyfirstContactedAt.
Motivos de pérdida y analítica de oportunidades
crm_opportunities: list_loss_reasonsdevuelve el catálogo de motivos de pérdida de la organización (id,label,sortOrder,isSystem,isArchived,requiresCompetitor,requiresDetaileinUseCount); conincludeArchived: trueincluye los archivados. PideOPPORTUNITIES_VIEWoLEADS_VIEWy el scopecrm:opportunities:viewocrm:leads:view.crm_opportunities_workflow: loseaceptalossReasonId, que tiene preferencia sobre el texto librelostReason: el servidor valida el motivo, aplica sus exigencias de competidor y detalle y copia su etiqueta alostReason. Acepta tambiénpostMortemNotes, para lo aprendido.
crm_opportunities_stats tiene tres análisis más, con period (30d, 90d o 365d; 90d por defecto) y el scope crm:opportunities:view:
| Operación | Qué devuelve | Permiso |
|---|---|---|
funnel | Embudo por etapa de las oportunidades del período: cuántas alcanzaron cada etapa, conversión respecto a la anterior, tiempo en cada etapa (las reaperturas no inflan las cifras), desenlaces y tasa de cierre. Acepta pipelineId. | OPPORTUNITIES_VIEW |
loss_reasons | Pérdidas del período: motivos más frecuentes, con una fila «OTHER», desglose por etapa (byStage) y por comercial (byOwner) y competidores más citados. Los importes solo llegan con OPPORTUNITIES_VIEW_FINANCIALS. | OPPORTUNITIES_VIEW |
by_owner | Clasificación de comerciales: ganadas, perdidas, abandonadas, tasa de éxito y días típicos hasta el cierre. El valor ganado y el importe medio solo llegan con permiso financiero. | OPPORTUNITIES_VIEW_TEAM_PIPELINE |
Los nombres antiguos analytics_loss_reasons y analytics_top_contributors siguen funcionando como alias de loss_reasons y by_owner, con el mismo contrato.
Finanzas (servidor utilia-finance)
El servidor utilia-finance (POST https://os.utilia.ai/api/mcp/finance,
nombre en el intercambio inicial: UTILIA Finance MCP) es el propietario canónico
de la facturación, la tesorería y la fiscalidad de UTILIA OS. Expone
26 herramientas: 12 de facturación, tesorería y fiscalidad (con
nombres y scopes crm:invoices:*, crm:treasury:* y crm:fiscal:*
heredados de su origen en el CRM) y 14 exclusivas con scopes finance:*.
La autorización OAuth usa el recurso /api/mcp/finance (ver
Descubrimiento de OAuth) y los
scopes se documentan en
Scopes y recursos.
Estas 12 herramientas se publicaban también en el servidor utilia-crm.
Desde el 8 de julio de 2026 esas copias están obsoletas: dejan de anunciarse en
el tools/list del servidor CRM, aunque siguen respondiendo a
tools/call con el mismo nombre, esquema y permisos hasta su retirada
definitiva (prevista para el 8 de enero de 2027). Para cualquier flujo financiero
conecta este servidor.
Facturación
| Herramienta | Operaciones principales | Scopes |
|---|---|---|
crm_invoices (canónica) | list, get, create, update, delete, duplicate, get_stats, get_next_number, previewTaxCoherence | crm:invoices:view (lectura), crm:invoices:create/update/delete |
crm_invoices_workflow | issue, cancel, mark_paid, mark_partial_paid, cancelRefund; y el cobro con tarjeta: charge, charge_confirm, refund_create, payment_intent_cancel, payment_intents_list | crm:invoices:issue, crm:invoices:cancel, crm:invoices:refund-cancel; el cobro con crm:invoices:update y la lectura de intentos con crm:invoices:view. Las cinco del cobro exigen además el aplicativo Pagos con tarjeta (Stripe) |
crm_invoices_rectifications | create_rectification, create_credit_note, update_legal_metadata | crm:invoices:create, crm:invoices:update |
crm_invoices_pdf | generate, get_url, regenerate, preview, draft_preview, email_preview (devuelven URL firmada, nunca binario) | crm:invoices:view, crm:invoices:export |
crm_invoices_email_templates | CRUD de plantillas, set_default, preview, variables_list | crm:invoices:view, crm:invoices:update |
crm_invoices_scheduled_charges | list, get, get_logs, schedule, update, cancel, retry_now | crm:invoices:view, crm:invoices:update |
crm_invoices_verifactu | get_status, validate_chain, get_invoice_status (solo lectura: vía MCP no se remite nada a la AEAT) | crm:invoices:view |
crm_subscriptions | CRUD, pause/resume/cancel/reactivate, generate_now, upcoming_charge (supervisión humana) | crm:invoices:view, crm:invoices:update |
crm_mandates | list, get, list_for_client, link_mandate, revoke (supervisión humana) | crm:invoices:view, crm:invoices:update |
Campos fiscales de las líneas (IGIC: exención y comerciante minorista)
Las líneas de crm_invoices (create/update) y de los presupuestos
(crm_budgets, servidor utilia-crm) aceptan campos fiscales adicionales:
taxType: en el sistema IGIC admite, además de los tipos con porcentaje, los valoresEXEMPT(exenta) yNOT_SUBJECT(no sujeta).igicOperationType: clasificación de la línea en el régimen especial del comerciante minorista del IGIC. En ventas:IGIC_RETAIL(venta minorista exenta; exigetaxType: "EXEMPT"y la causa minorista la aplica el motor por defecto) oIGIC_GENERAL. Exige que la organización tenga el régimen declarado en su configuración fiscal (igicRetailerModedistinto deIGIC_RETAILER_NONE).exemptionReason: causa estructurada de la exención, obligatoria contaxType: "EXEMPT"en IGIC. Valores:EXEMPT_IGIC_RETAILER,EXEMPT_IGIC_INTERNAL,EXEMPT_EXPORTyEXEMPT_OTHER. La causa decide la mención legal que se imprime en la factura.exemptionNote: texto explicativo de la exención (máximo 300 caracteres), obligatorio conexemptionReason: "EXEMPT_OTHER"; viaja a la mención legal impresa.
En presupuestos, estos campos se propagan a la factura o a la suscripción al
convertir. Las líneas de gasto (expenses) aceptan también
igicOperationType con un tercer valor propio, IGIC_COMMON (gasto común a
las dos actividades); en un gasto clasificado como IGIC_RETAIL la cuota de
IGIC soportada no es deducible.
Tesorería y fiscalidad
| Herramienta | Operaciones principales | Scopes |
|---|---|---|
treasury (canónica) | Lecturas: cash_position, accounts_list, transactions_list, reconcile_suggestions, forecast, aging_report, cash_flow_report, alerts_list, connection_status, sync_logs, import_batches_list, transactions_export. Escrituras (todas exigen confirm: true): cuentas (account_create/update/delete/set_default/activate/deactivate), movimientos manuales (transaction_create/update/delete; los importados del banco son inmutables), importaciones (import_csv, import_norma43, import_batch_revert), conciliación (transaction_reconcile/unmatch/ratify/revert_reconciliation/exclude), reglas (reconciliation_rule_*), asiento sin factura (transaction_create_journal_entry), force_sync y recurrentes de la previsión (recurring_pattern_*). Convención de signo: el importe de ingresos y gastos se guarda siempre en positivo (el tipo marca la dirección); solo las transferencias llevan signo (positivo entra en la cuenta, negativo sale). No mueve dinero ni conecta/desconecta bancos. | crm:treasury:view, crm:treasury:reconcile, crm:treasury:sync, crm:treasury:export |
fiscal_capture | insumos: adjustments_*, modules_*, attributions_*, foreign_assets_*, irpf_activity_get; rectificativas recibidas: expense_rectification_get/save/save_many. Bajas con confirm y supervisión humana. | crm:fiscal:view/manage; las rectificativas requieren además los scopes de gastos indicados abajo |
fiscal (canónica) | calendar, pending, models_list, calculate, mark_filed, manual_file, pay, periods_*, coherence, catalog, config_get, alerts_list, vat_registry(_export), official_file/pdf (el fichero sigue el diseño del organismo del modelo: AEAT para los estatales, Agencia Tributaria Canaria para el 415), investment_goods_list, investment_good_get/create/update/prorrata/dispose/delete, retention_rates_get/update, sii_batches_list/batch_download | crm:fiscal:view, crm:fiscal:calculate, crm:fiscal:file, crm:fiscal:manage (bienes de inversión escritura y retention_rates_update exigen crm:fiscal:manage; dispose/delete/retention_rates_update con supervisión humana) |
Captura de rectificativas recibidas
fiscal_capture permite consultar y guardar los hechos fiscales de una
rectificativa recibida asociada a un gasto. La captura conserva la referencia
original, la causa, las fechas, la elección de período y las pruebas de deducción.
No modifica los importes del gasto ni el documento original, no genera pagos o
asientos y no presenta declaraciones.
| Operación | Argumentos | Permisos del usuario (todos) | Scopes del token (todos) |
|---|---|---|---|
expense_rectification_get | expenseId | TAX_MODELS_VIEW + EXPENSES_VIEW | crm:fiscal:view + finance:expenses:view |
expense_rectification_save | expenseId, input | TAX_MODELS_CREATE + EXPENSES_VIEW + EXPENSES_EDIT | crm:fiscal:manage + finance:expenses:view + finance:expenses:update |
expense_rectification_save_many | items: 1–25 elementos con expenseId e input | Los mismos que el guardado individual, en cada elemento | Los mismos que el guardado individual |
Se requieren el aplicativo finance y la capacidad finance.tax_models.
El servicio comprueba los permisos y el alcance de cada gasto y referencia;
ser Super Administrador no sustituye los scopes del token ni el plan. Las listas
OR del catálogo no reemplazan estas comprobaciones conjuntas. No se ha añadido
una excepción para tokens antiguos. finance:read y finance:write por sí
solos no conceden crm:fiscal:manage; solicita los scopes necesarios.
El SDK usa POST /api/mcp/finance con el token OAuth autorizado para ese
servidor. No hay ruta REST externa equivalente.
Ejemplo de input sin confirmar, conservado para revisión:
{
"expectedRevision": null,
"cause": "RETURN",
"causeOccurredOn": null,
"causeKnownOn": null,
"original": { "expenseId": "expense-original" },
"amountRepresentation": "DIFFERENCE_SIGNED",
"settlement": {
"route": "UNRESOLVED",
"targetFiscalPeriodId": null,
"reimbursementEvidenceIds": []
},
"evidenceFileIds": [],
"confirm": false
}Envía expectedRevision: null en la primera captura; para editar, consulta
la captura y usa su revisión. Las fechas y referencias que admiten null
deben enviarse explícitamente: omitirlas no equivale a desconocerlas.
confirm es un booleano y no acepta "false" como texto. Confirmar requiere
fechas reales y hechos explícitos; no acredita automáticamente su efecto fiscal.
original acepta exactamente una referencia: { expenseId } o
{ external: { number, issuedOn, supplierTaxId, evidenceFileId } }.
Una referencia externa puede guardarse para revisión; no prueba por sí sola
que el cálculo esté cubierto. Los archivos deben pertenecer a la organización
y ser accesibles al actor. No se aceptan invoiceId, autoría, organización,
sellos ni importes del gasto en esta captura recibida.
deduction es opcional; si lo envías debe contener originalUse,
originalFiscalPeriodId, evidenceFileIds, previousAdjustmentReferences y
allocations. Cada asignación lleva originalTaxId, previouslyDeducted y
deductibleAfterCorrection, con importes decimales como cadenas, por ejemplo
"210.00". No deduzcas estos hechos de la deducibilidad actual del gasto.
En recibidas, reimbursementEvidenceIds debe estar vacío.
Consulta y guardado devuelven la misma vista:
{ capture: { id, revision, confirmedAt } | null, input: objeto | null, status: "COMPLETE" | "REVIEW_REQUIRED", reasons: string[] }.
Sin captura, capture e input son null. Revisa siempre status y
reasons: conservar los hechos no habilita todas las ramas fiscales ni
supone que una declaración esté lista para exportar.
En JavaScript, usando como input el objeto anterior:
const { data: actual } = await sdk.mcp.fiscalCapture.getExpenseRectification(expenseId);
const { data: guardada } = await sdk.mcp.fiscalCapture.saveExpenseRectification(
expenseId, { ...input, expectedRevision: actual.capture?.revision ?? null },
);
const { data: lote } = await sdk.mcp.fiscalCapture.saveExpenseRectifications([
{ expenseId, input: { ...input, expectedRevision: guardada.capture?.revision ?? null } },
]);En Python, entrada es el diccionario del ejemplo; los mismos métodos
están disponibles sin await en UtiliaSDKSync:
from utilia_sdk.mcp.fiscal_capture_types import ExpenseRectificationInput, ExpenseRectificationBatchItem
actual = await sdk.mcp.fiscal_capture.get_expense_rectification(expense_id)
entrada["expectedRevision"] = actual.capture.revision if actual.capture else None
guardada = await sdk.mcp.fiscal_capture.save_expense_rectification(
expense_id, ExpenseRectificationInput.model_validate(entrada),
)
lote = await sdk.mcp.fiscal_capture.save_expense_rectifications([
ExpenseRectificationBatchItem(expense_id=expense_id, input=ExpenseRectificationInput.model_validate(entrada)),
])El lote es secuencial y parcial: un fallo no revierte los elementos guardados
ni impide procesar los siguientes. Devuelve succeeded, failed y
summary: { total, ok, failed }. Cada éxito lleva index y
data: { expenseId, id, revision, status, reasons }; cada fallo lleva
index, code y message. Usa el índice para identificar la entrada que
falló. El resumen no incluye hechos externos, fotografías de datos ni historial.
Para un reintento, conserva los mismos hechos y expectedRevision.
Cada intento vuelve a comprobar el acceso y la equivalencia en el servicio;
no hay atomicidad del lote ni una cola o recibo adicional. Un cambio de hechos,
revisión o contexto fiscal puede dar conflicto y exigir una nueva consulta.
Los errores fiscales estables son VAT_RECTIFICATION_CAPTURE_INVALID,
VAT_RECTIFICATION_CAPTURE_CONFLICT, VAT_RECTIFICATION_EFFECTS_REVIEW_REQUIRED
y VAT_RECTIFICATION_PERIOD_LOCKED. En llamadas individuales viajan en
errorCode y en error.code; el SDK JS conserva errorCode y Python
error_code. En el lote viajan en failed[].code. Los fallos de acceso usan
INSUFFICIENT_SCOPE, FORBIDDEN o NOT_FOUND, sin datos de otra organización.
Contabilidad
| Herramienta | Operaciones principales | Scopes |
|---|---|---|
accounting (canónica) | overview, kpis, alerts, setup, plan de cuentas (accounts_*, seed_pgc), ejercicios (fiscal_year*), unidades de negocio (business_units_list, business_unit_create/update/delete) | finance:accounting:view/create/update/delete |
accounting_journal | asientos (list, create, update, delete), plantillas, contabilize_invoice/expense/payment, post, cancel, reassign_business_unit (reimputa la unidad de negocio de líneas de asientos contabilizados, sin tocar cuentas ni importes) | finance:accounting:* + finance:accounting:post para post/cancel; reassign_business_unit con finance:accounting:update |
accounting_ledger | account_ledger, trial_balance, balance_sheet, income_statement, export_account, business_unit_report (Resultado por unidad de negocio: modos result/full, nivel unit/parent, fila «Sin asignar») | finance:accounting:view, finance:accounting:export |
accounting_assets | activos CRUD, dispose, depreciation_generate/post/reverse | finance:accounting:* + finance:accounting:post para dotaciones |
accounting_close | close_preview, close, reopen, cuentas anuales y capturas, legalización (legalization_get/export) | finance:accounting:close, finance:accounting:export |
Gastos, proveedores, pagos e informes
| Herramienta | Operaciones principales | Scopes |
|---|---|---|
expenses (canónica) | CRUD, stats, export, submit, approve, reject, pay, revert_to_draft, bulk_submit/approve/pay/delete | finance:expenses:view/create/update/delete + finance:expenses:approve |
suppliers | CRUD, create_many, update_many, search_by_tax_id, expense_summary, check_duplicate, deduplicate_preview, deduplicate, merge | finance:suppliers:view/create/update/delete (los lotes, el de su operación suelta; merge, el de borrado) |
suppliers (personas de contacto) | list_contacts, get_contact, contact_stats, create_contact, update_contact, delete_contact | finance:supplier-contacts:view/manage (datos personales de terceros: fuera de finance:read y finance:write) |
suppliers (actividad) | list_interactions, get_interaction, log_interaction, log_interactions_many, update_interaction, delete_interaction, get_interaction_thread, list_interaction_activities, list_interaction_attachments, attach_to_interaction, remove_interaction_attachment, schedule_meeting, complete_meeting, cancel_meeting | finance:suppliers:interactions:read/manage (contenido de correos: fuera de finance:read y finance:write) |
suppliers (vínculos) | list_tasks, list_payments, get_counterpart | El scope del recurso consultado: crm:tasks:view, finance:payments:view y crm:clients:view. El de documentos sí está incluido en finance:read y finance:full; los dos del CRM requieren autorización aparte |
finance_payments (canónica) | list (acepta supplierId), get, stats, logs, check_duplicate, upload, update, delete, restore, promote_to_expense, resolve_duplicate, reprocess, export | finance:payments:view/update/delete + finance:payments:reprocess/export; upload (subir un justificante ya guardado en el gestor de archivos) acepta finance:payments:create o finance:payments:update; crear un gasto desde un documento exige además los scopes de gastos indicados abajo |
finance_reports (canónica, solo lectura) | cash_flow_forecast, aging, vat_summary, profitability | finance:reports:view |
Crear un gasto desde un documento digitalizado exige varios scopes a la vez.
promote_to_expense requiere finance:payments:view,
finance:expenses:create y finance:expenses:approve.
La conversión solicita un gasto aprobado; si el documento está en otra divisa,
el gasto queda en borrador hasta confirmar su importe en euros. No registra
un pago al proveedor.
En resolve_duplicate, action: 'keep_both' conserva el documento como una
factura distinta y crea el gasto con la misma regla. Exige los tres scopes
anteriores y finance:payments:update. action: 'discard' exige
finance:payments:view, finance:payments:update y finance:payments:delete.
Ambas acciones requieren confirm: true. Estos scopes se suman a los permisos
y al alcance del usuario y al acceso de su organización a Finanzas.
Los conjuntos finance:read y finance:write no conceden el scope de aprobación.
Los vínculos del proveedor exigen el scope del otro lado. list_tasks
devuelve tareas del CRM, list_payments documentos de Finanzas y
get_counterpart la identidad de un cliente, así que un token de proveedores
no basta: hace falta además el scope de aquello que se lee. La conjunción sale
sola, porque los scopes que hacen VISIBLE la herramienta siguen siendo solo de
Finanzas. list_tasks exige también el aplicativo CRM en el plan, no solo
Finanzas. get_counterpart exige los CUATRO permisos de los dos lados
(CLIENTS_VIEW, SUPPLIERS_VIEW y los dos de datos sensibles) y devuelve
null sin decir por qué: el mismo null cubre «no tiene NIF», «ninguno casa»
y «queda fuera de tu alcance», porque distinguirlos convertiría la operación en
un comprobador de NIF ajeno. En list_payments y en finance_payments con
supplierId, el NIF leído del documento (supplierNif) solo viaja con
SUPPLIERS_VIEW_SENSITIVE: sin ese permiso la clave no existe en la fila.
Cobro con tarjeta, comisiones y ajustes
| Herramienta | Operaciones principales | Scopes |
|---|---|---|
billing_contacts | CRUD de destinatarios de facturación (list, list_by_client, get, create, update, delete) | finance:billing-contacts:view/manage |
payment_methods | list, stripe_readiness, setup_intent, set_default, delete | finance:payment-methods:view/manage. Toda la herramienta exige Finanzas y Pagos con tarjeta (Stripe) |
commissions | list, by_agent, by_invoice, summary, profit_analysis, approve, cancel | finance:commissions:view/approve |
commissions_admin | reglas y agentes CRUD, assign_client/unassign_client, liquidaciones (settlement_generate/approve/pay) | finance:commissions:view/manage/liquidate |
finance_settings | get_fiscal, get_billing, get_regime, get_finance_comms, update_billing, update_regime (configuración fiscal completa: taxpayerType, cashCriterionEnabled, recargo de equivalencia, igicRetailerMode (régimen especial del comerciante minorista del IGIC: IGIC_RETAILER_NONE/IGIC_RETAILER_MIXED/IGIC_RETAILER_PURE; distinto de NONE exige régimen canario y es incompatible con el recargo de equivalencia), siiEnabled + siiEnrollmentReason, invoicesToPublicAdmin, analyticAccountsByCounterparty), update_fiscal, update_finance_comms (cobro automático y avisos al cliente), get_stripe (estado de los pagos con tarjeta, solo lectura) | finance:settings:view/update |
El cobro con tarjeta exige su propio aplicativo
Además del scope del token y del permiso del usuario, estas operaciones
exigen que la organización tenga contratado el aplicativo «Pagos con
tarjeta (Stripe)», que a su vez exige Finanzas. Sin él la respuesta
es un error de aplicativo no habilitado, y no lo arregla ningún permiso ni
ningún scope. Alcanza a la herramienta payment_methods entera, a
crm_invoices_workflow en charge, charge_confirm, refund_create,
payment_intent_cancel y payment_intents_list, a
crm_clients_info: stripe_readiness y a finance_settings: get_stripe.
No lo exigen, y es deliberado: refund_manual (la devolución
registrada fuera de la pasarela), refunds_list y
cancel_refund_preview (que listan también las manuales), y mark_paid
y mark_partial_paid (el registro manual de un cobro). Registrar una
devolución en efectivo no necesita pasarela y exigirla sería falso.
finance_settings: get_stripe es de solo lectura. Devuelve si la pasarela está disponible, si la organización puede cobrar
y por qué no, el estado de la cuenta conectada, su país y su divisa, y
los requisitos que Stripe tiene pendientes, ya traducidos al
castellano. Con eso el copiloto puede responder «tu cuenta está
conectada pero le falta este documento», que antes no podía responder en
absoluto.
Lo que no hay, y no es un olvido: ni alta ni desconexión por MCP. El
alta exige que una persona teclee en un formulario alojado por Stripe con
verificación de identidad, así que ofrecerla sería prometer lo que no hay.
Y la desconexión es en la práctica irreversible: rehacerla obliga a repetir
el alta entera, y eso no debe estar a un mensaje de distancia. Es el mismo
criterio de payment_methods: setup_intent.
Divergencia de permiso dentro de la herramienta: get_stripe acepta
configurar los pagos con tarjeta o verlos, en lugar del permiso de
ajustes de Finanzas que gobierna al resto de sus operaciones.
La facturación electrónica (Facturae, UBL y envíos a FACe) está retirada desde el 6 de julio de 2026: la herramienta invoices_einvoicing no se publica en tools/list y, si se invoca por su nombre, responde que no está disponible.
Operaciones bajo supervisión humana
Estas operaciones están anotadas con supervisedByHuman en el catálogo:
el cliente MCP debe pedir confirmación expresa al usuario antes de
ejecutarlas. Los scopes del token limitan el dominio finance operación a
operación: el servidor comprueba en cada llamada que el token porta el
scope granular de la operación y la deniega con un error explícito si no
lo lleva. La autorización final exige además que el usuario dueño del
token tenga el permiso correspondiente en UTILIA OS: scope y permiso son
condiciones independientes y ambas deben cumplirse. Las operaciones de
esta tabla exigen scopes que quedan fuera de los conjuntos finance:read y
finance:write (las acciones post, close, approve, delete,
manage, reprocess, submit y liquidate hay que concederlas
explícitamente o usar finance:full).
| Herramienta | Operaciones supervisadas | Scope que las habilita |
|---|---|---|
accounting_journal | post, cancel (contabilizar y anular asientos); reassign_business_unit (reimputa la unidad de negocio de líneas ya contabilizadas) | finance:accounting:post; reassign_business_unit con finance:accounting:update |
accounting_assets | dispose, depreciation_post, depreciation_reverse | finance:accounting:post |
accounting_close | close, reopen (cierre y reapertura del ejercicio) | finance:accounting:close |
expenses | approve, reject, bulk_approve (finance:expenses:approve); bulk_delete (finance:expenses:delete); pay, bulk_submit, bulk_pay (finance:expenses:update) | ver detalle por operación |
finance_payments | reprocess (reanaliza el documento con IA) y delete/restore | finance:payments:reprocess, finance:payments:delete |
payment_methods | setup_intent, set_default, delete | finance:payment-methods:manage |
commissions | approve, cancel | finance:commissions:approve |
commissions_admin | settlement_generate, settlement_approve, settlement_pay | finance:commissions:liquidate |
fiscal | mark_filed, manual_file, pay, period_close, period_reopen (crm:fiscal:file); investment_good_dispose, investment_good_delete, retention_rates_update (crm:fiscal:manage) | ver detalle por operación |
crm_subscriptions, crm_mandates | toda la herramienta (cobros recurrentes y autorizaciones de cobro) | crm:invoices:update |
Dos operaciones mueven dinero real: crm_invoices_workflow: charge, que cobra con la tarjeta guardada del cliente, y refund_create, que devuelve por la pasarela. Las dos exigen confirm: true, el aplicativo de pagos con tarjeta y su permiso (INVOICES_CHARGE para cobrar, STRIPE_PAYMENTS_REFUND para devolver). Fuera de ellas, ninguna herramienta de este servidor mueve dinero ni desconecta bancos, y la parte de VeriFactu es de solo lectura: por MCP no se remite nada a la AEAT. Los presupuestos (crm_budgets*) son un documento comercial previo a la venta y viven solo en el servidor utilia-crm.
RRHH: festivos y calendario laboral
La herramienta attendance del servidor utilia-rrhh (POST https://os.utilia.ai/api/mcp/rrhh) decide qué festivos cuentan para tu empresa a partir de su ámbito territorial. Las mismas operaciones siguen publicadas por compatibilidad en workplace, del servidor utilia-crm, con el prefijo attendance_.
Un festivo cuenta para la empresa si su clave de ámbito (scopeKey) está en la lista de la empresa. Sin comunidad autónoma elegida, esa lista es ['ES', 'COMPANY']: solo cuentan los festivos nacionales y los propios de la empresa.
| Operación | Qué hace | Scope |
|---|---|---|
holidays_scope_get | Comunidad autónoma, isla y municipio de la empresa, las claves de ámbito que salen de ahí y los valores admitidos para elegirlos. | hr:attendance:view |
holidays_set_scope | Fija el ámbito. region es obligatoria, en formato ISO 3166-2; island solo vale con ES-CN; locality es el municipio tal y como se escribe. | hr:attendance:manage |
holidays_import | Carga el calendario oficial de un año dentro del ámbito de la empresa. Es idempotente y devuelve created, skipped y total. | hr:attendance:manage |
holidays_list con applicable | true: solo los festivos que cuentan para la empresa. false: solo los de otros ámbitos. Sin el filtro: todos. | hr:attendance:view |
Las cuatro exigen además el permiso ATTENDANCE_MANAGE_HOLIDAYS y el aplicativo RRHH contratado. Cada festivo devuelve scopeKey, scopeLabel (su rótulo en castellano) y applicable.
{
"jsonrpc": "2.0",
"id": "1",
"method": "tools/call",
"params": {
"name": "attendance",
"arguments": {
"operation": "holidays_set_scope",
"region": "ES-CN",
"island": "GC",
"locality": "Las Palmas de Gran Canaria"
}
}
}Lo que conviene saber:
- Los festivos municipales no se cargan: los publica cada ayuntamiento y no hay una fuente que los cubra.
holidays_importlo dice en el camponoticede su respuesta; se añaden a mano conholidays_create. - El ámbito no se pasa al cargar: sale del que tiene declarado la empresa.
- Una isla fuera de Canarias se rechaza con un error
400. - Elegir el ámbito y cargar el año son escrituras: cambian qué días descuentan jornada a toda la plantilla, así que un token de solo lectura no puede hacerlas.
- Quitar los festivos de otros ámbitos no se puede hacer por MCP. Es un borrado irreversible y solo está en Ajustes › RRHH › Festivos, necesitas entrar con tu cuenta, con vista previa y confirmación.
En los SDK, la superficie es sdk.mcp.attendance.holidays: getScope(), setScope(), import() y list() en JavaScript, y get_scope(), set_scope(), import_year() y list() en Python.
Cambios de contrato de septiembre de 2026
Si tu integración es anterior al 2 de septiembre de 2026, revisa esta sección
Esos días cambió el contrato de varias herramientas: algunas llamadas que funcionaban dejan de hacerlo y algunos datos que viajaban por defecto dejan de viajar.
Los conjuntos de escritura ya no borran en el gestor de archivos
dev:write y crm:write dejan de poder eliminar archivos, versiones y carpetas: para borrar hace falta dev:files:full o crm:files:delete. Ninguno de los dos conjuntos de escritura prometía borrar, igual que ya excluían el resto de los borrados del producto. A cambio, dev:write incluye ahora dev:files:manage, para que los tokens existentes sigan pudiendo crear carpetas y renombrar archivos.
Los datos bancarios y fiscales tienen scope propio
| Scope | Qué autoriza | Dónde está |
|---|---|---|
finance:suppliers:view-sensitive | Ver el NIF, el NIF-IVA, el IBAN, el SWIFT y el banco de los proveedores. | En finance:full. Fuera de finance:read y finance:write. |
crm:clients:view-sensitive | Ver el NIF, el límite de crédito y el descuento pactado de los clientes. | En crm:full. Fuera de crm:read y crm:write. |
La pantalla de autorización los muestra con su nombre y con aviso, porque con el IBAN de un proveedor se puede desviar un pago y las condiciones pactadas con un cliente son información comercial reservada.
Sin el scope, esas claves no existen en la respuesta: no llegan vacías ni nulas, porque un nulo en un campo fiscal se leería como «esta empresa no tiene NIF». Si tu integración compara candidatos lado a lado, tiene que tolerar la clave ausente. Los tokens emitidos antes del 2 de septiembre de 2026 conservan esos datos hasta el 2 de marzo de 2027; las autorizaciones nuevas no los conceden sin nombrarlos.
El recorte afecta a:
suppliers:list,get,search_by_tax_id,check_duplicate,deduplicate_preview,merge,list_payments,createyupdate.finance_payments:list,get,check_duplicateyupdate.crm_clients:list,get,create,update,check_duplicate,deduplicate_previewymerge, y el historial decrm_clients_info. En la previa y en la fusión de clientes se retira además el NIF-IVA, que solo se publica ahí. Los recuentos de cada ficha viajan siempre.- El volcado del reconocimiento de documentos (
extractedData): el recorte cubre trece nombres de clave a cualquier profundidad (el NIF, el NIF-IVA, el IBAN, la cuenta, el SWIFT y el BIC del proveedor, con sus variantes).receiverNif, que es el NIF de tu propia organización, no se recorta. check_duplicatedefinance_paymentsy desuppliers: sinSUPPLIERS_VIEW_SENSITIVE, el NIF desaparece decandidatesy deexpenseCandidates. La detección de duplicados funciona igual, porque se basa en el número, la fecha, el importe y la confianza.
create_many y update_many no aparecen porque cada elemento vuelve en versión corta, sin esos campos.
Archivos: permiso para vincular y scope por tipo de ficha
crm_files_management gobierna upload, link, unlink y bulk_link con FILE_MANAGER_LINK_CRM en lugar de CLIENTS_EDIT, porque admite fichas de varios módulos: las siete del CRM (client, contact, lead, project, opportunity, budget e interaction) y la del proveedor (supplier). El rol Asistente pierde esas cuatro operaciones por MCP, que tampoco podía hacer desde la aplicación.
Cada tipo de ficha exige además su propio scope, comprobado por parámetro:
| Ficha | Leer | Escribir |
|---|---|---|
| Las siete del CRM | El de la herramienta | El de la herramienta |
supplier | finance:suppliers:view | finance:suppliers:update |
get_linked_entities recorta también la lista que devuelve: un token del CRM no ve el nombre del proveedor al que cuelga un archivo. El gestor de archivos añade fm_virtual_folders: get_suppliers_tree, con el árbol de la carpeta virtual «Proveedores», y admite supplier en get_entity_files, link_files, unlink_file y unlink_files.
expenses: document_attach ya no copia el justificante: recibe el identificador de un archivo del gestor al que tengas acceso y lo cuelga del gasto. Sigue exigiendo confirm: true porque sustituye el justificante anterior. expenses: document_get añade source (file o legacy), fileId, fileName, mimeType y size; en los justificantes históricos, el tipo y el tamaño llegan nulos. El archivo queda compartido entre el gestor y el gasto, y un justificante no se puede retirar, solo sustituir.
Scopes nuevos
| Scope | Qué autoriza |
|---|---|
finance:suppliers:view-sensitive | Datos bancarios y fiscales del proveedor. |
crm:clients:view-sensitive | Datos fiscales y económicos del cliente. |
crm:lead-forms:view | Ver los formularios de captación. |
org:notifications:view y org:notifications:manage | Avisos y preferencias de aviso de la persona que autorizó el token. |
crm:portal:view y crm:portal:manage | Ver y gestionar el acceso de terceros al portal del cliente con portal_access. La lectura queda fuera de crm:read y la gestión fuera de crm:write; las dos están en crm:full. |
crm:clients:merge | Fusionar clientes duplicados: crm_clients: deduplicate y merge. |
crm:contacts:merge | Fusionar contactos duplicados: crm_contacts: deduplicate y merge. |
crm:leads:merge | Fusionar leads duplicados: crm_leads: merge. |
Los scopes de fusión se piden siempre por su nombre
Ninguno de los tres está dentro de crm:read ni de crm:write, y tampoco dentro de crm:full. Fusionar archiva o borra fichas y reescribe sus referencias sin vuelta atrás desde la aplicación, así que ninguna autorización antigua lo concede sin que el titular lo apruebe. Si tu aplicación fusiona, añade el scope a los que pide.
Las previas por reglas (deduplicate_preview de clientes y contactos) son lecturas y se piden con el scope de ver. La previa de merge, en cambio, la ejecuta la misma operación destructiva y exige el scope de fusionar.
Operaciones nuevas
Fusión de duplicados en el CRM:
crm_clients: deduplicate_preview: grupos de clientes duplicados según las reglas (mismo NIF; sin NIF, mismo correo, mismo dominio o mismo nombre y ciudad), con el superviviente propuesto, los recuentos de cada ficha y lo que se movería. No escribe nada: bastaCLIENTS_VIEWycrm:clients:view. Si alguna ficha de un grupo queda fuera de tu alcance de fusión, el grupo entero se omite.crm_clients: deduplicate: fusiona esos grupos. Exigeconfirm: true,CLIENTS_MERGEycrm:clients:merge.survivorIdselige quién sobrevive en cada grupo (hasta 500) ygroupIdsacota los grupos (hasta 100); los que ya no son duplicados vuelven enignoredGroupIdssin error.crm_clients: merge: fusiona las fichas que eliges a mano, de 1 a 20 duplicadas; es la salida cuando el NIF está mal escrito en una y ninguna regla las junta. Sinconfirmdevuelve la previa condryRun: truey no escribe nada, pero exige igualmente el permiso y el scope de fusionar. La ficha que sobrevive recibe contactos, oportunidades, proyectos, presupuestos, tareas, facturas, autorizaciones de cobro, accesos al portal, archivos, carpetas e interacciones, y rellena sus campos vacíos con los datos de las demás.- Dos opciones de
mergeexigen alcance total sobre el permiso de fusionar:allowDifferentTaxId, que une dos NIF distintos (nunca si las dos fichas tienen facturas emitidas), yallowPortalAccessMerge, que deja que los interlocutores externos de una empresa vean los documentos de la otra. crm_contactsycrm_leadstienen el mismo juego de operaciones con sus propios scopes. En contactos, dos fichas con usuario del portal no se pueden unir, y si alguna no puede recibir correos, la que sobrevive tampoco podrá.crm_leads: find_duplicateslista los grupos de leads duplicados con su tipo de coincidencia, su puntuación y el valor que los une, conLEADS_VIEWycrm:leads:view.check_duplicatehace lo contrario: contrasta un candidato antes de darlo de alta, yexcludeLeadIdevita que una ficha se detecte a sí misma al editarla.crm_contacts: search_by_emaillocaliza un contacto activo por su correo principal o secundario, sin distinguir mayúsculas. Devuelve como mucho uno, yfound: falsetanto si no hay ninguno como si el que hay queda fuera de tu alcance.
Proveedores:
suppliers: accounting_accounts: subcuentas contables 400 del proveedor. Exige Finanzas con la capacidad de Contabilidad, los permisos de ver contabilidad y de ver proveedores, y el scopefinance:accounting:view.suppliers: createyupdateaceptanlogoFileId, el identificador de una imagen del gestor. En la edición, omitirlo deja el logotipo como está y enviarlo a nulo lo retira.- La actividad del proveedor (
get_interaction_thread,list_interaction_activities,list_interaction_attachments,log_interactions_many,attach_to_interaction,remove_interaction_attachment,schedule_meeting,complete_meeting,cancel_meetingy los filtros nuevos delist_interactions) se explica en La actividad de un proveedor, sin salir del copiloto.
CRM y calendario:
crm_clients: get_counterpart: el proveedor que comparte NIF con el cliente, o nada. Exige los dos aplicativos y los cuatro permisos de los dos lados, sensibles incluidos; si falta cualquiera, la respuesta es «no encontrado», igual que si el cliente no existiera.calendar_events_workflow: get_unifiedaceptasourcespara acotar el calendario unificado a algunas de sus catorce fuentes.supplier_meetingexige además el scope de la actividad del proveedor.
Dos herramientas transversales nuevas, search y notifications, tienen página propia.
Los SDK
Los SDK cubren estos cambios desde la versión 2.27.0. Dos avisos:
- El mensaje de los errores de una herramienta ya no se pierde. El SDK lee las tres formas de error que conviven y añade la pista al mensaje.
- El error del SDK trae
errorCodeydetails.errorCodees el código exacto de la herramienta ydetails, su detalle:requiredScopescuando falta un scope,fieldcuando falta un parámetro,resourceyretryAfterSeconds.code, en cambio, sigue siendoVALIDATION_ERRORen los errores de herramienta, también en la versión actual: para distinguir un «no encontrado» de una regla de negocio, miraerrorCode.
Referencias
- Primeros pasos con MCP.
- Migración del MCP de integraciones de v1 a v2, si tu integración usaba la antigua herramienta
integrations. - Poner al día una cartera de clientes: lotes, logotipos, fusión con previa y espejo incremental.
- Scopes y recursos de OAuth.
- Buscador global y avisos por MCP.
- Herramienta MCP de tickets.