Skip to main content
Glama
attackforge-mcp
by unstrike

attackforge-mcp

An MCP server that connects AI assistants (Claude, etc.) to the AttackForge Self-Service API (SSAPI).


vs. the official AttackForge MCP

AttackForge publishes an official MCP server. It exposes a limited subset of the SSAPI — specifically: whoami, get_file, count_projects, count_vulnerabilities, count_writeups, find_affected_assets, find_projects, find_writeups, find_vulnerabilities, and get_field_structure.

This server covers the full SSAPI and adds a layer of context efficiency on top, designed specifically for use inside long AI conversations:

Official MCP

attackforge-mcp

API coverage

10 endpoints

Full SSAPI

Response passthrough

Raw API JSON

Slimmed (see below)

HTML fields

Returned

Stripped globally (−40–60% size)

List responses

Full objects

Summary projection + total/has_more envelope

Static data (form configs, testsuite library, project index)

Re-fetched every call

SQLite cache with TTLs

Cache management

—

cache tool (stats, invalidate)

Escape hatch

—

raw_request for any unlisted endpoint

Why it matters: Large tool responses dump hundreds of lines of JSON into context on every call. Over a multi-step engagement that context fills up fast. By stripping HTML duplicates, projecting summary fields, and caching data that never changes mid-engagement, this server keeps each tool response as small as possible without losing information.


Related MCP server: VulnCheck MCP Server

Setup

Requirements

  • Python 3.12+

  • uv

Install

git clone https://github.com/unstrike/attackforge-mcp
cd attackforge-mcp
uv sync

Configuration

Set two environment variables before starting the server:

Variable

Description

Default

AF_HOSTNAME

Your AttackForge instance hostname

(required)

X_SSAPI_KEY

Your SSAPI key

(required)

Run

AF_HOSTNAME=your.attackforge.com X_SSAPI_KEY=your-key uv run attackforge-mcp

Or add to your MCP client config (e.g. Claude Desktop claude_desktop_config.json):

{
  "mcpServers": {
    "attackforge-mcp": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/attackforge-mcp", "attackforge-mcp"],
      "env": {
        "AF_HOSTNAME": "your.attackforge.com",
        "X_SSAPI_KEY": "your-key"
      }
    }
  }
}

Tools

Tool

What it does

projects

List, get, create, update, clone, archive projects and notes

vulnerabilities

List, get, create, update, bulk-create vulnerabilities

testsuites

Browse and manage the testsuite library

testcases

List, assign, update test cases on a project

assets

Manage project and library assets

remediation

Create and update remediation notes on vulnerabilities

reports

Generate and retrieve project reports

analytics

Failed testcases, vulnerable assets, common vulnerabilities

utils

Markdown → rich text conversion; form config lookup

cache

Inspect and invalidate the local SQLite cache

raw_request

Direct access to any SSAPI endpoint

See CLAUDE.md for usage patterns.

Available Tools

11 tools
analyticsA

Query AttackForge analytics endpoints.

Actions: failed_testcases — GET /analytics/failed/testcases vulnerable_assets — GET /analytics/vulnerable/assets (top 100 by vuln count) common_vulns — GET /analytics/common/vulnerabilities (top 50 by count)

Inputs: action (required).

assetsA

Manage assets in AttackForge (project scope and library).

Actions: list — GET /assets (all user assets; optional: limit, default 100) list_by_group — GET /assets/group/:id (requires: id = group_id) create_on_project — POST /project/:project_id/assets (requires: project_id, items=[{asset_name, asset_type,...},...]) update_on_project — PUT /project/:project_id/asset/:asset_id (requires: project_id, asset_id, fields) list_library — GET /library/assets get_library — GET /library/asset (params via fields) create_library — POST /library/asset (requires: fields) update_library — PUT /library/asset/:id (requires: id, fields)

Inputs: action (required), id, items, limit, +3 more.

cacheA

Manage the local SQLite cache for static AF data.

Actions: stats — list all cache entries with key, age_seconds, ttl_seconds, expired invalidate — delete by key (or all entries if no key given)

Inputs: action (required), key.

projectsA

Manage AttackForge projects.

Actions: list — GET /projects (summary; optional: limit default 25) Returns total + has_more. Use projects.get for full detail. get — GET /project/:id (requires: id) create — POST /project (requires: fields) update — PUT /project/:id (requires: id, fields) clone — POST /project/:id/clone (requires: id) archive — PUT /project/:id/archive (requires: id) restore — PUT /project/:id/restore (requires: id) get_notes — GET /project/:id/notes (requires: id) create_note — POST /project/:id/note (requires: id, note_content) update_note — PUT /project/:id/note/:noteId (requires: id, note_id, note_content) workspace — GET /project/:id/workspace (requires: id)

Inputs: action (required), id, limit, fields, +2 more.

raw_requestB

Make a raw request to any AttackForge SSAPI endpoint.

Args: method: HTTP method (GET, POST, PUT, DELETE, PATCH) endpoint: SSAPI path, e.g. "/vulnerabilities" or "/project/123/testcases" params: Optional query string parameters body: Optional JSON request body

Inputs: method (required), endpoint (required), body, params.

remediationB

Manage remediation notes on AttackForge vulnerabilities.

Actions: create_note — POST /vulnerability/:vulnerability_id/remediationNote (requires: vulnerability_id, fields) Key fields: projectId (required), note (required), note_type ("PLAINTEXT" or "RICHTEXT") update_note — PUT /vulnerability/:vulnerability_id/remediationNote/:note_id (requires: vulnerability_id, note_id, fields)

Inputs: action (required), fields, note_id, vulnerability_id.

reportsA

Generate and retrieve AttackForge project reports.

Actions: get_data — POST /project/:project_id/report/:report_type (requires: project_id, report_type, optional options) report_type examples: pentest, vulnerability, executive get_report — GET /project/:project_id/report/:report_type (requires: project_id, report_type)

Inputs: action (required), options, project_id, report_type.

testcasesA

Manage test cases assigned to AttackForge projects.

Actions: list — GET /project/:project_id/testcases (requires: project_id) Optional: limit (default 50). Returns total + has_more. assign — POST /project/:project_id/testcase (requires: project_id, fields) update — PUT /project/:project_id/testcase/:testcase_id (requires: project_id, testcase_id, fields) Key fields: status (Tested/Not Tested), linked_vulnerabilities add_note — POST /project/:project_id/testcase/:testcase_id/note (requires: project_id, testcase_id, note) analytics — GET /analytics/failed/testcases

Inputs: action (required), note, limit, fields, +2 more.

testsuitesB

Manage AttackForge testsuite libraries.

Actions: list — GET /testsuites get — GET /testsuites/:id (requires: id) create — POST /testsuite (requires: fields: name, description) update — PUT /testsuite/:id (requires: id, fields) add_testcase — POST /testsuite/:id/testcase (requires: id, fields) add_testcases — POST /testsuite/:id/testcases (requires: id, items=[{...},...]) update_testcase — PUT /testsuite/:id/testcase/:testcase_id (requires: id, testcase_id, fields)

Inputs: action (required), id, items, fields, +1 more.

utilsA

AttackForge utility functions.

Actions: markdown_to_richtext — POST /utils/markdown-to-richtext (requires: markdown) Convert markdown to AF rich text format. Use before setting description/recommendation/note fields. get_form_config — GET /config/form/:config_type (requires: config_type e.g. "vulnerability", "project")

Inputs: action (required), markdown, config_type.

vulnerabilitiesA

Manage AttackForge vulnerabilities.

Actions: list — GET /vulnerabilities (summary only; optional: project_id, limit default 25) Prefer project_id scope — global list can return 500+ items. Returns total + has_more. Use get for full text fields. get — GET /vulnerability/:id (requires: id; returns full detail) list_by_asset — GET /vulnerabilities/asset (requires: asset_name) create — POST /vulnerability (requires: fields incl. project_id) update — PUT /vulnerability/:id (requires: id, fields) bulk_create — POST /vulnerability/bulk (requires: project_id, items=[{...},...]) summarize_custom_fields — Scan all vulns in a project and return each custom field key with its distinct non-empty values. (requires: project_id) Optional: fields={"key": "apmid"} to filter to one field. Use this to discover what custom fields an org uses before querying by value — works for any AF instance, not just T-Mobile. list_by_custom_field — Return slimmed vuln summaries where a custom field matches a value. (requires: project_id, fields={"key": "...", "value": "..."}) Optional: limit (default 25).

Key fields for create: projectId (camelCase, required), title (required), affected_asset_name (required), priority (required), description (required), attack_scenario (required), remediation_recommendation (required), steps_to_reproduce (required), tags, notes=[{note, type}], is_zeroday, is_visible, custom_fields=[{key, value}], linked_testcases, custom_tags=[{name, value}]. Key fields for update: project_id (snake_case), title, priority, status, likelihood_of_exploitation, description, attack_scenario, remediation_recommendation, steps_to_reproduce, tags, notes=[{note, type}], is_zeroday, is_visible, is_deleted, custom_fields=[{key, value}], linked_testcases, custom_tags=[{name, value}].

Inputs: action (required), id, items, limit, +3 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.6/5.0

    Scored across 11 tools

    Disambiguation3/5

    Tools are mostly separated by AttackForge resource (projects, vulnerabilities, testcases, assets, etc.), and action lists clarify intended use. However, raw_request overlaps every domain tool, and testcases.analytics duplicates analytics.failed_testcases, creating avoidable ambiguity. Other boundaries like project notes vs. remediation notes and assets project/library scope are readable but require care.

    Naming Consistency4/5

    Tool names consistently use lowercase snake_case domain nouns (projects, vulnerabilities, testsuites, assets), with raw_request as the main deviation. Action names are also mostly snake_case, though there are minor style differences such as list vs. list_by_asset vs. add_testcase/add_testcases. The convention is predictable overall despite not using a strict verb_noun tool-name pattern.

    Tool Count5/5

    Eleven tools is well-scoped for a broad AttackForge API surface, and each tool maps to a clear domain or capability. The action-dispatch design keeps the top-level tool count manageable while still exposing many operations. No tool appears redundant enough to warrant removal beyond the raw_request escape hatch.

    Completeness4/5

    The surface covers core AttackForge workflows across projects, vulnerabilities, test suites, test cases, assets, remediation notes, analytics, reports, utilities, and caching. raw_request ensures practically any missing SSAPI endpoint is reachable, though direct delete/lifecycle operations are not uniformly exposed for every resource. A few overlaps and the absence of dedicated user/admin endpoints prevent a perfect score.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Connects AI assistants to Intigriti by syncing programs, scopes, and rules of engagement, then provides tools to search and generate actionable attack briefings.
      2
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables LLM hosts like Claude Code, Cursor, or Claude Desktop to drive YeepForge's 28 web penetration testing tools (recon, crawling, SQLi/XSS testing, nuclei scans) and set engagement targets via Model Context Protocol, using the host's own LLM subscription.
      8
      MIT
    • A
      license
      A
      quality
      C
      maintenance
      Enables AI agents to interact with the FlagForge REST API, allowing them to search solved CTF challenges, work on live event challenges, record evidence, submit flag candidates, and write markdown writeups.
      19
      ISC