testmo_list_automation_runs
List automation runs in a project with filters by source, milestone, status, creation date, and tags.
Instructions
List automation runs in a project with optional filters.
Args: project_id: The project ID. source_id: Comma-separated automation source IDs to filter by. milestone_id: Comma-separated milestone IDs to filter by. status: Comma-separated status values (2=Success, 3=Failure, 4=Running). created_after: Filter runs created after (ISO8601 format). created_before: Filter runs created before (ISO8601 format). tags: Comma-separated tags to filter by. page: Page number (default: 1). per_page: Results per page (default: 100). Valid: 25, 50, 100. expands: Related entities to include.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | ||
| source_id | No | ||
| milestone_id | No | ||
| status | No | ||
| created_after | No | ||
| created_before | No | ||
| tags | No | ||
| page | No | ||
| per_page | No | ||
| expands | No |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Implementation Reference
- testmo/tools/automation.py:56-100 (handler)The main handler function for the 'testmo_list_automation_runs' tool. Decorated with @mcp.tool(), it accepts project_id and optional filters (source_id, milestone_id, status, created_after, created_before, tags, page, per_page, expands), builds query params, and makes a GET request to /projects/{project_id}/automation/runs.
@mcp.tool() async def testmo_list_automation_runs( project_id: int, source_id: str | None = None, milestone_id: str | None = None, status: str | None = None, created_after: str | None = None, created_before: str | None = None, tags: str | None = None, page: int = 1, per_page: int = 100, expands: list[str] | None = None, ) -> dict[str, Any]: """List automation runs in a project with optional filters. Args: project_id: The project ID. source_id: Comma-separated automation source IDs to filter by. milestone_id: Comma-separated milestone IDs to filter by. status: Comma-separated status values (2=Success, 3=Failure, 4=Running). created_after: Filter runs created after (ISO8601 format). created_before: Filter runs created before (ISO8601 format). tags: Comma-separated tags to filter by. page: Page number (default: 1). per_page: Results per page (default: 100). Valid: 25, 50, 100. expands: Related entities to include. """ params: dict[str, Any] = {"page": page, "per_page": per_page} if source_id: params["source_id"] = source_id if milestone_id: params["milestone_id"] = milestone_id if status: params["status"] = status if created_after: params["created_after"] = created_after if created_before: params["created_before"] = created_before if tags: params["tags"] = tags if expands: params["expands"] = ",".join(expands) return await _request( "GET", f"/projects/{project_id}/automation/runs", params=params ) - testmo/tools/automation.py:56-56 (registration)Registration via @mcp.tool() decorator on the async function testmo_list_automation_runs. The 'mcp' instance is imported from testmo/server.py (line 3).
@mcp.tool() - testmo/tools/automation.py:57-68 (schema)Input schema defined via type-annotated parameters: project_id (int), source_id (str|None), milestone_id (str|None), status (str|None), created_after (str|None), created_before (str|None), tags (str|None), page (int, default 1), per_page (int, default 100), expands (list[str]|None).
async def testmo_list_automation_runs( project_id: int, source_id: str | None = None, milestone_id: str | None = None, status: str | None = None, created_after: str | None = None, created_before: str | None = None, tags: str | None = None, page: int = 1, per_page: int = 100, expands: list[str] | None = None, ) -> dict[str, Any]: - testmo-mcp.py:17-18 (registration)Indirect registration: the top-level entry point imports testmo.tools.automation (which triggers @mcp.tool() decorator execution), ensuring the tool is registered on the FastMCP server.
import testmo.tools.automation # noqa: F401 import testmo.tools.issues # noqa: F401 - testmo/client.py:25-49 (helper)The _request helper function used by the handler to make authenticated HTTP requests to the Testmo API.
async def _request( method: str, endpoint: str, data: dict[str, Any] | None = None, params: dict[str, Any] | None = None, ) -> dict[str, Any]: async with _get_client() as client: response = await client.request( method=method, url=endpoint, json=data, params=params, ) if response.status_code == 204: return {"success": True} if response.status_code >= 400: try: error_body = response.json() except Exception: error_body = response.text raise RuntimeError( f"Testmo API error {response.status_code}: " f"{json.dumps(error_body) if isinstance(error_body, dict) else error_body}" ) return response.json()