firecrawl-mcp 3.27.3 → 3.28.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.
- package/README.md +31 -3
- package/dist/index.js +358 -283
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -37,7 +37,7 @@ A Model Context Protocol (MCP) server that brings [Firecrawl](https://github.com
|
|
|
37
37
|
- Use `firecrawl_credit_usage` to check credits left or monthly consumption, optionally broken down by API key.
|
|
38
38
|
- Consider something else when you need to hold a browser session open across many of your own steps with your own retry and termination logic: each `firecrawl_interact` call runs one `prompt` or `code` turn to completion and returns control — the session can persist across calls via `scrapeId` and ends with `firecrawl_interact_stop`, but you cannot drive it interactively step-by-step from the client side within a single call.
|
|
39
39
|
|
|
40
|
-
This server lists
|
|
40
|
+
This server lists 27 tools when the full profile registers with default settings (feedback tools included, not running in local-keyless mode). Setting `FIRECRAWL_NO_SEARCH_FEEDBACK=1` and/or `FIRECRAWL_NO_ENDPOINT_FEEDBACK=1` removes the corresponding feedback tools and reduces this count, as does local keyless startup. For clients with a tool-slot limit: the hosted keyless endpoint (`https://mcp.firecrawl.dev/v2/mcp`, no API key) exposes only 3 — `firecrawl_scrape`, `firecrawl_search`, `firecrawl_parse` — and the dedicated [search-only endpoint](#search-only-endpoint) (`https://mcp.firecrawl.dev/v2/mcp-search`) exposes a fixed set of 9 tools (search, developer, government, and research search, plus Alexandria catalogue lookup and execution).
|
|
41
41
|
|
|
42
42
|
## Installation
|
|
43
43
|
|
|
@@ -81,7 +81,7 @@ A fixed-scope search surface is also hosted at:
|
|
|
81
81
|
https://mcp.firecrawl.dev/v2/mcp-search
|
|
82
82
|
```
|
|
83
83
|
|
|
84
|
-
It exposes a fixed set of
|
|
84
|
+
It exposes a fixed set of nine tools: `firecrawl_search`, `firecrawl_developer_search`, `firecrawl_gov_search`, the four `firecrawl_research_*` tools, and the two Alexandria tools `firecrawl_find_tools` and `firecrawl_scrape`. Its `firecrawl_search` fetches no page content, and the surface has its own OAuth identity; the full endpoint above is unchanged. It backs a published connector listing, so its tool set is a contract rather than a profile to tune. See [docs/search-profile.md](docs/search-profile.md) for the full contract and what a change to it involves.
|
|
85
85
|
|
|
86
86
|
For packaged MCP workflows in ChatGPT, Codex, or Claude Code, see
|
|
87
87
|
[MCP plugin packages](plugins/README.md).
|
|
@@ -308,6 +308,7 @@ Use this guide to select the right tool for your task:
|
|
|
308
308
|
- **If you need to discover URLs on a site:** use **map**
|
|
309
309
|
- **If you want to search the web for info:** use **search**
|
|
310
310
|
- **If you have a programming question** (a library, an API contract, an error message, a known bug): use **developer search**
|
|
311
|
+
- **If you have a legal or regulatory question** (a statute, regulation, code, court opinion, or other US government publication): use the **Firecrawl Government Index**
|
|
311
312
|
- **If you need scientific papers** (biomedical, life-science, clinical, or arXiv literature): use **research tools** — they search paper abstracts and full text. `search` with `categories: ["research"]` is a different thing: a website filter over ordinary web results.
|
|
312
313
|
- **If you need multi-source research that returns structured data, do not know the URLs, or the answer spans several sites** (an entity plus its fields, a list, a dataset): use **agent**
|
|
313
314
|
- **If you want to analyze a whole site or section:** use **crawl** (with limits!)
|
|
@@ -326,6 +327,7 @@ Use this guide to select the right tool for your task:
|
|
|
326
327
|
| search | Web search for info | results[] |
|
|
327
328
|
| find_tools | Alexandria catalogue browsing and URL lookup | providers, tool contracts and nextTool navigation |
|
|
328
329
|
| developer | Programming questions over developer sources | results[] with passages |
|
|
330
|
+
| gov | US primary law and regulatory material | results[] with snippets |
|
|
329
331
|
| agent | Multi-source research, unknown or many sites | JSON (structured data) |
|
|
330
332
|
| monitor | Recurring page checks | monitor/check metadata and diffs |
|
|
331
333
|
| research | Paper and GitHub repository research | research results and repo matches |
|
|
@@ -419,7 +421,7 @@ Scrape content from a single URL with advanced options.
|
|
|
419
421
|
|
|
420
422
|
**Branding format:** Extracts comprehensive brand identity (colors, fonts, typography, spacing, logo, UI components) for design analysis or style replication.
|
|
421
423
|
**Privacy:** Set `redactPII: true` to return content with personally identifiable information redacted.
|
|
422
|
-
**Hosted server:** On the hosted server (`CLOUD_SERVICE=true`) scrape is read-only. It takes no browser `actions` and cannot accept provider terms. A named `profile` loads saved browser state without saving changes to it. An organization admin accepts terms in the dashboard.
|
|
424
|
+
**Hosted server:** On the hosted server (`CLOUD_SERVICE=true`) scrape is read-only. It takes no browser `actions` and cannot accept provider terms. A named `profile` loads saved browser state without saving changes to it, and the full endpoint's `firecrawl_search` treats `scrapeOptions.profile` the same way. To save browser state to a profile, open the page with `firecrawl_interact` (see below). An organization admin accepts terms in the dashboard.
|
|
423
425
|
|
|
424
426
|
**Returns:**
|
|
425
427
|
|
|
@@ -867,6 +869,7 @@ Interact with a fresh URL or with a page that was already opened by `firecrawl_s
|
|
|
867
869
|
|
|
868
870
|
- Pass `url` to scrape and open a page for interaction in one MCP call.
|
|
869
871
|
- Pass `scrapeId` to continue interacting with an existing scraped page.
|
|
872
|
+
- To save browser state (cookies, localStorage) to a named profile, pass `url` with `scrapeOptions: { "profile": { "name": "my-profile", "saveChanges": true } }`. The state is saved when `firecrawl_interact_stop` ends the session.
|
|
870
873
|
- Pass exactly one of `url` or `scrapeId`, plus either `prompt` or `code`.
|
|
871
874
|
|
|
872
875
|
**Usage Example:**
|
|
@@ -1009,6 +1012,31 @@ Search an index built for coding agents. The index covers GitHub issues, merged
|
|
|
1009
1012
|
|
|
1010
1013
|
`firecrawl_search` with `categories: ["developer"]` searches the same index beside the web results. Use this tool instead when you want the matched passages, the `skills` filter, or no web results in the response. The search-only endpoint exposes both tools, and the same choice applies there.
|
|
1011
1014
|
|
|
1015
|
+
### 14b. Government Index Search Tool (`firecrawl_gov_search`)
|
|
1016
|
+
|
|
1017
|
+
Search primary law and regulatory material from US federal, state, and local government sources: statutes, regulations, codes, court opinions, and other government publications.
|
|
1018
|
+
|
|
1019
|
+
**Best for:** A legal or regulatory question that needs the governing text or an official government source.
|
|
1020
|
+
|
|
1021
|
+
**Arguments:**
|
|
1022
|
+
|
|
1023
|
+
```json
|
|
1024
|
+
{
|
|
1025
|
+
"name": "firecrawl_gov_search",
|
|
1026
|
+
"arguments": {
|
|
1027
|
+
"query": "federal food labeling requirements for allergens",
|
|
1028
|
+
"k": 10
|
|
1029
|
+
}
|
|
1030
|
+
}
|
|
1031
|
+
```
|
|
1032
|
+
|
|
1033
|
+
- `query` (required): the legal or regulatory question or search phrase.
|
|
1034
|
+
- `k`: number of ranked results. The default is 10 and the maximum is 100.
|
|
1035
|
+
|
|
1036
|
+
**Returns:** Ranked results. Each result carries a position, a title, a URL, and the matched snippet. The search-only endpoint exposes this tool too.
|
|
1037
|
+
|
|
1038
|
+
`firecrawl_search` with `categories: ["gov"]` searches the same sources and returns the hits in `data.web` with `category: "gov"`. The `gov` category cannot be combined with other categories.
|
|
1039
|
+
|
|
1012
1040
|
### 15. Alexandria Tools
|
|
1013
1041
|
|
|
1014
1042
|
Firecrawl Alexandria is a catalogue of data providers reachable through the Firecrawl API with a Firecrawl API key on a team with Alexandria access. Keyless sessions (hosted or local) get `Alexandria requires an API key on a team with Alexandria access`; Alexandria discovery tools are not listed for hosted keyless sessions.
|
package/dist/index.js
CHANGED
|
@@ -2073,7 +2073,7 @@ import { readFile } from "fs/promises";
|
|
|
2073
2073
|
import { createRequire as createRequire2 } from "module";
|
|
2074
2074
|
import { randomUUID } from "crypto";
|
|
2075
2075
|
import path from "path";
|
|
2076
|
-
import { z as
|
|
2076
|
+
import { z as z11 } from "zod";
|
|
2077
2077
|
|
|
2078
2078
|
// src/agent-hints.ts
|
|
2079
2079
|
var AGENT_HINTS_HEADERS = { "X-Firecrawl-Agent-Hints": "true" };
|
|
@@ -2420,6 +2420,17 @@ var developerSearchOutputSchema = z4.object({
|
|
|
2420
2420
|
})
|
|
2421
2421
|
).describe("Ranked results, in the order the text block lists them.")
|
|
2422
2422
|
}).describe("Ranked developer-index results with their matched passages.");
|
|
2423
|
+
var govSearchOutputSchema = z4.object({
|
|
2424
|
+
...agentHints,
|
|
2425
|
+
results: z4.array(
|
|
2426
|
+
z4.looseObject({
|
|
2427
|
+
url: str("Source URL."),
|
|
2428
|
+
title: str("Result title."),
|
|
2429
|
+
description: str("Matched snippet."),
|
|
2430
|
+
position: num("Rank of the result, starting at 1.")
|
|
2431
|
+
})
|
|
2432
|
+
).describe("Ranked results, in the order the text block lists them.")
|
|
2433
|
+
}).describe("Ranked Government Index results with their matched snippets.");
|
|
2423
2434
|
var creditUsageOutputSchema = z4.object({
|
|
2424
2435
|
// Current view.
|
|
2425
2436
|
remainingCredits: num("Credits left in the current billing period; can exceed `planCredits` when extra credits were purchased or granted."),
|
|
@@ -2664,6 +2675,59 @@ Returns ranked results with an ID, source type, URL, title, and the matched pass
|
|
|
2664
2675
|
});
|
|
2665
2676
|
}
|
|
2666
2677
|
|
|
2678
|
+
// src/gov.ts
|
|
2679
|
+
import { z as z7 } from "zod";
|
|
2680
|
+
var BASE2 = "/v2/search/gov";
|
|
2681
|
+
function fmtGov(results) {
|
|
2682
|
+
if (!results || results.length === 0) return "(no results)";
|
|
2683
|
+
return results.map((r, i) => {
|
|
2684
|
+
const lines = [`## ${r.position ?? i + 1}. ${r.title ?? "(untitled)"}`];
|
|
2685
|
+
if (r.url) lines.push(r.url);
|
|
2686
|
+
if (r.description) lines.push(r.description);
|
|
2687
|
+
return lines.join("\n");
|
|
2688
|
+
}).join("\n\n");
|
|
2689
|
+
}
|
|
2690
|
+
function registerGovTools(server2, getClient2) {
|
|
2691
|
+
server2.addTool({
|
|
2692
|
+
name: "firecrawl_gov_search",
|
|
2693
|
+
annotations: {
|
|
2694
|
+
title: "Firecrawl Government Index search",
|
|
2695
|
+
readOnlyHint: true,
|
|
2696
|
+
openWorldHint: true,
|
|
2697
|
+
destructiveHint: false
|
|
2698
|
+
},
|
|
2699
|
+
description: `
|
|
2700
|
+
Search an index of primary law and regulatory material from US federal, state, and local government sources (statutes, regulations, codes, court opinions, and other government publications) for legal or regulatory questions that need the governing text or an official source.
|
|
2701
|
+
|
|
2702
|
+
Returns ranked results with a position, title, URL, and matched snippet.
|
|
2703
|
+
`,
|
|
2704
|
+
outputSchema: govSearchOutputSchema,
|
|
2705
|
+
parameters: z7.object({
|
|
2706
|
+
query: z7.string().min(1).describe(
|
|
2707
|
+
"Natural-language legal or regulatory question or search phrase, including the jurisdiction, agency, or citation when relevant."
|
|
2708
|
+
),
|
|
2709
|
+
k: z7.number().int().min(1).max(100).optional().describe("Number of ranked results to return (default 10).")
|
|
2710
|
+
}),
|
|
2711
|
+
execute: async (args2, { session, client: mcpClient }) => {
|
|
2712
|
+
const { query, k } = args2;
|
|
2713
|
+
const params = new URLSearchParams();
|
|
2714
|
+
params.append("query", query);
|
|
2715
|
+
if (k != null) params.append("k", String(k));
|
|
2716
|
+
const client = getClient2(session);
|
|
2717
|
+
const res = await client.http.get(
|
|
2718
|
+
`${BASE2}?${params.toString()}`,
|
|
2719
|
+
originHeaders(requestOrigin(mcpClient, session))
|
|
2720
|
+
);
|
|
2721
|
+
const results = res.data?.data?.web ?? [];
|
|
2722
|
+
return withAgentHints(
|
|
2723
|
+
withStructured(fmtGov(results), { results }),
|
|
2724
|
+
res.data,
|
|
2725
|
+
true
|
|
2726
|
+
);
|
|
2727
|
+
}
|
|
2728
|
+
});
|
|
2729
|
+
}
|
|
2730
|
+
|
|
2667
2731
|
// src/keyless-client-ip.ts
|
|
2668
2732
|
import net from "net";
|
|
2669
2733
|
function extractSingleTrustedClientIp(rawForwardedFor) {
|
|
@@ -2711,7 +2775,7 @@ function checkKeylessSignupUrl(value) {
|
|
|
2711
2775
|
}
|
|
2712
2776
|
|
|
2713
2777
|
// src/monitor.ts
|
|
2714
|
-
import { z as
|
|
2778
|
+
import { z as z8 } from "zod";
|
|
2715
2779
|
|
|
2716
2780
|
// src/session-credential.ts
|
|
2717
2781
|
import { createHmac } from "crypto";
|
|
@@ -2845,8 +2909,8 @@ async function monitorRequest(session, origin, path2, init = {}) {
|
|
|
2845
2909
|
function monitorResult(data) {
|
|
2846
2910
|
return withAgentHints(structuredText(data), data);
|
|
2847
2911
|
}
|
|
2848
|
-
var pageStatusSchema =
|
|
2849
|
-
var checkStatusSchema =
|
|
2912
|
+
var pageStatusSchema = z8.enum(["same", "new", "changed", "removed", "error"]);
|
|
2913
|
+
var checkStatusSchema = z8.enum([
|
|
2850
2914
|
"queued",
|
|
2851
2915
|
"running",
|
|
2852
2916
|
"completed",
|
|
@@ -2940,22 +3004,22 @@ Create a recurring scrape, crawl, or search monitor that compares each check wit
|
|
|
2940
3004
|
In the simple form, a \`goal\` is required. If \`queries\` contains one or more non-empty values and is supplied with \`page\`/\`pages\`, \`queries\` create the search target and page targets are ignored. A monitor schedules future network checks and can send configured email or webhook notifications. Returns the created monitor.
|
|
2941
3005
|
`,
|
|
2942
3006
|
outputSchema: monitorOutputSchema,
|
|
2943
|
-
parameters:
|
|
2944
|
-
body:
|
|
2945
|
-
page:
|
|
2946
|
-
pages:
|
|
2947
|
-
queries:
|
|
2948
|
-
searchWindow:
|
|
2949
|
-
maxResults:
|
|
2950
|
-
includeDomains:
|
|
2951
|
-
excludeDomains:
|
|
2952
|
-
goal:
|
|
2953
|
-
name:
|
|
2954
|
-
scheduleText:
|
|
2955
|
-
timezone:
|
|
2956
|
-
email:
|
|
2957
|
-
includeDiffs:
|
|
2958
|
-
webhookUrl:
|
|
3007
|
+
parameters: z8.object({
|
|
3008
|
+
body: z8.record(z8.string(), z8.any()).optional(),
|
|
3009
|
+
page: z8.string().optional(),
|
|
3010
|
+
pages: z8.array(z8.string()).optional(),
|
|
3011
|
+
queries: z8.array(z8.string()).optional(),
|
|
3012
|
+
searchWindow: z8.enum(["5m", "15m", "1h", "6h", "24h", "7d"]).optional(),
|
|
3013
|
+
maxResults: z8.number().int().min(1).max(50).optional(),
|
|
3014
|
+
includeDomains: z8.array(z8.string()).optional(),
|
|
3015
|
+
excludeDomains: z8.array(z8.string()).optional(),
|
|
3016
|
+
goal: z8.string().optional(),
|
|
3017
|
+
name: z8.string().optional(),
|
|
3018
|
+
scheduleText: z8.string().optional(),
|
|
3019
|
+
timezone: z8.string().optional(),
|
|
3020
|
+
email: z8.string().optional(),
|
|
3021
|
+
includeDiffs: z8.boolean().optional(),
|
|
3022
|
+
webhookUrl: z8.string().optional()
|
|
2959
3023
|
}),
|
|
2960
3024
|
execute: async (args2, { session, log, client: mcpClient }) => {
|
|
2961
3025
|
const body = buildMonitorCreateBody(args2);
|
|
@@ -2987,9 +3051,9 @@ In the simple form, a \`goal\` is required. If \`queries\` contains one or more
|
|
|
2987
3051
|
List monitors for the authenticated account with optional pagination controls. Returns one page of monitor records and pagination metadata.
|
|
2988
3052
|
`,
|
|
2989
3053
|
outputSchema: monitorListOutputSchema,
|
|
2990
|
-
parameters:
|
|
2991
|
-
limit:
|
|
2992
|
-
offset:
|
|
3054
|
+
parameters: z8.object({
|
|
3055
|
+
limit: z8.number().int().positive().optional(),
|
|
3056
|
+
offset: z8.number().int().nonnegative().optional()
|
|
2993
3057
|
}),
|
|
2994
3058
|
execute: async (args2, { session, client: mcpClient }) => {
|
|
2995
3059
|
const { limit, offset } = args2;
|
|
@@ -3019,7 +3083,7 @@ List monitors for the authenticated account with optional pagination controls. R
|
|
|
3019
3083
|
Retrieve one monitor by ID, including its configuration and current state. This does not run or modify the monitor.
|
|
3020
3084
|
`,
|
|
3021
3085
|
outputSchema: monitorOutputSchema,
|
|
3022
|
-
parameters:
|
|
3086
|
+
parameters: z8.object({ id: z8.string() }),
|
|
3023
3087
|
execute: async (args2, { session, client: mcpClient }) => {
|
|
3024
3088
|
const { id } = args2;
|
|
3025
3089
|
const res = await monitorRequest(
|
|
@@ -3047,9 +3111,9 @@ Patch an existing monitor by ID. The body can change its name, active/paused sta
|
|
|
3047
3111
|
Returns the updated monitor.
|
|
3048
3112
|
`,
|
|
3049
3113
|
outputSchema: monitorOutputSchema,
|
|
3050
|
-
parameters:
|
|
3051
|
-
id:
|
|
3052
|
-
body:
|
|
3114
|
+
parameters: z8.object({
|
|
3115
|
+
id: z8.string(),
|
|
3116
|
+
body: z8.record(z8.string(), z8.any())
|
|
3053
3117
|
}),
|
|
3054
3118
|
execute: async (args2, { session, client: mcpClient }) => {
|
|
3055
3119
|
const { id, body } = args2;
|
|
@@ -3077,7 +3141,7 @@ Returns the updated monitor.
|
|
|
3077
3141
|
Permanently delete a monitor by ID and stop its future schedule. This operation cannot be undone and returns deletion status.
|
|
3078
3142
|
`,
|
|
3079
3143
|
outputSchema: monitorDeleteOutputSchema,
|
|
3080
|
-
parameters:
|
|
3144
|
+
parameters: z8.object({ id: z8.string() }),
|
|
3081
3145
|
execute: async (args2, { session, log, client: mcpClient }) => {
|
|
3082
3146
|
const { id } = args2;
|
|
3083
3147
|
log.info("Deleting monitor", { id });
|
|
@@ -3105,7 +3169,7 @@ Permanently delete a monitor by ID and stop its future schedule. This operation
|
|
|
3105
3169
|
Queue an immediate check for a monitor outside its normal schedule. This starts network work for the monitor's configured targets and returns the queued check.
|
|
3106
3170
|
`,
|
|
3107
3171
|
outputSchema: monitorRunOutputSchema,
|
|
3108
|
-
parameters:
|
|
3172
|
+
parameters: z8.object({ id: z8.string() }),
|
|
3109
3173
|
execute: async (args2, { session, client: mcpClient }) => {
|
|
3110
3174
|
const { id } = args2;
|
|
3111
3175
|
const res = await monitorRequest(
|
|
@@ -3132,10 +3196,10 @@ Queue an immediate check for a monitor outside its normal schedule. This starts
|
|
|
3132
3196
|
List historical checks for a monitor, optionally filtered by status and bounded by a result limit. Returns one page of check summaries and pagination metadata.
|
|
3133
3197
|
`,
|
|
3134
3198
|
outputSchema: monitorChecksOutputSchema,
|
|
3135
|
-
parameters:
|
|
3136
|
-
id:
|
|
3137
|
-
limit:
|
|
3138
|
-
offset:
|
|
3199
|
+
parameters: z8.object({
|
|
3200
|
+
id: z8.string(),
|
|
3201
|
+
limit: z8.number().int().positive().optional(),
|
|
3202
|
+
offset: z8.number().int().nonnegative().optional(),
|
|
3139
3203
|
status: checkStatusSchema.optional()
|
|
3140
3204
|
}),
|
|
3141
3205
|
execute: async (args2, { session, client: mcpClient }) => {
|
|
@@ -3166,11 +3230,11 @@ Retrieve one monitor check and its page-level results, optionally filtered by pa
|
|
|
3166
3230
|
Markdown tracking returns a unified text diff, JSON tracking returns field paths with previous/current values and a current snapshot, and mixed tracking returns both. Returns one page of results plus a \`next\` URL when more pages exist.
|
|
3167
3231
|
`,
|
|
3168
3232
|
outputSchema: monitorCheckOutputSchema,
|
|
3169
|
-
parameters:
|
|
3170
|
-
id:
|
|
3171
|
-
checkId:
|
|
3172
|
-
limit:
|
|
3173
|
-
skip:
|
|
3233
|
+
parameters: z8.object({
|
|
3234
|
+
id: z8.string(),
|
|
3235
|
+
checkId: z8.string(),
|
|
3236
|
+
limit: z8.number().int().positive().optional(),
|
|
3237
|
+
skip: z8.number().int().nonnegative().optional(),
|
|
3174
3238
|
pageStatus: pageStatusSchema.optional()
|
|
3175
3239
|
}),
|
|
3176
3240
|
execute: async (args2, { session, client: mcpClient }) => {
|
|
@@ -3187,8 +3251,8 @@ Markdown tracking returns a unified text diff, JSON tracking returns field paths
|
|
|
3187
3251
|
}
|
|
3188
3252
|
|
|
3189
3253
|
// src/research.ts
|
|
3190
|
-
import { z as
|
|
3191
|
-
var
|
|
3254
|
+
import { z as z9 } from "zod";
|
|
3255
|
+
var BASE3 = "/v2/search/research";
|
|
3192
3256
|
function researchHeaders(origin) {
|
|
3193
3257
|
return { ...originHeaders(origin), ...AGENT_HINTS_HEADERS };
|
|
3194
3258
|
}
|
|
@@ -3306,21 +3370,21 @@ Several distinct framings of the same question surface different papers than a s
|
|
|
3306
3370
|
Returns ranked papers with canonical IDs, titles, authors, and abstracts.
|
|
3307
3371
|
`,
|
|
3308
3372
|
outputSchema: researchSearchOutputSchema,
|
|
3309
|
-
parameters:
|
|
3310
|
-
query:
|
|
3373
|
+
parameters: z9.object({
|
|
3374
|
+
query: z9.string().min(1).describe(
|
|
3311
3375
|
"Natural-language research topic or question, including methods, systems, conditions, populations, interventions, or outcomes when relevant."
|
|
3312
3376
|
),
|
|
3313
|
-
k:
|
|
3314
|
-
authors:
|
|
3377
|
+
k: z9.number().int().min(1).max(500).optional().describe("Number of ranked papers to return (default 40)."),
|
|
3378
|
+
authors: z9.array(z9.string()).optional().describe(
|
|
3315
3379
|
"Author substring filter(s); ALL must match (case-insensitive)."
|
|
3316
3380
|
),
|
|
3317
|
-
categories:
|
|
3381
|
+
categories: z9.array(z9.string()).optional().describe(
|
|
3318
3382
|
"Paper category filter(s) (e.g. `cs.LG`); ALL provided values must match."
|
|
3319
3383
|
),
|
|
3320
|
-
from:
|
|
3384
|
+
from: z9.string().optional().describe(
|
|
3321
3385
|
"Inclusive lower bound on created/updated date (`YYYY-MM-DD`)."
|
|
3322
3386
|
),
|
|
3323
|
-
to:
|
|
3387
|
+
to: z9.string().optional().describe(
|
|
3324
3388
|
"Inclusive upper bound on created/updated date (`YYYY-MM-DD`)."
|
|
3325
3389
|
)
|
|
3326
3390
|
}),
|
|
@@ -3335,7 +3399,7 @@ Returns ranked papers with canonical IDs, titles, authors, and abstracts.
|
|
|
3335
3399
|
appendParam(params, "to", to);
|
|
3336
3400
|
const client = getClient2(session);
|
|
3337
3401
|
const res = await client.http.get(
|
|
3338
|
-
withQuery(`${
|
|
3402
|
+
withQuery(`${BASE3}/papers`, params),
|
|
3339
3403
|
researchHeaders(requestOrigin(mcpClient, session))
|
|
3340
3404
|
);
|
|
3341
3405
|
const results = res.data?.results ?? [];
|
|
@@ -3357,8 +3421,8 @@ Returns ranked papers with canonical IDs, titles, authors, and abstracts.
|
|
|
3357
3421
|
Retrieve canonical metadata for one paper ID, such as an arXiv, PMC, PMID, or DOI identifier. Returns the title, abstract, authors, categories, source IDs, and dates as markdown.
|
|
3358
3422
|
`,
|
|
3359
3423
|
outputSchema: researchPaperOutputSchema,
|
|
3360
|
-
parameters:
|
|
3361
|
-
paperId:
|
|
3424
|
+
parameters: z9.object({
|
|
3425
|
+
paperId: z9.string().min(1).describe(
|
|
3362
3426
|
"Canonical paperId or primaryId such as `arxiv:1706.03762`, `pmcid:PMC12530322`, `pmid:40953549`, or `doi:10.1016/j.neunet.2025.108095`."
|
|
3363
3427
|
)
|
|
3364
3428
|
}),
|
|
@@ -3366,7 +3430,7 @@ Retrieve canonical metadata for one paper ID, such as an arXiv, PMC, PMID, or DO
|
|
|
3366
3430
|
const { paperId } = args2;
|
|
3367
3431
|
const client = getClient2(session);
|
|
3368
3432
|
const res = await client.http.get(
|
|
3369
|
-
`${
|
|
3433
|
+
`${BASE3}/papers/${encodeURIComponent(paperId)}`,
|
|
3370
3434
|
researchHeaders(requestOrigin(mcpClient, session))
|
|
3371
3435
|
);
|
|
3372
3436
|
const paper = res.data?.paper;
|
|
@@ -3393,12 +3457,12 @@ Find citation-graph candidates from one to ten \`seed_ids\`; the first ID is the
|
|
|
3393
3457
|
Returns ranked candidates and the evaluated pool size.
|
|
3394
3458
|
`,
|
|
3395
3459
|
outputSchema: researchRelatedOutputSchema,
|
|
3396
|
-
parameters:
|
|
3397
|
-
seed_ids:
|
|
3398
|
-
intent:
|
|
3399
|
-
mode:
|
|
3400
|
-
k:
|
|
3401
|
-
rerank:
|
|
3460
|
+
parameters: z9.object({
|
|
3461
|
+
seed_ids: z9.array(z9.string()).min(1).max(10),
|
|
3462
|
+
intent: z9.string().min(1),
|
|
3463
|
+
mode: z9.enum(["similar", "citers", "references"]).optional(),
|
|
3464
|
+
k: z9.number().int().min(1).max(500).optional(),
|
|
3465
|
+
rerank: z9.boolean().optional().describe("Apply an additional rerank over the fused candidates.")
|
|
3402
3466
|
}),
|
|
3403
3467
|
execute: async (args2, { session, client: mcpClient }) => {
|
|
3404
3468
|
const { seed_ids, intent, mode, k, rerank } = args2;
|
|
@@ -3412,7 +3476,7 @@ Returns ranked candidates and the evaluated pool size.
|
|
|
3412
3476
|
const client = getClient2(session);
|
|
3413
3477
|
const res = await client.http.get(
|
|
3414
3478
|
withQuery(
|
|
3415
|
-
`${
|
|
3479
|
+
`${BASE3}/papers/${encodeURIComponent(primary)}/similar`,
|
|
3416
3480
|
params
|
|
3417
3481
|
),
|
|
3418
3482
|
researchHeaders(requestOrigin(mcpClient, session))
|
|
@@ -3445,12 +3509,12 @@ Retrieve in-body passages from one paper that are relevant to a specific questio
|
|
|
3445
3509
|
Returns matching passages or a notice when full text is unavailable.
|
|
3446
3510
|
`,
|
|
3447
3511
|
outputSchema: researchReadOutputSchema,
|
|
3448
|
-
parameters:
|
|
3449
|
-
paperId:
|
|
3512
|
+
parameters: z9.object({
|
|
3513
|
+
paperId: z9.string().min(1).describe(
|
|
3450
3514
|
"Canonical paperId or primaryId such as `arxiv:1706.03762`, `pmcid:PMC12530322`, `pmid:40953549`, or `doi:10.1016/j.neunet.2025.108095`."
|
|
3451
3515
|
),
|
|
3452
|
-
question:
|
|
3453
|
-
k:
|
|
3516
|
+
question: z9.string().min(1),
|
|
3517
|
+
k: z9.number().int().min(1).max(50).optional().describe("Number of passages to return (default 4).")
|
|
3454
3518
|
}),
|
|
3455
3519
|
execute: async (args2, { session, client: mcpClient }) => {
|
|
3456
3520
|
const { paperId, question, k } = args2;
|
|
@@ -3459,7 +3523,7 @@ Returns matching passages or a notice when full text is unavailable.
|
|
|
3459
3523
|
appendParam(params, "k", k);
|
|
3460
3524
|
const client = getClient2(session);
|
|
3461
3525
|
const res = await client.http.get(
|
|
3462
|
-
withQuery(`${
|
|
3526
|
+
withQuery(`${BASE3}/papers/${encodeURIComponent(paperId)}`, params),
|
|
3463
3527
|
researchHeaders(requestOrigin(mcpClient, session))
|
|
3464
3528
|
);
|
|
3465
3529
|
const passages = res.data?.passages ?? [];
|
|
@@ -3481,9 +3545,9 @@ Returns matching passages or a notice when full text is unavailable.
|
|
|
3481
3545
|
Deprecated compatibility entry point. Use firecrawl_developer_search for GitHub issues, pull requests, and READMEs, plus code documentation, returned as matched passages.
|
|
3482
3546
|
`,
|
|
3483
3547
|
outputSchema: deprecatedToolOutputSchema,
|
|
3484
|
-
parameters:
|
|
3485
|
-
query:
|
|
3486
|
-
k:
|
|
3548
|
+
parameters: z9.object({
|
|
3549
|
+
query: z9.string().min(1),
|
|
3550
|
+
k: z9.number().int().min(1).max(100).optional()
|
|
3487
3551
|
}),
|
|
3488
3552
|
canList: () => false,
|
|
3489
3553
|
beforeValidate: () => {
|
|
@@ -3502,7 +3566,7 @@ Deprecated compatibility entry point. Use firecrawl_developer_search for GitHub
|
|
|
3502
3566
|
}
|
|
3503
3567
|
|
|
3504
3568
|
// src/usage.ts
|
|
3505
|
-
import { z as
|
|
3569
|
+
import { z as z10 } from "zod";
|
|
3506
3570
|
function assertSuccessful(status, response, operation) {
|
|
3507
3571
|
if (status === 200 && response.success) return;
|
|
3508
3572
|
throw new Error(response.error || `Failed to ${operation}`);
|
|
@@ -3524,11 +3588,11 @@ The current view returns \`remainingCredits\`, \`planCredits\`, \`billingPeriodS
|
|
|
3524
3588
|
The historical view returns periods sorted by start date with \`startDate\`, \`endDate\`, and \`creditsUsed\`. Set \`byApiKey\` to include separate periods per API key, identified by the optional \`apiKey\` field. The newest period's \`endDate\` can be null.
|
|
3525
3589
|
`,
|
|
3526
3590
|
outputSchema: creditUsageOutputSchema,
|
|
3527
|
-
parameters:
|
|
3528
|
-
view:
|
|
3591
|
+
parameters: z10.object({
|
|
3592
|
+
view: z10.enum(["current", "historical"]).optional().describe(
|
|
3529
3593
|
"Select current balance or historical monthly usage. Defaults to current."
|
|
3530
3594
|
),
|
|
3531
|
-
byApiKey:
|
|
3595
|
+
byApiKey: z10.boolean().optional().describe(
|
|
3532
3596
|
'Break historical usage down by API key. When view is omitted, true selects the historical view; it cannot be combined with view "current".'
|
|
3533
3597
|
)
|
|
3534
3598
|
}),
|
|
@@ -4151,32 +4215,32 @@ function removeEmptyTopLevel(obj) {
|
|
|
4151
4215
|
}
|
|
4152
4216
|
return out;
|
|
4153
4217
|
}
|
|
4154
|
-
var searchDomainSchema =
|
|
4218
|
+
var searchDomainSchema = z11.string().trim().toLowerCase().min(1).max(253).regex(
|
|
4155
4219
|
/^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$/,
|
|
4156
4220
|
"Domain must be a valid hostname without protocol or path"
|
|
4157
4221
|
);
|
|
4158
4222
|
var searchToolBaseFields = {
|
|
4159
|
-
toolDetail:
|
|
4160
|
-
query:
|
|
4161
|
-
objective:
|
|
4162
|
-
clientModel:
|
|
4163
|
-
domainTools:
|
|
4223
|
+
toolDetail: z11.enum(["compact", "summary", "full"]).optional().describe("Compact by default. Compact returns only provider, capability and description; full includes contracts. Inspect selected compact tools with firecrawl_find_tools providers and capabilities."),
|
|
4224
|
+
query: z11.string().min(1).describe("Query for web and semantic tool discovery. Operators include quoted phrases, `-term`, `site:host`, `inurl:term`, `intitle:term`, and `related:host`; the set is non-exhaustive. Catalogue browsing is available through firecrawl_find_tools."),
|
|
4225
|
+
objective: z11.string().trim().min(1).max(5e3).optional().describe("Optional broader goal for this search, if known. Avoid sensitive information."),
|
|
4226
|
+
clientModel: z11.string().trim().min(1).max(128).optional().describe("Optional model identifier, if known."),
|
|
4227
|
+
domainTools: z11.boolean().optional().describe(
|
|
4164
4228
|
"Include domain-matched tools for result URLs. Defaults to true when Alexandria is combined with web, news or images; semantic-only search leaves domain matching off."
|
|
4165
4229
|
),
|
|
4166
|
-
highlights:
|
|
4230
|
+
highlights: z11.boolean().optional().describe(
|
|
4167
4231
|
"Return query-relevant page excerpts for web and news results when available (default). Highlights appear in web `description` and news `snippet`; otherwise, original snippets are returned. Set to false to keep the original search snippets."
|
|
4168
4232
|
),
|
|
4169
|
-
limit:
|
|
4170
|
-
tbs:
|
|
4171
|
-
filter:
|
|
4172
|
-
location:
|
|
4173
|
-
includeDomains:
|
|
4174
|
-
excludeDomains:
|
|
4175
|
-
sources:
|
|
4176
|
-
categories:
|
|
4177
|
-
|
|
4233
|
+
limit: z11.number().int().min(1).max(100).optional(),
|
|
4234
|
+
tbs: z11.string().optional(),
|
|
4235
|
+
filter: z11.string().optional(),
|
|
4236
|
+
location: z11.string().optional(),
|
|
4237
|
+
includeDomains: z11.array(searchDomainSchema).optional().describe("Hostnames to restrict results to. Mutually exclusive with excludeDomains."),
|
|
4238
|
+
excludeDomains: z11.array(searchDomainSchema).optional().describe("Hostnames to leave out of results. Mutually exclusive with includeDomains."),
|
|
4239
|
+
sources: z11.array(searchSourceSchema).optional().describe("Search sources; authenticated sessions default to web + alexandria, keyless sessions to web only. " + ALEXANDRIA_SOURCES_OPT_OUT + ' Use ["alexandria"] alone for provider discovery without web results.'),
|
|
4240
|
+
categories: z11.array(z11.enum(["research", "pdf", "developer", "gov"])).optional().describe(
|
|
4241
|
+
"Limit results to specific source types. `research` restricts ordinary web results to research-affiliated websites and returns page snippets, which is separate from the `firecrawl_research_*` tools that search paper abstracts and full text across biomedical (PubMed, bioRxiv, medRxiv) and arXiv literature; `pdf` searches PDF results; `developer` searches an index built for coding agents over public repositories, GitHub issues, merged pull requests, repository READMEs, and code documentation; `gov` searches the Government Index of US federal, state, and local legal and regulatory sources, the index behind firecrawl_gov_search, and cannot be combined with other categories. `developer` and `gov` return hits in `data.web` with `category` set to their name; the other categories also filter `data.web`."
|
|
4178
4242
|
),
|
|
4179
|
-
enterprise:
|
|
4243
|
+
enterprise: z11.array(z11.enum(["default", "anon", "zdr"])).optional()
|
|
4180
4244
|
};
|
|
4181
4245
|
function searchDomainsAreExclusive(args2) {
|
|
4182
4246
|
return !(args2.includeDomains?.length && args2.excludeDomains?.length);
|
|
@@ -4184,15 +4248,15 @@ function searchDomainsAreExclusive(args2) {
|
|
|
4184
4248
|
var SEARCH_DOMAINS_CONFLICT_MESSAGE = "includeDomains and excludeDomains cannot both be specified";
|
|
4185
4249
|
var EXCHANGE_KEY_REQUIRED_MESSAGE = "Alexandria requires an API key on a team with Alexandria access";
|
|
4186
4250
|
var EXCHANGE_MAX_CALLS = 10;
|
|
4187
|
-
var exchangeCallSchema =
|
|
4188
|
-
provider:
|
|
4189
|
-
capability:
|
|
4251
|
+
var exchangeCallSchema = z11.object({
|
|
4252
|
+
provider: z11.string().min(1).describe('Provider slug, e.g. "fred".'),
|
|
4253
|
+
capability: z11.string().min(1).describe(
|
|
4190
4254
|
'Capability address as returned by search or discover, e.g. "series/observations".'
|
|
4191
4255
|
),
|
|
4192
|
-
version:
|
|
4193
|
-
options:
|
|
4256
|
+
version: z11.string().trim().min(1).max(128).optional().describe("Optional published workflow version. Omit to use the latest version."),
|
|
4257
|
+
options: z11.record(z11.string(), z11.any()).optional().describe("Capability options as declared by its contract.")
|
|
4194
4258
|
});
|
|
4195
|
-
var exchangeCallsSchema =
|
|
4259
|
+
var exchangeCallsSchema = z11.array(exchangeCallSchema).min(1).max(EXCHANGE_MAX_CALLS);
|
|
4196
4260
|
function assertExchangeCredential(session) {
|
|
4197
4261
|
if (hasCredential(session)) return;
|
|
4198
4262
|
const payload = {
|
|
@@ -4368,12 +4432,13 @@ var ConsoleLogger = class {
|
|
|
4368
4432
|
var openAiAppsChallengeToken = normalizeHeader(
|
|
4369
4433
|
process.env.OPENAI_APPS_CHALLENGE_TOKEN
|
|
4370
4434
|
);
|
|
4371
|
-
var FULL_PROFILE_INSTRUCTIONS = `Firecrawl provides web search, page retrieval, site URL discovery, multi-page collection, structured page data, monitoring, and multi-source research that returns structured data. Match the requested operation to the tool boundary: firecrawl_scrape retrieves one supplied page and can return JSON matching a supplied schema, firecrawl_map enumerates URLs under a site without retrieving their content, and firecrawl_agent runs multi-source research and returns structured data when the URLs are not known or the answer spans several sites (an entity plus its fields, a list, a dataset); its result is read with firecrawl_agent_status. Authenticated firecrawl_search returns web results together with matching Alexandria providers in data.tools. ${ALEXANDRIA_CATALOGUE_SENTENCE} A matching provider can return the same fields across several entities, provenance, exact figures or timestamps, or a large set of records through firecrawl_scrape with its published contract. If web results already answer the question, use them. For the same fields across multiple pages, firecrawl_find_tools offers free provider discovery. Use firecrawl_find_tools to read a contract that was not returned in full or to browse the catalogue by category. ${ALEXANDRIA_SOURCES_OPT_OUT} If no provider fits, continue with web search or firecrawl_agent. For biomedical, life-science, clinical, or arXiv literature, the firecrawl_research_* tools search a paper index of abstracts and full text; firecrawl_search with categories: ["research"] is a website filter over ordinary web results and reaches different sources. For a programming question (code behaviour, a library or framework, an API contract, an error message, or a known bug), firecrawl_developer_search (or firecrawl_search with categories: ["developer"]) searches an index of public repositories, GitHub issues, merged pull requests, READMEs, and code documentation. firecrawl_search with sources: [{type: "alexandria"}] returns compact tool summaries in data.tools; toolDetail: "full" includes contracts, firecrawl_find_tools starts with categories, lists providers, then compact tools, and expands the selected full contract, and firecrawl_scrape with alexandria: [{provider, capability, options}] executes up to ten capabilities and returns their results. Alexandria access needs an API key on a team with it enabled. Provide only the required inputs and account for stated network or external side effects.`;
|
|
4372
|
-
var KEYLESS_PROFILE_INSTRUCTIONS = `Hosted keyless sessions expose firecrawl_search, firecrawl_scrape, and firecrawl_parse with usage limits. firecrawl_search searches the web. For programming questions, firecrawl_search with categories: ["developer"] searches indexed public repositories, GitHub issues, merged pull requests, repository READMEs, and code documentation. For biomedical, life-science, clinical, or arXiv literature, firecrawl_search with categories: ["research"] filters ordinary web results to research-affiliated websites. firecrawl_scrape retrieves one supplied page and can return JSON matching a supplied schema. firecrawl_parse processes supported local files through its two-phase upload flow. An Authorization bearer API key can provide higher usage limits and expose additional tools, subject to plan, deployment, and team policy, including firecrawl_map for site URL discovery, firecrawl_agent and firecrawl_agent_status for multi-source research that returns structured data when the URLs are not known, firecrawl_research_* for paper-index and repository research, and firecrawl_find_tools as the progressive Alexandria catalogue lookup alongside the Alexandria options of firecrawl_search and firecrawl_scrape for catalogued data providers.`;
|
|
4373
|
-
var SEARCH_PROFILE_INSTRUCTIONS = ALEXANDRIA_SEARCH_INSTRUCTIONS + ` Firecrawl provides web, developer, and research search, and executes catalogued Alexandria data providers. Use firecrawl_search to find relevant results across the web and specialized indexes; authenticated searches also return matching Alexandria providers in data.tools. firecrawl_find_tools provides catalogue browsing and provider contracts; firecrawl_scrape with an alexandria body executes a selected capability; firecrawl_scrape with a url retrieves one supplied page. For a programming question, firecrawl_developer_search searches indexed public repositories, GitHub issues, merged pull requests, READMEs, and code documentation and returns the matched passages, and skills: "only" narrows it to agent-skill files; firecrawl_search with categories: ["developer"] reaches the same index beside ordinary web results, returning the hits in the web group rather than as passages and offering no skills filter. For a biomedical, life-science, clinical, or arXiv literature question, the firecrawl_research_* tools search the paper index, while categories: ["research"] on firecrawl_search filters ordinary web results to research-affiliated websites. Use the firecrawl_research_* tools to search academic and research literature, expand from anchor papers via the citation graph, and read full-text passages from a specific paper. Search and discovery tools are read-only and return ranked results. Billing: web, developer and research search are billed per request; Alexandria discovery (firecrawl_search with sources ["alexandria"] alone, and firecrawl_find_tools) is free; firecrawl_scrape is billed, as a page retrieval in url mode or at each executed capability's listed price in alexandria mode.`;
|
|
4435
|
+
var FULL_PROFILE_INSTRUCTIONS = `Firecrawl provides web search, page retrieval, site URL discovery, multi-page collection, structured page data, monitoring, and multi-source research that returns structured data. Match the requested operation to the tool boundary: firecrawl_scrape retrieves one supplied page and can return JSON matching a supplied schema, firecrawl_map enumerates URLs under a site without retrieving their content, and firecrawl_agent runs multi-source research and returns structured data when the URLs are not known or the answer spans several sites (an entity plus its fields, a list, a dataset); its result is read with firecrawl_agent_status. Authenticated firecrawl_search returns web results together with matching Alexandria providers in data.tools. ${ALEXANDRIA_CATALOGUE_SENTENCE} A matching provider can return the same fields across several entities, provenance, exact figures or timestamps, or a large set of records through firecrawl_scrape with its published contract. If web results already answer the question, use them. For the same fields across multiple pages, firecrawl_find_tools offers free provider discovery. Use firecrawl_find_tools to read a contract that was not returned in full or to browse the catalogue by category. ${ALEXANDRIA_SOURCES_OPT_OUT} If no provider fits, continue with web search or firecrawl_agent. For biomedical, life-science, clinical, or arXiv literature, the firecrawl_research_* tools search a paper index of abstracts and full text; firecrawl_search with categories: ["research"] is a website filter over ordinary web results and reaches different sources. For a programming question (code behaviour, a library or framework, an API contract, an error message, or a known bug), firecrawl_developer_search (or firecrawl_search with categories: ["developer"]) searches an index of public repositories, GitHub issues, merged pull requests, READMEs, and code documentation. For a legal or regulatory question, firecrawl_gov_search searches primary law and regulatory material from US federal, state, and local government sources: statutes, regulations, codes, court opinions, and other government publications; firecrawl_search with categories: ["gov"] reaches the same sources and cannot be combined with other categories. firecrawl_search with sources: [{type: "alexandria"}] returns compact tool summaries in data.tools; toolDetail: "full" includes contracts, firecrawl_find_tools starts with categories, lists providers, then compact tools, and expands the selected full contract, and firecrawl_scrape with alexandria: [{provider, capability, options}] executes up to ten capabilities and returns their results. Alexandria access needs an API key on a team with it enabled. Provide only the required inputs and account for stated network or external side effects.`;
|
|
4436
|
+
var KEYLESS_PROFILE_INSTRUCTIONS = `Hosted keyless sessions expose firecrawl_search, firecrawl_scrape, and firecrawl_parse with usage limits. firecrawl_search searches the web. For programming questions, firecrawl_search with categories: ["developer"] searches indexed public repositories, GitHub issues, merged pull requests, repository READMEs, and code documentation. For legal or regulatory questions, firecrawl_search with categories: ["gov"] searches US government legal and regulatory sources and cannot be combined with other categories. For biomedical, life-science, clinical, or arXiv literature, firecrawl_search with categories: ["research"] filters ordinary web results to research-affiliated websites. firecrawl_scrape retrieves one supplied page and can return JSON matching a supplied schema. firecrawl_parse processes supported local files through its two-phase upload flow. An Authorization bearer API key can provide higher usage limits and expose additional tools, subject to plan, deployment, and team policy, including firecrawl_map for site URL discovery, firecrawl_agent and firecrawl_agent_status for multi-source research that returns structured data when the URLs are not known, firecrawl_research_* for paper-index and repository research, and firecrawl_find_tools as the progressive Alexandria catalogue lookup alongside the Alexandria options of firecrawl_search and firecrawl_scrape for catalogued data providers.`;
|
|
4437
|
+
var SEARCH_PROFILE_INSTRUCTIONS = ALEXANDRIA_SEARCH_INSTRUCTIONS + ` Firecrawl provides web, developer, government, and research search, and executes catalogued Alexandria data providers. Use firecrawl_search to find relevant results across the web and specialized indexes; authenticated searches also return matching Alexandria providers in data.tools. firecrawl_find_tools provides catalogue browsing and provider contracts; firecrawl_scrape with an alexandria body executes a selected capability; firecrawl_scrape with a url retrieves one supplied page. For a programming question, firecrawl_developer_search searches indexed public repositories, GitHub issues, merged pull requests, READMEs, and code documentation and returns the matched passages, and skills: "only" narrows it to agent-skill files; firecrawl_search with categories: ["developer"] reaches the same index beside ordinary web results, returning the hits in the web group rather than as passages and offering no skills filter. For a legal or regulatory question, firecrawl_gov_search searches primary law and regulatory material from US federal, state, and local government sources: statutes, regulations, codes, court opinions, and other government publications; firecrawl_search with categories: ["gov"] reaches the same sources in the web group and cannot be combined with other categories. For a biomedical, life-science, clinical, or arXiv literature question, the firecrawl_research_* tools search the paper index, while categories: ["research"] on firecrawl_search filters ordinary web results to research-affiliated websites. Use the firecrawl_research_* tools to search academic and research literature, expand from anchor papers via the citation graph, and read full-text passages from a specific paper. Search and discovery tools are read-only and return ranked results. Billing: web, developer, and research search are billed per request; government search is free; Alexandria discovery (firecrawl_search with sources ["alexandria"] alone, and firecrawl_find_tools) is free; firecrawl_scrape is billed, as a page retrieval in url mode or at each executed capability's listed price in alexandria mode.`;
|
|
4374
4438
|
var SEARCH_PROFILE_TOOLS = /* @__PURE__ */ new Set([
|
|
4375
4439
|
"firecrawl_search",
|
|
4376
4440
|
"firecrawl_developer_search",
|
|
4441
|
+
"firecrawl_gov_search",
|
|
4377
4442
|
"firecrawl_research_search_papers",
|
|
4378
4443
|
"firecrawl_research_inspect_paper",
|
|
4379
4444
|
"firecrawl_research_related_papers",
|
|
@@ -4968,10 +5033,10 @@ function transformScrapeParams(args2) {
|
|
|
4968
5033
|
delete out.pdfOptions;
|
|
4969
5034
|
return out;
|
|
4970
5035
|
}
|
|
4971
|
-
var scrapeParamsSchema =
|
|
4972
|
-
url:
|
|
4973
|
-
formats:
|
|
4974
|
-
|
|
5036
|
+
var scrapeParamsSchema = z11.object({
|
|
5037
|
+
url: z11.string().url(),
|
|
5038
|
+
formats: z11.array(
|
|
5039
|
+
z11.enum([
|
|
4975
5040
|
"markdown",
|
|
4976
5041
|
"html",
|
|
4977
5042
|
"rawHtml",
|
|
@@ -4985,71 +5050,77 @@ var scrapeParamsSchema = z10.object({
|
|
|
4985
5050
|
"audio"
|
|
4986
5051
|
])
|
|
4987
5052
|
).optional(),
|
|
4988
|
-
jsonOptions:
|
|
4989
|
-
prompt:
|
|
4990
|
-
schema:
|
|
5053
|
+
jsonOptions: z11.object({
|
|
5054
|
+
prompt: z11.string().optional(),
|
|
5055
|
+
schema: z11.record(z11.string(), z11.any()).optional()
|
|
4991
5056
|
}).optional(),
|
|
4992
|
-
queryOptions:
|
|
4993
|
-
prompt:
|
|
4994
|
-
mode:
|
|
5057
|
+
queryOptions: z11.object({
|
|
5058
|
+
prompt: z11.string().max(1e4),
|
|
5059
|
+
mode: z11.enum(["directQuote", "freeform"]).default("freeform")
|
|
4995
5060
|
}).optional(),
|
|
4996
|
-
screenshotOptions:
|
|
4997
|
-
fullPage:
|
|
4998
|
-
quality:
|
|
4999
|
-
viewport:
|
|
5061
|
+
screenshotOptions: z11.object({
|
|
5062
|
+
fullPage: z11.boolean().optional(),
|
|
5063
|
+
quality: z11.number().optional(),
|
|
5064
|
+
viewport: z11.object({ width: z11.number(), height: z11.number() }).optional()
|
|
5000
5065
|
}).optional(),
|
|
5001
|
-
parsers:
|
|
5002
|
-
pdfOptions:
|
|
5003
|
-
maxPages:
|
|
5066
|
+
parsers: z11.array(z11.enum(["pdf"])).optional(),
|
|
5067
|
+
pdfOptions: z11.object({
|
|
5068
|
+
maxPages: z11.number().int().min(1).max(1e4).optional()
|
|
5004
5069
|
}).optional(),
|
|
5005
|
-
onlyMainContent:
|
|
5006
|
-
redactPII:
|
|
5007
|
-
includeTags:
|
|
5008
|
-
excludeTags:
|
|
5009
|
-
waitFor:
|
|
5070
|
+
onlyMainContent: z11.boolean().optional(),
|
|
5071
|
+
redactPII: z11.boolean().optional(),
|
|
5072
|
+
includeTags: z11.array(z11.string()).optional(),
|
|
5073
|
+
excludeTags: z11.array(z11.string()).optional(),
|
|
5074
|
+
waitFor: z11.number().optional(),
|
|
5010
5075
|
...SAFE_MODE ? {} : {
|
|
5011
|
-
actions:
|
|
5012
|
-
|
|
5013
|
-
type:
|
|
5014
|
-
selector:
|
|
5015
|
-
milliseconds:
|
|
5016
|
-
text:
|
|
5017
|
-
key:
|
|
5018
|
-
direction:
|
|
5019
|
-
script:
|
|
5020
|
-
fullPage:
|
|
5076
|
+
actions: z11.array(
|
|
5077
|
+
z11.object({
|
|
5078
|
+
type: z11.enum(allowedActionTypes),
|
|
5079
|
+
selector: z11.string().optional(),
|
|
5080
|
+
milliseconds: z11.number().optional(),
|
|
5081
|
+
text: z11.string().optional(),
|
|
5082
|
+
key: z11.string().optional(),
|
|
5083
|
+
direction: z11.enum(["up", "down"]).optional(),
|
|
5084
|
+
script: z11.string().optional(),
|
|
5085
|
+
fullPage: z11.boolean().optional()
|
|
5021
5086
|
})
|
|
5022
5087
|
).optional()
|
|
5023
5088
|
},
|
|
5024
|
-
mobile:
|
|
5025
|
-
skipTlsVerification:
|
|
5026
|
-
removeBase64Images:
|
|
5027
|
-
location:
|
|
5028
|
-
country:
|
|
5029
|
-
languages:
|
|
5089
|
+
mobile: z11.boolean().optional(),
|
|
5090
|
+
skipTlsVerification: z11.boolean().optional(),
|
|
5091
|
+
removeBase64Images: z11.boolean().optional(),
|
|
5092
|
+
location: z11.object({
|
|
5093
|
+
country: z11.string().optional(),
|
|
5094
|
+
languages: z11.array(z11.string()).optional()
|
|
5030
5095
|
}).optional(),
|
|
5031
|
-
storeInCache:
|
|
5032
|
-
zeroDataRetention:
|
|
5033
|
-
maxAge:
|
|
5034
|
-
lockdown:
|
|
5035
|
-
proxy:
|
|
5036
|
-
profile:
|
|
5037
|
-
name:
|
|
5038
|
-
saveChanges:
|
|
5096
|
+
storeInCache: z11.boolean().optional(),
|
|
5097
|
+
zeroDataRetention: z11.boolean().optional(),
|
|
5098
|
+
maxAge: z11.number().optional(),
|
|
5099
|
+
lockdown: z11.boolean().optional(),
|
|
5100
|
+
proxy: z11.enum(["basic", "stealth", "enhanced", "auto"]).optional(),
|
|
5101
|
+
profile: z11.object({
|
|
5102
|
+
name: z11.string(),
|
|
5103
|
+
saveChanges: z11.boolean().optional()
|
|
5039
5104
|
}).optional()
|
|
5040
5105
|
});
|
|
5106
|
+
var readOnlyProfileSchema = z11.object({ name: z11.string() }).describe("Loads a saved browser profile without saving changes to it.");
|
|
5107
|
+
function withReadOnlyProfile(options) {
|
|
5108
|
+
const profile = options.profile;
|
|
5109
|
+
return SAFE_MODE && profile ? { ...options, profile: { name: profile.name, saveChanges: false } } : options;
|
|
5110
|
+
}
|
|
5041
5111
|
var ALEXANDRIA_IGNORED_SCRAPE_OPTIONS = /* @__PURE__ */ new Set(["toolDetail", "domainTools"]);
|
|
5042
5112
|
var scrapeToolParamsSchema = scrapeParamsSchema.extend({
|
|
5043
|
-
|
|
5044
|
-
|
|
5045
|
-
|
|
5113
|
+
...SAFE_MODE ? { profile: readOnlyProfileSchema.optional() } : {},
|
|
5114
|
+
url: z11.string().url().optional(),
|
|
5115
|
+
timeout: z11.number().int().positive().optional().describe("Execution timeout in milliseconds."),
|
|
5116
|
+
requestId: z11.string().regex(/^[A-Za-z0-9._:-]{1,128}$/).optional().describe(
|
|
5046
5117
|
"Idempotency key bound to one Alexandria execution payload. Generated when omitted and returned with the result."
|
|
5047
5118
|
),
|
|
5048
|
-
alexandria:
|
|
5119
|
+
alexandria: z11.union([exchangeCallSchema, exchangeCallsSchema]).optional().describe(
|
|
5049
5120
|
"Catalogued Alexandria capability invocation, mutually exclusive with url. One {provider, capability, options} object or an array of 1-10, with contracts available through firecrawl_search or firecrawl_find_tools. Each call may include version to pin a published workflow; omitting it uses latest. Only requestId and timeout are supported alongside alexandria. " + ALEXANDRIA_CONTRACT_GUIDANCE + " Returns per-capability results in data.alexandria with data, records, or an error with a code; individual capabilities can fail even when the outer response succeeds. Requires an API key on a team with Alexandria enabled. Some providers require accepted terms; blocked requests return the applicable requirements."
|
|
5050
5121
|
),
|
|
5051
|
-
toolDetail:
|
|
5052
|
-
domainTools:
|
|
5122
|
+
toolDetail: z11.enum(["compact", "summary", "full"]).optional().describe("URL mode only: domain discovery detail, summary by default; compact returns provider/capability/description, full includes contracts. Ignored with alexandria."),
|
|
5123
|
+
domainTools: z11.boolean().optional().describe(
|
|
5053
5124
|
"URL mode only: include domain-matched Alexandria tools for the page in tools on the returned document. Ignored with alexandria."
|
|
5054
5125
|
)
|
|
5055
5126
|
}).refine(
|
|
@@ -5069,9 +5140,9 @@ var scrapeToolParamsSchema = scrapeParamsSchema.extend({
|
|
|
5069
5140
|
(args2) => !args2.requestId || !!args2.alexandria,
|
|
5070
5141
|
"requestId applies to Alexandria execution only"
|
|
5071
5142
|
);
|
|
5072
|
-
var parseOptionParamsSchema =
|
|
5073
|
-
formats:
|
|
5074
|
-
|
|
5143
|
+
var parseOptionParamsSchema = z11.object({
|
|
5144
|
+
formats: z11.array(
|
|
5145
|
+
z11.enum([
|
|
5075
5146
|
"markdown",
|
|
5076
5147
|
"html",
|
|
5077
5148
|
"rawHtml",
|
|
@@ -5081,48 +5152,48 @@ var parseOptionParamsSchema = z10.object({
|
|
|
5081
5152
|
"query"
|
|
5082
5153
|
])
|
|
5083
5154
|
).optional(),
|
|
5084
|
-
jsonOptions:
|
|
5085
|
-
prompt:
|
|
5086
|
-
schema:
|
|
5155
|
+
jsonOptions: z11.object({
|
|
5156
|
+
prompt: z11.string().optional(),
|
|
5157
|
+
schema: z11.record(z11.string(), z11.any()).optional()
|
|
5087
5158
|
}).optional(),
|
|
5088
|
-
queryOptions:
|
|
5089
|
-
prompt:
|
|
5090
|
-
mode:
|
|
5159
|
+
queryOptions: z11.object({
|
|
5160
|
+
prompt: z11.string().max(1e4),
|
|
5161
|
+
mode: z11.enum(["directQuote", "freeform"]).default("freeform")
|
|
5091
5162
|
}).optional(),
|
|
5092
|
-
parsers:
|
|
5093
|
-
pdfOptions:
|
|
5094
|
-
maxPages:
|
|
5163
|
+
parsers: z11.array(z11.enum(["pdf"])).optional(),
|
|
5164
|
+
pdfOptions: z11.object({
|
|
5165
|
+
maxPages: z11.number().int().min(1).max(1e4).optional()
|
|
5095
5166
|
}).optional(),
|
|
5096
|
-
onlyMainContent:
|
|
5097
|
-
redactPII:
|
|
5098
|
-
includeTags:
|
|
5099
|
-
excludeTags:
|
|
5100
|
-
removeBase64Images:
|
|
5101
|
-
skipTlsVerification:
|
|
5102
|
-
storeInCache:
|
|
5103
|
-
zeroDataRetention:
|
|
5104
|
-
maxAge:
|
|
5105
|
-
proxy:
|
|
5167
|
+
onlyMainContent: z11.boolean().optional(),
|
|
5168
|
+
redactPII: z11.boolean().optional(),
|
|
5169
|
+
includeTags: z11.array(z11.string()).optional(),
|
|
5170
|
+
excludeTags: z11.array(z11.string()).optional(),
|
|
5171
|
+
removeBase64Images: z11.boolean().optional(),
|
|
5172
|
+
skipTlsVerification: z11.boolean().optional(),
|
|
5173
|
+
storeInCache: z11.boolean().optional(),
|
|
5174
|
+
zeroDataRetention: z11.boolean().optional(),
|
|
5175
|
+
maxAge: z11.number().optional().describe("Ignored: parse never reuses or stores indexed content."),
|
|
5176
|
+
proxy: z11.enum(["basic", "auto"]).optional()
|
|
5106
5177
|
});
|
|
5107
5178
|
var localParseParamsSchema = parseOptionParamsSchema.extend({
|
|
5108
|
-
filePath:
|
|
5179
|
+
filePath: z11.string().min(1).describe(
|
|
5109
5180
|
"Absolute or relative path to a local file to parse. Supported: .html, .htm, .pdf, .docx, .doc, .odt, .rtf, .xlsx, .xls"
|
|
5110
5181
|
),
|
|
5111
|
-
contentType:
|
|
5182
|
+
contentType: z11.string().optional().describe(
|
|
5112
5183
|
"Optional MIME type override. If omitted, the server infers the file kind from the extension."
|
|
5113
5184
|
)
|
|
5114
5185
|
});
|
|
5115
5186
|
var hostedParseParamsSchema = parseOptionParamsSchema.extend({
|
|
5116
|
-
filePath:
|
|
5187
|
+
filePath: z11.string().min(1).optional().describe(
|
|
5117
5188
|
"Phase 1 only: path to the local file on the caller/harness machine. Hosted MCP will not read or stat this path; it is used only to produce upload instructions."
|
|
5118
5189
|
),
|
|
5119
|
-
uploadRef:
|
|
5190
|
+
uploadRef: z11.string().min(1).optional().describe(
|
|
5120
5191
|
"Phase 2 only: short-lived upload reference returned by phase 1 after the local PUT upload completes."
|
|
5121
5192
|
),
|
|
5122
|
-
contentType:
|
|
5193
|
+
contentType: z11.string().optional().describe(
|
|
5123
5194
|
"Phase 1 MIME type override. If omitted, the server infers it from the file extension without reading the file."
|
|
5124
5195
|
),
|
|
5125
|
-
declaredSizeBytes:
|
|
5196
|
+
declaredSizeBytes: z11.number().int().positive().optional().describe(
|
|
5126
5197
|
"Optional phase 1 size declaration. Hosted MCP does not stat the file; provide this only if the caller already knows it."
|
|
5127
5198
|
)
|
|
5128
5199
|
}).superRefine((value, ctx) => {
|
|
@@ -5130,7 +5201,7 @@ var hostedParseParamsSchema = parseOptionParamsSchema.extend({
|
|
|
5130
5201
|
const hasUploadRef = typeof value.uploadRef === "string" && value.uploadRef.length > 0;
|
|
5131
5202
|
if (hasFilePath === hasUploadRef) {
|
|
5132
5203
|
ctx.addIssue({
|
|
5133
|
-
code:
|
|
5204
|
+
code: z11.ZodIssueCode.custom,
|
|
5134
5205
|
message: "Hosted firecrawl_parse requires exactly one of filePath (phase 1) or uploadRef (phase 2).",
|
|
5135
5206
|
path: hasFilePath && hasUploadRef ? ["uploadRef"] : ["filePath"]
|
|
5136
5207
|
});
|
|
@@ -5335,8 +5406,8 @@ var scrapeTool = {
|
|
|
5335
5406
|
name: "firecrawl_scrape",
|
|
5336
5407
|
annotations: {
|
|
5337
5408
|
title: "Firecrawl scrape",
|
|
5338
|
-
// Hosted scrape omits browser actions
|
|
5339
|
-
// before execution.
|
|
5409
|
+
// Hosted scrape omits browser actions, loads profiles without saving,
|
|
5410
|
+
// and refuses provider terms writes before execution.
|
|
5340
5411
|
readOnlyHint: SAFE_MODE,
|
|
5341
5412
|
openWorldHint: true,
|
|
5342
5413
|
// Accepts any user-supplied URL on the public web.
|
|
@@ -5346,7 +5417,7 @@ var scrapeTool = {
|
|
|
5346
5417
|
description: `
|
|
5347
5418
|
Scrape one URL and return its content: markdown by default, or HTML, links, screenshots, branding data, a targeted answer, or JSON matching a supplied schema. Use it when the request identifies a page and needs its content or defined fields. Use \`firecrawl_search\` when additional web sources are needed; on an authenticated session, \`firecrawl_map\` lists a site's URLs and \`firecrawl_crawl\` collects a set of pages.
|
|
5348
5419
|
|
|
5349
|
-
Firecrawl may serve recently indexed content; set \`maxAge: 0\` for a live fetch or a smaller \`maxAge\` to bound staleness. A successful response does not by itself confirm the page is still current. Browser actions can change the live page when interactive actions are enabled. Authenticated responses can include a \`metadata.scrapeId\` for optional scrape feedback.
|
|
5420
|
+
Firecrawl may serve recently indexed content; set \`maxAge: 0\` for a live fetch or a smaller \`maxAge\` to bound staleness. A successful response does not by itself confirm the page is still current. ${SAFE_MODE ? "A named browser profile loads saved session data without saving changes to it." : "Browser actions can change the live page when interactive actions are enabled."} Authenticated responses can include a \`metadata.scrapeId\` for optional scrape feedback.
|
|
5350
5421
|
|
|
5351
5422
|
On an authenticated session with Alexandria access, \`firecrawl_search\` with \`sources\` unset and \`firecrawl_find_tools\` can discover providers for the same fields across several pages; a matching provider returns typed records in one call. Keyless sessions have no provider matches.
|
|
5352
5423
|
|
|
@@ -5377,7 +5448,7 @@ Alexandria mode, on an authenticated session with Alexandria access: \`alexandri
|
|
|
5377
5448
|
const transformed = transformScrapeParams(
|
|
5378
5449
|
options
|
|
5379
5450
|
);
|
|
5380
|
-
const cleaned = removeEmptyTopLevel(transformed);
|
|
5451
|
+
const cleaned = withReadOnlyProfile(removeEmptyTopLevel(transformed));
|
|
5381
5452
|
if (cleaned.lockdown) {
|
|
5382
5453
|
log.info("Scraping URL (lockdown)");
|
|
5383
5454
|
} else {
|
|
@@ -5430,13 +5501,13 @@ Enumerate URLs indexed under one website through Firecrawl without fetching each
|
|
|
5430
5501
|
Returns matching URLs rather than page bodies. Retrieve one page with \`firecrawl_scrape\`; collect content across multiple pages with \`firecrawl_crawl\`. Authenticated responses can include an \`id\` for optional map feedback.
|
|
5431
5502
|
`,
|
|
5432
5503
|
outputSchema: mapOutputSchema,
|
|
5433
|
-
parameters:
|
|
5434
|
-
url:
|
|
5435
|
-
search:
|
|
5436
|
-
sitemap:
|
|
5437
|
-
includeSubdomains:
|
|
5438
|
-
limit:
|
|
5439
|
-
ignoreQueryParameters:
|
|
5504
|
+
parameters: z11.object({
|
|
5505
|
+
url: z11.string().url(),
|
|
5506
|
+
search: z11.string().optional(),
|
|
5507
|
+
sitemap: z11.enum(["include", "skip", "only"]).optional(),
|
|
5508
|
+
includeSubdomains: z11.boolean().optional(),
|
|
5509
|
+
limit: z11.number().optional(),
|
|
5510
|
+
ignoreQueryParameters: z11.boolean().optional()
|
|
5440
5511
|
}),
|
|
5441
5512
|
execute: async (args2, { session, log, client: mcpClient }) => {
|
|
5442
5513
|
const { url, ...options } = args2;
|
|
@@ -5472,12 +5543,12 @@ ${ALEXANDRIA_SEARCH_LEAD}
|
|
|
5472
5543
|
|
|
5473
5544
|
On an authenticated session, tool matches describe available capabilities; \`firecrawl_find_tools\` returns their contracts and \`firecrawl_scrape\` with an \`alexandria\` body executes a selected capability. Keyless sessions get no Alexandria matches in data.tools.
|
|
5474
5545
|
|
|
5475
|
-
For a programming question, add \`categories: ["developer"]\`; its hits return in \`data.web\` with \`category: "developer"\`. \`categories: ["research"]\` restricts web results to research-affiliated websites; the \`firecrawl_research_*\` tools are a separate surface over paper abstracts and full text (PubMed, bioRxiv, medRxiv, arXiv). Query operators, domain filters, \`categories\`, \`toolDetail\` and \`scrapeOptions\` are described on their parameters. Returns source-type result groups and usage metadata. Authenticated responses can include an \`id\` for optional search feedback.
|
|
5546
|
+
For a programming question, add \`categories: ["developer"]\`; its hits return in \`data.web\` with \`category: "developer"\`. For a legal or regulatory question, \`categories: ["gov"]\` returns hits in \`data.web\` with \`category: "gov"\` and cannot be combined with other categories; authenticated sessions also have \`firecrawl_gov_search\` as the dedicated tool. \`categories: ["research"]\` restricts web results to research-affiliated websites; the \`firecrawl_research_*\` tools are a separate surface over paper abstracts and full text (PubMed, bioRxiv, medRxiv, arXiv). Query operators, domain filters, \`categories\`, \`toolDetail\` and \`scrapeOptions\` are described on their parameters. Returns source-type result groups and usage metadata. Authenticated responses can include an \`id\` for optional search feedback.
|
|
5476
5547
|
`,
|
|
5477
5548
|
outputSchema: searchOutputSchema,
|
|
5478
|
-
parameters:
|
|
5549
|
+
parameters: z11.object({
|
|
5479
5550
|
...searchToolBaseFields,
|
|
5480
|
-
scrapeOptions: scrapeParamsSchema.omit({ url: true }).partial().optional().describe("Attach page content for web results in the same call. These fetches ignore maxAge, so use firecrawl_scrape when you need a live fetch. scrapeOptions fetches web pages, never Alexandria provider tools.")
|
|
5551
|
+
scrapeOptions: scrapeParamsSchema.omit({ url: true }).extend(SAFE_MODE ? { profile: readOnlyProfileSchema } : {}).partial().optional().describe("Attach page content for web results in the same call. These fetches ignore maxAge, so use firecrawl_scrape when you need a live fetch. scrapeOptions fetches web pages, never Alexandria provider tools.")
|
|
5481
5552
|
}).refine(searchDomainsAreExclusive, SEARCH_DOMAINS_CONFLICT_MESSAGE).refine(
|
|
5482
5553
|
searchQueryIsValid,
|
|
5483
5554
|
"A query is required. Use Find Tools for catalogue lookup."
|
|
@@ -5493,8 +5564,8 @@ For a programming question, add \`categories: ["developer"]\`; its hits return i
|
|
|
5493
5564
|
searchOpts.domainTools ??= defaultDomainTools(searchOpts.sources);
|
|
5494
5565
|
searchOpts.toolDetail ??= "compact";
|
|
5495
5566
|
if (searchOpts.scrapeOptions) {
|
|
5496
|
-
searchOpts.scrapeOptions =
|
|
5497
|
-
searchOpts.scrapeOptions
|
|
5567
|
+
searchOpts.scrapeOptions = withReadOnlyProfile(
|
|
5568
|
+
transformScrapeParams(searchOpts.scrapeOptions)
|
|
5498
5569
|
);
|
|
5499
5570
|
}
|
|
5500
5571
|
const cleaned = removeEmptyTopLevel(searchOpts);
|
|
@@ -5614,7 +5685,7 @@ var findToolsTool = {
|
|
|
5614
5685
|
};
|
|
5615
5686
|
server.addTool(findToolsTool);
|
|
5616
5687
|
var SEARCH_SURFACE_SCRAPE_DESCRIPTION = `
|
|
5617
|
-
Scrape one URL and return its content, or execute catalogued Alexandria capabilities. URL mode returns markdown by default, or HTML, links, screenshots, branding data, a targeted answer, or JSON matching a supplied schema, plus page metadata. Firecrawl may serve recently indexed content; set \`maxAge: 0\` for a live fetch. A successful response does not by itself confirm the page is still current. A named browser profile loads saved session data.
|
|
5688
|
+
Scrape one URL and return its content, or execute catalogued Alexandria capabilities. URL mode returns markdown by default, or HTML, links, screenshots, branding data, a targeted answer, or JSON matching a supplied schema, plus page metadata. Firecrawl may serve recently indexed content; set \`maxAge: 0\` for a live fetch. A successful response does not by itself confirm the page is still current. ${SAFE_MODE ? "A named browser profile loads saved session data without saving changes to it." : "Browser actions can change the live page, and a named browser profile can load saved session data and overwrite its stored state."}
|
|
5618
5689
|
|
|
5619
5690
|
\`firecrawl_search\` with \`sources\` unset and \`firecrawl_find_tools\` can discover providers for the same fields across several pages; a matching Alexandria provider returns typed records in one call.
|
|
5620
5691
|
|
|
@@ -5795,17 +5866,17 @@ async function waitForCrawlCompletionWithOrigin(client, jobId, origin, pollInter
|
|
|
5795
5866
|
);
|
|
5796
5867
|
}
|
|
5797
5868
|
}
|
|
5798
|
-
var feedbackIssueSchema =
|
|
5869
|
+
var feedbackIssueSchema = z11.string().trim().min(1).max(80).regex(
|
|
5799
5870
|
/^[a-z0-9][a-z0-9_-]*$/,
|
|
5800
5871
|
"Issue codes must use lowercase letters, numbers, underscores, or hyphens"
|
|
5801
5872
|
);
|
|
5802
|
-
var valuableSourceSchema =
|
|
5803
|
-
url:
|
|
5804
|
-
reason:
|
|
5873
|
+
var valuableSourceSchema = z11.object({
|
|
5874
|
+
url: z11.string().url(),
|
|
5875
|
+
reason: z11.string().max(1e3).optional()
|
|
5805
5876
|
});
|
|
5806
|
-
var missingContentSchema =
|
|
5807
|
-
topic:
|
|
5808
|
-
description:
|
|
5877
|
+
var missingContentSchema = z11.object({
|
|
5878
|
+
topic: z11.string().min(1, "topic must not be empty").max(200, "topic must be 200 characters or fewer"),
|
|
5879
|
+
description: z11.string().max(2e3).optional()
|
|
5809
5880
|
});
|
|
5810
5881
|
var FEEDBACK_DISABLED_VALUES = /* @__PURE__ */ new Set(["1", "true", "yes", "on"]);
|
|
5811
5882
|
function feedbackEnvEnabled(...keys) {
|
|
@@ -5844,24 +5915,24 @@ Records schema-validated quality feedback for a prior \`firecrawl_search\` UUID
|
|
|
5844
5915
|
Eligibility is limited to successful searches within the feedback age window. The record is idempotent per search ID. Eligible first feedback for a search can refund 1 credit; refunds are subject to the team's daily cap. The response reports whether a refund was applied, along with submission and daily-cap status.
|
|
5845
5916
|
`,
|
|
5846
5917
|
outputSchema: feedbackOutputSchema,
|
|
5847
|
-
parameters:
|
|
5848
|
-
searchId:
|
|
5849
|
-
rating:
|
|
5850
|
-
valuableSources:
|
|
5851
|
-
|
|
5852
|
-
url:
|
|
5853
|
-
reason:
|
|
5918
|
+
parameters: z11.object({
|
|
5919
|
+
searchId: z11.string().uuid("searchId must be the UUID returned by firecrawl_search"),
|
|
5920
|
+
rating: z11.enum(["good", "bad", "partial"]),
|
|
5921
|
+
valuableSources: z11.array(
|
|
5922
|
+
z11.object({
|
|
5923
|
+
url: z11.string().url(),
|
|
5924
|
+
reason: z11.string().max(1e3).optional()
|
|
5854
5925
|
})
|
|
5855
5926
|
).max(50).optional(),
|
|
5856
|
-
missingContent:
|
|
5857
|
-
|
|
5858
|
-
topic:
|
|
5859
|
-
description:
|
|
5927
|
+
missingContent: z11.array(
|
|
5928
|
+
z11.object({
|
|
5929
|
+
topic: z11.string().min(1, "topic must not be empty").max(200, "topic must be 200 characters or fewer"),
|
|
5930
|
+
description: z11.string().max(2e3).optional()
|
|
5860
5931
|
})
|
|
5861
5932
|
).max(20).optional().describe(
|
|
5862
5933
|
"Array of specific pieces of content the agent expected to find but did not. One entry per distinct topic. Each entry has a short `topic` and optional longer `description`."
|
|
5863
5934
|
),
|
|
5864
|
-
querySuggestions:
|
|
5935
|
+
querySuggestions: z11.string().max(2e3).optional()
|
|
5865
5936
|
}),
|
|
5866
5937
|
execute: async (args2, { session, log, client: mcpClient }) => {
|
|
5867
5938
|
const origin = requestOrigin(mcpClient, session);
|
|
@@ -5963,20 +6034,20 @@ For an Alexandria session, set endpoint to \`alexandria\`, omit jobId, and provi
|
|
|
5963
6034
|
Returns submission status, feedback ID, and accounting fields.
|
|
5964
6035
|
`,
|
|
5965
6036
|
outputSchema: feedbackOutputSchema,
|
|
5966
|
-
parameters:
|
|
5967
|
-
endpoint:
|
|
5968
|
-
jobId:
|
|
6037
|
+
parameters: z11.object({
|
|
6038
|
+
endpoint: z11.enum(["search", "scrape", "parse", "map", "alexandria"]),
|
|
6039
|
+
jobId: z11.string().uuid("jobId must be the UUID returned by Firecrawl").optional(),
|
|
5969
6040
|
...alexandriaFeedbackFields,
|
|
5970
|
-
rating:
|
|
5971
|
-
issues:
|
|
5972
|
-
tags:
|
|
5973
|
-
note:
|
|
5974
|
-
valuableSources:
|
|
5975
|
-
missingContent:
|
|
5976
|
-
querySuggestions:
|
|
5977
|
-
url:
|
|
5978
|
-
pageNumbers:
|
|
5979
|
-
metadata:
|
|
6041
|
+
rating: z11.enum(["good", "bad", "partial"]),
|
|
6042
|
+
issues: z11.array(feedbackIssueSchema).max(20).optional(),
|
|
6043
|
+
tags: z11.array(feedbackIssueSchema).max(20).optional(),
|
|
6044
|
+
note: z11.string().max(4e3).optional(),
|
|
6045
|
+
valuableSources: z11.array(valuableSourceSchema).max(50).optional(),
|
|
6046
|
+
missingContent: z11.array(missingContentSchema).max(50).optional(),
|
|
6047
|
+
querySuggestions: z11.string().max(2e3).optional(),
|
|
6048
|
+
url: z11.string().url().optional(),
|
|
6049
|
+
pageNumbers: z11.array(z11.number().int().positive()).max(100).optional(),
|
|
6050
|
+
metadata: z11.record(z11.string(), z11.unknown()).optional()
|
|
5980
6051
|
}).superRefine((value, ctx) => {
|
|
5981
6052
|
if (value.endpoint === "alexandria") {
|
|
5982
6053
|
const parsed = alexandriaSessionFeedbackSchema.safeParse(value);
|
|
@@ -6088,25 +6159,25 @@ Start a multi-page crawl at a website URL, poll it to a terminal state, and retu
|
|
|
6088
6159
|
|
|
6089
6160
|
Crawl results can be large; use conservative limits when full-site coverage is unnecessary. Webhooks and interactive scrape actions are unavailable in safe mode. Returns the crawl ID, status, and page data.
|
|
6090
6161
|
`,
|
|
6091
|
-
parameters:
|
|
6092
|
-
url:
|
|
6093
|
-
prompt:
|
|
6094
|
-
excludePaths:
|
|
6095
|
-
includePaths:
|
|
6096
|
-
maxDiscoveryDepth:
|
|
6097
|
-
sitemap:
|
|
6098
|
-
limit:
|
|
6099
|
-
allowExternalLinks:
|
|
6100
|
-
allowSubdomains:
|
|
6101
|
-
crawlEntireDomain:
|
|
6102
|
-
delay:
|
|
6103
|
-
maxConcurrency:
|
|
6162
|
+
parameters: z11.object({
|
|
6163
|
+
url: z11.string(),
|
|
6164
|
+
prompt: z11.string().optional(),
|
|
6165
|
+
excludePaths: z11.array(z11.string()).optional(),
|
|
6166
|
+
includePaths: z11.array(z11.string()).optional(),
|
|
6167
|
+
maxDiscoveryDepth: z11.number().optional(),
|
|
6168
|
+
sitemap: z11.enum(["skip", "include", "only"]).optional(),
|
|
6169
|
+
limit: z11.number().optional(),
|
|
6170
|
+
allowExternalLinks: z11.boolean().optional(),
|
|
6171
|
+
allowSubdomains: z11.boolean().optional(),
|
|
6172
|
+
crawlEntireDomain: z11.boolean().optional(),
|
|
6173
|
+
delay: z11.number().optional(),
|
|
6174
|
+
maxConcurrency: z11.number().optional(),
|
|
6104
6175
|
...SAFE_MODE ? {} : {
|
|
6105
|
-
webhook:
|
|
6106
|
-
webhookHeaders:
|
|
6176
|
+
webhook: z11.string().optional(),
|
|
6177
|
+
webhookHeaders: z11.record(z11.string(), z11.string()).optional()
|
|
6107
6178
|
},
|
|
6108
|
-
deduplicateSimilarURLs:
|
|
6109
|
-
ignoreQueryParameters:
|
|
6179
|
+
deduplicateSimilarURLs: z11.boolean().optional(),
|
|
6180
|
+
ignoreQueryParameters: z11.boolean().optional(),
|
|
6110
6181
|
scrapeOptions: scrapeParamsSchema.omit({ url: true }).partial().optional()
|
|
6111
6182
|
}),
|
|
6112
6183
|
outputSchema: crawlOutputSchema,
|
|
@@ -6163,7 +6234,7 @@ server.addTool({
|
|
|
6163
6234
|
Retrieve the current status, progress, and available results for an existing crawl ID. This only reads Firecrawl job state and does not start or modify the crawl.
|
|
6164
6235
|
`,
|
|
6165
6236
|
outputSchema: crawlOutputSchema,
|
|
6166
|
-
parameters:
|
|
6237
|
+
parameters: z11.object({ id: z11.string() }),
|
|
6167
6238
|
execute: async (args2, {
|
|
6168
6239
|
session,
|
|
6169
6240
|
client: mcpClient
|
|
@@ -6190,13 +6261,13 @@ server.addTool({
|
|
|
6190
6261
|
Deprecated compatibility entry point. Use firecrawl_scrape once per known URL with formats: ["json"] and jsonOptions containing the prompt and schema. Use firecrawl_agent for multi-source research when the URLs are not known or the data spans several sites.
|
|
6191
6262
|
`,
|
|
6192
6263
|
outputSchema: deprecatedToolOutputSchema,
|
|
6193
|
-
parameters:
|
|
6194
|
-
urls:
|
|
6195
|
-
prompt:
|
|
6196
|
-
schema:
|
|
6197
|
-
allowExternalLinks:
|
|
6198
|
-
enableWebSearch:
|
|
6199
|
-
includeSubdomains:
|
|
6264
|
+
parameters: z11.object({
|
|
6265
|
+
urls: z11.array(z11.string()),
|
|
6266
|
+
prompt: z11.string().optional(),
|
|
6267
|
+
schema: z11.record(z11.string(), z11.any()).optional(),
|
|
6268
|
+
allowExternalLinks: z11.boolean().optional(),
|
|
6269
|
+
enableWebSearch: z11.boolean().optional(),
|
|
6270
|
+
includeSubdomains: z11.boolean().optional()
|
|
6200
6271
|
}),
|
|
6201
6272
|
canList: () => false,
|
|
6202
6273
|
beforeValidate: () => {
|
|
@@ -6212,24 +6283,24 @@ Deprecated compatibility entry point. Use firecrawl_scrape once per known URL wi
|
|
|
6212
6283
|
throw new UserError(payload.message, payload);
|
|
6213
6284
|
}
|
|
6214
6285
|
});
|
|
6215
|
-
var agentExchangeSchema =
|
|
6216
|
-
enabled:
|
|
6217
|
-
toolkits:
|
|
6218
|
-
maxCalls:
|
|
6219
|
-
requireApproval:
|
|
6286
|
+
var agentExchangeSchema = z11.strictObject({
|
|
6287
|
+
enabled: z11.boolean().optional().describe("Let the agent call Alexandria providers. On by default."),
|
|
6288
|
+
toolkits: z11.array(z11.string()).max(5).optional().describe("Pin up to 5 providers the agent may use, by slug. Omitted means the whole catalog."),
|
|
6289
|
+
maxCalls: z11.number().int().min(1).max(30).optional().describe("Most provider calls the agent may make in this turn."),
|
|
6290
|
+
requireApproval: z11.boolean().optional().describe(
|
|
6220
6291
|
'End the turn with a paid-call pendingApproval before any paid provider call. Requires mode "chat" on the same request, even on a follow-up.'
|
|
6221
6292
|
),
|
|
6222
|
-
approve:
|
|
6223
|
-
approvalId:
|
|
6224
|
-
callIds:
|
|
6225
|
-
always:
|
|
6293
|
+
approve: z11.strictObject({
|
|
6294
|
+
approvalId: z11.string().uuid(),
|
|
6295
|
+
callIds: z11.array(z11.string()).optional(),
|
|
6296
|
+
always: z11.boolean().optional()
|
|
6226
6297
|
}).optional().describe(
|
|
6227
6298
|
"Answer yes to the pendingApproval the previous turn of this thread ended on (its id, also exchange.requiresAction.approvalId). Needs threadId. For a terms offer, send it only after an organization admin confirms acceptance in the Firecrawl dashboard; this does not accept terms. callIds and always are ignored on terms offers. For paid calls, callIds picks a subset (default all) and always stops asking for the rest of the thread."
|
|
6228
6299
|
),
|
|
6229
|
-
decline:
|
|
6300
|
+
decline: z11.strictObject({ approvalId: z11.string().uuid() }).optional().describe(
|
|
6230
6301
|
"Answer no to that pendingApproval. Needs threadId. A declined terms offer keeps those providers out of the rest of the thread."
|
|
6231
6302
|
),
|
|
6232
|
-
onTermsRequired:
|
|
6303
|
+
onTermsRequired: z11.enum(["skip", "ask"]).optional().describe(
|
|
6233
6304
|
`What to do when a provider the agent would use needs data terms the team has not accepted. Gated providers are never called. "skip" (default): answer with accepted providers and list the rest in exchange.skippedProviders. "ask": the same, plus a terms pendingApproval and exchange.requiresAction. Read terms with terms/show; an organization admin accepts them in the Firecrawl dashboard. There is no auto-accept. Omitted on a follow-up keeps the previous turn's value.`
|
|
6234
6305
|
)
|
|
6235
6306
|
}).describe(
|
|
@@ -6256,21 +6327,21 @@ The job also returns a \`threadId\`. To continue that thread, pass it with a fol
|
|
|
6256
6327
|
The agent only calls Alexandria providers whose terms the team has accepted. \`exchange.skippedProviders\` lists gated providers. With \`exchange.onTermsRequired\` "ask", a terms \`pendingApproval\` and \`exchange.requiresAction\` carry the \`approvalId\` and provider requirements. Read terms/show through \`firecrawl_scrape\`. An organization admin must accept terms in the Firecrawl dashboard at the provider URL or ${DATA_SOURCES_SETTINGS_URL}. Ignore any terms/accept call in the API response. Only after the admin confirms acceptance, resume with the same \`threadId\` and \`exchange.approve: {approvalId}\`; this does not accept terms. To decline, use \`exchange.decline: {approvalId}\`. Never infer acceptance from a data request.
|
|
6257
6328
|
`,
|
|
6258
6329
|
outputSchema: agentOutputSchema,
|
|
6259
|
-
parameters:
|
|
6260
|
-
prompt:
|
|
6261
|
-
urls:
|
|
6262
|
-
schema:
|
|
6263
|
-
effort:
|
|
6264
|
-
maxCredits:
|
|
6330
|
+
parameters: z11.object({
|
|
6331
|
+
prompt: z11.string().min(1).max(1e4),
|
|
6332
|
+
urls: z11.array(z11.string().url()).optional(),
|
|
6333
|
+
schema: z11.record(z11.string(), z11.any()).optional(),
|
|
6334
|
+
effort: z11.enum(["low", "medium", "high"]).optional().describe("Reasoning budget for the agent task."),
|
|
6335
|
+
maxCredits: z11.number().int().positive().optional().describe(
|
|
6265
6336
|
"Spending limit in credits for this run. Defaults to 2500 on the API."
|
|
6266
6337
|
),
|
|
6267
|
-
strictConstrainToURLs:
|
|
6338
|
+
strictConstrainToURLs: z11.boolean().optional().describe(
|
|
6268
6339
|
"If true, agent will only visit URLs provided in the urls array."
|
|
6269
6340
|
),
|
|
6270
|
-
threadId:
|
|
6341
|
+
threadId: z11.string().uuid().optional().describe(
|
|
6271
6342
|
"Continue this thread: the threadId from an earlier firecrawl_agent or firecrawl_agent_status result. Omit to start a new thread."
|
|
6272
6343
|
),
|
|
6273
|
-
mode:
|
|
6344
|
+
mode: z11.enum(["extract", "chat"]).optional().describe(
|
|
6274
6345
|
`"extract" (default) returns the complete structured result every turn. "chat" lets a follow-up that asks no new data get a short reply in message instead of a re-run; required for exchange.requireApproval. Omitted on a follow-up keeps the previous turn's mode.`
|
|
6275
6346
|
),
|
|
6276
6347
|
exchange: agentExchangeSchema.optional()
|
|
@@ -6340,7 +6411,7 @@ Retrieve progress or final results for a \`firecrawl_agent\` job ID. A \`process
|
|
|
6340
6411
|
Returns job status, progress information, and result data when completed.
|
|
6341
6412
|
`,
|
|
6342
6413
|
outputSchema: agentStatusOutputSchema,
|
|
6343
|
-
parameters:
|
|
6414
|
+
parameters: z11.object({ id: z11.string() }),
|
|
6344
6415
|
execute: async (args2, { session, log, client: mcpClient }) => {
|
|
6345
6416
|
const client = getClient(session);
|
|
6346
6417
|
const { id } = args2;
|
|
@@ -6401,13 +6472,13 @@ Open or reuse a live browser session to navigate a page, click controls, fill fi
|
|
|
6401
6472
|
This acts on the live site, so actions such as form submission can create persistent external side effects. Returns execution output, stdout/stderr, exit status, and session viewing URLs.
|
|
6402
6473
|
`,
|
|
6403
6474
|
outputSchema: interactOutputSchema,
|
|
6404
|
-
parameters:
|
|
6405
|
-
scrapeId:
|
|
6406
|
-
url:
|
|
6407
|
-
prompt:
|
|
6408
|
-
code:
|
|
6409
|
-
language:
|
|
6410
|
-
timeout:
|
|
6475
|
+
parameters: z11.object({
|
|
6476
|
+
scrapeId: z11.string().trim().min(1).optional(),
|
|
6477
|
+
url: z11.string().trim().url().optional(),
|
|
6478
|
+
prompt: z11.string().trim().min(1).optional(),
|
|
6479
|
+
code: z11.string().trim().min(1).optional(),
|
|
6480
|
+
language: z11.enum(["bash", "python", "node"]).optional(),
|
|
6481
|
+
timeout: z11.number().min(1).max(300).optional(),
|
|
6411
6482
|
scrapeOptions: scrapeParamsSchema.omit({ url: true }).partial().optional()
|
|
6412
6483
|
}).refine((data) => Boolean(data.scrapeId) !== Boolean(data.url), {
|
|
6413
6484
|
message: "Provide either 'url' (interact directly) or 'scrapeId' (reuse a previous scrape), not both."
|
|
@@ -6486,8 +6557,8 @@ server.addTool({
|
|
|
6486
6557
|
Stop the live interact session associated with a \`scrapeId\` and release its resources. Returns a success confirmation.
|
|
6487
6558
|
`,
|
|
6488
6559
|
outputSchema: interactStopOutputSchema,
|
|
6489
|
-
parameters:
|
|
6490
|
-
scrapeId:
|
|
6560
|
+
parameters: z11.object({
|
|
6561
|
+
scrapeId: z11.string()
|
|
6491
6562
|
}),
|
|
6492
6563
|
execute: async (args2, { session, log, client: mcpClient }) => {
|
|
6493
6564
|
const client = getClient(session);
|
|
@@ -6602,16 +6673,18 @@ function registerMarketplaceSearchTool(registrar, getClientFn) {
|
|
|
6602
6673
|
destructiveHint: false
|
|
6603
6674
|
},
|
|
6604
6675
|
description: `
|
|
6605
|
-
Search web and specialized indexes, returning ranked results with query-relevant highlights. Each web result is a title, URL, and description. Operators include quoted phrases, \`-term\`, \`site:host\`, \`inurl:term\`, \`intitle:term\`, and \`related:host\`; the set is non-exhaustive. \`includeDomains\` and \`excludeDomains\` are mutually exclusive hostname filters; categories limit result types to \`research\`, \`pdf\`, or \`
|
|
6676
|
+
Search web and specialized indexes, returning ranked results with query-relevant highlights. Each web result is a title, URL, and description. Operators include quoted phrases, \`-term\`, \`site:host\`, \`inurl:term\`, \`intitle:term\`, and \`related:host\`; the set is non-exhaustive. \`includeDomains\` and \`excludeDomains\` are mutually exclusive hostname filters; categories limit result types to \`research\`, \`pdf\`, \`developer\`, or \`gov\`.
|
|
6606
6677
|
|
|
6607
6678
|
For a programming question, add \`categories: ["developer"]\`. It searches an index of public repositories, GitHub issues, merged pull requests, repository READMEs, and code documentation, and returns the results in \`data.web\` with \`category: "developer"\`.
|
|
6608
6679
|
|
|
6680
|
+
For a legal or regulatory question, \`categories: ["gov"]\` returns results in \`data.web\` with \`category: "gov"\` and cannot be combined with other categories; \`firecrawl_gov_search\` is the dedicated tool.
|
|
6681
|
+
|
|
6609
6682
|
${ALEXANDRIA_SEARCH_INSTRUCTIONS}
|
|
6610
6683
|
|
|
6611
6684
|
Returns result groups in \`data\` and an operation \`id\`.
|
|
6612
6685
|
`,
|
|
6613
6686
|
outputSchema: searchOutputSchema,
|
|
6614
|
-
parameters:
|
|
6687
|
+
parameters: z11.object({ ...searchToolBaseFields }).strict().refine(searchDomainsAreExclusive, SEARCH_DOMAINS_CONFLICT_MESSAGE).refine(
|
|
6615
6688
|
searchQueryIsValid,
|
|
6616
6689
|
"A query is required. Use firecrawl_find_tools to browse the catalogue."
|
|
6617
6690
|
),
|
|
@@ -6691,6 +6764,7 @@ if (process.env.CLOUD_SERVICE === "true" || process.env.SSE_LOCAL === "true" ||
|
|
|
6691
6764
|
registerMonitorTools(server);
|
|
6692
6765
|
registerResearchTools(server, getClient);
|
|
6693
6766
|
registerDeveloperTools(server, getClient);
|
|
6767
|
+
registerGovTools(server, getClient);
|
|
6694
6768
|
registerUsageTools(server, getClient);
|
|
6695
6769
|
if (process.env.CLOUD_SERVICE === "true" && primaryProfile.allowKeyless && !normalizeHeader(process.env.KEYLESS_PROXY_SECRET)) {
|
|
6696
6770
|
console.warn(
|
|
@@ -6725,6 +6799,7 @@ if (searchProfileEnabled) {
|
|
|
6725
6799
|
};
|
|
6726
6800
|
registerResearchTools(searchRegistrar, getClient);
|
|
6727
6801
|
registerDeveloperTools(searchRegistrar, getClient);
|
|
6802
|
+
registerGovTools(searchRegistrar, getClient);
|
|
6728
6803
|
registerMarketplaceSearchTool(searchRegistrar, getClient);
|
|
6729
6804
|
searchRegistrar.addTool(searchSurfaceFindToolsTool);
|
|
6730
6805
|
searchRegistrar.addTool(searchSurfaceScrapeTool);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "firecrawl-mcp",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.28.0",
|
|
4
4
|
"description": "MCP server for Firecrawl — search, scrape, and interact with the web, and search scientific papers. Supports both cloud and self-hosted instances. Features include web search, scraping, page interaction, batch processing, LLM-powered content analysis, and research paper search over biomedical and arXiv literature (PubMed, bioRxiv, medRxiv, arXiv) with citation-graph expansion and full-text reading.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"mcpName": "io.github.firecrawl/firecrawl-mcp-server",
|