webpeel 0.12.0 → 0.12.2

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 (148) hide show
  1. package/README.md +82 -9
  2. package/dist/cli.js +97 -6
  3. package/dist/cli.js.map +1 -1
  4. package/dist/core/actions.d.ts +28 -0
  5. package/dist/core/actions.d.ts.map +1 -1
  6. package/dist/core/actions.js +60 -0
  7. package/dist/core/actions.js.map +1 -1
  8. package/dist/core/bm25-filter.d.ts +10 -0
  9. package/dist/core/bm25-filter.d.ts.map +1 -1
  10. package/dist/core/bm25-filter.js +40 -0
  11. package/dist/core/bm25-filter.js.map +1 -1
  12. package/dist/core/content-pruner.d.ts +12 -5
  13. package/dist/core/content-pruner.d.ts.map +1 -1
  14. package/dist/core/content-pruner.js +247 -190
  15. package/dist/core/content-pruner.js.map +1 -1
  16. package/dist/core/research.d.ts +67 -0
  17. package/dist/core/research.d.ts.map +1 -0
  18. package/dist/core/research.js +254 -0
  19. package/dist/core/research.js.map +1 -0
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +37 -3
  22. package/dist/index.js.map +1 -1
  23. package/dist/mcp/server.js +107 -2
  24. package/dist/mcp/server.js.map +1 -1
  25. package/dist/server/app.d.ts +14 -0
  26. package/dist/server/app.d.ts.map +1 -0
  27. package/dist/server/app.js +189 -0
  28. package/dist/server/app.js.map +1 -0
  29. package/dist/server/auth-store.d.ts +28 -0
  30. package/dist/server/auth-store.d.ts.map +1 -0
  31. package/dist/server/auth-store.js +89 -0
  32. package/dist/server/auth-store.js.map +1 -0
  33. package/dist/server/job-queue.d.ts +93 -0
  34. package/dist/server/job-queue.d.ts.map +1 -0
  35. package/dist/server/job-queue.js +144 -0
  36. package/dist/server/job-queue.js.map +1 -0
  37. package/dist/server/middleware/auth.d.ts +28 -0
  38. package/dist/server/middleware/auth.d.ts.map +1 -0
  39. package/dist/server/middleware/auth.js +183 -0
  40. package/dist/server/middleware/auth.js.map +1 -0
  41. package/dist/server/middleware/rate-limit.d.ts +23 -0
  42. package/dist/server/middleware/rate-limit.d.ts.map +1 -0
  43. package/dist/server/middleware/rate-limit.js +126 -0
  44. package/dist/server/middleware/rate-limit.js.map +1 -0
  45. package/dist/server/middleware/url-validator.d.ts +16 -0
  46. package/dist/server/middleware/url-validator.d.ts.map +1 -0
  47. package/dist/server/middleware/url-validator.js +187 -0
  48. package/dist/server/middleware/url-validator.js.map +1 -0
  49. package/dist/server/pg-auth-store.d.ts +129 -0
  50. package/dist/server/pg-auth-store.d.ts.map +1 -0
  51. package/dist/server/pg-auth-store.js +457 -0
  52. package/dist/server/pg-auth-store.js.map +1 -0
  53. package/dist/server/pg-job-queue.d.ts +60 -0
  54. package/dist/server/pg-job-queue.d.ts.map +1 -0
  55. package/dist/server/pg-job-queue.js +365 -0
  56. package/dist/server/pg-job-queue.js.map +1 -0
  57. package/dist/server/premium/domain-intel.d.ts +17 -0
  58. package/dist/server/premium/domain-intel.d.ts.map +1 -0
  59. package/dist/server/premium/domain-intel.js +134 -0
  60. package/dist/server/premium/domain-intel.js.map +1 -0
  61. package/dist/server/premium/index.d.ts +18 -0
  62. package/dist/server/premium/index.d.ts.map +1 -0
  63. package/dist/server/premium/index.js +36 -0
  64. package/dist/server/premium/index.js.map +1 -0
  65. package/dist/server/premium/swr-cache.d.ts +15 -0
  66. package/dist/server/premium/swr-cache.d.ts.map +1 -0
  67. package/dist/server/premium/swr-cache.js +35 -0
  68. package/dist/server/premium/swr-cache.js.map +1 -0
  69. package/dist/server/routes/activity.d.ts +7 -0
  70. package/dist/server/routes/activity.d.ts.map +1 -0
  71. package/dist/server/routes/activity.js +66 -0
  72. package/dist/server/routes/activity.js.map +1 -0
  73. package/dist/server/routes/agent.d.ts +12 -0
  74. package/dist/server/routes/agent.d.ts.map +1 -0
  75. package/dist/server/routes/agent.js +356 -0
  76. package/dist/server/routes/agent.js.map +1 -0
  77. package/dist/server/routes/answer.d.ts +6 -0
  78. package/dist/server/routes/answer.d.ts.map +1 -0
  79. package/dist/server/routes/answer.js +124 -0
  80. package/dist/server/routes/answer.js.map +1 -0
  81. package/dist/server/routes/batch.d.ts +7 -0
  82. package/dist/server/routes/batch.d.ts.map +1 -0
  83. package/dist/server/routes/batch.js +287 -0
  84. package/dist/server/routes/batch.js.map +1 -0
  85. package/dist/server/routes/cli-usage.d.ts +7 -0
  86. package/dist/server/routes/cli-usage.d.ts.map +1 -0
  87. package/dist/server/routes/cli-usage.js +121 -0
  88. package/dist/server/routes/cli-usage.js.map +1 -0
  89. package/dist/server/routes/compat.d.ts +24 -0
  90. package/dist/server/routes/compat.d.ts.map +1 -0
  91. package/dist/server/routes/compat.js +651 -0
  92. package/dist/server/routes/compat.js.map +1 -0
  93. package/dist/server/routes/extract.d.ts +9 -0
  94. package/dist/server/routes/extract.d.ts.map +1 -0
  95. package/dist/server/routes/extract.js +121 -0
  96. package/dist/server/routes/extract.js.map +1 -0
  97. package/dist/server/routes/fetch.d.ts +7 -0
  98. package/dist/server/routes/fetch.d.ts.map +1 -0
  99. package/dist/server/routes/fetch.js +537 -0
  100. package/dist/server/routes/fetch.js.map +1 -0
  101. package/dist/server/routes/health.d.ts +8 -0
  102. package/dist/server/routes/health.d.ts.map +1 -0
  103. package/dist/server/routes/health.js +36 -0
  104. package/dist/server/routes/health.js.map +1 -0
  105. package/dist/server/routes/jobs.d.ts +8 -0
  106. package/dist/server/routes/jobs.d.ts.map +1 -0
  107. package/dist/server/routes/jobs.js +374 -0
  108. package/dist/server/routes/jobs.js.map +1 -0
  109. package/dist/server/routes/mcp.d.ts +16 -0
  110. package/dist/server/routes/mcp.d.ts.map +1 -0
  111. package/dist/server/routes/mcp.js +475 -0
  112. package/dist/server/routes/mcp.js.map +1 -0
  113. package/dist/server/routes/oauth.d.ts +10 -0
  114. package/dist/server/routes/oauth.d.ts.map +1 -0
  115. package/dist/server/routes/oauth.js +296 -0
  116. package/dist/server/routes/oauth.js.map +1 -0
  117. package/dist/server/routes/screenshot.d.ts +10 -0
  118. package/dist/server/routes/screenshot.d.ts.map +1 -0
  119. package/dist/server/routes/screenshot.js +217 -0
  120. package/dist/server/routes/screenshot.js.map +1 -0
  121. package/dist/server/routes/search.d.ts +7 -0
  122. package/dist/server/routes/search.d.ts.map +1 -0
  123. package/dist/server/routes/search.js +287 -0
  124. package/dist/server/routes/search.js.map +1 -0
  125. package/dist/server/routes/stats.d.ts +7 -0
  126. package/dist/server/routes/stats.d.ts.map +1 -0
  127. package/dist/server/routes/stats.js +65 -0
  128. package/dist/server/routes/stats.js.map +1 -0
  129. package/dist/server/routes/stripe.d.ts +9 -0
  130. package/dist/server/routes/stripe.d.ts.map +1 -0
  131. package/dist/server/routes/stripe.js +233 -0
  132. package/dist/server/routes/stripe.js.map +1 -0
  133. package/dist/server/routes/users.d.ts +9 -0
  134. package/dist/server/routes/users.d.ts.map +1 -0
  135. package/dist/server/routes/users.js +954 -0
  136. package/dist/server/routes/users.js.map +1 -0
  137. package/dist/server/routes/webhooks.d.ts +15 -0
  138. package/dist/server/routes/webhooks.d.ts.map +1 -0
  139. package/dist/server/routes/webhooks.js +73 -0
  140. package/dist/server/routes/webhooks.js.map +1 -0
  141. package/dist/server/sentry.d.ts +14 -0
  142. package/dist/server/sentry.d.ts.map +1 -0
  143. package/dist/server/sentry.js +39 -0
  144. package/dist/server/sentry.js.map +1 -0
  145. package/dist/types.d.ts +13 -0
  146. package/dist/types.d.ts.map +1 -1
  147. package/dist/types.js.map +1 -1
  148. package/package.json +3 -2
@@ -0,0 +1,475 @@
1
+ /**
2
+ * Hosted MCP endpoint — POST /mcp, POST /v2/mcp, POST /:apiKey/v2/mcp
3
+ *
4
+ * Accepts MCP Streamable HTTP transport (JSON-RPC over HTTP).
5
+ * Users connect with:
6
+ * { "url": "https://api.webpeel.dev/mcp" }
7
+ * { "url": "https://api.webpeel.dev/v2/mcp" }
8
+ * { "url": "https://api.webpeel.dev/<API_KEY>/v2/mcp" } ← key in URL (Firecrawl-style)
9
+ *
10
+ * Each request creates a stateless MCP server, processes the JSON-RPC
11
+ * message(s), and returns the response.
12
+ */
13
+ import { Router } from 'express';
14
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
15
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
16
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
17
+ import { peel, peelBatch } from '../../index.js';
18
+ import { normalizeActions } from '../../core/actions.js';
19
+ import { runAgent } from '../../core/agent.js';
20
+ import { extractInlineJson } from '../../core/extract-inline.js';
21
+ import { readFileSync } from 'fs';
22
+ import { join, dirname } from 'path';
23
+ import { fileURLToPath } from 'url';
24
+ // Read version from package.json
25
+ let pkgVersion = '0.7.0';
26
+ try {
27
+ const __dirname = dirname(fileURLToPath(import.meta.url));
28
+ const pkg = JSON.parse(readFileSync(join(__dirname, '..', '..', '..', 'package.json'), 'utf-8'));
29
+ pkgVersion = pkg.version;
30
+ }
31
+ catch { /* fallback */ }
32
+ // ---------------------------------------------------------------------------
33
+ // Tool definitions (subset of the full MCP server tools, used for hosted mode)
34
+ // ---------------------------------------------------------------------------
35
+ function getTools() {
36
+ return [
37
+ {
38
+ name: 'webpeel_fetch',
39
+ description: 'Fetch a URL and return clean, AI-ready markdown content. Handles JavaScript rendering and anti-bot protections.',
40
+ annotations: { title: 'Fetch Web Page', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
41
+ inputSchema: {
42
+ type: 'object',
43
+ properties: {
44
+ url: { type: 'string', description: 'The URL to fetch' },
45
+ render: { type: 'boolean', description: 'Force browser rendering', default: false },
46
+ stealth: { type: 'boolean', description: 'Stealth mode to bypass bot detection', default: false },
47
+ wait: { type: 'number', description: 'Milliseconds to wait for dynamic content', default: 0 },
48
+ format: { type: 'string', enum: ['markdown', 'text', 'html'], default: 'markdown' },
49
+ selector: { type: 'string', description: 'CSS selector to extract specific content' },
50
+ maxTokens: { type: 'number', description: 'Maximum token count for output' },
51
+ images: { type: 'boolean', description: 'Extract image URLs', default: false },
52
+ inlineExtract: {
53
+ type: 'object',
54
+ description: 'Inline LLM-powered JSON extraction (BYOK). Provide schema and/or prompt.',
55
+ properties: {
56
+ schema: { type: 'object', description: 'JSON Schema for desired output' },
57
+ prompt: { type: 'string', description: 'Extraction prompt' },
58
+ },
59
+ },
60
+ llmProvider: { type: 'string', enum: ['openai', 'anthropic', 'google'], description: 'LLM provider for inline extraction' },
61
+ llmApiKey: { type: 'string', description: 'LLM API key (BYOK) for inline extraction' },
62
+ llmModel: { type: 'string', description: 'LLM model name (optional)' },
63
+ actions: {
64
+ type: 'array',
65
+ items: {
66
+ type: 'object',
67
+ properties: {
68
+ type: { type: 'string', enum: ['click', 'type', 'fill', 'scroll', 'wait', 'press', 'hover', 'select', 'waitForSelector', 'screenshot'] },
69
+ selector: { type: 'string' },
70
+ value: { type: 'string' },
71
+ text: { type: 'string' },
72
+ key: { type: 'string' },
73
+ milliseconds: { type: 'number' },
74
+ ms: { type: 'number' },
75
+ direction: { type: 'string', enum: ['up', 'down', 'left', 'right'] },
76
+ amount: { type: 'number' },
77
+ timeout: { type: 'number' },
78
+ },
79
+ required: ['type'],
80
+ },
81
+ description: 'Page actions to execute before extraction (auto-enables browser rendering)',
82
+ },
83
+ },
84
+ required: ['url'],
85
+ },
86
+ },
87
+ {
88
+ name: 'webpeel_search',
89
+ description: 'Search the web and return results with titles, URLs, and snippets.',
90
+ annotations: { title: 'Search the Web', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
91
+ inputSchema: {
92
+ type: 'object',
93
+ properties: {
94
+ query: { type: 'string', description: 'Search query' },
95
+ count: { type: 'number', description: 'Number of results (1-10)', default: 5 },
96
+ },
97
+ required: ['query'],
98
+ },
99
+ },
100
+ {
101
+ name: 'webpeel_crawl',
102
+ description: 'Crawl a website following links and extracting content.',
103
+ annotations: { title: 'Crawl Website', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
104
+ inputSchema: {
105
+ type: 'object',
106
+ properties: {
107
+ url: { type: 'string', description: 'Starting URL' },
108
+ maxPages: { type: 'number', default: 10, minimum: 1, maximum: 100 },
109
+ maxDepth: { type: 'number', default: 2, minimum: 1, maximum: 5 },
110
+ render: { type: 'boolean', default: false },
111
+ },
112
+ required: ['url'],
113
+ },
114
+ },
115
+ {
116
+ name: 'webpeel_map',
117
+ description: 'Discover all URLs on a domain using sitemap.xml and link crawling.',
118
+ annotations: { title: 'Map Website URLs', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
119
+ inputSchema: {
120
+ type: 'object',
121
+ properties: {
122
+ url: { type: 'string', description: 'Starting URL or domain' },
123
+ maxUrls: { type: 'number', default: 5000, minimum: 1, maximum: 10000 },
124
+ },
125
+ required: ['url'],
126
+ },
127
+ },
128
+ {
129
+ name: 'webpeel_extract',
130
+ description: 'Extract structured data from a webpage using CSS selectors or AI.',
131
+ annotations: { title: 'Extract Structured Data', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
132
+ inputSchema: {
133
+ type: 'object',
134
+ properties: {
135
+ url: { type: 'string', description: 'URL to extract from' },
136
+ selectors: { type: 'object', description: 'Map of field names to CSS selectors' },
137
+ prompt: { type: 'string', description: 'Natural language prompt for AI extraction' },
138
+ llmApiKey: { type: 'string', description: 'API key for LLM extraction' },
139
+ },
140
+ required: ['url'],
141
+ },
142
+ },
143
+ {
144
+ name: 'webpeel_batch',
145
+ description: 'Fetch multiple URLs in batch with concurrency control.',
146
+ annotations: { title: 'Batch Fetch URLs', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
147
+ inputSchema: {
148
+ type: 'object',
149
+ properties: {
150
+ urls: { type: 'array', items: { type: 'string' }, description: 'URLs to fetch' },
151
+ concurrency: { type: 'number', default: 3, minimum: 1, maximum: 10 },
152
+ format: { type: 'string', enum: ['markdown', 'text', 'html'], default: 'markdown' },
153
+ },
154
+ required: ['urls'],
155
+ },
156
+ },
157
+ {
158
+ name: 'webpeel_agent',
159
+ description: 'Run autonomous web research: searches, fetches, and synthesises an answer using an LLM (BYOK). Supports basic/thorough depth, topic filters, and structured output.',
160
+ annotations: { title: 'Web Research Agent', readOnlyHint: true, destructiveHint: false, idempotentHint: false, openWorldHint: true },
161
+ inputSchema: {
162
+ type: 'object',
163
+ properties: {
164
+ prompt: { type: 'string', description: 'Research question / prompt' },
165
+ llmApiKey: { type: 'string', description: 'Your OpenAI-compatible API key (BYOK)' },
166
+ llmModel: { type: 'string', description: 'LLM model (default: gpt-4o-mini)' },
167
+ depth: { type: 'string', enum: ['basic', 'thorough'], default: 'basic' },
168
+ topic: { type: 'string', enum: ['general', 'news', 'technical', 'academic'], default: 'general' },
169
+ maxSources: { type: 'number', description: 'Max sources (1-20)', default: 5 },
170
+ outputSchema: { type: 'object', description: 'JSON Schema for structured output' },
171
+ },
172
+ required: ['prompt', 'llmApiKey'],
173
+ },
174
+ },
175
+ ];
176
+ }
177
+ // ---------------------------------------------------------------------------
178
+ // Tool handler
179
+ // ---------------------------------------------------------------------------
180
+ function safeStringify(obj) {
181
+ try {
182
+ return JSON.stringify(obj, null, 2);
183
+ }
184
+ catch {
185
+ return JSON.stringify({ error: 'serialization_error', message: 'Failed to serialize result' });
186
+ }
187
+ }
188
+ async function handleToolCall(name, args) {
189
+ try {
190
+ // webpeel_fetch
191
+ if (name === 'webpeel_fetch') {
192
+ const url = args.url;
193
+ if (!url || typeof url !== 'string')
194
+ throw new Error('Invalid URL');
195
+ if (url.length > 2048)
196
+ throw new Error('URL too long');
197
+ // Normalize actions (handles Firecrawl-style aliases)
198
+ const parsedActions = args.actions ? normalizeActions(args.actions) : undefined;
199
+ const hasActions = parsedActions && parsedActions.length > 0;
200
+ const options = {
201
+ render: args.render || hasActions || false,
202
+ stealth: args.stealth || false,
203
+ wait: args.wait || 0,
204
+ format: args.format || 'markdown',
205
+ selector: args.selector,
206
+ maxTokens: args.maxTokens,
207
+ images: args.images,
208
+ actions: parsedActions,
209
+ };
210
+ const result = await Promise.race([
211
+ peel(url, options),
212
+ timeout(60000, 'Fetch timed out'),
213
+ ]);
214
+ // Inline LLM extraction (post-fetch, BYOK)
215
+ const inlineExtract = args.inlineExtract;
216
+ const llmProvider = args.llmProvider;
217
+ const llmApiKey = args.llmApiKey;
218
+ const llmModel = args.llmModel;
219
+ if (inlineExtract && (inlineExtract.schema || inlineExtract.prompt) && llmApiKey && llmProvider) {
220
+ const validProviders = ['openai', 'anthropic', 'google'];
221
+ if (validProviders.includes(llmProvider)) {
222
+ const extractResult = await extractInlineJson(result.content, {
223
+ schema: inlineExtract.schema,
224
+ prompt: inlineExtract.prompt,
225
+ llmProvider: llmProvider,
226
+ llmApiKey,
227
+ llmModel,
228
+ });
229
+ result.json = extractResult.data;
230
+ result.extractTokensUsed = extractResult.tokensUsed;
231
+ }
232
+ }
233
+ return ok(safeStringify(result));
234
+ }
235
+ // webpeel_search
236
+ if (name === 'webpeel_search') {
237
+ const query = args.query;
238
+ if (!query || typeof query !== 'string')
239
+ throw new Error('Invalid query');
240
+ const { getSearchProvider } = await import('../../core/search-provider.js');
241
+ const provider = getSearchProvider('duckduckgo');
242
+ const count = Math.min(Math.max(args.count || 5, 1), 10);
243
+ const results = await Promise.race([
244
+ provider.searchWeb(query, { count }),
245
+ timeout(30000, 'Search timed out'),
246
+ ]);
247
+ return ok(safeStringify(results));
248
+ }
249
+ // webpeel_crawl
250
+ if (name === 'webpeel_crawl') {
251
+ const url = args.url;
252
+ if (!url || typeof url !== 'string')
253
+ throw new Error('Invalid URL');
254
+ const { crawl } = await import('../../core/crawler.js');
255
+ const results = await Promise.race([
256
+ crawl(url, {
257
+ maxPages: args.maxPages,
258
+ maxDepth: args.maxDepth,
259
+ render: args.render || false,
260
+ }),
261
+ timeout(600000, 'Crawl timed out'),
262
+ ]);
263
+ return ok(safeStringify(results));
264
+ }
265
+ // webpeel_map
266
+ if (name === 'webpeel_map') {
267
+ const url = args.url;
268
+ if (!url || typeof url !== 'string')
269
+ throw new Error('Invalid URL');
270
+ const { mapDomain } = await import('../../core/map.js');
271
+ const results = await Promise.race([
272
+ mapDomain(url, { maxUrls: args.maxUrls }),
273
+ timeout(600000, 'Map timed out'),
274
+ ]);
275
+ return ok(safeStringify(results));
276
+ }
277
+ // webpeel_extract
278
+ if (name === 'webpeel_extract') {
279
+ const url = args.url;
280
+ if (!url || typeof url !== 'string')
281
+ throw new Error('Invalid URL');
282
+ const options = {
283
+ render: args.render || false,
284
+ extract: {
285
+ selectors: args.selectors,
286
+ prompt: args.prompt,
287
+ llmApiKey: args.llmApiKey,
288
+ },
289
+ };
290
+ const result = await Promise.race([
291
+ peel(url, options),
292
+ timeout(60000, 'Extract timed out'),
293
+ ]);
294
+ return ok(safeStringify(result));
295
+ }
296
+ // webpeel_batch
297
+ if (name === 'webpeel_batch') {
298
+ const urls = args.urls;
299
+ if (!urls || !Array.isArray(urls) || urls.length === 0)
300
+ throw new Error('Invalid urls');
301
+ if (urls.length > 50)
302
+ throw new Error('Too many URLs (max 50)');
303
+ const options = {
304
+ concurrency: args.concurrency || 3,
305
+ format: args.format || 'markdown',
306
+ };
307
+ const results = await Promise.race([
308
+ peelBatch(urls, options),
309
+ timeout(300000, 'Batch timed out'),
310
+ ]);
311
+ return ok(safeStringify(results));
312
+ }
313
+ // webpeel_agent
314
+ if (name === 'webpeel_agent') {
315
+ const prompt = args.prompt;
316
+ const llmApiKey = args.llmApiKey;
317
+ if (!prompt || typeof prompt !== 'string')
318
+ throw new Error('Invalid prompt');
319
+ if (!llmApiKey || typeof llmApiKey !== 'string')
320
+ throw new Error('Invalid llmApiKey');
321
+ const result = await Promise.race([
322
+ runAgent({
323
+ prompt,
324
+ llmApiKey,
325
+ llmModel: args.llmModel,
326
+ depth: args.depth || 'basic',
327
+ topic: args.topic || 'general',
328
+ maxSources: args.maxSources,
329
+ outputSchema: args.outputSchema,
330
+ }),
331
+ timeout(180000, 'Agent timed out'),
332
+ ]);
333
+ return ok(safeStringify(result));
334
+ }
335
+ throw new Error(`Unknown tool: ${name}`);
336
+ }
337
+ catch (error) {
338
+ const err = error;
339
+ return {
340
+ content: [{ type: 'text', text: safeStringify({ error: err.name || 'Error', message: err.message || 'Unknown error' }) }],
341
+ isError: true,
342
+ };
343
+ }
344
+ }
345
+ function ok(text) {
346
+ return { content: [{ type: 'text', text }] };
347
+ }
348
+ function timeout(ms, msg) {
349
+ return new Promise((_, reject) => setTimeout(() => reject(new Error(msg)), ms));
350
+ }
351
+ // ---------------------------------------------------------------------------
352
+ // Create a fresh MCP server instance (stateless — one per request)
353
+ // ---------------------------------------------------------------------------
354
+ function createMcpServer() {
355
+ const server = new Server({ name: 'webpeel', version: pkgVersion }, { capabilities: { tools: {} } });
356
+ const tools = getTools();
357
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools }));
358
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
359
+ const { name, arguments: args } = request.params;
360
+ return handleToolCall(name, (args ?? {}));
361
+ });
362
+ return server;
363
+ }
364
+ // ---------------------------------------------------------------------------
365
+ // Express router
366
+ // ---------------------------------------------------------------------------
367
+ // ---------------------------------------------------------------------------
368
+ // Shared MCP handler logic
369
+ // ---------------------------------------------------------------------------
370
+ async function handleMcpPost(req, res) {
371
+ try {
372
+ const server = createMcpServer();
373
+ const transport = new StreamableHTTPServerTransport({
374
+ sessionIdGenerator: undefined, // stateless
375
+ });
376
+ // Connect server ↔ transport
377
+ await server.connect(transport);
378
+ // Delegate to transport — it reads the JSON-RPC body and writes the response.
379
+ // We pass req.body as the pre-parsed body (Express already parsed JSON).
380
+ await transport.handleRequest(req, res, req.body);
381
+ // Clean up (don't await — fire and forget)
382
+ transport.close().catch(() => { });
383
+ server.close().catch(() => { });
384
+ }
385
+ catch (error) {
386
+ console.error('MCP endpoint error:', error);
387
+ if (!res.headersSent) {
388
+ res.status(500).json({
389
+ jsonrpc: '2.0',
390
+ error: { code: -32603, message: 'Internal error' },
391
+ id: null,
392
+ });
393
+ }
394
+ }
395
+ }
396
+ function mcpMethodNotAllowed(_req, res) {
397
+ res.status(405).json({
398
+ jsonrpc: '2.0',
399
+ error: {
400
+ code: -32000,
401
+ message: 'Method not allowed. Use POST to send MCP JSON-RPC messages.',
402
+ },
403
+ id: null,
404
+ });
405
+ }
406
+ function mcpDeleteOk(_req, res) {
407
+ res.status(200).json({ ok: true });
408
+ }
409
+ // ---------------------------------------------------------------------------
410
+ // Express router
411
+ // ---------------------------------------------------------------------------
412
+ export function createMcpRouter(authStore) {
413
+ const router = Router();
414
+ // POST /mcp — legacy path, MCP Streamable HTTP transport
415
+ router.post('/mcp', handleMcpPost);
416
+ router.get('/mcp', mcpMethodNotAllowed);
417
+ router.delete('/mcp', mcpDeleteOk);
418
+ // POST /v2/mcp — canonical v2 path; auth via Authorization: Bearer <key> header
419
+ // The global auth middleware already validates the Bearer token, so no extra
420
+ // validation is needed here.
421
+ router.post('/v2/mcp', handleMcpPost);
422
+ router.get('/v2/mcp', mcpMethodNotAllowed);
423
+ router.delete('/v2/mcp', mcpDeleteOk);
424
+ // POST /:apiKey/v2/mcp — Firecrawl-style: API key embedded in URL path
425
+ // e.g. https://api.webpeel.dev/wbp_abc123/v2/mcp
426
+ // Validate the key ourselves since the global middleware only reads headers.
427
+ router.post('/:apiKey/v2/mcp', async (req, res) => {
428
+ const { apiKey } = req.params;
429
+ // Basic format guard — reject obviously malformed keys early
430
+ if (!apiKey || apiKey.length < 8) {
431
+ res.status(401).json({
432
+ jsonrpc: '2.0',
433
+ error: { code: -32001, message: 'Invalid API key' },
434
+ id: null,
435
+ });
436
+ return;
437
+ }
438
+ // If we have an authStore, validate the key
439
+ if (authStore) {
440
+ try {
441
+ const keyInfo = await authStore.validateKey(String(apiKey));
442
+ if (!keyInfo) {
443
+ res.status(401).json({
444
+ jsonrpc: '2.0',
445
+ error: { code: -32001, message: 'Invalid or expired API key' },
446
+ id: null,
447
+ });
448
+ return;
449
+ }
450
+ // Inject auth info so downstream tools can use it
451
+ req.auth = {
452
+ keyInfo,
453
+ tier: (keyInfo.tier ?? 'free'),
454
+ rateLimit: 100,
455
+ softLimited: false,
456
+ extraUsageAvailable: false,
457
+ };
458
+ }
459
+ catch (err) {
460
+ console.error('MCP auth error:', err);
461
+ res.status(500).json({
462
+ jsonrpc: '2.0',
463
+ error: { code: -32603, message: 'Internal error' },
464
+ id: null,
465
+ });
466
+ return;
467
+ }
468
+ }
469
+ return handleMcpPost(req, res);
470
+ });
471
+ router.get('/:apiKey/v2/mcp', mcpMethodNotAllowed);
472
+ router.delete('/:apiKey/v2/mcp', mcpDeleteOk);
473
+ return router;
474
+ }
475
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/server/routes/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * OAuth authentication routes
3
+ * Handles OAuth login from Auth.js (GitHub, Google)
4
+ */
5
+ import { Router } from 'express';
6
+ /**
7
+ * Create OAuth routes
8
+ */
9
+ export declare function createOAuthRouter(): Router;
10
+ //# sourceMappingURL=oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../src/server/routes/oauth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AA6EpD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAiT1C"}