@cgalaviz/easysell-mcp 0.4.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/LICENSE +21 -0
- package/README.md +256 -0
- package/dist/client.d.ts +53 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +372 -0
- package/dist/client.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +49 -0
- package/dist/main.js.map +1 -0
- package/dist/registry/audit.d.ts +3 -0
- package/dist/registry/audit.d.ts.map +1 -0
- package/dist/registry/audit.js +23 -0
- package/dist/registry/audit.js.map +1 -0
- package/dist/registry/binary-downloads.d.ts +3 -0
- package/dist/registry/binary-downloads.d.ts.map +1 -0
- package/dist/registry/binary-downloads.js +80 -0
- package/dist/registry/binary-downloads.js.map +1 -0
- package/dist/registry/canned-responses.d.ts +11 -0
- package/dist/registry/canned-responses.d.ts.map +1 -0
- package/dist/registry/canned-responses.js +54 -0
- package/dist/registry/canned-responses.js.map +1 -0
- package/dist/registry/catalog-images.d.ts +3 -0
- package/dist/registry/catalog-images.d.ts.map +1 -0
- package/dist/registry/catalog-images.js +48 -0
- package/dist/registry/catalog-images.js.map +1 -0
- package/dist/registry/catalog.d.ts +3 -0
- package/dist/registry/catalog.d.ts.map +1 -0
- package/dist/registry/catalog.js +156 -0
- package/dist/registry/catalog.js.map +1 -0
- package/dist/registry/conversations.d.ts +9 -0
- package/dist/registry/conversations.d.ts.map +1 -0
- package/dist/registry/conversations.js +246 -0
- package/dist/registry/conversations.js.map +1 -0
- package/dist/registry/customers.d.ts +3 -0
- package/dist/registry/customers.d.ts.map +1 -0
- package/dist/registry/customers.js +242 -0
- package/dist/registry/customers.js.map +1 -0
- package/dist/registry/iam.d.ts +3 -0
- package/dist/registry/iam.d.ts.map +1 -0
- package/dist/registry/iam.js +116 -0
- package/dist/registry/iam.js.map +1 -0
- package/dist/registry/index.d.ts +3 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +37 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/integrations.d.ts +3 -0
- package/dist/registry/integrations.d.ts.map +1 -0
- package/dist/registry/integrations.js +65 -0
- package/dist/registry/integrations.js.map +1 -0
- package/dist/registry/notifications.d.ts +3 -0
- package/dist/registry/notifications.d.ts.map +1 -0
- package/dist/registry/notifications.js +44 -0
- package/dist/registry/notifications.js.map +1 -0
- package/dist/registry/orders.d.ts +3 -0
- package/dist/registry/orders.d.ts.map +1 -0
- package/dist/registry/orders.js +134 -0
- package/dist/registry/orders.js.map +1 -0
- package/dist/registry/payments.d.ts +3 -0
- package/dist/registry/payments.d.ts.map +1 -0
- package/dist/registry/payments.js +39 -0
- package/dist/registry/payments.js.map +1 -0
- package/dist/registry/pricing.d.ts +3 -0
- package/dist/registry/pricing.d.ts.map +1 -0
- package/dist/registry/pricing.js +20 -0
- package/dist/registry/pricing.js.map +1 -0
- package/dist/registry/quotes.d.ts +19 -0
- package/dist/registry/quotes.d.ts.map +1 -0
- package/dist/registry/quotes.js +81 -0
- package/dist/registry/quotes.js.map +1 -0
- package/dist/registry/reports.d.ts +3 -0
- package/dist/registry/reports.d.ts.map +1 -0
- package/dist/registry/reports.js +33 -0
- package/dist/registry/reports.js.map +1 -0
- package/dist/registry/shipping.d.ts +3 -0
- package/dist/registry/shipping.d.ts.map +1 -0
- package/dist/registry/shipping.js +85 -0
- package/dist/registry/shipping.js.map +1 -0
- package/dist/registry/super-admin.d.ts +11 -0
- package/dist/registry/super-admin.d.ts.map +1 -0
- package/dist/registry/super-admin.js +222 -0
- package/dist/registry/super-admin.js.map +1 -0
- package/dist/registry/tenants.d.ts +13 -0
- package/dist/registry/tenants.d.ts.map +1 -0
- package/dist/registry/tenants.js +78 -0
- package/dist/registry/tenants.js.map +1 -0
- package/dist/registry/types.d.ts +67 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +10 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/registry/uploads.d.ts +3 -0
- package/dist/registry/uploads.d.ts.map +1 -0
- package/dist/registry/uploads.js +86 -0
- package/dist/registry/uploads.js.map +1 -0
- package/dist/registry/usage.d.ts +9 -0
- package/dist/registry/usage.d.ts.map +1 -0
- package/dist/registry/usage.js +33 -0
- package/dist/registry/usage.js.map +1 -0
- package/dist/tools.d.ts +8 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +150 -0
- package/dist/tools.js.map +1 -0
- package/package.json +41 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) Tupla (https://tupla.dev)
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
# @cgalaviz/easysell-mcp — MCP de Easy Sell
|
|
2
|
+
|
|
3
|
+
Servidor [MCP](https://modelcontextprotocol.io) que expone la API de Easy Sell
|
|
4
|
+
(commerce-api: catálogo, clientes, cotizaciones, pedidos, pagos, envíos,
|
|
5
|
+
reportes, notificaciones, integraciones, uso, conversaciones de WhatsApp,
|
|
6
|
+
auditoría y, con una key global, administración de plataforma) como
|
|
7
|
+
herramientas para Claude o cualquier agente compatible con MCP.
|
|
8
|
+
|
|
9
|
+
Corre por **stdio** — el cliente (Claude Desktop, Claude Code, cualquier host
|
|
10
|
+
MCP) lo lanza como proceso local. No expone ningún puerto ni requiere
|
|
11
|
+
desplegarlo aparte. Publicado en npm como `@cgalaviz/easysell-mcp` (el bin se
|
|
12
|
+
llama `easysell-mcp`).
|
|
13
|
+
|
|
14
|
+
## Instalar y correr
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npx @cgalaviz/easysell-mcp
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
(o instalado globalmente: `npm install -g @cgalaviz/easysell-mcp` y luego
|
|
21
|
+
`easysell-mcp`). Necesita `COMMERCE_API_KEY` en el entorno — ver **Autenticación**
|
|
22
|
+
abajo. Sin ella, el proceso falla al arrancar con un mensaje explicando qué
|
|
23
|
+
falta, no con un error de red genérico en la primera tool que se intente usar.
|
|
24
|
+
|
|
25
|
+
## Autenticación
|
|
26
|
+
|
|
27
|
+
Todo pasa por una **API key** (`Authorization: Bearer npk_...`), nunca una
|
|
28
|
+
sesión de usuario. Hay dos tipos:
|
|
29
|
+
|
|
30
|
+
- **Key de tenant** (la normal): se crea desde el panel en **Empresa → API
|
|
31
|
+
keys**, con los scopes que elijas. Solo puede operar la empresa que la
|
|
32
|
+
emitió.
|
|
33
|
+
- **Key global** (T-IAM-09b, solo super-admin): se crea en **Plataforma →
|
|
34
|
+
API keys globales**. Sin tenant fijo — cada llamada decide sobre cuál
|
|
35
|
+
operar con `COMMERCE_TENANT_ID` (ver abajo). Siempre lleva TODOS los
|
|
36
|
+
scopes; no es configurable. Al arrancar, el servidor detecta si la key es
|
|
37
|
+
global y lo avisa por stderr (`⚠️ ... esta API key es GLOBAL ...`), para
|
|
38
|
+
que nunca sea una sorpresa a media sesión.
|
|
39
|
+
|
|
40
|
+
En ambos casos, el MCP solo puede hacer lo que la key tenga permitido — todo
|
|
41
|
+
lo demás lo rechaza commerce-api con 403 (o 404 "Sin tenant" si falta
|
|
42
|
+
`X-Tenant-Id` con una key global). El servidor MCP no añade ni quita permisos
|
|
43
|
+
por su cuenta.
|
|
44
|
+
|
|
45
|
+
**Principio de menor privilegio:** usa una key de tenant con solo los scopes
|
|
46
|
+
que de verdad necesites, salvo que el caso de uso genuinamente cruce varias
|
|
47
|
+
empresas (soporte de plataforma, automatización cross-tenant) — ahí sí toca
|
|
48
|
+
key global, y con eso asumes que cualquier prompt que ese agente procese
|
|
49
|
+
puede, en teoría, terminar tocando cualquier empresa.
|
|
50
|
+
|
|
51
|
+
## Variables de entorno
|
|
52
|
+
|
|
53
|
+
| Variable | Requerida | Default | Descripción |
|
|
54
|
+
|---|---|---|---|
|
|
55
|
+
| `COMMERCE_API_KEY` | Sí | — | La API key (`npk_...`). |
|
|
56
|
+
| `COMMERCE_API_BASE_URL` | No | `https://api-easysell.tupla.dev/api/v1` | Base de la API. Cambiar para apuntar a local/staging. |
|
|
57
|
+
| `COMMERCE_TENANT_ID` | No | — | Solo tiene efecto con una key global: manda `X-Tenant-Id` en cada request para acotarla a una empresa. Con una key de tenant normal se ignora. |
|
|
58
|
+
| `COMMERCE_TIMEOUT_MS` | No | `30000` | Tope por request antes de abortar. Una conexión colgada no debe dejar la sesión MCP entera esperando para siempre. |
|
|
59
|
+
|
|
60
|
+
## Seguridad
|
|
61
|
+
|
|
62
|
+
- **`Authorization`/`X-Tenant-Id` nunca vienen del modelo**: cada tool los
|
|
63
|
+
arma el propio servidor desde variables de entorno fijas al arrancar
|
|
64
|
+
(`src/client.ts`); nada que el agente escriba en los argumentos de una
|
|
65
|
+
tool puede cambiar quién llama ni sobre qué tenant, más allá de lo que la
|
|
66
|
+
tool declara legítimamente (p. ej. un `id` de pedido).
|
|
67
|
+
- **Anotaciones de tool** (`readOnlyHint`/`destructiveHint`/`idempotentHint`/
|
|
68
|
+
`openWorldHint`, spec de MCP): cada tool las declara — `GET` es
|
|
69
|
+
`readOnlyHint`, `DELETE` y las mutaciones con efecto real difícil de
|
|
70
|
+
deshacer (reembolsos, cancelaciones, desactivar una integración/empresa,
|
|
71
|
+
mandar un mensaje de WhatsApp real) llevan `destructiveHint: true`. Un
|
|
72
|
+
cliente MCP que las respeta (Claude Desktop, Claude Code) puede pedir
|
|
73
|
+
confirmación antes de ejecutarlas. Son solo señales — commerce-api sigue
|
|
74
|
+
siendo el único candado real vía scopes.
|
|
75
|
+
- **Timeout por request**: ver `COMMERCE_TIMEOUT_MS` arriba.
|
|
76
|
+
- **Nunca guardes la key en texto plano compartido**: el secreto (`npk_...`)
|
|
77
|
+
se muestra una sola vez al crearlo. Si tu `.mcp.json` o
|
|
78
|
+
`claude_desktop_config.json` se sincroniza, se respalda o se comparte,
|
|
79
|
+
considera la key expuesta — revócala y crea una nueva si eso pasa. Preferir
|
|
80
|
+
un gestor de secretos del sistema operativo cuando el cliente MCP lo
|
|
81
|
+
soporte, en vez de dejar la key en el JSON de config.
|
|
82
|
+
- **Menor privilegio**: ver arriba. Una key con solo `catalog.read` no puede
|
|
83
|
+
hacer nada si el proceso o el prompt se ven comprometidos, más allá de leer
|
|
84
|
+
catálogo.
|
|
85
|
+
- El código es 100% código abierto en este repo (`apps/mcp-server/src`):
|
|
86
|
+
audítalo — no hay llamadas de red a nada más que
|
|
87
|
+
`COMMERCE_API_BASE_URL`, ni telemetría, ni logging del contenido de la key.
|
|
88
|
+
|
|
89
|
+
## Build (para desarrollo local del propio servidor)
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
pnpm --filter @cgalaviz/easysell-mcp build
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Genera `apps/mcp-server/dist/main.js`.
|
|
96
|
+
|
|
97
|
+
## Configurar en Claude Code
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
claude mcp add easysell \
|
|
101
|
+
--env COMMERCE_API_KEY=npk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
|
|
102
|
+
-- npx @cgalaviz/easysell-mcp
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
O agregando a mano en `.mcp.json` (raíz del proyecto o `~/.claude.json`):
|
|
106
|
+
|
|
107
|
+
```json
|
|
108
|
+
{
|
|
109
|
+
"mcpServers": {
|
|
110
|
+
"easysell": {
|
|
111
|
+
"command": "npx",
|
|
112
|
+
"args": ["@cgalaviz/easysell-mcp"],
|
|
113
|
+
"env": {
|
|
114
|
+
"COMMERCE_API_KEY": "npk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Configurar en Claude Desktop
|
|
122
|
+
|
|
123
|
+
En `claude_desktop_config.json` (menú Claude → Settings → Developer → Edit
|
|
124
|
+
Config):
|
|
125
|
+
|
|
126
|
+
```json
|
|
127
|
+
{
|
|
128
|
+
"mcpServers": {
|
|
129
|
+
"easysell": {
|
|
130
|
+
"command": "npx",
|
|
131
|
+
"args": ["@cgalaviz/easysell-mcp"],
|
|
132
|
+
"env": {
|
|
133
|
+
"COMMERCE_API_KEY": "npk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Cualquier otro agente / cliente MCP
|
|
141
|
+
|
|
142
|
+
Cualquier host que hable el protocolo MCP por stdio sirve: lanzar
|
|
143
|
+
`npx @cgalaviz/easysell-mcp` (o `node apps/mcp-server/dist/main.js` desde el
|
|
144
|
+
repo) con `COMMERCE_API_KEY` en el entorno del proceso. No hay nada específico
|
|
145
|
+
de Claude en el servidor — es un `McpServer` estándar del SDK oficial
|
|
146
|
+
(`@modelcontextprotocol/sdk`).
|
|
147
|
+
|
|
148
|
+
## Qué cubre
|
|
149
|
+
|
|
150
|
+
Una tool por endpoint de negocio: catálogo, clientes, cotizaciones, pedidos,
|
|
151
|
+
pagos, envío, pricing, reportes, notificaciones, integraciones, uso,
|
|
152
|
+
conversaciones/WhatsApp y auditoría — más, si la key es global, administración
|
|
153
|
+
de plataforma (`super_admin_*`: empresas, membresías, invitaciones, keys de
|
|
154
|
+
tenant y keys globales). Ver `src/registry/` — un archivo por dominio, cada
|
|
155
|
+
uno una lista declarativa de rutas (`RouteDef`, ver `src/registry/types.ts`)
|
|
156
|
+
que `src/tools.ts` convierte en tools MCP genéricamente. Las pocas rutas que
|
|
157
|
+
no son JSON puro (fotos de catálogo, PDF de cotización) están registradas a
|
|
158
|
+
mano en `src/registry/catalog-images.ts` y `src/registry/binary-downloads.ts`.
|
|
159
|
+
|
|
160
|
+
Quedan fuera a propósito: endpoints `public/*` (usan token de link
|
|
161
|
+
compartido, no API key), onboarding/QR de Evolution y rotación de webhook
|
|
162
|
+
secret (operativos, de una sola vez, mejor desde el panel), e impersonar
|
|
163
|
+
(mecanismo de cookie de sesión de navegador — una key global +
|
|
164
|
+
`COMMERCE_TENANT_ID` logra lo mismo sin necesitarlo).
|
|
165
|
+
|
|
166
|
+
## Desarrollo
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
pnpm --filter @cgalaviz/easysell-mcp dev # tsx, sin build previo
|
|
170
|
+
pnpm --filter @cgalaviz/easysell-mcp typecheck
|
|
171
|
+
pnpm --filter @cgalaviz/easysell-mcp lint
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Para probar interactivamente sin un cliente MCP completo, usa el
|
|
175
|
+
[MCP Inspector](https://modelcontextprotocol.io/docs/tools/inspector):
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
npx @modelcontextprotocol/inspector node apps/mcp-server/dist/main.js
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## API keys — guía completa
|
|
182
|
+
|
|
183
|
+
Hay dos tipos y son cosas distintas.
|
|
184
|
+
|
|
185
|
+
### Key de tenant (la que vas a usar el 99% del tiempo)
|
|
186
|
+
|
|
187
|
+
1. **Panel** → **Empresa → API keys** → **"Crear API key"**.
|
|
188
|
+
2. Nombre: algo descriptivo (ej. `"MCP Claude Code local"`, `"Agente chat producción"`).
|
|
189
|
+
3. Scopes: **mínimo privilegio**. Para un agente de chat que cotiza, cobra y
|
|
190
|
+
lee catálogo: `catalog.read`, `customers.read`, `quotes.write`, `orders.write`,
|
|
191
|
+
`chat.read`, `chat.write`. Para reporting/auditoría sumá `payments.read`,
|
|
192
|
+
`audit.read`. **Nunca** pongas `tenant.admin` o `apikeys.manage` salvo que la
|
|
193
|
+
tool específica lo pida.
|
|
194
|
+
4. Sin expiración, o 90/180 días si querés rotación automática. Una key eterna
|
|
195
|
+
es una fuga permanente si se filtra.
|
|
196
|
+
5. **La key completa (`npk_...`) se muestra UNA sola vez** al crearla. Copiala
|
|
197
|
+
a un gestor de secretos del sistema (1Password CLI, macOS Keychain,
|
|
198
|
+
`gpg`-encrypted file) ANTES de cerrar el modal.
|
|
199
|
+
6. La key queda asociada a UN tenant — si el agente debe operar varias
|
|
200
|
+
empresas, necesitás una key por tenant, o una key global.
|
|
201
|
+
|
|
202
|
+
### Key global (T-IAM-09b — solo super-admin de plataforma)
|
|
203
|
+
|
|
204
|
+
Cubre TODOS los tenants sin que la API key quede atada a uno. Pensada para
|
|
205
|
+
soporte de plataforma y automatizaciones cross-tenant.
|
|
206
|
+
|
|
207
|
+
1. **Panel** → **Plataforma → API keys globales** → **"Crear API key global"**.
|
|
208
|
+
2. No hay scopes que elegir — siempre lleva todos.
|
|
209
|
+
3. La key se crea en la cuenta de un humano (sesión de panel); una key global
|
|
210
|
+
**no puede emitir más keys globales** por sí sola (esto es por diseño).
|
|
211
|
+
4. Para acotar a un tenant puntual sin perder los permisos, export
|
|
212
|
+
`COMMERCE_TENANT_ID=<uuid>` y el header `X-Tenant-Id` se manda solo. Sin
|
|
213
|
+
esa env, la key opera sobre cualquier empresa.
|
|
214
|
+
|
|
215
|
+
### Convención operativa
|
|
216
|
+
|
|
217
|
+
- **Una key por cliente MCP / por despliegue**: Claude Desktop en la laptop
|
|
218
|
+
del dueño, Claude Code en CI, el agente de chat en el contenedor del
|
|
219
|
+
cliente — cada uno su propia key. Si una se filtra, revocas esa y las
|
|
220
|
+
demás siguen.
|
|
221
|
+
- **Rotación**: cuando un empleado del cliente que tenía acceso a la key se
|
|
222
|
+
va, o cada 90-180 días como política, revocá la key en el panel y emití
|
|
223
|
+
una nueva. El equipo de Tupla no necesita intervenir.
|
|
224
|
+
- **Logs**: si tu `.mcp.json` o `claude_desktop_config.json` se sincroniza
|
|
225
|
+
(iCloud, backup, dotfiles repo), se respalda o se comparte, considerá la
|
|
226
|
+
key expuesta — revocala y emití una nueva.
|
|
227
|
+
- **Menos es más**: si la tool que vas a usar no necesita `tenant.admin` para
|
|
228
|
+
funcionar (ver el README de cada tool), no le des ese scope a la key.
|
|
229
|
+
|
|
230
|
+
## Publicar una versión nueva en npm
|
|
231
|
+
|
|
232
|
+
El paquete está bajo el scope personal `@cgalaviz/` (la cuenta npm del autor).
|
|
233
|
+
Como ya publicaste `atiendeya-mcp` antes, la cuenta tiene historial y no
|
|
234
|
+
requiere pasos previos.
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
cd apps/mcp-server
|
|
238
|
+
npm login # user + 2FA OTP
|
|
239
|
+
pnpm --filter @cgalaviz/easysell-mcp build
|
|
240
|
+
npm version patch # o minor/major
|
|
241
|
+
npm publish # corre typecheck+lint+test+build (prepublishOnly)
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
`npm publish` exige **2FA en el momento del publish** (no un token con
|
|
245
|
+
bypass-2FA — npm los está restringiendo para publish directo).
|
|
246
|
+
|
|
247
|
+
### Verificar después de publicar
|
|
248
|
+
|
|
249
|
+
```bash
|
|
250
|
+
npm view @cgalaviz/easysell-mcp version bin engines
|
|
251
|
+
npx @cgalaviz/easysell-mcp < /dev/null # arranca: "140 tools registradas"
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
Si el publish falla con `404 Not Found - PUT`, lo más probable es que la
|
|
255
|
+
sesión de npm haya expirado o que el usuario autenticado no sea `cgalaviz` —
|
|
256
|
+
verificá con `npm whoami` y `npm login` de nuevo si hace falta.
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export interface ApiResult {
|
|
2
|
+
ok: boolean;
|
|
3
|
+
status: number;
|
|
4
|
+
data: unknown;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Ejecuta la petición. Nunca lanza por un error HTTP del backend (4xx/5xx):
|
|
8
|
+
* ese error es información útil para el agente (falta un scope, un recurso
|
|
9
|
+
* no existe, una validación falló), así que se devuelve como dato normal
|
|
10
|
+
* con `ok:false`, no como excepción — el handler de la tool lo traduce a
|
|
11
|
+
* `isError` de MCP sin perder el detalle del body. Tampoco lanza por
|
|
12
|
+
* configuración inválida (URL malformada, scheme no permitido) — eso sería
|
|
13
|
+
* una falla de arranque, no de tool, y debe llegar al cliente como un
|
|
14
|
+
* mensaje accionable, no como un stack trace.
|
|
15
|
+
*/
|
|
16
|
+
export declare function apiRequest(method: string, path: string, opts?: {
|
|
17
|
+
query?: Record<string, string | undefined>;
|
|
18
|
+
body?: unknown;
|
|
19
|
+
}): Promise<ApiResult>;
|
|
20
|
+
export interface DownloadResult {
|
|
21
|
+
ok: boolean;
|
|
22
|
+
status: number;
|
|
23
|
+
base64?: string;
|
|
24
|
+
mimeType?: string;
|
|
25
|
+
error?: unknown;
|
|
26
|
+
}
|
|
27
|
+
/** Descarga binaria (PDF de cotización, CSV de notificaciones): la respuesta no es JSON, se devuelve en base64 con tope. */
|
|
28
|
+
export declare function apiDownload(path: string): Promise<DownloadResult>;
|
|
29
|
+
/**
|
|
30
|
+
* Subida multipart (fotos de catálogo): las dos únicas rutas del registro
|
|
31
|
+
* que no son JSON puro, así que no encajan en `apiRequest` / el DSL
|
|
32
|
+
* declarativo de `registry/types.ts`. El agente manda la imagen en base64;
|
|
33
|
+
* aquí se valida el tamaño ANTES del decode y se arma el
|
|
34
|
+
* `multipart/form-data` que espera `ProductImageUploadInterceptor` (campo
|
|
35
|
+
* `file`).
|
|
36
|
+
*/
|
|
37
|
+
export declare function apiUpload(path: string, file: {
|
|
38
|
+
base64: string;
|
|
39
|
+
filename: string;
|
|
40
|
+
mimeType: string;
|
|
41
|
+
}): Promise<ApiResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Detecta, al arrancar, si la key configurada es GLOBAL (T-IAM-09b) —
|
|
44
|
+
* probando un endpoint que solo `SuperAdminGuard` deja pasar. Nunca lanza:
|
|
45
|
+
* "unknown" si no se pudo determinar (red caída, key inválida — eso ya lo
|
|
46
|
+
* va a reportar la primera tool que se use). Solo informativo, para el aviso
|
|
47
|
+
* de arranque en `main.ts`; ninguna tool depende de este resultado.
|
|
48
|
+
*
|
|
49
|
+
* El path del probe viene del registry (`SUPER_ADMIN_OVERVIEW_PATH`) para
|
|
50
|
+
* que un rename de la ruta no rompa silenciosamente el aviso de "key global".
|
|
51
|
+
*/
|
|
52
|
+
export declare function probeKeyKind(): Promise<"global" | "tenant" | "unknown">;
|
|
53
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAmFA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;CACf;AA+DD;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GACxE,OAAO,CAAC,SAAS,CAAC,CA4BpB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAYD,4HAA4H;AAC5H,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAgFvE;AAqBD;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC3D,OAAO,CAAC,SAAS,CAAC,CAkDpB;AAED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC,CAa7E"}
|