MCP Server
Connect Claude and other AI agents to your CodeWall findings and data over the Model Context Protocol.
CodeWall exposes a Model Context Protocol (MCP) server so AI agents — Claude Desktop, Claude Code, IDE assistants, or anything that speaks MCP — can read your organisation's pentest data and launch single-finding tests, using a scoped API key instead of your login.
Everything is scoped to the organisation that owns the API key and PII-redacted according to your org's privacy policy. Read scopes are strictly read-only; two optional action scopes let an agent launch a retest or red-team agent on an existing finding (never a full pentest).
Endpoint
https://api.codewall.ai/mcpThe server uses the Streamable HTTP transport (stateless, JSON responses).
1. Create an API key
API keys are managed by org owners and admins.
- Go to Settings > API Keys
- Click Add > API Key
- Give it a label (e.g. "Claude Desktop")
- Select the scopes to grant (read scopes are pre-selected; action scopes are opt-in)
- Optionally set an expiry date
- Click Create Key
- Copy the key immediately — the
cwk_…token is shown only once
The dialog also shows a ready-to-paste MCP client configuration with the key filled in.
2. Connect your client
CodeWall is a standard remote (Streamable HTTP) MCP server, so any MCP-capable client can connect — pass the endpoint and your key as a Bearer header. Examples for the most common clients follow; if yours isn't listed, use the generic configuration or the stdio bridge.
Replace cwk_your_key_here with the key you created above throughout.
Claude Code
claude mcp add --transport http codewall https://api.codewall.ai/mcp \
--header "Authorization: Bearer cwk_your_key_here"Claude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"codewall": {
"url": "https://api.codewall.ai/mcp",
"headers": { "Authorization": "Bearer cwk_your_key_here" }
}
}
}Codex CLI
Codex connects to remote servers through the mcp-remote bridge. Add to
~/.codex/config.toml:
[mcp_servers.codewall]
command = "npx"
args = [
"-y", "mcp-remote", "https://api.codewall.ai/mcp",
"--header", "Authorization: Bearer cwk_your_key_here",
]Cursor
Add to ~/.cursor/mcp.json (global) or .cursor/mcp.json (per-project):
{
"mcpServers": {
"codewall": {
"url": "https://api.codewall.ai/mcp",
"headers": { "Authorization": "Bearer cwk_your_key_here" }
}
}
}VS Code (Copilot agent mode)
Add to .vscode/mcp.json:
{
"servers": {
"codewall": {
"type": "http",
"url": "https://api.codewall.ai/mcp",
"headers": { "Authorization": "Bearer cwk_your_key_here" }
}
}
}Cline
In Cline's MCP Servers > Configure (cline_mcp_settings.json):
{
"mcpServers": {
"codewall": {
"type": "streamableHttp",
"url": "https://api.codewall.ai/mcp",
"headers": { "Authorization": "Bearer cwk_your_key_here" }
}
}
}Goose
Add a remote (Streaming HTTP) extension to ~/.config/goose/config.yaml:
extensions:
codewall:
type: streamable_http
uri: https://api.codewall.ai/mcp
headers:
Authorization: Bearer cwk_your_key_hereGeneric / any MCP client
Most clients accept a URL plus headers under an mcpServers map:
{
"mcpServers": {
"codewall": {
"url": "https://api.codewall.ai/mcp",
"headers": { "Authorization": "Bearer cwk_your_key_here" }
}
}
}Clients without remote support
If a client only supports local (stdio) servers, bridge to the remote endpoint
with mcp-remote:
{
"mcpServers": {
"codewall": {
"command": "npx",
"args": [
"-y", "mcp-remote", "https://api.codewall.ai/mcp",
"--header", "Authorization: Bearer cwk_your_key_here"
]
}
}
}That's it — the agent can now call the tools below.
Scopes
A key only exposes the tools its scopes allow. Each tool checks its scope on every call.
Read scopes
| Scope | Grants |
|---|---|
findings:read | List/read findings and the AI findings summary |
runs:read | List/read pentest runs and tests |
reports:read | List reports (metadata only — no file contents) |
assets:read | List discovered assets (hosts, domains, URLs, endpoints) |
projects:read | List the organisation's projects |
Action scopes
These let a key start a test on an existing finding. They cannot launch a full pentest. Off by default.
| Scope | Grants |
|---|---|
tests:retest | Launch a retest (re-verify) of a finding |
tests:deep_test | Launch a red-team agent (deep test) on a finding |
Tools
| Tool | Scope | Description |
|---|---|---|
list_findings | findings:read | List findings. Filters: run_id, severity, verified, status, project_id, source, category, q (search), application_id, include_duplicates, limit, offset. |
get_finding | findings:read | Full detail for one finding (PoC steps, evidence, affected assets, remediation). |
get_findings_summary | findings:read | The cached AI summary of the org's findings posture. |
list_runs | runs:read | List pentest runs (engagements), newest first. |
get_run | runs:read | Detail for one run (status, phase, severity counts, timing). |
list_tests | runs:read | List all runs/tests, newest first. Optional test_type filters to one mode (e.g. full, retest, deep_test). |
list_projects | projects:read | List the organisation's projects. |
list_assets | assets:read | List discovered assets. Filters: asset_type, project_id, search, environment, criticality. |
list_reports | reports:read | List reports (metadata only). Optional run_id. |
run_retest | tests:retest | Launch a retest of a finding by finding_id. Returns {run_id, status, finding_id}. |
run_red_team_test | tests:deep_test | Launch a red-team agent (deep test) on a finding_id, with an optional objective. |
Result limits are capped server-side (findings 5000, runs/tests 500) regardless of the limit you pass.
Typical workflows
Triage the latest findings
"Show me the open critical findings from CodeWall."
The agent calls list_findings(severity="critical", status="open").
Drill into a run
"What did run
run-20260602-132211-9e7d15affind?"
The agent calls get_run(...) then list_findings(run_id="run-20260602-132211-9e7d15af").
Re-verify a fix
"Retest finding #213."
The agent calls run_retest(finding_id=2329). When the retest can't reproduce the issue, the finding is automatically marked fixed. Track progress with list_tests or get_run.
Calling the server directly
The server is plain JSON-RPC over HTTP, so you can also call it with curl. Initialise, then call a tool:
# initialize
curl -s https://api.codewall.ai/mcp/ \
-H "Authorization: Bearer cwk_your_key_here" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize",
"params":{"protocolVersion":"2025-06-18","capabilities":{},
"clientInfo":{"name":"curl","version":"0"}}}'
# call a tool
curl -s https://api.codewall.ai/mcp/ \
-H "Authorization: Bearer cwk_your_key_here" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call",
"params":{"name":"list_findings","arguments":{"severity":"critical","limit":5}}}'Security
- Keys are stored as SHA-256 hashes — CodeWall never stores the plaintext
cwk_token - Each key is bound to a single organisation; all results are org-scoped and PII-redacted
- Read scopes cannot modify any data; action scopes can only test existing findings, never start a full pentest
- Keys can be revoked instantly in Settings > API Keys, and can be given an optional expiry
- Every request is rate-limited per key
- API-key creation and revocation are recorded in the Audit Log
Troubleshooting
| Symptom | Cause / fix |
|---|---|
HTTP 401 rejecting the Authorization header | The token is wrong, revoked, expired, or mis-copied. The full cwk_ token is shown only once — create a new key if you've lost it. |
Tool error: api key is missing the required scope: … | The key wasn't granted that scope. Create a new key with the needed scope (you can't edit scopes after creation). |
| A tool isn't listed | Your key lacks every scope that tool needs — only tools you can use are exposed. |

