Skip to main content
Glama
Firecrawl MCP Server

Firecrawl MCP Server

Firecrawl interact

firecrawl_interact

Open or reuse a live browser session to navigate pages, click controls, fill and submit forms, or run browser code with a timeout.

Instructions

Open or reuse a live browser session to navigate a page, click controls, fill and submit forms, or run browser code. Provide either url or scrapeId, and either a natural-language prompt or executable code; code can run as Bash, Python, or Node with a bounded timeout.

The session runs in an isolated Firecrawl-hosted browser that never receives the end user's own browser cookies or credentials. By default it starts with no cookies or saved sessions; an optional team-scoped scrapeOptions.profile reuses state saved by the team's earlier sessions. Actions run on the live site, so submitting a form can have effects on that site. Returns execution output, stdout/stderr, exit status, and session viewing URLs.

Input Schema

NameRequiredDescriptionDefault
urlNo
codeNo
promptNo
timeoutNo
languageNo
scrapeIdNo
scrapeOptionsNo

Output Schema

NameRequiredDescriptionDefault
urlNoThe URL the session was opened from, when opening failed.
dataNoPayload returned by the interaction.
errorNoWhy the interaction or the session could not run.
outputNoExecution output.
resultNoInteraction result, when it is not an object of its own.
stderrNoStandard error of the executed code.
stdoutNoStandard output of the executed code.
liveUrlNoURL for viewing the live session.
successNoWhether the API call succeeded.
exitCodeNoExit status of the executed code.
scrapeIdNoSession identifier; pass it to reuse the session or to `firecrawl_interact_stop`.
sessionUrlNoURL for viewing the live session.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv3.36.1
    • changedInput schema / properties / scrapeOptions / properties / jsonOptions / properties / schema / additionalProperties
      Previous value: -{}New value: +true
  2. Changed5 schema fields changedv1.0.2
    • changedInput schema / $schema
      Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
    • removedInput schema / properties / scrapeOptions / properties / actions / items / additionalProperties
      Removed value: -false
    • changedInput schema / properties / scrapeOptions / properties / formats / items / enum
      Previous value: -[
      -  "markdown",
      -  "html",
      -  "rawHtml",
      -  "screenshot",
      -  "links",
      -  "summary",
      -  "changeTracking",
      -  "branding",
      -  "json",
      -  "query",
      -  "audio"
      -]New value: +[
      +  "markdown",
      +  "html",
      +  "rawHtml",
      +  "screenshot",
      +  "links",
      +  "images",
      +  "summary",
      +  "changeTracking",
      +  "branding",
      +  "json",
      +  "query",
      +  "audio"
      +]
    • changedInput schema / properties / scrapeOptions / properties / queryOptions / required
      Previous value: -[
      -  "prompt",
      -  "mode"
      -]New value: +[
      +  "prompt"
      +]
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "description": "Result of a browser interaction, with the session identifier to continue or stop it.",
      +  "properties": {
      +    "data": {
      +      "description": "Payload returned by the interaction."
      +    },
      +    "error": {
      +      "description": "Why the interaction or the session could not run."
      +    },
      +    "exitCode": {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Exit status of the executed code."
      +    },
      +    "liveUrl": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "URL for viewing the live session."
      +    },
      +    "output": {
      +      "description": "Execution output."
      +    },
      +    "result": {
      +      "description": "Interaction result, when it is not an object of its own."
      +    },
      +    "scrapeId": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Session identifier; pass it to reuse the session or to `firecrawl_interact_stop`."
      +    },
      +    "sessionUrl": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "URL for viewing the live session."
      +    },
      +    "stderr": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Standard error of the executed code."
      +    },
      +    "stdout": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Standard output of the executed code."
      +    },
      +    "success": {
      +      "anyOf": [
      +        {
      +          "type": "boolean"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Whether the API call succeeded."
      +    },
      +    "url": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "The URL the session was opened from, when opening failed."
      +    }
      +  },
      +  "type": "object"
      +}
  3. First observedv1.0.1

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations it discloses real operational characteristics: an isolated Firecrawl-hosted browser with no end-user cookies, empty session state by default, optional team-scoped profile reuse, a bounded code timeout, and the warning that actions run live so form submission has effects on the target site. The side-effect warning sits alongside destructiveHint=false but does not contradict it, since it describes site interaction rather than data destruction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short paragraphs: capability first, then isolation and profile state, then side effects and return shape. Each sentence adds information, though the block is dense and could be split into scannable guidance bullets for the input contract.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a high-complexity, open-world tool it covers the essentials: session model, state isolation, side-effect risk, and return payload, and an output schema already documents results. The remaining gap is that session lifecycle (how a scrapeId is reused or terminated, and the role of related session controls) is only hinted at.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden, and it does explain the mutually exclusive url/scrapeId and prompt/code pairs plus the Bash/Python/Node language choice and the purpose of scrapeOptions.profile. However, the large nested scrapeOptions object (actions, formats, proxy, screenshotOptions, jsonOptions, etc.) goes entirely unexplained, leaving most of the schema surface undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific capability set with a clear verb and resource: 'Open or reuse a live browser session to navigate a page, click controls, fill and submit forms, or run browser code.' This sharply separates it from sibling read-only tools like firecrawl_scrape or firecrawl_crawl, and the either/or input contract (url or scrapeId; prompt or code) is stated up front.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly frames when the tool applies (interactive page actions and browser code execution) and gives the selection rule between the two input modes. It does not explicitly name alternatives such as firecrawl_scrape for static content or firecrawl_interact_stop for ending the session, so the agent must infer the boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.