@baasix/baasix 0.1.2 → 0.1.4

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 (99) hide show
  1. package/README.md +51 -16
  2. package/dist/README.md +51 -16
  3. package/dist/app/404/index.html +1 -1
  4. package/dist/app/404.html +1 -1
  5. package/dist/app/_next/static/chunks/{3817-e20c8f0a0810fc95.js → 3817-5170706432487eeb.js} +1 -1
  6. package/dist/app/_next/static/chunks/{9599-a7e572bb88c3392b.js → 9599-c979a80a3f8557a2.js} +1 -1
  7. package/dist/app/_next/static/chunks/app/(authenticated)/settings/schema/page-12bec5e776a0974d.js +1 -0
  8. package/dist/app/_next/static/chunks/app/(authenticated)/workflows/page-5c2330ee5dc13ab1.js +1 -0
  9. package/dist/app/_next/static/chunks/{webpack-97b8127545c29856.js → webpack-c0a542d3562cc14f.js} +1 -1
  10. package/dist/app/activity-log/all-activity/index.html +1 -1
  11. package/dist/app/activity-log/all-activity/index.txt +2 -2
  12. package/dist/app/activity-log/email-log/index.html +1 -1
  13. package/dist/app/activity-log/email-log/index.txt +2 -2
  14. package/dist/app/activity-log/index.html +1 -1
  15. package/dist/app/activity-log/index.txt +1 -1
  16. package/dist/app/activity-log/notifications/index.html +1 -1
  17. package/dist/app/activity-log/notifications/index.txt +1 -1
  18. package/dist/app/activity-log/sessions/index.html +1 -1
  19. package/dist/app/activity-log/sessions/index.txt +1 -1
  20. package/dist/app/activity-log/workflow-executions/index.html +1 -1
  21. package/dist/app/activity-log/workflow-executions/index.txt +1 -1
  22. package/dist/app/activity-log/workflow-logs/index.html +1 -1
  23. package/dist/app/activity-log/workflow-logs/index.txt +1 -1
  24. package/dist/app/change-password/index.html +1 -1
  25. package/dist/app/change-password/index.txt +1 -1
  26. package/dist/app/dashboard/index.html +1 -1
  27. package/dist/app/dashboard/index.txt +1 -1
  28. package/dist/app/data-browser/index.html +1 -1
  29. package/dist/app/data-browser/index.txt +1 -1
  30. package/dist/app/file-manager/index.html +1 -1
  31. package/dist/app/file-manager/index.txt +2 -2
  32. package/dist/app/forgot-password/index.html +1 -1
  33. package/dist/app/forgot-password/index.txt +1 -1
  34. package/dist/app/index.html +1 -1
  35. package/dist/app/index.txt +1 -1
  36. package/dist/app/login/index.html +1 -1
  37. package/dist/app/login/index.txt +1 -1
  38. package/dist/app/register/index.html +1 -1
  39. package/dist/app/register/index.txt +1 -1
  40. package/dist/app/settings/migrations/index.html +1 -1
  41. package/dist/app/settings/migrations/index.txt +1 -1
  42. package/dist/app/settings/permissions/index.html +1 -1
  43. package/dist/app/settings/permissions/index.txt +2 -2
  44. package/dist/app/settings/project/index.html +1 -1
  45. package/dist/app/settings/project/index.txt +2 -2
  46. package/dist/app/settings/roles/index.html +1 -1
  47. package/dist/app/settings/roles/index.txt +2 -2
  48. package/dist/app/settings/schema/index.html +1 -1
  49. package/dist/app/settings/schema/index.txt +2 -2
  50. package/dist/app/settings/tasks/index.html +1 -1
  51. package/dist/app/settings/tasks/index.txt +1 -1
  52. package/dist/app/settings/templates/edit/index.html +1 -1
  53. package/dist/app/settings/templates/edit/index.txt +1 -1
  54. package/dist/app/settings/templates/index.html +1 -1
  55. package/dist/app/settings/templates/index.txt +2 -2
  56. package/dist/app/settings/tenants/index.html +1 -1
  57. package/dist/app/settings/tenants/index.txt +2 -2
  58. package/dist/app/users/index.html +1 -1
  59. package/dist/app/users/index.txt +2 -2
  60. package/dist/app/users/invites/index.html +1 -1
  61. package/dist/app/users/invites/index.txt +1 -1
  62. package/dist/app/users/list/index.html +1 -1
  63. package/dist/app/users/list/index.txt +2 -2
  64. package/dist/app/users/preferences/index.html +1 -1
  65. package/dist/app/users/preferences/index.txt +1 -1
  66. package/dist/app/users/user-roles/index.html +1 -1
  67. package/dist/app/users/user-roles/index.txt +1 -1
  68. package/dist/app/workflows/detail/index.html +1 -1
  69. package/dist/app/workflows/detail/index.txt +1 -1
  70. package/dist/app/workflows/edit/index.html +1 -1
  71. package/dist/app/workflows/edit/index.txt +1 -1
  72. package/dist/app/workflows/execution/index.html +1 -1
  73. package/dist/app/workflows/execution/index.txt +1 -1
  74. package/dist/app/workflows/index.html +1 -1
  75. package/dist/app/workflows/index.txt +2 -2
  76. package/dist/routes/mcp.route.d.ts +23 -0
  77. package/dist/routes/mcp.route.d.ts.map +1 -0
  78. package/dist/routes/mcp.route.js +318 -0
  79. package/dist/routes/mcp.route.js.map +1 -0
  80. package/dist/routes/openapi.route.js +1 -1
  81. package/dist/routes/openapi.route.js.map +1 -1
  82. package/dist/routes/schema.route.d.ts.map +1 -1
  83. package/dist/routes/schema.route.js +10 -6
  84. package/dist/routes/schema.route.js.map +1 -1
  85. package/dist/services/MCPService.d.ts +39 -0
  86. package/dist/services/MCPService.d.ts.map +1 -0
  87. package/dist/services/MCPService.js +1413 -0
  88. package/dist/services/MCPService.js.map +1 -0
  89. package/dist/utils/auth.d.ts.map +1 -1
  90. package/dist/utils/auth.js +27 -5
  91. package/dist/utils/auth.js.map +1 -1
  92. package/dist/utils/schemaManager.d.ts.map +1 -1
  93. package/dist/utils/schemaManager.js +36 -0
  94. package/dist/utils/schemaManager.js.map +1 -1
  95. package/package.json +2 -1
  96. package/dist/app/_next/static/chunks/app/(authenticated)/settings/schema/page-899574f35091dd58.js +0 -1
  97. package/dist/app/_next/static/chunks/app/(authenticated)/workflows/page-1a7a4305ef892fa8.js +0 -1
  98. /package/dist/app/_next/static/{IrfWLqQW-v_VRpZ550bv5 → ZFTLSdIpaRn3r1OwNmuIZ}/_buildManifest.js +0 -0
  99. /package/dist/app/_next/static/{IrfWLqQW-v_VRpZ550bv5 → ZFTLSdIpaRn3r1OwNmuIZ}/_ssgManifest.js +0 -0
@@ -0,0 +1,318 @@
1
+ // @ts-nocheck
2
+ /**
3
+ * MCP Route - Model Context Protocol HTTP endpoint
4
+ *
5
+ * Provides MCP server access via Streamable HTTP transport at /mcp
6
+ * Enable via environment variable: MCP_ENABLED=true
7
+ *
8
+ * Authentication options (in priority order):
9
+ * 1. MCP_AUTH_TOKEN - Static token for MCP access
10
+ * 2. MCP_EMAIL + MCP_PASSWORD - Auto-login and reuse token
11
+ * 3. Authorization header or cookie from request (like normal API calls)
12
+ *
13
+ * Supports both stateful (with sessions) and stateless modes.
14
+ *
15
+ * Note: @ts-nocheck is used because the MCP SDK types cause TypeScript
16
+ * to hang during compilation due to complex generic type inference.
17
+ */
18
+ import { randomUUID } from "crypto";
19
+ import env from "../utils/env.js";
20
+ // ==================== Lazy-loaded Dependencies ====================
21
+ let StreamableHTTPServerTransport;
22
+ let createMCPServer;
23
+ let setMCPSession;
24
+ let removeMCPSession;
25
+ // Store active transports for session management
26
+ const activeTransports = new Map();
27
+ // Store MCP server instance (singleton)
28
+ let mcpServer = null;
29
+ /**
30
+ * Load MCP dependencies lazily
31
+ */
32
+ async function loadMCPDependencies() {
33
+ if (!StreamableHTTPServerTransport) {
34
+ const mcpModule = await import("@modelcontextprotocol/sdk/server/streamableHttp.js");
35
+ StreamableHTTPServerTransport = mcpModule.StreamableHTTPServerTransport;
36
+ const mcpService = await import("../services/MCPService.js");
37
+ createMCPServer = mcpService.createMCPServer;
38
+ setMCPSession = mcpService.setMCPSession;
39
+ removeMCPSession = mcpService.removeMCPSession;
40
+ }
41
+ }
42
+ // Cache for header-based login (per email)
43
+ const headerLoginCache = new Map();
44
+ /**
45
+ * Login using email and password from headers
46
+ * Returns accountability object or null if failed
47
+ */
48
+ async function performLogin(email, password, cacheKey) {
49
+ // Check if we have a valid cached token for this email
50
+ const cached = headerLoginCache.get(cacheKey);
51
+ if (cached && Date.now() < cached.expiry && cached.accountability) {
52
+ return cached.accountability;
53
+ }
54
+ try {
55
+ // Import auth utilities
56
+ const { default: axios } = await import("axios");
57
+ const baseUrl = `http://localhost:${env.get("PORT") || "8056"}`;
58
+ const response = await axios.post(`${baseUrl}/auth/login`, {
59
+ email,
60
+ password,
61
+ });
62
+ if (response.data?.token) {
63
+ // Extract accountability from token response
64
+ const accountability = {
65
+ user: response.data.user?.id || null,
66
+ role: response.data.user?.role?.name || response.data.user?.role_Id || null,
67
+ admin: response.data.user?.role?.name === "administrator",
68
+ ip: "127.0.0.1",
69
+ };
70
+ // Cache for 55 minutes (tokens typically last 1 hour)
71
+ headerLoginCache.set(cacheKey, {
72
+ token: response.data.token,
73
+ expiry: Date.now() + 55 * 60 * 1000,
74
+ accountability,
75
+ });
76
+ console.info(`[MCP] Login successful for ${email}`);
77
+ return accountability;
78
+ }
79
+ }
80
+ catch (error) {
81
+ const err = error;
82
+ console.error(`[MCP] Login failed for ${email}:`, err.message);
83
+ headerLoginCache.delete(cacheKey);
84
+ }
85
+ return null;
86
+ }
87
+ /**
88
+ * Get accountability from request headers
89
+ * Priority: 1. X-MCP-Email/Password headers, 2. Authorization Bearer token
90
+ */
91
+ async function getAccountability(req) {
92
+ // Priority 1: X-MCP-Email and X-MCP-Password headers (email/password auth)
93
+ // Check this first since token header might be empty when using email/password
94
+ const headerEmail = req.headers["x-mcp-email"];
95
+ const headerPassword = req.headers["x-mcp-password"];
96
+ if (headerEmail && headerPassword) {
97
+ const result = await performLogin(headerEmail, headerPassword, `header:${headerEmail}`);
98
+ if (result) {
99
+ return { accountability: { ...result, ip: req.ip || "127.0.0.1" } };
100
+ }
101
+ return {
102
+ accountability: null,
103
+ error: "Invalid email or password.",
104
+ };
105
+ }
106
+ // Priority 2: Authorization Bearer token (direct token auth)
107
+ const authHeader = req.headers["authorization"];
108
+ if (authHeader?.startsWith("Bearer ")) {
109
+ const token = authHeader.substring(7).trim();
110
+ if (token) {
111
+ // Use request's accountability (populated by authMiddleware from Bearer token)
112
+ if (req.accountability?.user || req.accountability?.role) {
113
+ return {
114
+ accountability: {
115
+ user: req.accountability.user,
116
+ role: req.accountability.role,
117
+ admin: req.accountability.admin || false,
118
+ ip: req.ip || "127.0.0.1",
119
+ },
120
+ };
121
+ }
122
+ // Token provided but auth middleware didn't populate accountability
123
+ return {
124
+ accountability: null,
125
+ error: "Invalid or expired token.",
126
+ };
127
+ }
128
+ }
129
+ // No authentication - return error
130
+ return {
131
+ accountability: null,
132
+ error: "Authentication required. Provide Authorization Bearer token OR X-MCP-Email/X-MCP-Password headers.",
133
+ };
134
+ }
135
+ /**
136
+ * Get or create the MCP server instance
137
+ */
138
+ async function getMCPServer() {
139
+ await loadMCPDependencies();
140
+ if (!mcpServer) {
141
+ mcpServer = createMCPServer();
142
+ }
143
+ return mcpServer;
144
+ }
145
+ const registerEndpoint = async (app, _context) => {
146
+ // Check if MCP is enabled
147
+ if (env.get("MCP_ENABLED") !== "true") {
148
+ // Don't log when disabled - no need to inform about disabled feature
149
+ return;
150
+ }
151
+ // Load MCP dependencies only when enabled
152
+ await loadMCPDependencies();
153
+ const mcpPath = env.get("MCP_PATH") || "/mcp";
154
+ console.info(`[MCP] Registering MCP endpoint at ${mcpPath}`);
155
+ /**
156
+ * Handle MCP requests via Streamable HTTP transport
157
+ * Supports both POST (for requests) and GET (for SSE notifications)
158
+ */
159
+ app.all(mcpPath, async (req, res) => {
160
+ try {
161
+ // Authenticate first
162
+ const { accountability, error: authError } = await getAccountability(req);
163
+ if (!accountability) {
164
+ res.status(401).json({ error: authError });
165
+ return;
166
+ }
167
+ // Get or create session ID from header
168
+ let sessionId = req.headers["mcp-session-id"];
169
+ if (req.method === "POST") {
170
+ // Check if we have an existing transport for this session
171
+ let transport = sessionId ? activeTransports.get(sessionId) : undefined;
172
+ if (!transport) {
173
+ // Create new session and transport for stateful mode
174
+ sessionId = randomUUID();
175
+ // Capture accountability for closure
176
+ const sessionAccountability = accountability;
177
+ transport = new StreamableHTTPServerTransport({
178
+ sessionIdGenerator: () => sessionId,
179
+ onsessioninitialized: (sid) => {
180
+ console.info(`[MCP] Session initialized: ${sid} (user: ${sessionAccountability.user}, role: ${sessionAccountability.role})`);
181
+ setMCPSession(sid, sessionAccountability);
182
+ },
183
+ onsessionclosed: (sid) => {
184
+ console.info(`[MCP] Session closed: ${sid}`);
185
+ activeTransports.delete(sid);
186
+ removeMCPSession(sid);
187
+ },
188
+ });
189
+ // Store the transport for this session
190
+ activeTransports.set(sessionId, transport);
191
+ // Connect MCP server to this transport
192
+ const server = await getMCPServer();
193
+ await server.connect(transport);
194
+ }
195
+ // Handle the request
196
+ await transport.handleRequest(req, res, req.body);
197
+ }
198
+ else if (req.method === "GET") {
199
+ // GET requests are for SSE streams (server-initiated notifications)
200
+ if (!sessionId) {
201
+ res.status(400).json({
202
+ error: "Missing mcp-session-id header for SSE connection",
203
+ });
204
+ return;
205
+ }
206
+ const transport = activeTransports.get(sessionId);
207
+ if (!transport) {
208
+ res.status(404).json({
209
+ error: "Session not found. Initialize with POST first.",
210
+ });
211
+ return;
212
+ }
213
+ // Handle SSE connection for server-initiated messages
214
+ await transport.handleRequest(req, res);
215
+ }
216
+ else if (req.method === "DELETE") {
217
+ // DELETE to close a session
218
+ if (sessionId && activeTransports.has(sessionId)) {
219
+ const transport = activeTransports.get(sessionId);
220
+ if (transport) {
221
+ await transport.close();
222
+ }
223
+ activeTransports.delete(sessionId);
224
+ removeMCPSession(sessionId);
225
+ res.status(200).json({ message: "Session closed" });
226
+ }
227
+ else {
228
+ res.status(404).json({ error: "Session not found" });
229
+ }
230
+ }
231
+ else if (req.method === "OPTIONS") {
232
+ // Handle CORS preflight
233
+ res.status(204).end();
234
+ }
235
+ else {
236
+ res.status(405).json({
237
+ error: "Method not allowed. Use POST for requests, GET for SSE, DELETE to close session.",
238
+ });
239
+ }
240
+ }
241
+ catch (error) {
242
+ const err = error;
243
+ console.error("[MCP] Error handling request:", err);
244
+ if (!res.headersSent) {
245
+ res.status(500).json({
246
+ error: "Internal server error",
247
+ message: err.message,
248
+ });
249
+ }
250
+ }
251
+ });
252
+ /**
253
+ * Stateless MCP endpoint (no session management)
254
+ * Useful for simple request/response interactions
255
+ */
256
+ app.post(`${mcpPath}/stateless`, async (req, res) => {
257
+ try {
258
+ // Authenticate first
259
+ const { accountability, error: authError } = await getAccountability(req);
260
+ if (!accountability) {
261
+ res.status(401).json({ error: authError });
262
+ return;
263
+ }
264
+ // Create a one-time transport for this request
265
+ const transport = new StreamableHTTPServerTransport({
266
+ sessionIdGenerator: undefined, // Stateless mode
267
+ });
268
+ // Create a fresh server instance for stateless requests
269
+ const server = createMCPServer();
270
+ // Use a temporary session ID for this request
271
+ const tempSessionId = randomUUID();
272
+ setMCPSession(tempSessionId, accountability);
273
+ await server.connect(transport);
274
+ await transport.handleRequest(req, res, req.body);
275
+ // Cleanup
276
+ removeMCPSession(tempSessionId);
277
+ await server.close();
278
+ }
279
+ catch (error) {
280
+ const err = error;
281
+ console.error("[MCP] Error handling stateless request:", err);
282
+ if (!res.headersSent) {
283
+ res.status(500).json({
284
+ error: "Internal server error",
285
+ message: err.message,
286
+ });
287
+ }
288
+ }
289
+ });
290
+ /**
291
+ * MCP info endpoint - provides server capabilities
292
+ */
293
+ app.get(`${mcpPath}/info`, (_req, res) => {
294
+ res.json({
295
+ name: "baasix-mcp-server",
296
+ version: "0.1.0",
297
+ description: "Baasix MCP Server - Direct API access via Model Context Protocol",
298
+ transport: "streamable-http",
299
+ endpoints: {
300
+ main: mcpPath,
301
+ stateless: `${mcpPath}/stateless`,
302
+ info: `${mcpPath}/info`,
303
+ },
304
+ capabilities: {
305
+ tools: true,
306
+ resources: false,
307
+ prompts: false,
308
+ },
309
+ activeSessions: activeTransports.size,
310
+ });
311
+ });
312
+ console.info(`[MCP] MCP endpoint registered successfully`);
313
+ };
314
+ export default {
315
+ id: "mcp",
316
+ handler: registerEndpoint,
317
+ };
318
+ //# sourceMappingURL=mcp.route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.route.js","sourceRoot":"","sources":["../../baasix/routes/mcp.route.ts"],"names":[],"mappings":"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"}
@@ -287,7 +287,7 @@ async function generateOpenApiSpec(baseUrl) {
287
287
  openapi: "3.0.3",
288
288
  info: {
289
289
  title: "Baasix API",
290
- description: "Backend as a Service API with dynamic collections and system endpoints",
290
+ description: "BAASIX API with dynamic collections and system endpoints",
291
291
  version: "1.0.0",
292
292
  contact: {
293
293
  name: "Baasix API Support"