list_issues
Identify and retrieve security issues from your Intruder account using filters like target addresses, severity, tag names, and snoozed status.
Instructions
List issues in the Intruder account with optional filters.
Args:
target_addresses: Filter by a list of target addresses
tag_names: Filter by a list of tag names
snoozed: Filter by snoozed status (true or false)
severity: Filter by severity level (one of 'critical', 'high', 'medium', 'low')
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| target_addresses | No | ||
| tag_names | No | ||
| snoozed | No | ||
| severity | No |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| result | Yes |
Implementation Reference
- intruder_mcp/server.py:45-66 (registration)MCP tool registration for 'list_issues' using @mcp.tool() decorator. Defines the tool as an async function with optional filters: target_addresses, tag_names, snoozed, severity.
@mcp.tool() async def list_issues(target_addresses: Optional[List[str]] = None, tag_names: Optional[List[str]] = None, snoozed: Optional[bool] = None, severity: Optional[str] = None) -> str: """ List issues in the Intruder account with optional filters. Args: target_addresses: Filter by a list of target addresses tag_names: Filter by a list of tag names snoozed: Filter by snoozed status (true or false) severity: Filter by severity level (one of 'critical', 'high', 'medium', 'low') """ issues = api.list_issues_all( target_addresses=target_addresses, tag_names=tag_names, snoozed=snoozed, severity=severity ) formatted = [f"{issue.id} - {issue.title} ({issue.severity})" for issue in issues] return "\n".join(formatted) - intruder_mcp/api_client.py:28-47 (handler)list_issues API client method - makes HTTP GET request to /issues/ endpoint with optional query params. Returns PaginatedIssueList (single page).
def list_issues(self, severity: Optional[str] = None, snoozed: Optional[bool] = None, issue_ids: Optional[List[int]] = None, tag_names: Optional[List[str]] = None, target_addresses: Optional[List[str]] = None, limit: Optional[int] = None, offset: Optional[int] = None) -> PaginatedIssueList: params = {} if severity: params["severity"] = severity if snoozed is not None: params["snoozed"] = snoozed if issue_ids: params["issue_ids"] = issue_ids if tag_names: params["tag_names"] = tag_names if target_addresses: params["target_addresses"] = target_addresses if limit: params["limit"] = limit if offset: params["offset"] = offset return PaginatedIssueList(**self.client.get(f"{self.base_url}/issues/", params=params).json()) - intruder_mcp/api_client.py:49-61 (helper)list_issues_all helper - paginates through all issues by calling list_issues in a loop with offset/limit=100, yielding each issue.
def list_issues_all(self, severity: Optional[str] = None, snoozed: Optional[bool] = None, issue_ids: Optional[List[int]] = None, tag_names: Optional[List[str]] = None, target_addresses: Optional[List[str]] = None) -> Generator[Issue, None, None]: offset = 0 while True: response = self.list_issues(severity=severity, snoozed=snoozed, issue_ids=issue_ids, tag_names=tag_names, target_addresses=target_addresses, limit=100, offset=offset) for issue in response.results: yield issue if not response.next: break offset += len(response.results) - intruder_mcp/enums.py:240-241 (schema)PaginatedIssueList schema - Pydantic model for the paginated response containing a list of Issue objects.
class PaginatedIssueList(PaginatedResponse): results: List[Issue] - intruder_mcp/enums.py:157-168 (schema)Issue schema - Pydantic model representing an issue with fields: id, severity, title, description, remediation, snoozed, etc.
class Issue(BaseModel): id: int severity: str title: str description: str remediation: str snoozed: bool snooze_reason: Optional[str] = None snooze_until: Optional[date] = None occurrences: Optional[HttpUrl] = None exploit_likelihood: Union[ExploitLikelihoodEnum, None] cvss_score: Optional[float] = None