@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.
- package/README.en.md +392 -0
- package/README.md +315 -147
- package/dist/adapter-http.d.ts +51 -0
- package/dist/adapter-http.d.ts.map +1 -0
- package/dist/adapter-http.js +187 -0
- package/dist/adapter-http.js.map +1 -0
- package/dist/adapter.d.ts +42 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +42 -0
- package/dist/adapter.js.map +1 -0
- package/dist/client.d.ts +5 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +3 -0
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +63 -59
- package/dist/index.js.map +1 -1
- package/dist/mandate.d.ts +321 -0
- package/dist/mandate.d.ts.map +1 -0
- package/dist/mandate.js +349 -0
- package/dist/mandate.js.map +1 -0
- package/dist/provider-profile.d.ts +985 -0
- package/dist/provider-profile.d.ts.map +1 -0
- package/dist/provider-profile.js +210 -0
- package/dist/provider-profile.js.map +1 -0
- package/dist/tools/authenticated/cerrar.d.ts +5 -5
- package/dist/tools/authenticated/cerrar.d.ts.map +1 -1
- package/dist/tools/authenticated/cerrar.js.map +1 -1
- package/dist/tools/authenticated/comprometer.d.ts +4 -4
- package/dist/tools/authenticated/comprometer.d.ts.map +1 -1
- package/dist/tools/authenticated/comprometer.js.map +1 -1
- package/dist/tools/authenticated/delivery.d.ts +4 -4
- package/dist/tools/authenticated/delivery.d.ts.map +1 -1
- package/dist/tools/authenticated/delivery.js.map +1 -1
- package/dist/tools/authenticated/entender.d.ts +3 -3
- package/dist/tools/authenticated/entender.d.ts.map +1 -1
- package/dist/tools/authenticated/entender.js.map +1 -1
- package/dist/tools/authenticated/lifecycle.d.ts +5 -5
- package/dist/tools/authenticated/lifecycle.d.ts.map +1 -1
- package/dist/tools/authenticated/lifecycle.js.map +1 -1
- package/dist/tools/authenticated/resolve-auth.d.ts +118 -0
- package/dist/tools/authenticated/resolve-auth.d.ts.map +1 -0
- package/dist/tools/authenticated/resolve-auth.js +62 -0
- package/dist/tools/authenticated/resolve-auth.js.map +1 -0
- package/dist/tools/authenticated/resource.d.ts +295 -0
- package/dist/tools/authenticated/resource.d.ts.map +1 -0
- package/dist/tools/authenticated/resource.js +125 -0
- package/dist/tools/authenticated/resource.js.map +1 -0
- package/dist/tools/public/a2a.d.ts +18 -0
- package/dist/tools/public/a2a.d.ts.map +1 -0
- package/dist/tools/public/a2a.js +15 -0
- package/dist/tools/public/a2a.js.map +1 -0
- package/dist/tools/public/availability.d.ts +2 -2
- package/dist/tools/public/availability.d.ts.map +1 -1
- package/dist/tools/public/availability.js.map +1 -1
- package/dist/tools/public/registry.d.ts +8 -3
- package/dist/tools/public/registry.d.ts.map +1 -1
- package/dist/tools/public/registry.js +8 -0
- package/dist/tools/public/registry.js.map +1 -1
- package/dist/tools/public/resolve.d.ts +60 -0
- package/dist/tools/public/resolve.d.ts.map +1 -0
- package/dist/tools/public/resolve.js +60 -0
- package/dist/tools/public/resolve.js.map +1 -0
- package/dist/tools/public/services.d.ts +2 -2
- package/dist/tools/public/services.d.ts.map +1 -1
- package/dist/tools/public/services.js.map +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -1,32 +1,135 @@
|
|
|
1
1
|
# @servicialo/mcp-server
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
6
|
+
> **[English version](./README.en.md)**
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
**La capa de protocolo que falta para agentes de IA que coordinan servicios profesionales.**
|
|
8
9
|
|
|
9
|
-
|
|
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
|
-
##
|
|
12
|
+
## El Problema
|
|
12
13
|
|
|
13
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
122
|
+
### Opción 2: Modo completo (autenticado)
|
|
22
123
|
|
|
23
124
|
```bash
|
|
24
|
-
SERVICIALO_API_KEY=
|
|
125
|
+
SERVICIALO_API_KEY=tu_key SERVICIALO_ORG_ID=tu_org npx -y @servicialo/mcp-server
|
|
25
126
|
```
|
|
26
127
|
|
|
27
|
-
|
|
128
|
+
Las 20 herramientas habilitadas.
|
|
28
129
|
|
|
29
|
-
### Claude Desktop
|
|
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": "
|
|
39
|
-
"SERVICIALO_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
|
-
|
|
149
|
+
Omitir el bloque `env` para modo solo-descubrimiento.
|
|
47
150
|
|
|
48
|
-
|
|
151
|
+
### Variables de Entorno
|
|
49
152
|
|
|
50
|
-
| Variable |
|
|
51
|
-
|
|
52
|
-
| `SERVICIALO_API_KEY` | No | Bearer token
|
|
53
|
-
| `SERVICIALO_ORG_ID` | No |
|
|
54
|
-
| `SERVICIALO_BASE_URL` | No | API
|
|
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
|
-
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
203
|
+
## Modelo de Agencia Delegada
|
|
70
204
|
|
|
71
|
-
|
|
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
|
-
|
|
207
|
+
### Cómo funciona
|
|
79
208
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
214
|
+
### Ejemplo de mandato
|
|
86
215
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
-
|
|
244
|
+
### Uso de mandatos en tool calls
|
|
94
245
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
265
|
+
### Los 8 checks de validación
|
|
103
266
|
|
|
104
|
-
|
|
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
|
-
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
-
|
|
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
|
-
|
|
126
|
-
|
|
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
|
-
|
|
129
|
-
→ available slots
|
|
316
|
+
El scheduler de 3 variables verifica disponibilidad de prestador, cliente y recurso físico simultáneamente.
|
|
130
317
|
|
|
131
|
-
|
|
132
|
-
→ 8 dimensions: duration 45min, location presencial, billing, etc.
|
|
318
|
+
### Ejemplo de punta a punta
|
|
133
319
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
→ dispute window: 48 hours
|
|
320
|
+
```
|
|
321
|
+
1. registry.search({ vertical: "kinesiologia", location: "santiago" })
|
|
322
|
+
→ encuentra org "clinica-kinesia"
|
|
138
323
|
|
|
139
|
-
|
|
140
|
-
|
|
324
|
+
2. services.list({ org_slug: "clinica-kinesia" })
|
|
325
|
+
→ lista servicios disponibles
|
|
141
326
|
|
|
142
|
-
scheduling.
|
|
143
|
-
|
|
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
|
-
|
|
146
|
-
|
|
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
|
-
|
|
149
|
-
|
|
334
|
+
5. clients.get_or_create({ email: "maria@mail.com", name: "Maria", last_name: "Lopez" })
|
|
335
|
+
→ client_id: "cli_789"
|
|
150
336
|
|
|
151
|
-
|
|
152
|
-
|
|
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
|
-
|
|
155
|
-
|
|
340
|
+
7. scheduling.confirm({ session_id: "ses_001" })
|
|
341
|
+
→ estado: "confirmado"
|
|
156
342
|
|
|
157
|
-
|
|
158
|
-
|
|
343
|
+
8. delivery.checkin({ session_id: "ses_001", location: { lat: -33.45, lng: -70.66 } })
|
|
344
|
+
→ estado: "en_curso"
|
|
159
345
|
|
|
160
|
-
|
|
161
|
-
|
|
346
|
+
9. delivery.checkout({ session_id: "ses_001", location: { lat: -33.45, lng: -70.66 } })
|
|
347
|
+
→ estado: "entregado", duración: 42min
|
|
162
348
|
|
|
163
|
-
|
|
164
|
-
|
|
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
|
-
|
|
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
|
-
|
|
355
|
+
12. lifecycle.transition({ session_id: "ses_001", to_state: "verified" })
|
|
356
|
+
→ estado: "verificado" ✓
|
|
357
|
+
```
|
|
170
358
|
|
|
171
|
-
|
|
359
|
+
## Especificación del Protocolo
|
|
172
360
|
|
|
173
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
376
|
+
## Contribuir al Protocolo
|
|
205
377
|
|
|
206
|
-
|
|
378
|
+
Servicialo sigue versionado semántico para la especificación del protocolo:
|
|
207
379
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
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
|
-
|
|
384
|
+
### Cómo proponer cambios
|
|
218
385
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
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
|
-
|
|
224
|
-
npm run build
|
|
391
|
+
### Áreas buscando input activamente
|
|
225
392
|
|
|
226
|
-
|
|
227
|
-
|
|
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
|
-
##
|
|
398
|
+
## Licencia
|
|
231
399
|
|
|
232
|
-
|
|
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"}
|