Skip to main content
Glama
ashishdevthakur3-max

Firecrawl MCP Server

firecrawl_deep_research

Analyze complex research questions by crawling multiple web sources and generating comprehensive LLM-based analysis.

Instructions

Conduct deep web research on a query using intelligent crawling, search, and LLM analysis.

Best for: Complex research questions requiring multiple sources, in-depth analysis. Not recommended for: Simple questions that can be answered with a single search; when you need very specific information from a known page (use scrape); when you need results quickly (deep research can take time). Arguments:

  • query (string, required): The research question or topic to explore.

  • maxDepth (number, optional): Maximum recursive depth for crawling/search (default: 3).

  • timeLimit (number, optional): Time limit in seconds for the research session (default: 120).

  • maxUrls (number, optional): Maximum number of URLs to analyze (default: 50). Prompt Example: "Research the environmental impact of electric vehicles versus gasoline vehicles." Usage Example:

{
  "name": "firecrawl_deep_research",
  "arguments": {
    "query": "What are the environmental impacts of electric vehicles compared to gasoline vehicles?",
    "maxDepth": 3,
    "timeLimit": 120,
    "maxUrls": 50
  }
}

Returns: Final analysis generated by an LLM based on research. (data.finalAnalysis); may also include structured activities and sources used in the research process.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
queryYesThe query to research
maxDepthNoMaximum depth of research iterations (1-10)
timeLimitNoTime limit in seconds (30-300)
maxUrlsNoMaximum number of URLs to analyze (1-1000)

Implementation Reference

  • The handler for the 'firecrawl_deep_research' tool in the request-handling switch statement.
    case 'firecrawl_deep_research': {
      if (!args || typeof args !== 'object' || !('query' in args)) {
        throw new Error('Invalid arguments for firecrawl_deep_research');
      }
    
      try {
        const researchStartTime = Date.now();
        safeLog('info', `Starting deep research for query: ${args.query}`);
    
        const response = await client.deepResearch(
          args.query as string,
          {
            maxDepth: args.maxDepth as number,
            timeLimit: args.timeLimit as number,
            maxUrls: args.maxUrls as number,
            // @ts-expect-error Extended API options including origin
            origin: 'mcp-server',
          },
          // Activity callback
          (activity) => {
            safeLog(
              'info',
              `Research activity: ${activity.message} (Depth: ${activity.depth})`
            );
          },
          // Source callback
          (source) => {
            safeLog(
              'info',
              `Research source found: ${source.url}${source.title ? ` - ${source.title}` : ''}`
            );
          }
        );
    
        // Log performance metrics
        safeLog(
          'info',
          `Deep research completed in ${Date.now() - researchStartTime}ms`
        );
    
        if (!response.success) {
          throw new Error(response.error || 'Deep research failed');
        }
    
        // Format the results
        const formattedResponse = {
          finalAnalysis: response.data.finalAnalysis,
          activities: response.data.activities,
          sources: response.data.sources,
        };
    
        return {
          content: [
  • src/index.ts:589-616 (registration)
    Definition of the 'firecrawl_deep_research' tool metadata and schema documentation.
    const DEEP_RESEARCH_TOOL: Tool = {
      name: 'firecrawl_deep_research',
      description: `
    Conduct deep web research on a query using intelligent crawling, search, and LLM analysis.
    
    **Best for:** Complex research questions requiring multiple sources, in-depth analysis.
    **Not recommended for:** Simple questions that can be answered with a single search; when you need very specific information from a known page (use scrape); when you need results quickly (deep research can take time).
    **Arguments:**
    - query (string, required): The research question or topic to explore.
    - maxDepth (number, optional): Maximum recursive depth for crawling/search (default: 3).
    - timeLimit (number, optional): Time limit in seconds for the research session (default: 120).
    - maxUrls (number, optional): Maximum number of URLs to analyze (default: 50).
    **Prompt Example:** "Research the environmental impact of electric vehicles versus gasoline vehicles."
    **Usage Example:**
    \`\`\`json
    {
      "name": "firecrawl_deep_research",
      "arguments": {
        "query": "What are the environmental impacts of electric vehicles compared to gasoline vehicles?",
        "maxDepth": 3,
        "timeLimit": 120,
        "maxUrls": 50
      }
    }
    \`\`\`
    **Returns:** Final analysis generated by an LLM based on research. (data.finalAnalysis); may also include structured activities and sources used in the research process.
    `,
      inputSchema: {

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv1.12.0

TDQS

A4.6/5.0
Behavior4/5

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

No annotations provided, so description must disclose behaviors. It mentions the tool takes time, uses LLM analysis, and returns a final analysis along with structured data. However, it does not detail error handling, rate limits, or potential costs associated with deep research.

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

Conciseness5/5

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

Well-structured with sections, bold headers, and bullet points. Every sentence adds value. Includes a brief prompt example and a JSON usage example. No redundant information.

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?

Given no annotations and no output schema, the description covers the return format (finalAnalysis and activities/sources), parameter meanings, and usage context. It could mention error handling or output structure in more detail, but is fairly complete for a complex research tool.

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

Parameters4/5

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

Schema coverage is 100% but descriptions are minimal. The tool description adds meaningful context: explains query as 'research question or topic', provides defaults for maxDepth (3), timeLimit (120), maxUrls (50), and includes a usage example. This adds value beyond the schema.

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 clearly states the tool conducts deep web research using crawling, search, and LLM analysis. It distinguishes this from siblings by specifying it is best for complex multi-source questions, not for simple searches or known-page scraping.

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

Usage Guidelines5/5

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

Explicitly states best for complex research, not recommended for simple questions, specific pages (use scrape), or when quick results are needed. Also mentions time investment, providing clear when-to-use and when-not-to-use guidance.

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