Coverage for src/ecnl/adapters/inbound/tools/schedule.py: 100%
16 statements
« prev ^ index » next coverage.py v7.14.2, created at 2026-06-28 08:19 +0000
« prev ^ index » next coverage.py v7.14.2, created at 2026-06-28 08:19 +0000
1"""Schedule tools."""
3import logging
5from mcp.server.fastmcp import FastMCP
7from ....application.service import ECNLService
8from ....ports.inbound import Authorizer
9from ..formatters import _fmt_schedule
10from ._base import _READ_ANNOTATIONS, _safe_call_authorized
12logger = logging.getLogger(__name__)
15def register_schedule_tools(mcp: FastMCP, service: ECNLService, authorizer: Authorizer) -> None:
16 """Register the schedule tools on ``mcp``."""
18 @mcp.tool(annotations=_READ_ANNOTATIONS)
19 async def get_schedule(event_id: int, flight_id: int) -> str:
20 """Get all matches for a flight.
22 Returns each match's date, time, venue, teams, and score (if played).
23 Get the flight ID from get_event_overview.
25 Args:
26 event_id: Numeric event ID (e.g. 3933).
27 flight_id: Flight ID from get_event_overview.
28 """
29 logger.info("tool=get_schedule event_id=%r flight_id=%r", event_id, flight_id)
30 return await _safe_call_authorized(
31 authorizer, "get_schedule", service.get_schedule(event_id, flight_id), _fmt_schedule
32 )
34 @mcp.tool(annotations=_READ_ANNOTATIONS)
35 async def get_team_schedule(event_id: int, team_id: int) -> str:
36 """Get all matches for one team within an event.
38 Returns the team's full slate — date, opponent, venue, and score.
40 Args:
41 event_id: Numeric event ID (e.g. 3933).
42 team_id: Team ID from get_teams or the standings table.
43 """
44 logger.info("tool=get_team_schedule event_id=%r team_id=%r", event_id, team_id)
45 return await _safe_call_authorized(
46 authorizer, "get_team_schedule", service.get_team_schedule(event_id, team_id), _fmt_schedule
47 )