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.
- package/README.md +82 -9
- package/dist/cli.js +97 -6
- package/dist/cli.js.map +1 -1
- package/dist/core/actions.d.ts +28 -0
- package/dist/core/actions.d.ts.map +1 -1
- package/dist/core/actions.js +60 -0
- package/dist/core/actions.js.map +1 -1
- package/dist/core/bm25-filter.d.ts +10 -0
- package/dist/core/bm25-filter.d.ts.map +1 -1
- package/dist/core/bm25-filter.js +40 -0
- package/dist/core/bm25-filter.js.map +1 -1
- package/dist/core/content-pruner.d.ts +12 -5
- package/dist/core/content-pruner.d.ts.map +1 -1
- package/dist/core/content-pruner.js +247 -190
- package/dist/core/content-pruner.js.map +1 -1
- package/dist/core/research.d.ts +67 -0
- package/dist/core/research.d.ts.map +1 -0
- package/dist/core/research.js +254 -0
- package/dist/core/research.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -3
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.js +107 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/server/app.d.ts +14 -0
- package/dist/server/app.d.ts.map +1 -0
- package/dist/server/app.js +189 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/auth-store.d.ts +28 -0
- package/dist/server/auth-store.d.ts.map +1 -0
- package/dist/server/auth-store.js +89 -0
- package/dist/server/auth-store.js.map +1 -0
- package/dist/server/job-queue.d.ts +93 -0
- package/dist/server/job-queue.d.ts.map +1 -0
- package/dist/server/job-queue.js +144 -0
- package/dist/server/job-queue.js.map +1 -0
- package/dist/server/middleware/auth.d.ts +28 -0
- package/dist/server/middleware/auth.d.ts.map +1 -0
- package/dist/server/middleware/auth.js +183 -0
- package/dist/server/middleware/auth.js.map +1 -0
- package/dist/server/middleware/rate-limit.d.ts +23 -0
- package/dist/server/middleware/rate-limit.d.ts.map +1 -0
- package/dist/server/middleware/rate-limit.js +126 -0
- package/dist/server/middleware/rate-limit.js.map +1 -0
- package/dist/server/middleware/url-validator.d.ts +16 -0
- package/dist/server/middleware/url-validator.d.ts.map +1 -0
- package/dist/server/middleware/url-validator.js +187 -0
- package/dist/server/middleware/url-validator.js.map +1 -0
- package/dist/server/pg-auth-store.d.ts +129 -0
- package/dist/server/pg-auth-store.d.ts.map +1 -0
- package/dist/server/pg-auth-store.js +457 -0
- package/dist/server/pg-auth-store.js.map +1 -0
- package/dist/server/pg-job-queue.d.ts +60 -0
- package/dist/server/pg-job-queue.d.ts.map +1 -0
- package/dist/server/pg-job-queue.js +365 -0
- package/dist/server/pg-job-queue.js.map +1 -0
- package/dist/server/premium/domain-intel.d.ts +17 -0
- package/dist/server/premium/domain-intel.d.ts.map +1 -0
- package/dist/server/premium/domain-intel.js +134 -0
- package/dist/server/premium/domain-intel.js.map +1 -0
- package/dist/server/premium/index.d.ts +18 -0
- package/dist/server/premium/index.d.ts.map +1 -0
- package/dist/server/premium/index.js +36 -0
- package/dist/server/premium/index.js.map +1 -0
- package/dist/server/premium/swr-cache.d.ts +15 -0
- package/dist/server/premium/swr-cache.d.ts.map +1 -0
- package/dist/server/premium/swr-cache.js +35 -0
- package/dist/server/premium/swr-cache.js.map +1 -0
- package/dist/server/routes/activity.d.ts +7 -0
- package/dist/server/routes/activity.d.ts.map +1 -0
- package/dist/server/routes/activity.js +66 -0
- package/dist/server/routes/activity.js.map +1 -0
- package/dist/server/routes/agent.d.ts +12 -0
- package/dist/server/routes/agent.d.ts.map +1 -0
- package/dist/server/routes/agent.js +356 -0
- package/dist/server/routes/agent.js.map +1 -0
- package/dist/server/routes/answer.d.ts +6 -0
- package/dist/server/routes/answer.d.ts.map +1 -0
- package/dist/server/routes/answer.js +124 -0
- package/dist/server/routes/answer.js.map +1 -0
- package/dist/server/routes/batch.d.ts +7 -0
- package/dist/server/routes/batch.d.ts.map +1 -0
- package/dist/server/routes/batch.js +287 -0
- package/dist/server/routes/batch.js.map +1 -0
- package/dist/server/routes/cli-usage.d.ts +7 -0
- package/dist/server/routes/cli-usage.d.ts.map +1 -0
- package/dist/server/routes/cli-usage.js +121 -0
- package/dist/server/routes/cli-usage.js.map +1 -0
- package/dist/server/routes/compat.d.ts +24 -0
- package/dist/server/routes/compat.d.ts.map +1 -0
- package/dist/server/routes/compat.js +651 -0
- package/dist/server/routes/compat.js.map +1 -0
- package/dist/server/routes/extract.d.ts +9 -0
- package/dist/server/routes/extract.d.ts.map +1 -0
- package/dist/server/routes/extract.js +121 -0
- package/dist/server/routes/extract.js.map +1 -0
- package/dist/server/routes/fetch.d.ts +7 -0
- package/dist/server/routes/fetch.d.ts.map +1 -0
- package/dist/server/routes/fetch.js +537 -0
- package/dist/server/routes/fetch.js.map +1 -0
- package/dist/server/routes/health.d.ts +8 -0
- package/dist/server/routes/health.d.ts.map +1 -0
- package/dist/server/routes/health.js +36 -0
- package/dist/server/routes/health.js.map +1 -0
- package/dist/server/routes/jobs.d.ts +8 -0
- package/dist/server/routes/jobs.d.ts.map +1 -0
- package/dist/server/routes/jobs.js +374 -0
- package/dist/server/routes/jobs.js.map +1 -0
- package/dist/server/routes/mcp.d.ts +16 -0
- package/dist/server/routes/mcp.d.ts.map +1 -0
- package/dist/server/routes/mcp.js +475 -0
- package/dist/server/routes/mcp.js.map +1 -0
- package/dist/server/routes/oauth.d.ts +10 -0
- package/dist/server/routes/oauth.d.ts.map +1 -0
- package/dist/server/routes/oauth.js +296 -0
- package/dist/server/routes/oauth.js.map +1 -0
- package/dist/server/routes/screenshot.d.ts +10 -0
- package/dist/server/routes/screenshot.d.ts.map +1 -0
- package/dist/server/routes/screenshot.js +217 -0
- package/dist/server/routes/screenshot.js.map +1 -0
- package/dist/server/routes/search.d.ts +7 -0
- package/dist/server/routes/search.d.ts.map +1 -0
- package/dist/server/routes/search.js +287 -0
- package/dist/server/routes/search.js.map +1 -0
- package/dist/server/routes/stats.d.ts +7 -0
- package/dist/server/routes/stats.d.ts.map +1 -0
- package/dist/server/routes/stats.js +65 -0
- package/dist/server/routes/stats.js.map +1 -0
- package/dist/server/routes/stripe.d.ts +9 -0
- package/dist/server/routes/stripe.d.ts.map +1 -0
- package/dist/server/routes/stripe.js +233 -0
- package/dist/server/routes/stripe.js.map +1 -0
- package/dist/server/routes/users.d.ts +9 -0
- package/dist/server/routes/users.d.ts.map +1 -0
- package/dist/server/routes/users.js +954 -0
- package/dist/server/routes/users.js.map +1 -0
- package/dist/server/routes/webhooks.d.ts +15 -0
- package/dist/server/routes/webhooks.d.ts.map +1 -0
- package/dist/server/routes/webhooks.js +73 -0
- package/dist/server/routes/webhooks.js.map +1 -0
- package/dist/server/sentry.d.ts +14 -0
- package/dist/server/sentry.d.ts.map +1 -0
- package/dist/server/sentry.js +39 -0
- package/dist/server/sentry.js.map +1 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- 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 @@
|
|
|
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"}
|