mcpflare 1.0.0

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 (84) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/LICENSE +22 -0
  3. package/README.md +390 -0
  4. package/dist/cli/index.d.ts +3 -0
  5. package/dist/cli/index.d.ts.map +1 -0
  6. package/dist/cli/index.js +1615 -0
  7. package/dist/cli/index.js.map +1 -0
  8. package/dist/server/index.d.ts +3 -0
  9. package/dist/server/index.d.ts.map +1 -0
  10. package/dist/server/index.js +19 -0
  11. package/dist/server/index.js.map +1 -0
  12. package/dist/server/mcp-handler.d.ts +34 -0
  13. package/dist/server/mcp-handler.d.ts.map +1 -0
  14. package/dist/server/mcp-handler.js +1524 -0
  15. package/dist/server/mcp-handler.js.map +1 -0
  16. package/dist/server/metrics-collector.d.ts +30 -0
  17. package/dist/server/metrics-collector.d.ts.map +1 -0
  18. package/dist/server/metrics-collector.js +85 -0
  19. package/dist/server/metrics-collector.js.map +1 -0
  20. package/dist/server/schema-converter.d.ts +9 -0
  21. package/dist/server/schema-converter.d.ts.map +1 -0
  22. package/dist/server/schema-converter.js +82 -0
  23. package/dist/server/schema-converter.js.map +1 -0
  24. package/dist/server/worker-manager.d.ts +48 -0
  25. package/dist/server/worker-manager.d.ts.map +1 -0
  26. package/dist/server/worker-manager.js +1746 -0
  27. package/dist/server/worker-manager.js.map +1 -0
  28. package/dist/types/index.d.ts +3 -0
  29. package/dist/types/index.d.ts.map +1 -0
  30. package/dist/types/index.js +3 -0
  31. package/dist/types/index.js.map +1 -0
  32. package/dist/types/mcp.d.ts +495 -0
  33. package/dist/types/mcp.d.ts.map +1 -0
  34. package/dist/types/mcp.js +80 -0
  35. package/dist/types/mcp.js.map +1 -0
  36. package/dist/types/worker.d.ts +35 -0
  37. package/dist/types/worker.d.ts.map +1 -0
  38. package/dist/types/worker.js +2 -0
  39. package/dist/types/worker.js.map +1 -0
  40. package/dist/utils/config-manager.d.ts +64 -0
  41. package/dist/utils/config-manager.d.ts.map +1 -0
  42. package/dist/utils/config-manager.js +556 -0
  43. package/dist/utils/config-manager.js.map +1 -0
  44. package/dist/utils/env-selector.d.ts +4 -0
  45. package/dist/utils/env-selector.d.ts.map +1 -0
  46. package/dist/utils/env-selector.js +127 -0
  47. package/dist/utils/env-selector.js.map +1 -0
  48. package/dist/utils/errors.d.ts +19 -0
  49. package/dist/utils/errors.d.ts.map +1 -0
  50. package/dist/utils/errors.js +37 -0
  51. package/dist/utils/errors.js.map +1 -0
  52. package/dist/utils/logger.d.ts +4 -0
  53. package/dist/utils/logger.d.ts.map +1 -0
  54. package/dist/utils/logger.js +27 -0
  55. package/dist/utils/logger.js.map +1 -0
  56. package/dist/utils/mcp-registry.d.ts +108 -0
  57. package/dist/utils/mcp-registry.d.ts.map +1 -0
  58. package/dist/utils/mcp-registry.js +298 -0
  59. package/dist/utils/mcp-registry.js.map +1 -0
  60. package/dist/utils/progress-indicator.d.ts +14 -0
  61. package/dist/utils/progress-indicator.d.ts.map +1 -0
  62. package/dist/utils/progress-indicator.js +82 -0
  63. package/dist/utils/progress-indicator.js.map +1 -0
  64. package/dist/utils/settings-manager.d.ts +19 -0
  65. package/dist/utils/settings-manager.d.ts.map +1 -0
  66. package/dist/utils/settings-manager.js +78 -0
  67. package/dist/utils/settings-manager.js.map +1 -0
  68. package/dist/utils/token-calculator.d.ts +34 -0
  69. package/dist/utils/token-calculator.d.ts.map +1 -0
  70. package/dist/utils/token-calculator.js +167 -0
  71. package/dist/utils/token-calculator.js.map +1 -0
  72. package/dist/utils/validation.d.ts +4 -0
  73. package/dist/utils/validation.d.ts.map +1 -0
  74. package/dist/utils/validation.js +36 -0
  75. package/dist/utils/validation.js.map +1 -0
  76. package/dist/utils/wrangler-formatter.d.ts +37 -0
  77. package/dist/utils/wrangler-formatter.d.ts.map +1 -0
  78. package/dist/utils/wrangler-formatter.js +302 -0
  79. package/dist/utils/wrangler-formatter.js.map +1 -0
  80. package/dist/worker/runtime.d.ts +34 -0
  81. package/dist/worker/runtime.d.ts.map +1 -0
  82. package/dist/worker/runtime.js +166 -0
  83. package/dist/worker/runtime.js.map +1 -0
  84. package/package.json +81 -0
@@ -0,0 +1,302 @@
1
+ function isVerbose() {
2
+ return (process.argv.includes('--verbose') ||
3
+ process.argv.includes('-v') ||
4
+ process.env.LOG_LEVEL === 'debug');
5
+ }
6
+ function stripAnsiCodes(str) {
7
+ return str.replace(/\u001b\[[0-9;]*m/g, '');
8
+ }
9
+ export function formatWranglerError(error, stdout, stderr, context) {
10
+ const verbose = isVerbose();
11
+ const lines = [];
12
+ lines.push('');
13
+ lines.push('❌ Wrangler Execution Error');
14
+ if (verbose) {
15
+ lines.push('─'.repeat(60));
16
+ if (error.message) {
17
+ const cleanMessage = stripAnsiCodes(error.message);
18
+ lines.push(`Error: ${cleanMessage}`);
19
+ lines.push('');
20
+ }
21
+ if (context) {
22
+ lines.push('Context:');
23
+ if (context.mcpId) {
24
+ lines.push(` MCP ID: ${context.mcpId}`);
25
+ }
26
+ if (context.port) {
27
+ lines.push(` Port: ${context.port}`);
28
+ }
29
+ if (context.tempDir) {
30
+ lines.push(` Temp Dir: ${context.tempDir}`);
31
+ lines.push(` You can inspect the generated files in this directory`);
32
+ }
33
+ if (context.userCode) {
34
+ lines.push('');
35
+ lines.push('Your code:');
36
+ lines.push('─'.repeat(60));
37
+ const codeLines = context.userCode.split('\n');
38
+ codeLines.forEach((line, index) => {
39
+ lines.push(`${(index + 1).toString().padStart(3, ' ')} | ${line}`);
40
+ });
41
+ lines.push('─'.repeat(60));
42
+ }
43
+ lines.push('');
44
+ }
45
+ if (stdout.trim()) {
46
+ const cleanStdout = stripAnsiCodes(stdout).trim();
47
+ if (cleanStdout) {
48
+ lines.push('Wrangler STDOUT:');
49
+ lines.push('─'.repeat(60));
50
+ lines.push(cleanStdout);
51
+ lines.push('');
52
+ }
53
+ }
54
+ }
55
+ if (stderr.trim()) {
56
+ const cleanStderr = stripAnsiCodes(stderr).trim();
57
+ if (cleanStderr) {
58
+ const isBuildError = cleanStderr.includes('Build failed') ||
59
+ cleanStderr.includes('build failed') ||
60
+ cleanStderr.includes('✗ Build failed');
61
+ if (verbose) {
62
+ lines.push('Wrangler STDERR:');
63
+ if (!isBuildError) {
64
+ lines.push('─'.repeat(60));
65
+ }
66
+ }
67
+ if (isBuildError) {
68
+ if (verbose) {
69
+ lines.push('─'.repeat(60));
70
+ }
71
+ lines.push('');
72
+ lines.push('🔍 TypeScript Compilation Error');
73
+ lines.push('');
74
+ lines.push('Your code has a syntax error that prevented it from compiling.');
75
+ lines.push('');
76
+ if (!verbose) {
77
+ lines.push('💡 Add the -v or --verbose flag to see your code and more details.');
78
+ lines.push('');
79
+ }
80
+ }
81
+ const stderrLines = cleanStderr.split('\n');
82
+ let inErrorBlock = false;
83
+ let errorFile = '';
84
+ let errorLine = '';
85
+ let errorColumn = '';
86
+ for (const line of stderrLines) {
87
+ const trimmed = line.trim();
88
+ if (!trimmed)
89
+ continue;
90
+ if (trimmed.includes('Logs were written to') ||
91
+ trimmed.includes('🪵')) {
92
+ if (verbose) {
93
+ lines.push(` ${trimmed}`);
94
+ }
95
+ continue;
96
+ }
97
+ const fileLocationMatch = trimmed.match(/(\S+\.ts):(\d+):(\d+):/);
98
+ if (fileLocationMatch) {
99
+ errorFile = fileLocationMatch[1];
100
+ errorLine = fileLocationMatch[2];
101
+ errorColumn = fileLocationMatch[3];
102
+ }
103
+ if (trimmed.includes('[ERROR]') ||
104
+ trimmed.includes('ERROR') ||
105
+ trimmed.includes('Error:') ||
106
+ trimmed.includes('✗') ||
107
+ trimmed.includes('Build failed') ||
108
+ trimmed.includes('must be initialized') ||
109
+ trimmed.includes('expected') ||
110
+ trimmed.includes('unexpected')) {
111
+ if (!inErrorBlock) {
112
+ if (!isBuildError) {
113
+ lines.push('─'.repeat(60));
114
+ lines.push('');
115
+ }
116
+ inErrorBlock = true;
117
+ }
118
+ const cleanLine = trimmed
119
+ .replace(/^X\s*\[ERROR\]\s*/i, '')
120
+ .replace(/^\[ERROR\]\s*/i, '')
121
+ .replace(/^X\s+/i, '')
122
+ .replace(/^✗\s+/, '')
123
+ .trim();
124
+ if (isBuildError &&
125
+ errorFile &&
126
+ errorLine &&
127
+ !cleanLine.includes(errorFile)) {
128
+ lines.push(` ✗ ${errorFile}:${errorLine}:${errorColumn || '?'}`);
129
+ lines.push(` ${cleanLine}`);
130
+ }
131
+ else {
132
+ lines.push(` ✗ ${cleanLine}`);
133
+ }
134
+ }
135
+ else if (trimmed.includes('│') ||
136
+ trimmed.includes('─') ||
137
+ trimmed.includes('═')) {
138
+ }
139
+ else if (trimmed.includes('╵') || trimmed.includes('^')) {
140
+ if (inErrorBlock) {
141
+ lines.push(` ${trimmed}`);
142
+ }
143
+ }
144
+ else if (inErrorBlock || verbose) {
145
+ lines.push(` ${trimmed}`);
146
+ }
147
+ }
148
+ if (!verbose && !inErrorBlock) {
149
+ const meaningfulLines = stderrLines
150
+ .map((l) => l.trim())
151
+ .filter((l) => l &&
152
+ !l.match(/^[│─═╔╗╚╝╠╣]/) &&
153
+ !l.includes('Logs were written to') &&
154
+ !l.includes('🪵'))
155
+ .slice(0, 5);
156
+ for (const line of meaningfulLines) {
157
+ lines.push(` ${line}`);
158
+ }
159
+ }
160
+ if (inErrorBlock || (verbose && !isBuildError)) {
161
+ lines.push('─'.repeat(60));
162
+ }
163
+ }
164
+ }
165
+ lines.push('');
166
+ return lines.join('\n');
167
+ }
168
+ function formatNestedJsonStructure(obj, indent = 0) {
169
+ const indentStr = ' '.repeat(indent);
170
+ const nextIndent = indent + 1;
171
+ const nextIndentStr = ' '.repeat(nextIndent);
172
+ if (Array.isArray(obj)) {
173
+ if (obj.length === 0)
174
+ return '[]';
175
+ const items = obj.map((item) => {
176
+ const formatted = formatNestedJsonStructure(item, nextIndent);
177
+ if (formatted.includes('\n')) {
178
+ return `${nextIndentStr}${formatted}`;
179
+ }
180
+ return `${nextIndentStr}${formatted}`;
181
+ });
182
+ return `[\n${items.join(',\n')}\n${indentStr}]`;
183
+ }
184
+ if (obj && typeof obj === 'object') {
185
+ const keys = Object.keys(obj);
186
+ if (keys.length === 0)
187
+ return '{}';
188
+ const entries = keys.map((key) => {
189
+ const value = obj[key];
190
+ if (key === 'text' &&
191
+ typeof value === 'string' &&
192
+ (value.trim().startsWith('{') || value.trim().startsWith('['))) {
193
+ try {
194
+ const parsed = JSON.parse(value);
195
+ const formatted = formatNestedJsonStructure(parsed, nextIndent);
196
+ return `${nextIndentStr}"${key}": ${formatted}`;
197
+ }
198
+ catch {
199
+ return `${nextIndentStr}"${key}": ${JSON.stringify(value)}`;
200
+ }
201
+ }
202
+ else {
203
+ const formattedValue = formatNestedJsonStructure(value, nextIndent);
204
+ return `${nextIndentStr}"${key}": ${formattedValue}`;
205
+ }
206
+ });
207
+ return `{\n${entries.join(',\n')}\n${indentStr}}`;
208
+ }
209
+ return JSON.stringify(obj);
210
+ }
211
+ function tryPrettyPrintJson(str) {
212
+ let jsonStr = str.trim();
213
+ const resultPrefix = 'Result: ';
214
+ if (jsonStr.startsWith(resultPrefix)) {
215
+ jsonStr = jsonStr.substring(resultPrefix.length).trim();
216
+ }
217
+ try {
218
+ const parsed = JSON.parse(jsonStr);
219
+ const formatted = formatNestedJsonStructure(parsed, 0);
220
+ if (str.startsWith(resultPrefix)) {
221
+ return `${resultPrefix}${formatted}`;
222
+ }
223
+ return formatted;
224
+ }
225
+ catch {
226
+ const jsonMatch = jsonStr.match(/\{[\s\S]*\}|\[[\s\S]*\]/);
227
+ if (jsonMatch) {
228
+ try {
229
+ const parsed = JSON.parse(jsonMatch[0]);
230
+ const formatted = formatNestedJsonStructure(parsed, 0);
231
+ const result = jsonStr.replace(jsonMatch[0], formatted);
232
+ if (str.startsWith(resultPrefix)) {
233
+ return `${resultPrefix}${result}`;
234
+ }
235
+ return result;
236
+ }
237
+ catch {
238
+ return null;
239
+ }
240
+ }
241
+ return null;
242
+ }
243
+ }
244
+ export function formatExecutionResult(result) {
245
+ const lines = [];
246
+ lines.push('');
247
+ lines.push(result.success ? '✅ Execution Successful' : '❌ Execution Failed');
248
+ lines.push('─'.repeat(60));
249
+ if (result.error) {
250
+ lines.push(`Error: ${result.error}`);
251
+ lines.push('');
252
+ }
253
+ if (result.output) {
254
+ lines.push('Output:');
255
+ const prettyPrinted = tryPrettyPrintJson(result.output);
256
+ if (prettyPrinted) {
257
+ const outputLines = prettyPrinted.split('\n');
258
+ for (const line of outputLines) {
259
+ lines.push(` ${line}`);
260
+ }
261
+ }
262
+ else {
263
+ const outputLines = result.output.split('\n');
264
+ for (const line of outputLines) {
265
+ if (line.trim()) {
266
+ lines.push(` ${line}`);
267
+ }
268
+ }
269
+ }
270
+ lines.push('');
271
+ }
272
+ lines.push('Metrics:');
273
+ if (result.metrics) {
274
+ let firstLine = `${result.metrics.mcp_calls_made} MCP calls: ${result.execution_time_ms}ms`;
275
+ if (result.metrics.schema_efficiency) {
276
+ const se = result.metrics.schema_efficiency;
277
+ const reduction = se.schema_size_reduction_percent.toFixed(0);
278
+ if (reduction !== '0') {
279
+ if (se.estimated_tokens_saved && se.estimated_tokens_saved > 0) {
280
+ firstLine += ` (~${se.estimated_tokens_saved.toLocaleString()} tokens saved, ${reduction}% reduction)`;
281
+ }
282
+ else {
283
+ firstLine += ` (${reduction}% schema reduction)`;
284
+ }
285
+ }
286
+ }
287
+ lines.push(` ${firstLine}`);
288
+ if (result.metrics.security) {
289
+ const sec = result.metrics.security;
290
+ const networkStatus = sec.network_isolation_enabled ? '✓' : '✗';
291
+ const processStatus = sec.process_isolation_enabled ? '✓' : '✗';
292
+ lines.push(` Security (${sec.security_level.toUpperCase()}): Network ${networkStatus} | Process ${processStatus}`);
293
+ }
294
+ }
295
+ else {
296
+ lines.push(` Execution Time: ${result.execution_time_ms}ms`);
297
+ }
298
+ lines.push('─'.repeat(60));
299
+ lines.push('');
300
+ return lines.join('\n');
301
+ }
302
+ //# sourceMappingURL=wrangler-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrangler-formatter.js","sourceRoot":"","sources":["../../src/utils/wrangler-formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { WorkerEntrypoint } from 'cloudflare:workers';
2
+ import type { WorkerLoader } from '../types/worker.js';
3
+ type ExecutionContext = {
4
+ waitUntil(promise: Promise<unknown>): void;
5
+ passThroughOnException(): void;
6
+ exports: {
7
+ MCPBridge: (options?: {
8
+ props?: {
9
+ mcpId: string;
10
+ rpcUrl: string;
11
+ };
12
+ }) => MCPBridge;
13
+ FetchProxy?: (options?: Record<string, never>) => FetchProxy;
14
+ };
15
+ };
16
+ interface Env {
17
+ LOADER: WorkerLoader;
18
+ [key: string]: unknown;
19
+ }
20
+ export declare class MCPBridge extends WorkerEntrypoint<{
21
+ mcpId: string;
22
+ rpcUrl: string;
23
+ }> {
24
+ callTool(toolName: string, input: unknown): Promise<unknown>;
25
+ }
26
+ export declare class FetchProxy extends WorkerEntrypoint {
27
+ fetch(request: Request): Promise<Response>;
28
+ private isHostAllowed;
29
+ }
30
+ declare const _default: {
31
+ fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response>;
32
+ };
33
+ export default _default;
34
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/worker/runtime.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAc,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAIlE,KAAK,gBAAgB,GAAG;IACtB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;IAC1C,sBAAsB,IAAI,IAAI,CAAA;IAC9B,OAAO,EAAE;QACP,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE;YACpB,KAAK,CAAC,EAAE;gBAAE,KAAK,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE,MAAM,CAAA;aAAE,CAAA;SAC1C,KAAK,SAAS,CAAA;QAEf,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,UAAU,CAAA;KAC7D,CAAA;CACF,CAAA;AAED,UAAU,GAAG;IACX,MAAM,EAAE,YAAY,CAAA;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AASD,qBAAa,SAAU,SAAQ,gBAAgB,CAAC;IAC9C,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,CAAC;IAIM,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;CAqCnE;AAqBD,qBAAa,UAAW,SAAQ,gBAAgB;IAOxC,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IAsEhD,OAAO,CAAC,aAAa;CAiBtB;;mBAIY,OAAO,OACX,GAAG,OACH,gBAAgB,GACpB,OAAO,CAAC,QAAQ,CAAC;;AALtB,wBA4IC"}
@@ -0,0 +1,166 @@
1
+ import { WorkerEntrypoint } from 'cloudflare:workers';
2
+ export class MCPBridge extends WorkerEntrypoint {
3
+ async callTool(toolName, input) {
4
+ const { mcpId, rpcUrl } = this.ctx.props;
5
+ const response = await fetch(rpcUrl, {
6
+ method: 'POST',
7
+ headers: { 'Content-Type': 'application/json' },
8
+ body: JSON.stringify({
9
+ mcpId,
10
+ toolName,
11
+ input: input || {},
12
+ }),
13
+ });
14
+ if (!response.ok) {
15
+ const errorData = (await response.json().catch(() => ({
16
+ error: response.statusText,
17
+ })));
18
+ throw new Error(`MCP tool call failed: ${errorData.error || response.statusText}`);
19
+ }
20
+ const result = (await response.json());
21
+ if (!result.success) {
22
+ throw new Error(`MCP tool call failed: ${result.error || 'Unknown error'}`);
23
+ }
24
+ return result.result;
25
+ }
26
+ }
27
+ export class FetchProxy extends WorkerEntrypoint {
28
+ async fetch(request) {
29
+ const allowedHostsHeader = request.headers.get('X-MCPflare-Allowed-Hosts') || '';
30
+ const allowLocalhostHeader = request.headers.get('X-MCPflare-Allow-Localhost') || 'false';
31
+ const allowedHosts = allowedHostsHeader
32
+ ? allowedHostsHeader
33
+ .split(',')
34
+ .map((h) => h.trim())
35
+ .filter((h) => h)
36
+ : [];
37
+ const allowLocalhost = allowLocalhostHeader === 'true';
38
+ const url = new URL(request.url);
39
+ const hostname = url.hostname.toLowerCase().replace(/\.$/, '');
40
+ const isLoopback = hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '::1';
41
+ if (isLoopback && !allowLocalhost) {
42
+ return new Response(JSON.stringify({
43
+ error: `MCPflare network policy: localhost blocked (${hostname})`,
44
+ }), {
45
+ status: 403,
46
+ headers: { 'Content-Type': 'application/json' },
47
+ });
48
+ }
49
+ if (!isLoopback && allowedHosts.length > 0) {
50
+ const isAllowed = this.isHostAllowed(hostname, allowedHosts);
51
+ if (!isAllowed) {
52
+ return new Response(JSON.stringify({
53
+ error: `MCPflare network policy: ${hostname} is not in the allowed hosts list`,
54
+ }), {
55
+ status: 403,
56
+ headers: { 'Content-Type': 'application/json' },
57
+ });
58
+ }
59
+ }
60
+ const forwardHeaders = new Headers(request.headers);
61
+ forwardHeaders.delete('X-MCPflare-Allowed-Hosts');
62
+ forwardHeaders.delete('X-MCPflare-Allow-Localhost');
63
+ return fetch(request.url, {
64
+ method: request.method,
65
+ headers: forwardHeaders,
66
+ body: request.body,
67
+ redirect: request.redirect,
68
+ });
69
+ }
70
+ isHostAllowed(hostname, allowedHosts) {
71
+ for (const entryRaw of allowedHosts) {
72
+ const entry = entryRaw.toLowerCase().replace(/\.$/, '');
73
+ if (!entry)
74
+ continue;
75
+ if (entry.startsWith('*.') && entry.length > 2) {
76
+ const suffix = entry.slice(2);
77
+ if (hostname === suffix || hostname.endsWith(`.${suffix}`)) {
78
+ return true;
79
+ }
80
+ }
81
+ else if (hostname === entry) {
82
+ return true;
83
+ }
84
+ }
85
+ return false;
86
+ }
87
+ }
88
+ export default {
89
+ async fetch(request, env, ctx) {
90
+ const corsHeaders = {
91
+ 'Access-Control-Allow-Origin': '*',
92
+ 'Access-Control-Allow-Methods': 'POST, OPTIONS',
93
+ 'Access-Control-Allow-Headers': 'Content-Type',
94
+ };
95
+ if (request.method === 'OPTIONS') {
96
+ return new Response(null, { headers: corsHeaders });
97
+ }
98
+ if (request.method !== 'POST') {
99
+ return new Response('Method not allowed', {
100
+ status: 405,
101
+ headers: corsHeaders,
102
+ });
103
+ }
104
+ try {
105
+ const { workerId, workerCode, executionRequest } = (await request.json());
106
+ if (!env.LOADER) {
107
+ throw new Error('Worker Loader binding not available. Ensure [[worker_loaders]] is configured in wrangler.toml');
108
+ }
109
+ const dynamicWorker = env.LOADER.get(workerId, async () => {
110
+ const mcpId = workerCode.env?.MCP_ID;
111
+ const rpcUrl = workerCode.env?.MCP_RPC_URL;
112
+ const mcpBinding = ctx.exports.MCPBridge({
113
+ props: { mcpId, rpcUrl },
114
+ });
115
+ const needsFetchProxy = workerCode.env?.NETWORK_ENABLED === 'true';
116
+ const fetchProxy = needsFetchProxy &&
117
+ 'FetchProxy' in ctx.exports &&
118
+ ctx.exports.FetchProxy
119
+ ? ctx.exports.FetchProxy({})
120
+ : undefined;
121
+ const env = {
122
+ ...workerCode.env,
123
+ MCP: mcpBinding,
124
+ };
125
+ const globalOutbound = fetchProxy || null;
126
+ return {
127
+ ...workerCode,
128
+ env,
129
+ globalOutbound,
130
+ };
131
+ });
132
+ const entrypoint = dynamicWorker.getEntrypoint();
133
+ const executionRequestPayload = JSON.stringify(executionRequest);
134
+ const workerResponse = await entrypoint.fetch(new Request('http://localhost', {
135
+ method: 'POST',
136
+ headers: { 'Content-Type': 'application/json' },
137
+ body: executionRequestPayload,
138
+ }));
139
+ const responseBody = await workerResponse.text();
140
+ return new Response(responseBody, {
141
+ status: workerResponse.status,
142
+ headers: {
143
+ 'Content-Type': 'application/json',
144
+ ...corsHeaders,
145
+ },
146
+ });
147
+ }
148
+ catch (error) {
149
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
150
+ const errorStack = error instanceof Error ? error.stack : undefined;
151
+ console.error('Failed to execute code in Worker isolate:', errorMessage, errorStack);
152
+ return new Response(JSON.stringify({
153
+ success: false,
154
+ error: 'Failed to execute code in Worker isolate',
155
+ message: errorMessage,
156
+ }), {
157
+ status: 500,
158
+ headers: {
159
+ 'Content-Type': 'application/json',
160
+ ...corsHeaders,
161
+ },
162
+ });
163
+ }
164
+ },
165
+ };
166
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/worker/runtime.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,81 @@
1
+ {
2
+ "name": "mcpflare",
3
+ "version": "1.0.0",
4
+ "description": "Use local MCP servers securely with zero-trust isolation while reducing context window token usage by up to 98%.",
5
+ "type": "module",
6
+ "main": "dist/server/index.js",
7
+ "types": "dist/server/index.d.ts",
8
+ "bin": {
9
+ "mcpflare": "dist/cli/index.js"
10
+ },
11
+ "scripts": {
12
+ "dev": "tsx src/server/index.ts",
13
+ "cli": "tsx src/cli/index.ts",
14
+ "build": "tsc",
15
+ "test": "vitest run",
16
+ "test:ci": "vitest run --reporter=dot",
17
+ "test:unit": "vitest run tests/unit",
18
+ "test:integration": "vitest run tests/integration",
19
+ "test:security": "vitest run tests/security",
20
+ "cleanup:test-configs": "tsx scripts/cleanup-test-configs.ts",
21
+ "lint": "biome lint src",
22
+ "lint:fix": "biome lint --write src",
23
+ "format": "biome format --write src",
24
+ "check": "biome check src",
25
+ "check:fix": "biome check --write src",
26
+ "worker:dev": "npx wrangler dev",
27
+ "release": "release-it",
28
+ "publish:npm": "npm publish --provenance --access public"
29
+ },
30
+ "keywords": [
31
+ "mcp",
32
+ "cloudflare-workers",
33
+ "code-mode",
34
+ "security",
35
+ "isolation",
36
+ "sandbox",
37
+ "model-context-protocol"
38
+ ],
39
+ "author": "James Gentes",
40
+ "license": "MIT",
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "git+https://github.com/jgentes/mcpflare.git"
44
+ },
45
+ "bugs": {
46
+ "url": "https://github.com/jgentes/mcpflare/issues"
47
+ },
48
+ "homepage": "https://github.com/jgentes/mcpflare#readme",
49
+ "dependencies": {
50
+ "@modelcontextprotocol/sdk": "^1.25.2",
51
+ "dotenv": "^16.3.1",
52
+ "jsonc-parser": "^3.3.1",
53
+ "pino": "^10.1.0",
54
+ "pino-pretty": "^10.2.3",
55
+ "wrangler": "^4.47.0",
56
+ "zod": "^3.22.4"
57
+ },
58
+ "devDependencies": {
59
+ "@biomejs/biome": "^2.3.5",
60
+ "@release-it/conventional-changelog": "^10.0.4",
61
+ "@types/node": "^20.10.0",
62
+ "@vitest/coverage-v8": "^2.1.9",
63
+ "release-it": "^19.2.3",
64
+ "tsx": "^4.7.0",
65
+ "typescript": "^5.3.3",
66
+ "vitest": "^2.1.9"
67
+ },
68
+ "engines": {
69
+ "node": ">=20.0.0"
70
+ },
71
+ "overrides": {
72
+ "qs": ">=6.14.1",
73
+ "esbuild": ">=0.25.0"
74
+ },
75
+ "files": [
76
+ "dist",
77
+ "README.md",
78
+ "LICENSE",
79
+ "CHANGELOG.md"
80
+ ]
81
+ }