attackforge-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@attackforge-mcp list projects with status 'active'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 + |
Static data (form configs, testsuite library, project index) | Re-fetched every call | SQLite cache with TTLs |
Cache management | — |
|
Escape hatch | — |
|
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+
Install
git clone https://github.com/unstrike/attackforge-mcp
cd attackforge-mcp
uv syncConfiguration
Set two environment variables before starting the server:
Variable | Description | Default |
| Your AttackForge instance hostname | (required) |
| Your SSAPI key | (required) |
Run
AF_HOSTNAME=your.attackforge.com X_SSAPI_KEY=your-key uv run attackforge-mcpOr 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 |
| List, get, create, update, clone, archive projects and notes |
| List, get, create, update, bulk-create vulnerabilities |
| Browse and manage the testsuite library |
| List, assign, update test cases on a project |
| Manage project and library assets |
| Create and update remediation notes on vulnerabilities |
| Generate and retrieve project reports |
| Failed testcases, vulnerable assets, common vulnerabilities |
| Markdown → rich text conversion; form config lookup |
| Inspect and invalidate the local SQLite cache |
| Direct access to any SSAPI endpoint |
See CLAUDE.md for usage patterns.
Available Tools
11 toolsanalyticsA
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
Scored across 11 tools
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.
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.
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.
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
Related MCP Connectors
Query your team's drift, vulnerability, and upgrade data from any AI assistant. OAuth 2.1, 51 tools.
Connect your AI agent to the apitree API marketplace.
Connect AI agents to 1000+ apps with managed authentication and tool-calling.
Verified, pay-per-use API tools for AI agents through one authenticated connection.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceConnects AI assistants to Intigriti by syncing programs, scopes, and rules of engagement, then provides tools to search and generate actionable attack briefings.2MIT
- AlicenseNot gradedqualityBmaintenanceConnects AI assistants to VulnCheck vulnerability intelligence for querying CVEs, exploits, advisories, and vulnerable packages via natural language.14MIT
- AlicenseNot gradedqualityCmaintenanceEnables 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.8MIT
- AlicenseAqualityCmaintenanceEnables 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.19ISC