@servicialo/mcp-server 0.7.0 → 0.8.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.
Files changed (67) hide show
  1. package/README.en.md +392 -0
  2. package/README.md +315 -147
  3. package/dist/adapter-http.d.ts +51 -0
  4. package/dist/adapter-http.d.ts.map +1 -0
  5. package/dist/adapter-http.js +187 -0
  6. package/dist/adapter-http.js.map +1 -0
  7. package/dist/adapter.d.ts +42 -0
  8. package/dist/adapter.d.ts.map +1 -0
  9. package/dist/adapter.js +42 -0
  10. package/dist/adapter.js.map +1 -0
  11. package/dist/client.d.ts +5 -1
  12. package/dist/client.d.ts.map +1 -1
  13. package/dist/client.js +3 -0
  14. package/dist/client.js.map +1 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +63 -59
  17. package/dist/index.js.map +1 -1
  18. package/dist/mandate.d.ts +321 -0
  19. package/dist/mandate.d.ts.map +1 -0
  20. package/dist/mandate.js +349 -0
  21. package/dist/mandate.js.map +1 -0
  22. package/dist/provider-profile.d.ts +985 -0
  23. package/dist/provider-profile.d.ts.map +1 -0
  24. package/dist/provider-profile.js +210 -0
  25. package/dist/provider-profile.js.map +1 -0
  26. package/dist/tools/authenticated/cerrar.d.ts +5 -5
  27. package/dist/tools/authenticated/cerrar.d.ts.map +1 -1
  28. package/dist/tools/authenticated/cerrar.js.map +1 -1
  29. package/dist/tools/authenticated/comprometer.d.ts +4 -4
  30. package/dist/tools/authenticated/comprometer.d.ts.map +1 -1
  31. package/dist/tools/authenticated/comprometer.js.map +1 -1
  32. package/dist/tools/authenticated/delivery.d.ts +4 -4
  33. package/dist/tools/authenticated/delivery.d.ts.map +1 -1
  34. package/dist/tools/authenticated/delivery.js.map +1 -1
  35. package/dist/tools/authenticated/entender.d.ts +3 -3
  36. package/dist/tools/authenticated/entender.d.ts.map +1 -1
  37. package/dist/tools/authenticated/entender.js.map +1 -1
  38. package/dist/tools/authenticated/lifecycle.d.ts +5 -5
  39. package/dist/tools/authenticated/lifecycle.d.ts.map +1 -1
  40. package/dist/tools/authenticated/lifecycle.js.map +1 -1
  41. package/dist/tools/authenticated/resolve-auth.d.ts +118 -0
  42. package/dist/tools/authenticated/resolve-auth.d.ts.map +1 -0
  43. package/dist/tools/authenticated/resolve-auth.js +62 -0
  44. package/dist/tools/authenticated/resolve-auth.js.map +1 -0
  45. package/dist/tools/authenticated/resource.d.ts +295 -0
  46. package/dist/tools/authenticated/resource.d.ts.map +1 -0
  47. package/dist/tools/authenticated/resource.js +125 -0
  48. package/dist/tools/authenticated/resource.js.map +1 -0
  49. package/dist/tools/public/a2a.d.ts +18 -0
  50. package/dist/tools/public/a2a.d.ts.map +1 -0
  51. package/dist/tools/public/a2a.js +15 -0
  52. package/dist/tools/public/a2a.js.map +1 -0
  53. package/dist/tools/public/availability.d.ts +2 -2
  54. package/dist/tools/public/availability.d.ts.map +1 -1
  55. package/dist/tools/public/availability.js.map +1 -1
  56. package/dist/tools/public/registry.d.ts +8 -3
  57. package/dist/tools/public/registry.d.ts.map +1 -1
  58. package/dist/tools/public/registry.js +8 -0
  59. package/dist/tools/public/registry.js.map +1 -1
  60. package/dist/tools/public/resolve.d.ts +60 -0
  61. package/dist/tools/public/resolve.d.ts.map +1 -0
  62. package/dist/tools/public/resolve.js +60 -0
  63. package/dist/tools/public/resolve.js.map +1 -0
  64. package/dist/tools/public/services.d.ts +2 -2
  65. package/dist/tools/public/services.d.ts.map +1 -1
  66. package/dist/tools/public/services.js.map +1 -1
  67. package/package.json +2 -1
package/README.md CHANGED
@@ -1,32 +1,135 @@
1
1
  # @servicialo/mcp-server
2
2
 
3
- MCP server for the [Servicialo](https://servicialo.com) open protocol — the orchestration layer for the AI-agent service economy. Connects AI agents to professional services via any Servicialo-compatible platform.
3
+ > **Entrada canónica en el registro MCP:** `com.servicialo/mcp-server`
4
+ > La entrada `io.github.danioni/servicialo` está deprecated desde marzo 2026.
4
5
 
5
- **Protocol version:** 0.6 · **Package version:** 0.6.0
6
+ > **[English version](./README.en.md)**
6
7
 
7
- > **Status:** Early-stage protocol with a live reference implementation ([Coordinalo](https://coordinalo.com)) in healthcare (Chile). The protocol spec is stable. The MCP server implements discovery + scheduling + basic lifecycle. Advanced tools (delivery evidence, payments, documentation) are specified but not yet fully wired to backend endpoints. Any platform can implement the protocol as a sovereign node — [get in touch](https://servicialo.com) if you're building for professional services.
8
+ **La capa de protocolo que falta para agentes de IA que coordinan servicios profesionales.**
8
9
 
9
- 20 tools organized by the 6 lifecycle phases of a servicenot by database table.
10
+ No existe una forma estándar para que un agente de IA reserve, verifique y liquide un servicio profesional. Servicialo es un protocolo abierto que resuelve esto y este MCP server es su implementación de referencia. Piensa en HTTP para coordinación de servicios: cualquier agente, cualquier plataforma, un solo protocolo.
10
11
 
11
- ## Two Modes of Operation
12
+ ## El Problema
12
13
 
13
- ### Discovery Mode (no configuration)
14
+ Los agentes de IA pueden navegar la web, escribir código y mantener conversaciones. Pero pídele a uno que reserve una sesión de kinesiología, verifique que ocurrió, y procese el pago — y se desmorona.
15
+
16
+ Hoy, cada plataforma es un silo. No hay estándar para:
17
+
18
+ - **Descubrimiento** — qué prestador, en qué organización, ofrece lo que necesito?
19
+ - **Identidad** — en nombre de quién actúa este agente, y qué está autorizado a hacer?
20
+ - **Ciclo de vida** — en qué estado está este servicio? Quién confirmó? Quién asistió?
21
+ - **Prueba de entrega** — ocurrió realmente la sesión? Por cuánto tiempo? Dónde?
22
+ - **Liquidación** — cuánto, a quién, bajo qué términos contractuales?
23
+
24
+ Sin un protocolo compartido, cada integración es artesanal. Cada conexión agente-plataforma es un API custom. Esto no escala.
25
+
26
+ ## Qué es Servicialo
27
+
28
+ Servicialo es un **protocolo abierto**, no una plataforma. Define cómo los servicios profesionales se mueven a través de su ciclo de vida — desde el descubrimiento hasta el pago — de una forma que cualquier agente de IA o plataforma puede implementar.
29
+
30
+ La relación es como HTTP con Apache, o SMTP con Gmail: Servicialo define las reglas, las implementaciones les dan vida.
31
+
32
+ El protocolo modela cada servicio a través de **8 dimensiones ortogonales** (identidad, prestador, cliente, agenda, ubicación, ciclo de vida, prueba de entrega, facturación) y define **8 estados de ciclo de vida** universales entre verticales — salud, legal, educación, servicios domiciliarios:
33
+
34
+ ```
35
+ Solicitado → Agendado → Confirmado → En Curso → Entregado → Documentado → Cobrado → Verificado
36
+ ```
37
+
38
+ Cualquier servicio, en cualquier vertical, sigue esta secuencia. La lógica específica del vertical vive *dentro* de cada estado, pero la máquina de estados es invariante.
39
+
40
+ ## Qué Hace Este MCP Server
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.
43
+
44
+ ### Fase 0 — Resolución DNS (3 herramientas públicas, sin autenticación)
45
+
46
+ | Herramienta | Descripción |
47
+ |---|---|
48
+ | `resolve.lookup` | Resolver un orgSlug a su endpoint MCP/REST y nivel de confianza (equivalente a DNS lookup) |
49
+ | `resolve.search` | Buscar organizaciones registradas por país y vertical en el resolver global |
50
+ | `trust.get_score` | Obtener puntaje de confianza de una organización (score 0-100, nivel, última actividad) |
51
+
52
+ ### Fase 1 — Descubrimiento (4 herramientas públicas, sin autenticación)
53
+
54
+ | Herramienta | Descripción |
55
+ |---|---|
56
+ | `registry.search` | Buscar organizaciones por vertical, ubicación, país |
57
+ | `registry.get_organization` | Obtener detalles públicos: servicios, prestadores, configuración de reservas |
58
+ | `scheduling.check_availability` | Consultar disponibilidad (3 variables: prestador ∧ cliente ∧ recurso) |
59
+ | `services.list` | Listar el catálogo público de servicios de una organización |
60
+
61
+ ### Fase 2 — Entender (2 herramientas)
62
+
63
+ | Herramienta | Descripción | Scopes |
64
+ |---|---|---|
65
+ | `service.get` | Obtener las 8 dimensiones de un servicio | `service:read` |
66
+ | `contract.get` | Obtener términos del contrato: evidencia requerida, política de cancelación, ventana de disputa | `service:read` `order:read` |
67
+
68
+ ### Fase 3 — Comprometer (3 herramientas)
69
+
70
+ | Herramienta | Descripción | Scopes |
71
+ |---|---|---|
72
+ | `clients.get_or_create` | Resolver identidad del cliente por email/teléfono — buscar o crear en una sola llamada | `patient:write` |
73
+ | `scheduling.book` | Reservar sesión → estado `solicitado`. `resource_id` opcional para recursos físicos | `schedule:write` |
74
+ | `scheduling.confirm` | Confirmar sesión reservada → estado `confirmado` | `schedule:write` |
75
+
76
+ ### Fase 4 — Ciclo de Vida (4 herramientas)
77
+
78
+ | Herramienta | Descripción | Scopes |
79
+ |---|---|---|
80
+ | `lifecycle.get_state` | Obtener estado actual, transiciones disponibles e historial | `service:read` |
81
+ | `lifecycle.transition` | Ejecutar transición de estado con evidencia | `service:write` |
82
+ | `scheduling.reschedule` | Reagendar a nueva fecha/hora (política contractual puede aplicar) | `schedule:write` |
83
+ | `scheduling.cancel` | Cancelar sesión (se aplica política de cancelación del contrato) | `schedule:write` |
84
+
85
+ ### Fase 5 — Verificar Entrega (3 herramientas)
86
+
87
+ | Herramienta | Descripción | Scopes |
88
+ |---|---|---|
89
+ | `delivery.checkin` | Check-in con GPS + timestamp → estado `en_curso` | `evidence:write` |
90
+ | `delivery.checkout` | Check-out con GPS + timestamp → estado `entregado` (duración auto-calculada) | `evidence:write` |
91
+ | `delivery.record_evidence` | Registrar evidencia: `gps`, `firma`, `foto`, `documento`, `duración`, `notas` | `evidence:write` |
92
+
93
+ ### Fase 6 — Cerrar (4 herramientas)
94
+
95
+ | Herramienta | Descripción | Scopes |
96
+ |---|---|---|
97
+ | `documentation.create` | Generar registro del servicio (nota clínica, informe de inspección, etc.) → estado `documentado` | `document:write` |
98
+ | `payments.create_sale` | Crear cargo por servicio documentado → estado `cobrado` | `payment:write` |
99
+ | `payments.record_payment` | Registrar pago recibido contra una venta | `payment:write` |
100
+ | `payments.get_status` | Obtener estado de pago de una venta o saldo de cuenta del cliente | `payment:read` |
101
+
102
+ ## Instalación y Quickstart
103
+
104
+ ### Opción 1: Modo descubrimiento (zero config)
14
105
 
15
106
  ```bash
16
107
  npx -y @servicialo/mcp-server
17
108
  ```
18
109
 
19
- No credentials needed. 4 public tools for discovering organizations, services, and availability.
110
+ Sin API key. Sin org ID. 4 herramientas públicas disponibles de inmediato. Pruébalo:
111
+
112
+ ```json
113
+ {
114
+ "tool": "registry.search",
115
+ "arguments": {
116
+ "vertical": "kinesiologia",
117
+ "location": "santiago"
118
+ }
119
+ }
120
+ ```
20
121
 
21
- ### Authenticated Mode
122
+ ### Opción 2: Modo completo (autenticado)
22
123
 
23
124
  ```bash
24
- SERVICIALO_API_KEY=your_key SERVICIALO_ORG_ID=your_org npx -y @servicialo/mcp-server
125
+ SERVICIALO_API_KEY=tu_key SERVICIALO_ORG_ID=tu_org npx -y @servicialo/mcp-server
25
126
  ```
26
127
 
27
- Requires `SERVICIALO_API_KEY` and `SERVICIALO_ORG_ID`. Enables all 20 tools across the full service lifecycle.
128
+ Las 20 herramientas habilitadas.
28
129
 
29
- ### Claude Desktop Configuration
130
+ ### Claude Desktop / Cursor / cualquier cliente MCP
131
+
132
+ Agregar a tu configuración MCP:
30
133
 
31
134
  ```json
32
135
  {
@@ -35,198 +138,263 @@ Requires `SERVICIALO_API_KEY` and `SERVICIALO_ORG_ID`. Enables all 20 tools acro
35
138
  "command": "npx",
36
139
  "args": ["-y", "@servicialo/mcp-server"],
37
140
  "env": {
38
- "SERVICIALO_API_KEY": "your_api_key",
39
- "SERVICIALO_ORG_ID": "your_org_id"
141
+ "SERVICIALO_API_KEY": "tu_api_key",
142
+ "SERVICIALO_ORG_ID": "tu_org_id"
40
143
  }
41
144
  }
42
145
  }
43
146
  }
44
147
  ```
45
148
 
46
- Omit the `env` block entirely for discovery-only mode.
149
+ Omitir el bloque `env` para modo solo-descubrimiento.
47
150
 
48
- ## Environment Variables
151
+ ### Variables de Entorno
49
152
 
50
- | Variable | Required | Description |
51
- |---|---|---|
52
- | `SERVICIALO_API_KEY` | No | Bearer token enables authenticated mode |
53
- | `SERVICIALO_ORG_ID` | No | Organization slug enables authenticated mode |
54
- | `SERVICIALO_BASE_URL` | No | API base URL of the Servicialo-compatible platform |
153
+ | Variable | Requerida | Default | Descripción |
154
+ |---|---|---|---|
155
+ | `SERVICIALO_API_KEY` | No | — | Bearer token. Habilita modo autenticado |
156
+ | `SERVICIALO_ORG_ID` | No | | Slug de organización. Habilita modo autenticado |
157
+ | `SERVICIALO_BASE_URL` | No | `http://localhost:3000` | Endpoint del API de la plataforma compatible con Servicialo |
158
+ | `SERVICIALO_ADAPTER` | No | `coordinalo` | Adapter de backend: `coordinalo` o `http` |
159
+
160
+ `SERVICIALO_API_KEY` y `SERVICIALO_ORG_ID` deben configurarse juntas. Si solo una está presente, el servidor cae a modo descubrimiento con un warning.
161
+
162
+ ## Conectar una implementación propia
163
+
164
+ Este MCP server soporta cualquier backend compatible con Servicialo a través de la capa de adaptadores pluggable. Dos adaptadores están incluidos:
55
165
 
56
- ## Agent Flow (6 Lifecycle Phases)
166
+ - **`coordinalo`** (default) se conecta a un backend Coordinalo/Digitalo con rutas org-scoped bajo `/api/organizations/{orgId}`.
167
+ - **`http`** — se conecta a cualquier implementación que exponga los endpoints canónicos de `HTTP_PROFILE.md` bajo `/v1/*`.
57
168
 
169
+ ### 3 pasos para conectar tu implementación
170
+
171
+ **Paso 1.** Implementar los endpoints REST definidos en [`HTTP_PROFILE.md`](../../HTTP_PROFILE.md) en tu plataforma.
172
+
173
+ **Paso 2.** Configurar el MCP server para usar el adaptador HTTP:
174
+
175
+ ```bash
176
+ SERVICIALO_ADAPTER=http \
177
+ SERVICIALO_BASE_URL=https://tu-plataforma.com \
178
+ SERVICIALO_API_KEY=tu_key \
179
+ npx -y @servicialo/mcp-server
58
180
  ```
59
- 1. DESCUBRIR → registry.*, check_availability, services.list
60
- 2. ENTENDER → service.get, contract.get
61
- 3. COMPROMETER → clients.get_or_create, scheduling.book, scheduling.confirm
62
- 4. GESTIONAR → lifecycle.get_state, lifecycle.transition, reschedule, cancel
63
- 5. VERIFICAR → delivery.checkin, delivery.checkout, delivery.record_evidence
64
- 6. CERRAR → documentation.create, payments.create_sale, record_payment, get_status
181
+
182
+ **Paso 3.** Agregar a la configuración de tu cliente MCP:
183
+
184
+ ```json
185
+ {
186
+ "mcpServers": {
187
+ "servicialo": {
188
+ "command": "npx",
189
+ "args": ["-y", "@servicialo/mcp-server"],
190
+ "env": {
191
+ "SERVICIALO_ADAPTER": "http",
192
+ "SERVICIALO_BASE_URL": "https://tu-plataforma.com",
193
+ "SERVICIALO_API_KEY": "tu_api_key",
194
+ "SERVICIALO_ORG_ID": "tu_org_id"
195
+ }
196
+ }
197
+ }
198
+ }
65
199
  ```
66
200
 
67
- A well-designed agent follows this order. Each phase has its tools. The protocol guarantees any agent can complete the full cycle with any compatible implementation.
201
+ El adaptador HTTP traduce las rutas internas a endpoints canónicos `/v1/*` y envía el contexto de organización via el header `X-Servicialo-Org`. Consulta `HTTP_PROFILE.md` para el contrato REST completo.
68
202
 
69
- ## Phase 1 Descubrimiento (4 public tools)
203
+ ## Modelo de Agencia Delegada
70
204
 
71
- | Tool | Description |
72
- |---|---|
73
- | `registry.search` | Search organizations by vertical and location |
74
- | `registry.get_organization` | Get public details of an organization |
75
- | `scheduling.check_availability` | Check available slots without authentication. If the service has `resource_id` in its location, also verifies physical resource availability (3-variable scheduler: provider ∧ client ∧ resource) |
76
- | `services.list` | List the public service catalog |
205
+ El protocolo trata a los agentes de IA como actores de primera clase — pero nunca confía en ellos implícitamente. Cada acción de agente requiere un **ServiceMandate**: una delegación explícita de capacidad de un humano principal a un agente.
77
206
 
78
- ## Phase 2 — Entender (2 tools)
207
+ ### Cómo funciona
79
208
 
80
- | Tool | Description |
81
- |---|---|
82
- | `service.get` | Get the 8 dimensions of a service: what, who delivers, who receives (with separate payer), when, where, lifecycle, evidence, billing |
83
- | `contract.get` | Get the pre-agreed service contract: required evidence, cancellation policy, no-show policy, dispute terms |
209
+ 1. Un humano (profesional, paciente u organización) emite un mandato a un agente
210
+ 2. El mandato especifica **para quién** actúa el agente, **qué** puede hacer (scopes), y **por cuánto tiempo**
211
+ 3. En cada tool call, el MCP server valida el mandato contra 8 checks antes de ejecutar
212
+ 4. Cada acción produce una entrada de auditoría éxito o fallo
84
213
 
85
- ## Phase 3 — Comprometer (3 tools)
214
+ ### Ejemplo de mandato
86
215
 
87
- | Tool | Description |
88
- |---|---|
89
- | `clients.get_or_create` | Find a client by email/phone or create if new. Single call to resolve client identity before booking |
90
- | `scheduling.book` | Book a new session → state "Solicitado". Accepts optional `resource_id` to reserve a physical resource (3-variable scheduler). Requires contract.get first |
91
- | `scheduling.confirm` | Confirm a booked session → state "Confirmado" |
216
+ ```json
217
+ {
218
+ "mandate_id": "550e8400-e29b-41d4-a716-446655440000",
219
+ "principal_id": "dra_barbara",
220
+ "principal_type": "professional",
221
+ "agent_id": "agent_booking_bot",
222
+ "agent_name": "Asistente de Agendamiento",
223
+ "acting_for": "professional",
224
+ "context": "org:clinica-kinesia",
225
+ "scopes": ["schedule:read", "schedule:write", "patient:write"],
226
+ "constraints": {
227
+ "max_actions_per_day": 50,
228
+ "allowed_hours": {
229
+ "start": "08:00",
230
+ "end": "20:00",
231
+ "timezone": "America/Santiago"
232
+ },
233
+ "require_confirmation_above": {
234
+ "amount": 100000,
235
+ "currency": "CLP"
236
+ }
237
+ },
238
+ "issued_at": "2026-03-01T00:00:00Z",
239
+ "expires_at": "2026-06-01T00:00:00Z",
240
+ "status": "active"
241
+ }
242
+ ```
92
243
 
93
- ## Phase 4 Ciclo de Vida (4 tools)
244
+ ### Uso de mandatos en tool calls
94
245
 
95
- | Tool | Description |
96
- |---|---|
97
- | `lifecycle.get_state` | Get current lifecycle state, available transitions, and transition history |
98
- | `lifecycle.transition` | Execute a state transition with evidence. Valid: requested→scheduled, scheduled→confirmed, confirmed→in_progress, in_progress→delivered, delivered→documented, documented→charged, charged→verified, any→cancelled |
99
- | `scheduling.reschedule` | Exception flow: reschedule to new datetime. Contract rescheduling policy may apply |
100
- | `scheduling.cancel` | Exception flow: cancel with contract cancellation policy applied |
246
+ Cuando `actor.type` es `"agent"`, incluir el `mandate_id`:
247
+
248
+ ```json
249
+ {
250
+ "tool": "scheduling.book",
251
+ "arguments": {
252
+ "service_id": "srv_123",
253
+ "provider_id": "prov_111",
254
+ "client_id": "cli_789",
255
+ "starts_at": "2026-03-03T10:00:00",
256
+ "actor": {
257
+ "type": "agent",
258
+ "id": "agent_booking_bot",
259
+ "mandate_id": "550e8400-e29b-41d4-a716-446655440000"
260
+ }
261
+ }
262
+ }
263
+ ```
101
264
 
102
- ## Phase 5 Verificar Entrega (3 tools)
265
+ ### Los 8 checks de validación
103
266
 
104
- | Tool | Description |
105
- |---|---|
106
- | `delivery.checkin` | Provider/client check-in with GPS + timestamp → state "En Curso" |
107
- | `delivery.checkout` | Check-out with GPS + timestamp → state "Entregado". Duration auto-calculated |
108
- | `delivery.record_evidence` | Record delivery evidence per vertical: GPS, signature, photo, document, duration, notes |
267
+ Cada tool call de un agente se valida contra:
109
268
 
110
- ## Phase 6 Cerrar (4 tools)
269
+ | # | Check | Qué previene |
270
+ |---|---|---|
271
+ | 1 | **Estado** — mandato debe ser `active` | Uso de mandatos revocados o expirados |
272
+ | 2 | **Validez temporal** — `issued_at ≤ now < expires_at` | Ataques basados en tiempo |
273
+ | 3 | **Identidad del agente** — `mandate.agent_id === agente solicitante` | Suplantación de agente |
274
+ | 4 | **Cobertura de scopes** — scopes del mandato cubren los requisitos de la herramienta | Escalación de privilegios |
275
+ | 5 | **Contexto** — contexto del mandato coincide con la solicitud | Acceso cross-org a datos |
276
+ | 6 | **Conflicto de interés** — agente no puede actuar para ambas partes | Violaciones de doble agencia |
277
+ | 7 | **Restricciones** — horarios permitidos, límites diarios, umbrales financieros | Agentes sobre-autónomos |
278
+ | 8 | **Auditoría** — cada acción registrada con inputs sanitizados | No repudio |
111
279
 
112
- | Tool | Description |
113
- |---|---|
114
- | `documentation.create` | Generate service record (clinical note, inspection report, class minutes, etc.) → state "Documentado" |
115
- | `payments.create_sale` | Create a sale/charge for the documented service → state "Cobrado" |
116
- | `payments.record_payment` | Record payment received. Payment is independent from lifecycle billing.status transitions from charged invoiced paid |
117
- | `payments.get_status` | Get payment status for a sale or client account balance |
280
+ Actores no-agente (`client`, `provider`, `organization`) no pasan por validación de mandato.
281
+
282
+ ## Descubrimiento de Prestadores
283
+
284
+ Los agentes pueden buscar en el registro y hacer matching de prestadores con las necesidades de un paciente usando consultas estructuradas.
118
285
 
119
- ## End-to-End Example
286
+ ### Buscar en el registro
120
287
 
288
+ ```json
289
+ {
290
+ "tool": "registry.search",
291
+ "arguments": {
292
+ "vertical": "kinesiologia",
293
+ "location": "santiago",
294
+ "country": "cl"
295
+ }
296
+ }
121
297
  ```
122
- registry.search({ vertical: "kinesiologia", location: "santiago" })
123
- → find org "clinica-kinesia"
124
298
 
125
- registry.get_organization({ org_slug: "clinica-kinesia" })
126
- → list services, providers
299
+ Retorna organizaciones que coinciden con sus servicios y prestadores.
300
+
301
+ ### Consultar disponibilidad
302
+
303
+ ```json
304
+ {
305
+ "tool": "scheduling.check_availability",
306
+ "arguments": {
307
+ "org_slug": "clinica-kinesia",
308
+ "service_id": "srv_rehab_pelvica",
309
+ "provider_id": "prov_111",
310
+ "date_from": "2026-03-10",
311
+ "date_to": "2026-03-14"
312
+ }
313
+ }
314
+ ```
127
315
 
128
- scheduling.check_availability({ org_slug: "clinica-kinesia", date_from: "2026-03-01", date_to: "2026-03-07" })
129
- → available slots
316
+ El scheduler de 3 variables verifica disponibilidad de prestador, cliente y recurso físico simultáneamente.
130
317
 
131
- service.get({ service_id: "srv_123" })
132
- → 8 dimensions: duration 45min, location presencial, billing, etc.
318
+ ### Ejemplo de punta a punta
133
319
 
134
- contract.get({ service_id: "srv_123", org_id: "org_456" })
135
- evidence: check_in + check_out + clinical_record
136
- cancellation: 0% if >24h, 50% if 2-24h, 100% if <2h
137
- → dispute window: 48 hours
320
+ ```
321
+ 1. registry.search({ vertical: "kinesiologia", location: "santiago" })
322
+ encuentra org "clinica-kinesia"
138
323
 
139
- clients.get_or_create({ email: "paciente@mail.com", name: "Maria", last_name: "Lopez", actor: { type: "agent", id: "agent_1" } })
140
- client_id: "cli_789"
324
+ 2. services.list({ org_slug: "clinica-kinesia" })
325
+ lista servicios disponibles
141
326
 
142
- scheduling.book({ service_id: "srv_123", provider_id: "prov_111", client_id: "cli_789", starts_at: "2026-03-03T10:00:00", actor: { type: "agent", id: "agent_1" } })
143
- session_id: "ses_001", state: "requested"
327
+ 3. scheduling.check_availability({ org_slug: "clinica-kinesia", date_from: "2026-03-10", date_to: "2026-03-14" })
328
+ retorna slots disponibles
144
329
 
145
- scheduling.confirm({ session_id: "ses_001", actor: { type: "client", id: "cli_789" } })
146
- state: "confirmed"
330
+ 4. contract.get({ service_id: "srv_123", org_id: "org_456" })
331
+ cancelación: 0% si >24h, 50% si 2-24h, 100% si <2h
332
+ → evidencia requerida: check_in + check_out + registro_clinico
147
333
 
148
- delivery.checkin({ session_id: "ses_001", actor: { type: "provider", id: "prov_111" }, location: { lat: -33.45, lng: -70.66 } })
149
- state: "in_progress"
334
+ 5. clients.get_or_create({ email: "maria@mail.com", name: "Maria", last_name: "Lopez" })
335
+ client_id: "cli_789"
150
336
 
151
- delivery.checkout({ session_id: "ses_001", actor: { type: "provider", id: "prov_111" }, location: { lat: -33.45, lng: -70.66 } })
152
- state: "delivered", duration: 42min
337
+ 6. scheduling.book({ service_id: "srv_123", provider_id: "prov_111", client_id: "cli_789", starts_at: "2026-03-12T10:00:00" })
338
+ session_id: "ses_001", estado: "solicitado"
153
339
 
154
- delivery.record_evidence({ session_id: "ses_001", evidence_type: "document", data: { type: "clinical_record", signed_by: ["prov_111", "cli_789"] }, actor: { type: "provider", id: "prov_111" } })
155
- evidence recorded
340
+ 7. scheduling.confirm({ session_id: "ses_001" })
341
+ estado: "confirmado"
156
342
 
157
- documentation.create({ session_id: "ses_001", content: "Sesion de rehabilitacion...", actor: { type: "provider", id: "prov_111" } })
158
- state: "documented"
343
+ 8. delivery.checkin({ session_id: "ses_001", location: { lat: -33.45, lng: -70.66 } })
344
+ estado: "en_curso"
159
345
 
160
- payments.create_sale({ client_id: "cli_789", service_id: "srv_123", provider_id: "prov_111", unit_price: 35000 })
161
- sale_id: "sale_001", state: "charged"
346
+ 9. delivery.checkout({ session_id: "ses_001", location: { lat: -33.45, lng: -70.66 } })
347
+ estado: "entregado", duración: 42min
162
348
 
163
- lifecycle.transition({ session_id: "ses_001", to_state: "verified", actor: { type: "client", id: "cli_789" } })
164
- state: "verified"
165
- ```
349
+ 10. documentation.create({ session_id: "ses_001", content: "Sesión de rehabilitación de piso pélvico..." })
350
+ estado: "documentado"
166
351
 
167
- ## Changelog
352
+ 11. payments.create_sale({ client_id: "cli_789", service_id: "srv_123", unit_price: 35000 })
353
+ → sale_id: "sale_001", estado: "cobrado"
168
354
 
169
- ### Package 0.6.0 (current)
355
+ 12. lifecycle.transition({ session_id: "ses_001", to_state: "verified" })
356
+ → estado: "verificado" ✓
357
+ ```
170
358
 
171
- Protocol v0.6.0 Resource as first-class dimension (3.5b).
359
+ ## Especificación del Protocolo
172
360
 
173
- | Change | Detail |
174
- |---|---|
175
- | `scheduling.check_availability` | Now accepts optional `resource_id` — verifies physical resource availability alongside provider (3-variable scheduler: provider ∧ client ∧ resource) |
176
- | `scheduling.book` | Now accepts optional `resource_id` — reserves physical resource alongside session |
177
- | New types | `ResourceSchema`, `ResourceAvailabilitySchema`, `ServiceLocationSchema` with `resource_id` |
178
- | New exception flow | 5.7 Resource Conflict — when a resource is double-booked or unavailable |
361
+ La especificación completa del protocolo Servicialo está disponible en:
179
362
 
180
- ### Package 0.5.0
363
+ - **Repositorio:** [github.com/servicialo/protocol](https://github.com/servicialo/protocol)
364
+ - **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)
181
367
 
182
- Consolidated from 38 tools to 20. Tools are now organized by lifecycle phase instead of database entity.
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.
183
369
 
184
- | Removed Tool | Replacement |
185
- |---|---|
186
- | `scheduling.list_sessions` | `lifecycle.get_state` |
187
- | `clients.list` | `clients.get_or_create` |
188
- | `clients.get` | `clients.get_or_create` |
189
- | `clients.create` | `clients.get_or_create` |
190
- | `clients.history` | `lifecycle.get_state` |
191
- | `payments.list_sales` | `payments.get_status` |
192
- | `payments.client_balance` | `payments.get_status` |
193
- | `notifications.send_session_reminder` | `lifecycle.transition` |
194
- | `notifications.send_payment_reminder` | `lifecycle.transition` |
195
- | `providers.list` | Removed (not part of service lifecycle) |
196
- | `providers.get` | Removed (not part of service lifecycle) |
197
- | `providers.get_commission` | Removed (not part of service lifecycle) |
198
- | `payroll.*` (5 tools) | Removed (not part of service lifecycle) |
370
+ ## Implementación de Referencia
199
371
 
200
- ### Protocol 0.6 (current)
372
+ **Digitalo** es la primera implementación en producción del protocolo Servicialo, operando en salud en Chile. Implementa el ciclo de vida completo — desde descubrimiento de prestadores hasta liquidación de pagos — y sirve como terreno de validación para la evolución del protocolo.
201
373
 
202
- Resource as a first-class sub-dimension of Location (3.5b). `resource_id` optional in Location. New exception flow: Resource Conflict (5.7). Scheduler becomes 3-variable: provider client resource.
374
+ Este MCP server se conecta a cualquier backend compatible con Servicialo a través de `SERVICIALO_BASE_URL`. Digitalo es uno de esos backends. El protocolo está diseñado para que cualquier CRM, HIS, o plataforma lo implemente como un nodo soberano.
203
375
 
204
- ### Protocol 0.3
376
+ ## Contribuir al Protocolo
205
377
 
206
- Lifecycle state order changed. Verified moved from position 6 to position 8 (final). Verification is the closure of the cycle — the client needs the full picture (documentation + charge) before confirming.
378
+ Servicialo sigue versionado semántico para la especificación del protocolo:
207
379
 
208
- | Previous State | Current State | Notes |
209
- |---|---|---|
210
- | Completed | Delivered | Renamed provider marks delivery, not completion |
211
- | Documented | Documented | Unchanged — comes after Delivered |
212
- | Invoiced | — | Removed from lifecycle — tracked in billing.status |
213
- | Collected | — | Removed from lifecycle — tracked in billing.status |
214
- | — | Charged | New — charge applied 1:1 with delivered + documented session |
215
- | Verified (pos 6) | Verified (pos 8) | Moved to final — client confirms or auto-verified after silence window |
380
+ - **Patch** (0.7.x) clarificaciones, correcciones de typos, adiciones no-breaking
381
+ - **Minor** (0.x.0) — nuevos campos opcionales, nuevas definiciones de herramientas, nuevos flujos de excepción
382
+ - **Major** (x.0.0) cambios breaking a schemas, máquina de estados, o semántica core
216
383
 
217
- ## Development
384
+ ### Cómo proponer cambios
218
385
 
219
- ```bash
220
- # Install dependencies
221
- npm install
386
+ 1. Abrir un issue describiendo el problema y la solución propuesta
387
+ 2. Para cambios significativos, escribir un RFC en `spec/` con el número de sección que afecta
388
+ 3. Los cambios al protocolo requieren al menos una implementación de referencia antes de merge
389
+ 4. Los cambios a schemas deben incluir JSON Schema actualizado y tipos Zod en el MCP server
222
390
 
223
- # Build
224
- npm run build
391
+ ### Áreas buscando input activamente
225
392
 
226
- # Watch mode
227
- npm run dev
228
- ```
393
+ - Requisitos de evidencia específicos por vertical (más allá de salud)
394
+ - Soporte multi-idioma para nombres de estados del ciclo de vida
395
+ - Federación inter-nodo (cómo dos implementaciones Servicialo interoperan)
396
+ - Patrones de Agent SDK para Python y TypeScript
229
397
 
230
- ## License
398
+ ## Licencia
231
399
 
232
- Servicialo Protocol is open infrastructure. Licensed under Apache 2.0 — any implementation, commercial or otherwise, is welcome. See [LICENSE](./LICENSE) for details.
400
+ Apache-2.0 — cualquier implementación, comercial o no, es bienvenida. Ver [LICENSE](./LICENSE).
@@ -0,0 +1,51 @@
1
+ /**
2
+ * HttpAdapter — generic adapter for any Servicialo-compatible implementation
3
+ * that exposes the canonical HTTP_PROFILE.md REST endpoints.
4
+ *
5
+ * Path translation:
6
+ * Coordinalo internal paths (used by tool handlers) are translated to
7
+ * canonical /v1/* paths defined in HTTP_PROFILE.md.
8
+ *
9
+ * Public endpoints:
10
+ * /api/servicialo/registry → /v1/registry
11
+ * /api/servicialo/{slug}/services → /v1/organizations/{slug}/services
12
+ * /api/servicialo/{slug}/availability → /v1/organizations/{slug}/availability
13
+ *
14
+ * Authenticated endpoints:
15
+ * /coordinalo/* → /v1/*
16
+ * /relacionalo/clients/upsert → /v1/clients
17
+ * /planificalo/* → /v1/*
18
+ *
19
+ * Unlike CoordinaloClient, this adapter does NOT prefix paths with
20
+ * /api/organizations/{orgId}. The org context is communicated via
21
+ * the X-Servicialo-Org header (or the implementation's own mechanism).
22
+ */
23
+ import type { ServicialoAdapter } from './adapter.js';
24
+ export interface HttpAdapterConfig {
25
+ baseUrl: string;
26
+ apiKey?: string;
27
+ orgId?: string;
28
+ }
29
+ export declare class HttpAdapter implements ServicialoAdapter {
30
+ private baseUrl;
31
+ private apiKey;
32
+ private orgId;
33
+ constructor(config: HttpAdapterConfig);
34
+ get isAuthenticated(): boolean;
35
+ /**
36
+ * Translate a Coordinalo-internal path to a canonical HTTP_PROFILE.md path.
37
+ */
38
+ private translatePath;
39
+ private authHeaders;
40
+ private publicHeaders;
41
+ private buildUrl;
42
+ readonly pub: {
43
+ get: (path: string, params?: Record<string, string | number | undefined>) => Promise<unknown>;
44
+ };
45
+ get(path: string, params?: Record<string, string | number | undefined>): Promise<unknown>;
46
+ post(path: string, body?: unknown): Promise<unknown>;
47
+ put(path: string, body?: unknown): Promise<unknown>;
48
+ patch(path: string, body?: unknown): Promise<unknown>;
49
+ delete(path: string): Promise<unknown>;
50
+ }
51
+ //# sourceMappingURL=adapter-http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-http.d.ts","sourceRoot":"","sources":["../src/adapter-http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,WAAY,YAAW,iBAAiB;IACnD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,KAAK,CAAqB;gBAEtB,MAAM,EAAE,iBAAiB;IAMrC,IAAI,eAAe,IAAI,OAAO,CAE7B;IAID;;OAEG;IACH,OAAO,CAAC,aAAa;IA2CrB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,QAAQ;IAMhB,QAAQ,CAAC,GAAG;oBACQ,MAAM,WAAW,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,KAAG,OAAO,CAAC,OAAO,CAAC;MAsBjG;IAII,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAuBzF,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAepD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAenD,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAerD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAa7C"}