@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.
Files changed (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +256 -0
  3. package/dist/client.d.ts +53 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +372 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/main.d.ts +3 -0
  8. package/dist/main.d.ts.map +1 -0
  9. package/dist/main.js +49 -0
  10. package/dist/main.js.map +1 -0
  11. package/dist/registry/audit.d.ts +3 -0
  12. package/dist/registry/audit.d.ts.map +1 -0
  13. package/dist/registry/audit.js +23 -0
  14. package/dist/registry/audit.js.map +1 -0
  15. package/dist/registry/binary-downloads.d.ts +3 -0
  16. package/dist/registry/binary-downloads.d.ts.map +1 -0
  17. package/dist/registry/binary-downloads.js +80 -0
  18. package/dist/registry/binary-downloads.js.map +1 -0
  19. package/dist/registry/canned-responses.d.ts +11 -0
  20. package/dist/registry/canned-responses.d.ts.map +1 -0
  21. package/dist/registry/canned-responses.js +54 -0
  22. package/dist/registry/canned-responses.js.map +1 -0
  23. package/dist/registry/catalog-images.d.ts +3 -0
  24. package/dist/registry/catalog-images.d.ts.map +1 -0
  25. package/dist/registry/catalog-images.js +48 -0
  26. package/dist/registry/catalog-images.js.map +1 -0
  27. package/dist/registry/catalog.d.ts +3 -0
  28. package/dist/registry/catalog.d.ts.map +1 -0
  29. package/dist/registry/catalog.js +156 -0
  30. package/dist/registry/catalog.js.map +1 -0
  31. package/dist/registry/conversations.d.ts +9 -0
  32. package/dist/registry/conversations.d.ts.map +1 -0
  33. package/dist/registry/conversations.js +246 -0
  34. package/dist/registry/conversations.js.map +1 -0
  35. package/dist/registry/customers.d.ts +3 -0
  36. package/dist/registry/customers.d.ts.map +1 -0
  37. package/dist/registry/customers.js +242 -0
  38. package/dist/registry/customers.js.map +1 -0
  39. package/dist/registry/iam.d.ts +3 -0
  40. package/dist/registry/iam.d.ts.map +1 -0
  41. package/dist/registry/iam.js +116 -0
  42. package/dist/registry/iam.js.map +1 -0
  43. package/dist/registry/index.d.ts +3 -0
  44. package/dist/registry/index.d.ts.map +1 -0
  45. package/dist/registry/index.js +37 -0
  46. package/dist/registry/index.js.map +1 -0
  47. package/dist/registry/integrations.d.ts +3 -0
  48. package/dist/registry/integrations.d.ts.map +1 -0
  49. package/dist/registry/integrations.js +65 -0
  50. package/dist/registry/integrations.js.map +1 -0
  51. package/dist/registry/notifications.d.ts +3 -0
  52. package/dist/registry/notifications.d.ts.map +1 -0
  53. package/dist/registry/notifications.js +44 -0
  54. package/dist/registry/notifications.js.map +1 -0
  55. package/dist/registry/orders.d.ts +3 -0
  56. package/dist/registry/orders.d.ts.map +1 -0
  57. package/dist/registry/orders.js +134 -0
  58. package/dist/registry/orders.js.map +1 -0
  59. package/dist/registry/payments.d.ts +3 -0
  60. package/dist/registry/payments.d.ts.map +1 -0
  61. package/dist/registry/payments.js +39 -0
  62. package/dist/registry/payments.js.map +1 -0
  63. package/dist/registry/pricing.d.ts +3 -0
  64. package/dist/registry/pricing.d.ts.map +1 -0
  65. package/dist/registry/pricing.js +20 -0
  66. package/dist/registry/pricing.js.map +1 -0
  67. package/dist/registry/quotes.d.ts +19 -0
  68. package/dist/registry/quotes.d.ts.map +1 -0
  69. package/dist/registry/quotes.js +81 -0
  70. package/dist/registry/quotes.js.map +1 -0
  71. package/dist/registry/reports.d.ts +3 -0
  72. package/dist/registry/reports.d.ts.map +1 -0
  73. package/dist/registry/reports.js +33 -0
  74. package/dist/registry/reports.js.map +1 -0
  75. package/dist/registry/shipping.d.ts +3 -0
  76. package/dist/registry/shipping.d.ts.map +1 -0
  77. package/dist/registry/shipping.js +85 -0
  78. package/dist/registry/shipping.js.map +1 -0
  79. package/dist/registry/super-admin.d.ts +11 -0
  80. package/dist/registry/super-admin.d.ts.map +1 -0
  81. package/dist/registry/super-admin.js +222 -0
  82. package/dist/registry/super-admin.js.map +1 -0
  83. package/dist/registry/tenants.d.ts +13 -0
  84. package/dist/registry/tenants.d.ts.map +1 -0
  85. package/dist/registry/tenants.js +78 -0
  86. package/dist/registry/tenants.js.map +1 -0
  87. package/dist/registry/types.d.ts +67 -0
  88. package/dist/registry/types.d.ts.map +1 -0
  89. package/dist/registry/types.js +10 -0
  90. package/dist/registry/types.js.map +1 -0
  91. package/dist/registry/uploads.d.ts +3 -0
  92. package/dist/registry/uploads.d.ts.map +1 -0
  93. package/dist/registry/uploads.js +86 -0
  94. package/dist/registry/uploads.js.map +1 -0
  95. package/dist/registry/usage.d.ts +9 -0
  96. package/dist/registry/usage.d.ts.map +1 -0
  97. package/dist/registry/usage.js +33 -0
  98. package/dist/registry/usage.js.map +1 -0
  99. package/dist/tools.d.ts +8 -0
  100. package/dist/tools.d.ts.map +1 -0
  101. package/dist/tools.js +150 -0
  102. package/dist/tools.js.map +1 -0
  103. package/package.json +41 -0
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Solo alcanzable con una key GLOBAL (T-IAM-09b): `SuperAdminGuard` rechaza
3
+ * cualquier key de tenant normal. No manda X-Tenant-Id — estas rutas son
4
+ * cross-tenant por diseño (administran empresas, no operan una).
5
+ *
6
+ * Fuera de este registro a propósito: impersonar (`POST/DELETE/GET
7
+ * .../impersonate`) es un mecanismo de cookie de sesión de navegador, no
8
+ * aplica a un cliente por API key — el mismo resultado se logra con una key
9
+ * global + el header X-Tenant-Id en cualquier tool de negocio normal.
10
+ */
11
+ const ASSIGNABLE_ROLES = ["OWNER", "ADMIN", "VENDOR", "FINANCE", "CATALOG", "SUPPORT", "VIEWER"];
12
+ /**
13
+ * Path del endpoint que `client.ts` usa como probe para detectar si la API
14
+ * key es GLOBAL (ver `probeKeyKind`). Exportado desde el registry para que
15
+ * un rename o mudanza aquí no rompa el probe silenciosamente (antes estaba
16
+ * hardcodeado en client.ts y eso significaba que el aviso de "key global"
17
+ * en main.ts dejaba de aparecer si esto se renombraba).
18
+ */
19
+ export const SUPER_ADMIN_OVERVIEW_PATH = "/super-admin/overview";
20
+ export const superAdminRoutes = [
21
+ {
22
+ name: "super_admin_overview",
23
+ method: "GET",
24
+ path: SUPER_ADMIN_OVERVIEW_PATH,
25
+ description: "Agregados de toda la plataforma: conteos de empresas, usuarios distintos, invitaciones pendientes y uso del mes en curso.",
26
+ scopes: [],
27
+ },
28
+ {
29
+ name: "super_admin_list_users",
30
+ method: "GET",
31
+ path: "/super-admin/users",
32
+ description: "Busca usuarios a través de todas las empresas.",
33
+ scopes: [],
34
+ query: { q: { type: "string" } },
35
+ },
36
+ {
37
+ name: "super_admin_list_tenants",
38
+ method: "GET",
39
+ path: "/super-admin/tenants",
40
+ description: "Lista todas las empresas (tenants) de la plataforma.",
41
+ scopes: [],
42
+ },
43
+ {
44
+ name: "super_admin_get_tenant",
45
+ method: "GET",
46
+ path: "/super-admin/tenants/:id",
47
+ description: "Detalle de una empresa por id.",
48
+ scopes: [],
49
+ pathParams: { id: { type: "string" } },
50
+ },
51
+ {
52
+ name: "super_admin_tenant_usage",
53
+ method: "GET",
54
+ path: "/super-admin/tenants/:id/usage",
55
+ description: "Consumo/costo de una empresa en un rango de fechas.",
56
+ scopes: [],
57
+ pathParams: { id: { type: "string" } },
58
+ query: { from: { type: "string", description: "Fecha ISO." }, to: { type: "string", description: "Fecha ISO." } },
59
+ },
60
+ {
61
+ name: "super_admin_create_tenant",
62
+ method: "POST",
63
+ path: "/super-admin/tenants",
64
+ description: "Da de alta una empresa nueva, con su primer OWNER (se le manda invitación por correo).",
65
+ scopes: [],
66
+ body: {
67
+ name: { type: "string", required: true },
68
+ slug: { type: "string", required: true, description: "Minúsculas, números y guion." },
69
+ ownerEmail: { type: "string", required: true },
70
+ ownerFullName: { type: "string", required: true },
71
+ },
72
+ },
73
+ {
74
+ name: "super_admin_update_tenant",
75
+ method: "PATCH",
76
+ path: "/super-admin/tenants/:id",
77
+ description: "Renombra una empresa. Nota: el backend audita esto con el usuario en sesión; con una key global " +
78
+ "(sin sesión humana) el actor de auditoría puede quedar vacío.",
79
+ scopes: [],
80
+ pathParams: { id: { type: "string" } },
81
+ body: { name: { type: "string" } },
82
+ },
83
+ {
84
+ name: "super_admin_update_tenant_status",
85
+ method: "PATCH",
86
+ path: "/super-admin/tenants/:id/status",
87
+ description: "Activa o desactiva una empresa (DISABLED bloquea el acceso de todo su equipo).",
88
+ scopes: [],
89
+ destructiveHint: true,
90
+ pathParams: { id: { type: "string" } },
91
+ body: { status: { type: "string", required: true, enum: ["ACTIVE", "DISABLED"] } },
92
+ },
93
+ {
94
+ name: "super_admin_invite_member",
95
+ method: "POST",
96
+ path: "/super-admin/tenants/:id/invitations",
97
+ description: "Invita a alguien a una empresa con cualquier rol, incluido OWNER (el super-admin no tiene el límite de jerarquía de un admin normal).",
98
+ scopes: [],
99
+ pathParams: { id: { type: "string" } },
100
+ body: {
101
+ email: { type: "string", required: true },
102
+ fullName: { type: "string", required: true },
103
+ role: { type: "string", required: true, enum: ASSIGNABLE_ROLES },
104
+ },
105
+ },
106
+ {
107
+ name: "super_admin_revoke_invitation",
108
+ method: "DELETE",
109
+ path: "/super-admin/tenants/:id/invitations/:invitationId",
110
+ description: "Cancela una invitación pendiente.",
111
+ scopes: [],
112
+ pathParams: { id: { type: "string" }, invitationId: { type: "string" } },
113
+ },
114
+ {
115
+ name: "super_admin_update_membership",
116
+ method: "PATCH",
117
+ path: "/super-admin/tenants/:id/memberships/:membershipId",
118
+ description: "Cambia el rol o el estado (ACTIVE/DISABLED) de un miembro de una empresa.",
119
+ scopes: [],
120
+ destructiveHint: true,
121
+ pathParams: { id: { type: "string" }, membershipId: { type: "string" } },
122
+ body: {
123
+ role: { type: "string", enum: ASSIGNABLE_ROLES },
124
+ status: { type: "string", enum: ["ACTIVE", "DISABLED"] },
125
+ },
126
+ },
127
+ {
128
+ name: "super_admin_remove_membership",
129
+ method: "DELETE",
130
+ path: "/super-admin/tenants/:id/memberships/:membershipId",
131
+ description: "Quita a alguien de una empresa (lo pasa a DISABLED; no borra la fila).",
132
+ scopes: [],
133
+ pathParams: { id: { type: "string" }, membershipId: { type: "string" } },
134
+ },
135
+ {
136
+ name: "super_admin_list_tenant_api_keys",
137
+ method: "GET",
138
+ path: "/super-admin/tenants/:id/api-keys",
139
+ description: "Lista las API keys de una empresa concreta (mismo dato que vería el OWNER de esa empresa).",
140
+ scopes: [],
141
+ pathParams: { id: { type: "string" } },
142
+ },
143
+ {
144
+ name: "super_admin_create_tenant_api_key",
145
+ method: "POST",
146
+ path: "/super-admin/tenants/:id/api-keys",
147
+ description: "Emite una API key para una empresa concreta, con los scopes que se indiquen (soporte/onboarding en nombre del tenant).",
148
+ scopes: [],
149
+ pathParams: { id: { type: "string" } },
150
+ body: {
151
+ name: { type: "string", required: true },
152
+ scopes: { type: "array", required: true, items: { type: "string" } },
153
+ expiresInDays: { type: "number", description: "1 a 730." },
154
+ },
155
+ },
156
+ {
157
+ name: "super_admin_revoke_tenant_api_key",
158
+ method: "DELETE",
159
+ path: "/super-admin/tenants/:id/api-keys/:keyId",
160
+ description: "Revoca una API key de una empresa concreta.",
161
+ scopes: [],
162
+ pathParams: { id: { type: "string" }, keyId: { type: "string" } },
163
+ },
164
+ {
165
+ name: "super_admin_list_global_api_keys",
166
+ method: "GET",
167
+ path: "/super-admin/api-keys",
168
+ description: "Lista las API keys globales (sin tenant, con todos los scopes) de la plataforma.",
169
+ scopes: [],
170
+ },
171
+ {
172
+ name: "super_admin_create_global_api_key",
173
+ method: "POST",
174
+ path: "/super-admin/api-keys",
175
+ description: "Emite una nueva key global. Siempre lleva TODOS los scopes (no configurable) — es la master key de la " +
176
+ "plataforma. El backend exige sesión de super-admin HUMANO para esto: una key global no puede emitir " +
177
+ "más keys globales por sí sola, así que esta llamada falla con una key global y necesita sesión de panel.",
178
+ scopes: [],
179
+ destructiveHint: true,
180
+ body: {
181
+ name: { type: "string", required: true },
182
+ expiresInDays: { type: "number", description: "1 a 730. Sin esto, no vence." },
183
+ },
184
+ },
185
+ {
186
+ name: "super_admin_revoke_global_api_key",
187
+ method: "DELETE",
188
+ path: "/super-admin/api-keys/:id",
189
+ description: "Revoca una key global. Mismo requisito de sesión humana que crearla.",
190
+ scopes: [],
191
+ destructiveHint: true,
192
+ pathParams: { id: { type: "string" } },
193
+ },
194
+ {
195
+ name: "super_admin_usage_summary",
196
+ method: "GET",
197
+ path: "/super-admin/usage",
198
+ description: "Resumen de uso/costo cross-tenant: tokens y USD por tenant en un rango. " +
199
+ "Sin tenantId, agrega a todos los tenants; con tenantId filtra a uno. " +
200
+ "Útil para facturación interna y para detectar anomalías. Solo key GLOBAL.",
201
+ scopes: [],
202
+ query: {
203
+ tenantId: { type: "string", description: "UUID de un tenant concreto; sin él, todos." },
204
+ from: { type: "string", description: "Fecha ISO, inclusive." },
205
+ to: { type: "string", description: "Fecha ISO, inclusive." },
206
+ },
207
+ },
208
+ {
209
+ name: "super_admin_usage_detail",
210
+ method: "GET",
211
+ path: "/super-admin/usage/detail",
212
+ description: "Drill-down de uso: desglose día × modelo de un tenant en un rango. tenantId es REQUERIDO " +
213
+ "(sin él el backend responde 400). Solo key GLOBAL.",
214
+ scopes: [],
215
+ query: {
216
+ tenantId: { type: "string", required: true, description: "UUID del tenant a detallar." },
217
+ from: { type: "string", description: "Fecha ISO, inclusive." },
218
+ to: { type: "string", description: "Fecha ISO, inclusive." },
219
+ },
220
+ },
221
+ ];
222
+ //# sourceMappingURL=super-admin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"super-admin.js","sourceRoot":"","sources":["../../src/registry/super-admin.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAEjG;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,uBAAuB,CAAC;AAEjE,MAAM,CAAC,MAAM,gBAAgB,GAAe;IAC1C;QACE,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EAAE,2HAA2H;QACxI,MAAM,EAAE,EAAE;KACX;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,gDAAgD;QAC7D,MAAM,EAAE,EAAE;QACV,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;KACjC;IACD;QACE,IAAI,EAAE,0BAA0B;QAChC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,sDAAsD;QACnE,MAAM,EAAE,EAAE;KACX;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,0BAA0B;QAChC,WAAW,EAAE,gCAAgC;QAC7C,MAAM,EAAE,EAAE;QACV,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;KACvC;IACD;QACE,IAAI,EAAE,0BAA0B;QAChC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,gCAAgC;QACtC,WAAW,EAAE,qDAAqD;QAClE,MAAM,EAAE,EAAE;QACV,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;QACtC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE;KAClH;IACD;QACE,IAAI,EAAE,2BAA2B;QACjC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,wFAAwF;QACrG,MAAM,EAAE,EAAE;QACV,IAAI,EAAE;YACJ,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;YACxC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,8BAA8B,EAAE;YACrF,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC9C,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;SAClD;KACF;IACD;QACE,IAAI,EAAE,2BAA2B;QACjC,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,0BAA0B;QAChC,WAAW,EACT,kGAAkG;YAClG,+DAA+D;QACjE,MAAM,EAAE,EAAE;QACV,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;QACtC,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;KACnC;IACD;QACE,IAAI,EAAE,kCAAkC;QACxC,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,iCAAiC;QACvC,WAAW,EAAE,gFAAgF;QAC7F,MAAM,EAAE,EAAE;QACV,eAAe,EAAE,IAAI;QACrB,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;QACtC,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,EAAE;KACnF;IACD;QACE,IAAI,EAAE,2BAA2B;QACjC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,sCAAsC;QAC5C,WAAW,EAAE,uIAAuI;QACpJ,MAAM,EAAE,EAAE;QACV,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;QACtC,IAAI,EAAE;YACJ,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;YACzC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC5C,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE;SACjE;KACF;IACD;QACE,IAAI,EAAE,+BAA+B;QACrC,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,oDAAoD;QAC1D,WAAW,EAAE,mCAAmC;QAChD,MAAM,EAAE,EAAE;QACV,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;KACzE;IACD;QACE,IAAI,EAAE,+BAA+B;QACrC,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,oDAAoD;QAC1D,WAAW,EAAE,2EAA2E;QACxF,MAAM,EAAE,EAAE;QACV,eAAe,EAAE,IAAI;QACrB,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;QACxE,IAAI,EAAE;YACJ,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE;YAChD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE;SACzD;KACF;IACD;QACE,IAAI,EAAE,+BAA+B;QACrC,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,oDAAoD;QAC1D,WAAW,EAAE,wEAAwE;QACrF,MAAM,EAAE,EAAE;QACV,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;KACzE;IACD;QACE,IAAI,EAAE,kCAAkC;QACxC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,mCAAmC;QACzC,WAAW,EAAE,4FAA4F;QACzG,MAAM,EAAE,EAAE;QACV,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;KACvC;IACD;QACE,IAAI,EAAE,mCAAmC;QACzC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,mCAAmC;QACzC,WAAW,EAAE,wHAAwH;QACrI,MAAM,EAAE,EAAE;QACV,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;QACtC,IAAI,EAAE;YACJ,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;YACxC,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;YACpE,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE;SAC3D;KACF;IACD;QACE,IAAI,EAAE,mCAAmC;QACzC,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,0CAA0C;QAChD,WAAW,EAAE,6CAA6C;QAC1D,MAAM,EAAE,EAAE;QACV,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;KAClE;IACD;QACE,IAAI,EAAE,kCAAkC;QACxC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EAAE,kFAAkF;QAC/F,MAAM,EAAE,EAAE;KACX;IACD;QACE,IAAI,EAAE,mCAAmC;QACzC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EACT,wGAAwG;YACxG,sGAAsG;YACtG,0GAA0G;QAC5G,MAAM,EAAE,EAAE;QACV,eAAe,EAAE,IAAI;QACrB,IAAI,EAAE;YACJ,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;YACxC,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;SAC/E;KACF;IACD;QACE,IAAI,EAAE,mCAAmC;QACzC,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,2BAA2B;QACjC,WAAW,EAAE,sEAAsE;QACnF,MAAM,EAAE,EAAE;QACV,eAAe,EAAE,IAAI;QACrB,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;KACvC;IACD;QACE,IAAI,EAAE,2BAA2B;QACjC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EACT,0EAA0E;YAC1E,uEAAuE;YACvE,2EAA2E;QAC7E,MAAM,EAAE,EAAE;QACV,KAAK,EAAE;YACL,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4CAA4C,EAAE;YACvF,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uBAAuB,EAAE;YAC9D,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uBAAuB,EAAE;SAC7D;KACF;IACD;QACE,IAAI,EAAE,0BAA0B;QAChC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,2BAA2B;QACjC,WAAW,EACT,2FAA2F;YAC3F,oDAAoD;QACtD,MAAM,EAAE,EAAE;QACV,KAAK,EAAE;YACL,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,6BAA6B,EAAE;YACxF,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uBAAuB,EAAE;YAC9D,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uBAAuB,EAAE;SAC7D;KACF;CACF,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { RouteDef } from "./types.js";
2
+ /**
3
+ * Auto-administración del propio tenant (`/tenants/me/...`):
4
+ * branding, parámetros comerciales, logo, contexto del agente. Es la
5
+ * "configuración del sistema" que el MCP necesita para que el agente
6
+ * sepa qué tenant es, qué税率 aplica, qué plantillas de WhatsApp usar, etc.
7
+ *
8
+ * Fuera de este registro a propósito:
9
+ * - `tenants/me/delivery-zones`: vive en `shipping.ts` (es de catálogo).
10
+ * - `tenants/me/canned-responses`: vive en `canned-responses.ts`.
11
+ */
12
+ export declare const tenantRoutes: RouteDef[];
13
+ //# sourceMappingURL=tenants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenants.d.ts","sourceRoot":"","sources":["../../src/registry/tenants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY,EAAE,QAAQ,EAqElC,CAAC"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Auto-administración del propio tenant (`/tenants/me/...`):
3
+ * branding, parámetros comerciales, logo, contexto del agente. Es la
4
+ * "configuración del sistema" que el MCP necesita para que el agente
5
+ * sepa qué tenant es, qué税率 aplica, qué plantillas de WhatsApp usar, etc.
6
+ *
7
+ * Fuera de este registro a propósito:
8
+ * - `tenants/me/delivery-zones`: vive en `shipping.ts` (es de catálogo).
9
+ * - `tenants/me/canned-responses`: vive en `canned-responses.ts`.
10
+ */
11
+ export const tenantRoutes = [
12
+ {
13
+ name: "tenants_me_get",
14
+ method: "GET",
15
+ path: "/tenants/me",
16
+ description: "Detalle del propio tenant (nombre, slug, status, configVersion).",
17
+ scopes: ["tenant.admin"],
18
+ },
19
+ {
20
+ name: "tenants_me_agent_context",
21
+ method: "GET",
22
+ path: "/tenants/me/agent-context",
23
+ description: "Contexto mínimo que el agente necesita para responder: nombre, branding, plantillas de " +
24
+ "WhatsApp,税率, link de checkout por defecto. Lectura ligera pensada para cargarse al " +
25
+ "inicio de cada sesión. Requiere catalog.read (no tenant.admin) — pensado para que " +
26
+ "incluso un VENDOR pueda llamar al agente sin permisos administrativos.",
27
+ scopes: ["catalog.read"],
28
+ },
29
+ {
30
+ name: "tenants_me_update_branding",
31
+ method: "PATCH",
32
+ path: "/tenants/me/branding",
33
+ description: "Actualiza el branding visual del tenant (logo URL, colores primario/secundario/acento).",
34
+ scopes: ["tenant.admin"],
35
+ body: {
36
+ logoUrl: { type: "string", description: "URL absoluta del logo (http/https)." },
37
+ primaryColor: { type: "string", description: "Color hex, formato #rrggbb." },
38
+ secondaryColor: { type: "string", description: "Color hex, formato #rrggbb." },
39
+ accentColor: { type: "string", description: "Color hex, formato #rrggbb." },
40
+ },
41
+ },
42
+ {
43
+ name: "tenants_me_update_settings",
44
+ method: "PATCH",
45
+ path: "/tenants/me/settings",
46
+ description: "Actualiza parámetros comerciales del tenant (taxRatePct, shippingFlat, validez de cotizaciones " +
47
+ "y checkouts, tope de descuento del vendedor, recordatorios de cotización, plantillas de " +
48
+ "WhatsApp aprobadas por Meta). Cada PATCH incrementa `configVersion`, lo que invalida caches " +
49
+ "del agente. Todos los campos opcionales — solo se aplica lo enviado.",
50
+ scopes: ["tenant.admin"],
51
+ body: {
52
+ taxRatePct: { type: "number", description: "0 a 100, hasta 2 decimales." },
53
+ shippingFlat: { type: "number", description: "Tarifa plana de envío cuando no hay zona, hasta 2 decimales." },
54
+ quoteValidityHours: { type: "number", description: "Validez de cotizaciones en horas (1 a 8760 = 1 año)." },
55
+ quickPayValidityHours: { type: "number", description: "Validez del link de pago rápido en horas (1 a 8760)." },
56
+ checkoutReservationMinutes: { type: "number", description: "Reserva del link de checkout en minutos (5 a 43200 = 30 días)." },
57
+ maxSellerDiscountPct: { type: "number", description: "0 a 100; tope de descuento que un VENDOR puede aplicar." },
58
+ quoteReminderEnabled: { type: "boolean" },
59
+ quoteReminderEveryHours: { type: "number", description: "1 a 720." },
60
+ quoteReminderMaxCount: { type: "number", description: "0 a 10." },
61
+ whatsappTemplates: {
62
+ type: "any",
63
+ description: "Mapa de clave interna a plantilla aprobada por Meta: " +
64
+ "{ QUOTE_REMINDER: { name: \"recordatorio_cotizacion\", language: \"es_MX\" } }. " +
65
+ "{} borra todas.",
66
+ },
67
+ },
68
+ },
69
+ {
70
+ name: "tenants_me_remove_logo",
71
+ method: "DELETE",
72
+ path: "/tenants/me/logo",
73
+ description: "Quita el logo del tenant (vuelve al placeholder).",
74
+ scopes: ["tenant.admin"],
75
+ destructiveHint: true,
76
+ },
77
+ ];
78
+ //# sourceMappingURL=tenants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenants.js","sourceRoot":"","sources":["../../src/registry/tenants.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,YAAY,GAAe;IACtC;QACE,IAAI,EAAE,gBAAgB;QACtB,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,kEAAkE;QAC/E,MAAM,EAAE,CAAC,cAAc,CAAC;KACzB;IACD;QACE,IAAI,EAAE,0BAA0B;QAChC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,2BAA2B;QACjC,WAAW,EACT,yFAAyF;YACzF,qFAAqF;YACrF,oFAAoF;YACpF,wEAAwE;QAC1E,MAAM,EAAE,CAAC,cAAc,CAAC;KACzB;IACD;QACE,IAAI,EAAE,4BAA4B;QAClC,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,yFAAyF;QACtG,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,IAAI,EAAE;YACJ,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qCAAqC,EAAE;YAC/E,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6BAA6B,EAAE;YAC5E,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6BAA6B,EAAE;YAC9E,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6BAA6B,EAAE;SAC5E;KACF;IACD;QACE,IAAI,EAAE,4BAA4B;QAClC,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EACT,iGAAiG;YACjG,0FAA0F;YAC1F,8FAA8F;YAC9F,sEAAsE;QACxE,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,IAAI,EAAE;YACJ,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6BAA6B,EAAE;YAC1E,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE;YAC7G,kBAAkB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sDAAsD,EAAE;YAC3G,qBAAqB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sDAAsD,EAAE;YAC9G,0BAA0B,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gEAAgE,EAAE;YAC7H,oBAAoB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yDAAyD,EAAE;YAChH,oBAAoB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YACzC,uBAAuB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE;YACpE,qBAAqB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE;YACjE,iBAAiB,EAAE;gBACjB,IAAI,EAAE,KAAK;gBACX,WAAW,EACT,uDAAuD;oBACvD,kFAAkF;oBAClF,iBAAiB;aACpB;SACF;KACF;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,mDAAmD;QAChE,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,eAAe,EAAE,IAAI;KACtB;CACF,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * DSL declarativo para describir una ruta HTTP de commerce-api como una
3
+ * herramienta MCP. Un `RouteDef` por endpoint; `buildTool()` (ver tools.ts)
4
+ * lo convierte en un `ZodRawShape` de entrada y en el handler que arma la
5
+ * petición HTTP real. Mantener esto declarativo (en vez de una función a
6
+ * mano por endpoint) es lo que hace manejable cubrir ~90 rutas: cada
7
+ * definición son unas líneas de datos, no código repetido.
8
+ */
9
+ export type Field = {
10
+ type: "string";
11
+ required?: boolean;
12
+ description?: string;
13
+ enum?: readonly string[];
14
+ } | {
15
+ type: "number";
16
+ required?: boolean;
17
+ description?: string;
18
+ } | {
19
+ type: "boolean";
20
+ required?: boolean;
21
+ description?: string;
22
+ } | {
23
+ type: "array";
24
+ required?: boolean;
25
+ description?: string;
26
+ items: Field;
27
+ } | {
28
+ type: "object";
29
+ required?: boolean;
30
+ description?: string;
31
+ fields: Record<string, Field>;
32
+ } | {
33
+ type: "any";
34
+ required?: boolean;
35
+ description?: string;
36
+ };
37
+ export interface RouteDef {
38
+ /** Nombre de la herramienta MCP, snake_case, único. */
39
+ name: string;
40
+ method: "GET" | "POST" | "PATCH" | "DELETE";
41
+ /** Ruta con placeholders `:param`, relativa a `COMMERCE_API_BASE_URL` (sin incluir /api/v1). */
42
+ path: string;
43
+ description: string;
44
+ /**
45
+ * Scope(s) de commerce-api que exige el endpoint. `[]` significa "no
46
+ * requiere scope adicional al de estar autenticado" — se permite
47
+ * explícitamente para no obligar a mentir con un placeholder
48
+ * (`["_none"]` etc.). Solo informativo: el servidor real hace el 403 si
49
+ * falta (ver `apps/commerce-api/src/auth/principal.guard.ts`).
50
+ */
51
+ scopes: readonly string[];
52
+ pathParams?: Record<string, Field>;
53
+ query?: Record<string, Field>;
54
+ body?: Record<string, Field>;
55
+ /**
56
+ * Sobrescribe el `destructiveHint` que `tools.ts` deriva por default del
57
+ * método HTTP (`DELETE` → true, el resto → false). Márcalo `true` a mano
58
+ * en un POST/PATCH que tenga un efecto real difícil de deshacer: cobra
59
+ * dinero, cancela/desactiva algo, o manda un mensaje real a un cliente.
60
+ * Clientes MCP que respetan las `ToolAnnotations` (Claude Desktop, Claude
61
+ * Code) usan esto para decidir si piden confirmación antes de llamar la
62
+ * tool — es la señal, no una barrera dura: el servidor no bloquea nada
63
+ * por su cuenta, eso lo sigue haciendo commerce-api con scopes.
64
+ */
65
+ destructiveHint?: boolean;
66
+ }
67
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/registry/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,KAAK,GACb;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GACtF;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;CAAE,GAG3F;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9D,MAAM,WAAW,QAAQ;IACvB,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC5C,gGAAgG;IAChG,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC7B;;;;;;;;;OASG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * DSL declarativo para describir una ruta HTTP de commerce-api como una
3
+ * herramienta MCP. Un `RouteDef` por endpoint; `buildTool()` (ver tools.ts)
4
+ * lo convierte en un `ZodRawShape` de entrada y en el handler que arma la
5
+ * petición HTTP real. Mantener esto declarativo (en vez de una función a
6
+ * mano por endpoint) es lo que hace manejable cubrir ~90 rutas: cada
7
+ * definición son unas líneas de datos, no código repetido.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/registry/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerTenantUploads(server: McpServer): void;
3
+ //# sourceMappingURL=uploads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploads.d.ts","sourceRoot":"","sources":["../../src/registry/uploads.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6E7D"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Uploads multipart que no son fotos de catálogo: logo del tenant. No
3
+ * encajan en el DSL declarativo de `types.ts` (pensado para JSON), así que
4
+ * se registran a mano aquí con `apiUpload`.
5
+ *
6
+ * Lo que NO está aquí a propósito:
7
+ * - Constancia fiscal de cliente (PDF con campos extra en el mismo
8
+ * multipart): el backend espera `multipart/form-data` con `file` +
9
+ * campos de texto opcionales, y `apiUpload` solo soporta el archivo.
10
+ * Agregarlo requiere extender el cliente; mientras tanto, sube la
11
+ * constancia desde el panel del tenant y usa `customers_update` para
12
+ * fijar RFC/legalName/etc. sin PDF.
13
+ * - Fotos de catálogo (producto/variante): viven en `catalog-images.ts`
14
+ * porque tienen reglas de validación distintas y es lo que justifica
15
+ * separar este archivo por dominio.
16
+ */
17
+ import { z } from "zod";
18
+ import { apiUpload } from "../client.js";
19
+ const logoInputShape = {
20
+ fileBase64: z.string().describe("Contenido del logo codificado en base64."),
21
+ filename: z.string().describe("Nombre del archivo, p. ej. \"logo.png\"."),
22
+ mimeType: z.string().describe("image/png, image/jpeg, image/webp o image/svg+xml."),
23
+ };
24
+ export function registerTenantUploads(server) {
25
+ server.registerTool("tenants_me_upload_logo", {
26
+ description: "Sube el logo del propio tenant. PNG/JPG/WebP/SVG, entre 128×128 y 4096×4096 px, máximo 2 MB. " +
27
+ "Reemplaza el logo actual. Requiere scope: tenant.admin.",
28
+ inputSchema: logoInputShape,
29
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },
30
+ }, async ({ fileBase64, filename, mimeType }) => {
31
+ const result = await apiUpload("/tenants/me/logo", {
32
+ base64: fileBase64,
33
+ filename,
34
+ mimeType,
35
+ });
36
+ return {
37
+ isError: !result.ok,
38
+ content: [{ type: "text", text: JSON.stringify({ status: result.status, data: result.data }, null, 2) }],
39
+ };
40
+ });
41
+ // La constancia fiscal NO está implementada como tool: el backend espera
42
+ // multipart con archivo + campos de texto opcionales, y `apiUpload` solo
43
+ // soporta el archivo. Mejor devolver un error claro y accionable que
44
+ // pretender que funciona — un cliente MCP que llame esto recibe
45
+ // instrucciones precisas en vez de un fallo opaco del backend.
46
+ server.registerTool("customers_upload_constancia", {
47
+ description: "PLACEHOLDER: la subida de constancia fiscal de cliente NO está soportada por el MCP. " +
48
+ "El backend (`POST /customers/:id/fiscal/constancia`) espera multipart/form-data con " +
49
+ "el PDF + campos de texto opcionales (rfc/legalName/postalCode/regimenFiscal/cfdiUse), " +
50
+ "y el cliente HTTP del MCP solo soporta uploads de archivo único. " +
51
+ "Para subir la constancia, usa el panel del tenant. Para fijar datos fiscales " +
52
+ "manualmente sin PDF, usa `customers_update` con expectedVersion + legalName + " +
53
+ "fiscalPostalCode + fiscalCfdiUse + fiscalRegimenFiscal.",
54
+ inputSchema: {
55
+ id: z.string().describe("id del cliente (UUID)"),
56
+ fileBase64: z.string().describe("IGNORADO — usar el panel del tenant."),
57
+ filename: z.string().describe("IGNORADO."),
58
+ rfc: z.string().optional(),
59
+ legalName: z.string().optional(),
60
+ postalCode: z.string().optional(),
61
+ regimenFiscal: z.string().optional(),
62
+ cfdiUse: z.string().optional(),
63
+ },
64
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
65
+ }, async () => {
66
+ return {
67
+ isError: true,
68
+ content: [
69
+ {
70
+ type: "text",
71
+ text: JSON.stringify({
72
+ status: 0,
73
+ data: {
74
+ error: "NOT_SUPPORTED",
75
+ message: "La subida de constancia fiscal con campos opcionales no está expuesta por el MCP. " +
76
+ "El backend exige multipart/form-data con archivo + campos de texto, lo que requiere " +
77
+ "extender el cliente HTTP. Mientras tanto, sube la constancia desde el panel del tenant " +
78
+ "y usa `customers_update` para fijar RFC/legalName/etc. sin PDF.",
79
+ },
80
+ }, null, 2),
81
+ },
82
+ ],
83
+ };
84
+ });
85
+ }
86
+ //# sourceMappingURL=uploads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploads.js","sourceRoot":"","sources":["../../src/registry/uploads.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { RouteDef } from "./types.js";
2
+ /**
3
+ * `usage.controller.ts` también expone `GET /super-admin/usage` y
4
+ * `GET /super-admin/usage/detail`, pero viven bajo `SuperAdminGuard`
5
+ * (cross-tenant, requiere sesión de super-admin): una API key de tenant no
6
+ * puede pasar ese guard nunca, así que no se incluyen aquí.
7
+ */
8
+ export declare const usageRoutes: RouteDef[];
9
+ //# sourceMappingURL=usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/registry/usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C;;;;;GAKG;AACH,eAAO,MAAM,WAAW,EAAE,QAAQ,EAyBjC,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * `usage.controller.ts` también expone `GET /super-admin/usage` y
3
+ * `GET /super-admin/usage/detail`, pero viven bajo `SuperAdminGuard`
4
+ * (cross-tenant, requiere sesión de super-admin): una API key de tenant no
5
+ * puede pasar ese guard nunca, así que no se incluyen aquí.
6
+ */
7
+ export const usageRoutes = [
8
+ {
9
+ name: "usage_record_event",
10
+ method: "POST",
11
+ path: "/usage/events",
12
+ description: "Reporta un consumo de tokens/costo (uso interno de agentes; no exige scope, solo tenant autenticado).",
13
+ scopes: [],
14
+ body: {
15
+ model: { type: "string", required: true },
16
+ inputTokens: { type: "number", required: true },
17
+ outputTokens: { type: "number", required: true },
18
+ costUsd: { type: "string", required: true, description: "Decimal, hasta 6 posiciones." },
19
+ },
20
+ },
21
+ {
22
+ name: "usage_summary",
23
+ method: "GET",
24
+ path: "/usage/summary",
25
+ description: "Resumen de consumo/costo del tenant en un rango de fechas. Requiere tenant.admin (solo OWNER).",
26
+ scopes: ["tenant.admin"],
27
+ query: {
28
+ from: { type: "string", description: "Fecha ISO." },
29
+ to: { type: "string", description: "Fecha ISO." },
30
+ },
31
+ },
32
+ ];
33
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/registry/usage.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAe;IACrC;QACE,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,uGAAuG;QACpH,MAAM,EAAE,EAAE;QACV,IAAI,EAAE;YACJ,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;YACzC,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC/C,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;YAChD,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,8BAA8B,EAAE;SACzF;KACF;IACD;QACE,IAAI,EAAE,eAAe;QACrB,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,gGAAgG;QAC7G,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,KAAK,EAAE;YACL,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE;YACnD,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE;SAClD;KACF;CACF,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { z } from "zod";
2
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import type { RouteDef } from "./registry/types.js";
4
+ /** `ZodRawShape` de entrada de la tool: path params (siempre requeridos), query y body, todo al mismo nivel. */
5
+ export declare function routeInputShape(route: RouteDef): z.ZodRawShape;
6
+ export declare function registerRoute(server: McpServer, route: RouteDef): void;
7
+ export declare function registerRoutes(server: McpServer, routes: RouteDef[]): void;
8
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAS,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AA+C3D,gHAAgH;AAChH,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC,WAAW,CAe9D;AAsED,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,CAiBtE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAS1E"}