@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.
- package/README.md +51 -16
- package/dist/README.md +51 -16
- package/dist/app/404/index.html +1 -1
- package/dist/app/404.html +1 -1
- package/dist/app/_next/static/chunks/{3817-e20c8f0a0810fc95.js → 3817-5170706432487eeb.js} +1 -1
- package/dist/app/_next/static/chunks/{9599-a7e572bb88c3392b.js → 9599-c979a80a3f8557a2.js} +1 -1
- package/dist/app/_next/static/chunks/app/(authenticated)/settings/schema/page-12bec5e776a0974d.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/workflows/page-5c2330ee5dc13ab1.js +1 -0
- package/dist/app/_next/static/chunks/{webpack-97b8127545c29856.js → webpack-c0a542d3562cc14f.js} +1 -1
- package/dist/app/activity-log/all-activity/index.html +1 -1
- package/dist/app/activity-log/all-activity/index.txt +2 -2
- package/dist/app/activity-log/email-log/index.html +1 -1
- package/dist/app/activity-log/email-log/index.txt +2 -2
- package/dist/app/activity-log/index.html +1 -1
- package/dist/app/activity-log/index.txt +1 -1
- package/dist/app/activity-log/notifications/index.html +1 -1
- package/dist/app/activity-log/notifications/index.txt +1 -1
- package/dist/app/activity-log/sessions/index.html +1 -1
- package/dist/app/activity-log/sessions/index.txt +1 -1
- package/dist/app/activity-log/workflow-executions/index.html +1 -1
- package/dist/app/activity-log/workflow-executions/index.txt +1 -1
- package/dist/app/activity-log/workflow-logs/index.html +1 -1
- package/dist/app/activity-log/workflow-logs/index.txt +1 -1
- package/dist/app/change-password/index.html +1 -1
- package/dist/app/change-password/index.txt +1 -1
- package/dist/app/dashboard/index.html +1 -1
- package/dist/app/dashboard/index.txt +1 -1
- package/dist/app/data-browser/index.html +1 -1
- package/dist/app/data-browser/index.txt +1 -1
- package/dist/app/file-manager/index.html +1 -1
- package/dist/app/file-manager/index.txt +2 -2
- package/dist/app/forgot-password/index.html +1 -1
- package/dist/app/forgot-password/index.txt +1 -1
- package/dist/app/index.html +1 -1
- package/dist/app/index.txt +1 -1
- package/dist/app/login/index.html +1 -1
- package/dist/app/login/index.txt +1 -1
- package/dist/app/register/index.html +1 -1
- package/dist/app/register/index.txt +1 -1
- package/dist/app/settings/migrations/index.html +1 -1
- package/dist/app/settings/migrations/index.txt +1 -1
- package/dist/app/settings/permissions/index.html +1 -1
- package/dist/app/settings/permissions/index.txt +2 -2
- package/dist/app/settings/project/index.html +1 -1
- package/dist/app/settings/project/index.txt +2 -2
- package/dist/app/settings/roles/index.html +1 -1
- package/dist/app/settings/roles/index.txt +2 -2
- package/dist/app/settings/schema/index.html +1 -1
- package/dist/app/settings/schema/index.txt +2 -2
- package/dist/app/settings/tasks/index.html +1 -1
- package/dist/app/settings/tasks/index.txt +1 -1
- package/dist/app/settings/templates/edit/index.html +1 -1
- package/dist/app/settings/templates/edit/index.txt +1 -1
- package/dist/app/settings/templates/index.html +1 -1
- package/dist/app/settings/templates/index.txt +2 -2
- package/dist/app/settings/tenants/index.html +1 -1
- package/dist/app/settings/tenants/index.txt +2 -2
- package/dist/app/users/index.html +1 -1
- package/dist/app/users/index.txt +2 -2
- package/dist/app/users/invites/index.html +1 -1
- package/dist/app/users/invites/index.txt +1 -1
- package/dist/app/users/list/index.html +1 -1
- package/dist/app/users/list/index.txt +2 -2
- package/dist/app/users/preferences/index.html +1 -1
- package/dist/app/users/preferences/index.txt +1 -1
- package/dist/app/users/user-roles/index.html +1 -1
- package/dist/app/users/user-roles/index.txt +1 -1
- package/dist/app/workflows/detail/index.html +1 -1
- package/dist/app/workflows/detail/index.txt +1 -1
- package/dist/app/workflows/edit/index.html +1 -1
- package/dist/app/workflows/edit/index.txt +1 -1
- package/dist/app/workflows/execution/index.html +1 -1
- package/dist/app/workflows/execution/index.txt +1 -1
- package/dist/app/workflows/index.html +1 -1
- package/dist/app/workflows/index.txt +2 -2
- package/dist/routes/mcp.route.d.ts +23 -0
- package/dist/routes/mcp.route.d.ts.map +1 -0
- package/dist/routes/mcp.route.js +318 -0
- package/dist/routes/mcp.route.js.map +1 -0
- package/dist/routes/openapi.route.js +1 -1
- package/dist/routes/openapi.route.js.map +1 -1
- package/dist/routes/schema.route.d.ts.map +1 -1
- package/dist/routes/schema.route.js +10 -6
- package/dist/routes/schema.route.js.map +1 -1
- package/dist/services/MCPService.d.ts +39 -0
- package/dist/services/MCPService.d.ts.map +1 -0
- package/dist/services/MCPService.js +1413 -0
- package/dist/services/MCPService.js.map +1 -0
- package/dist/utils/auth.d.ts.map +1 -1
- package/dist/utils/auth.js +27 -5
- package/dist/utils/auth.js.map +1 -1
- package/dist/utils/schemaManager.d.ts.map +1 -1
- package/dist/utils/schemaManager.js +36 -0
- package/dist/utils/schemaManager.js.map +1 -1
- package/package.json +2 -1
- package/dist/app/_next/static/chunks/app/(authenticated)/settings/schema/page-899574f35091dd58.js +0 -1
- package/dist/app/_next/static/chunks/app/(authenticated)/workflows/page-1a7a4305ef892fa8.js +0 -1
- /package/dist/app/_next/static/{IrfWLqQW-v_VRpZ550bv5 → ZFTLSdIpaRn3r1OwNmuIZ}/_buildManifest.js +0 -0
- /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: "
|
|
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"
|