@webcrawl/mcp 1.3.8 → 1.3.10

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 (3) hide show
  1. package/README.md +13 -4
  2. package/dist/server.js +12 -10
  3. package/package.json +5 -4
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # @webcrawl/mcp
2
2
 
3
- Model Context Protocol (MCP) server for **[Webcrawl Anything](https://github.com/brainfish-ai/webcrawl-anything)** and **[webcrawl.app](https://webcrawl.app)**.
3
+ Model Context Protocol (MCP) server for **[Webcrawl Anything](https://github.com/brainfish-ai/webcrawl-anything)**.
4
4
 
5
- Gives Claude Code, Cursor, Codex, Windsurf, and Gemini CLI live access to web search, structured verticals (shopping, flights, hotels, real-estate, local business, CVEs), anti-bot page scraping, PDF/Office OCR, and YouTube transcripts.
5
+ Gives Claude Code, Cursor, Codex, Windsurf, and Gemini CLI live access to web search, structured verticals (shopping, flights, hotels, real-estate, local business, CVEs), page reading for JavaScript-heavy sites, and PDF/Office parsing. It runs on your machine with no API key and no account.
6
6
 
7
7
  ## One-Command Agent Setup
8
8
 
@@ -23,14 +23,22 @@ Add to `.cursor/mcp.json`, `~/.claude.json`, or your MCP client config:
23
23
  "command": "npx",
24
24
  "args": ["-y", "@webcrawl/mcp@latest"],
25
25
  "env": {
26
- "WEBCRAWL_MCP_SCHEMA_PROFILE": "compact",
27
- "WEBCRAWL_API_KEY": "wc_live_..."
26
+ "WEBCRAWL_MCP_SCHEMA_PROFILE": "compact"
28
27
  }
29
28
  }
30
29
  }
31
30
  }
32
31
  ```
33
32
 
33
+ ### Optional: webcrawl.app cloud
34
+
35
+ Local mode is the default and needs nothing else. To run the same tools on the hosted service, either:
36
+
37
+ - add `"WEBCRAWL_API_KEY": "wc_live_..."` to `env` above (get a key at [webcrawl.app](https://webcrawl.app)), or
38
+ - connect your client to the hosted endpoint `https://webcrawl.app/mcp` and sign in in the browser. No local install is needed.
39
+
40
+ `WEBCRAWL_MODE` can be `local`, `cloud` or `auto` (default: local unless a key is set).
41
+
34
42
  ### Compact Schema Profile
35
43
 
36
44
  Set `WEBCRAWL_MCP_SCHEMA_PROFILE=compact` (default when installed via `npx webcrawl setup`) to minimize tool schema token usage in context-constrained agents while keeping full server-side validation. Set `WEBCRAWL_MCP_SCHEMA_PROFILE=full` for verbose parameter descriptions.
@@ -44,6 +52,7 @@ Set `WEBCRAWL_MCP_SCHEMA_PROFILE=compact` (default when installed via `npx webcr
44
52
  - `web_crawl` — Crawl up to 25 pages starting from a URL.
45
53
  - `web_extract` — Extract structured JSON from a URL using a prompt or JSON Schema.
46
54
  - `web_rerank` — Rerank candidate documents by relevance to a query.
55
+ - `web_monitor` — Watch a page, URL list or site on a schedule with trigger conditions and email/webhook alerts (cloud only).
47
56
  - `search_categories` — List all supported search categories, subcategories, and filters.
48
57
 
49
58
  ## License
package/dist/server.js CHANGED
@@ -54,7 +54,7 @@ export function createWebcrawlMcpServer(client, versionOrOpts = "0.1.0") {
54
54
  sites: desc(z.array(z.string()).optional(), "Only these domains, e.g. [\"booking.com\"]"),
55
55
  include_content: desc(z.boolean().optional(), "Also fetch page markdown for each result (slower, more credits)"),
56
56
  },
57
- annotations: { readOnlyHint: true, openWorldHint: true },
57
+ annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: true },
58
58
  }, ({ query, category, subcategory, limit, country, city, sites, include_content }) => run(async () => {
59
59
  const res = await client.search({
60
60
  query,
@@ -77,7 +77,7 @@ export function createWebcrawlMcpServer(client, versionOrOpts = "0.1.0") {
77
77
  url: z.string().url(),
78
78
  no_cache: desc(z.boolean().optional(), "Skip cached copy"),
79
79
  },
80
- annotations: { readOnlyHint: true, openWorldHint: true },
80
+ annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: true },
81
81
  }, ({ url, no_cache }) => run(async () => {
82
82
  const res = await client.scrape({ url, formats: ["markdown"], noCache: no_cache });
83
83
  return formatScrape(res) + formatCredits(res);
@@ -94,7 +94,8 @@ export function createWebcrawlMcpServer(client, versionOrOpts = "0.1.0") {
94
94
  language: desc(z.string().max(8).optional(), "Spoken language hint, e.g. en"),
95
95
  background: desc(z.boolean().optional(), "Run as a background job for long files; returns a run id"),
96
96
  },
97
- annotations: { readOnlyHint: true, openWorldHint: true },
97
+ // Not read-only: `background` queues a stateful job. Additive, so not destructive.
98
+ annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },
98
99
  }, ({ url, ocr, pages, language, background }) => run(async () => {
99
100
  const res = await client.parse({ url, ocr, pages, language, async: background });
100
101
  return formatParse(res) + formatCredits(res);
@@ -103,7 +104,7 @@ export function createWebcrawlMcpServer(client, versionOrOpts = "0.1.0") {
103
104
  title: "Check a file read",
104
105
  description: "Check a background web_parse run and return its Markdown when it has finished.",
105
106
  inputSchema: { id: z.string().min(1) },
106
- annotations: { readOnlyHint: true, openWorldHint: false },
107
+ annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false },
107
108
  }, ({ id }) => run(async () => {
108
109
  const res = await client.run(id);
109
110
  const result = res.result && typeof res.result === "object"
@@ -124,7 +125,7 @@ export function createWebcrawlMcpServer(client, versionOrOpts = "0.1.0") {
124
125
  search: desc(z.string().optional(), "Only URLs matching this text"),
125
126
  limit: z.number().int().min(1).max(5000).optional(),
126
127
  },
127
- annotations: { readOnlyHint: true, openWorldHint: true },
128
+ annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: true },
128
129
  }, ({ url, search, limit }) => run(async () => {
129
130
  const res = await client.map({ url, search, limit });
130
131
  return formatMap(res) + formatCredits(res);
@@ -138,7 +139,7 @@ export function createWebcrawlMcpServer(client, versionOrOpts = "0.1.0") {
138
139
  url: z.string().url(),
139
140
  max_pages: desc(z.number().int().min(1).max(25).optional(), "Default 5"),
140
141
  },
141
- annotations: { readOnlyHint: true, openWorldHint: true },
142
+ annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: true },
142
143
  }, ({ url, max_pages }) => run(async () => {
143
144
  const res = await client.crawl({ url, maxPages: max_pages });
144
145
  return formatCrawl(res) + formatCredits(res);
@@ -153,7 +154,7 @@ export function createWebcrawlMcpServer(client, versionOrOpts = "0.1.0") {
153
154
  prompt: z.string().optional(),
154
155
  schema: desc(z.record(z.string(), z.any()).optional(), "JSON Schema for the output"),
155
156
  },
156
- annotations: { readOnlyHint: true, openWorldHint: true },
157
+ annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: true },
157
158
  }, ({ url, prompt, schema }) => run(async () => {
158
159
  const res = await client.extract({ url, prompt, schema });
159
160
  return JSON.stringify(res.data ?? res, null, 2) + formatCredits(res);
@@ -168,7 +169,7 @@ export function createWebcrawlMcpServer(client, versionOrOpts = "0.1.0") {
168
169
  documents: z.array(z.string()).min(1).max(200),
169
170
  top_k: z.number().int().min(1).optional(),
170
171
  },
171
- annotations: { readOnlyHint: true, openWorldHint: false },
172
+ annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false },
172
173
  }, ({ query, documents, top_k }) => run(async () => {
173
174
  const res = await client.rerank({ query, documents, topK: top_k });
174
175
  const items = Array.isArray(res.results)
@@ -203,7 +204,8 @@ export function createWebcrawlMcpServer(client, versionOrOpts = "0.1.0") {
203
204
  notify_email: desc(z.string().optional(), "Email address to notify when triggered, or 'true' to use the account email"),
204
205
  webhook_url: desc(z.string().url().optional(), "HTTPS webhook URL to POST when triggered"),
205
206
  },
206
- annotations: { readOnlyHint: false, openWorldHint: true },
207
+ // Destructive: the `delete` action removes a monitor and its history.
208
+ annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
207
209
  }, ({ action, id, url, urls, mode, max_pages, name, interval_minutes, watch_for, condition, notify_email, webhook_url, }) => run(async () => {
208
210
  const effectiveAction = action ?? (url || (urls && urls.length) ? "create" : "list");
209
211
  const requireId = (op) => {
@@ -284,7 +286,7 @@ export function createWebcrawlMcpServer(client, versionOrOpts = "0.1.0") {
284
286
  title: "Search categories",
285
287
  description: "List the search categories, subcategories and filters web_search supports.",
286
288
  inputSchema: {},
287
- annotations: { readOnlyHint: true, openWorldHint: false },
289
+ annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false },
288
290
  }, () => run(async () => JSON.stringify(await client.categories(), null, 2)));
289
291
  return server;
290
292
  }
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "@webcrawl/mcp",
3
- "version": "1.3.8",
4
- "description": "MCP server for Webcrawl Anything — zero-key local engine or webcrawl.app cloud (search, scrape, parse PDF/Office/YouTube, map, crawl, extract, rerank)",
3
+ "version": "1.3.10",
4
+ "mcpName": "io.github.brainfish-ai/webcrawl",
5
+ "description": "MCP server for Webcrawl Anything: search, scrape, map, crawl, parse and monitor the web from your agent. Runs locally with no API key, or on webcrawl.app cloud.",
5
6
  "type": "module",
6
7
  "license": "MIT",
7
8
  "author": "Brainfish AI <support@webcrawl.app> (https://webcrawl.app)",
8
- "homepage": "https://webcrawl.app",
9
+ "homepage": "https://github.com/brainfish-ai/webcrawl-anything#readme",
9
10
  "repository": {
10
11
  "type": "git",
11
12
  "url": "git+https://github.com/brainfish-ai/webcrawl-anything.git",
@@ -52,7 +53,7 @@
52
53
  },
53
54
  "dependencies": {
54
55
  "@modelcontextprotocol/sdk": "^1.32.2",
55
- "@webcrawl/client": "^1.3.8",
56
+ "@webcrawl/client": "^1.3.10",
56
57
  "zod": "^4.0.0"
57
58
  },
58
59
  "engines": {