Skip to main content
Glama

recon.subfinder

Discover subdomains for target domains using automated reconnaissance to identify potential attack surfaces for security testing.

Instructions

Run subfinder to discover subdomains for a domain

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
domainYesTarget domain
silentNoSilent mode

Implementation Reference

  • The handler function that executes the subfinder CLI tool: checks if subfinder is installed, runs it with the domain argument (optionally silent), parses subdomains from stdout, saves results to Postgres and Redis, and returns formatted ToolResult.
    async ({ domain, silent = true }: any): Promise<ToolResult> => {
      try {
        const exists = await checkCommandExists('subfinder');
        if (!exists) {
          return formatToolResult(
            false,
            null,
            'subfinder not found. Install from: https://github.com/projectdiscovery/subfinder'
          );
        }
    
        const args = ['-d', domain];
        if (silent) args.push('-silent');
    
        const result = await runCommand('subfinder', args);
        const subdomains = result.stdout
          .split('\n')
          .filter((s) => s.trim().length > 0);
    
        await saveTestResult(domain, 'subfinder', true, { subdomains });
        await setWorkingMemory(`recon:${domain}:subdomains`, subdomains, 3600);
    
        return formatToolResult(true, {
          subdomains,
          count: subdomains.length,
          raw: result.stdout,
        });
      } catch (error: any) {
        await saveTestResult(domain, 'subfinder', false, null, error.message);
        return formatToolResult(false, null, error.message);
      }
    }
  • Input schema for the recon.subfinder tool, defining 'domain' as required string and 'silent' as optional boolean.
    inputSchema: {
      type: 'object',
      properties: {
        domain: { type: 'string', description: 'Target domain' },
        silent: { type: 'boolean', description: 'Silent mode', default: true },
      },
      required: ['domain'],
    },
  • Registration of the 'recon.subfinder' tool via server.tool() call inside registerReconTools function, which is invoked from src/index.ts.
    server.tool(
      'recon.subfinder',
      {
        description: 'Run subfinder to discover subdomains for a domain',
        inputSchema: {
          type: 'object',
          properties: {
            domain: { type: 'string', description: 'Target domain' },
            silent: { type: 'boolean', description: 'Silent mode', default: true },
          },
          required: ['domain'],
        },
      },
      async ({ domain, silent = true }: any): Promise<ToolResult> => {
        try {
          const exists = await checkCommandExists('subfinder');
          if (!exists) {
            return formatToolResult(
              false,
              null,
              'subfinder not found. Install from: https://github.com/projectdiscovery/subfinder'
            );
          }
    
          const args = ['-d', domain];
          if (silent) args.push('-silent');
    
          const result = await runCommand('subfinder', args);
          const subdomains = result.stdout
            .split('\n')
            .filter((s) => s.trim().length > 0);
    
          await saveTestResult(domain, 'subfinder', true, { subdomains });
          await setWorkingMemory(`recon:${domain}:subdomains`, subdomains, 3600);
    
          return formatToolResult(true, {
            subdomains,
            count: subdomains.length,
            raw: result.stdout,
          });
        } catch (error: any) {
          await saveTestResult(domain, 'subfinder', false, null, error.message);
          return formatToolResult(false, null, error.message);
        }
      }
    );

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/telmon95/VulneraMCP'

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