testmo_list_milestones
List all milestones in a Testmo project, with optional filters by completion status and pagination to organize releases and track progress.
Instructions
List all milestones in a project (e.g., release/5.2.0).
Args: project_id: The project ID. is_completed: Filter by completion status (optional). 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 | ||
| is_completed | No | ||
| page | No | ||
| per_page | No | ||
| expands | No |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Implementation Reference
- testmo/tools/milestones.py:7-29 (handler)The handler function `testmo_list_milestones` is decorated with @mcp.tool() and implements the tool logic: accepts project_id, is_completed, page, per_page, expands parameters; builds query params; and calls the Testmo API GET /projects/{project_id}/milestones via the _request helper.
@mcp.tool() async def testmo_list_milestones( project_id: int, is_completed: bool | None = None, page: int = 1, per_page: int = 100, expands: list[str] | None = None, ) -> dict[str, Any]: """List all milestones in a project (e.g., release/5.2.0). Args: project_id: The project ID. is_completed: Filter by completion status (optional). 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 is_completed is not None: params["is_completed"] = is_completed if expands: params["expands"] = ",".join(expands) return await _request("GET", f"/projects/{project_id}/milestones", params=params) - testmo/tools/milestones.py:1-5 (helper)Imports: `_request` from the client module (used for API calls) and `mcp` from server (the FastMCP instance).
from typing import Any from ..server import mcp from ..client import _request - testmo/tools/milestones.py:7-7 (registration)Registration via `@mcp.tool()` decorator on line 7, which registers `testmo_list_milestones` as an MCP tool on the FastMCP instance created in server.py.
@mcp.tool() - testmo-mcp.py:13-13 (registration)The `import testmo.tools.milestones` in the entry point ensures the tool module is loaded, triggering the @mcp.tool() decorator registration.
import testmo.tools.milestones # 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()