Skip to main content
Glama
NYO2008

Firecrawl MCP Server

by NYO2008

firecrawl_deep_research

Conduct deep web research on complex queries using intelligent crawling, search, and LLM analysis to generate comprehensive insights from multiple sources.

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

  • Handler function that executes the firecrawl_deep_research tool by calling the Firecrawl client's deepResearch method with provided arguments, handling callbacks for activities and sources, logging performance, and formatting the final analysis response.
    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: [
            {
              type: 'text',
              text: trimResponseText(formattedResponse.finalAnalysis),
            },
          ],
          isError: false,
        };
      } catch (error) {
        const errorMessage =
          error instanceof Error ? error.message : String(error);
        return {
          content: [{ type: 'text', text: trimResponseText(errorMessage) }],
          isError: true,
        };
      }
    }
  • Tool schema definition including name, detailed description, and inputSchema for validating arguments like query (required), maxDepth, timeLimit, maxUrls.
    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: {
        type: 'object',
        properties: {
          query: {
            type: 'string',
            description: 'The query to research',
          },
          maxDepth: {
            type: 'number',
            description: 'Maximum depth of research iterations (1-10)',
          },
          timeLimit: {
            type: 'number',
            description: 'Time limit in seconds (30-300)',
          },
          maxUrls: {
            type: 'number',
            description: 'Maximum number of URLs to analyze (1-1000)',
          },
        },
        required: ['query'],
      },
    };
  • src/index.ts:955-966 (registration)
    Registers the firecrawl_deep_research tool (as DEEP_RESEARCH_TOOL) in the server's list of available tools returned by ListToolsRequestSchema.
    server.setRequestHandler(ListToolsRequestSchema, async () => ({
      tools: [
        SCRAPE_TOOL,
        MAP_TOOL,
        CRAWL_TOOL,
        CHECK_CRAWL_STATUS_TOOL,
        SEARCH_TOOL,
        EXTRACT_TOOL,
        DEEP_RESEARCH_TOOL,
        GENERATE_LLMSTXT_TOOL,
      ],
    }));

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/NYO2008/firecrawl-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server