Skip to main content
Glama

Start Pentest

start_pentest

Launch an AI-powered penetration test against a verified target URL to identify security vulnerabilities and assess application security posture.

Instructions

Launch an AI-powered penetration test against a target URL. The domain must be verified first (see list_domains). Requires an available credit matching the selected tier.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
target_urlYesThe target URL to scan (must be a verified domain)
repo_urlNoGitHub repository URL for white-box scanning (SAST, secrets, SCA)
tierNoScan tier: recon (1 agent, 30min), standard (4 agents, 1hr), deep (10 agents, 2hr), blitz (20 agents, 4hr)standard

Implementation Reference

  • The registration and handler for the start_pentest tool. The tool definition, schema, and core logic (invoking client.startPentest) are consolidated in this function.
    export function registerStartPentest(server: McpServer, client: TurboPentestClient): void {
      server.registerTool(
        "start_pentest",
        {
          title: "Start Pentest",
          description:
            "Launch an AI-powered penetration test against a target URL. " +
            "The domain must be verified first (see list_domains). " +
            "Requires an available credit matching the selected tier.",
          inputSchema: z.object({
            target_url: z.string().url().describe("The target URL to scan (must be a verified domain)"),
            repo_url: z
              .string()
              .url()
              .optional()
              .describe("GitHub repository URL for white-box scanning (SAST, secrets, SCA)"),
            tier: z
              .enum(["recon", "standard", "deep", "blitz"])
              .default("standard")
              .describe(
                "Scan tier: recon (1 agent, 30min), standard (4 agents, 1hr), deep (10 agents, 2hr), blitz (20 agents, 4hr)",
              ),
          }),
        },
        async ({ target_url, repo_url, tier }) => {
          try {
            const result = await client.startPentest({
              targetUrl: target_url,
              repoUrl: repo_url,
              tier,
            });
    
            if ("groupId" in result && result.groupId) {
              const multi = result as MultiDomainResponse;
              const lines = [
                `Pentest group started: ${multi.groupId}`,
                `Scans launched: ${(multi.scans ?? []).length}`,
                "",
                ...(multi.scans ?? []).map((s) => `  - ${s.targetUrl} (ID: ${s.id})`),
                "",
                "Use get_pentest with each scan ID to check status.",
              ];
              return { content: [{ type: "text" as const, text: lines.join("\n") }] };
            }
    
            const scan = result as Scan;
            const tierInfo: Record<string, { agents: number; duration: string }> = {
              recon: { agents: 1, duration: "~30 minutes" },
              standard: { agents: 4, duration: "~1 hour" },
              deep: { agents: 10, duration: "~2 hours" },
              blitz: { agents: 20, duration: "~4 hours" },
            };
            const info = tierInfo[tier] || tierInfo.standard;
    
            const lines = [
              "Pentest started successfully",
              "",
              `  ID:       ${scan.id}`,
              `  Target:   ${scan.targetUrl}`,
              `  Status:   ${scan.status}`,
              `  Tier:     ${tier}`,
              `  Agents:   ${info.agents}`,
              `  Duration: ${info.duration}`,
              scan.repoUrl ? `  Repo:     ${scan.repoUrl}` : null,
              "",
              `Use get_pentest("${scan.id}") to check progress.`,
            ];
    
            return {
              content: [{ type: "text" as const, text: lines.filter(Boolean).join("\n") }],
            };
          } catch (error) {
            const message = error instanceof Error ? error.message : String(error);
            return {
              content: [{ type: "text" as const, text: `Failed to start pentest: ${message}` }],
              isError: true,
            };
          }
        },
      );
    }
Behavior3/5

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

With no annotations, the description carries full burden. It discloses key behavioral traits: it's a launch/mutation operation (implied by 'Launch'), requires verification and credits, and mentions scanning tiers. However, it lacks details on rate limits, response format, or error handling.

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?

Two sentences are front-loaded with essential information (action, target, prerequisites), with zero wasted words. Each sentence earns its place by covering critical usage constraints.

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

Completeness3/5

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

For a mutation tool with no annotations and no output schema, the description is moderately complete. It covers prerequisites and tier context, but lacks details on what happens after launch (e.g., async process, report generation) or error scenarios, leaving gaps in operational understanding.

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 100%, so the schema already documents all parameters well. The description adds minimal value beyond the schema, only implying target_url must be verified and tier affects credit usage, but no additional syntax or format details.

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 specific action ('Launch an AI-powered penetration test') and target resource ('against a target URL'), distinguishing it from siblings like list_domains or get_pentest by focusing on initiating a scan rather than querying existing data.

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 provides explicit prerequisites (domain must be verified via list_domains, requires available credit) and context (matching the selected tier), but does not specify when to use alternatives like get_findings or list_pentests for post-scan actions.

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

Install Server

Other Tools

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/IntegSec/turbopentest-mcp'

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