@servicialo/mcp-server 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -39,7 +39,7 @@ Cualquier servicio, en cualquier vertical, sigue esta secuencia. La lógica espe
39
39
 
40
40
  ## Qué Hace Este MCP Server
41
41
 
42
- Este paquete expone el protocolo Servicialo como 23 herramientas MCP organizadas por **7 fases** del ciclo de vida de un servicio (incluyendo resolución DNS). Un agente no llama endpoints por entidad de base de datos — sigue el flujo natural de coordinar un servicio.
42
+ Este paquete expone el protocolo Servicialo como 33 herramientas MCP organizadas por **8 fases** del ciclo de vida de un servicio (incluyendo resolución DNS), más herramientas de gestión de recursos y administración del resolver. Un agente no llama endpoints por entidad de base de datos — sigue el flujo natural de coordinar un servicio.
43
43
 
44
44
  ### Fase 0 — Resolución DNS (3 herramientas públicas, sin autenticación)
45
45
 
@@ -49,14 +49,16 @@ Este paquete expone el protocolo Servicialo como 23 herramientas MCP organizadas
49
49
  | `resolve.search` | Buscar organizaciones registradas por país y vertical en el resolver global |
50
50
  | `trust.get_score` | Obtener puntaje de confianza de una organización (score 0-100, nivel, última actividad) |
51
51
 
52
- ### Fase 1 — Descubrimiento (4 herramientas públicas, sin autenticación)
52
+ ### Fase 1 — Descubrimiento (6 herramientas públicas, sin autenticación)
53
53
 
54
54
  | Herramienta | Descripción |
55
55
  |---|---|
56
56
  | `registry.search` | Buscar organizaciones por vertical, ubicación, país |
57
57
  | `registry.get_organization` | Obtener detalles públicos: servicios, prestadores, configuración de reservas |
58
+ | `registry.manifest` | Obtener manifiesto del servidor: capacidades, versión del protocolo, metadata de organización |
58
59
  | `scheduling.check_availability` | Consultar disponibilidad (3 variables: prestador ∧ cliente ∧ recurso) |
59
60
  | `services.list` | Listar el catálogo público de servicios de una organización |
61
+ | `a2a.get_agent_card` | Obtener la Agent Card A2A de una organización para descubrimiento inter-agente |
60
62
 
61
63
  ### Fase 2 — Entender (2 herramientas)
62
64
 
@@ -99,6 +101,25 @@ Este paquete expone el protocolo Servicialo como 23 herramientas MCP organizadas
99
101
  | `payments.record_payment` | Registrar pago recibido contra una venta | `payment:write` |
100
102
  | `payments.get_status` | Obtener estado de pago de una venta o saldo de cuenta del cliente | `payment:read` |
101
103
 
104
+ ### Gestión de Recursos (6 herramientas)
105
+
106
+ | Herramienta | Descripción | Scopes |
107
+ |---|---|---|
108
+ | `resource.list` | Listar recursos físicos de una organización | `resource:read` |
109
+ | `resource.get` | Obtener detalles de un recurso con sus slots de disponibilidad | `resource:read` |
110
+ | `resource.create` | Crear un nuevo recurso físico (sala, box, equipamiento) | `resource:write` |
111
+ | `resource.update` | Actualizar recurso (patch semántico) | `resource:write` |
112
+ | `resource.delete` | Desactivar recurso (soft delete: `is_active = false`) | `resource:write` |
113
+ | `resource.get_availability` | Consultar disponibilidad de un recurso por rango de fechas | `resource:read` |
114
+
115
+ ### Administración del Resolver (3 herramientas)
116
+
117
+ | Herramienta | Descripción | Scopes |
118
+ |---|---|---|
119
+ | `resolve.register` | Registrar organización en el resolver global con endpoints MCP/REST | `resolve:write` |
120
+ | `resolve.update_endpoint` | Actualizar endpoints registrados (portabilidad entre backends) | `resolve:write` |
121
+ | `telemetry.heartbeat` | Enviar heartbeat al resolver indicando que el nodo está activo | `telemetry:write` |
122
+
102
123
  ## Instalación y Quickstart
103
124
 
104
125
  ### Opción 1: Modo descubrimiento (zero config)
@@ -107,7 +128,7 @@ Este paquete expone el protocolo Servicialo como 23 herramientas MCP organizadas
107
128
  npx -y @servicialo/mcp-server
108
129
  ```
109
130
 
110
- Sin API key. Sin org ID. 4 herramientas públicas disponibles de inmediato. Pruébalo:
131
+ Sin API key. Sin org ID. 9 herramientas públicas disponibles de inmediato (resolver + descubrimiento). Pruébalo:
111
132
 
112
133
  ```json
113
134
  {
@@ -125,7 +146,7 @@ Sin API key. Sin org ID. 4 herramientas públicas disponibles de inmediato. Pru
125
146
  SERVICIALO_API_KEY=tu_key SERVICIALO_ORG_ID=tu_org npx -y @servicialo/mcp-server
126
147
  ```
127
148
 
128
- Las 20 herramientas habilitadas.
149
+ Las 33 herramientas habilitadas.
129
150
 
130
151
  ### Claude Desktop / Cursor / cualquier cliente MCP
131
152
 
@@ -362,10 +383,10 @@ La especificación completa del protocolo Servicialo está disponible en:
362
383
 
363
384
  - **Repositorio:** [github.com/servicialo/protocol](https://github.com/servicialo/protocol)
364
385
  - **Sitio web:** [servicialo.com](https://servicialo.com)
365
- - **Versión estable actual:** 0.7
366
- - **JSON Schemas:** [`service.schema.json`](https://github.com/servicialo/protocol/blob/main/schema/service.schema.json), [`service-order.schema.json`](https://github.com/servicialo/protocol/blob/main/schema/service-order.schema.json), [`service-mandate.schema.json`](https://github.com/servicialo/protocol/blob/main/schema/service-mandate.schema.json)
386
+ - **Versión estable actual:** 0.9
387
+ - **JSON Schemas:** [`service.schema.json`](https://github.com/servicialo/protocol/blob/main/schema/service.schema.json), [`service-order.schema.json`](https://github.com/servicialo/protocol/blob/main/schema/service-order.schema.json), [`service-mandate.schema.json`](https://github.com/servicialo/protocol/blob/main/schema/service-mandate.schema.json), [`resolution.schema.json`](https://github.com/servicialo/protocol/blob/main/schema/resolution.schema.json), [`servicialo-config.schema.json`](https://github.com/servicialo/protocol/blob/main/schema/servicialo-config.schema.json)
367
388
 
368
- La spec cubre las 8 dimensiones del servicio, 8 estados de ciclo de vida, 5 flujos de excepción (inasistencia, cancelación, disputa, reagendamiento, entrega parcial), la arquitectura de dos entidades (Servicio atómico + Orden de Servicio), y el Modelo de Agencia Delegada.
389
+ La spec cubre las 8 dimensiones del servicio, 9 estados de ciclo de vida, 7 flujos de excepción, la arquitectura de dos entidades (Servicio atómico + Orden de Servicio), el Modelo de Agencia Delegada, resolución DNS, e interoperabilidad A2A.
369
390
 
370
391
  ## Implementación de Referencia
371
392
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicialo/mcp-server",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "mcpName": "com.servicialo/mcp-server",
5
5
  "description": "Open protocol for professional service delivery — connects AI agents with scheduling, verification and settlement of professional services",
6
6
  "license": "Apache-2.0",
@@ -15,7 +15,8 @@
15
15
  },
16
16
  "main": "./dist/index.js",
17
17
  "files": [
18
- "dist"
18
+ "dist",
19
+ "!dist/__tests__"
19
20
  ],
20
21
  "scripts": {
21
22
  "build": "tsc",
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=client.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/client.test.ts"],"names":[],"mappings":""}
@@ -1,136 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from 'vitest';
2
- import { CoordinaloClient } from '../client.js';
3
- describe('CoordinaloClient', () => {
4
- describe('constructor', () => {
5
- it('strips trailing slashes from baseUrl', () => {
6
- const client = new CoordinaloClient({ baseUrl: 'https://example.com///' });
7
- // Verify via isAuthenticated (which doesn't depend on URL)
8
- expect(client.isAuthenticated).toBe(false);
9
- });
10
- });
11
- describe('isAuthenticated', () => {
12
- it('returns false when no credentials', () => {
13
- const client = new CoordinaloClient({ baseUrl: 'https://example.com' });
14
- expect(client.isAuthenticated).toBe(false);
15
- });
16
- it('returns false when only apiKey', () => {
17
- const client = new CoordinaloClient({ baseUrl: 'https://example.com', apiKey: 'key' });
18
- expect(client.isAuthenticated).toBe(false);
19
- });
20
- it('returns false when only orgId', () => {
21
- const client = new CoordinaloClient({ baseUrl: 'https://example.com', orgId: 'org' });
22
- expect(client.isAuthenticated).toBe(false);
23
- });
24
- it('returns true when both apiKey and orgId', () => {
25
- const client = new CoordinaloClient({ baseUrl: 'https://example.com', apiKey: 'key', orgId: 'org' });
26
- expect(client.isAuthenticated).toBe(true);
27
- });
28
- });
29
- describe('public GET', () => {
30
- beforeEach(() => {
31
- vi.restoreAllMocks();
32
- });
33
- it('calls correct URL with query params', async () => {
34
- const mockResponse = { data: 'test' };
35
- const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response(JSON.stringify(mockResponse), { status: 200 }));
36
- const client = new CoordinaloClient({ baseUrl: 'https://api.example.com' });
37
- const result = await client.pub.get('/api/servicialo/registry', {
38
- vertical: 'kinesiologia',
39
- location: 'Santiago',
40
- limit: 5,
41
- });
42
- expect(result).toEqual(mockResponse);
43
- expect(fetchSpy).toHaveBeenCalledOnce();
44
- const calledUrl = new URL(fetchSpy.mock.calls[0][0]);
45
- expect(calledUrl.origin).toBe('https://api.example.com');
46
- expect(calledUrl.pathname).toBe('/api/servicialo/registry');
47
- expect(calledUrl.searchParams.get('vertical')).toBe('kinesiologia');
48
- expect(calledUrl.searchParams.get('location')).toBe('Santiago');
49
- expect(calledUrl.searchParams.get('limit')).toBe('5');
50
- });
51
- it('omits undefined params', async () => {
52
- const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response('{}', { status: 200 }));
53
- const client = new CoordinaloClient({ baseUrl: 'https://api.example.com' });
54
- await client.pub.get('/api/servicialo/registry', {
55
- vertical: 'dental',
56
- location: undefined,
57
- });
58
- const calledUrl = new URL(fetchSpy.mock.calls[0][0]);
59
- expect(calledUrl.searchParams.has('vertical')).toBe(true);
60
- expect(calledUrl.searchParams.has('location')).toBe(false);
61
- });
62
- it('retries with auth headers on 401 when apiKey is available', async () => {
63
- const fetchSpy = vi.spyOn(globalThis, 'fetch')
64
- .mockResolvedValueOnce(new Response('Unauthorized', { status: 401 }))
65
- .mockResolvedValueOnce(new Response('{"ok":true}', { status: 200 }));
66
- const client = new CoordinaloClient({
67
- baseUrl: 'https://api.example.com',
68
- apiKey: 'secret',
69
- orgId: 'org1',
70
- });
71
- const result = await client.pub.get('/api/servicialo/registry');
72
- expect(result).toEqual({ ok: true });
73
- expect(fetchSpy).toHaveBeenCalledTimes(2);
74
- // Second call should have auth header
75
- const secondCallHeaders = fetchSpy.mock.calls[1][1]?.headers;
76
- expect(secondCallHeaders['Authorization']).toBe('Bearer secret');
77
- });
78
- it('throws on 401 when no apiKey available', async () => {
79
- vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response('Unauthorized', { status: 401 }));
80
- const client = new CoordinaloClient({ baseUrl: 'https://api.example.com' });
81
- await expect(client.pub.get('/api/servicialo/registry')).rejects.toThrow('401 Unauthorized');
82
- });
83
- it('throws on non-OK responses', async () => {
84
- vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response('Not Found', { status: 404 }));
85
- const client = new CoordinaloClient({ baseUrl: 'https://api.example.com' });
86
- await expect(client.pub.get('/api/servicialo/missing')).rejects.toThrow('404');
87
- });
88
- });
89
- describe('authenticated requests', () => {
90
- beforeEach(() => {
91
- vi.restoreAllMocks();
92
- });
93
- const makeClient = () => new CoordinaloClient({
94
- baseUrl: 'https://api.example.com',
95
- apiKey: 'test_key',
96
- orgId: 'org_123',
97
- });
98
- it('GET builds org-scoped URL for relative paths', async () => {
99
- const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response('{}', { status: 200 }));
100
- await makeClient().get('/coordinalo/services/srv_1');
101
- const calledUrl = fetchSpy.mock.calls[0][0];
102
- expect(calledUrl).toContain('/api/organizations/org_123/coordinalo/services/srv_1');
103
- });
104
- it('GET uses absolute path when starting with /api/', async () => {
105
- const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response('{}', { status: 200 }));
106
- await makeClient().get('/api/servicialo/registry');
107
- const calledUrl = fetchSpy.mock.calls[0][0];
108
- expect(calledUrl).toBe('https://api.example.com/api/servicialo/registry');
109
- });
110
- it('POST sends JSON body with auth headers', async () => {
111
- const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response('{"id":"ses_1"}', { status: 200 }));
112
- const body = { serviceId: 'srv_1', clientId: 'cli_1' };
113
- const result = await makeClient().post('/coordinalo/sessions', body);
114
- expect(result).toEqual({ id: 'ses_1' });
115
- const [url, options] = fetchSpy.mock.calls[0];
116
- expect(url).toContain('/api/organizations/org_123/coordinalo/sessions');
117
- expect(options?.method).toBe('POST');
118
- expect(options?.body).toBe(JSON.stringify(body));
119
- expect((options?.headers)['Authorization']).toBe('Bearer test_key');
120
- });
121
- it('PUT sends JSON body', async () => {
122
- const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response('{}', { status: 200 }));
123
- await makeClient().put('/coordinalo/sessions/ses_1', { startTime: '2026-03-01T10:00:00Z' });
124
- expect(fetchSpy.mock.calls[0][1]?.method).toBe('PUT');
125
- });
126
- it('throws when calling authenticated endpoint without apiKey', async () => {
127
- const client = new CoordinaloClient({ baseUrl: 'https://api.example.com', orgId: 'org_1' });
128
- await expect(client.get('/coordinalo/services/srv_1')).rejects.toThrow('No SERVICIALO_API_KEY');
129
- });
130
- it('throws when calling org-scoped endpoint without orgId', async () => {
131
- const client = new CoordinaloClient({ baseUrl: 'https://api.example.com', apiKey: 'key' });
132
- await expect(client.get('/coordinalo/services/srv_1')).rejects.toThrow('No SERVICIALO_ORG_ID');
133
- });
134
- });
135
- });
136
- //# sourceMappingURL=client.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../src/__tests__/client.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=mode.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mode.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/mode.test.ts"],"names":[],"mappings":""}
@@ -1,25 +0,0 @@
1
- import { describe, it, expect, beforeEach } from 'vitest';
2
- import { detectMode } from '../mode.js';
3
- describe('detectMode', () => {
4
- beforeEach(() => {
5
- delete process.env.SERVICIALO_API_KEY;
6
- delete process.env.SERVICIALO_ORG_ID;
7
- });
8
- it('returns "discovery" when no credentials are set', () => {
9
- expect(detectMode()).toBe('discovery');
10
- });
11
- it('returns "authenticated" when both API_KEY and ORG_ID are set', () => {
12
- process.env.SERVICIALO_API_KEY = 'test_key';
13
- process.env.SERVICIALO_ORG_ID = 'test_org';
14
- expect(detectMode()).toBe('authenticated');
15
- });
16
- it('falls back to "discovery" when only API_KEY is set', () => {
17
- process.env.SERVICIALO_API_KEY = 'test_key';
18
- expect(detectMode()).toBe('discovery');
19
- });
20
- it('falls back to "discovery" when only ORG_ID is set', () => {
21
- process.env.SERVICIALO_ORG_ID = 'test_org';
22
- expect(detectMode()).toBe('discovery');
23
- });
24
- });
25
- //# sourceMappingURL=mode.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mode.test.js","sourceRoot":"","sources":["../../src/__tests__/mode.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACtC,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,UAAU,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,UAAU,CAAC;QAC3C,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,UAAU,CAAC;QAC5C,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,UAAU,CAAC;QAC3C,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=schemas.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schemas.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/schemas.test.ts"],"names":[],"mappings":""}
@@ -1,53 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { ActorSchema, LocationSchema } from '../tools/schemas.js';
3
- describe('ActorSchema', () => {
4
- it('accepts valid actor with all fields', () => {
5
- const result = ActorSchema.safeParse({
6
- type: 'agent',
7
- id: 'agent_claude',
8
- on_behalf_of: { type: 'client', id: 'cli_1' },
9
- });
10
- expect(result.success).toBe(true);
11
- });
12
- it('accepts actor without on_behalf_of', () => {
13
- const result = ActorSchema.safeParse({ type: 'provider', id: 'prov_1' });
14
- expect(result.success).toBe(true);
15
- });
16
- it('accepts all valid actor types', () => {
17
- for (const type of ['client', 'provider', 'organization', 'agent']) {
18
- const result = ActorSchema.safeParse({ type, id: 'test' });
19
- expect(result.success).toBe(true);
20
- }
21
- });
22
- it('rejects invalid actor type', () => {
23
- const result = ActorSchema.safeParse({ type: 'admin', id: 'test' });
24
- expect(result.success).toBe(false);
25
- });
26
- it('rejects missing id', () => {
27
- const result = ActorSchema.safeParse({ type: 'client' });
28
- expect(result.success).toBe(false);
29
- });
30
- it('rejects missing type', () => {
31
- const result = ActorSchema.safeParse({ id: 'test' });
32
- expect(result.success).toBe(false);
33
- });
34
- });
35
- describe('LocationSchema', () => {
36
- it('accepts valid coordinates', () => {
37
- const result = LocationSchema.safeParse({ lat: -33.4265, lng: -70.6155 });
38
- expect(result.success).toBe(true);
39
- });
40
- it('rejects missing lat', () => {
41
- const result = LocationSchema.safeParse({ lng: -70.6155 });
42
- expect(result.success).toBe(false);
43
- });
44
- it('rejects missing lng', () => {
45
- const result = LocationSchema.safeParse({ lat: -33.4265 });
46
- expect(result.success).toBe(false);
47
- });
48
- it('rejects non-numeric values', () => {
49
- const result = LocationSchema.safeParse({ lat: 'abc', lng: 'def' });
50
- expect(result.success).toBe(false);
51
- });
52
- });
53
- //# sourceMappingURL=schemas.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schemas.test.js","sourceRoot":"","sources":["../../src/__tests__/schemas.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=tools.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tools.test.ts"],"names":[],"mappings":""}
@@ -1,241 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from 'vitest';
2
- import { CoordinaloClient } from '../client.js';
3
- import { registryTools } from '../tools/public/registry.js';
4
- import { publicAvailabilityTools } from '../tools/public/availability.js';
5
- import { publicServicesTools } from '../tools/public/services.js';
6
- import { comprometerTools } from '../tools/authenticated/comprometer.js';
7
- import { deliveryTools } from '../tools/authenticated/delivery.js';
8
- import { cerrarTools } from '../tools/authenticated/cerrar.js';
9
- // Helper: mock fetch to return JSON
10
- function mockFetch(data = {}) {
11
- return vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response(JSON.stringify(data), { status: 200 }));
12
- }
13
- function publicClient() {
14
- return new CoordinaloClient({ baseUrl: 'https://api.test.com' });
15
- }
16
- function authClient() {
17
- return new CoordinaloClient({
18
- baseUrl: 'https://api.test.com',
19
- apiKey: 'key_123',
20
- orgId: 'org_456',
21
- });
22
- }
23
- describe('Public tools', () => {
24
- beforeEach(() => vi.restoreAllMocks());
25
- describe('registry.search', () => {
26
- it('has correct schema', () => {
27
- const result = registryTools['registry.search'].schema.safeParse({
28
- vertical: 'kinesiologia',
29
- });
30
- expect(result.success).toBe(true);
31
- });
32
- it('calls /api/servicialo/registry', async () => {
33
- const spy = mockFetch({ organizations: [] });
34
- await registryTools['registry.search'].handler(publicClient(), {
35
- vertical: 'kinesiologia',
36
- location: 'Santiago',
37
- limit: 5,
38
- });
39
- const url = new URL(spy.mock.calls[0][0]);
40
- expect(url.pathname).toBe('/api/servicialo/registry');
41
- expect(url.searchParams.get('vertical')).toBe('kinesiologia');
42
- });
43
- });
44
- describe('registry.get_organization', () => {
45
- it('calls /api/servicialo/{slug}/services', async () => {
46
- const spy = mockFetch({ services: [] });
47
- await registryTools['registry.get_organization'].handler(publicClient(), {
48
- org_slug: 'clinica-vital',
49
- });
50
- const url = spy.mock.calls[0][0];
51
- expect(url).toContain('/api/servicialo/clinica-vital/services');
52
- });
53
- });
54
- describe('scheduling.check_availability', () => {
55
- it('validates required fields', () => {
56
- const schema = publicAvailabilityTools['scheduling.check_availability'].schema;
57
- expect(schema.safeParse({}).success).toBe(false);
58
- expect(schema.safeParse({
59
- org_slug: 'test',
60
- date_from: '2026-03-01',
61
- date_to: '2026-03-07',
62
- }).success).toBe(true);
63
- });
64
- it('calls correct endpoint with query params', async () => {
65
- const spy = mockFetch({ slots: [] });
66
- await publicAvailabilityTools['scheduling.check_availability'].handler(publicClient(), {
67
- org_slug: 'clinica-vital',
68
- service_id: 'srv_1',
69
- date_from: '2026-03-01',
70
- date_to: '2026-03-07',
71
- });
72
- const url = new URL(spy.mock.calls[0][0]);
73
- expect(url.pathname).toBe('/api/servicialo/clinica-vital/availability');
74
- expect(url.searchParams.get('from')).toBe('2026-03-01');
75
- expect(url.searchParams.get('to')).toBe('2026-03-07');
76
- expect(url.searchParams.get('serviceId')).toBe('srv_1');
77
- });
78
- });
79
- describe('services.list', () => {
80
- it('calls correct endpoint', async () => {
81
- const spy = mockFetch({ services: [] });
82
- await publicServicesTools['services.list'].handler(publicClient(), {
83
- org_slug: 'clinica-vital',
84
- });
85
- const url = spy.mock.calls[0][0];
86
- expect(url).toContain('/api/servicialo/clinica-vital/services');
87
- });
88
- });
89
- });
90
- describe('Authenticated tools', () => {
91
- beforeEach(() => vi.restoreAllMocks());
92
- describe('clients.get_or_create', () => {
93
- it('validates actor is required', () => {
94
- const schema = comprometerTools['clients.get_or_create'].schema;
95
- expect(schema.safeParse({ email: 'test@test.com' }).success).toBe(false);
96
- expect(schema.safeParse({
97
- email: 'test@test.com',
98
- actor: { type: 'agent', id: 'a1' },
99
- }).success).toBe(true);
100
- });
101
- it('POSTs to /relacionalo/clients/upsert with mapped fields', async () => {
102
- const spy = mockFetch({ id: 'cli_1' });
103
- await comprometerTools['clients.get_or_create'].handler(authClient(), {
104
- email: 'maria@test.com',
105
- name: 'María',
106
- last_name: 'González',
107
- actor: { type: 'agent', id: 'agent_1' },
108
- });
109
- const [url, options] = spy.mock.calls[0];
110
- expect(url).toContain('/relacionalo/clients/upsert');
111
- const body = JSON.parse(options?.body);
112
- expect(body.email).toBe('maria@test.com');
113
- expect(body.lastName).toBe('González'); // mapped from last_name
114
- expect(body.actor.type).toBe('agent');
115
- });
116
- });
117
- describe('scheduling.book', () => {
118
- it('POSTs to /coordinalo/sessions with mapped fields', async () => {
119
- const spy = mockFetch({ session_id: 'ses_1', state: 'requested' });
120
- await comprometerTools['scheduling.book'].handler(authClient(), {
121
- service_id: 'srv_1',
122
- provider_id: 'prov_1',
123
- client_id: 'cli_1',
124
- starts_at: '2026-03-01T10:00:00Z',
125
- actor: { type: 'agent', id: 'a1' },
126
- });
127
- const body = JSON.parse(spy.mock.calls[0][1]?.body);
128
- expect(body.serviceId).toBe('srv_1'); // mapped from service_id
129
- expect(body.providerId).toBe('prov_1'); // mapped from provider_id
130
- expect(body.clientId).toBe('cli_1'); // mapped from client_id
131
- expect(body.startTime).toBe('2026-03-01T10:00:00Z'); // mapped from starts_at
132
- });
133
- });
134
- describe('scheduling.confirm', () => {
135
- it('POSTs to /coordinalo/sessions/{id}/confirm', async () => {
136
- const spy = mockFetch({ state: 'confirmed' });
137
- await comprometerTools['scheduling.confirm'].handler(authClient(), {
138
- session_id: 'ses_123',
139
- actor: { type: 'client', id: 'cli_1' },
140
- });
141
- const url = spy.mock.calls[0][0];
142
- expect(url).toContain('/coordinalo/sessions/ses_123/confirm');
143
- });
144
- });
145
- describe('delivery.checkin', () => {
146
- it('POSTs with location and timestamp', async () => {
147
- const spy = mockFetch({ state: 'in_progress' });
148
- await deliveryTools['delivery.checkin'].handler(authClient(), {
149
- session_id: 'ses_1',
150
- actor: { type: 'provider', id: 'prov_1' },
151
- location: { lat: -33.42, lng: -70.61 },
152
- timestamp: '2026-03-01T10:00:00Z',
153
- });
154
- const body = JSON.parse(spy.mock.calls[0][1]?.body);
155
- expect(body.location).toEqual({ lat: -33.42, lng: -70.61 });
156
- expect(body.timestamp).toBe('2026-03-01T10:00:00Z');
157
- });
158
- });
159
- describe('delivery.checkout', () => {
160
- it('POSTs to /coordinalo/sessions/{id}/checkout', async () => {
161
- const spy = mockFetch({ state: 'delivered' });
162
- await deliveryTools['delivery.checkout'].handler(authClient(), {
163
- session_id: 'ses_1',
164
- actor: { type: 'provider', id: 'prov_1' },
165
- });
166
- const url = spy.mock.calls[0][0];
167
- expect(url).toContain('/coordinalo/sessions/ses_1/checkout');
168
- });
169
- });
170
- describe('delivery.record_evidence', () => {
171
- it('validates evidence_type enum', () => {
172
- const schema = deliveryTools['delivery.record_evidence'].schema;
173
- expect(schema.safeParse({
174
- session_id: 's1',
175
- evidence_type: 'photo',
176
- data: { url: 'https://img.test/1.jpg' },
177
- actor: { type: 'provider', id: 'p1' },
178
- }).success).toBe(true);
179
- expect(schema.safeParse({
180
- session_id: 's1',
181
- evidence_type: 'invalid_type',
182
- data: {},
183
- actor: { type: 'provider', id: 'p1' },
184
- }).success).toBe(false);
185
- });
186
- it('POSTs with mapped evidenceType', async () => {
187
- const spy = mockFetch({ evidence_id: 'evi_1' });
188
- await deliveryTools['delivery.record_evidence'].handler(authClient(), {
189
- session_id: 'ses_1',
190
- evidence_type: 'document',
191
- data: { type: 'clinical_record', signed: true },
192
- actor: { type: 'provider', id: 'prov_1' },
193
- });
194
- const body = JSON.parse(spy.mock.calls[0][1]?.body);
195
- expect(body.evidenceType).toBe('document'); // mapped from evidence_type
196
- expect(body.data.signed).toBe(true);
197
- });
198
- });
199
- describe('payments.create_sale', () => {
200
- it('POSTs to /planificalo/sales with mapped fields', async () => {
201
- const spy = mockFetch({ sale_id: 'sale_1' });
202
- await cerrarTools['payments.create_sale'].handler(authClient(), {
203
- client_id: 'cli_1',
204
- service_id: 'srv_1',
205
- provider_id: 'prov_1',
206
- unit_price: 35000,
207
- });
208
- const body = JSON.parse(spy.mock.calls[0][1]?.body);
209
- expect(body.clientId).toBe('cli_1');
210
- expect(body.unitPrice).toBe(35000);
211
- });
212
- });
213
- describe('payments.record_payment', () => {
214
- it('validates payment method enum', () => {
215
- const schema = cerrarTools['payments.record_payment'].schema;
216
- expect(schema.safeParse({
217
- venta_id: 'v1',
218
- amount: 35000,
219
- method: 'transferencia',
220
- }).success).toBe(true);
221
- expect(schema.safeParse({
222
- venta_id: 'v1',
223
- amount: 35000,
224
- method: 'bitcoin',
225
- }).success).toBe(false);
226
- });
227
- it('POSTs to /planificalo/payments with mapped fields', async () => {
228
- const spy = mockFetch({ payment_id: 'pay_1' });
229
- await cerrarTools['payments.record_payment'].handler(authClient(), {
230
- venta_id: 'sale_1',
231
- amount: 35000,
232
- method: 'transferencia',
233
- reference: 'TRX-123',
234
- });
235
- const body = JSON.parse(spy.mock.calls[0][1]?.body);
236
- expect(body.ventaId).toBe('sale_1');
237
- expect(body.paymentMethod).toBe('transferencia');
238
- });
239
- });
240
- });
241
- //# sourceMappingURL=tools.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../src/__tests__/tools.test.ts"],"names":[],"mappings":"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"}