Skip to main content
Glama

get_execution

Read-onlyIdempotent

Retrieve detailed information about a specific Rundeck execution, including status, timing, node results, and arguments used.

Instructions

Get detailed information about a specific execution.

Returns the full execution details including status, timing, node results,
and the arguments used.

Args:
    execution_id: The execution ID (integer)

Returns:
    Execution object with full details

Examples:
    >>> execution = get_execution(12345)
    >>> print(execution.status)
    'succeeded'
    >>> print(execution.duration_seconds)
    45.2

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
execution_idYes

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
idYesThe execution ID
jobNoReference to the job (None for adhoc executions)
hrefNoAPI URL for this execution
userYesUser who started this execution
statusYesExecution status
projectYesThe project name
argstringNoThe argument string used for this execution
permalinkNoWeb UI URL for this execution
date-endedNoWhen the execution ended (None if still running)
descriptionNoExecution description
failedNodesNoList of nodes that failed
date-startedNoWhen the execution started
successfulNodesNoList of nodes that succeeded

Implementation Reference

  • The get_execution tool handler: retrieves detailed execution information from Rundeck API via HTTP GET /execution/{execution_id} and parses the response.
    def get_execution(execution_id: int) -> Execution:
        """Get detailed information about a specific execution.
    
        Returns the full execution details including status, timing, node results,
        and the arguments used.
    
        Args:
            execution_id: The execution ID (integer)
    
        Returns:
            Execution object with full details
    
        Examples:
            >>> execution = get_execution(12345)
            >>> print(execution.status)
            'succeeded'
            >>> print(execution.duration_seconds)
            45.2
        """
        client = get_client()
        response = client.get(f"/execution/{execution_id}")
    
        return _parse_execution(response)
  • Pydantic schema/model for the Execution return type of get_execution tool, including fields, validators, and computed properties.
    class Execution(BaseModel):
        """A job execution instance.
    
        Represents a single run of a job, including its status, timing, and results.
        """
    
        id: int = Field(description="The execution ID")
        href: str | None = Field(default=None, description="API URL for this execution")
        permalink: str | None = Field(default=None, description="Web UI URL for this execution")
        status: ExecutionStatus = Field(description="Execution status")
        project: str = Field(description="The project name")
        job: JobReference | None = Field(default=None, description="Reference to the job (None for adhoc executions)")
        user: str = Field(description="User who started this execution")
        date_started: datetime | None = Field(
            default=None,
            alias="date-started",
            description="When the execution started",
        )
        date_ended: datetime | None = Field(
            default=None,
            alias="date-ended",
            description="When the execution ended (None if still running)",
        )
        argstring: str | None = Field(
            default=None,
            description="The argument string used for this execution",
        )
        description: str | None = Field(default=None, description="Execution description")
        successful_nodes: list[str] | None = Field(
            default=None,
            alias="successfulNodes",
            description="List of nodes that succeeded",
        )
        failed_nodes: list[str] | None = Field(
            default=None,
            alias="failedNodes",
            description="List of nodes that failed",
        )
    
        @field_validator("date_started", "date_ended", mode="before")
        @classmethod
        def parse_date_dict(cls, v: Any) -> datetime | None:
            """Parse date from Rundeck's dict format or ISO string."""
            if v is None:
                return None
            if isinstance(v, datetime):
                return v
            if isinstance(v, dict):
                # Rundeck returns {"unixtime": 1234567890, "date": "..."}
                if "unixtime" in v:
                    return datetime.fromtimestamp(v["unixtime"] / 1000)
                if "date" in v:
                    return datetime.fromisoformat(v["date"].replace("Z", "+00:00"))
            if isinstance(v, str):
                return datetime.fromisoformat(v.replace("Z", "+00:00"))
            return None
    
        @computed_field
        @property
        def duration_seconds(self) -> float | None:
            """Calculate duration in seconds."""
            if self.date_started and self.date_ended:
                return (self.date_ended - self.date_started).total_seconds()
            return None
    
        @computed_field
        @property
        def execution_summary(self) -> str:
            """Generate a human-readable summary of this execution."""
            parts = [f"Execution #{self.id}: {self.status.upper()}"]
    
            if self.job:
                parts.append(f"Job: {self.job.name}")
                if self.job.group:
                    parts[-1] = f"Job: {self.job.group}/{self.job.name}"
    
            if self.user:
                parts.append(f"User: {self.user}")
    
            if self.duration_seconds is not None:
                parts.append(f"Duration: {self.duration_seconds:.1f}s")
    
            if self.argstring:
                parts.append(f"Args: {self.argstring}")
    
            return " | ".join(parts)
    
        @computed_field
        @property
        def type(self) -> Literal["execution"]:
            return "execution"
  • MCP server registration loop that adds get_execution (via read_tools list) as a read-only tool with appropriate annotations.
    # Register read-only tools (always available)
    for tool in read_tools:
        add_read_only_tool(mcp, tool)
  • Definition of read_tools list that includes get_execution for registration in MCP server.
    read_tools = [
        # Jobs
        list_jobs,
        get_job,
        # Executions
        list_executions,
        get_execution,
        get_execution_output,
  • Helper function to parse raw API response data into Execution model instance.
    def _parse_execution(data: dict[str, Any]) -> Execution:
        """Parse execution data from API response.
    
        Args:
            data: Raw API response data
    
        Returns:
            Parsed Execution model
        """
        # Parse job reference if present
        job_data = data.get("job")
        job_ref = None
        if job_data:
            job_ref = JobReference(
                id=job_data.get("id", ""),
                name=job_data.get("name", ""),
                group=job_data.get("group"),
                project=job_data.get("project", data.get("project", "")),
                href=job_data.get("href"),
                permalink=job_data.get("permalink"),
            )
    
        return Execution(
            id=data["id"],
            href=data.get("href"),
            permalink=data.get("permalink"),
            status=data.get("status", "running"),
            project=data.get("project", ""),
            job=job_ref,
            user=data.get("user", "unknown"),
            date_started=data.get("date-started"),
            date_ended=data.get("date-ended"),
            argstring=data.get("argstring"),
            description=data.get("description"),
            successful_nodes=data.get("successfulNodes"),
            failed_nodes=data.get("failedNodes"),
        )

Tool Definition Quality

Score is being calculated. Check back soon.

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/justynroberts/rundeck-mcp'

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