Skip to main content
Glama
intruder-io

intruder-mcp

Official

create_scan_schedule

Create recurring scan schedules to automate security assessments. Set frequency, target groups, and first scan time to run scans on schedule.

Instructions

    Create a recurring scan schedule.

    Args:
        name: Name of the schedule
        first_scan_time: ISO 8601 timestamp of the first scan. Must be in the future and on the hour
            (e.g. '2026-05-01T03:00:00Z', not '2026-05-01T03:12:34Z')
        scan_frequency: One of 'daily', 'weekly', 'monthly', 'quarterly'
        target_ids: List of target IDs to include in the schedule
        tag_names: List of target tag names to include in the schedule
        throttled: Whether to throttle the scan
        web_ports_only: Only scan standard web ports
        upload_to_drata: Upload scan results to Drata
        upload_to_vanta: Upload scan results to Vanta
    

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
nameYes
first_scan_timeYes
scan_frequencyYes
target_idsNo
tag_namesNo
throttledNo
web_ports_onlyNo
upload_to_drataNo
upload_to_vantaNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes

Implementation Reference

  • The MCP tool handler for 'create_scan_schedule'. Decorated with @mcp.tool(), it parses the ISO 8601 timestamp, calls api.create_scan_schedule(), and formats the result via _format_schedule_result.
    @mcp.tool()
    async def create_scan_schedule(
        name: str,
        first_scan_time: str,
        scan_frequency: ScanFrequencyEnum,
        target_ids: Optional[List[int]] = None,
        tag_names: Optional[List[str]] = None,
        throttled: Optional[bool] = None,
        web_ports_only: Optional[bool] = None,
        upload_to_drata: Optional[bool] = None,
        upload_to_vanta: Optional[bool] = None,
    ) -> str:
        """
        Create a recurring scan schedule.
    
        Args:
            name: Name of the schedule
            first_scan_time: ISO 8601 timestamp of the first scan. Must be in the future and on the hour
                (e.g. '2026-05-01T03:00:00Z', not '2026-05-01T03:12:34Z')
            scan_frequency: One of 'daily', 'weekly', 'monthly', 'quarterly'
            target_ids: List of target IDs to include in the schedule
            tag_names: List of target tag names to include in the schedule
            throttled: Whether to throttle the scan
            web_ports_only: Only scan standard web ports
            upload_to_drata: Upload scan results to Drata
            upload_to_vanta: Upload scan results to Vanta
        """
        parsed_first_scan_time = _parse_iso8601(first_scan_time)
        result = api.create_scan_schedule(
            name=name,
            first_scan_time=parsed_first_scan_time,
            scan_frequency=scan_frequency,
            tags=tag_names,
            targets=target_ids,
            throttled=throttled,
            web_ports_only=web_ports_only,
            upload_to_drata=upload_to_drata,
            upload_to_vanta=upload_to_vanta,
        )
        return _format_schedule_result("Created", result.get("id"), result)
  • API client method that constructs an AssessmentScheduleCreateUpdateRequest and POSTs to the Intruder API's /scans/schedules/ endpoint.
    def create_scan_schedule(self, name: str, first_scan_time: datetime, scan_frequency: ScanFrequencyEnum,
                            tags: Optional[List[str]] = None, targets: Optional[List[int]] = None,
                            throttled: Optional[bool] = None, web_ports_only: Optional[bool] = None,
                            upload_to_drata: Optional[bool] = None, upload_to_vanta: Optional[bool] = None) -> dict:
        data = AssessmentScheduleCreateUpdateRequest(
            name=name, first_scan_time=first_scan_time, scan_frequency=scan_frequency,
            tags=tags, targets=targets, throttled=throttled, web_ports_only=web_ports_only,
            upload_to_drata=upload_to_drata, upload_to_vanta=upload_to_vanta,
        )
        return self.client.post(f"{self.base_url}/scans/schedules/",
                                json=data.model_dump(mode="json", exclude_none=True)).json()
  • Pydantic model AssessmentScheduleCreateUpdateRequest used for request body validation when creating a scan schedule.
    class AssessmentScheduleCreateUpdateRequest(BaseModel):
        name: str = Field(..., min_length=1)
        first_scan_time: datetime
        scan_frequency: ScanFrequencyEnum
        tags: Optional[List[str]] = None
        targets: Optional[List[int]] = None
        throttled: Optional[bool] = None
        web_ports_only: Optional[bool] = None
        upload_to_drata: Optional[bool] = None
        upload_to_vanta: Optional[bool] = None
  • ScanFrequencyEnum defining allowed frequencies: daily, weekly, monthly, quarterly.
    class ScanFrequencyEnum(str, Enum):
        MONTHLY = "monthly"
        DAILY = "daily"
        WEEKLY = "weekly"
        QUARTERLY = "quarterly"
  • Helper function _parse_iso8601 that converts an ISO 8601 string (with optional 'Z' suffix) to a datetime object.
    def _parse_iso8601(value: str) -> datetime:
        return datetime.fromisoformat(value.replace("Z", "+00:00"))
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must fully disclose behavior. It describes one constraint (first_scan_time must be on the hour and in the future) but omits other critical traits: whether it creates a new resource each call, side effects, permissions needed, or error scenarios (e.g., duplicate schedule).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficient with a clear opening sentence followed by parameter explanations in a list format. It uses minimal words per parameter, avoiding verbosity. The pseudo-docstring style is acceptable for an LLM.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers all parameters briefly, but given 9 parameters (6 optional) and no explanation of expected behavior for combined target_ids/tag_names, validation details, or error conditions, it leaves gaps. An output schema may compensate, but the description alone feels incomplete for a creation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema coverage, the description adds meaning for all 9 parameters, such as 'ISO 8601 timestamp of the first scan' and listing valid frequencies. However, it doesn't clarify how target_ids and tag_names interact (e.g., OR logic) nor define terms like 'throttled'. It is helpful but not fully comprehensive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Create a recurring scan schedule,' clearly stating the verb and resource. 'Recurring' distinguishes it from create_scan (presumably one-time) and update_scan_schedule. The tool's purpose is unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus alternatives like create_scan for one-time scans. There is no explicit 'when to use/when not to use' instruction, leaving the agent to infer from the word 'recurring' alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

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/intruder-io/intruder-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server