firecrawl-mcp 3.27.2 → 3.27.3

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 +17 -18
  2. package/dist/index.js +68 -14
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -419,6 +419,7 @@ Scrape content from a single URL with advanced options.
419
419
 
420
420
  **Branding format:** Extracts comprehensive brand identity (colors, fonts, typography, spacing, logo, UI components) for design analysis or style replication.
421
421
  **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.
422
423
 
423
424
  **Returns:**
424
425
 
@@ -747,17 +748,17 @@ The agent performs web searches, follows links, reads pages, and gathers data au
747
748
  - `enabled`, `toolkits` (up to 5 provider slugs), `maxCalls` (1 to 30), `requireApproval` (paid calls end the turn with a `pendingApproval`; needs `mode: "chat"` on the same call, even on a follow-up)
748
749
  - `onTermsRequired`: what to do when an Alexandria provider the agent would use needs data terms your team has not accepted. Gated providers are never called in any mode. Omitted on a follow-up keeps the previous turn's value.
749
750
  - `"skip"` (default): answer with accepted providers only. `exchange.skippedProviders` on the status result lists the gated providers that would have helped.
750
- - `"ask"`: the same, plus a terms `pendingApproval` and `exchange.requiresAction` with the exact `terms/show` and `terms/accept` calls for each provider. Each provider's `digest` is always present and is `string | null`; when it is `null`, `terms/show` returns the current digest to send.
751
+ - `"ask"`: the same, plus a terms `pendingApproval` and `exchange.requiresAction` with the approval ID and provider requirements. Read terms with `terms/show`; an organization admin accepts them in the Firecrawl dashboard.
751
752
  - `approve`: `{ approvalId, callIds?, always? }` answers yes to the `pendingApproval` the previous turn ended on. `callIds` and `always` apply to paid-call approvals only.
752
753
  - `decline`: `{ approvalId }` answers no. A declined terms offer keeps those providers out of the rest of the thread.
753
754
  - `approve` and `decline` need `threadId`, and only one of them can be sent.
754
755
 
755
- **Provider terms (ask mode):** there is no auto-accept mode. When a turn ends on a terms offer, the status result carries `pendingApproval` (`kind: "terms"`) and `exchange.requiresAction` with the `approvalId` and the exact `terms/show` and `terms/accept` calls. To use the provider:
756
+ **Provider terms (ask mode):** there is no auto-accept mode. When a turn ends on a terms offer, the status result carries `pendingApproval` (`kind: "terms"`) and `exchange.requiresAction` with the `approvalId` and provider requirements. Any `terms/accept` descriptor in that API payload is unavailable through MCP. To use the provider:
756
757
 
757
758
  1. Show the user the terms (`terms/show` through `firecrawl_scrape` with `alexandria`).
758
- 2. Get the user's explicit consent to that provider's terms. A data request is not consent.
759
- 3. Run the `terms/accept` call through `firecrawl_scrape`.
760
- 4. Continue the same thread: call `firecrawl_agent` with the same `threadId` and `exchange.approve: { "approvalId": "..." }`.
759
+ 2. Direct an organization admin to accept the terms at the provider's URL, or [data sources settings](https://www.firecrawl.dev/app/settings?tab=data-sources). A data request is not consent.
760
+ 3. Wait for the admin to confirm acceptance in the dashboard.
761
+ 4. Continue the same thread: call `firecrawl_agent` with the same `threadId` and `exchange.approve: { "approvalId": "..." }`. This resumes research and does not accept terms.
761
762
 
762
763
  If the user says no, call `firecrawl_agent` with the same `threadId` and `exchange.decline: { "approvalId": "..." }` instead.
763
764
 
@@ -818,13 +819,13 @@ Then poll with `firecrawl_agent_status` using the returned job ID.
818
819
  }
819
820
  ```
820
821
 
821
- **Usage Example (continue the thread after the user accepted a provider's terms):**
822
+ **Usage Example (continue the thread after an admin confirmed dashboard acceptance):**
822
823
 
823
824
  ```json
824
825
  {
825
826
  "name": "firecrawl_agent",
826
827
  "arguments": {
827
- "prompt": "I accepted the Apollo terms. Continue.",
828
+ "prompt": "The admin confirmed acceptance of the Apollo terms in the dashboard. Continue.",
828
829
  "threadId": "0199a1b2-0000-7000-8000-000000000031",
829
830
  "exchange": { "approve": { "approvalId": "0199a1b2-0000-7000-8000-000000000033" } }
830
831
  }
@@ -1113,16 +1114,14 @@ HTTP 403 and this body:
1113
1114
  The tool result relays it as an error with `structuredContent` carrying `code`,
1114
1115
  `status: 403`, `requestId`, the `requiresAction` object unchanged, and
1115
1116
  `next_actions` (`human_action_required` then `retry_same_request`). Accepting
1116
- terms is a legal act. Use the returned `nextTool` call to read the agreement through `firecrawl_scrape`
1117
- with `alexandria: [{provider: "firecrawl", capability: "terms/show", options: {provider: "<provider>"}}]`.
1118
- Present it to the user and obtain explicit authorization to bind their organization
1119
- before calling `firecrawl_scrape` with capability `terms/accept` under provider `firecrawl`.
1120
- Its options are `provider`, the exact reviewed `version`
1121
- and 64-character lowercase hexadecimal `digest`, and `confirmed: true`. A request
1122
- for data is not consent. Authority or eligibility errors may require an organization
1123
- admin to use `requiresAction.url`. No automatic acceptance or uncertain retries occur.
1124
- Send terms calls separately from execution. These are nested capabilities, not top-level MCP tools.
1125
- No credits are charged for the blocked retrieval. After confirmed acceptance, call the same
1117
+ terms is a legal act, so an organization admin accepts them in the Firecrawl dashboard, not
1118
+ through MCP. Use the returned `nextTool` call to read the agreement through `firecrawl_scrape`
1119
+ with `alexandria: [{provider: "firecrawl", capability: "terms/show", options: {provider: "<provider>"}}]`,
1120
+ sent separately from provider execution, and present it to the user. An organization admin then
1121
+ accepts it at `requiresAction.url`, or at https://www.firecrawl.dev/app/settings?tab=data-sources.
1122
+ `firecrawl_scrape` refuses every other `terms/*` capability, so it makes no account changes. A request
1123
+ for data is not consent, and no automatic acceptance or uncertain retries occur.
1124
+ No credits are charged for the blocked retrieval. After the admin confirms acceptance, call the same
1126
1125
  tool again with the identical payload and `requestId`.
1127
1126
 
1128
1127
  ### 16. Credit Usage Tool
@@ -1288,7 +1287,7 @@ The existing `firecrawl_feedback` tool accepts `endpoint: "alexandria"`:
1288
1287
  }
1289
1288
  ```
1290
1289
 
1291
- `objective` is the underlying goal of the session: what the agent or its user was ultimately trying to accomplish, beyond the single website in `requestedWebsite`.
1290
+ The optional `objective` is the underlying goal of the session: what the agent or its user was ultimately trying to accomplish, beyond the single website in `requestedWebsite`.
1292
1291
 
1293
1292
  This uses authenticated `POST /v2/feedback`, without a job ID, job-age deadline, or credit refund. Optional `providerFeedback` and `capabilityFeedback` arrays describe coverage gaps and execution issues; the tool schema lists supported issue values. A `new_capability_request` requires `requestedFunctionality`; `missing_capability` (the provider exists but lacks the capability) does not. Existing feedback opt-out and authentication controls apply.
1294
1293
 
package/dist/index.js CHANGED
@@ -76,8 +76,7 @@ var alexandriaSessionFeedbackSchema = z.strictObject({
76
76
  rating: z.enum(["good", "bad", "partial"]),
77
77
  ...alexandriaFeedbackFields,
78
78
  requestedWebsite: alexandriaFeedbackFields.requestedWebsite.unwrap(),
79
- rationale: detail,
80
- objective: detail
79
+ rationale: detail
81
80
  });
82
81
 
83
82
  // src/index.ts
@@ -2271,6 +2270,10 @@ var agentStatusOutputSchema = z4.object({
2271
2270
  status: str("Job state: `processing` is non-terminal; `completed` and `failed` are terminal."),
2272
2271
  progress: unknown("Progress information for a running job."),
2273
2272
  data: unknown("Research result, present once the job has completed."),
2273
+ partial: unknown("Incomplete best-effort result of a `failed` run; never a completed answer."),
2274
+ partialSchemaValid: bool("Whether `partial` matches the requested schema, when one was supplied."),
2275
+ stopReason: str("Why a `failed` run stopped early; `credit_limit_reached` means it hit maxCredits."),
2276
+ notice: str("Set when the run stopped at its credit limit: what that means and how to continue."),
2274
2277
  creditsUsed: num("Credits the job consumed."),
2275
2278
  sources: unknown("Sources the agent read."),
2276
2279
  expiresAt: str("When the job result expires and can no longer be read."),
@@ -2281,10 +2284,10 @@ var agentStatusOutputSchema = z4.object({
2281
2284
  message: unknown("The agent's reply; in chat mode, the short answer to a follow-up."),
2282
2285
  suggestions: unknown("Follow-ups the agent offers; send one as the prompt of the next turn with this threadId."),
2283
2286
  exchange: unknown(
2284
- "What the job did with Alexandria providers: onTermsRequired, paidCalls, creditsUsed, skippedProviders (gated providers that would have helped), and requiresAction (approvalId plus the terms/show and terms/accept calls, each provider digest string | null and always present; call accept only with the user's explicit consent, then continue the thread with exchange.approve: {approvalId})."
2287
+ "What the job did with Alexandria providers: onTermsRequired, paidCalls, creditsUsed, skippedProviders (gated providers that would have helped), and requiresAction (approvalId and provider requirements). Read terms with terms/show. Ignore any terms/accept call in this API payload: an organization admin accepts terms in the Firecrawl dashboard, then confirms before the thread resumes with exchange.approve: {approvalId}."
2285
2288
  ),
2286
2289
  pendingApproval: unknown(
2287
- 'Set when the job ended waiting on the caller. Answer it by calling firecrawl_agent with this threadId and exchange.approve or exchange.decline carrying its id. kind "terms" lists providers whose data terms need accepting; otherwise calls lists paid calls waiting for approval.'
2290
+ 'Set when the job ended waiting on the caller. Answer it by calling firecrawl_agent with this threadId and exchange.approve or exchange.decline carrying its id. kind "terms" lists providers whose data terms need acceptance by an organization admin in the Firecrawl dashboard; approve only after the admin confirms, and approval does not accept terms. Otherwise calls lists paid calls waiting for approval.'
2288
2291
  )
2289
2292
  }).describe("Progress or final result of a research agent job.");
2290
2293
  var interactOutputSchema = z4.object({
@@ -4155,6 +4158,8 @@ var searchDomainSchema = z10.string().trim().toLowerCase().min(1).max(253).regex
4155
4158
  var searchToolBaseFields = {
4156
4159
  toolDetail: z10.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."),
4157
4160
  query: z10.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."),
4161
+ objective: z10.string().trim().min(1).max(5e3).optional().describe("Optional broader goal for this search, if known. Avoid sensitive information."),
4162
+ clientModel: z10.string().trim().min(1).max(128).optional().describe("Optional model identifier, if known."),
4158
4163
  domainTools: z10.boolean().optional().describe(
4159
4164
  "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."
4160
4165
  ),
@@ -4198,6 +4203,15 @@ function assertExchangeCredential(session) {
4198
4203
  throw new UserError(payload.message, payload);
4199
4204
  }
4200
4205
  var TERMS_REQUIRED_CODE = "THIRD_PARTY_DATA_TERMS_REQUIRED";
4206
+ var DATA_SOURCES_SETTINGS_URL = "https://www.firecrawl.dev/app/settings?tab=data-sources";
4207
+ function isTermsWrite(call) {
4208
+ const capability = call.capability.trim().toLowerCase();
4209
+ return call.provider.trim().toLowerCase() === "firecrawl" && capability.startsWith("terms/") && capability !== "terms/show";
4210
+ }
4211
+ function termsWriteError() {
4212
+ const message = `Provider terms are accepted in the Firecrawl dashboard, not through this connection. Read them with terms/show, then ask an organization admin to accept them at ${DATA_SOURCES_SETTINGS_URL}.`;
4213
+ return new UserError(message, { code: "invalid_option", status: 400, message });
4214
+ }
4201
4215
  function termsRequiredAction(body) {
4202
4216
  const data = body;
4203
4217
  if (data?.code !== TERMS_REQUIRED_CODE) return void 0;
@@ -4218,8 +4232,8 @@ function termsRequiredError(action, context, hints) {
4218
4232
  return new UserError(
4219
4233
  `${message}
4220
4234
 
4221
- 1. Read the agreement with firecrawl_scrape using alexandria: {provider: "firecrawl", capability: "terms/show", options: {provider: "${action.terms}"}} and present it to the user. Only after explicit authorization to accept that exact version and digest, use firecrawl_scrape with alexandria: {provider: "firecrawl", capability: "terms/accept", options: {provider: "${action.terms}", version: "<reviewed-version>", digest: "<reviewed-digest>", confirmed: true}}. Send terms calls separately from provider execution. If authority or eligibility requires a dashboard action, ask an organization admin to visit ${action.url} or https://www.firecrawl.dev/app/settings?tab=data-sources if that page is unavailable. Never infer acceptance from a data request.
4222
- 2. After they confirm, call ${context.tool} again with the identical payload${retryIdentity}. If the same terms error persists, stop and ask an organization admin to check access at https://www.firecrawl.dev/app/settings?tab=data-sources.
4235
+ 1. Read the agreement with firecrawl_scrape using alexandria: {provider: "firecrawl", capability: "terms/show", options: {provider: "${action.terms}"}} and present it to the user. Send terms/show separately from provider execution. Terms are accepted in the Firecrawl dashboard, not through this connection: ask an organization admin to accept them at ${action.url}, or ${DATA_SOURCES_SETTINGS_URL} if that page is unavailable. Never infer acceptance from a data request.
4236
+ 2. After the admin confirms, call ${context.tool} again with the identical payload${retryIdentity}. If the same terms error persists, stop and ask an organization admin to check access at ${DATA_SOURCES_SETTINGS_URL}.
4223
4237
 
4224
4238
  Do not retry until acceptance is confirmed.`,
4225
4239
  {
@@ -4281,7 +4295,7 @@ async function relayExchangeError(run, context) {
4281
4295
  const disabledProvider = response.status === 403 ? context.providers?.find((provider) => message === `Access to ${provider} is disabled for this organization.`) : void 0;
4282
4296
  if (disabledProvider) {
4283
4297
  throw new UserError(
4284
- `${message} Read the provider terms and status using nextTool and present them to the user. Never infer acceptance from a data request. Only after explicit authorization for the reviewed version and digest may you call firecrawl_scrape with alexandria:{provider:"firecrawl",capability:"terms/accept",options:{provider:"${disabledProvider}",version:"<reviewed-version>",digest:"<reviewed-digest>",confirmed:true}}. Send terms calls separately. Acceptance may not restore disabled access; an organization admin may need to review https://www.firecrawl.dev/app/settings?tab=data-sources. Retry the original request only after access is restored.`,
4298
+ `${message} Read the provider terms and status using nextTool and present them to the user. Never infer acceptance from a data request. Terms are accepted in the Firecrawl dashboard, not through this connection; acceptance may not restore disabled access, and an organization admin can review access at ${DATA_SOURCES_SETTINGS_URL}. Retry the original request only after access is restored.`,
4285
4299
  {
4286
4300
  code: typeof data?.code === "string" ? data.code : "exchange_error",
4287
4301
  status: 403,
@@ -5321,8 +5335,9 @@ var scrapeTool = {
5321
5335
  name: "firecrawl_scrape",
5322
5336
  annotations: {
5323
5337
  title: "Firecrawl scrape",
5324
- readOnlyHint: false,
5325
- // Alexandria capabilities can record provider agreement acceptance.
5338
+ // Hosted scrape omits browser actions and refuses provider terms writes
5339
+ // before execution.
5340
+ readOnlyHint: SAFE_MODE,
5326
5341
  openWorldHint: true,
5327
5342
  // Accepts any user-supplied URL on the public web.
5328
5343
  destructiveHint: false
@@ -5349,6 +5364,9 @@ Alexandria mode, on an authenticated session with Alexandria access: \`alexandri
5349
5364
  } = args2;
5350
5365
  if (alexandria) {
5351
5366
  assertExchangeCredential(session);
5367
+ if ((Array.isArray(alexandria) ? alexandria : [alexandria]).some(isTermsWrite)) {
5368
+ throw termsWriteError();
5369
+ }
5352
5370
  log.info("Executing Alexandria capabilities", {
5353
5371
  count: Array.isArray(alexandria) ? alexandria.length : 1
5354
5372
  });
@@ -5596,7 +5614,7 @@ var findToolsTool = {
5596
5614
  };
5597
5615
  server.addTool(findToolsTool);
5598
5616
  var SEARCH_SURFACE_SCRAPE_DESCRIPTION = `
5599
- 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. Browser actions can change the live page when interactive actions are enabled, and a named browser profile can load saved session data and overwrite its stored state.
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.
5600
5618
 
5601
5619
  \`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.
5602
5620
 
@@ -6206,13 +6224,13 @@ var agentExchangeSchema = z10.strictObject({
6206
6224
  callIds: z10.array(z10.string()).optional(),
6207
6225
  always: z10.boolean().optional()
6208
6226
  }).optional().describe(
6209
- "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 the user explicitly agreed and terms/accept succeeded; 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."
6227
+ "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."
6210
6228
  ),
6211
6229
  decline: z10.strictObject({ approvalId: z10.string().uuid() }).optional().describe(
6212
6230
  "Answer no to that pendingApproval. Needs threadId. A declined terms offer keeps those providers out of the rest of the thread."
6213
6231
  ),
6214
6232
  onTermsRequired: z10.enum(["skip", "ask"]).optional().describe(
6215
- `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 with the terms/show and terms/accept calls. Each provider digest is string | null and always present; when null, terms/show returns it. There is no auto-accept. Omitted on a follow-up keeps the previous turn's value.`
6233
+ `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.`
6216
6234
  )
6217
6235
  }).describe(
6218
6236
  "Alexandria provider settings for this turn, forwarded as the request's exchange object."
@@ -6235,7 +6253,7 @@ This call returns only a job ID, not the research result. Read the job with \`fi
6235
6253
 
6236
6254
  The job also returns a \`threadId\`. To continue that thread, pass it with a follow-up \`prompt\`; omitted \`mode\`, \`urls\`, \`schema\` and exchange settings carry over from the previous turn.
6237
6255
 
6238
- The agent only calls Alexandria providers whose data terms the team has accepted. The status result's \`exchange.skippedProviders\` lists gated providers that would have helped. With \`exchange.onTermsRequired\` "ask", a terms offer ends the turn: \`pendingApproval\` (kind "terms") and \`exchange.requiresAction\` carry the \`approvalId\` and the exact terms/show and terms/accept calls. Show the user the terms, get their EXPLICIT consent, run terms/accept through \`firecrawl_scrape\`, then call \`firecrawl_agent\` with the same \`threadId\` and \`exchange.approve: {approvalId}\`. If they decline, send \`exchange.decline: {approvalId}\` instead. Never call terms/accept without that consent; a data request is not consent.
6256
+ 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.
6239
6257
  `,
6240
6258
  outputSchema: agentOutputSchema,
6241
6259
  parameters: z10.object({
@@ -6331,9 +6349,41 @@ Returns job status, progress information, and result data when completed.
6331
6349
  `/v2/agent/${encodeURIComponent(id)}`,
6332
6350
  originHeaders(requestOrigin(mcpClient, session))
6333
6351
  );
6334
- return structuredText(res?.data ?? {});
6352
+ return agentStatusResult(res?.data ?? {});
6335
6353
  }
6336
6354
  });
6355
+ function agentStatusResult(data) {
6356
+ const run = data;
6357
+ if (!run || typeof run !== "object" || run.status !== "failed" || run.stopReason !== "credit_limit_reached") {
6358
+ return structuredText(data);
6359
+ }
6360
+ const lines = [
6361
+ "This agent run stopped at its credit limit (maxCredits) before finishing."
6362
+ ];
6363
+ const hasPartial = run.partial !== void 0 && run.partial !== null;
6364
+ if (hasPartial) {
6365
+ const validity = run.partialSchemaValid === true ? " It matches the schema this run was given." : run.partialSchemaValid === false ? " It does not match the schema this run was given." : "";
6366
+ lines.push(
6367
+ `\`partial\` is an INCOMPLETE best-effort result, not a finished answer; tell the user it is incomplete.${validity}`
6368
+ );
6369
+ } else {
6370
+ lines.push("No partial result was recovered.");
6371
+ }
6372
+ if (typeof run.message === "string" && run.message.trim()) {
6373
+ lines.push(`Agent message: ${run.message.trim()}`);
6374
+ }
6375
+ const threadId = typeof run.threadId === "string" ? run.threadId : void 0;
6376
+ lines.push(
6377
+ threadId ? `To continue, call firecrawl_agent with threadId "${threadId}" and a prompt to finish the task (the follow-up ${hasPartial ? "resumes from this partial" : "keeps this thread"}), or start a new run with a higher maxCredits.` : "To continue, start a new firecrawl_agent run with a higher maxCredits."
6378
+ );
6379
+ const notice = lines.join(" ");
6380
+ return withStructured(
6381
+ `${notice}
6382
+
6383
+ ${JSON.stringify(data, null, 2)}`,
6384
+ { ...run, notice }
6385
+ );
6386
+ }
6337
6387
  server.addTool({
6338
6388
  name: "firecrawl_interact",
6339
6389
  annotations: {
@@ -6568,6 +6618,8 @@ Returns result groups in \`data\` and an operation \`id\`.
6568
6618
  execute: async (args2, { session, log, client: mcpClient }) => {
6569
6619
  const {
6570
6620
  query,
6621
+ objective,
6622
+ clientModel,
6571
6623
  includeDomains,
6572
6624
  excludeDomains,
6573
6625
  limit,
@@ -6585,6 +6637,8 @@ Returns result groups in \`data\` and an operation \`id\`.
6585
6637
  const searchBody = {
6586
6638
  query: searchQuery,
6587
6639
  ...removeEmptyTopLevel({
6640
+ objective,
6641
+ clientModel,
6588
6642
  limit,
6589
6643
  includeDomains,
6590
6644
  excludeDomains,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "firecrawl-mcp",
3
- "version": "3.27.2",
3
+ "version": "3.27.3",
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",