CodeWallDocs
Integrations

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/mcp

The server uses the Streamable HTTP transport (stateless, JSON responses).

1. Create an API key

API keys are managed by org owners and admins.

  1. Go to Settings > API Keys
  2. Click Add > API Key
  3. Give it a label (e.g. "Claude Desktop")
  4. Select the scopes to grant (read scopes are pre-selected; action scopes are opt-in)
  5. Optionally set an expiry date
  6. Click Create Key
  7. 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_here

Generic / 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

ScopeGrants
findings:readList/read findings and the AI findings summary
runs:readList/read pentest runs and tests
reports:readList reports (metadata only — no file contents)
assets:readList discovered assets (hosts, domains, URLs, endpoints)
projects:readList 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.

ScopeGrants
tests:retestLaunch a retest (re-verify) of a finding
tests:deep_testLaunch a red-team agent (deep test) on a finding

Tools

ToolScopeDescription
list_findingsfindings:readList findings. Filters: run_id, severity, verified, status, project_id, source, category, q (search), application_id, include_duplicates, limit, offset.
get_findingfindings:readFull detail for one finding (PoC steps, evidence, affected assets, remediation).
get_findings_summaryfindings:readThe cached AI summary of the org's findings posture.
list_runsruns:readList pentest runs (engagements), newest first.
get_runruns:readDetail for one run (status, phase, severity counts, timing).
list_testsruns:readList all runs/tests, newest first. Optional test_type filters to one mode (e.g. full, retest, deep_test).
list_projectsprojects:readList the organisation's projects.
list_assetsassets:readList discovered assets. Filters: asset_type, project_id, search, environment, criticality.
list_reportsreports:readList reports (metadata only). Optional run_id.
run_retesttests:retestLaunch a retest of a finding by finding_id. Returns {run_id, status, finding_id}.
run_red_team_testtests:deep_testLaunch 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-9e7d15af find?"

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

SymptomCause / fix
HTTP 401 rejecting the Authorization headerThe 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 listedYour key lacks every scope that tool needs — only tools you can use are exposed.

On this page