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

1"""Schedule tools.""" 

2 

3import logging 

4 

5from mcp.server.fastmcp import FastMCP 

6 

7from ....application.service import ECNLService 

8from ....ports.inbound import Authorizer 

9from ..formatters import _fmt_schedule 

10from ._base import _READ_ANNOTATIONS, _safe_call_authorized 

11 

12logger = logging.getLogger(__name__) 

13 

14 

15def register_schedule_tools(mcp: FastMCP, service: ECNLService, authorizer: Authorizer) -> None: 

16 """Register the schedule tools on ``mcp``.""" 

17 

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. 

21 

22 Returns each match's date, time, venue, teams, and score (if played). 

23 Get the flight ID from get_event_overview. 

24 

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 ) 

33 

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. 

37 

38 Returns the team's full slate — date, opponent, venue, and score. 

39 

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 )