DefectDojo MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| DEFECTDOJO_URL | Yes | Base URL of the DefectDojo instance (e.g. https://your-defectdojo.example.com) | |
| DEFECTDOJO_API_KEY | Yes | API token (DefectDojo → user profile → API v2 Key) |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_findingsB | List findings with optional filters. Args: severity: Filter by severity (Critical, High, Medium, Low, Info) active: Filter active findings only verified: Filter verified findings only is_mitigated: Filter mitigated findings duplicate: Filter duplicates false_positive: Filter false positives (false_p) out_of_scope: Filter out-of-scope findings risk_accepted: Filter findings under an active risk acceptance test_id: Filter by test ID engagement_id: Filter by engagement ID (via test__engagement) product_id: Filter by product (asset) ID (via test__engagement__product) product_name: Filter by product (asset) name (server-side contains) title: Filter by title (server-side contains) title_exact: Filter by exact title cwe: Filter by CWE number vulnerability_id: Filter by CVE/vulnerability ID (e.g. CVE-2024-1234) reporter_id: Filter by reporter user ID mitigated_by_id: Filter by the user who mitigated outside_of_sla: Filter findings outside SLA tag: Filter by tag name (contains) ordering: Ordering fields (e.g. "-severity", "created", "-date") limit: Number of results per page (default 25) offset: Pagination offset |
| get_findingC | Get a single finding by ID. Args: finding_id: The finding ID |
| create_findingC | Create a new finding. Args: title: Finding title severity: Severity level (Critical, High, Medium, Low, Info) test_id: ID of the test this finding belongs to description: Detailed description mitigation: Recommended mitigation impact: Impact description steps_to_reproduce: Steps to reproduce references: External references cwe: CWE identifier number active: Whether finding is active (default True) verified: Whether finding is verified (default False) numerical_severity: Numeric severity (S0-S4) line: Source code line number file_path: Source file path component_name: Affected component component_version: Component version static_finding: Is static analysis finding dynamic_finding: Is dynamic analysis finding tags: List of tags |
| update_findingC | Update an existing finding (partial update). Args: finding_id: The finding ID title: New title severity: New severity description: New description mitigation: New mitigation text impact: New impact text active: Set active status verified: Set verified status is_mitigated: Set mitigated status tags: Replace tags |
| verify_findingC | Mark a finding as verified. Args: finding_id: The finding ID to verify |
| get_finding_duplicatesC | Get duplicate findings for a given finding. Args: finding_id: The finding ID |
| reset_finding_duplicate_statusC | Reset the duplicate status of a finding. Args: finding_id: The finding ID |
| list_finding_notesB | List notes for a finding (ordered newest first). Args: finding_id: The finding ID |
| add_finding_noteB | Add a note to a finding. Args: finding_id: The finding ID entry: Note text content private: Whether the note is private (visible only to you and superusers) note_type: Note type ID (see list_note_types) |
| remove_finding_noteC | Remove a note from a finding. Args: finding_id: The finding ID note_id: The note ID to remove (see list_finding_notes) |
| list_finding_metadataC | List metadata key-value pairs for a finding. Args: finding_id: The finding ID |
| add_finding_metadataC | Add metadata to a finding. Args: finding_id: The finding ID name: Metadata key name value: Metadata value |
| delete_findingC | Delete a finding. Args: finding_id: The finding ID to delete |
| list_note_typesA | List available note types (usable in add_finding_note / close_finding). Args: name: Filter by name (contains) limit: Results per page (default 25) offset: Pagination offset |
| close_findingA | Close a finding. Requires closure_type; use the dedicated tools below when unsure. Prefer the semantic aliases:
Args: finding_id: The finding ID to close closure_type: One of "false_positive", "mitigated", "duplicate" note: Optional note recorded on the finding at closure time note_type: Optional note type ID (see list_note_types) mitigated: Mitigation datetime (ISO 8601, defaults to now) out_of_scope: Mark finding as out of scope (only meaningful with closure_type="false_positive") duplicate: Mark finding as duplicate (only meaningful with closure_type="duplicate") |
| close_finding_false_positiveB | Close a finding as a false positive (and optionally out of scope). Args: finding_id: The finding ID to close note: Why this is a false positive (recommended) note_type: Optional note type ID (see list_note_types) out_of_scope: Also mark the finding as out of scope |
| close_finding_mitigatedA | Close a finding because the vulnerability was remediated (fix applied). Args: finding_id: The finding ID to close note: How/where it was fixed (recommended) note_type: Optional note type ID (see list_note_types) mitigated: Mitigation datetime (ISO 8601, defaults to now server-side) |
| close_finding_duplicateC | Close a finding as duplicate of another finding. Args: finding_id: The finding ID to close duplicate_of: The ID of the original (canonical) finding note: Optional note |
| reopen_findingA | Reopen (reactivate) a closed/mitigated finding. Clears the mitigated state and any false-positive/duplicate/out-of-scope flags unless explicitly restored. Args: finding_id: The finding ID to reopen note: Optional note explaining the reopening restore_false_positive: Keep the false_p flag as-is instead of clearing it restore_out_of_scope: Keep the out_of_scope flag as-is instead of clearing it |
| accept_riskA | Accept the risk of one or more findings (risk acceptance with mandatory expiration date). Creates a RiskAcceptance object. The expiration date is MANDATORY: findings are reactivated automatically when it passes (unless reactivate_expired=False). Risk acceptance is discouraged in favor of fixing; always require an explicit business justification and a named approver. Args: finding_ids: List of finding IDs to accept accepted_by: Name/email of the person accepting the risk justification: Business justification for accepting expiration_date: Mandatory expiration (ISO date "YYYY-MM-DD" or full ISO datetime). Must be in the future. decision: Risk treatment by risk owner: A=Accept, V=Avoid, M=Mitigate, F=Fix, T=Transfer decision_details: Details of the decision / compensating controls recommendation: Security team recommendation: A=Accept, V=Avoid, M=Mitigate, F=Fix, T=Transfer recommendation_details: Details of the recommendation reactivate_expired: Reactivate findings when the acceptance expires (default True) restart_sla_expired: Restart SLA when the acceptance expires (default False) owner_id: Owner user ID (defaults to the authenticated user) name: Acceptance name (defaults to "Risk acceptance ( findings)") |
| accept_risks_vulnerabilityA | Bulk accept risk for findings matching vulnerability IDs (CVEs). Uses the native /findings/accept_risks/ endpoint: matches findings by vulnerability_id (CVE) inside the CURRENT engagement context. Use accept_risk() instead when you need explicit finding IDs and an expiration date. Args: vulnerability_ids: CVE or advisory IDs (e.g. ["CVE-2024-1234"]) accepted_by: Name/email of the person accepting the risk justification: Justification for accepting findings with these vulnerability IDs |
| expire_risk_acceptanceA | Expire a risk acceptance early (reactivates its findings). Args: risk_acceptance_id: The risk acceptance ID reason: Optional reason for expiring |
| reinstate_risk_acceptanceA | Reinstate an expired risk acceptance with a new (mandatory) expiration date. Args: risk_acceptance_id: The risk acceptance ID expiration_date: New expiration date (YYYY-MM-DD or ISO datetime), must be in the future reason: Optional reason |
| list_productsB | List products (assets) with optional filters. Args: name: Filter by name (contains) name_exact: Filter by exact name organization_id: Filter by organization (product type) ID lifecycle: Filter by lifecycle (construction, production, retirement) tag: Filter by tag name (contains) external_audience: Filter by external audience flag internet_accessible: Filter by internet accessible flag limit: Results per page (default 25) offset: Pagination offset |
| get_productC | Get a single product by ID. Args: product_id: The product ID |
| create_productC | Create a new product (asset). Args: name: Product name organization_id: Organization (product type) ID description: Product description lifecycle: Lifecycle stage (construction, production, retirement) platform: Platform (web service, desktop, iot, mobile, web) origin: Origin (third party library, purchased, contractor, internal, open source, outsourced) business_criticality: Business criticality (very high, high, medium, low, very low, none) external_audience: Has external audience internet_accessible: Is internet accessible tags: List of tags |
| update_productB | Update an existing product (partial update). Args: product_id: The product ID name: New name description: New description lifecycle: New lifecycle stage business_criticality: New business criticality tags: Replace tags |
| delete_productC | Delete a product. Args: product_id: The product ID to delete |
| list_engagementsB | List engagements with optional filters. Args: product_id: Filter by product ID name: Filter by name (contains) status: Filter by status (Not Started, In Progress, Completed) engagement_type: Filter by type (Interactive, CI/CD) tag: Filter by tag name limit: Results per page (default 25) offset: Pagination offset |
| get_engagementC | Get a single engagement by ID. Args: engagement_id: The engagement ID |
| create_engagementC | Create a new engagement. Args: name: Engagement name product_id: Product ID this engagement belongs to target_start: Target start date (YYYY-MM-DD) target_end: Target end date (YYYY-MM-DD) engagement_type: Type (Interactive or CI/CD) status: Status (Not Started, In Progress, Completed) description: Description lead_id: Lead user ID build_id: Build identifier commit_hash: Commit hash branch_tag: Branch or tag name source_code_management_uri: SCM URI deduplication_on_engagement: Dedupe scoped to engagement tags: List of tags |
| update_engagementB | Update an existing engagement (partial update). Args: engagement_id: The engagement ID name: New name status: New status (Not Started, In Progress, Completed) description: New description target_start: New target start date target_end: New target end date tags: Replace tags |
| close_engagementC | Close an engagement. Args: engagement_id: The engagement ID to close |
| delete_engagementC | Delete an engagement. Args: engagement_id: The engagement ID to delete |
| list_engagement_notesC | List notes for an engagement. Args: engagement_id: The engagement ID |
| add_engagement_noteC | Add a note to an engagement. Args: engagement_id: The engagement ID entry: Note text content private: Whether the note is private |
| list_testsB | List tests with optional filters. Args: engagement_id: Filter by engagement ID product_id: Filter by product ID (via engagement__product) test_type: Filter by test type ID tag: Filter by tag name (contains) title: Filter by title (contains) limit: Results per page (default 25) offset: Pagination offset |
| get_testC | Get a single test by ID. Args: test_id: The test ID |
| create_testC | Create a new test. Args: engagement_id: Engagement ID this test belongs to test_type_id: Test type ID target_start: Target start datetime (YYYY-MM-DD or ISO format) target_end: Target end datetime title: Test title description: Test description lead_id: Lead user ID environment_id: Environment ID version: Version string branch_tag: Branch or tag build_id: Build identifier commit_hash: Commit hash tags: List of tags |
| update_testC | Update an existing test (partial update). Args: test_id: The test ID title: New title description: New description version: New version tags: Replace tags |
| delete_testC | Delete a test. Args: test_id: The test ID to delete |
| list_test_typesC | List available test types (scan types). Args: name: Filter by name (contains) limit: Results per page offset: Pagination offset |
| list_test_notesC | List notes for a test. Args: test_id: The test ID |
| add_test_noteC | Add a note to a test. Args: test_id: The test ID entry: Note text content private: Whether the note is private |
| import_scanA | Import a scan report into DefectDojo. Either engagement_id OR (product_name + auto_create_context=True) must be provided. Either file_path (local file) or scan_data (raw content) must be provided. Args: scan_type: Scanner type (e.g., "ZAP Scan", "Nessus Scan", "SARIF", "Trivy Scan", etc.) file_path: Path to the scan results file on the local filesystem scan_data: Raw scan data as string (alternative to file_path) engagement_id: Target engagement ID product_name: Product name (for auto-create context) product_type_name: Product type name (for auto-create context) engagement_name: Engagement name (for auto-create context) test_title: Custom test title auto_create_context: Auto-create product/engagement if they don't exist active: Mark findings as active verified: Mark findings as verified close_old_findings: Close findings not present in new scan close_old_findings_product_scope: Close at product scope push_to_jira: Push findings to JIRA minimum_severity: Minimum severity to import (Info, Low, Medium, High, Critical) deduplication_on_engagement: Deduplicate within engagement environment: Environment name version: Version being scanned build_id: Build ID branch_tag: Branch or tag commit_hash: Commit hash service: Service name group_by: Group findings by (component_name, component_name+component_version, file_path) tags: Tags to apply |
| reimport_scanA | Reimport a scan report (update existing test with new results). Either test_id OR (product_name + test_title + auto_create_context) must be provided. Either file_path or scan_data must be provided. Args: scan_type: Scanner type (e.g., "ZAP Scan", "Nessus Scan", "SARIF", etc.) test_id: Existing test ID to reimport into file_path: Path to the scan results file scan_data: Raw scan data as string product_name: Product name (for auto-create context) product_type_name: Product type name (for auto-create context) engagement_name: Engagement name (for auto-create context) test_title: Test title (for matching existing test) auto_create_context: Auto-create context if it doesn't exist active: Mark findings as active verified: Mark findings as verified close_old_findings: Close findings not in new scan (default True) close_old_findings_product_scope: Close at product scope push_to_jira: Push to JIRA minimum_severity: Minimum severity do_not_reactivate: Don't reactivate closed findings environment: Environment name version: Version being scanned build_id: Build ID branch_tag: Branch or tag commit_hash: Commit hash service: Service name group_by: Group findings by field tags: Tags to apply |
| list_organizationsB | List organizations (product types). Args: name: Filter by name (contains) limit: Results per page (default 25) offset: Pagination offset |
| get_organizationC | Get a single organization by ID. Args: organization_id: The organization (product type) ID |
| create_organizationC | Create a new organization (product type). Args: name: Organization name description: Description critical_product: Is critical product flag key_product: Is key product flag |
| update_organizationB | Update an organization (partial update). Args: organization_id: The organization ID name: New name description: New description |
| delete_organizationC | Delete an organization. Args: organization_id: The organization ID to delete |
| list_usersB | List users with optional filters. Args: username: Filter by username (contains) first_name: Filter by first name last_name: Filter by last name is_active: Filter by active status is_superuser: Filter by superuser status limit: Results per page offset: Pagination offset |
| get_userC | Get a single user by ID. Args: user_id: The user ID |
| get_current_userA | Get the currently authenticated user's profile. |
| create_userC | Create a new user. Args: username: Username first_name: First name last_name: Last name email: Email address is_active: Active status is_superuser: Superuser status |
| update_userC | Update a user (partial update). Args: user_id: The user ID first_name: New first name last_name: New last name email: New email is_active: Set active status |
| delete_userC | Delete a user. Args: user_id: The user ID to delete |
| list_endpointsB | List endpoints with optional filters. Args: product_id: Filter by product ID host: Filter by host (contains) protocol: Filter by protocol path: Filter by path (contains) tag: Filter by tag limit: Results per page offset: Pagination offset |
| get_endpointB | Get a single endpoint by ID. Args: endpoint_id: The endpoint ID |
| list_endpoint_statusC | List endpoint statuses (relationship between endpoints and findings). Args: endpoint_id: Filter by endpoint ID finding_id: Filter by finding ID mitigated: Filter by mitigated status limit: Results per page offset: Pagination offset |
| list_jira_instancesC | List configured JIRA instances. Args: limit: Results per page offset: Pagination offset |
| get_jira_instanceC | Get a JIRA instance configuration by ID. Args: instance_id: The JIRA instance ID |
| list_jira_projectsC | List JIRA project configurations. Args: product_id: Filter by product ID engagement_id: Filter by engagement ID limit: Results per page offset: Pagination offset |
| list_jira_finding_mappingsA | List JIRA finding mappings (links between findings and JIRA issues). Args: finding_id: Filter by finding ID jira_key: Filter by JIRA issue key limit: Results per page offset: Pagination offset |
| create_jira_instanceB | Create a new JIRA instance configuration. Args: url: JIRA instance URL username: JIRA username password: JIRA API token or password default_issue_type: Default issue type for new issues epic_name_id: Custom field ID for epic name open_status_key: Transition ID for opening issues close_status_key: Transition ID for closing issues info_mapping_severity: JIRA priority for Info severity low_mapping_severity: JIRA priority for Low severity medium_mapping_severity: JIRA priority for Medium severity high_mapping_severity: JIRA priority for High severity critical_mapping_severity: JIRA priority for Critical severity |
| get_system_settingsB | Get DefectDojo system settings. |
| update_system_settingsC | Update system settings (partial update). Args: settings_id: Settings ID (usually 1) **kwargs: Key-value pairs of settings to update |
| get_celery_statusA | Get Celery worker and queue status. Returns worker liveness, pending queue length, and configuration. |
| get_celery_queue_detailsA | Get per-task breakdown of the Celery queue. Returns task names, counts, and queue positions. May be slow for large queues. |
| purge_celery_queueA | Purge all pending Celery tasks from the queue. Tasks already being executed are not affected. Use with caution - this removes ALL pending tasks. |
| purge_celery_taskB | Purge all queued instances of a specific Celery task. Args: task_name: The task name to purge (e.g., "dojo.tasks.async_update") |
| list_risk_acceptancesB | List risk acceptances. Args: finding_id: Filter by an accepted finding ID owner_id: Filter by owner user ID name_contains: Filter by name (contains) accepted_by: Filter by acceptor name/email (contains) limit: Results per page offset: Pagination offset |
| get_risk_acceptanceB | Get a risk acceptance by ID. Args: risk_acceptance_id: The risk acceptance ID |
| create_risk_acceptanceA | Create a new risk acceptance (low-level: prefer accept_risk, which enforces expiration). Args: name: Risk acceptance name owner_id: Owner user ID accepted_findings: List of finding IDs to accept recommendation: Security recommendation code (A, V, M, F, T) recommendation_details: Details about the recommendation decision: Risk treatment decision code (A, V, M, F, T) decision_details: Details about the decision / compensating controls expiration_date: Expiration date (YYYY-MM-DD or ISO datetime; mandatory in accept_risk) accepted_by: Name/email of the person accepting the risk reactivate_expired: Reactivate findings when the acceptance expires (default True) restart_sla_expired: Restart SLA when the acceptance expires (default False) |
| update_risk_acceptanceB | Update a risk acceptance (partial update, e.g. extend expiration). Args: risk_acceptance_id: The risk acceptance ID expiration_date: New expiration date (YYYY-MM-DD or ISO datetime) decision: Risk treatment decision code (A, V, M, F, T) decision_details: Details about the decision recommendation: Security recommendation code (A, V, M, F, T) recommendation_details: Details about the recommendation reactivate_expired: Reactivate findings on expiration restart_sla_expired: Restart SLA on expiration |
| delete_risk_acceptanceC | Delete a risk acceptance. Args: risk_acceptance_id: The risk acceptance ID |
| list_notificationsC | List notification configurations. Args: limit: Results per page offset: Pagination offset |
| list_sla_configurationsC | List SLA configurations. Args: limit: Results per page offset: Pagination offset |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 78 tools
Most tools are clearly distinct by resource and action (e.g., list_products vs get_product). However, the closure tools are heavily overlapping: close_finding, close_finding_false_positive, close_finding_mitigated, and close_finding_duplicate all serve the same core purpose with different levels of abstraction. Similarly, accept_risk, accept_risks_vulnerability, and create_risk_acceptance overlap, requiring agents to choose carefully.
The naming is mostly consistent with a verb_noun pattern (list_products, create_product, delete_product). Some deviations exist, such as import_scan and reimport_scan (no noun), and tools like get_current_user follow the pattern. The heavy use of 'finding' variations (add_finding_metadata, close_finding_duplicate) is predictable but occasionally verbose.
With 78 tools, the server is far beyond the recommended 3-15 range for a single MCP server. This is an extreme mismatch that makes it difficult for an agent to navigate and increases the risk of misselection. While the domain (DefectDojo) is complex, the count is excessive and could be split into multiple focused servers.
The tool surface covers the core domain comprehensively: products, engagements, tests, findings, users, risk acceptances, and JIRA integrations. Minor gaps exist, such as no explicit tool to list all available scan types (list_test_types exists but may not cover external scanners), and some bulk operations are missing (e.g., bulk update findings). However, most CRUD operations are present.