mcp4openapi 0.3.1 → 0.3.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 (160) hide show
  1. package/README.md +7 -0
  2. package/dist/src/auth/oauth-provider.d.ts +1 -0
  3. package/dist/src/auth/oauth-provider.d.ts.map +1 -1
  4. package/dist/src/auth/oauth-provider.js +17 -0
  5. package/dist/src/auth/oauth-provider.js.map +1 -1
  6. package/dist/src/core/cli-config.d.ts.map +1 -1
  7. package/dist/src/core/cli-config.js +2 -0
  8. package/dist/src/core/cli-config.js.map +1 -1
  9. package/dist/src/core/index.d.ts.map +1 -1
  10. package/dist/src/core/index.js +18 -3
  11. package/dist/src/core/index.js.map +1 -1
  12. package/dist/src/index.js +0 -0
  13. package/dist/src/profile/profile-allowlist.d.ts +18 -0
  14. package/dist/src/profile/profile-allowlist.d.ts.map +1 -0
  15. package/dist/src/profile/profile-allowlist.js +68 -0
  16. package/dist/src/profile/profile-allowlist.js.map +1 -0
  17. package/dist/src/profile/profile-registry.d.ts +5 -0
  18. package/dist/src/profile/profile-registry.d.ts.map +1 -1
  19. package/dist/src/profile/profile-registry.js +38 -14
  20. package/dist/src/profile/profile-registry.js.map +1 -1
  21. package/dist/src/security/ssrf-validator.d.ts +31 -0
  22. package/dist/src/security/ssrf-validator.d.ts.map +1 -0
  23. package/dist/src/security/ssrf-validator.js +190 -0
  24. package/dist/src/security/ssrf-validator.js.map +1 -0
  25. package/package.json +2 -2
  26. package/profiles/gitlab/developer-profile-oauth.json +445 -81
  27. package/profiles/gitlab/developer-profile-oauth.test.json +1037 -12
  28. package/profiles/gitlab/openapi.yaml +1420 -165
  29. package/profiles/gitlab/profile-optimized-oauth.json +928 -0
  30. package/profiles/gitlab/profile-optimized-oauth.test.json +1606 -0
  31. package/profiles/grafana/openapi.json +28078 -0
  32. package/profiles/grafana/profile.json +1083 -0
  33. package/profiles/grafana/profile.test.json +235 -0
  34. package/profiles/mattermost/openapi.yaml +27434 -0
  35. package/profiles/mattermost/profile.json +463 -0
  36. package/profiles/mattermost/profile.test.json +607 -0
  37. package/profiles/n8n/profile-optimized.json +1002 -364
  38. package/profiles/n8n/profile-optimized.test.json +43 -43
  39. package/dist/src/argument-normalizer.d.ts +0 -5
  40. package/dist/src/argument-normalizer.d.ts.map +0 -1
  41. package/dist/src/argument-normalizer.js +0 -61
  42. package/dist/src/argument-normalizer.js.map +0 -1
  43. package/dist/src/cli-config.d.ts +0 -9
  44. package/dist/src/cli-config.d.ts.map +0 -1
  45. package/dist/src/cli-config.js +0 -111
  46. package/dist/src/cli-config.js.map +0 -1
  47. package/dist/src/composite-executor.d.ts +0 -77
  48. package/dist/src/composite-executor.d.ts.map +0 -1
  49. package/dist/src/composite-executor.js +0 -193
  50. package/dist/src/composite-executor.js.map +0 -1
  51. package/dist/src/constants.d.ts +0 -85
  52. package/dist/src/constants.d.ts.map +0 -1
  53. package/dist/src/constants.js +0 -85
  54. package/dist/src/constants.js.map +0 -1
  55. package/dist/src/dag-executor.d.ts +0 -49
  56. package/dist/src/dag-executor.d.ts.map +0 -1
  57. package/dist/src/dag-executor.js +0 -138
  58. package/dist/src/dag-executor.js.map +0 -1
  59. package/dist/src/errors.d.ts +0 -59
  60. package/dist/src/errors.d.ts.map +0 -1
  61. package/dist/src/errors.js +0 -119
  62. package/dist/src/errors.js.map +0 -1
  63. package/dist/src/filtering.d.ts +0 -19
  64. package/dist/src/filtering.d.ts.map +0 -1
  65. package/dist/src/filtering.js +0 -292
  66. package/dist/src/filtering.js.map +0 -1
  67. package/dist/src/http-client-factory.d.ts +0 -62
  68. package/dist/src/http-client-factory.d.ts.map +0 -1
  69. package/dist/src/http-client-factory.js +0 -133
  70. package/dist/src/http-client-factory.js.map +0 -1
  71. package/dist/src/http-transport-config.d.ts +0 -6
  72. package/dist/src/http-transport-config.d.ts.map +0 -1
  73. package/dist/src/http-transport-config.js +0 -47
  74. package/dist/src/http-transport-config.js.map +0 -1
  75. package/dist/src/http-transport.d.ts +0 -316
  76. package/dist/src/http-transport.d.ts.map +0 -1
  77. package/dist/src/http-transport.js +0 -2412
  78. package/dist/src/http-transport.js.map +0 -1
  79. package/dist/src/interceptors.d.ts +0 -116
  80. package/dist/src/interceptors.d.ts.map +0 -1
  81. package/dist/src/interceptors.js +0 -392
  82. package/dist/src/interceptors.js.map +0 -1
  83. package/dist/src/jsonrpc-validator.d.ts +0 -27
  84. package/dist/src/jsonrpc-validator.d.ts.map +0 -1
  85. package/dist/src/jsonrpc-validator.js +0 -58
  86. package/dist/src/jsonrpc-validator.js.map +0 -1
  87. package/dist/src/logger.d.ts +0 -59
  88. package/dist/src/logger.d.ts.map +0 -1
  89. package/dist/src/logger.js +0 -177
  90. package/dist/src/logger.js.map +0 -1
  91. package/dist/src/mcp-server-manager.d.ts +0 -20
  92. package/dist/src/mcp-server-manager.d.ts.map +0 -1
  93. package/dist/src/mcp-server-manager.js +0 -38
  94. package/dist/src/mcp-server-manager.js.map +0 -1
  95. package/dist/src/mcp-server.d.ts +0 -203
  96. package/dist/src/mcp-server.d.ts.map +0 -1
  97. package/dist/src/mcp-server.js +0 -1369
  98. package/dist/src/mcp-server.js.map +0 -1
  99. package/dist/src/metrics.d.ts +0 -97
  100. package/dist/src/metrics.d.ts.map +0 -1
  101. package/dist/src/metrics.js +0 -273
  102. package/dist/src/metrics.js.map +0 -1
  103. package/dist/src/naming-warnings.d.ts +0 -23
  104. package/dist/src/naming-warnings.d.ts.map +0 -1
  105. package/dist/src/naming-warnings.js +0 -83
  106. package/dist/src/naming-warnings.js.map +0 -1
  107. package/dist/src/naming.d.ts +0 -58
  108. package/dist/src/naming.d.ts.map +0 -1
  109. package/dist/src/naming.js +0 -510
  110. package/dist/src/naming.js.map +0 -1
  111. package/dist/src/oauth-provider.d.ts +0 -131
  112. package/dist/src/oauth-provider.d.ts.map +0 -1
  113. package/dist/src/oauth-provider.js +0 -836
  114. package/dist/src/oauth-provider.js.map +0 -1
  115. package/dist/src/openapi-parser.d.ts +0 -70
  116. package/dist/src/openapi-parser.d.ts.map +0 -1
  117. package/dist/src/openapi-parser.js +0 -436
  118. package/dist/src/openapi-parser.js.map +0 -1
  119. package/dist/src/profile-loader.d.ts +0 -78
  120. package/dist/src/profile-loader.d.ts.map +0 -1
  121. package/dist/src/profile-loader.js +0 -483
  122. package/dist/src/profile-loader.js.map +0 -1
  123. package/dist/src/profile-registry.d.ts +0 -18
  124. package/dist/src/profile-registry.d.ts.map +0 -1
  125. package/dist/src/profile-registry.js +0 -26
  126. package/dist/src/profile-registry.js.map +0 -1
  127. package/dist/src/profile-resolver.d.ts +0 -19
  128. package/dist/src/profile-resolver.d.ts.map +0 -1
  129. package/dist/src/profile-resolver.js +0 -167
  130. package/dist/src/profile-resolver.js.map +0 -1
  131. package/dist/src/proxy-executor.d.ts +0 -86
  132. package/dist/src/proxy-executor.d.ts.map +0 -1
  133. package/dist/src/proxy-executor.js +0 -497
  134. package/dist/src/proxy-executor.js.map +0 -1
  135. package/dist/src/schema-validator.d.ts +0 -30
  136. package/dist/src/schema-validator.d.ts.map +0 -1
  137. package/dist/src/schema-validator.js +0 -128
  138. package/dist/src/schema-validator.js.map +0 -1
  139. package/dist/src/startup-profile.d.ts +0 -17
  140. package/dist/src/startup-profile.d.ts.map +0 -1
  141. package/dist/src/startup-profile.js +0 -30
  142. package/dist/src/startup-profile.js.map +0 -1
  143. package/dist/src/startup-validation.d.ts +0 -11
  144. package/dist/src/startup-validation.d.ts.map +0 -1
  145. package/dist/src/startup-validation.js +0 -21
  146. package/dist/src/startup-validation.js.map +0 -1
  147. package/dist/src/tool-filter.d.ts +0 -65
  148. package/dist/src/tool-filter.d.ts.map +0 -1
  149. package/dist/src/tool-filter.js +0 -471
  150. package/dist/src/tool-filter.js.map +0 -1
  151. package/dist/src/tool-generator.d.ts +0 -67
  152. package/dist/src/tool-generator.d.ts.map +0 -1
  153. package/dist/src/tool-generator.js +0 -182
  154. package/dist/src/tool-generator.js.map +0 -1
  155. package/dist/src/validation-utils.d.ts +0 -49
  156. package/dist/src/validation-utils.d.ts.map +0 -1
  157. package/dist/src/validation-utils.js +0 -138
  158. package/dist/src/validation-utils.js.map +0 -1
  159. package/profiles/gitlab/developer-profile.json +0 -1508
  160. package/profiles/gitlab/developer-profile.test.json +0 -3432
@@ -1,119 +0,0 @@
1
- /**
2
- * Structured error types for MCP server
3
- *
4
- * Provides type-safe error handling with machine-readable error codes
5
- * and structured error details for better debugging and client handling.
6
- */
7
- import { randomUUID } from 'node:crypto';
8
- export class MCPError extends Error {
9
- constructor(message, code, details) {
10
- super(message);
11
- this.code = code;
12
- this.details = details;
13
- this.name = 'MCPError';
14
- }
15
- }
16
- export class ValidationError extends MCPError {
17
- constructor(message, details) {
18
- super(message, 'VALIDATION_ERROR', details);
19
- this.name = 'ValidationError';
20
- }
21
- }
22
- export class OperationNotFoundError extends MCPError {
23
- constructor(operationId) {
24
- super(`Operation not found: ${operationId}`, 'OPERATION_NOT_FOUND', { operationId });
25
- this.name = 'OperationNotFoundError';
26
- }
27
- }
28
- export class ResourceNotFoundError extends MCPError {
29
- constructor(resource, resourceType = 'Resource') {
30
- super(`${resourceType} not found: ${resource}`, 'RESOURCE_NOT_FOUND', { resource, resourceType });
31
- this.name = 'ResourceNotFoundError';
32
- }
33
- }
34
- export class ParameterError extends MCPError {
35
- constructor(paramName, reason) {
36
- super(`Invalid parameter '${paramName}': ${reason}`, 'PARAMETER_ERROR', { paramName, reason });
37
- this.name = 'ParameterError';
38
- }
39
- }
40
- export class AuthenticationError extends MCPError {
41
- constructor(message = 'Authentication required', details) {
42
- super(message, 'AUTHENTICATION_ERROR', details);
43
- this.name = 'AuthenticationError';
44
- }
45
- }
46
- export class AuthorizationError extends MCPError {
47
- constructor(message = 'Insufficient permissions') {
48
- super(message, 'AUTHORIZATION_ERROR');
49
- this.name = 'AuthorizationError';
50
- }
51
- }
52
- export class RateLimitError extends MCPError {
53
- constructor(message, retryAfter) {
54
- super(message, 'RATE_LIMIT_EXCEEDED', retryAfter ? { retryAfter } : undefined);
55
- this.name = 'RateLimitError';
56
- }
57
- }
58
- export class NetworkError extends MCPError {
59
- constructor(message, statusCode, details) {
60
- super(message, 'NETWORK_ERROR', { statusCode, ...details });
61
- this.name = 'NetworkError';
62
- }
63
- }
64
- export class ConfigurationError extends MCPError {
65
- constructor(message, details) {
66
- super(message, 'CONFIGURATION_ERROR', details);
67
- this.name = 'ConfigurationError';
68
- }
69
- }
70
- export class SessionError extends MCPError {
71
- constructor(message, sessionId) {
72
- super(message, 'SESSION_ERROR', sessionId ? { sessionId } : undefined);
73
- this.name = 'SessionError';
74
- }
75
- }
76
- export class UnknownCliFlagError extends MCPError {
77
- constructor(flags) {
78
- const sortedFlags = [...flags].sort();
79
- super(`Unknown CLI flags: ${sortedFlags.join(', ')}`, 'UNKNOWN_CLI_FLAG', { flags: sortedFlags });
80
- this.name = 'UnknownCliFlagError';
81
- }
82
- }
83
- /**
84
- * Helper function to check if an error is an MCPError
85
- */
86
- export function isMCPError(error) {
87
- return error instanceof MCPError;
88
- }
89
- /**
90
- * Generate a unique correlation ID for error tracking
91
- *
92
- * Why: Allows matching client-reported errors with server logs
93
- */
94
- export function generateCorrelationId() {
95
- return randomUUID();
96
- }
97
- /**
98
- * Helper function to get error details for logging
99
- */
100
- export function getErrorDetails(error) {
101
- if (isMCPError(error)) {
102
- return {
103
- name: error.name,
104
- code: error.code,
105
- message: error.message,
106
- details: error.details,
107
- stack: error.stack,
108
- };
109
- }
110
- if (error instanceof Error) {
111
- return {
112
- name: error.name,
113
- message: error.message,
114
- stack: error.stack,
115
- };
116
- }
117
- return { message: String(error) };
118
- }
119
- //# sourceMappingURL=errors.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- import type { ToolDefinition } from './types/profile.js';
2
- import type { OperationInfo } from './types/openapi.js';
3
- export type FilteringRules = Record<string, string[]>;
4
- export interface FilteringParseResult {
5
- filtering: FilteringRules;
6
- normalizedHeader: string;
7
- }
8
- export declare function normalizeFilteringHeaderValue(value?: string): string | undefined;
9
- export declare function parseFilteringHeader(headerValue: string): FilteringParseResult;
10
- export declare function isControlKey(key: string): boolean;
11
- export declare function getFilterMaxValues(): number;
12
- export declare function enforceFiltering(context: {
13
- filtering: FilteringRules;
14
- toolDef: ToolDefinition;
15
- args: Record<string, unknown>;
16
- parameterAliases?: Record<string, string[]>;
17
- operation?: OperationInfo;
18
- }): void;
19
- //# sourceMappingURL=filtering.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"filtering.d.ts","sourceRoot":"","sources":["../../src/filtering.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOxD,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AAEtD,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,cAAc,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,6BAA6B,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOhF;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,oBAAoB,CA2D9E;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEjD;AAaD,wBAAgB,kBAAkB,IAAI,MAAM,CAY3C;AAyJD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACxC,SAAS,EAAE,cAAc,CAAC;IAC1B,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5C,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B,GAAG,IAAI,CA+BP"}
@@ -1,292 +0,0 @@
1
- import { AuthorizationError, ValidationError } from './errors.js';
2
- const CONTROL_KEYS = new Set(['_allow_list', '_allow_read']);
3
- const KEY_PATTERN = /^[A-Za-z0-9_][A-Za-z0-9_-]{0,63}$/;
4
- export function normalizeFilteringHeaderValue(value) {
5
- if (value === undefined || value === null) {
6
- return undefined;
7
- }
8
- const normalized = value.trim();
9
- return normalized.length > 0 ? normalized : undefined;
10
- }
11
- export function parseFilteringHeader(headerValue) {
12
- const normalizedHeader = normalizeFilteringHeaderValue(headerValue);
13
- if (!normalizedHeader) {
14
- return { filtering: Object.create(null), normalizedHeader: '' };
15
- }
16
- const maxValues = getFilterMaxValues();
17
- const filtering = Object.create(null);
18
- const parts = normalizedHeader.split(',');
19
- for (const part of parts) {
20
- const trimmed = part.trim();
21
- if (!trimmed) {
22
- continue;
23
- }
24
- const equalsIndex = trimmed.indexOf('=');
25
- if (equalsIndex === -1) {
26
- if (!CONTROL_KEYS.has(trimmed) || !KEY_PATTERN.test(trimmed)) {
27
- throw new ValidationError('Invalid X-Mcp4-Params header. Expected comma-separated key=value pairs.');
28
- }
29
- filtering[trimmed] = filtering[trimmed] ?? [];
30
- continue;
31
- }
32
- const key = trimmed.slice(0, equalsIndex).trim();
33
- const rawValue = trimmed.slice(equalsIndex + 1).trim();
34
- if (!key || !KEY_PATTERN.test(key)) {
35
- throw new ValidationError('Invalid X-Mcp4-Params header. Expected comma-separated key=value pairs.');
36
- }
37
- if (CONTROL_KEYS.has(key)) {
38
- throw new ValidationError('Invalid X-Mcp4-Params header. Expected comma-separated key=value pairs.');
39
- }
40
- if (!rawValue) {
41
- continue;
42
- }
43
- let decodedValue;
44
- try {
45
- decodedValue = decodeURIComponent(rawValue);
46
- }
47
- catch {
48
- throw new ValidationError('Invalid X-Mcp4-Params header. Expected comma-separated key=value pairs.');
49
- }
50
- const values = filtering[key] ?? [];
51
- if (values.length >= maxValues) {
52
- throw new ValidationError(`X-Mcp4-Params exceeds max values for key '${key}'. Max allowed is ${maxValues}.`);
53
- }
54
- values.push(decodedValue);
55
- filtering[key] = values;
56
- }
57
- return { filtering, normalizedHeader };
58
- }
59
- export function isControlKey(key) {
60
- return CONTROL_KEYS.has(key);
61
- }
62
- export function getFilterMaxValues() {
63
- const raw = process.env.MCP4_FILTER_MAX_VALUES;
64
- if (raw === undefined) {
65
- return 10;
66
- }
67
- const parsed = parseInt(raw, 10);
68
- if (Number.isNaN(parsed) || parsed <= 0) {
69
- throw new ValidationError(`Invalid MCP4_FILTER_MAX_VALUES: expected positive integer, got '${raw}'.`);
70
- }
71
- return parsed;
72
- }
73
- function prepareFilteringContext(filtering, toolDef, args, parameterAliases, operation) {
74
- const aliasToCanonical = buildAliasToCanonical(parameterAliases);
75
- const toolParamGroups = buildToolParamGroups(toolDef, parameterAliases, aliasToCanonical);
76
- const filterKeys = Object.keys(filtering).filter(key => !isControlKey(key));
77
- validateFilterKeys(filterKeys, toolParamGroups, toolDef.parameters);
78
- const allowedByCanonical = buildAllowedByCanonical(filterKeys, filtering, aliasToCanonical, toolParamGroups);
79
- const applicableCanonicals = Array.from(allowedByCanonical.keys());
80
- const operationCategory = resolveOperationCategory(operation, args['action']);
81
- return {
82
- aliasToCanonical,
83
- toolParamGroups,
84
- allowedByCanonical,
85
- applicableCanonicals,
86
- operationCategory,
87
- hasAnyFilterParam: applicableCanonicals.some(canonical => {
88
- const group = toolParamGroups.get(canonical);
89
- return group ? getArgumentValue(args, group.names) !== undefined : false;
90
- }),
91
- permissions: {
92
- allowList: Object.prototype.hasOwnProperty.call(filtering, '_allow_list'),
93
- allowRead: Object.prototype.hasOwnProperty.call(filtering, '_allow_read')
94
- },
95
- action: typeof args['action'] === 'string' ? args['action'] : undefined
96
- };
97
- }
98
- function buildAllowedByCanonical(filterKeys, filtering, aliasToCanonical, toolParamGroups) {
99
- const allowedByCanonical = new Map();
100
- for (const key of filterKeys) {
101
- const canonical = aliasToCanonical.get(key) ?? key;
102
- if (!toolParamGroups.has(canonical)) {
103
- continue;
104
- }
105
- const values = filtering[key] ?? [];
106
- if (values.length === 0) {
107
- continue;
108
- }
109
- const existing = allowedByCanonical.get(canonical) ?? [];
110
- existing.push(...values);
111
- allowedByCanonical.set(canonical, dedupe(existing));
112
- }
113
- return allowedByCanonical;
114
- }
115
- function validateParameterValue(argValue, allowedValues, canonical) {
116
- const allowedSet = new Set(allowedValues);
117
- if (Array.isArray(argValue)) {
118
- for (const item of argValue) {
119
- if (!isPrimitiveValue(item)) {
120
- throw new AuthorizationError(`Filter conflict for '${canonical}': expected one of [${allowedValues.join(', ')}], got '${formatValue(item)}'.`);
121
- }
122
- const stringValue = String(item);
123
- if (!allowedSet.has(stringValue)) {
124
- throw new AuthorizationError(`Filter conflict for '${canonical}': expected one of [${allowedValues.join(', ')}], got '${stringValue}'.`);
125
- }
126
- }
127
- return;
128
- }
129
- if (typeof argValue === 'object' && argValue !== null) {
130
- throw new AuthorizationError(`Filter conflict for '${canonical}': expected one of [${allowedValues.join(', ')}], got '${formatValue(argValue)}'.`);
131
- }
132
- const stringValue = String(argValue);
133
- if (!allowedSet.has(stringValue)) {
134
- throw new AuthorizationError(`Filter conflict for '${canonical}': expected one of [${allowedValues.join(', ')}], got '${stringValue}'.`);
135
- }
136
- }
137
- function validateCanonicalParameter(ctx, canonical, args, toolDef) {
138
- const allowedValues = ctx.allowedByCanonical.get(canonical) ?? [];
139
- const group = ctx.toolParamGroups.get(canonical);
140
- if (!group) {
141
- return;
142
- }
143
- const paramDefinition = toolDef.parameters[canonical];
144
- const argValue = getArgumentValue(args, group.names);
145
- const { operationCategory, permissions, hasAnyFilterParam, action } = ctx;
146
- const isList = operationCategory === 'list';
147
- const isRead = operationCategory === 'read';
148
- const isModify = operationCategory === 'modify';
149
- if (argValue === undefined) {
150
- if ((isList && permissions.allowList) || (isRead && permissions.allowRead)) {
151
- return;
152
- }
153
- if (action && isRequiredForAction(paramDefinition, action)) {
154
- throw new AuthorizationError(`Filter requires parameter '${canonical}' for tool '${toolDef.name}' action '${action}'.`);
155
- }
156
- if (isModify && hasAnyFilterParam) {
157
- return;
158
- }
159
- if (isList || isRead || isModify) {
160
- throw new AuthorizationError(`Filter requires parameter '${canonical}' for tool '${toolDef.name}'.`);
161
- }
162
- return;
163
- }
164
- // For list/read operations, allow _allow_list/_allow_read to relax value enforcement.
165
- // This enables "read/list any" access while keeping modify operations constrained to the allow-set.
166
- if ((isList && permissions.allowList) || (isRead && permissions.allowRead)) {
167
- return;
168
- }
169
- validateParameterValue(argValue, allowedValues, canonical);
170
- }
171
- export function enforceFiltering(context) {
172
- const { filtering, toolDef, args, parameterAliases, operation } = context;
173
- const filterKeys = Object.keys(filtering).filter(key => !isControlKey(key));
174
- if (filterKeys.length === 0) {
175
- return;
176
- }
177
- const ctx = prepareFilteringContext(filtering, toolDef, args, parameterAliases ?? {}, operation);
178
- if (ctx.applicableCanonicals.length === 0) {
179
- return;
180
- }
181
- if (ctx.operationCategory === 'modify' && !ctx.hasAnyFilterParam) {
182
- for (const canonical of ctx.applicableCanonicals) {
183
- const paramDefinition = toolDef.parameters[canonical];
184
- if (ctx.action && isRequiredForAction(paramDefinition, ctx.action)) {
185
- throw new AuthorizationError(`Filter requires parameter '${canonical}' for tool '${toolDef.name}' action '${ctx.action}'.`);
186
- }
187
- }
188
- throw new AuthorizationError(`Filter requires at least one of [${ctx.applicableCanonicals.join(', ')}] for tool '${toolDef.name}'.`);
189
- }
190
- for (const canonical of ctx.applicableCanonicals) {
191
- validateCanonicalParameter(ctx, canonical, args, toolDef);
192
- }
193
- }
194
- function buildAliasToCanonical(parameterAliases) {
195
- const aliasToCanonical = new Map();
196
- for (const [canonical, aliases] of Object.entries(parameterAliases)) {
197
- for (const alias of aliases) {
198
- if (!aliasToCanonical.has(alias)) {
199
- aliasToCanonical.set(alias, canonical);
200
- }
201
- }
202
- }
203
- return aliasToCanonical;
204
- }
205
- function buildToolParamGroups(toolDef, parameterAliases, aliasToCanonical) {
206
- const groups = new Map();
207
- for (const paramName of Object.keys(toolDef.parameters)) {
208
- const canonical = aliasToCanonical.get(paramName) ?? paramName;
209
- const aliasNames = parameterAliases[canonical] ?? [];
210
- const group = groups.get(canonical) ?? { names: [] };
211
- group.names = dedupe([canonical, ...aliasNames, paramName, ...group.names]);
212
- groups.set(canonical, group);
213
- }
214
- return groups;
215
- }
216
- function validateFilterKeys(filterKeys, toolParamGroups, parameters) {
217
- const allowedKeys = new Set();
218
- for (const [canonical, group] of toolParamGroups.entries()) {
219
- allowedKeys.add(canonical);
220
- for (const name of group.names) {
221
- allowedKeys.add(name);
222
- }
223
- }
224
- for (const key of Object.keys(parameters)) {
225
- allowedKeys.add(key);
226
- }
227
- const unknownKeys = filterKeys.filter(key => !allowedKeys.has(key));
228
- if (unknownKeys.length === 0) {
229
- return;
230
- }
231
- const allowedList = Array.from(allowedKeys).sort().join(', ');
232
- throw new ValidationError(`Unknown filter key '${unknownKeys[0]}'. Allowed keys: ${allowedList}`);
233
- }
234
- function isRequiredForAction(paramDefinition, action) {
235
- if (!paramDefinition) {
236
- return false;
237
- }
238
- if (paramDefinition.required) {
239
- return true;
240
- }
241
- if (!paramDefinition.required_for || paramDefinition.required_for.length === 0) {
242
- return false;
243
- }
244
- return paramDefinition.required_for.includes(action);
245
- }
246
- function getArgumentValue(args, names) {
247
- for (const name of names) {
248
- if (args[name] !== undefined) {
249
- return args[name];
250
- }
251
- }
252
- return undefined;
253
- }
254
- function resolveOperationCategory(operation, action) {
255
- if (operation) {
256
- const method = operation.method.toLowerCase();
257
- if (method === 'get') {
258
- const hasPathParams = operation.parameters.some(param => param.in === 'path');
259
- return hasPathParams ? 'read' : 'list';
260
- }
261
- }
262
- const actionValue = typeof action === 'string' ? action.toLowerCase() : '';
263
- if (actionValue === 'list' || actionValue === 'search') {
264
- return 'list';
265
- }
266
- if (actionValue === 'get' || actionValue === 'read') {
267
- return 'read';
268
- }
269
- return 'modify';
270
- }
271
- function dedupe(values) {
272
- return Array.from(new Set(values));
273
- }
274
- function isPrimitiveValue(value) {
275
- return ['string', 'number', 'boolean'].includes(typeof value);
276
- }
277
- function formatValue(value) {
278
- if (value === undefined) {
279
- return 'undefined';
280
- }
281
- if (value === null) {
282
- return 'null';
283
- }
284
- if (Array.isArray(value)) {
285
- return 'array';
286
- }
287
- if (typeof value === 'object') {
288
- return 'object';
289
- }
290
- return String(value);
291
- }
292
- //# sourceMappingURL=filtering.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"filtering.js","sourceRoot":"","sources":["../../src/filtering.ts"],"names":[],"mappings":"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"}
@@ -1,62 +0,0 @@
1
- /**
2
- * HTTP Client Factory - unified HTTP client management
3
- *
4
- * Why: Eliminates code duplication in HTTP client creation and management
5
- * Provides consistent client lifecycle, auth handling, and caching
6
- */
7
- import { HttpClient } from './interceptors.js';
8
- import type { Profile } from './types/profile.js';
9
- export interface HttpClientConfig {
10
- profile: Profile;
11
- baseUrl: string;
12
- sessionToken?: string;
13
- }
14
- /**
15
- * Factory for creating and managing HTTP clients
16
- * Handles both global and session-specific clients
17
- */
18
- export declare class HttpClientFactory {
19
- private globalClient?;
20
- private sessionClients;
21
- /**
22
- * Create global HTTP client (for stdio transport)
23
- */
24
- createGlobalClient(config: HttpClientConfig): HttpClient;
25
- /**
26
- * Get or create session-specific HTTP client
27
- */
28
- getOrCreateSessionClient(sessionId: string, config: HttpClientConfig): HttpClient;
29
- /**
30
- * Get global client (throws if not initialized)
31
- */
32
- getGlobalClient(): HttpClient;
33
- /**
34
- * Get session client (throws if not exists)
35
- */
36
- getSessionClient(sessionId: string): HttpClient;
37
- /**
38
- * Cleanup session client
39
- */
40
- cleanupSessionClient(sessionId: string): boolean;
41
- /**
42
- * Check if global client exists
43
- */
44
- hasGlobalClient(): boolean;
45
- /**
46
- * Check if session client exists
47
- */
48
- hasSessionClient(sessionId: string): boolean;
49
- /**
50
- * Get auth token for client creation
51
- */
52
- private getAuthToken;
53
- /**
54
- * Create interceptor chain for client
55
- */
56
- private createInterceptorChain;
57
- /**
58
- * Validate client configuration
59
- */
60
- validateClientConfig(config: HttpClientConfig): void;
61
- }
62
- //# sourceMappingURL=http-client-factory.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"http-client-factory.d.ts","sourceRoot":"","sources":["../../src/http-client-factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAoB,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAGlD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,YAAY,CAAC,CAAa;IAClC,OAAO,CAAC,cAAc,CAAiC;IAEvD;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU;IAOxD;;OAEG;IACH,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,UAAU;IAsBjF;;OAEG;IACH,eAAe,IAAI,UAAU;IAO7B;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU;IAQ/C;;OAEG;IACH,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIhD;;OAEG;IACH,eAAe,IAAI,OAAO;IAI1B;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI5C;;OAEG;IACH,OAAO,CAAC,YAAY;IAuBpB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAK9B;;OAEG;IACH,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;CAsBrD"}
@@ -1,133 +0,0 @@
1
- /**
2
- * HTTP Client Factory - unified HTTP client management
3
- *
4
- * Why: Eliminates code duplication in HTTP client creation and management
5
- * Provides consistent client lifecycle, auth handling, and caching
6
- */
7
- import { InterceptorChain, HttpClient } from './interceptors.js';
8
- import { ConfigurationError, AuthenticationError } from './errors.js';
9
- /**
10
- * Factory for creating and managing HTTP clients
11
- * Handles both global and session-specific clients
12
- */
13
- export class HttpClientFactory {
14
- constructor() {
15
- this.sessionClients = new Map();
16
- }
17
- /**
18
- * Create global HTTP client (for stdio transport)
19
- */
20
- createGlobalClient(config) {
21
- const interceptors = this.createInterceptorChain(config);
22
- const client = new HttpClient(config.baseUrl, interceptors);
23
- this.globalClient = client;
24
- return client;
25
- }
26
- /**
27
- * Get or create session-specific HTTP client
28
- */
29
- getOrCreateSessionClient(sessionId, config) {
30
- // Check cache first
31
- let client = this.sessionClients.get(sessionId);
32
- if (client) {
33
- return client;
34
- }
35
- // Create new client for session
36
- const interceptors = this.createInterceptorChain(config);
37
- const newClient = new HttpClient(config.baseUrl, interceptors);
38
- // Double-check for race condition
39
- const existingClient = this.sessionClients.get(sessionId);
40
- if (existingClient) {
41
- return existingClient;
42
- }
43
- // Cache and return
44
- this.sessionClients.set(sessionId, newClient);
45
- return newClient;
46
- }
47
- /**
48
- * Get global client (throws if not initialized)
49
- */
50
- getGlobalClient() {
51
- if (!this.globalClient) {
52
- throw new ConfigurationError('Global HTTP client not initialized');
53
- }
54
- return this.globalClient;
55
- }
56
- /**
57
- * Get session client (throws if not exists)
58
- */
59
- getSessionClient(sessionId) {
60
- const client = this.sessionClients.get(sessionId);
61
- if (!client) {
62
- throw new ConfigurationError(`Session HTTP client not found for session: ${sessionId}`);
63
- }
64
- return client;
65
- }
66
- /**
67
- * Cleanup session client
68
- */
69
- cleanupSessionClient(sessionId) {
70
- return this.sessionClients.delete(sessionId);
71
- }
72
- /**
73
- * Check if global client exists
74
- */
75
- hasGlobalClient() {
76
- return !!this.globalClient;
77
- }
78
- /**
79
- * Check if session client exists
80
- */
81
- hasSessionClient(sessionId) {
82
- return this.sessionClients.has(sessionId);
83
- }
84
- /**
85
- * Get auth token for client creation
86
- */
87
- getAuthToken(config) {
88
- // Priority: session token > environment token
89
- if (config.sessionToken) {
90
- return config.sessionToken;
91
- }
92
- const authConfigRaw = config.profile.interceptors?.auth;
93
- if (!authConfigRaw) {
94
- return undefined;
95
- }
96
- // Handle multi-auth: get primary non-OAuth config
97
- const authConfigs = Array.isArray(authConfigRaw) ? authConfigRaw : [authConfigRaw];
98
- const sortedConfigs = authConfigs.sort((a, b) => (a.priority || 0) - (b.priority || 0));
99
- const authConfig = sortedConfigs.find(c => c.type !== 'oauth');
100
- if (authConfig && authConfig.value_from_env) {
101
- return process.env[authConfig.value_from_env];
102
- }
103
- return undefined;
104
- }
105
- /**
106
- * Create interceptor chain for client
107
- */
108
- createInterceptorChain(config) {
109
- const token = this.getAuthToken(config);
110
- return new InterceptorChain(config.profile.interceptors || {}, token);
111
- }
112
- /**
113
- * Validate client configuration
114
- */
115
- validateClientConfig(config) {
116
- if (!config.baseUrl) {
117
- throw new ConfigurationError('Base URL is required for HTTP client');
118
- }
119
- if (!config.profile) {
120
- throw new ConfigurationError('Profile is required for HTTP client');
121
- }
122
- // Check if we have any auth token available
123
- const hasToken = this.getAuthToken(config);
124
- if (!hasToken && config.profile.interceptors?.auth) {
125
- const authConfigRaw = config.profile.interceptors.auth;
126
- const authConfigs = Array.isArray(authConfigRaw) ? authConfigRaw : [authConfigRaw];
127
- const nonOAuthConfig = authConfigs.find(c => c.type !== 'oauth');
128
- const envVar = nonOAuthConfig?.value_from_env || 'MCP4_API_TOKEN';
129
- throw new AuthenticationError(`No auth token available. Expected token in Authorization header or ${envVar} env var`, { envVar });
130
- }
131
- }
132
- }
133
- //# sourceMappingURL=http-client-factory.js.map