@smsmasivos/mcp-server 0.2.3 → 0.3.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 (53) hide show
  1. package/dist/api-client.d.ts +2 -0
  2. package/dist/api-client.js +14 -9
  3. package/dist/api-client.js.map +1 -1
  4. package/dist/metrics.d.ts +22 -0
  5. package/dist/metrics.js +55 -0
  6. package/dist/metrics.js.map +1 -0
  7. package/dist/prompts/index.d.ts +2 -0
  8. package/dist/prompts/index.js +59 -0
  9. package/dist/prompts/index.js.map +1 -0
  10. package/dist/resources/faq.d.ts +2 -0
  11. package/dist/resources/faq.js +173 -0
  12. package/dist/resources/faq.js.map +1 -0
  13. package/dist/resources/index.d.ts +2 -0
  14. package/dist/resources/index.js +5 -0
  15. package/dist/resources/index.js.map +1 -0
  16. package/dist/schemas.d.ts +99 -0
  17. package/dist/schemas.js +41 -0
  18. package/dist/schemas.js.map +1 -1
  19. package/dist/stdio.js +11 -2
  20. package/dist/stdio.js.map +1 -1
  21. package/dist/tools/add-loyalty-contact.d.ts +3 -0
  22. package/dist/tools/add-loyalty-contact.js +22 -0
  23. package/dist/tools/add-loyalty-contact.js.map +1 -0
  24. package/dist/tools/add-wallet-contact.d.ts +3 -0
  25. package/dist/tools/add-wallet-contact.js +22 -0
  26. package/dist/tools/add-wallet-contact.js.map +1 -0
  27. package/dist/tools/delete-contact.d.ts +3 -0
  28. package/dist/tools/delete-contact.js +17 -0
  29. package/dist/tools/delete-contact.js.map +1 -0
  30. package/dist/tools/get-loyalty-contact.d.ts +3 -0
  31. package/dist/tools/get-loyalty-contact.js +23 -0
  32. package/dist/tools/get-loyalty-contact.js.map +1 -0
  33. package/dist/tools/get-metrics.d.ts +2 -0
  34. package/dist/tools/get-metrics.js +25 -0
  35. package/dist/tools/get-metrics.js.map +1 -0
  36. package/dist/tools/get-wallet-contact.d.ts +3 -0
  37. package/dist/tools/get-wallet-contact.js +23 -0
  38. package/dist/tools/get-wallet-contact.js.map +1 -0
  39. package/dist/tools/index.js +52 -9
  40. package/dist/tools/index.js.map +1 -1
  41. package/dist/tools/list-loyalty-cards.d.ts +3 -0
  42. package/dist/tools/list-loyalty-cards.js +23 -0
  43. package/dist/tools/list-loyalty-cards.js.map +1 -0
  44. package/dist/tools/list-wallets.d.ts +3 -0
  45. package/dist/tools/list-wallets.js +23 -0
  46. package/dist/tools/list-wallets.js.map +1 -0
  47. package/dist/tools/register-loyalty-sale.d.ts +3 -0
  48. package/dist/tools/register-loyalty-sale.js +22 -0
  49. package/dist/tools/register-loyalty-sale.js.map +1 -0
  50. package/dist/tools/update-wallet-balance.d.ts +3 -0
  51. package/dist/tools/update-wallet-balance.js +23 -0
  52. package/dist/tools/update-wallet-balance.js.map +1 -0
  53. package/package.json +1 -1
@@ -1,6 +1,8 @@
1
1
  export interface ApiClientConfig {
2
2
  apiKey: string;
3
3
  baseUrl?: string;
4
+ cfAccessClientId?: string;
5
+ cfAccessClientSecret?: string;
4
6
  timeout?: number;
5
7
  }
6
8
  export type ApiCall = <T>(endpoint: string, params?: Record<string, unknown>) => Promise<T>;
@@ -5,21 +5,26 @@ export function createApiClient(config) {
5
5
  const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;
6
6
  const timeout = config.timeout ?? DEFAULT_TIMEOUT;
7
7
  async function apiCall(endpoint, params) {
8
- return executeWithRetry(baseUrl, endpoint, config.apiKey, timeout, params);
8
+ return executeWithRetry(baseUrl, endpoint, config.apiKey, timeout, params, config.cfAccessClientId, config.cfAccessClientSecret);
9
9
  }
10
10
  return apiCall;
11
11
  }
12
- async function executeWithRetry(baseUrl, endpoint, apiKey, timeout, params, attempt = 1) {
12
+ async function executeWithRetry(baseUrl, endpoint, apiKey, timeout, params, cfAccessClientId, cfAccessClientSecret, attempt = 1) {
13
13
  const controller = new AbortController();
14
14
  const timer = setTimeout(() => controller.abort(), timeout);
15
15
  try {
16
+ const headers = {
17
+ "Content-Type": "application/json",
18
+ apikey: apiKey,
19
+ };
20
+ if (cfAccessClientId && cfAccessClientSecret) {
21
+ headers["CF-Access-Client-Id"] = cfAccessClientId;
22
+ headers["CF-Access-Client-Secret"] = cfAccessClientSecret;
23
+ }
16
24
  const response = await fetch(`${baseUrl}${endpoint}`, {
17
25
  method: "POST",
18
- headers: {
19
- "Content-Type": "application/json",
20
- apikey: apiKey,
21
- },
22
- body: JSON.stringify(params ?? {}),
26
+ headers,
27
+ body: JSON.stringify({ source: "mcp", ...params }),
23
28
  signal: controller.signal,
24
29
  });
25
30
  clearTimeout(timer);
@@ -30,7 +35,7 @@ async function executeWithRetry(baseUrl, endpoint, apiKey, timeout, params, atte
30
35
  if (attempt < 2) {
31
36
  const retryAfter = parseInt(response.headers.get("Retry-After") ?? "2", 10);
32
37
  await sleep(retryAfter * 1000);
33
- return executeWithRetry(baseUrl, endpoint, apiKey, timeout, params, attempt + 1);
38
+ return executeWithRetry(baseUrl, endpoint, apiKey, timeout, params, cfAccessClientId, cfAccessClientSecret, attempt + 1);
34
39
  }
35
40
  throw new RateLimitError();
36
41
  }
@@ -53,7 +58,7 @@ async function executeWithRetry(baseUrl, endpoint, apiKey, timeout, params, atte
53
58
  }
54
59
  if (error instanceof DOMException && error.name === "AbortError") {
55
60
  if (attempt < 2) {
56
- return executeWithRetry(baseUrl, endpoint, apiKey, timeout, params, attempt + 1);
61
+ return executeWithRetry(baseUrl, endpoint, apiKey, timeout, params, cfAccessClientId, cfAccessClientSecret, attempt + 1);
57
62
  }
58
63
  throw new TimeoutError();
59
64
  }
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface MetricsSnapshot {
2
+ toolCalls: Record<string, number>;
3
+ errorCounts: Record<string, number>;
4
+ avgLatency: Record<string, number>;
5
+ p95Latency: Record<string, number>;
6
+ sandboxCalls: number;
7
+ productionCalls: number;
8
+ uptimeSeconds: number;
9
+ }
10
+ export declare class MetricsCollector {
11
+ private toolCalls;
12
+ private errorCounts;
13
+ private latencies;
14
+ private sandboxCalls;
15
+ private productionCalls;
16
+ private startTime;
17
+ recordCall(toolName: string, latencyMs: number, isSandbox: boolean): void;
18
+ recordError(toolName: string, errorType: string): void;
19
+ getSnapshot(): MetricsSnapshot;
20
+ reset(): void;
21
+ }
22
+ export declare const metrics: MetricsCollector;
@@ -0,0 +1,55 @@
1
+ const MAX_LATENCIES = 1000;
2
+ export class MetricsCollector {
3
+ toolCalls = new Map();
4
+ errorCounts = new Map();
5
+ latencies = new Map();
6
+ sandboxCalls = 0;
7
+ productionCalls = 0;
8
+ startTime = Date.now();
9
+ recordCall(toolName, latencyMs, isSandbox) {
10
+ this.toolCalls.set(toolName, (this.toolCalls.get(toolName) ?? 0) + 1);
11
+ const arr = this.latencies.get(toolName) ?? [];
12
+ arr.push(latencyMs);
13
+ if (arr.length > MAX_LATENCIES)
14
+ arr.shift();
15
+ this.latencies.set(toolName, arr);
16
+ if (isSandbox)
17
+ this.sandboxCalls++;
18
+ else
19
+ this.productionCalls++;
20
+ }
21
+ recordError(toolName, errorType) {
22
+ const key = `${toolName}:${errorType}`;
23
+ this.errorCounts.set(key, (this.errorCounts.get(key) ?? 0) + 1);
24
+ }
25
+ getSnapshot() {
26
+ const avgLatency = {};
27
+ const p95Latency = {};
28
+ for (const [tool, arr] of this.latencies) {
29
+ if (arr.length === 0)
30
+ continue;
31
+ avgLatency[tool] = Math.round(arr.reduce((a, b) => a + b, 0) / arr.length);
32
+ const sorted = [...arr].sort((a, b) => a - b);
33
+ p95Latency[tool] = sorted[Math.floor(sorted.length * 0.95)] ?? sorted[sorted.length - 1];
34
+ }
35
+ return {
36
+ toolCalls: Object.fromEntries(this.toolCalls),
37
+ errorCounts: Object.fromEntries(this.errorCounts),
38
+ avgLatency,
39
+ p95Latency,
40
+ sandboxCalls: this.sandboxCalls,
41
+ productionCalls: this.productionCalls,
42
+ uptimeSeconds: Math.round((Date.now() - this.startTime) / 1000),
43
+ };
44
+ }
45
+ reset() {
46
+ this.toolCalls.clear();
47
+ this.errorCounts.clear();
48
+ this.latencies.clear();
49
+ this.sandboxCalls = 0;
50
+ this.productionCalls = 0;
51
+ this.startTime = Date.now();
52
+ }
53
+ }
54
+ export const metrics = new MetricsCollector();
55
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerAllPrompts(server: McpServer): void;
@@ -0,0 +1,59 @@
1
+ export function registerAllPrompts(server) {
2
+ server.registerPrompt("enviar-campana", {
3
+ title: "Enviar campaña SMS",
4
+ description: "Flujo guiado para enviar una campaña SMS: verificar saldo, enviar mensaje, consultar estadísticas.",
5
+ }, async () => ({
6
+ messages: [
7
+ {
8
+ role: "user",
9
+ content: {
10
+ type: "text",
11
+ text: "Quiero enviar una campaña SMS. Guíame paso a paso: primero verifica mi saldo con check_balance, luego ayúdame a redactar y enviar el mensaje con send_sms, y después consulta las estadísticas con get_campaign_stats.",
12
+ },
13
+ },
14
+ ],
15
+ }));
16
+ server.registerPrompt("consultar-lealtad", {
17
+ title: "Consultar programa de lealtad",
18
+ description: "Flujo guiado para consultar tarjetas de lealtad y datos de contactos.",
19
+ }, async () => ({
20
+ messages: [
21
+ {
22
+ role: "user",
23
+ content: {
24
+ type: "text",
25
+ text: "Quiero revisar mi programa de lealtad. Primero lista mis tarjetas con list_loyalty_cards, luego ayúdame a consultar los sellos de un cliente con get_loyalty_contact.",
26
+ },
27
+ },
28
+ ],
29
+ }));
30
+ server.registerPrompt("gestionar-contactos", {
31
+ title: "Gestionar contactos",
32
+ description: "Flujo guiado para ver agendas, consultar contactos y agregar nuevos.",
33
+ }, async () => ({
34
+ messages: [
35
+ {
36
+ role: "user",
37
+ content: {
38
+ type: "text",
39
+ text: "Quiero gestionar mis contactos. Primero muéstrame mis agendas con list_agendas, luego los contactos de una agenda con get_contacts, y ayúdame a agregar nuevos con add_contact si necesito.",
40
+ },
41
+ },
42
+ ],
43
+ }));
44
+ server.registerPrompt("verificar-numero", {
45
+ title: "Verificar número de teléfono",
46
+ description: "Flujo guiado para enviar un código OTP y verificar un número de teléfono.",
47
+ }, async () => ({
48
+ messages: [
49
+ {
50
+ role: "user",
51
+ content: {
52
+ type: "text",
53
+ text: "Quiero verificar un número de teléfono por SMS. Usa verify_phone para enviar el código OTP, y cuando me den el código usa check_verification para validarlo.",
54
+ },
55
+ },
56
+ ],
57
+ }));
58
+ }
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,cAAc,CAAC,gBAAgB,EAAE;QACtC,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,oGAAoG;KAClH,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QACd,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,wNAAwN;iBAC/N;aACF;SACF;KACF,CAAC,CAAC,CAAC;IAEJ,MAAM,CAAC,cAAc,CAAC,mBAAmB,EAAE;QACzC,KAAK,EAAE,+BAA+B;QACtC,WAAW,EAAE,uEAAuE;KACrF,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QACd,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,uKAAuK;iBAC9K;aACF;SACF;KACF,CAAC,CAAC,CAAC;IAEJ,MAAM,CAAC,cAAc,CAAC,qBAAqB,EAAE;QAC3C,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,sEAAsE;KACpF,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QACd,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,6LAA6L;iBACpM;aACF;SACF;KACF,CAAC,CAAC,CAAC;IAEJ,MAAM,CAAC,cAAc,CAAC,kBAAkB,EAAE;QACxC,KAAK,EAAE,8BAA8B;QACrC,WAAW,EAAE,2EAA2E;KACzF,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QACd,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,8JAA8J;iBACrK;aACF;SACF;KACF,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerFaqResources(server: McpServer): void;
@@ -0,0 +1,173 @@
1
+ const FAQ_ENTRIES = {
2
+ "getting-started": {
3
+ title: "Primeros pasos",
4
+ description: "Cómo obtener tu API key y configurar el MCP server",
5
+ content: `# Primeros pasos con SMS Masivos MCP
6
+
7
+ ## Obtener tu API key
8
+
9
+ 1. Inicia sesión en [smsmasivos.com.mx](https://smsmasivos.com.mx)
10
+ 2. Ve a **Configuración** → **API**
11
+ 3. Copia tu API key
12
+
13
+ ## Configurar en Claude Desktop
14
+
15
+ Agrega esto a tu archivo de configuración de Claude Desktop (\`claude_desktop_config.json\`):
16
+
17
+ \`\`\`json
18
+ {
19
+ "mcpServers": {
20
+ "smsmasivos": {
21
+ "command": "npx",
22
+ "args": ["-y", "@smsmasivos/mcp-server"],
23
+ "env": {
24
+ "SMSMASIVOS_API_KEY": "tu-api-key-aquí"
25
+ }
26
+ }
27
+ }
28
+ }
29
+ \`\`\`
30
+
31
+ ## Verificar conexión
32
+
33
+ Pregunta a Claude: "¿Cuántos créditos SMS tengo?" — si responde con tu saldo, todo está configurado.
34
+ `,
35
+ },
36
+ "common-errors": {
37
+ title: "Errores comunes",
38
+ description: "Soluciones a los errores más frecuentes",
39
+ content: `# Errores comunes
40
+
41
+ ## AuthError — API key inválida o no proporcionada
42
+ - Verifica que \`SMSMASIVOS_API_KEY\` esté configurada correctamente
43
+ - Asegúrate de que la API key esté activa en tu panel
44
+
45
+ ## RateLimitError — Demasiadas solicitudes
46
+ - La API tiene límites de velocidad por Cloudflare
47
+ - El MCP reintenta automáticamente una vez con el header Retry-After
48
+ - Si persiste, espera unos segundos entre operaciones
49
+
50
+ ## NetworkError — Error de conexión
51
+ - Verifica tu conexión a internet
52
+ - El servidor puede estar en mantenimiento temporal
53
+ - El MCP reintenta automáticamente en caso de timeout
54
+
55
+ ## "Créditos insuficientes"
56
+ - Usa \`check_balance\` para verificar tu saldo
57
+ - Recarga créditos en smsmasivos.com.mx → Créditos
58
+
59
+ ## "Número inválido"
60
+ - Los números deben tener 10 dígitos (sin código de país)
61
+ - No incluyas el prefijo +52
62
+ - Ejemplo correcto: \`5512345678\`
63
+ `,
64
+ },
65
+ "limits-and-pricing": {
66
+ title: "Límites y créditos",
67
+ description: "Información sobre créditos, límites por request y rate limiting",
68
+ content: `# Límites y créditos
69
+
70
+ ## Créditos
71
+ - Cada SMS consume **1 crédito**
72
+ - Consulta tu saldo con \`check_balance\`
73
+ - Los envíos en modo sandbox (\`sandbox='1'\`) **no consumen créditos**
74
+
75
+ ## Límites por request
76
+ - **Máximo 500 números** por llamada a \`send_sms\`
77
+ - Para envíos masivos mayores, divide en lotes de 500
78
+
79
+ ## Rate limiting
80
+ - La API está protegida por Cloudflare
81
+ - Límite general: ~60 requests por minuto
82
+ - El MCP maneja reintentos automáticamente
83
+
84
+ ## Verificación OTP
85
+ - Cada verificación consume **1 crédito**
86
+ - Los códigos expiran por defecto en 10 minutos
87
+ `,
88
+ },
89
+ "sandbox-mode": {
90
+ title: "Modo sandbox",
91
+ description: "Cómo usar el modo sandbox para pruebas sin envío real",
92
+ content: `# Modo sandbox
93
+
94
+ El modo sandbox permite probar el flujo completo sin enviar mensajes reales ni consumir créditos.
95
+
96
+ ## Cómo activar
97
+ - En \`send_sms\`: usa \`sandbox='1'\`
98
+ - En \`list_campaigns\`: usa \`sandbox='1'\` para ver campañas de prueba
99
+ - En \`get_campaign_stats\`: usa \`sandbox='1'\` si la campaña fue de sandbox
100
+
101
+ ## Comportamiento
102
+ - El SMS **no se envía** realmente
103
+ - **No se consumen créditos**
104
+ - Se genera un ID de campaña válido
105
+ - Las estadísticas muestran "en proceso" brevemente y luego datos simulados
106
+
107
+ ## Cuándo usar
108
+ - Pruebas de integración
109
+ - Validar flujos antes de envíos reales
110
+ - Desarrollo y debugging
111
+ `,
112
+ },
113
+ "tool-examples": {
114
+ title: "Ejemplos de uso",
115
+ description: "Ejemplos prácticos de cada tool disponible",
116
+ content: `# Ejemplos de uso
117
+
118
+ ## Consultar saldo
119
+ > "¿Cuántos créditos tengo?"
120
+ → Usa \`check_balance\`
121
+
122
+ ## Enviar SMS
123
+ > "Envía 'Hola mundo' al 5512345678"
124
+ → Usa \`send_sms\` con numbers y message
125
+
126
+ ## SMS programado
127
+ > "Programa un SMS para mañana a las 10am"
128
+ → Usa \`send_sms\` con el parámetro date
129
+
130
+ ## SMS en sandbox
131
+ > "Envía un mensaje de prueba sin enviar realmente"
132
+ → Usa \`send_sms\` con sandbox='1'
133
+
134
+ ## Ver campañas
135
+ > "¿Cuáles son mis últimas campañas?"
136
+ → Usa \`list_campaigns\`
137
+
138
+ ## Estadísticas de campaña
139
+ > "¿Cómo fue la entrega de la campaña 12345?"
140
+ → Usa \`get_campaign_stats\` con el campaign_id
141
+
142
+ ## Gestionar agendas
143
+ > "¿Qué agendas tengo?"
144
+ → Usa \`list_agendas\`, luego \`get_contacts\` con el list_key
145
+
146
+ ## Verificación OTP
147
+ > "Verifica el número 5512345678"
148
+ → Usa \`verify_phone\`, luego \`check_verification\` con el código
149
+
150
+ ## Lealtad
151
+ > "¿Cuántos sellos tiene el cliente 5512345678?"
152
+ → Usa \`list_loyalty_cards\` para obtener el key, luego \`get_loyalty_contact\`
153
+
154
+ ## Monedero
155
+ > "¿Cuál es el saldo del cliente en mi monedero?"
156
+ → Usa \`list_wallets\` para obtener el key, luego \`get_wallet_contact\`
157
+ `,
158
+ },
159
+ };
160
+ export function registerFaqResources(server) {
161
+ for (const [key, entry] of Object.entries(FAQ_ENTRIES)) {
162
+ server.registerResource(entry.title, `smsmasivos://faq/${key}`, { description: entry.description, mimeType: "text/markdown" }, () => ({
163
+ contents: [
164
+ {
165
+ uri: `smsmasivos://faq/${key}`,
166
+ text: entry.content,
167
+ mimeType: "text/markdown",
168
+ },
169
+ ],
170
+ }));
171
+ }
172
+ }
173
+ //# sourceMappingURL=faq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faq.js","sourceRoot":"","sources":["../../src/resources/faq.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,GAA4E;IAC3F,iBAAiB,EAAE;QACjB,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,oDAAoD;QACjE,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BZ;KACE;IACD,eAAe,EAAE;QACf,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,yCAAyC;QACtD,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;CAwBZ;KACE;IACD,oBAAoB,EAAE;QACpB,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,iEAAiE;QAC9E,OAAO,EAAE;;;;;;;;;;;;;;;;;;;CAmBZ;KACE;IACD,cAAc,EAAE;QACd,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,uDAAuD;QACpE,OAAO,EAAE;;;;;;;;;;;;;;;;;;;CAmBZ;KACE;IACD,eAAe,EAAE;QACf,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,4CAA4C;QACzD,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyCZ;KACE;CACF,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACvD,MAAM,CAAC,gBAAgB,CACrB,KAAK,CAAC,KAAK,EACX,oBAAoB,GAAG,EAAE,EACzB,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,QAAQ,EAAE,eAAe,EAAE,EAC7D,GAAG,EAAE,CAAC,CAAC;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,oBAAoB,GAAG,EAAE;oBAC9B,IAAI,EAAE,KAAK,CAAC,OAAO;oBACnB,QAAQ,EAAE,eAAe;iBAC1B;aACF;SACF,CAAC,CACH,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerAllResources(server: McpServer): void;
@@ -0,0 +1,5 @@
1
+ import { registerFaqResources } from "./faq.js";
2
+ export function registerAllResources(server) {
3
+ registerFaqResources(server);
4
+ }
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEhD,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC"}
package/dist/schemas.d.ts CHANGED
@@ -83,6 +83,7 @@ export declare const getCampaignStatsInput: z.ZodObject<{
83
83
  export declare const verifyPhoneInput: z.ZodObject<{
84
84
  phone_number: z.ZodString;
85
85
  country_code: z.ZodDefault<z.ZodString>;
86
+ company: z.ZodString;
86
87
  code_type: z.ZodOptional<z.ZodEnum<["numeric", "alphanumeric"]>>;
87
88
  expiration_date: z.ZodOptional<z.ZodString>;
88
89
  voice: z.ZodOptional<z.ZodEnum<["0", "1"]>>;
@@ -90,12 +91,14 @@ export declare const verifyPhoneInput: z.ZodObject<{
90
91
  }, "strip", z.ZodTypeAny, {
91
92
  country_code: string;
92
93
  phone_number: string;
94
+ company: string;
93
95
  code_type?: "numeric" | "alphanumeric" | undefined;
94
96
  expiration_date?: string | undefined;
95
97
  voice?: "0" | "1" | undefined;
96
98
  whatsapp?: "0" | "1" | undefined;
97
99
  }, {
98
100
  phone_number: string;
101
+ company: string;
99
102
  country_code?: string | undefined;
100
103
  code_type?: "numeric" | "alphanumeric" | undefined;
101
104
  expiration_date?: string | undefined;
@@ -131,3 +134,99 @@ export declare const checkVerificationInput: z.ZodObject<{
131
134
  verification_code: string;
132
135
  country_code?: string | undefined;
133
136
  }>;
137
+ export declare const deleteContactInput: z.ZodObject<{
138
+ list_key: z.ZodString;
139
+ number: z.ZodString;
140
+ email: z.ZodOptional<z.ZodString>;
141
+ }, "strip", z.ZodTypeAny, {
142
+ number: string;
143
+ list_key: string;
144
+ email?: string | undefined;
145
+ }, {
146
+ number: string;
147
+ list_key: string;
148
+ email?: string | undefined;
149
+ }>;
150
+ export declare const listLoyaltyCardsInput: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
151
+ export declare const addLoyaltyContactInput: z.ZodObject<{
152
+ loyalty_key: z.ZodString;
153
+ phone: z.ZodString;
154
+ customer_name: z.ZodOptional<z.ZodString>;
155
+ }, "strip", z.ZodTypeAny, {
156
+ loyalty_key: string;
157
+ phone: string;
158
+ customer_name?: string | undefined;
159
+ }, {
160
+ loyalty_key: string;
161
+ phone: string;
162
+ customer_name?: string | undefined;
163
+ }>;
164
+ export declare const getLoyaltyContactInput: z.ZodObject<{
165
+ loyalty_key: z.ZodString;
166
+ phone: z.ZodOptional<z.ZodString>;
167
+ }, "strip", z.ZodTypeAny, {
168
+ loyalty_key: string;
169
+ phone?: string | undefined;
170
+ }, {
171
+ loyalty_key: string;
172
+ phone?: string | undefined;
173
+ }>;
174
+ export declare const registerLoyaltySaleInput: z.ZodObject<{
175
+ loyalty_key: z.ZodString;
176
+ phone: z.ZodString;
177
+ stamps_quantity: z.ZodNumber;
178
+ }, "strip", z.ZodTypeAny, {
179
+ loyalty_key: string;
180
+ phone: string;
181
+ stamps_quantity: number;
182
+ }, {
183
+ loyalty_key: string;
184
+ phone: string;
185
+ stamps_quantity: number;
186
+ }>;
187
+ export declare const listWalletsInput: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
188
+ export declare const addWalletContactInput: z.ZodObject<{
189
+ wallet_key: z.ZodString;
190
+ phone: z.ZodString;
191
+ customer_name: z.ZodString;
192
+ usertool_id: z.ZodNumber;
193
+ }, "strip", z.ZodTypeAny, {
194
+ phone: string;
195
+ customer_name: string;
196
+ wallet_key: string;
197
+ usertool_id: number;
198
+ }, {
199
+ phone: string;
200
+ customer_name: string;
201
+ wallet_key: string;
202
+ usertool_id: number;
203
+ }>;
204
+ export declare const getWalletContactInput: z.ZodObject<{
205
+ wallet_key: z.ZodString;
206
+ phone: z.ZodOptional<z.ZodString>;
207
+ }, "strip", z.ZodTypeAny, {
208
+ wallet_key: string;
209
+ phone?: string | undefined;
210
+ }, {
211
+ wallet_key: string;
212
+ phone?: string | undefined;
213
+ }>;
214
+ export declare const updateWalletBalanceInput: z.ZodObject<{
215
+ wallet_key: z.ZodString;
216
+ phone: z.ZodString;
217
+ transaction_type: z.ZodEnum<["1", "2"]>;
218
+ transaction_amount: z.ZodNumber;
219
+ usertool_id: z.ZodNumber;
220
+ }, "strip", z.ZodTypeAny, {
221
+ phone: string;
222
+ wallet_key: string;
223
+ usertool_id: number;
224
+ transaction_type: "2" | "1";
225
+ transaction_amount: number;
226
+ }, {
227
+ phone: string;
228
+ wallet_key: string;
229
+ usertool_id: number;
230
+ transaction_type: "2" | "1";
231
+ transaction_amount: number;
232
+ }>;
package/dist/schemas.js CHANGED
@@ -50,6 +50,7 @@ export const getCampaignStatsInput = z.object({
50
50
  export const verifyPhoneInput = z.object({
51
51
  phone_number: z.string().describe("Número de teléfono sin código de país (ej: '5512345678')"),
52
52
  country_code: z.string().default("52").describe("Código de país (default: 52 México)"),
53
+ company: z.string().describe("Nombre de la empresa que envía la verificación (máx 40 caracteres)"),
53
54
  code_type: z
54
55
  .enum(["numeric", "alphanumeric"])
55
56
  .optional()
@@ -72,4 +73,44 @@ export const checkVerificationInput = z.object({
72
73
  country_code: z.string().default("52").describe("Código de país"),
73
74
  verification_code: z.string().describe("Código de verificación ingresado por el usuario"),
74
75
  });
76
+ export const deleteContactInput = z.object({
77
+ list_key: z.string().describe("Clave única de la agenda de donde eliminar el contacto"),
78
+ number: z.string().describe("Número de teléfono del contacto a eliminar"),
79
+ email: z.string().optional().describe("Email del contacto (opcional, para identificación adicional)"),
80
+ });
81
+ // Lealtad
82
+ export const listLoyaltyCardsInput = z.object({});
83
+ export const addLoyaltyContactInput = z.object({
84
+ loyalty_key: z.string().describe("Clave única de la tarjeta de lealtad. Obtenla con list_loyalty_cards."),
85
+ phone: z.string().describe("Número de teléfono del contacto (mínimo 10 dígitos)"),
86
+ customer_name: z.string().optional().describe("Nombre del cliente"),
87
+ });
88
+ export const getLoyaltyContactInput = z.object({
89
+ loyalty_key: z.string().describe("Clave única de la tarjeta de lealtad"),
90
+ phone: z.string().optional().describe("Número de teléfono. Si se omite, retorna todos los contactos."),
91
+ });
92
+ export const registerLoyaltySaleInput = z.object({
93
+ loyalty_key: z.string().describe("Clave única de la tarjeta de lealtad"),
94
+ phone: z.string().describe("Número de teléfono del cliente"),
95
+ stamps_quantity: z.number().describe("Cantidad de sellos a registrar"),
96
+ });
97
+ // Monedero
98
+ export const listWalletsInput = z.object({});
99
+ export const addWalletContactInput = z.object({
100
+ wallet_key: z.string().describe("Clave única del monedero. Obtenla con list_wallets."),
101
+ phone: z.string().describe("Número de teléfono del contacto"),
102
+ customer_name: z.string().describe("Nombre del cliente"),
103
+ usertool_id: z.number().describe("ID de la herramienta de usuario (obtenlo de list_wallets)"),
104
+ });
105
+ export const getWalletContactInput = z.object({
106
+ wallet_key: z.string().describe("Clave única del monedero"),
107
+ phone: z.string().optional().describe("Número de teléfono. Si se omite, retorna todos los contactos."),
108
+ });
109
+ export const updateWalletBalanceInput = z.object({
110
+ wallet_key: z.string().describe("Clave única del monedero"),
111
+ phone: z.string().describe("Número de teléfono del cliente"),
112
+ transaction_type: z.enum(["1", "2"]).describe("Tipo de transacción: '1' para agregar saldo, '2' para restar saldo"),
113
+ transaction_amount: z.number().describe("Monto de la transacción (valor positivo)"),
114
+ usertool_id: z.number().describe("ID de la herramienta de usuario (obtenlo de list_wallets)"),
115
+ });
75
116
  //# sourceMappingURL=schemas.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAE9C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,CACP,uGAAuG,CACxG;SACA,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC7C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAC5D,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,OAAO,CAAC,IAAI,CAAC;SACb,QAAQ,CAAC,qDAAqD,CAAC;IAClE,OAAO,EAAE,CAAC;SACP,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;SAChB,QAAQ,EAAE;SACV,QAAQ,CAAC,qFAAqF,CAAC;IAClG,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;IAC3F,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,6EAA6E,CAAC;IAC1F,WAAW,EAAE,CAAC;SACX,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;SAChB,QAAQ,EAAE;SACV,QAAQ,CAAC,qDAAqD,CAAC;IAClE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;CACzG,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAE7C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;CAChG,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;IACnF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;IAClF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IAC3D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IAC3D,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,qCAAqC,CAAC;IACjG,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IACvE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IACvE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IACvE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IACvE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;CAC3F,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,QAAQ,CAAC,6EAA6E,CAAC;IAC1F,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;CACjG,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0DAA0D,CAAC;IAC7F,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,qCAAqC,CAAC;IACtF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oEAAoE,CAAC;IAClG,SAAS,EAAE,CAAC;SACT,IAAI,CAAC,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;SACjC,QAAQ,EAAE;SACV,QAAQ,CAAC,2DAA2D,CAAC;IACxE,eAAe,EAAE,CAAC;SACf,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,iEAAiE,CAAC;IAC9E,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;IAC7F,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;CAC3F,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IACnF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IAC9E,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;IACtF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;CACxG,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;IAC7E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IACjE,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;CAC1F,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;IACvF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;IACzE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8DAA8D,CAAC;CACtG,CAAC,CAAC;AAEH,UAAU;AACV,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAElD,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uEAAuE,CAAC;IACzG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;IACjF,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;CACpE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IACxE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+DAA+D,CAAC;CACvG,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IACxE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IAC5D,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;CACvE,CAAC,CAAC;AAEH,WAAW;AACX,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAE7C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;IACtF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IAC7D,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IACxD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;CAC9F,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IAC3D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+DAA+D,CAAC;CACvG,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IAC3D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IAC5D,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,oEAAoE,CAAC;IACnH,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;IACnF,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;CAC9F,CAAC,CAAC"}
package/dist/stdio.js CHANGED
@@ -3,20 +3,29 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
3
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
4
  import { createApiClient } from "./api-client.js";
5
5
  import { registerAllTools } from "./tools/index.js";
6
+ import { registerAllResources } from "./resources/index.js";
7
+ import { registerAllPrompts } from "./prompts/index.js";
6
8
  const apiKey = process.env.SMSMASIVOS_API_KEY;
7
9
  if (!apiKey) {
8
10
  process.stderr.write("Error: La variable de entorno SMSMASIVOS_API_KEY es requerida.\n" +
9
11
  "Configúrala con tu API key de SMS Masivos.\n");
10
12
  process.exit(1);
11
13
  }
12
- const server = new McpServer({ name: "smsmasivos", version: "0.2.1" }, {
14
+ const server = new McpServer({ name: "smsmasivos", version: "0.3.0" }, {
13
15
  instructions: "Servidor MCP para SMS Masivos — plataforma de SMS masivos para México. " +
14
16
  "Usa check_balance antes de enviar SMS para verificar créditos disponibles. " +
15
17
  "Usa sandbox='1' en send_sms para pruebas sin envío real. " +
16
18
  "El código de país por defecto es 52 (México).",
17
19
  });
18
- const apiCall = createApiClient({ apiKey });
20
+ const apiCall = createApiClient({
21
+ apiKey,
22
+ baseUrl: process.env.SMSMASIVOS_BASE_URL,
23
+ cfAccessClientId: process.env.CF_ACCESS_CLIENT_ID,
24
+ cfAccessClientSecret: process.env.CF_ACCESS_CLIENT_SECRET,
25
+ });
19
26
  registerAllTools(server, apiCall);
27
+ registerAllResources(server);
28
+ registerAllPrompts(server);
20
29
  const transport = new StdioServerTransport();
21
30
  await server.connect(transport);
22
31
  //# sourceMappingURL=stdio.js.map
package/dist/stdio.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../src/stdio.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;AAE9C,IAAI,CAAC,MAAM,EAAE,CAAC;IACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,kEAAkE;QAChE,8CAA8C,CACjD,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,EACxC;IACE,YAAY,EACV,yEAAyE;QACzE,6EAA6E;QAC7E,2DAA2D;QAC3D,+CAA+C;CAClD,CACF,CAAC;AAEF,MAAM,OAAO,GAAG,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AAC5C,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAElC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../src/stdio.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;AAE9C,IAAI,CAAC,MAAM,EAAE,CAAC;IACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,kEAAkE;QAChE,8CAA8C,CACjD,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,EACxC;IACE,YAAY,EACV,yEAAyE;QACzE,6EAA6E;QAC7E,2DAA2D;QAC3D,+CAA+C;CAClD,CACF,CAAC;AAEF,MAAM,OAAO,GAAG,eAAe,CAAC;IAC9B,MAAM;IACN,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB;IACxC,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB;IACjD,oBAAoB,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB;CAC1D,CAAC,CAAC;AACH,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAClC,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC7B,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAE3B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiCall } from "../api-client.js";
3
+ export declare function registerAddLoyaltyContact(server: McpServer, apiCall: ApiCall): void;
@@ -0,0 +1,22 @@
1
+ import { addLoyaltyContactInput } from "../schemas.js";
2
+ import { SmsmasivosError } from "../errors.js";
3
+ export function registerAddLoyaltyContact(server, apiCall) {
4
+ server.tool("add_loyalty_contact", "Agrega un contacto a una tarjeta de lealtad. Requiere loyalty_key y número de teléfono del cliente.", addLoyaltyContactInput.shape, async (params) => {
5
+ try {
6
+ await apiCall("/loyalty/contact/add", params);
7
+ return {
8
+ content: [
9
+ {
10
+ type: "text",
11
+ text: `✓ Contacto ${params.customer_name ?? params.phone} agregado a la tarjeta de lealtad.`,
12
+ },
13
+ ],
14
+ };
15
+ }
16
+ catch (error) {
17
+ const message = error instanceof SmsmasivosError ? error.message : String(error);
18
+ return { content: [{ type: "text", text: `Error: ${message}` }], isError: true };
19
+ }
20
+ });
21
+ }
22
+ //# sourceMappingURL=add-loyalty-contact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-loyalty-contact.js","sourceRoot":"","sources":["../../src/tools/add-loyalty-contact.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,UAAU,yBAAyB,CAAC,MAAiB,EAAE,OAAgB;IAC3E,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,qGAAqG,EACrG,sBAAsB,CAAC,KAAK,EAC5B,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;YAC9C,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,cAAc,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,KAAK,oCAAoC;qBAC7F;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC5F,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiCall } from "../api-client.js";
3
+ export declare function registerAddWalletContact(server: McpServer, apiCall: ApiCall): void;
@@ -0,0 +1,22 @@
1
+ import { addWalletContactInput } from "../schemas.js";
2
+ import { SmsmasivosError } from "../errors.js";
3
+ export function registerAddWalletContact(server, apiCall) {
4
+ server.tool("add_wallet_contact", "Agrega un contacto a un monedero electrónico. Requiere wallet_key, teléfono, nombre del cliente y usertool_id (obtenlo de list_wallets).", addWalletContactInput.shape, async (params) => {
5
+ try {
6
+ await apiCall("/wallet/contact/add", params);
7
+ return {
8
+ content: [
9
+ {
10
+ type: "text",
11
+ text: `✓ Contacto ${params.customer_name} (${params.phone}) agregado al monedero.`,
12
+ },
13
+ ],
14
+ };
15
+ }
16
+ catch (error) {
17
+ const message = error instanceof SmsmasivosError ? error.message : String(error);
18
+ return { content: [{ type: "text", text: `Error: ${message}` }], isError: true };
19
+ }
20
+ });
21
+ }
22
+ //# sourceMappingURL=add-wallet-contact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-wallet-contact.js","sourceRoot":"","sources":["../../src/tools/add-wallet-contact.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,UAAU,wBAAwB,CAAC,MAAiB,EAAE,OAAgB;IAC1E,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,0IAA0I,EAC1I,qBAAqB,CAAC,KAAK,EAC3B,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;YAC7C,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,cAAc,MAAM,CAAC,aAAa,KAAK,MAAM,CAAC,KAAK,yBAAyB;qBACnF;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC5F,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiCall } from "../api-client.js";
3
+ export declare function registerDeleteContact(server: McpServer, apiCall: ApiCall): void;
@@ -0,0 +1,17 @@
1
+ import { deleteContactInput } from "../schemas.js";
2
+ import { SmsmasivosError } from "../errors.js";
3
+ export function registerDeleteContact(server, apiCall) {
4
+ server.tool("delete_contact", "Elimina un contacto de una agenda. OPERACIÓN IRREVERSIBLE — el contacto se elimina permanentemente. Requiere list_key de la agenda y número de teléfono.", deleteContactInput.shape, async (params) => {
5
+ try {
6
+ await apiCall("/contacts/delete", params);
7
+ return {
8
+ content: [{ type: "text", text: `✓ Contacto ${params.number} eliminado de la agenda.` }],
9
+ };
10
+ }
11
+ catch (error) {
12
+ const message = error instanceof SmsmasivosError ? error.message : String(error);
13
+ return { content: [{ type: "text", text: `Error: ${message}` }], isError: true };
14
+ }
15
+ });
16
+ }
17
+ //# sourceMappingURL=delete-contact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-contact.js","sourceRoot":"","sources":["../../src/tools/delete-contact.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,OAAgB;IACvE,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,0JAA0J,EAC1J,kBAAkB,CAAC,KAAK,EACxB,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;YAC1C,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,cAAc,MAAM,CAAC,MAAM,0BAA0B,EAAE,CAAC;aAClG,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC5F,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiCall } from "../api-client.js";
3
+ export declare function registerGetLoyaltyContact(server: McpServer, apiCall: ApiCall): void;
@@ -0,0 +1,23 @@
1
+ import { getLoyaltyContactInput } from "../schemas.js";
2
+ import { SmsmasivosError } from "../errors.js";
3
+ export function registerGetLoyaltyContact(server, apiCall) {
4
+ server.tool("get_loyalty_contact", "Consulta los datos de un contacto en una tarjeta de lealtad: sellos acumulados, canjes, etc. Si omites el teléfono, retorna todos los contactos.", getLoyaltyContactInput.shape, async (params) => {
5
+ try {
6
+ const result = await apiCall("/loyalty/contact/get", params);
7
+ const contacts = result.contacts ?? [];
8
+ if (contacts.length === 0) {
9
+ return { content: [{ type: "text", text: "No se encontraron contactos." }] };
10
+ }
11
+ const lines = [`${contacts.length} contacto(s):`];
12
+ for (const c of contacts) {
13
+ lines.push(`- ${c.name ?? c.phone}: ${c.stamps ?? 0} sellos, ${c.redeems ?? 0} canjes`);
14
+ }
15
+ return { content: [{ type: "text", text: lines.join("\n") }] };
16
+ }
17
+ catch (error) {
18
+ const message = error instanceof SmsmasivosError ? error.message : String(error);
19
+ return { content: [{ type: "text", text: `Error: ${message}` }], isError: true };
20
+ }
21
+ });
22
+ }
23
+ //# sourceMappingURL=get-loyalty-contact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-loyalty-contact.js","sourceRoot":"","sources":["../../src/tools/get-loyalty-contact.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAY/C,MAAM,UAAU,yBAAyB,CAAC,MAAiB,EAAE,OAAgB;IAC3E,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,kJAAkJ,EAClJ,sBAAsB,CAAC,KAAK,EAC5B,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAyB,sBAAsB,EAAE,MAAM,CAAC,CAAC;YACrF,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;YACvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,8BAA8B,EAAE,CAAC,EAAE,CAAC;YACxF,CAAC;YACD,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,eAAe,CAAC,CAAC;YAClD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CACR,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,IAAI,CAAC,SAAS,CAC5E,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC5F,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerGetMetrics(server: McpServer): void;
@@ -0,0 +1,25 @@
1
+ import { metrics } from "../metrics.js";
2
+ export function registerGetMetrics(server) {
3
+ server.tool("get_metrics", "Muestra las métricas de uso del MCP en la sesión actual: llamadas por tool, errores, latencia promedio y p95, uso sandbox vs producción.", {}, async () => {
4
+ const snapshot = metrics.getSnapshot();
5
+ const lines = [];
6
+ lines.push(`Uptime: ${snapshot.uptimeSeconds}s`);
7
+ lines.push(`Llamadas: ${snapshot.productionCalls} producción, ${snapshot.sandboxCalls} sandbox`);
8
+ if (Object.keys(snapshot.toolCalls).length > 0) {
9
+ lines.push("\nLlamadas por tool:");
10
+ for (const [tool, count] of Object.entries(snapshot.toolCalls)) {
11
+ const avg = snapshot.avgLatency[tool] ?? 0;
12
+ const p95 = snapshot.p95Latency[tool] ?? 0;
13
+ lines.push(` ${tool}: ${count} llamadas (avg ${avg}ms, p95 ${p95}ms)`);
14
+ }
15
+ }
16
+ if (Object.keys(snapshot.errorCounts).length > 0) {
17
+ lines.push("\nErrores:");
18
+ for (const [key, count] of Object.entries(snapshot.errorCounts)) {
19
+ lines.push(` ${key}: ${count}`);
20
+ }
21
+ }
22
+ return { content: [{ type: "text", text: lines.join("\n") }] };
23
+ });
24
+ }
25
+ //# sourceMappingURL=get-metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-metrics.js","sourceRoot":"","sources":["../../src/tools/get-metrics.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,IAAI,CACT,aAAa,EACb,0IAA0I,EAC1I,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,CAAC,IAAI,CAAC,WAAW,QAAQ,CAAC,aAAa,GAAG,CAAC,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,eAAe,gBAAgB,QAAQ,CAAC,YAAY,UAAU,CAAC,CAAC;QAEjG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACnC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC/D,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC3C,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC3C,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,kBAAkB,GAAG,WAAW,GAAG,KAAK,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACzB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBAChE,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IAC1E,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiCall } from "../api-client.js";
3
+ export declare function registerGetWalletContact(server: McpServer, apiCall: ApiCall): void;
@@ -0,0 +1,23 @@
1
+ import { getWalletContactInput } from "../schemas.js";
2
+ import { SmsmasivosError } from "../errors.js";
3
+ export function registerGetWalletContact(server, apiCall) {
4
+ server.tool("get_wallet_contact", "Consulta el saldo de un contacto en un monedero electrónico. Si omites el teléfono, retorna todos los contactos con sus saldos.", getWalletContactInput.shape, async (params) => {
5
+ try {
6
+ const result = await apiCall("/wallet/contact/get", params);
7
+ const contacts = result.contacts ?? [];
8
+ if (contacts.length === 0) {
9
+ return { content: [{ type: "text", text: "No se encontraron contactos." }] };
10
+ }
11
+ const lines = [`${contacts.length} contacto(s):`];
12
+ for (const c of contacts) {
13
+ lines.push(`- ${c.name ?? c.phone}: $${c.balance ?? 0} de saldo`);
14
+ }
15
+ return { content: [{ type: "text", text: lines.join("\n") }] };
16
+ }
17
+ catch (error) {
18
+ const message = error instanceof SmsmasivosError ? error.message : String(error);
19
+ return { content: [{ type: "text", text: `Error: ${message}` }], isError: true };
20
+ }
21
+ });
22
+ }
23
+ //# sourceMappingURL=get-wallet-contact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-wallet-contact.js","sourceRoot":"","sources":["../../src/tools/get-wallet-contact.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAU/C,MAAM,UAAU,wBAAwB,CAAC,MAAiB,EAAE,OAAgB;IAC1E,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,iIAAiI,EACjI,qBAAqB,CAAC,KAAK,EAC3B,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAwB,qBAAqB,EAAE,MAAM,CAAC,CAAC;YACnF,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;YACvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,8BAA8B,EAAE,CAAC,EAAE,CAAC;YACxF,CAAC;YACD,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,eAAe,CAAC,CAAC;YAClD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC;YACpE,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC5F,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,3 +1,5 @@
1
+ import { metrics } from "../metrics.js";
2
+ import { SmsmasivosError } from "../errors.js";
1
3
  import { registerCheckBalance } from "./check-balance.js";
2
4
  import { registerSendSms } from "./send-sms.js";
3
5
  import { registerListAgendas } from "./list-agendas.js";
@@ -7,15 +9,56 @@ import { registerGetCampaignStats } from "./get-campaign-stats.js";
7
9
  import { registerVerifyPhone } from "./verify-phone.js";
8
10
  import { registerCheckVerification } from "./check-verification.js";
9
11
  import { registerListCampaigns } from "./list-campaigns.js";
12
+ import { registerGetMetrics } from "./get-metrics.js";
13
+ import { registerDeleteContact } from "./delete-contact.js";
14
+ import { registerListLoyaltyCards } from "./list-loyalty-cards.js";
15
+ import { registerAddLoyaltyContact } from "./add-loyalty-contact.js";
16
+ import { registerGetLoyaltyContact } from "./get-loyalty-contact.js";
17
+ import { registerRegisterLoyaltySale } from "./register-loyalty-sale.js";
18
+ import { registerListWallets } from "./list-wallets.js";
19
+ import { registerAddWalletContact } from "./add-wallet-contact.js";
20
+ import { registerGetWalletContact } from "./get-wallet-contact.js";
21
+ import { registerUpdateWalletBalance } from "./update-wallet-balance.js";
22
+ function createInstrumentedApiCall(apiCall) {
23
+ return async (endpoint, params) => {
24
+ const start = performance.now();
25
+ const isSandbox = params?.sandbox === "1" || params?.sandbox === 1;
26
+ try {
27
+ const result = await apiCall(endpoint, params);
28
+ metrics.recordCall(endpoint, performance.now() - start, isSandbox);
29
+ return result;
30
+ }
31
+ catch (error) {
32
+ metrics.recordCall(endpoint, performance.now() - start, isSandbox);
33
+ metrics.recordError(endpoint, error instanceof SmsmasivosError ? error.code ?? error.constructor.name : "Unknown");
34
+ throw error;
35
+ }
36
+ };
37
+ }
10
38
  export function registerAllTools(server, apiCall) {
11
- registerCheckBalance(server, apiCall);
12
- registerSendSms(server, apiCall);
13
- registerListAgendas(server, apiCall);
14
- registerGetContacts(server, apiCall);
15
- registerAddContact(server, apiCall);
16
- registerGetCampaignStats(server, apiCall);
17
- registerVerifyPhone(server, apiCall);
18
- registerCheckVerification(server, apiCall);
19
- registerListCampaigns(server, apiCall);
39
+ const instrumented = createInstrumentedApiCall(apiCall);
40
+ // Fase 1
41
+ registerCheckBalance(server, instrumented);
42
+ registerSendSms(server, instrumented);
43
+ registerListAgendas(server, instrumented);
44
+ registerGetContacts(server, instrumented);
45
+ registerAddContact(server, instrumented);
46
+ registerGetCampaignStats(server, instrumented);
47
+ registerVerifyPhone(server, instrumented);
48
+ registerCheckVerification(server, instrumented);
49
+ registerListCampaigns(server, instrumented);
50
+ // Fase 2 — Lealtad
51
+ registerListLoyaltyCards(server, instrumented);
52
+ registerAddLoyaltyContact(server, instrumented);
53
+ registerGetLoyaltyContact(server, instrumented);
54
+ registerRegisterLoyaltySale(server, instrumented);
55
+ // Fase 2 — Monedero
56
+ registerListWallets(server, instrumented);
57
+ registerAddWalletContact(server, instrumented);
58
+ registerGetWalletContact(server, instrumented);
59
+ registerUpdateWalletBalance(server, instrumented);
60
+ // Utilidades
61
+ registerDeleteContact(server, instrumented);
62
+ registerGetMetrics(server);
20
63
  }
21
64
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,OAAgB;IAClE,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,wBAAwB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiCall } from "../api-client.js";
3
+ export declare function registerListLoyaltyCards(server: McpServer, apiCall: ApiCall): void;
@@ -0,0 +1,23 @@
1
+ import { listLoyaltyCardsInput } from "../schemas.js";
2
+ import { SmsmasivosError } from "../errors.js";
3
+ export function registerListLoyaltyCards(server, apiCall) {
4
+ server.tool("list_loyalty_cards", "Lista todas las tarjetas de lealtad de tu cuenta. Cada tarjeta tiene un loyalty_key que necesitas para gestionar contactos y registrar ventas.", listLoyaltyCardsInput.shape, async () => {
5
+ try {
6
+ const result = await apiCall("/loyalty/get");
7
+ const cards = result.loyalty_cards ?? [];
8
+ if (cards.length === 0) {
9
+ return { content: [{ type: "text", text: "No tienes tarjetas de lealtad." }] };
10
+ }
11
+ const lines = [`${cards.length} tarjeta(s) de lealtad:`];
12
+ for (const card of cards) {
13
+ lines.push(`- ${card.name ?? "Sin nombre"} — key: ${card.key}`);
14
+ }
15
+ return { content: [{ type: "text", text: lines.join("\n") }] };
16
+ }
17
+ catch (error) {
18
+ const message = error instanceof SmsmasivosError ? error.message : String(error);
19
+ return { content: [{ type: "text", text: `Error: ${message}` }], isError: true };
20
+ }
21
+ });
22
+ }
23
+ //# sourceMappingURL=list-loyalty-cards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-loyalty-cards.js","sourceRoot":"","sources":["../../src/tools/list-loyalty-cards.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAY/C,MAAM,UAAU,wBAAwB,CAAC,MAAiB,EAAE,OAAgB;IAC1E,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,gJAAgJ,EAChJ,qBAAqB,CAAC,KAAK,EAC3B,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAsB,cAAc,CAAC,CAAC;YAClE,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC;YACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,gCAAgC,EAAE,CAAC,EAAE,CAAC;YAC1F,CAAC;YACD,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,yBAAyB,CAAC,CAAC;YACzD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,YAAY,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAClE,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC5F,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiCall } from "../api-client.js";
3
+ export declare function registerListWallets(server: McpServer, apiCall: ApiCall): void;
@@ -0,0 +1,23 @@
1
+ import { listWalletsInput } from "../schemas.js";
2
+ import { SmsmasivosError } from "../errors.js";
3
+ export function registerListWallets(server, apiCall) {
4
+ server.tool("list_wallets", "Lista todos los monederos electrónicos de tu cuenta. Cada monedero tiene un wallet_key y usertool_id que necesitas para gestionar contactos y saldos.", listWalletsInput.shape, async () => {
5
+ try {
6
+ const result = await apiCall("/wallet/get");
7
+ const wallets = result.wallets ?? [];
8
+ if (wallets.length === 0) {
9
+ return { content: [{ type: "text", text: "No tienes monederos." }] };
10
+ }
11
+ const lines = [`${wallets.length} monedero(s):`];
12
+ for (const w of wallets) {
13
+ lines.push(`- ${w.name ?? "Sin nombre"} — key: ${w.key}, usertool_id: ${w.usertool_id ?? "N/A"}`);
14
+ }
15
+ return { content: [{ type: "text", text: lines.join("\n") }] };
16
+ }
17
+ catch (error) {
18
+ const message = error instanceof SmsmasivosError ? error.message : String(error);
19
+ return { content: [{ type: "text", text: `Error: ${message}` }], isError: true };
20
+ }
21
+ });
22
+ }
23
+ //# sourceMappingURL=list-wallets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-wallets.js","sourceRoot":"","sources":["../../src/tools/list-wallets.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAY/C,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,OAAgB;IACrE,MAAM,CAAC,IAAI,CACT,cAAc,EACd,uJAAuJ,EACvJ,gBAAgB,CAAC,KAAK,EACtB,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAsB,aAAa,CAAC,CAAC;YACjE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;YACrC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC,EAAE,CAAC;YAChF,CAAC;YACD,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,eAAe,CAAC,CAAC;YACjD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,YAAY,WAAW,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAC,WAAW,IAAI,KAAK,EAAE,CAAC,CAAC;YACpG,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC5F,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiCall } from "../api-client.js";
3
+ export declare function registerRegisterLoyaltySale(server: McpServer, apiCall: ApiCall): void;
@@ -0,0 +1,22 @@
1
+ import { registerLoyaltySaleInput } from "../schemas.js";
2
+ import { SmsmasivosError } from "../errors.js";
3
+ export function registerRegisterLoyaltySale(server, apiCall) {
4
+ server.tool("register_loyalty_sale", "Registra una venta en el programa de lealtad, agregando sellos al contacto. Requiere loyalty_key, teléfono del cliente y cantidad de sellos.", registerLoyaltySaleInput.shape, async (params) => {
5
+ try {
6
+ await apiCall("/loyalty/sale", params);
7
+ return {
8
+ content: [
9
+ {
10
+ type: "text",
11
+ text: `✓ ${params.stamps_quantity} sello(s) registrado(s) para ${params.phone}.`,
12
+ },
13
+ ],
14
+ };
15
+ }
16
+ catch (error) {
17
+ const message = error instanceof SmsmasivosError ? error.message : String(error);
18
+ return { content: [{ type: "text", text: `Error: ${message}` }], isError: true };
19
+ }
20
+ });
21
+ }
22
+ //# sourceMappingURL=register-loyalty-sale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-loyalty-sale.js","sourceRoot":"","sources":["../../src/tools/register-loyalty-sale.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,UAAU,2BAA2B,CAAC,MAAiB,EAAE,OAAgB;IAC7E,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,8IAA8I,EAC9I,wBAAwB,CAAC,KAAK,EAC9B,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;YACvC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,KAAK,MAAM,CAAC,eAAe,gCAAgC,MAAM,CAAC,KAAK,GAAG;qBACjF;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC5F,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiCall } from "../api-client.js";
3
+ export declare function registerUpdateWalletBalance(server: McpServer, apiCall: ApiCall): void;
@@ -0,0 +1,23 @@
1
+ import { updateWalletBalanceInput } from "../schemas.js";
2
+ import { SmsmasivosError } from "../errors.js";
3
+ export function registerUpdateWalletBalance(server, apiCall) {
4
+ server.tool("update_wallet_balance", "Agrega o resta saldo en el monedero de un contacto. transaction_type '1' = agregar, '2' = restar. Requiere wallet_key, teléfono, monto y usertool_id.", updateWalletBalanceInput.shape, async (params) => {
5
+ try {
6
+ await apiCall("/wallet/balance/update", params);
7
+ const action = params.transaction_type === "1" ? "agregados" : "restados";
8
+ return {
9
+ content: [
10
+ {
11
+ type: "text",
12
+ text: `✓ $${params.transaction_amount} ${action} al monedero de ${params.phone}.`,
13
+ },
14
+ ],
15
+ };
16
+ }
17
+ catch (error) {
18
+ const message = error instanceof SmsmasivosError ? error.message : String(error);
19
+ return { content: [{ type: "text", text: `Error: ${message}` }], isError: true };
20
+ }
21
+ });
22
+ }
23
+ //# sourceMappingURL=update-wallet-balance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-wallet-balance.js","sourceRoot":"","sources":["../../src/tools/update-wallet-balance.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,UAAU,2BAA2B,CAAC,MAAiB,EAAE,OAAgB;IAC7E,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,uJAAuJ,EACvJ,wBAAwB,CAAC,KAAK,EAC9B,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,KAAK,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;YAC1E,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,MAAM,MAAM,CAAC,kBAAkB,IAAI,MAAM,mBAAmB,MAAM,CAAC,KAAK,GAAG;qBAClF;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC5F,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smsmasivos/mcp-server",
3
- "version": "0.2.3",
3
+ "version": "0.3.0",
4
4
  "description": "MCP server for SMS Masivos — bulk SMS platform for Mexico",
5
5
  "type": "module",
6
6
  "main": "dist/stdio.js",