@appaflytech/wappa-mcp 0.0.10 → 0.0.12

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 (149) hide show
  1. package/README.md +40 -0
  2. package/dist/auth.d.ts +25 -0
  3. package/dist/auth.d.ts.map +1 -1
  4. package/dist/auth.js +35 -0
  5. package/dist/auth.js.map +1 -1
  6. package/dist/client.d.ts +39 -2
  7. package/dist/client.d.ts.map +1 -1
  8. package/dist/client.js +159 -6
  9. package/dist/client.js.map +1 -1
  10. package/dist/factory.d.ts +32 -0
  11. package/dist/factory.d.ts.map +1 -0
  12. package/dist/factory.js +286 -0
  13. package/dist/factory.js.map +1 -0
  14. package/dist/http/auth.d.ts +33 -0
  15. package/dist/http/auth.d.ts.map +1 -0
  16. package/dist/http/auth.js +55 -0
  17. package/dist/http/auth.js.map +1 -0
  18. package/dist/http/session.d.ts +30 -0
  19. package/dist/http/session.d.ts.map +1 -0
  20. package/dist/http/session.js +56 -0
  21. package/dist/http/session.js.map +1 -0
  22. package/dist/http/transport.d.ts +21 -0
  23. package/dist/http/transport.d.ts.map +1 -0
  24. package/dist/http/transport.js +101 -0
  25. package/dist/http/transport.js.map +1 -0
  26. package/dist/index.d.ts +5 -3
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +26 -262
  29. package/dist/index.js.map +1 -1
  30. package/dist/server.d.ts +25 -0
  31. package/dist/server.d.ts.map +1 -0
  32. package/dist/server.js +94 -0
  33. package/dist/server.js.map +1 -0
  34. package/dist/tools/ai-chat-sessions.d.ts +143 -0
  35. package/dist/tools/ai-chat-sessions.d.ts.map +1 -0
  36. package/dist/tools/ai-chat-sessions.js +144 -0
  37. package/dist/tools/ai-chat-sessions.js.map +1 -0
  38. package/dist/tools/app-users.d.ts +440 -0
  39. package/dist/tools/app-users.d.ts.map +1 -0
  40. package/dist/tools/app-users.js +347 -0
  41. package/dist/tools/app-users.js.map +1 -0
  42. package/dist/tools/component-categories.d.ts +157 -0
  43. package/dist/tools/component-categories.d.ts.map +1 -0
  44. package/dist/tools/component-categories.js +162 -0
  45. package/dist/tools/component-categories.js.map +1 -0
  46. package/dist/tools/countries.d.ts +148 -0
  47. package/dist/tools/countries.d.ts.map +1 -0
  48. package/dist/tools/countries.js +142 -0
  49. package/dist/tools/countries.js.map +1 -0
  50. package/dist/tools/db-routines.d.ts +229 -0
  51. package/dist/tools/db-routines.d.ts.map +1 -0
  52. package/dist/tools/db-routines.js +233 -0
  53. package/dist/tools/db-routines.js.map +1 -0
  54. package/dist/tools/dynamic-entities.d.ts +166 -0
  55. package/dist/tools/dynamic-entities.d.ts.map +1 -1
  56. package/dist/tools/dynamic-entities.js +156 -0
  57. package/dist/tools/dynamic-entities.js.map +1 -1
  58. package/dist/tools/entities.d.ts +119 -0
  59. package/dist/tools/entities.d.ts.map +1 -1
  60. package/dist/tools/entities.js +413 -4
  61. package/dist/tools/entities.js.map +1 -1
  62. package/dist/tools/error-logs.d.ts +67 -0
  63. package/dist/tools/error-logs.d.ts.map +1 -0
  64. package/dist/tools/error-logs.js +74 -0
  65. package/dist/tools/error-logs.js.map +1 -0
  66. package/dist/tools/general.d.ts.map +1 -1
  67. package/dist/tools/general.js +218 -0
  68. package/dist/tools/general.js.map +1 -1
  69. package/dist/tools/layouts.d.ts +21 -0
  70. package/dist/tools/layouts.d.ts.map +1 -1
  71. package/dist/tools/layouts.js +20 -2
  72. package/dist/tools/layouts.js.map +1 -1
  73. package/dist/tools/operations.d.ts +184 -0
  74. package/dist/tools/operations.d.ts.map +1 -0
  75. package/dist/tools/operations.js +217 -0
  76. package/dist/tools/operations.js.map +1 -0
  77. package/dist/tools/organizations.d.ts +178 -0
  78. package/dist/tools/organizations.d.ts.map +1 -0
  79. package/dist/tools/organizations.js +158 -0
  80. package/dist/tools/organizations.js.map +1 -0
  81. package/dist/tools/page-entities.d.ts +522 -0
  82. package/dist/tools/page-entities.d.ts.map +1 -0
  83. package/dist/tools/page-entities.js +535 -0
  84. package/dist/tools/page-entities.js.map +1 -0
  85. package/dist/tools/pages.d.ts +226 -0
  86. package/dist/tools/pages.d.ts.map +1 -1
  87. package/dist/tools/pages.js +473 -17
  88. package/dist/tools/pages.js.map +1 -1
  89. package/dist/tools/plans.d.ts +293 -0
  90. package/dist/tools/plans.d.ts.map +1 -0
  91. package/dist/tools/plans.js +213 -0
  92. package/dist/tools/plans.js.map +1 -0
  93. package/dist/tools/plugins.d.ts +230 -0
  94. package/dist/tools/plugins.d.ts.map +1 -0
  95. package/dist/tools/plugins.js +218 -0
  96. package/dist/tools/plugins.js.map +1 -0
  97. package/dist/tools/push-notifications.d.ts +261 -0
  98. package/dist/tools/push-notifications.d.ts.map +1 -0
  99. package/dist/tools/push-notifications.js +246 -0
  100. package/dist/tools/push-notifications.js.map +1 -0
  101. package/dist/tools/queries.d.ts +274 -0
  102. package/dist/tools/queries.d.ts.map +1 -1
  103. package/dist/tools/queries.js +319 -17
  104. package/dist/tools/queries.js.map +1 -1
  105. package/dist/tools/query-categories.d.ts +192 -0
  106. package/dist/tools/query-categories.d.ts.map +1 -0
  107. package/dist/tools/query-categories.js +204 -0
  108. package/dist/tools/query-categories.js.map +1 -0
  109. package/dist/tools/regions.d.ts +148 -0
  110. package/dist/tools/regions.d.ts.map +1 -0
  111. package/dist/tools/regions.js +148 -0
  112. package/dist/tools/regions.js.map +1 -0
  113. package/dist/tools/roles.d.ts +284 -0
  114. package/dist/tools/roles.d.ts.map +1 -0
  115. package/dist/tools/roles.js +291 -0
  116. package/dist/tools/roles.js.map +1 -0
  117. package/dist/tools/settings.d.ts +160 -0
  118. package/dist/tools/settings.d.ts.map +1 -0
  119. package/dist/tools/settings.js +187 -0
  120. package/dist/tools/settings.js.map +1 -0
  121. package/dist/tools/showcases.d.ts +184 -0
  122. package/dist/tools/showcases.d.ts.map +1 -0
  123. package/dist/tools/showcases.js +179 -0
  124. package/dist/tools/showcases.js.map +1 -0
  125. package/dist/tools/storage.d.ts +297 -0
  126. package/dist/tools/storage.d.ts.map +1 -0
  127. package/dist/tools/storage.js +302 -0
  128. package/dist/tools/storage.js.map +1 -0
  129. package/dist/tools/subscriptions.d.ts +166 -0
  130. package/dist/tools/subscriptions.d.ts.map +1 -0
  131. package/dist/tools/subscriptions.js +144 -0
  132. package/dist/tools/subscriptions.js.map +1 -0
  133. package/dist/tools/system-tools.d.ts +124 -0
  134. package/dist/tools/system-tools.d.ts.map +1 -0
  135. package/dist/tools/system-tools.js +147 -0
  136. package/dist/tools/system-tools.js.map +1 -0
  137. package/dist/tools/system-variables.d.ts +167 -0
  138. package/dist/tools/system-variables.d.ts.map +1 -0
  139. package/dist/tools/system-variables.js +176 -0
  140. package/dist/tools/system-variables.js.map +1 -0
  141. package/dist/tools/users.d.ts +266 -0
  142. package/dist/tools/users.d.ts.map +1 -0
  143. package/dist/tools/users.js +235 -0
  144. package/dist/tools/users.js.map +1 -0
  145. package/dist/tools/workflows.d.ts +278 -0
  146. package/dist/tools/workflows.d.ts.map +1 -0
  147. package/dist/tools/workflows.js +267 -0
  148. package/dist/tools/workflows.js.map +1 -0
  149. package/package.json +12 -3
@@ -0,0 +1,286 @@
1
+ /**
2
+ * Per-session MCP server factory
3
+ *
4
+ * Builds a McpServer + WapClient pair from a SessionConfig.
5
+ * Used by both the stdio entry (index.ts) and the HTTP server (server.ts)
6
+ * so tool/resource behaviour is identical across transports.
7
+ */
8
+ import { McpServer, ResourceTemplate, } from "@modelcontextprotocol/sdk/server/mcp.js";
9
+ import { z } from "zod";
10
+ import { TokenManager, BearerAuthStrategy, StaticBearerStrategy, ApiKeyAuthStrategy, } from "./auth.js";
11
+ import { WapClient } from "./client.js";
12
+ import { getComponentTools } from "./tools/components.js";
13
+ import { getPageTools } from "./tools/pages.js";
14
+ import { getWidgetTools } from "./tools/widgets.js";
15
+ import { getGeneralTools } from "./tools/general.js";
16
+ import { getSiteTools } from "./tools/sites.js";
17
+ import { getEntityTools } from "./tools/entities.js";
18
+ import { getDynamicEntityTools } from "./tools/dynamic-entities.js";
19
+ import { getLayoutTools } from "./tools/layouts.js";
20
+ import { getQueryTools } from "./tools/queries.js";
21
+ import { getMenuTools } from "./tools/menus.js";
22
+ import { getThemeTools } from "./tools/themes.js";
23
+ import { getLanguageTools } from "./tools/languages.js";
24
+ import { getOrganizationTools } from "./tools/organizations.js";
25
+ import { getPlanTools } from "./tools/plans.js";
26
+ import { getSubscriptionTools } from "./tools/subscriptions.js";
27
+ import { getPushNotificationTools } from "./tools/push-notifications.js";
28
+ import { getUserTools } from "./tools/users.js";
29
+ import { getRoleTools } from "./tools/roles.js";
30
+ import { getCountryTools } from "./tools/countries.js";
31
+ import { getRegionTools } from "./tools/regions.js";
32
+ import { getDbRoutineTools } from "./tools/db-routines.js";
33
+ import { getErrorLogTools } from "./tools/error-logs.js";
34
+ import { getComponentCategoryTools } from "./tools/component-categories.js";
35
+ import { getQueryCategoryTools } from "./tools/query-categories.js";
36
+ import { getShowcaseTools } from "./tools/showcases.js";
37
+ import { getSystemVariableTools } from "./tools/system-variables.js";
38
+ import { getSystemToolTools } from "./tools/system-tools.js";
39
+ import { getPluginTools } from "./tools/plugins.js";
40
+ import { getWorkflowTools } from "./tools/workflows.js";
41
+ import { getAiChatSessionTools } from "./tools/ai-chat-sessions.js";
42
+ import { getAppUserTools } from "./tools/app-users.js";
43
+ import { getOperationTools } from "./tools/operations.js";
44
+ import { getPageEntityTools } from "./tools/page-entities.js";
45
+ import { getStorageTools } from "./tools/storage.js";
46
+ import { getSettingsTools } from "./tools/settings.js";
47
+ // ─── Auth strategy resolver ─────────────────────────────────
48
+ function resolveAuthStrategy(cfg) {
49
+ switch (cfg.auth.kind) {
50
+ case "emailPwd":
51
+ return new BearerAuthStrategy(new TokenManager({
52
+ adminApiUrl: cfg.adminApiUrl,
53
+ email: cfg.auth.email,
54
+ password: cfg.auth.password,
55
+ }));
56
+ case "userJwt":
57
+ return new StaticBearerStrategy(cfg.auth.jwt);
58
+ case "apiKey":
59
+ return new ApiKeyAuthStrategy(cfg.auth.apiKey);
60
+ }
61
+ }
62
+ // ─── Tool → Zod schema converter (shared with original index.ts) ────────────
63
+ function buildZodShape(inputSchema) {
64
+ const zodShape = {};
65
+ const props = inputSchema.properties || {};
66
+ const required = inputSchema.required || [];
67
+ for (const [propName, propDef] of Object.entries(props)) {
68
+ let zodType;
69
+ switch (propDef.type) {
70
+ case "string":
71
+ zodType = propDef.enum ? z.enum(propDef.enum) : z.string();
72
+ break;
73
+ case "number":
74
+ zodType = z.number();
75
+ break;
76
+ case "boolean":
77
+ zodType = z.boolean();
78
+ break;
79
+ case "object":
80
+ zodType = z.record(z.string(), z.unknown());
81
+ break;
82
+ case "array":
83
+ zodType = z.array(z.unknown());
84
+ break;
85
+ default:
86
+ zodType = z.unknown();
87
+ }
88
+ if (propDef.description)
89
+ zodType = zodType.describe(propDef.description);
90
+ if (!required.includes(propName))
91
+ zodType = zodType.optional();
92
+ zodShape[propName] = zodType;
93
+ }
94
+ return zodShape;
95
+ }
96
+ // ─── Factory ─────────────────────────────────────────────────
97
+ export function buildMcpServerForSession(cfg) {
98
+ const auth = resolveAuthStrategy(cfg);
99
+ const client = new WapClient({
100
+ adminApiUrl: cfg.adminApiUrl,
101
+ siteKey: cfg.siteKey,
102
+ language: cfg.language,
103
+ auth,
104
+ });
105
+ const server = new McpServer({ name: "wappa-mcp", version: "1.0.0" });
106
+ // ─── Register tools ───────────────────────────────────────
107
+ const allTools = {
108
+ ...getComponentTools(client),
109
+ ...getPageTools(client),
110
+ ...getWidgetTools(client),
111
+ ...getGeneralTools(client),
112
+ ...getSiteTools(client),
113
+ ...getEntityTools(client),
114
+ ...getDynamicEntityTools(client),
115
+ ...getLayoutTools(client),
116
+ ...getQueryTools(client),
117
+ ...getMenuTools(client),
118
+ ...getThemeTools(client),
119
+ ...getLanguageTools(client),
120
+ ...getOrganizationTools(client),
121
+ ...getPlanTools(client),
122
+ ...getSubscriptionTools(client),
123
+ ...getPushNotificationTools(client),
124
+ ...getUserTools(client),
125
+ ...getRoleTools(client),
126
+ ...getCountryTools(client),
127
+ ...getRegionTools(client),
128
+ ...getDbRoutineTools(client),
129
+ ...getErrorLogTools(client),
130
+ ...getComponentCategoryTools(client),
131
+ ...getQueryCategoryTools(client),
132
+ ...getShowcaseTools(client),
133
+ ...getSystemVariableTools(client),
134
+ ...getSystemToolTools(client),
135
+ ...getPluginTools(client),
136
+ ...getWorkflowTools(client),
137
+ ...getAiChatSessionTools(client),
138
+ ...getAppUserTools(client),
139
+ ...getOperationTools(client),
140
+ ...getPageEntityTools(client),
141
+ ...getStorageTools(client),
142
+ ...getSettingsTools(client),
143
+ };
144
+ for (const [toolName, toolDef] of Object.entries(allTools)) {
145
+ const { description, inputSchema, handler } = toolDef;
146
+ server.tool(`wappa_${toolName}`, description, buildZodShape(inputSchema), async (args) => {
147
+ try {
148
+ return await handler(args);
149
+ }
150
+ catch (error) {
151
+ return {
152
+ content: [
153
+ { type: "text", text: `Error: ${error.message}` },
154
+ ],
155
+ isError: true,
156
+ };
157
+ }
158
+ });
159
+ }
160
+ // ─── Register resources ───────────────────────────────────
161
+ server.resource("wappa-config", "wappa://config", {
162
+ description: "Aktif WAPPA sunucu yapılandırması (site ID, dil, API URL)",
163
+ mimeType: "application/json",
164
+ }, async (uri) => ({
165
+ contents: [
166
+ {
167
+ uri: uri.href,
168
+ mimeType: "application/json",
169
+ text: JSON.stringify({
170
+ adminApiUrl: cfg.adminApiUrl,
171
+ siteKey: cfg.siteKey,
172
+ language: cfg.language,
173
+ }, null, 2),
174
+ },
175
+ ],
176
+ }));
177
+ server.resource("wappa-sites", "wappa://sites", {
178
+ description: "WAPPA'daki tüm site listesi (canlı veri)",
179
+ mimeType: "application/json",
180
+ }, async (uri) => {
181
+ const result = await client.getSites({});
182
+ return {
183
+ contents: [
184
+ {
185
+ uri: uri.href,
186
+ mimeType: "application/json",
187
+ text: JSON.stringify(result, null, 2),
188
+ },
189
+ ],
190
+ };
191
+ });
192
+ server.resource("wappa-pages", "wappa://pages", {
193
+ description: "Aktif sitedeki tüm sayfalar (canlı veri)",
194
+ mimeType: "application/json",
195
+ }, async (uri) => {
196
+ const result = await client.getPages({});
197
+ return {
198
+ contents: [
199
+ {
200
+ uri: uri.href,
201
+ mimeType: "application/json",
202
+ text: JSON.stringify(result, null, 2),
203
+ },
204
+ ],
205
+ };
206
+ });
207
+ server.resource("wappa-components", "wappa://components", {
208
+ description: "Aktif sitedeki tüm bileşenler (canlı veri)",
209
+ mimeType: "application/json",
210
+ }, async (uri) => {
211
+ const result = await client.getComponents({});
212
+ return {
213
+ contents: [
214
+ {
215
+ uri: uri.href,
216
+ mimeType: "application/json",
217
+ text: JSON.stringify(result, null, 2),
218
+ },
219
+ ],
220
+ };
221
+ });
222
+ server.resource("wappa-entities", "wappa://entities", {
223
+ description: "Tanımlı tüm entity şemaları (canlı veri)",
224
+ mimeType: "application/json",
225
+ }, async (uri) => {
226
+ const result = await client.getEntities({});
227
+ return {
228
+ contents: [
229
+ {
230
+ uri: uri.href,
231
+ mimeType: "application/json",
232
+ text: JSON.stringify(result, null, 2),
233
+ },
234
+ ],
235
+ };
236
+ });
237
+ server.resource("wappa-layouts", "wappa://layouts", {
238
+ description: "Aktif sitedeki tüm layoutlar (canlı veri)",
239
+ mimeType: "application/json",
240
+ }, async (uri) => {
241
+ const result = await client.getLayouts({});
242
+ return {
243
+ contents: [
244
+ {
245
+ uri: uri.href,
246
+ mimeType: "application/json",
247
+ text: JSON.stringify(result, null, 2),
248
+ },
249
+ ],
250
+ };
251
+ });
252
+ server.resource("wappa-queries", "wappa://queries", {
253
+ description: "Kayıtlı tüm query/sorgu şablonları (canlı veri)",
254
+ mimeType: "application/json",
255
+ }, async (uri) => {
256
+ const result = await client.getQueries({});
257
+ return {
258
+ contents: [
259
+ {
260
+ uri: uri.href,
261
+ mimeType: "application/json",
262
+ text: JSON.stringify(result, null, 2),
263
+ },
264
+ ],
265
+ };
266
+ });
267
+ server.resource("wappa-entity-records", new ResourceTemplate("wappa://entities/{entityId}/records", {
268
+ list: undefined,
269
+ }), {
270
+ description: "Belirli bir entity'nin tüm kayıtları. URI: wappa://entities/{entityId}/records",
271
+ mimeType: "application/json",
272
+ }, async (uri, { entityId }) => {
273
+ const result = await client.getDynamicEntities(entityId, {});
274
+ return {
275
+ contents: [
276
+ {
277
+ uri: uri.href,
278
+ mimeType: "application/json",
279
+ text: JSON.stringify(result, null, 2),
280
+ },
281
+ ],
282
+ };
283
+ });
284
+ return { server, client };
285
+ }
286
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * HTTP transport auth middleware
3
+ *
4
+ * Reads auth credentials from request headers and attaches them to req.wappa.
5
+ * Supports two modes:
6
+ * - Bearer JWT : Authorization: Bearer <jwt> (Admin UI passthrough)
7
+ * - API Key : X-API-Key: <key> (Backend API Key)
8
+ *
9
+ * Required headers on every request:
10
+ * X-Wappa-Site-Key : site slug, e.g. "glomil"
11
+ * X-Wappa-Admin-Api : backend admin API base URL, e.g. "https://api.example.com"
12
+ *
13
+ * Optional:
14
+ * X-Wappa-Language : locale (default "en-us")
15
+ */
16
+ import type { Request, Response, NextFunction } from "express";
17
+ export interface WappaRequestContext {
18
+ /** Resolved auth: either a JWT or an API key */
19
+ jwt?: string;
20
+ apiKey?: string;
21
+ siteKey: string;
22
+ adminApiUrl: string;
23
+ language: string;
24
+ }
25
+ declare global {
26
+ namespace Express {
27
+ interface Request {
28
+ wappa: WappaRequestContext;
29
+ }
30
+ }
31
+ }
32
+ export declare function wappaAuthMiddleware(req: Request, res: Response, next: NextFunction): void;
33
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/http/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE/D,MAAM,WAAW,mBAAmB;IAClC,gDAAgD;IAChD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAGD,OAAO,CAAC,MAAM,CAAC;IAEb,UAAU,OAAO,CAAC;QAChB,UAAU,OAAO;YACf,KAAK,EAAE,mBAAmB,CAAC;SAC5B;KACF;CACF;AAKD,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,GACjB,IAAI,CA4CN"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * HTTP transport auth middleware
3
+ *
4
+ * Reads auth credentials from request headers and attaches them to req.wappa.
5
+ * Supports two modes:
6
+ * - Bearer JWT : Authorization: Bearer <jwt> (Admin UI passthrough)
7
+ * - API Key : X-API-Key: <key> (Backend API Key)
8
+ *
9
+ * Required headers on every request:
10
+ * X-Wappa-Site-Key : site slug, e.g. "glomil"
11
+ * X-Wappa-Admin-Api : backend admin API base URL, e.g. "https://api.example.com"
12
+ *
13
+ * Optional:
14
+ * X-Wappa-Language : locale (default "en-us")
15
+ */
16
+ /** Regex for a minimal sanity check on incoming JWTs (three base64url segments). */
17
+ const JWT_PATTERN = /^[\w-]+\.[\w-]+\.[\w-]+$/;
18
+ export function wappaAuthMiddleware(req, res, next) {
19
+ const adminApiUrl = req.headers["x-wappa-admin-api"];
20
+ const siteKey = req.headers["x-wappa-site-key"];
21
+ const language = req.headers["x-wappa-language"] ?? "en-us";
22
+ if (!adminApiUrl) {
23
+ res.status(400).json({ error: "Missing header: X-Wappa-Admin-Api" });
24
+ return;
25
+ }
26
+ if (!siteKey) {
27
+ res.status(400).json({ error: "Missing header: X-Wappa-Site-Key" });
28
+ return;
29
+ }
30
+ const authHeader = req.headers.authorization;
31
+ const apiKeyHeader = req.headers["x-api-key"];
32
+ if (authHeader?.startsWith("Bearer ")) {
33
+ const jwt = authHeader.slice(7);
34
+ if (!JWT_PATTERN.test(jwt)) {
35
+ res.status(401).json({ error: "Malformed JWT in Authorization header" });
36
+ return;
37
+ }
38
+ req.wappa = { jwt, siteKey, adminApiUrl, language };
39
+ next();
40
+ return;
41
+ }
42
+ if (apiKeyHeader) {
43
+ if (apiKeyHeader.length < 8) {
44
+ res.status(401).json({ error: "API key too short" });
45
+ return;
46
+ }
47
+ req.wappa = { apiKey: apiKeyHeader, siteKey, adminApiUrl, language };
48
+ next();
49
+ return;
50
+ }
51
+ res.status(401).json({
52
+ error: "Authentication required: provide Authorization: Bearer <jwt> or X-API-Key: <key>",
53
+ });
54
+ }
55
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/http/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAuBH,oFAAoF;AACpF,MAAM,WAAW,GAAG,0BAA0B,CAAC;AAE/C,MAAM,UAAU,mBAAmB,CACjC,GAAY,EACZ,GAAa,EACb,IAAkB;IAElB,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAuB,CAAC;IAC3E,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAuB,CAAC;IACtE,MAAM,QAAQ,GACX,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAwB,IAAI,OAAO,CAAC;IAErE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC,CAAC;QACrE,OAAO;IACT,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kCAAkC,EAAE,CAAC,CAAC;QACpE,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;IAC7C,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAuB,CAAC;IAEpE,IAAI,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uCAAuC,EAAE,CAAC,CAAC;YACzE,OAAO;QACT,CAAC;QACD,GAAG,CAAC,KAAK,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;QACpD,IAAI,EAAE,CAAC;QACP,OAAO;IACT,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QACD,GAAG,CAAC,KAAK,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;QACrE,IAAI,EAAE,CAAC;QACP,OAAO;IACT,CAAC;IAED,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,KAAK,EACH,kFAAkF;KACrF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * In-memory MCP session store
3
+ *
4
+ * Each HTTP/Streamable-HTTP session maps a session-id (UUID) to:
5
+ * - the McpServer instance
6
+ * - the StreamableHTTPServerTransport
7
+ * - metadata for TTL cleanup
8
+ *
9
+ * Sessions are cleaned up automatically after SESSION_TTL_MS (default 1 hour)
10
+ * of inactivity. "Activity" is refreshed on every MCP request.
11
+ */
12
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
13
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
14
+ export interface McpSession {
15
+ server: McpServer;
16
+ transport: StreamableHTTPServerTransport;
17
+ siteKey: string;
18
+ adminApiUrl: string;
19
+ createdAt: number;
20
+ lastUsedAt: number;
21
+ }
22
+ /** Register a new session (called once per POST /mcp that initialises). */
23
+ export declare function addSession(id: string, session: McpSession): void;
24
+ /** Look up a session and refresh its lastUsedAt timestamp. */
25
+ export declare function getSession(id: string): McpSession | undefined;
26
+ /** Delete a session and close its transport. */
27
+ export declare function removeSession(id: string): Promise<void>;
28
+ /** Gracefully close all sessions (called on process exit). */
29
+ export declare function closeAllSessions(): Promise<void>;
30
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/http/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAEnG,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,6BAA6B,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,2EAA2E;AAC3E,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI,CAEhE;AAED,8DAA8D;AAC9D,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAI7D;AAED,gDAAgD;AAChD,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS7D;AAgBD,8DAA8D;AAC9D,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAGtD"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * In-memory MCP session store
3
+ *
4
+ * Each HTTP/Streamable-HTTP session maps a session-id (UUID) to:
5
+ * - the McpServer instance
6
+ * - the StreamableHTTPServerTransport
7
+ * - metadata for TTL cleanup
8
+ *
9
+ * Sessions are cleaned up automatically after SESSION_TTL_MS (default 1 hour)
10
+ * of inactivity. "Activity" is refreshed on every MCP request.
11
+ */
12
+ const SESSION_TTL_MS = 60 * 60 * 1_000; // 1 hour
13
+ const sessions = new Map();
14
+ /** Register a new session (called once per POST /mcp that initialises). */
15
+ export function addSession(id, session) {
16
+ sessions.set(id, session);
17
+ }
18
+ /** Look up a session and refresh its lastUsedAt timestamp. */
19
+ export function getSession(id) {
20
+ const s = sessions.get(id);
21
+ if (s)
22
+ s.lastUsedAt = Date.now();
23
+ return s;
24
+ }
25
+ /** Delete a session and close its transport. */
26
+ export async function removeSession(id) {
27
+ const s = sessions.get(id);
28
+ if (!s)
29
+ return;
30
+ sessions.delete(id);
31
+ try {
32
+ await s.transport.close();
33
+ }
34
+ catch {
35
+ // ignore close errors
36
+ }
37
+ }
38
+ /** Periodic cleanup of idle sessions. */
39
+ function evictExpiredSessions() {
40
+ const now = Date.now();
41
+ for (const [id, s] of sessions) {
42
+ if (now - s.lastUsedAt > SESSION_TTL_MS) {
43
+ removeSession(id).catch(() => undefined);
44
+ }
45
+ }
46
+ }
47
+ // Run cleanup every 10 minutes — unref so it doesn't block process exit
48
+ const cleanupTimer = setInterval(evictExpiredSessions, 10 * 60 * 1_000);
49
+ if (typeof cleanupTimer.unref === "function")
50
+ cleanupTimer.unref();
51
+ /** Gracefully close all sessions (called on process exit). */
52
+ export async function closeAllSessions() {
53
+ clearInterval(cleanupTimer);
54
+ await Promise.allSettled([...sessions.keys()].map(removeSession));
55
+ }
56
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/http/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAcH,MAAM,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,SAAS;AAEjD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAsB,CAAC;AAE/C,2EAA2E;AAC3E,MAAM,UAAU,UAAU,CAAC,EAAU,EAAE,OAAmB;IACxD,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;AAC5B,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3B,IAAI,CAAC;QAAE,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACjC,OAAO,CAAC,CAAC;AACX,CAAC;AAED,gDAAgD;AAChD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAAU;IAC5C,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3B,IAAI,CAAC,CAAC;QAAE,OAAO;IACf,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;AACH,CAAC;AAED,yCAAyC;AACzC,SAAS,oBAAoB;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,GAAG,GAAG,CAAC,CAAC,UAAU,GAAG,cAAc,EAAE,CAAC;YACxC,aAAa,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,MAAM,YAAY,GAAG,WAAW,CAAC,oBAAoB,EAAE,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;AACxE,IAAI,OAAO,YAAY,CAAC,KAAK,KAAK,UAAU;IAAE,YAAY,CAAC,KAAK,EAAE,CAAC;AAEnE,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,aAAa,CAAC,YAAY,CAAC,CAAC;IAC5B,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * MCP Streamable-HTTP transport handlers
3
+ *
4
+ * POST /mcp
5
+ * - First request (no Mcp-Session-Id header): initialise new session
6
+ * - Subsequent requests (with header): delegate to existing transport
7
+ *
8
+ * GET /mcp
9
+ * - SSE streaming for existing session (server-to-client push)
10
+ *
11
+ * DELETE /mcp
12
+ * - Explicitly close a session
13
+ */
14
+ import type { Request, Response } from "express";
15
+ /** Handle POST /mcp — init new session or route to existing one */
16
+ export declare function handleMcpPost(req: Request, res: Response): Promise<void>;
17
+ /** Handle GET /mcp — SSE stream for an existing session */
18
+ export declare function handleMcpGet(req: Request, res: Response): Promise<void>;
19
+ /** Handle DELETE /mcp — explicit session teardown */
20
+ export declare function handleMcpDelete(req: Request, res: Response): Promise<void>;
21
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/http/transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAejD,mEAAmE;AACnE,wBAAsB,aAAa,CACjC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,GACZ,OAAO,CAAC,IAAI,CAAC,CAyDf;AAED,2DAA2D;AAC3D,wBAAsB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAc7E;AAED,qDAAqD;AACrD,wBAAsB,eAAe,CACnC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,GACZ,OAAO,CAAC,IAAI,CAAC,CASf"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * MCP Streamable-HTTP transport handlers
3
+ *
4
+ * POST /mcp
5
+ * - First request (no Mcp-Session-Id header): initialise new session
6
+ * - Subsequent requests (with header): delegate to existing transport
7
+ *
8
+ * GET /mcp
9
+ * - SSE streaming for existing session (server-to-client push)
10
+ *
11
+ * DELETE /mcp
12
+ * - Explicitly close a session
13
+ */
14
+ import { randomUUID } from "crypto";
15
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
16
+ import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
17
+ import { buildMcpServerForSession } from "../factory.js";
18
+ import { addSession, getSession, removeSession } from "./session.js";
19
+ function buildSessionAuth(ctx) {
20
+ if (ctx.apiKey)
21
+ return { kind: "apiKey", apiKey: ctx.apiKey };
22
+ if (ctx.jwt)
23
+ return { kind: "userJwt", jwt: ctx.jwt };
24
+ // Should never reach here — middleware already validated
25
+ throw new Error("No auth credential in request context");
26
+ }
27
+ /** Handle POST /mcp — init new session or route to existing one */
28
+ export async function handleMcpPost(req, res) {
29
+ const existingId = req.headers["mcp-session-id"];
30
+ // ── Route to existing session ──────────────────────────────
31
+ if (existingId) {
32
+ const session = getSession(existingId);
33
+ if (!session) {
34
+ res.status(404).json({ error: "Session not found or expired" });
35
+ return;
36
+ }
37
+ await session.transport.handleRequest(req, res, req.body);
38
+ return;
39
+ }
40
+ // ── Init new session ───────────────────────────────────────
41
+ if (!isInitializeRequest(req.body)) {
42
+ res
43
+ .status(400)
44
+ .json({ error: "First request must be an MCP initialize request" });
45
+ return;
46
+ }
47
+ const ctx = req.wappa;
48
+ const sessionId = randomUUID();
49
+ const transport = new StreamableHTTPServerTransport({
50
+ sessionIdGenerator: () => sessionId,
51
+ onsessioninitialized: (sid) => {
52
+ // transport is ready after server.connect — addSession is called below
53
+ void sid;
54
+ },
55
+ });
56
+ // Clean up session when transport closes
57
+ transport.onclose = () => {
58
+ removeSession(sessionId).catch(() => undefined);
59
+ };
60
+ const { server } = buildMcpServerForSession({
61
+ adminApiUrl: ctx.adminApiUrl,
62
+ siteKey: ctx.siteKey,
63
+ language: ctx.language,
64
+ auth: buildSessionAuth(ctx),
65
+ });
66
+ await server.connect(transport);
67
+ addSession(sessionId, {
68
+ server,
69
+ transport,
70
+ siteKey: ctx.siteKey,
71
+ adminApiUrl: ctx.adminApiUrl,
72
+ createdAt: Date.now(),
73
+ lastUsedAt: Date.now(),
74
+ });
75
+ await transport.handleRequest(req, res, req.body);
76
+ }
77
+ /** Handle GET /mcp — SSE stream for an existing session */
78
+ export async function handleMcpGet(req, res) {
79
+ const sessionId = req.headers["mcp-session-id"];
80
+ if (!sessionId) {
81
+ res.status(400).json({ error: "Missing Mcp-Session-Id header" });
82
+ return;
83
+ }
84
+ const session = getSession(sessionId);
85
+ if (!session) {
86
+ res.status(404).json({ error: "Session not found or expired" });
87
+ return;
88
+ }
89
+ await session.transport.handleRequest(req, res);
90
+ }
91
+ /** Handle DELETE /mcp — explicit session teardown */
92
+ export async function handleMcpDelete(req, res) {
93
+ const sessionId = req.headers["mcp-session-id"];
94
+ if (!sessionId) {
95
+ res.status(400).json({ error: "Missing Mcp-Session-Id header" });
96
+ return;
97
+ }
98
+ await removeSession(sessionId);
99
+ res.status(204).send();
100
+ }
101
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/http/transport.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,10 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * WAPPA Admin API MCP Server
3
+ * WAPPA Admin API MCP Server — stdio entry point
4
4
  *
5
- * Provides Claude Code with direct access to WAPPA (Web as Platform) Admin API.
6
- * Supports component CRUD, page management, widget operations, and more.
5
+ * Supports two auth modes controlled by environment variables:
6
+ * 1. Email/password — WAP_EMAIL + WAP_PASSWORD (legacy, default)
7
+ * 2. API Key — WAP_API_KEY (Organisation API Key, no sign-in needed)
7
8
  *
9
+ * Provides Claude Code / Cursor with direct access to WAPPA Admin API tools.
8
10
  */
9
11
  export {};
10
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;GAMG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG"}