@enfyra/mcp-server 0.1.61 → 0.1.63

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.
@@ -94,9 +94,23 @@ export function rejectUnsafeScriptPayload(tableName, payload) {
94
94
  export function validatePortableScriptSource(sourceCode) {
95
95
  if (typeof sourceCode !== 'string')
96
96
  return;
97
+ validateLogsContract(sourceCode);
98
+ validateSocketContract(sourceCode);
97
99
  validateAwaitedRepositoryCalls(sourceCode);
98
100
  validateNumericThrowDetails(sourceCode);
99
101
  }
102
+ function validateSocketContract(sourceCode) {
103
+ const unsupportedEmit = /(?:@SOCKET|\$ctx\.\$socket)\s*\.\s*emit\s*\(/u.exec(sourceCode);
104
+ if (!unsupportedEmit)
105
+ return;
106
+ throw new Error('@SOCKET has no generic emit() method. In websocket event/connection scripts use reply, emitToCurrentRoom, or broadcastToRoom; from global HTTP/flow contexts use emitToGateway, emitToRoom, emitToUser, or broadcast.');
107
+ }
108
+ function validateLogsContract(sourceCode) {
109
+ const methodCall = /@LOGS\s*\.\s*(?:info|warn|error|debug|log)\s*\(/u.exec(sourceCode);
110
+ if (!methodCall)
111
+ return;
112
+ throw new Error('@LOGS is callable, not a console/logger object. Use @LOGS(message, details?) such as @LOGS("Approval requested", { requestId }); do not use @LOGS.info/@LOGS.warn/@LOGS.error/@LOGS.debug.');
113
+ }
100
114
  function validateAwaitedRepositoryCalls(sourceCode) {
101
115
  const repoCallPattern = /(?:#secure\.[A-Za-z_][A-Za-z0-9_]*|#[A-Za-z_][A-Za-z0-9_]*|@REPOS\.secure\.[A-Za-z_][A-Za-z0-9_]*|@REPOS\.(?!secure\b)[A-Za-z_][A-Za-z0-9_]*)\s*\.\s*(find|create|update|delete|exists)\s*\(/g;
102
116
  let match;
@@ -1 +1 @@
1
- {"version":3,"file":"mutation-guards.js","sourceRoot":"","sources":["../../src/lib/mutation-guards.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mutation-guards.js","sourceRoot":"","sources":["../../src/lib/mutation-guards.ts"],"names":[],"mappings":"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"}
@@ -163,5 +163,6 @@ export declare function applyExtensionCodePatches(code: any, patches: any): {
163
163
  }[];
164
164
  results: any[];
165
165
  };
166
+ export declare function assertFixedFlowStepConfigIsStatic(type: any, config: any, index?: number): void;
166
167
  export declare function registerPlatformOperationTools(server: any, ENFYRA_API_URL: any): void;
167
168
  export {};
@@ -1,7 +1,8 @@
1
1
  import { z } from 'zod';
2
2
  import { createHash } from 'node:crypto';
3
3
  import { fetchAPI } from './fetch.js';
4
- import { fetchTableCatalog, fetchTableMetadataByRef, resolveTableCatalogEntry } from './metadata-client.js';
4
+ import { fetchTableCatalog, fetchTableMetadata, fetchTableMetadataByRef, resolveTableCatalogEntry } from './metadata-client.js';
5
+ import { assertCustomEndpointRoute, assertDynamicEndpointContract, extractExplicitRepositoryTableNames, reviewDynamicEndpointContract, } from './dynamic-endpoint-contract.js';
5
6
  import { validatePortableScriptSource, validateScriptSourceIfPresent } from './mutation-guards.js';
6
7
  import { assertDynamicCodeKnowledgeAck, assertDynamicCodeKnowledgeAckIf, assertExtensionKnowledgeAck, assertGlobalRulesAck, dynamicCodeKnowledgeAckParam, extensionKnowledgeAckParam, globalRulesAckParam, } from './required-knowledge.js';
7
8
  const AUTO_INJECTED_EXTENSION_COMPONENT_TAGS = [
@@ -2236,20 +2237,20 @@ const FLOW_STEP_TOOL_GUIDANCE = [
2236
2237
  {
2237
2238
  tool: 'ensure_create_flow_step',
2238
2239
  type: 'create',
2239
- when: 'Create one record in one table from static config or previous flow values.',
2240
+ when: 'Create one record from static config only. Fixed step config is not template-transformed; use a script step when data comes from @FLOW_PAYLOAD, @FLOW_LAST, or @FLOW.',
2240
2241
  config: { table: 'table_name', data: { field: 'value' } },
2241
2242
  },
2242
2243
  {
2243
2244
  tool: 'ensure_update_flow_step',
2244
2245
  type: 'update',
2245
- when: 'Update one known record by id.',
2246
- config: { table: 'table_name', id: '@FLOW_PAYLOAD.id', data: { field: 'value' } },
2246
+ when: 'Update one statically known record. Use a script step when id or data comes from runtime flow values.',
2247
+ config: { table: 'table_name', id: '<static-id>', data: { field: 'value' } },
2247
2248
  },
2248
2249
  {
2249
2250
  tool: 'ensure_delete_flow_step',
2250
2251
  type: 'delete',
2251
- when: 'Delete one known record by id.',
2252
- config: { table: 'table_name', id: '@FLOW_PAYLOAD.id' },
2252
+ when: 'Delete one statically known record. Use a script step when id comes from runtime flow values.',
2253
+ config: { table: 'table_name', id: '<static-id>' },
2253
2254
  },
2254
2255
  {
2255
2256
  tool: 'ensure_http_flow_step',
@@ -2311,6 +2312,36 @@ function chooseFlowStepTool(intent) {
2311
2312
  return FLOW_STEP_TOOL_GUIDANCE.find((item) => item.type === 'query');
2312
2313
  return FLOW_STEP_TOOL_GUIDANCE.find((item) => item.type === 'script');
2313
2314
  }
2315
+ const FIXED_FLOW_STEP_TYPES = new Set(['query', 'create', 'update', 'delete', 'http', 'sleep', 'trigger_flow', 'log']);
2316
+ const FLOW_RUNTIME_MACRO_PATTERN = /@FLOW(?:_PAYLOAD|_LAST|_META)?\b/u;
2317
+ function findFlowRuntimeMacro(value) {
2318
+ if (typeof value === 'string')
2319
+ return FLOW_RUNTIME_MACRO_PATTERN.exec(value)?.[0] || null;
2320
+ if (Array.isArray(value)) {
2321
+ for (const item of value) {
2322
+ const match = findFlowRuntimeMacro(item);
2323
+ if (match)
2324
+ return match;
2325
+ }
2326
+ return null;
2327
+ }
2328
+ if (!value || typeof value !== 'object')
2329
+ return null;
2330
+ for (const item of Object.values(value)) {
2331
+ const match = findFlowRuntimeMacro(item);
2332
+ if (match)
2333
+ return match;
2334
+ }
2335
+ return null;
2336
+ }
2337
+ export function assertFixedFlowStepConfigIsStatic(type, config, index = 0) {
2338
+ if (!FIXED_FLOW_STEP_TYPES.has(String(type)))
2339
+ return;
2340
+ const macro = findFlowRuntimeMacro(config);
2341
+ if (!macro)
2342
+ return;
2343
+ throw new Error(`steps[${index}] uses ${macro} inside a ${type} config, but ESV fixed flow step configs are static and are not template-transformed. Use a script step for runtime payload/previous-step values, keep one business operation in that script, and call @LOGS(message, details?) for captured logs.`);
2344
+ }
2314
2345
  function planFlowSteps(steps) {
2315
2346
  const items = Array.isArray(steps) ? steps : [];
2316
2347
  return items.map((step, index) => {
@@ -2350,7 +2381,7 @@ function normalizeFlowWorkflowStep(step, index) {
2350
2381
  .replace(/[^a-z0-9]+/g, '_')
2351
2382
  .replace(/^_+|_+$/g, '')
2352
2383
  .slice(0, 64) || `step_${index + 1}`;
2353
- return {
2384
+ const normalized = {
2354
2385
  index,
2355
2386
  key,
2356
2387
  name: input.name || intent,
@@ -2365,6 +2396,8 @@ function normalizeFlowWorkflowStep(step, index) {
2365
2396
  chosenByIntent: !input.type,
2366
2397
  recommendedTool: guidance.tool,
2367
2398
  };
2399
+ assertFixedFlowStepConfigIsStatic(type, normalized.config, index);
2400
+ return normalized;
2368
2401
  }
2369
2402
  async function runFlowWorkflow(apiUrl, opts) {
2370
2403
  const steps = parseJsonArrayArg('steps', opts.steps, []);
@@ -2392,7 +2425,7 @@ async function runFlowWorkflow(apiUrl, opts) {
2392
2425
  plan,
2393
2426
  requiredAckParams: ['globalRulesAckKey', ...(hasDynamicCode ? ['knowledgeAckKey'] : [])],
2394
2427
  nextSteps: [
2395
- 'Review the plan. Prefer fixed step types; script is only for logic not covered by query/create/update/delete/http/sleep/trigger/log/condition.',
2428
+ 'Review the plan. Prefer fixed step types only for static config; ESV does not interpolate @FLOW_PAYLOAD/@FLOW_LAST/@FLOW inside fixed-step config. Use one focused script step when runtime values are required.',
2396
2429
  'Call flow_workflow again with apply=true and the required ack params to create/update the flow and steps sequentially.',
2397
2430
  'Use test_flow_step for script, condition, or high-risk steps before triggering the flow.',
2398
2431
  ],
@@ -2447,6 +2480,29 @@ function normalizeEndpointAccess(anonymousAccess, makePublic) {
2447
2480
  return makePublic ? 'public' : 'private';
2448
2481
  return anonymousAccess || 'private';
2449
2482
  }
2483
+ async function reviewCustomEndpointSource(apiUrl, method, sourceCode) {
2484
+ const repositoryTables = extractExplicitRepositoryTableNames(sourceCode);
2485
+ const selectedTables = repositoryTables.slice(0, 5);
2486
+ const results = await Promise.allSettled(selectedTables.map(async (tableName) => [tableName, await fetchTableMetadata(apiUrl, tableName)]));
2487
+ const tableMetadata = {};
2488
+ const metadataUnavailable = [];
2489
+ for (const [index, result] of results.entries()) {
2490
+ if (result.status === 'fulfilled') {
2491
+ tableMetadata[result.value[0]] = result.value[1];
2492
+ }
2493
+ else {
2494
+ metadataUnavailable.push(selectedTables[index]);
2495
+ }
2496
+ }
2497
+ return reviewDynamicEndpointContract({
2498
+ routeKind: 'custom',
2499
+ method,
2500
+ sourceCode,
2501
+ tableMetadata,
2502
+ metadataUnavailable,
2503
+ metadataTruncated: repositoryTables.length > selectedTables.length,
2504
+ });
2505
+ }
2450
2506
  function sourceMatches(existingHandler, sourceCode, scriptLanguage, timeout) {
2451
2507
  if (!existingHandler)
2452
2508
  return false;
@@ -2484,18 +2540,25 @@ async function resolveApiEndpointWorkflowState(apiUrl, opts) {
2484
2540
  const normalizedPath = normalizeRestPath(opts.path);
2485
2541
  const methodName = normalizeMethodName(opts.method);
2486
2542
  const access = normalizeEndpointAccess(opts.anonymousAccess, opts.public);
2543
+ assertDynamicEndpointContract(reviewDynamicEndpointContract({
2544
+ routeKind: 'custom',
2545
+ method: methodName,
2546
+ sourceCode: opts.sourceCode,
2547
+ }));
2487
2548
  const { methodMap, methodIdNameMap } = await getMethodContext(apiUrl);
2488
2549
  const methodId = methodMap[methodName];
2489
2550
  if (!methodId)
2490
2551
  throw new Error(`Unknown method "${methodName}". Valid methods: ${Object.keys(methodMap).sort().join(', ')}`);
2491
- const [routes, scriptValidation] = await Promise.all([
2552
+ const [routes, scriptValidation, contractReview] = await Promise.all([
2492
2553
  fetchAll(apiUrl, '/enfyra_route?limit=1000&fields=id,_id,path,isEnabled,description,availableMethods.*,publicMethods.*,mainTable.name'),
2493
2554
  validateScriptSourceIfPresent(fetchAPI, apiUrl, 'enfyra_route_handler', {
2494
2555
  sourceCode: opts.sourceCode,
2495
2556
  scriptLanguage: opts.scriptLanguage || 'javascript',
2496
2557
  }),
2558
+ reviewCustomEndpointSource(apiUrl, methodName, opts.sourceCode),
2497
2559
  ]);
2498
2560
  const route = routes.find((item) => item.path === normalizedPath) || null;
2561
+ assertCustomEndpointRoute(route);
2499
2562
  const routeId = getId(route);
2500
2563
  const availableMethods = methodNamesFromRecords(route?.availableMethods || [], methodIdNameMap);
2501
2564
  const publicMethods = methodNamesFromRecords(route?.publicMethods || [], methodIdNameMap);
@@ -2615,6 +2678,7 @@ async function resolveApiEndpointWorkflowState(apiUrl, opts) {
2615
2678
  handler,
2616
2679
  role,
2617
2680
  scriptValidation,
2681
+ contractReview,
2618
2682
  steps,
2619
2683
  firstRunnable,
2620
2684
  blocked,
@@ -2771,6 +2835,7 @@ async function runApiEndpointWorkflow(apiUrl, opts) {
2771
2835
  action: operations.length ? 'api_endpoint_workflow_advanced' : 'api_endpoint_workflow_planned',
2772
2836
  endpoint: latestState.endpoint,
2773
2837
  scriptValidation: latestState.scriptValidation,
2838
+ contractReview: latestState.contractReview,
2774
2839
  steps: latestSteps,
2775
2840
  operations,
2776
2841
  complete: latestSteps.every((item) => ['completed', 'skipped'].includes(item.status)),
@@ -3486,12 +3551,12 @@ export function registerPlatformOperationTools(server, ENFYRA_API_URL) {
3486
3551
  server.tool('api_endpoint_workflow', [
3487
3552
  'Step-by-step workflow for creating or updating a custom REST endpoint.',
3488
3553
  'Use this when an LLM is building or changing endpoint behavior and should follow live nextSteps instead of guessing raw metadata mutations.',
3489
- 'With apply=false it validates sourceCode, reads live route/handler/access state, and returns pending steps.',
3554
+ 'With apply=false it validates sourceCode, blocks canonical-route collisions, reviews explicit repository metadata/security boundaries, reads live route/handler/access state, and returns pending steps.',
3490
3555
  'With apply=true it applies only the next pending step, then returns a fresh plan. With applyAll=true it advances all currently safe pending steps.',
3491
3556
  ].join(' '), {
3492
3557
  path: z.string().describe('Custom route path, e.g. /sum. Must not be a full URL.'),
3493
3558
  method: z.string().describe('HTTP method for the handler, e.g. GET or POST.'),
3494
- sourceCode: z.string().describe('Handler sourceCode. Use macros such as @QUERY, @BODY, @THROW400, @REPOS, and @USER. Repository calls are async and reads return result.data. Use @REPOS.main or #secure.table_name/@REPOS.secure.table_name for user-facing access; reserve trusted repos for intentional field-permission bypass. Do not send compiledCode.'),
3559
+ sourceCode: z.string().describe('Handler sourceCode for a custom route, which has no main table. Use #secure.table_name or @REPOS.secure.table_name for user-facing explicit-table access. Repository calls are async and reads return result.data. Passing @BODY as create/update data is valid TypeORM-style usage; enforce endpoint-specific owner/tenant/business rules in code. Reserve trusted repos for intentional field-permission bypass. Do not send compiledCode.'),
3495
3560
  scriptLanguage: z.enum(['javascript', 'typescript']).optional().default('javascript').describe('Script language.'),
3496
3561
  anonymousAccess: z.enum(['public', 'private']).optional().default('private').describe('public adds the method to publicMethods; private removes this method from publicMethods.'),
3497
3562
  public: z.boolean().optional().describe('Compatibility alias for anonymousAccess. true means public, false means private.'),
@@ -3520,7 +3585,7 @@ export function registerPlatformOperationTools(server, ENFYRA_API_URL) {
3520
3585
  ].join(' '), {
3521
3586
  path: z.string().describe('Custom route path, e.g. /sum. Must not be a full URL.'),
3522
3587
  method: z.string().describe('HTTP method for the handler, e.g. GET or POST.'),
3523
- sourceCode: z.string().describe('Handler sourceCode. Use macros such as @QUERY, @BODY, @THROW400, @REPOS, and @USER. Repository calls are async and reads return result.data. Use @REPOS.main or #secure.table_name/@REPOS.secure.table_name for user-facing access; reserve trusted repos for intentional field-permission bypass. Do not send compiledCode.'),
3588
+ sourceCode: z.string().describe('Handler sourceCode for a custom route, which has no main table. Use #secure.table_name or @REPOS.secure.table_name for user-facing explicit-table access. Repository calls are async and reads return result.data. Passing @BODY as create/update data is valid TypeORM-style usage; enforce endpoint-specific owner/tenant/business rules in code. Reserve trusted repos for intentional field-permission bypass. Do not send compiledCode.'),
3524
3589
  scriptLanguage: z.enum(['javascript', 'typescript']).optional().default('javascript').describe('Script language.'),
3525
3590
  public: z.boolean().optional().default(false).describe('When true, the method is added to publicMethods for anonymous access.'),
3526
3591
  description: z.string().optional().describe('Route description.'),
@@ -3535,12 +3600,25 @@ export function registerPlatformOperationTools(server, ENFYRA_API_URL) {
3535
3600
  assertDynamicCodeKnowledgeAck(knowledgeAckKey);
3536
3601
  const normalizedPath = normalizeRestPath(path);
3537
3602
  const methodName = normalizeMethodName(method);
3538
- const { methodMap, methodIdNameMap } = await getMethodContext(ENFYRA_API_URL);
3603
+ assertDynamicEndpointContract(reviewDynamicEndpointContract({
3604
+ routeKind: 'custom',
3605
+ method: methodName,
3606
+ sourceCode,
3607
+ }));
3608
+ const [{ methodMap, methodIdNameMap }, routes, scriptValidation, contractReview] = await Promise.all([
3609
+ getMethodContext(ENFYRA_API_URL),
3610
+ fetchAll(ENFYRA_API_URL, '/enfyra_route?limit=1000&fields=id,_id,path,isEnabled,availableMethods.*,publicMethods.*,mainTable.name'),
3611
+ validateScriptSourceIfPresent(fetchAPI, ENFYRA_API_URL, 'enfyra_route_handler', {
3612
+ sourceCode,
3613
+ scriptLanguage,
3614
+ }),
3615
+ reviewCustomEndpointSource(ENFYRA_API_URL, methodName, sourceCode),
3616
+ ]);
3539
3617
  const methodId = methodMap[methodName];
3540
3618
  if (!methodId)
3541
3619
  throw new Error(`Unknown method "${methodName}". Valid methods: ${Object.keys(methodMap).sort().join(', ')}`);
3542
- const routes = await fetchAll(ENFYRA_API_URL, '/enfyra_route?limit=1000&fields=id,_id,path,isEnabled,availableMethods.*,publicMethods.*,mainTable.name');
3543
3620
  let route = routes.find((item) => item.path === normalizedPath);
3621
+ assertCustomEndpointRoute(route);
3544
3622
  let routeAction = 'existing';
3545
3623
  if (!route) {
3546
3624
  const createRouteResult = await fetchAPI(ENFYRA_API_URL, '/enfyra_route', {
@@ -3573,10 +3651,6 @@ export function registerPlatformOperationTools(server, ENFYRA_API_URL) {
3573
3651
  routeAction = 'updated';
3574
3652
  }
3575
3653
  const routeId = getId(route);
3576
- const scriptValidation = await validateScriptSourceIfPresent(fetchAPI, ENFYRA_API_URL, 'enfyra_route_handler', {
3577
- sourceCode,
3578
- scriptLanguage,
3579
- });
3580
3654
  const existingHandler = await findHandler(ENFYRA_API_URL, routeId, methodId);
3581
3655
  let handlerResult;
3582
3656
  let handlerAction;
@@ -3642,6 +3716,7 @@ export function registerPlatformOperationTools(server, ENFYRA_API_URL) {
3642
3716
  routeAction,
3643
3717
  handlerAction,
3644
3718
  scriptValidation,
3719
+ contractReview,
3645
3720
  routeReload,
3646
3721
  smokeTest,
3647
3722
  usage: {
@@ -3960,6 +4035,7 @@ export function registerPlatformOperationTools(server, ENFYRA_API_URL) {
3960
4035
  'Workflow front door for creating or updating an Enfyra flow and its steps in one guided path.',
3961
4036
  'For a fully specified, non-destructive flow, use apply=true to create/update the flow and all steps sequentially in one call. Use apply=false only when step types or risk need review.',
3962
4037
  'Prefer this over choosing individual ensure_*_flow_step tools in guided mode.',
4038
+ 'Fixed query/create/update/delete/http/sleep/trigger/log config is static in current ESV and does not interpolate @FLOW_PAYLOAD/@FLOW_LAST/@FLOW; use a focused script step for runtime values.',
3963
4039
  ].join(' '), {
3964
4040
  name: z.string().describe('Flow name. Existing flow with this name is updated.'),
3965
4041
  triggerType: z.enum(['manual', 'schedule']).optional().default('manual').describe('manual for API/admin/hook/child flow usage, schedule for cron/time-based flows.'),
@@ -3971,7 +4047,7 @@ export function registerPlatformOperationTools(server, ENFYRA_API_URL) {
3971
4047
  name: z.string().optional().describe('Human label. Defaults from intent.'),
3972
4048
  intent: z.string().optional().describe('Plain-language step intent. Used to choose a fixed step type when type is omitted.'),
3973
4049
  type: z.enum(['query', 'create', 'update', 'delete', 'http', 'condition', 'sleep', 'trigger_flow', 'log', 'script']).optional().describe('Explicit step type. Omit to let the workflow choose from intent.'),
3974
- config: z.union([z.record(z.any()), z.string()]).optional().describe('Step config object or JSON string. For query/create/update/delete/http/sleep/trigger/log steps, prefer config over sourceCode.'),
4050
+ config: z.union([z.record(z.any()), z.string()]).optional().describe('Step config object or JSON string. Fixed-step config is static and cannot contain @FLOW_PAYLOAD/@FLOW_LAST/@FLOW. Use a focused script step for runtime values.'),
3975
4051
  sourceCode: z.string().optional().describe('Only for script or condition steps. Use fixed step types when possible.'),
3976
4052
  scriptLanguage: z.enum(['javascript', 'typescript']).optional().default('javascript'),
3977
4053
  order: z.number().optional().describe('Step order. Defaults to index * 10.'),