|
| 1 | +--- |
| 2 | +tags: [LLM, AI, MCP, API] |
| 3 | +date: 2026-04-16 |
| 4 | +--- |
| 5 | +# Faction MCP Server |
| 6 | + |
| 7 | + |
| 8 | +The [Faction](https://github.com/factionsecurity/faction) MCP server exposes assessments, vulnerabilities, retests, and audit logs to any MCP-compatible AI client. This is a really powerful addition to Faction that allows you to: |
| 9 | +- Integrate any CLI tool into Faction |
| 10 | +- Use any AI provider to create create/edit vulnerabilities descriptions and recommendations |
| 11 | +- Generate executive summaries that include full detail of all vulnerabilities and observations to summarize and prioritize the risk assessment. |
| 12 | +- Integrate Local LLMs into Faction so you are not sharing with 3rd party providers |
| 13 | +- Fully Supports [opencode](https://github.com/opencode-ai/opencode), [claude code](https://claude.com/product/claude-code), [copilot-cli](https://github.com/features/copilot/cli/), [LM Studio](https://lmstudio.ai/), and may others |
| 14 | + |
| 15 | +## Prerequisites |
| 16 | + |
| 17 | +- Docker (or Podman) installed |
| 18 | +- A running Faction instance |
| 19 | +- A Faction API key — generate one under your user profile in Faction |
| 20 | + |
| 21 | +--- |
| 22 | + |
| 23 | +## Option 1: Docker Desktop MCP Catalog (Coming Soon) |
| 24 | + |
| 25 | +Install directly from the Docker Desktop MCP Catalog. Enter your `FACTION_API_KEY` and `FACTION_BASE_URL` when prompted. |
| 26 | + |
| 27 | +--- |
| 28 | + |
| 29 | +## Option 2: Docker Compose (Docker or Podman) |
| 30 | + |
| 31 | +This option works anywhere Docker Compose or Podman Compose is available. |
| 32 | + |
| 33 | +### 1. Configure credentials |
| 34 | + |
| 35 | +```bash |
| 36 | +cp .env.example .env |
| 37 | +``` |
| 38 | + |
| 39 | +Edit `.env` and fill in your values: |
| 40 | + |
| 41 | +```env |
| 42 | +FACTION_API_KEY=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
| 43 | +FACTION_BASE_URL=https://faction.yourcompany.com |
| 44 | +``` |
| 45 | + |
| 46 | +### 2. Build the image |
| 47 | + |
| 48 | +```bash |
| 49 | +docker compose build |
| 50 | +``` |
| 51 | + |
| 52 | +Podman: |
| 53 | +```bash |
| 54 | +podman-compose build |
| 55 | +``` |
| 56 | + |
| 57 | +### 3. Configure your MCP client |
| 58 | +!!! note |
| 59 | + Edit the `.env` file mentioned above and live it in the same folder as the docker-comose.yml for it to use your API credenticals |
| 60 | + |
| 61 | +#### Claude Code MCP Configuration |
| 62 | +Add the following to your MCP client config (e.g. `~/.claude/settings.json` for Claude Code, or `claude_desktop_config.json` for Claude Desktop): |
| 63 | + |
| 64 | +**Docker:** |
| 65 | +```json |
| 66 | +{ |
| 67 | + "mcpServers": { |
| 68 | + "faction": { |
| 69 | + "command": "docker", |
| 70 | + "args": [ |
| 71 | + "compose", |
| 72 | + "-f", "/absolute/path/to/faction-mcp/docker-compose.yml", |
| 73 | + "run", "--rm", "-T", "faction-mcp" |
| 74 | + ] |
| 75 | + } |
| 76 | + } |
| 77 | +} |
| 78 | +``` |
| 79 | + |
| 80 | +**Podman:** |
| 81 | +```json |
| 82 | +{ |
| 83 | + "mcpServers": { |
| 84 | + "faction": { |
| 85 | + "command": "podman-compose", |
| 86 | + "args": [ |
| 87 | + "-f", "/absolute/path/to/faction-mcp/docker-compose.yml", |
| 88 | + "run", "--rm", "-T", "faction-mcp" |
| 89 | + ] |
| 90 | + } |
| 91 | + } |
| 92 | +} |
| 93 | +``` |
| 94 | + |
| 95 | +> The `-T` flag disables pseudo-TTY allocation so stdio passes through cleanly to the MCP client. |
| 96 | +
|
| 97 | +To update credentials, edit `.env` — no rebuild required. |
| 98 | + |
| 99 | +#### LLM Studio MCP Configuration |
| 100 | +Go to Integration then click Install: |
| 101 | + |
| 102 | +```json |
| 103 | +{ |
| 104 | + "mcpServers": { |
| 105 | + "faction": { |
| 106 | + "command": "docker", |
| 107 | + "args": [ |
| 108 | + "compose", |
| 109 | + "-f", |
| 110 | + "/Users/joshsummitt/Code/faction-mcp/docker-compose.yml", |
| 111 | + "run", |
| 112 | + "--rm", |
| 113 | + "-T", |
| 114 | + "faction-mcp" |
| 115 | + ] |
| 116 | + } |
| 117 | +} |
| 118 | +``` |
| 119 | + |
| 120 | +#### opencode MCP Configuration |
| 121 | +Edit `~/.config/opencode/opencode.json` and add the following config: |
| 122 | +```json |
| 123 | +{ |
| 124 | + "mcp": { |
| 125 | + "faction": { |
| 126 | + "type": "local", |
| 127 | + "command": [ |
| 128 | + "docker", |
| 129 | + "compose", |
| 130 | + "-f", |
| 131 | + "/Users/joshsummitt/Code/faction-mcp/docker-compose.yml", |
| 132 | + "run", |
| 133 | + "--rm", |
| 134 | + "-T", |
| 135 | + "faction-mcp" |
| 136 | + ], |
| 137 | + "enabled" : true |
| 138 | + } |
| 139 | + } |
| 140 | + |
| 141 | + ...other stuff.. |
| 142 | +} |
| 143 | + |
| 144 | +``` |
| 145 | + |
| 146 | +#### coplilot-cli MCP Configuration |
| 147 | +Edit `~/.config/microsoft-copilot/mcp.json` |
| 148 | + |
| 149 | +```json |
| 150 | +{ |
| 151 | + "mcpServers": { |
| 152 | + "faction": { |
| 153 | + "command": "docker", |
| 154 | + "args": [ |
| 155 | + "compose", |
| 156 | + "-f", "/Users/joshsummitt/Code/faction-all/free/faction-mcp/docker-compose.yml", |
| 157 | + "run", "--rm", "-T", "faction-mcp" |
| 158 | + ] |
| 159 | + } |
| 160 | + } |
| 161 | + } |
| 162 | +``` |
| 163 | + |
| 164 | +--- |
| 165 | + |
| 166 | +## Available Tools |
| 167 | + |
| 168 | +### Assessments |
| 169 | + |
| 170 | +| Tool | Description | |
| 171 | +|------|-------------| |
| 172 | +| `get_assessment_queue` | Get all non-completed assessments assigned to the authenticated user | |
| 173 | +| `get_assessment` | Get full details for a specific assessment by ID | |
| 174 | +| `update_assessment` | Update assessment fields: notes, executive summary, distribution list, custom fields | |
| 175 | +| `get_assessment_vulnerabilities` | Get full vulnerability data for an assessment (large response — includes HTML and screenshots) | |
| 176 | +| `get_vulnerability_summary_data` | Get stripped vulnerability data optimized for generating executive summaries | |
| 177 | + |
| 178 | +### Vulnerabilities |
| 179 | + |
| 180 | +| Tool | Description | |
| 181 | +|------|-------------| |
| 182 | +| `get_vulnerabilities` | Get all vulnerabilities opened within a date range | |
| 183 | +| `get_vulnerability` | Get a vulnerability by ID | |
| 184 | +| `get_vulnerability_by_tracking` | Get a vulnerability by tracking ID (e.g. Jira ticket) | |
| 185 | +| `set_vulnerability_tracking` | Assign a tracking ID to a vulnerability | |
| 186 | +| `set_vulnerability_status` | Set remediation status (dev/prod closed dates) | |
| 187 | +| `get_risk_levels` | Get configured risk level definitions | |
| 188 | +| `get_categories` | Get all vulnerability categories | |
| 189 | +| `get_category` | Get a specific category by ID | |
| 190 | +| `create_category` | Create a new vulnerability category (manager role required) | |
| 191 | + |
| 192 | +### Vulnerability Templates |
| 193 | + |
| 194 | +| Tool | Description | |
| 195 | +|------|-------------| |
| 196 | +| `get_vulnerability_templates` | Get all default vulnerability templates | |
| 197 | +| `search_vulnerability_templates` | Search templates by name (partial match) | |
| 198 | +| `get_vulnerability_template` | Get a specific template by ID | |
| 199 | +| `create_vulnerability_templates` | Create or update default vulnerability templates | |
| 200 | + |
| 201 | +### Retests / Verifications |
| 202 | + |
| 203 | +| Tool | Description | |
| 204 | +|------|-------------| |
| 205 | +| `get_verification_queue` | Get the retest queue assigned to the authenticated user | |
| 206 | +| `get_all_verifications` | Get all verifications, optionally filtered by date range | |
| 207 | +| `get_user_verifications` | Get verifications for a specific user | |
| 208 | +| `complete_verification` | Mark a retest as passed or failed | |
| 209 | +| `schedule_retest` | Schedule a retest for a vulnerability | |
| 210 | + |
| 211 | +### Audit Logs |
| 212 | + |
| 213 | +| Tool | Description | |
| 214 | +|------|-------------| |
| 215 | +| `get_audit_log` | Get the system audit log for a date range (admin role required) | |
| 216 | +| `get_assessment_audit_log` | Get audit log entries for all assessments in a date range | |
| 217 | +| `get_assessment_audit_log_by_id` | Get audit log entries for a specific assessment | |
| 218 | +| `get_user_audit_log` | Get audit log entries for a specific user | |
| 219 | + |
| 220 | +--- |
0 commit comments