@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 +28 -7
- package/package.json +3 -2
- package/dist/__tests__/client.test.d.ts +0 -2
- package/dist/__tests__/client.test.d.ts.map +0 -1
- package/dist/__tests__/client.test.js +0 -136
- package/dist/__tests__/client.test.js.map +0 -1
- package/dist/__tests__/mode.test.d.ts +0 -2
- package/dist/__tests__/mode.test.d.ts.map +0 -1
- package/dist/__tests__/mode.test.js +0 -25
- package/dist/__tests__/mode.test.js.map +0 -1
- package/dist/__tests__/schemas.test.d.ts +0 -2
- package/dist/__tests__/schemas.test.d.ts.map +0 -1
- package/dist/__tests__/schemas.test.js +0 -53
- package/dist/__tests__/schemas.test.js.map +0 -1
- package/dist/__tests__/tools.test.d.ts +0 -2
- package/dist/__tests__/tools.test.d.ts.map +0 -1
- package/dist/__tests__/tools.test.js +0 -241
- package/dist/__tests__/tools.test.js.map +0 -1
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
|
|
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 (
|
|
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.
|
|
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
|
|
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.
|
|
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,
|
|
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.
|
|
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 +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 +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 +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 +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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"}
|