dtrack-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@dtrack-mcpShow unanalysed CRITICAL findings in myapp v2.3.0"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
dtrack-mcp
MCP server that connects Claude (or any MCP-compatible LLM) to Dependency-Track.
Instead of clicking through the DT UI to triage hundreds of vulnerability findings, describe what you need in natural language — Claude pulls the data, reasons over it, and writes the verdict back.
Why
Dependency-Track accumulates findings fast. A product with 5 versions and 100+ vulnerabilities each means 500+ rows to triage — each requiring you to open a finding, read the CVE, check CVSS, look at EPSS/KEV signals, see what other projects decided, and pick a state. That's hours of browser clicking per release cycle.
dtrack-mcp exposes DT as an MCP server so Claude can do the data work:
Pull findings filtered by severity or state
Deduplicate CVE/GHSA/OSV aliases into one group per real issue
Check what was decided for the same vulnerability in other projects or versions
Write the triage decision back to DT with a comment
Related MCP server: CVE MCP Server
Key scenarios
1. Triage a batch of findings
Show me all CRITICAL and HIGH findings in project "myapp v2.3.0"
that haven't been analysed yet. Group by alias so I don't see
the same CVE twice. For each group tell me the CVSS vector,
EPSS score, and whether it's in CISA KEV.2. Carry triage forward when upgrading
We just uploaded the SBOM for myapp v2.4.0. Carry over all
triage decisions from v2.3.0 — dry run first, then apply.3. Propagate a decision across versions
A new CVE is found in v1.0, v1.1, v2.0, and v2.1 simultaneously. Triage it in one version, then carry the decision backward and forward to the others:
Set CVE-2024-12345 in myapp v2.1.0 as NOT_AFFECTED
(justification: CODE_NOT_REACHABLE). Then carry that decision
to v1.0, v1.1, and v2.0.Tools
Tool | Description |
| List projects with vulnerability counts |
| Find project by UUID or by exact name + version |
| Findings with severity / state / suppressed filters |
| Deduplicate CVE/GHSA/OSV via union-find |
| Full detail by id, optionally specifying source |
| Which projects are affected by a given CVE? |
| Current triage state + full comment history |
| Same vuln in other components / projects, with prior analyses |
| ⚠ WRITE — set state, justification, response, comment. Accepts raw UUIDs or a finding dict |
| All versions of a project, newest first |
| Carried / updated / new / gone between two versions |
| ⚠ WRITE — transfer decisions v1 → v2 (or v2 → v1) |
| ⚠ WRITE — fan out one decision to all versions of a project |
| ⚠ WRITE — upload CycloneDX/SPDX SBOM |
All tools are read-only except the four marked ⚠ WRITE. The HTTP layer
enforces this: any write path other than PUT /api/v1/analysis and
POST /api/v1/bom raises before reaching the network.
Requirements
Python 3.10+ (tested on 3.10–3.12).
Dependency-Track 4.11+. DT 4.14+ is recommended — earlier versions lack EPSS-for-GHSA data and CVSSv4 fields, and purl distro-qualifier matching degrades. The server logs a warning at startup when it detects an older DT.
An MCP-capable client — Claude Desktop, Claude Code, or any other stdio MCP runtime.
A DT account with
VIEW_PORTFOLIO+VULNERABILITY_ANALYSISpermissions (andBOM_UPLOADif you useupload_bom).
Linux and macOS are the primary targets; Windows works under WSL.
Installation
pip install dtrack-mcpOr from source (for development):
git clone https://github.com/drewrukin/dtrack-mcp.git
cd dtrack-mcp
pip install -e .After pip install, the dtrack-mcp command is on $PATH and starts
the MCP server on stdio. A quick local smoke test against your DT
instance:
DTRACK_URL=https://dt.example.com \
DTRACK_API_KEY=odt_... \
python scripts/smoke.pyscripts/smoke.py is read-only and safe to re-run — it exercises every
GET-based tool on one real project and prints a compact summary.
Claude Desktop — add to ~/Library/Application Support/Claude/claude_desktop_config.json
(macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"dtrack": {
"command": "dtrack-mcp",
"env": {
"DTRACK_URL": "https://dt.example.com",
"DTRACK_API_KEY": "odt_..."
}
}
}
}Claude Code — add to ~/.claude.json:
{
"mcpServers": {
"dtrack": {
"command": "dtrack-mcp",
"env": {
"DTRACK_URL": "https://dt.example.com",
"DTRACK_API_KEY": "odt_..."
}
}
}
}Restart Claude after editing the config.
Auth options
Variable | Description |
| Base URL of your DT instance |
| Preferred. Requires VIEW_PORTFOLIO + VULNERABILITY_ANALYSIS permissions. Add BOM_UPLOAD for |
| Alternative. Exchanges credentials for a JWT; re-fetches on 401. |
Optional tuning
Variable | Default | Description |
|
| HTTP timeout in seconds. |
|
| Set |
|
| Retries on HTTP 429/502/503/504 and transport errors (connect refused, read timeout). |
|
| Base for exponential backoff: |
|
| Sleep between writes in |
|
| Standard |
|
| Skip the one-shot |
Proxies are disabled inside the client (trust_env=False) because DT
is typically on an internal network and corporate proxies refuse to
tunnel it. Equivalent to curl --noproxy '*'.
Safety
Read-mostly by design. Writes are gated at the HTTP client level, not in application logic. The guard runs before any network call. The only allowed write paths are
PUT /api/v1/analysis(triage) andPOST /api/v1/bom(SBOM upload).Input validation. All tool parameters are validated against enum allowlists before hitting DT. Unknown parameters are rejected (
additionalProperties: falsein JSON schema).carry_over_triageandbroadcast_triagedefault todry_run. No writes happen unless you explicitly passmode="exact"after reviewing the plan.max_operationscap. Bulk write operations fail early if the plan exceeds 500 entries by default, preventing accidental mass-triage from a hallucinated call.Transient-failure retry. Connection refuseds, read timeouts, and HTTP 429/502/503/504 are retried with exponential backoff (see
DTRACK_RETRY_*); no other status is retried, so a broken caller never loops.No secrets in logs. Credentials come from env only; JWTs and API keys are never logged, and raw DT responses are never echoed verbatim into tool output.
Troubleshooting
no credentials: set DTRACK_API_KEY or DTRACK_USER+DTRACK_PASSWORDat startup — the env is not visible to the MCP subprocess. Put the vars in theenvblock of your client config (examples above), not just in your shell.DTRACK_URL is not set— same cause as above.HTTP 401afterapi_keyauth — the key was revoked or lacks the required permissions. API-key auth does not re-login; rotate the key in DT and update the client config.HTTP 403 on PUT /api/v1/analysis— your account lacksVULNERABILITY_ANALYSIS. Read-only tools work without it.dtrack-mcp: refused <METHOD> <path>— you hit the read-mostly guard. Either the call is outside the documented write allowlist (which is the whole point of the guard) or DT introduced a new endpoint and the spec needs updating — open an issue, don't relax the guard locally.Every call is slow on login+password auth — the JWT is cached per-process, so this only happens at startup. If it repeats, the client is restarting between calls; prefer
DTRACK_API_KEYfor long sessions.
Documentation
SPEC.md— full protocol specification: normalized schemas, per-tool input/output contracts, hard invariants, per-stage evolution.scripts/smoke.py— end-to-end read-only smoke test; mirrors the shape of a real triage session.scripts/smoke_retry.py— retry-layer integration check; includes a recovery-probe mode that requires a live DT instance you can restart.
License
MIT — see LICENSE.
Available Tools
14 toolsbroadcast_triageA
⚠ WRITE (when mode="exact"). Fan out triage decisions to all versions.
A specialised form of carry_over_triage for the case where a new
CVE is found simultaneously in multiple versions of the same product.
Instead of running carry_over N times, triage the finding once in any
version, then call this tool to propagate the decision in all
directions (newer AND older versions).
Steps:
Fetches every version of
project_namefrom DT.Excludes the reference version.
Calls
carry_over_triage(reference → target)for each.Returns per-target results plus an aggregate summary.
ALWAYS run mode="dry_run" first to review the plan.
Args: reference_project_uuid: UUID of the version that already has the triage decision to broadcast. project_name: Exact project name (used to find all other versions). mode: "dry_run" (no writes) or "exact" (performs writes). include_updated_components: Also transfer updated_component matches. Default False — conservative. overwrite_not_set: Transfer over targets in state NOT_SET. Default True. overwrite_any: Transfer over targets in any state. Default False. comment_prefix: Prepended to every carry-over comment. max_operations: Per-target cap. Raise if a single target needs more. active_only: Skip inactive/archived versions. Default True.
| Name | Required | Description | Default |
|---|---|---|---|
| reference_project_uuid | Yes | ||
| project_name | Yes | ||
| mode | No | dry_run | |
| include_updated_components | No | ||
| overwrite_not_set | No | ||
| overwrite_any | No | ||
| comment_prefix | No | [dtrack-mcp] | |
| max_operations | No | ||
| active_only | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses it is a WRITE operation when mode='exact', describes the full algorithm (fetch, exclude, iterate, return), and covers default behaviors without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with warning, purpose, steps, and parameter docs; every sentence is valuable and front-loaded with critical info.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, 9 parameters, and output schema present, the description fully covers behavior, usage, and parameter details, making it self-sufficient for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 0% schema coverage, the description provides detailed explanations for all 9 parameters, including defaults and behavior, far exceeding schema information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Fan out triage decisions to all versions' and distinguishes from sibling 'carry_over_triage' as a specialized form for simultaneous CVEs across versions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises to always run dry_run first, compares to carry_over_triage, and provides step-by-step usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
carry_over_triageA
⚠ WRITE (when mode="exact"). Transfer triage decisions v1 → v2.
ALWAYS run with mode="dry_run" first. Only switch to
mode="exact" after a human has reviewed the plan. In exact mode
each transfer issues PUT /api/v1/analysis and appends a comment
noting the source project and match reason. The full history of
source comments is preserved in the original project untouched.
Skip rules:
source has no actionable analysis (state NOT_SET) → skipped
target already triaged (state ≠ NOT_SET) and overwrite_any=False → skipped
target NOT_SET and overwrite_not_set=False → skipped
Safety caps:
max_operations(default 500) early-fails in exact mode when the plan is larger than the cap. Raise explicitly for huge transfers, or split into batches.DTRACK_WRITE_DELAY_MSenv var adds a per-write sleep for rate-limit-sensitive instances.
Args: source_project_uuid: Old version UUID with existing triage. target_project_uuid: New version UUID to populate. mode: "dry_run" (no writes, returns plan) or "exact" (performs writes). include_updated_components: Also transfer updated_component matches (same CVE, different component version). Default False — conservative. overwrite_not_set: Transfer over target entries in state NOT_SET. Default True. overwrite_any: Transfer over target entries in any state. Default False. comment_prefix: Prepended to every carry-over comment. max_operations: Sanity cap against hallucination-driven bulk writes in exact mode. Raise if you genuinely need to transfer more.
| Name | Required | Description | Default |
|---|---|---|---|
| source_project_uuid | Yes | ||
| target_project_uuid | Yes | ||
| mode | No | dry_run | |
| include_updated_components | No | ||
| overwrite_not_set | No | ||
| overwrite_any | No | ||
| comment_prefix | No | [dtrack-mcp] | |
| max_operations | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavior: in exact mode it issues PUT calls, appends comments, preserves source history, and includes skip rules and safety caps. Also mentions an env var for rate-limiting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is fairly long but well-structured: a warning, usage guidelines, skip rules, safety caps, and parameter list. It's front-loaded with the dry-run instruction. A minor point is that it could be slightly more concise, but every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (8 params, write operation, safety concerns), the description covers all necessary aspects: prerequisite dry-run, skip rules, safety caps, parameter meanings. The output schema exists but doesn't need elaboration in the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The Args section provides detailed explanations for all 8 parameters, adding meaning beyond the schema's property titles and types. For example, it explains include_updated_components as 'same CVE, different component version'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Transfer triage decisions v1 → v2', a specific verb-resource combo. It distinguishes from siblings like broadcast_triage and diff_findings by emphasizing it's a version-to-version transfer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit instructions: 'ALWAYS run with mode="dry_run" first' and only switch to exact after human review. Also details skip rules and safety caps, leaving no ambiguity about when and how to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diff_findingsA
Compute carried / updated_component / new / gone between two versions.
Typical use: upgrading a product v1 → v2. source is v1 (where
triage decisions already exist), target is v2 (new SBOM just
uploaded). Returns four lists:
carried— same component + same vulnerability, safe to transfer analyses 1:1.updated_component— same vulnerability, component version changed (patch or major). Decision may or may not still apply.new— appeared in target only.gone— were in source only; reason isvuln_fixed(component still there) orcomponent_removed.
Component matching uses (purl_type, purl_namespace, purl_name) —
deliberately drops qualifiers so DT 4.13→4.14 upgrades that add
distro=... don't invalidate every match. Ambiguous matches
(multi-arch SBOMs with the same component at different qualifiers)
emit an entry in warnings. Read-only.
Args: source_project_uuid: Old version UUID (usually with existing triage). target_project_uuid: New version UUID. include_analysis: Load current analysis for each source finding (needed for carry_over; adds one HTTP call per finding).
| Name | Required | Description | Default |
|---|---|---|---|
| source_project_uuid | Yes | ||
| target_project_uuid | Yes | ||
| include_analysis | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses read-only nature, component matching logic (dropping qualifiers), handling of ambiguous matches (warnings), and the meaning of 'reason' fields. This is comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is somewhat lengthy but well-structured with a list and detailed explanations. Every sentence adds value, though it could be slightly more concise for a quick scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of the tool (four output categories, matching logic, warnings) and the presence of an output schema, the description covers the key behavioral aspects and output structure. It doesn't explain the exact output schema fields, but that is presumably handled by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must add meaning. It explains 'source_project_uuid' as old version UUID with existing triage, 'target_project_uuid' as new version UUID, and 'include_analysis' as needed for carry_over with a performance note. This adds significant value beyond the schema's title and type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Compute' and the resource 'carried / updated_component / new / gone', which specifically distinguishes it from siblings like carry_over_triage. It explains the four categories and their meanings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a typical use case (upgrading product v1→v2) and explains the roles of source and target. States it's read-only. Does not explicitly list when not to use, but context with siblings implies differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_duplicate_analysesA
Find analyses of duplicates of a finding across DT.
Given one finding, returns three parallel lists of duplicates with their current analysis (state + comment history), intended for a triage loop that wants to reuse prior decisions:
aliases_in_project— other findings in the same project in the same alias cluster (CVE ↔ GHSA ↔ OSV of the same issue).same_vuln_other_components— same vulnerability uuid on other components/versions in the same project.other_projects— findings in other DT projects that share any id in the target's alias cluster; each entry carries its project uuid/name/version.
Each entry bundles {component, vulnerability, analysis}; entries
in other_projects also carry project. Read-only.
Filters (v0.4):
states— whitelist of analysis states (e.g.["NOT_AFFECTED","EXPLOITABLE"]) applied to all three output buckets.targetis never filtered.only_analyzed— shorthand for every state except NOT_SET. Ignored whenstatesis non-empty (stateswins).active_only(default True) — skip archived/inactive DT projects inother_projects. v0.4 default flip — existing callers that don't pass the flag stop seeing archived hits.project_tag— inother_projectsonly, keep projects carrying this tag (case-insensitive name equality).compact— strip bulky fields (description, CVSS vectors, analysis details, long comment bodies truncated to 200 chars). See SPEC §13.4.1 for the exact field list.
Args:
project_uuid: DT project UUID of the target finding.
component_uuid: DT component UUID of the target finding.
vulnerability_uuid: DT vulnerability UUID of the target finding.
states: Whitelist of analysis state strings, e.g.
["NOT_AFFECTED","EXPLOITABLE"].
only_analyzed: If true, keep only entries with a non-NOT_SET
analysis. Ignored when states is non-empty.
active_only: If true (default), skip archived projects in
other_projects.
project_tag: Optional DT tag name; restricts other_projects
to projects carrying this tag (case-insensitive).
compact: If true, strip bulky fields from the payload.
| Name | Required | Description | Default |
|---|---|---|---|
| project_uuid | Yes | ||
| component_uuid | Yes | ||
| vulnerability_uuid | Yes | ||
| states | No | ||
| only_analyzed | No | ||
| active_only | No | ||
| project_tag | No | ||
| compact | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly states 'Read-only,' which is a key behavioral trait. It also details the output structure and filters. However, no annotations exist, and the description does not disclose authorization requirements or rate limits, leaving some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections and bullet points, front-loading the core purpose. While every sentence is informative, the length could be slightly reduced without losing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (8 parameters, no annotations, rich output), the description is remarkably complete. It covers the three output lists, parameter details, and edge cases (e.g., active_only default flip). The output schema exists but the description adds important context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description fully compensates by explaining each parameter's purpose, default values, interaction rules (e.g., states wins over only_analyzed), and behavioral impacts (e.g., active_only default flip). This adds substantial meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool finds duplicate analyses of a given finding across DT, and explains the three parallel lists (aliases_in_project, same_vuln_other_components, other_projects) with specific definitions. This is specific and distinguishes the tool from other search/filter tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description frames the tool as 'intended for a triage loop that wants to reuse prior decisions,' providing clear context. However, it does not explicitly contrast with sibling tools like carry_over_triage or diff_findings, or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_vulnerabilityA
Fetch the full detail record of a vulnerability.
When source is given (e.g. "NVD", "GITHUB"), fetches directly.
When omitted, probes candidate sources based on the id prefix
(CVE-* → NVD, GHSA-* → GITHUB, etc.) and returns the first hit,
or null if nothing matches. Read-only.
Returns title, description, CVSS v2/v3/v4 scores and vectors, CWEs, EPSS score and percentile, KEV flag, references, and alias list.
Args: vuln_id: Vulnerability id, e.g. "CVE-2024-1234", "GHSA-xxxx-yyyy-zzzz". source: Optional DT source namespace — "NVD", "GITHUB", "OSV", "SNYK", "SONATYPE", "VULNDB", "INTERNAL", etc. When omitted the source is inferred from the id prefix.
| Name | Required | Description | Default |
|---|---|---|---|
| vuln_id | Yes | ||
| source | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It explicitly states 'Read-only.' and describes the return behavior: returns the first hit or null if nothing matches. It lists all returned fields (title, description, CVSS scores, etc.). No contradictions with annotations. The description fully discloses the tool's behavior and effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: an introductory sentence, a paragraph explaining the source parameter logic, a line stating 'Read-only.' and then a bulleted list of return fields. Every sentence is informative; there is no redundancy or fluff. The size is appropriate for the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (2 parameters, optional source inference) and the presence of an output schema, the description is complete. It explains the input parameters, the logic of source resolution, and the output fields. There are no gaps in context for an agent to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, yet the description fully explains both parameters: vuln_id with examples ('CVE-2024-1234', 'GHSA-xxxx-yyyy-zzzz') and source with a list of possible values and the default inference behavior. This adds substantial meaning beyond the schema's type/required fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Fetch the full detail record of a vulnerability.' It goes beyond a simple verb+noun by explaining the behavior with and without the source parameter, and implicitly distinguishes from sibling tools like 'search_vulnerability' (fetch vs. search). The verb 'Fetch' and resource 'full detail record' are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear guidance on when to include the source parameter (e.g., 'When source is given ... fetches directly') and when to omit it (source inferred from id prefix). It explains the fallback behavior (probes candidates, returns first hit or null). However, it does not explicitly advise when to use this tool versus the sibling 'search_vulnerability' or other alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_analysisA
Fetch the analysis record for one finding.
Returns the analysis state, justification, response, details,
suppressed flag, and the full comment history. If DT has no analysis
row yet, returns an empty-analysis default (state NOT_SET, no
comments) — callers never get null. Read-only.
Args: project_uuid: DT project UUID. component_uuid: DT component UUID inside that project. vulnerability_uuid: DT vulnerability UUID.
| Name | Required | Description | Default |
|---|---|---|---|
| project_uuid | Yes | ||
| component_uuid | Yes | ||
| vulnerability_uuid | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description fully discloses behavior: it is read-only, lists all returned fields, handles missing analysis by returning a default (never null), and uses clear language. This is comprehensive for a retrieval tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: it starts with the primary purpose, then lists return fields, then explains edge cases, and ends with 'Read-only' and arguments. It is informative without unnecessary repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (3 required UUID parameters, no output schema shown but exists), the description covers all essential aspects: what it does, what it returns, edge cases, and read-only guarantee. It leaves no gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description only restates parameter names with generic phrases like 'DT project UUID'. It adds minimal semantic value beyond the schema, failing to explain formats or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Fetch' and identifies the resource as 'analysis record for one finding'. It clearly distinguishes itself from siblings like 'set_analysis' (modification) and 'list_findings' (listing many findings).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: it retrieves an analysis record for a single finding, and explains the default return when no analysis exists. However, it does not explicitly contrast with sibling tools or state when not to use it, leaving some ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_versionsA
List all versions of a project by exact name.
Returns {name, total, versions} where versions are sorted newest
first (semver-aware, lexicographic fallback). Used to pick source /
target UUIDs for diff_findings and carry_over_triage.
Read-only.
Args: name: Exact project name. active_only: Exclude projects marked inactive in DT.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| active_only | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses read-only nature, sorting behavior (semver-aware, newest first), and return structure. It does not mention error handling or rate limits, but for a simple listing tool, this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with each sentence adding value. It front-loads the main action, then covers return, use case, read-only status, and parameters. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity and the presence of an output schema, the description is fairly complete. It explains purpose, usage, behavior, and parameters. It could mention error scenarios (e.g., project not found), but for a listing tool, the provided information is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, meaning the description must fully explain parameters. It does so effectively: 'name: Exact project name' and 'active_only: Exclude projects marked inactive in DT' with default true, adding meaning beyond the schema's type definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List all versions of a project by exact name,' which is a specific verb+resource combination. It distinguishes itself from siblings by mentioning its use for picking UUIDs for diff_findings and carry_over_triage, which are sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Used to pick source / target UUIDs for diff_findings and carry_over_triage,' providing clear context for when to use it. It also states 'Read-only,' but does not explicitly exclude other scenarios or list alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
group_findings_by_aliasA
Group findings by alias (transitive closure) — dedup CVE/GHSA/OSV.
Vulnerabilities reported under different ids (e.g. CVE-2024-X and
GHSA-Y-Z) often refer to the same issue and are linked via DT's
aliases. This tool runs union-find over that alias graph and returns
one cluster per real issue. Each cluster carries a canonical id
(CVE first, then GHSA, then OSV, then SNYK, then INTERNAL, then
alphabetical), the full alias list, a merge_reason trace of the
edges that joined the cluster, and every finding in the project
belonging to it.
Same filters as list_findings. Pagination applies to groups, not to the findings inside them — a group always ships with all its findings intact. Sorted by highest CVSS score (v3 or v4) descending. Read-only.
include_details=True (v0.3) embeds title/description/references
in every finding's vulnerability summary. The same description text
repeats on each finding inside a group — acceptable tradeoff for a
single-call triage flow.
Args: project_uuid: DT project UUID. suppressed: Include suppressed findings. analysis_states: Whitelist of analysis state strings. severities: Whitelist of severity strings. page: 1-based page of groups (not findings). page_size: Groups per page (max 500). include_details: If true, embed title/description/references in each finding's vulnerability summary (v0.3). Default false.
| Name | Required | Description | Default |
|---|---|---|---|
| project_uuid | Yes | ||
| suppressed | No | ||
| analysis_states | No | ||
| severities | No | ||
| page | No | ||
| page_size | No | ||
| include_details | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavior: union-find algorithm, canonical id priority, merge_reason trace, pagination on groups, sorting by CVSS, include_details behavior, and read-only status. It even warns about repeated descriptions in findings. This is comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then logically covers clustering details, behavior, and parameter list. Every sentence adds value without redundancy. Length is appropriate for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 7 parameters, no annotations, and an existing output schema, the description explains output structure (canonical id, alias list, merge_reason, all findings), pagination, sorting, and the effect of include_details. This is sufficient for an AI agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It lists all 7 parameters with explanations (e.g., 'page: 1-based page of groups (not findings)') and defaults. Some details like possible values for analysis_states are omitted, but the coverage is strong overall.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Group findings by alias (transitive closure) — dedup CVE/GHSA/OSV,' which precisely states the tool's action and resource. It clearly distinguishes from sibling tools like list_findings by explaining the clustering over alias graph, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use (deduplication via aliases) and notes 'Same filters as list_findings,' implying an alternative. It lacks explicit 'when not to use' or direct comparison to other sibling tools, but the context of deduplication is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_findingsA
List vulnerability findings for a project with optional filters.
Returns normalized findings — each one bundles the vulnerability
(severity, CVSS v3/v4, CWE, EPSS, aliases), the affected component
(name, version, purl, latest known version), and the analysis state.
All filters are applied client-side before pagination, so total
reflects the post-filter count. Read-only.
When include_details=True, every finding's vulnerability summary
also carries title, description, and references so an
LLM can draft a verdict without a separate get_vulnerability
call. Off by default because descriptions can be 2–4 KB each — set
it to true only for focused batches (20–30 findings), not
project-wide scans.
Args: project_uuid: DT project UUID (get it from list_projects or lookup_project). suppressed: Include findings suppressed by an analyst. analysis_states: Whitelist, e.g. ["NOT_SET", "IN_TRIAGE", "EXPLOITABLE", "FALSE_POSITIVE", "NOT_AFFECTED", "RESOLVED"]. severities: Whitelist, e.g. ["CRITICAL", "HIGH", "MEDIUM", "LOW", "UNASSIGNED"]. page: 1-based page number (applied after filtering). page_size: Items per page (max 500). include_details: If true, embed title/description/references in each finding's vulnerability summary (v0.3). Default false.
| Name | Required | Description | Default |
|---|---|---|---|
| project_uuid | Yes | ||
| suppressed | No | ||
| analysis_states | No | ||
| severities | No | ||
| page | No | ||
| page_size | No | ||
| include_details | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations present, so description carries full burden. Discloses read-only nature, filtering behavior (client-side, post-filter total), return structure (bundled vulnerability, component, analysis state), and include_details trade-off (payload size). Highly transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with summary, behavioral notes, and parameter list. Front-loaded with purpose. Slightly verbose but all content adds value; could tighten a few phrases.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers main behaviors, pagination, filtering, and include_details. Output schema exists, so return values not needed. Lacks error handling or prerequisites (e.g., project UUID from list_projects), but still sufficiently complete for typical use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the Args section thoroughly explains each parameter, including examples for analysis_states and severities, and details on include_details. Fully compensates for missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'List vulnerability findings for a project with optional filters.' Verb and resource are specific, and it distinguishes from sibling tools like get_analysis or set_analysis.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides usage context: filters applied client-side, pagination behavior, and advice on include_details (use only for focused batches). Does not explicitly contrast with all sibling alternatives but gives clear guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsA
List Dependency-Track projects.
List projects in the Dependency-Track instance, optionally filtered by a substring of the project name. Returns normalized projects with per-severity vulnerability counts. Read-only.
Args: name_filter: Case-insensitive substring on project name. active_only: If true, exclude projects marked inactive in DT. page: 1-based page number. page_size: Items per page (max 500).
| Name | Required | Description | Default |
|---|---|---|---|
| name_filter | No | ||
| active_only | No | ||
| page | No | ||
| page_size | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must fully disclose behavior. It declares 'Read-only', specifies the return includes 'per-severity vulnerability counts', and explains parameters like pagination and filtering details (e.g., case-insensitive substring, max page size). This provides substantial transparency, though it omits rate limits or authorization requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-organized, starting with a summary sentence, then a second sentence on output and safety, followed by parameter explanations. Every sentence adds value without redundancy, making it efficient for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (filtering, pagination) and the presence of an output schema for return values, the description covers key aspects: filtering, pagination details, read-only assurance. It lacks an explicit mention of ordering, but the output schema likely covers that. Overall, it is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description is essential. It adds a dedicated 'Args' section explaining each parameter beyond the schema's titles: name_filter (case-insensitive substring), active_only (exclude inactive), page (1-based), page_size (max 500). This fully compensates for the schema's lack of descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's verb and resource: 'List Dependency-Track projects'. It also specifies the operations: listing all projects with optional filtering by name substring, and indicates the output includes vulnerability counts. This distinguishes it from sibling tools like list_findings (which lists findings) and upload_bom (which uploads).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage is implied by the tool's purpose—listing projects—but the description does not explicitly state when to use this tool over alternatives like list_findings or search_vulnerability. It mentions 'Read-only', which hints at safe use, but lacks direct guidance on context or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_projectA
Resolve a project by UUID or by exact (name, version).
Two lookup paths — use whichever you have:
project_uuid— direct UUID lookup (e.g. copied from the DT UI URL or returned by another tool).name+version— exact-match lookup by project name and version string.
When project_uuid is provided it takes precedence; name and
version are ignored. Returns a normalized project, or null if
nothing matches. Read-only.
Args:
project_uuid: DT project UUID. Takes precedence when provided.
name: Exact project name (requires version).
version: Exact project version (requires name).
| Name | Required | Description | Default |
|---|---|---|---|
| project_uuid | No | ||
| name | No | ||
| version | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description fully carries the burden. Declares read-only operation, return null if no match, and precedence behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with sections for different lookup paths. Front-loaded with purpose. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so need not explain return values. Description fully explains behavior, input strategies, and return null case. Complete for a single-project resolver.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but description explains each parameter's role, how to use them together, and precedence. Adds significant meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool resolves a project by UUID or by exact (name, version). Distinguishes two lookup paths and specifies precedence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use each parameter set and precedence rules. Lacks explicit exclusion of when not to use this tool compared to siblings, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_vulnerabilityA
Search which projects are affected by a vulnerability.
Given a vulnerability id (e.g. "CVE-2024-1234"), resolves it, then finds every DT project that contains a finding for this vulnerability (or any of its aliases). For each project returns the analysis state per affected component.
Use this to answer "which products are affected by CVE-X and what's been decided?" without manually iterating over projects. Read-only.
Args: vuln_id: Vulnerability id (e.g. "CVE-2024-1234", "GHSA-xxxx"). active_only: Skip inactive/archived projects. Default True. only_analyzed: Only include projects/findings with a non-NOT_SET analysis state. Default False.
| Name | Required | Description | Default |
|---|---|---|---|
| vuln_id | Yes | ||
| active_only | No | ||
| only_analyzed | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and explicitly states 'Read-only', which is a key behavioral trait. It also describes the resolution process (including alias handling) and return structure (per-project analysis state), providing sufficient transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a one-line purpose, a brief explanation of the process, a usage hint, and a clear Args section. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema, the description does not need to detail return values. It covers the overall behavior, parameters, and usage context comprehensively for an agent to correctly select and invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters are explained in the description beyond the input schema: vuln_id includes examples, active_only and only_analyzed have clear explanations of their effects and defaults. This compensates for the 0% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Search which projects are affected by a vulnerability.' It explains the process of resolving a vulnerability ID and finding affected projects with analysis states per component, distinguishing it from siblings like find_vulnerability or list_findings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises to use the tool for answering which products are affected by a CVE and what decisions have been made, avoiding manual iteration. It does not explicitly mention when not to use it, but the context and sibling list provide alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_analysisA
⚠ WRITE. Update the analysis record for one finding.
Two ways to identify the finding:
Pass
component_uuidandvulnerability_uuiddirectly.Pass
finding— a NormalizedFinding dict as returned bylist_findings,group_findings_by_alias, or entries insidefind_duplicate_analyses. The UUIDs are extracted automatically, avoiding copy-paste errors in the triage loop.
When finding is provided, its UUIDs take precedence.
project_uuid is always required because findings from
find_duplicate_analyses → other_projects may belong to a
different project.
Issues PUT /api/v1/analysis; the connection-layer guard refuses
any other write path. Fields left as None are omitted from the
body, so DT keeps its current value. comment appends to the
history, it does not replace existing comments. Returns the full
normalized analysis after the write.
Args:
project_uuid: DT project UUID.
state: One of NOT_SET, IN_TRIAGE, EXPLOITABLE, FALSE_POSITIVE,
NOT_AFFECTED, RESOLVED.
component_uuid: DT component UUID (required unless finding
is provided).
vulnerability_uuid: DT vulnerability UUID (required unless
finding is provided).
finding: A NormalizedFinding dict. When provided, component_uuid
and vulnerability_uuid are extracted from it.
justification: Optional CycloneDX justification enum
(e.g. CODE_NOT_REACHABLE, REQUIRES_CONFIGURATION).
response: Optional response enum (e.g. CAN_NOT_FIX, WILL_NOT_FIX,
UPDATE, ROLLBACK, WORKAROUND_AVAILABLE).
details: Optional free-text analysis details.
comment: Optional free-text comment appended to the history.
suppressed: Optional bool to suppress/unsuppress the finding.
| Name | Required | Description | Default |
|---|---|---|---|
| project_uuid | Yes | ||
| state | Yes | ||
| component_uuid | No | ||
| vulnerability_uuid | No | ||
| finding | No | ||
| justification | No | ||
| response | No | ||
| details | No | ||
| comment | No | ||
| suppressed | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses write nature (⚠ WRITE), HTTP method (PUT), behavior of None fields (omitted) and comment appending, and return value. No annotations provided, so description carries full burden; could mention error handling or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with sections, bullet points, and arg list. Front-loaded with purpose and warning. Slightly long but justified by 10 parameters; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage, parameters, behavioral details, and return value. Output schema exists so return description is sufficient. Could include error scenarios or idempotency, but overall comprehensive for a write tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Every parameter explained with context: relationships between component_uuid, vulnerability_uuid, and finding, enum examples, optionality. Adds significant meaning beyond the schema which has 0% description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description explicitly states 'Update the analysis record for one finding' with clear verb-resource pair. Distinguishes from siblings by specifying the write path and mentioning alternative finding identification methods.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides two explicit ways to identify the finding with precedence rules, explains why project_uuid is always required, and notes field omission behavior. Lacks direct contrast with sibling tools for when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_bomA
⚠ WRITE. Upload a CycloneDX/SPDX SBOM to Dependency-Track.
Issues POST /api/v1/bom with the SBOM as a base64-encoded
string. Returns an upload token — the caller should poll
GET /api/v1/bom/token/{token} (not an MCP tool in v0.2) to
detect when processing finishes and findings become visible.
When auto_create=True, the project is created if missing; this
requires the PROJECT_CREATION_UPLOAD permission in DT.
Args: project_name: Target project name (must exist unless auto_create=True). project_version: Target project version. bom: Base64-encoded SBOM document (CycloneDX or SPDX). auto_create: Create project/version if missing. Requires extra permission. parent_name: Optional parent project name for hierarchy. parent_version: Optional parent project version.
| Name | Required | Description | Default |
|---|---|---|---|
| project_name | Yes | ||
| project_version | Yes | ||
| bom | Yes | ||
| auto_create | No | ||
| parent_name | No | ||
| parent_version | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses the write nature, the need for polling via a returned token, and permission requirements for auto_create. It does not cover rate limits, idempotency, or error behavior, but the core behavioral traits are well communicated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed but well-organized, with a warning symbol, paragraph explaining the endpoint and polling, and a clear bullet-like list of parameters. It could be slightly more concise but avoids fluff and front-loads key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 6 parameters and an output schema (not shown), the description covers usage, parameter meanings, return behavior (token), and post-processing polling. Missing details like token format or error conditions, but overall adequate for an AI agent to select and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, meaning the schema only provides types. The description adds rich semantics: explains project_name/version as target, bom as base64-encoded SBOM, auto_create behavior and permission, and optional parent parameters for hierarchy. This fully compensates for the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it uploads a CycloneDX/SPDX SBOM to Dependency-Track, specifies it is a write operation, and distinguishes from sibling tools (none of which are upload tools). The verb 'upload' and resource 'SBOM' are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use (uploading SBOMs), mentions that the caller should poll for completion, and notes auto_create triggers project creation with extra permission requirements. It does not explicitly state when not to use, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
14 tool updates
v0.7.2- First observed
broadcast_triage - First observed
carry_over_triage - First observed
diff_findings - First observed
find_duplicate_analyses - First observed
find_vulnerability - First observed
get_analysis - First observed
get_project_versions - First observed
group_findings_by_alias - First observed
list_findings - First observed
list_projects - First observed
resolve_project - First observed
search_vulnerability - First observed
set_analysis - First observed
upload_bom
TDQS
Each tool has a distinct purpose in the triage workflow. For example, broadcast_triage and carry_over_triage are clearly differentiated, and finding deduplication tools like find_duplicate_analyses and group_findings_by_alias serve different scopes.
All tools use consistent snake_case naming with a verb_noun pattern (e.g., list_findings, upload_bom, set_analysis), making them predictable and easy to navigate.
With 14 tools, the server is well-scoped for a Dependency-Track integration, covering project management, finding analysis, vulnerability search, and SBOM upload without excess.
The tool set covers the core triage and analysis lifecycle comprehensively. Minor gaps exist, such as explicit project creation or deletion tools, but these are partially addressed by upload_bom with auto_create.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
MCP server for Pentest-Tools.com: run scans, manage findings and reports via your preffered LLM.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
Related MCP Servers
- AlicenseBqualityFmaintenanceAn MCP server for the OnSecurity API that allows Claude to query Rounds, Findings, Prerequisites, Blocks and Notifications.5MIT
- AlicenseAqualityBmaintenanceThis MCP server transforms Claude into a comprehensive security analyst by providing access to 27 security tools across 21 APIs for vulnerability intelligence. It enables users to query multiple sources like NVD, EPSS, CISA KEV, and threat intelligence platforms in parallel to get correlated security insights and risk assessments for CVEs.281,452Apache 2.0

@repomend/mcpofficial
AlicenseNot gradedqualityDmaintenanceSecurity scanning MCP server that connects Claude to RepoMend findings, enabling vulnerability management and automated fix drafting.MIT- FlicenseNot gradedqualityCmaintenanceThis MCP server connects Claude Desktop to OpenCTI for AI-augmented threat intelligence analysis, enabling natural language queries and instant, contextualized answers from your threat intelligence database.29-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/drewrukin/dtrack-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server