Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
제작자가 쓴 설명(영어 원문)
MCP server for DefectDojo: 24 tools with RBAC, HMAC audit chain, and SIEM forwarding
이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.
이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.
쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.
DEFECTDOJO_URL, DEFECTDOJO_API_KEY, DEFECTDOJO_READ_API_KEY, DEFECTDOJO_WRITE_API_KEY, MCP_AUTH_TOKEN, AUDIT_HMAC_KEY비밀로 표시된 값은 내 계정의 열쇠예요. 절대 다른 사람과 공유하거나 채팅에 붙여 넣지 마세요.
필요한 것
어떤 앱을 쓰세요?
위에서 앱을 고르세요. 기억해 두었다가 다음부터는 버튼에 “…에 설치”라고 표시해요.
Claude Desktop → Settings → Developer → Edit Config를 열고 claude_desktop_config.json에 이 내용을 붙여 넣으세요
{
"mcpServers": {
"defectdojo": {
"command": "uvx",
"args": [
"mcp-defectdojo"
],
"env": {
"DEFECTDOJO_URL": "your-value",
"DEFECTDOJO_API_KEY": "your-value",
"DEFECTDOJO_READ_API_KEY": "your-value",
"DEFECTDOJO_WRITE_API_KEY": "your-value",
"MCP_AUTH_TOKEN": "your-value",
"AUDIT_HMAC_KEY": "your-value"
}
}
}
}터미널에서 이 명령어를 실행하세요
claude mcp add defectdojo --env DEFECTDOJO_URL=your-value --env DEFECTDOJO_API_KEY=your-value --env DEFECTDOJO_READ_API_KEY=your-value --env DEFECTDOJO_WRITE_API_KEY=your-value --env MCP_AUTH_TOKEN=your-value --env AUDIT_HMAC_KEY=your-value -- uvx mcp-defectdojo실행하기 전에 빈 값을 채워 주세요.
프로젝트의 .cursor/mcp.json 또는 ~/.cursor/mcp.json에 붙여 넣으세요
{
"mcpServers": {
"defectdojo": {
"command": "uvx",
"args": [
"mcp-defectdojo"
],
"env": {
"DEFECTDOJO_URL": "your-value",
"DEFECTDOJO_API_KEY": "your-value",
"DEFECTDOJO_READ_API_KEY": "your-value",
"DEFECTDOJO_WRITE_API_KEY": "your-value",
"MCP_AUTH_TOKEN": "your-value",
"AUDIT_HMAC_KEY": "your-value"
}
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
프로젝트의 .vscode/mcp.json에 붙여 넣으세요
{
"servers": {
"defectdojo": {
"type": "stdio",
"command": "uvx",
"args": [
"mcp-defectdojo"
],
"env": {
"DEFECTDOJO_URL": "your-value",
"DEFECTDOJO_API_KEY": "your-value",
"DEFECTDOJO_READ_API_KEY": "your-value",
"DEFECTDOJO_WRITE_API_KEY": "your-value",
"MCP_AUTH_TOKEN": "your-value",
"AUDIT_HMAC_KEY": "your-value"
}
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
이 서버는 내 컴퓨터에서 실행되는데, ChatGPT는 인터넷에 있는 서버에만 연결할 수 있어요. 다른 앱을 고르세요.
선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.
이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.
내 컴퓨터에서 실행돼요. 설치하면 AI 앱에 도구 목록이 나타나요.
누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 7일 점검
레지스트리 이름이 GitHub 계정 inspicere 기준으로 확인되었고, 이 계정이 저장소를 소유하고 있어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
내 컴퓨터에서 실행되는 서버라 인터넷 엔드포인트가 없어요
내 컴퓨터에서 실행되며, 대신 로컬 설정을 사용해요
내 컴퓨터에서 실행돼요. 도구 목록은 인터넷 엔드포인트가 있는 서버에서만 읽을 수 있어요
레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.
해당하는 기본 점검 1개 중 1개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.
입력해야 할 값: DEFECTDOJO_URL, DEFECTDOJO_API_KEY, DEFECTDOJO_READ_API_KEY, DEFECTDOJO_WRITE_API_KEY, MCP_AUTH_TOKEN, AUDIT_HMAC_KEY
내 컴퓨터에서 실행돼요. AI 앱이 필요할 때 실행하고, 데이터는 제작자의 서버를 거치지 않아요(서버 자체가 온라인 서비스를 호출하는 경우는 제외).
GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(3.3.2)은 5개월 전 레지스트리에 올라왔어요.
Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. 내 컴퓨터에 Python (uv)도 있어야 해요.
같은 카테고리에는: Spec Driven Development, Remote Desktop Commander, EmbeddedCI BenchPod
같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.
카드 보는 법:★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Drive a BenchPod hardware-in-the-loop bench: power, flash, UART, I2C, CAN, analog and logic.
제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.
MCP server for DefectDojo vulnerability management. Exposes 24 tools for managing products, engagements, tests, findings, scan imports, and finding lifecycle through the Model Context Protocol.
[Getting Started Guide](https://github.com/inspicere/mcp-defectdojo/blob/main/docs/getting-started.md) — step-by-step setup, from install through connecting your first MCP client.
git clone https://github.com/inspicere/mcp-defectdojo.git && cd mcp-defectdojo
cp .env.example .env
uv sync --frozen uv run mcp-defectdojo
Requires Python 3.12+, uv, and a running DefectDojo instance.
All configuration is via environment variables. Copy env.example to .env for local development.
| Variable | Description |
|---|---|
DEFECTDOJO_URL | Base URL of the DefectDojo instance (must use https:// unless overridden) |
DEFECTDOJO_API_KEY | API key for DefectDojo (generate at DefectDojo > API v2 > Your API Key) |
For least-privilege access, use separate read/write keys instead of DEFECTDOJO_API_KEY:
| Variable | Description |
|---|---|
DEFECTDOJO_READ_API_KEY | Read-only API key (used for GET requests) |
DEFECTDOJO_WRITE_API_KEY | Write API key (used for POST/PATCH requests) |
Token-role bindings using MCP_ROLE_* env vars (preferred):
| Variable | Description |
|---|---|
MCP_ROLE_ | Format: : . Binds a bearer token to a role. Name becomes the caller ID. |
Four roles are available, each inheriting from the one below:
| Role | Permissions |
|---|---|
admin | All permissions including product_mgmt |
writer | engagement_mgmt, finding_mgmt, scan_mgmt, metadata_read, system |
scanner | scan_mgmt, metadata_read, system |
reader | metadata_read, system |
Example: MCP_ROLE_CI=tok_abc123:scanner grants the token scanner-level access.
Legacy variables (mapped to RBAC roles for backward compatibility):
| Variable | Maps to |
|---|---|
MCP_AUTH_TOKEN | admin role |
MCP_READ_TOKEN | reader role |
| Variable | Default | Description |
|---|---|---|
FASTMCP_TRANSPORT | stdio | Transport mode: stdio, sse, streamable-http, http |
FASTMCP_HOST | 0.0.0.0 | Bind address for network transports |
FASTMCP_PORT | 8000 | Port for network transports |
| Variable | Default | Description |
|---|---|---|
ALLOW_INSECURE_HTTP | false | Allow http:// URLs (TLS required by default) |
MUTATION_RATE_LIMIT | 60 | Max mutations per rate window per authenticated caller (per-token bucket) |
OPEN_ACCESS_MUTATION_RATE_LIMIT | 10 | Max mutations per rate window across all unauthenticated traffic (one shared bucket — applies only when REQUIRE_AUTH=false) |
MUTATION_RATE_WINDOW | 60 | Rate window in seconds (applies to both buckets) |
UNTRUSTED_CONTENT_WRAPPING | on | F-002 read-side wrapping kill-switch. When on (default), title, description, tags, notes, and note entry fields are returned inside {"value": , "_warning": "untrusted-content: ..."}. Set to off only for legacy downstream consumers that cannot parse the wrapped shape. |
DEFECTDOJO_DEFAULT_FOUND_BY_ID | 1 | Finding type ID used in create_finding payloads. The default 1 corresponds to "API Test" on stock DefectDojo installs; set to the ID for your "Manual" or "Pen Test" type if the default is missing or incorrect. Validated at startup — must be a positive integer. |
| Variable | Default | Description |
|---|---|---|
LOG_LEVEL | INFO | DEBUG, INFO, WARNING, ERROR, CRITICAL |
AUDIT_HMAC_KEY | *(ephemeral)* | HMAC key for audit log integrity chain. Required for cross-restart log verification. Generate with: python3 -c "import secrets; print(secrets.token_hex(32))" |
AUDIT_LOG_FILE | *(stderr only)* | Path for dedicated audit log file (JSON-lines, logrotate-compatible) |
| Variable | Default | Description |
|---|---|---|
AUDIT_LOG_SYSLOG | *(disabled)* | Syslog destination. Format: [transport://]host[:port]. Transports: tcp, udp, tcp+tls (default). |
AUDIT_LOG_SYSLOG_CA | *(system CAs)* | Custom CA certificate for syslog TLS verification |
AUDIT_LOG_HTTPS_URL | *(disabled)* | HTTPS endpoint for log forwarding (JSON array POST) |
AUDIT_LOG_HTTPS_TOKEN | *(none)* | Bearer token for HTTPS endpoint authentication |
AUDIT_LOG_HTTPS_BATCH_SIZE | 10 | Number of log records per HTTPS batch |
AUDIT_LOG_HTTPS_FLUSH_SECS | 5 | Seconds before flushing a partial batch |
AUDIT_LOG_HTTPS_CA | *(system CAs)* | Custom CA certificate path for HTTPS TLS verification — required when forwarding to a SIEM signed by an internal PKI (e.g. Caddy + Vault PKI). |
The HTTPS forwarder retries each batch once on transient failure with a short backoff and opens a 30-second circuit breaker after 3 consecutive failures, matching the syslog forwarder's behavior. Batch and circuit-open failures are emitted as structured audit_forward_failure events with forwarder: "https" for SIEM correlation.
These traps bite first-time deployments most often. Each one is a fail-CLOSED guard by design — the server refuses to start rather than running in a silently-degraded state.
AUDIT_HMAC_KEYSymptom: Container exits immediately with:
ValueError: AUDIT_HMAC_KEY not set on network transport 'streamable-http' —
set REQUIRE_AUDIT_HMAC_KEY=false to opt out (not recommended).
Cause: On sse, streamable-http, or http transports, the server requires a persistent HMAC key for the audit-log integrity chain. Without it, the chain can't survive a process restart — a regulatory-grade audit log shouldn't run in that mode by accident.
Fix (recommended): Generate and set a real key:
export AUDIT_HMAC_KEY=$(python3 -c "import secrets; print(secrets.token_hex(32))")
Store it in a secret manager (Vault, AWS Secrets Manager, etc.) so it persists across deploys.
Fix (escape hatch): If you've consciously accepted the ephemeral-key posture (e.g., short-lived dev container), set REQUIRE_AUDIT_HMAC_KEY=false. The server starts and logs a CRITICAL warning at boot.
Note for stdio users: This guard only fires on network transports. Local stdio (Claude Desktop / Claude Code) is unaffected.
Symptom: Server refuses to start on sse/streamable-http/http with a missing-auth error.
Cause: Network transports require at least one MCP_ROLE_ = : binding (or the legacy MCP_AUTH_TOKEN). Open access on the network is opt-in only.
Fix: Set at least one role token:
export MCP_ROLE_CI="$(openssl rand -hex 32):scanner"
Or, for development only, opt out with REQUIRE_AUTH=false (warning: any caller on the network can use the server).
If you combine REQUIRE_AUTH=false with the default FASTMCP_HOST=0.0.0.0, you have an open mutation API on the LAN. The server emits a distinct CRITICAL audit event when both conditions hold so a SIEM rule can alert on the compound case. For workstation development, set FASTMCP_HOST=127.0.0.1 to bind only to localhost.
Symptom: Server refuses to start with:
DEFECTDOJO_URL must use https:// (set ALLOW_INSECURE_HTTP=true to override)
Cause: TLS is enforced by default. Local dev DefectDojo instances often run on http://localhost:8080 without TLS.
Fix: For local development against a non-TLS DefectDojo, set ALLOW_INSECURE_HTTP=true. Never set this in production — use a reverse proxy (Caddy, nginx, Traefik) to terminate TLS in front of DefectDojo instead.
create_product returns 403 with a valid API keySymptom: Read tools work; create_product returns Permission denied (HTTP 403) from DefectDojo.
Cause: This isn't an MCP server bug — the DefectDojo API key inherits its user's role. Product creation requires admin-level access in DefectDojo itself. Most scanner-style service accounts can create engagements, tests, and findings but not products.
Fix: Either (a) use an admin API key for the MCP server, or (b) pre-create products in DefectDojo and let the MCP server manage everything below the product level. The dual-key mode (DEFECTDOJO_READ_API_KEY + DEFECTDOJO_WRITE_API_KEY) helps here: scope the write key narrowly and accept that create_product will fail-fast.
Symptom: First ~60 imports succeed, then subsequent calls return ToolError: rate limit exceeded — retry after Ns with a Retry-After hint.
Cause: The default mutation rate limit is 60 mutations per 60-second sliding window per authenticated token. Bulk operations exceed it quickly.
Fix: For legitimate bulk-import workflows, either (a) raise MUTATION_RATE_LIMIT to a value matched to your batch size, (b) raise MUTATION_RATE_WINDOW to a longer window, or (c) use the scanner role with import_scan/reimport_scan — scan imports bundle many findings into a single mutation. Don't disable the rate limiter outright; it's the only defense against runaway agent loops.
Symptom: A downstream client that previously consumed note["entry"] as a bare string now sees {"value": "...", "_warning": "untrusted-content: ..."} and fails.
Cause: Read-side wrapping is on by default (F-002 / prompt-injection defense). Affected fields: title, description, tags, finding-note entry.
Fix (preferred): Update the consumer to look at field["value"] and surface field["_warning"] to the operator. This is the secure path — the wrapper signals the LLM not to interpret the contents as instructions.
Fix (legacy escape): Set UNTRUSTED_CONTENT_WRAPPING=off to disable wrapping globally. Only use this if you have an independent untrusted-content boundary downstream.
MCP_AUTH_TOKEN after switching to RBACSymptom: A token that previously worked now returns Permission denied: requires on every mutation.
Cause: MCP_AUTH_TOKEN (the legacy single-token env var) maps to the admin role for backwards compatibility. As soon as you add any MCP_ROLE_ =... env var, the legacy token still works as admin, but its caller identity becomes admin-legacy rather than the friendly name you might expect in audit logs. If you intended the legacy token to be scanner, the role assignment doesn't apply.
Fix: Migrate fully to MCP_ROLE_ bindings. The legacy var is a compatibility shim, not a configuration mechanism.
If you hit a failure mode not covered here, the audit log will tell you why — every refused request emits a structured JSON line with the rejection reason. Look for event_type=audit and outcome=denied.
metadata_read)| Tool | Permission | Description |
|---|---|---|
health_check | system | Check connectivity to DefectDojo |
list_products | metadata_read | List products with pagination |
get_product | metadata_read | Get a single product by ID |
list_product_types | metadata_read | List product types (for use in create_product) |
list_engagements | metadata_read | List engagements for a product |
| `get_enga
앞부분만 보여 드려요. 나머지는 저장소에서 읽어 보세요