Coverage for src/data_api/mcp/tools/newsletters.py: 100%

10 statements  

« prev     ^ index     » next       coverage.py v7.16.2, created at 2026-11-13 19:28 +0000

1"""Newsletter MCP tool.""" 

2 

3from typing import Optional 

4 

5from data_api.mcp.server import mcp 

6from data_api.mcp.tools.result_types import NewslettersResult 

7from data_api.runtime import get_runtime 

8 

9 

10async def _get_newsletters( 

11 search: Optional[str] = None, 

12) -> NewslettersResult: 

13 """ 

14 Get campus newsletter information. 

15 

16 Args: 

17 search: Optional search term to filter newsletter names. 

18 

19 Returns: 

20 Dictionary with newsletter information. 

21 """ 

22 _, newsletters = await get_runtime().newsletters.get_newsletters(name=search) 

23 

24 return { 

25 "count": len(newsletters), 

26 "newsletters": [ 

27 { 

28 "name": n.get("name"), 

29 "link": n.get("link"), 

30 "latest_articles": [ 

31 {"title": a.get("title"), "date": a.get("date")} 

32 for a in n.get("articles", [])[:3] 

33 ], 

34 } 

35 for n in newsletters 

36 ], 

37 } 

38 

39 

40@mcp.tool( 

41 name="get_newsletters", 

42 title="搜尋電子報列表", 

43 description="Get campus newsletter information. " 

44 "Use this to find electronic newsletters from various NTHU departments.", 

45) 

46async def get_newsletters( 

47 search: Optional[str] = None, 

48) -> dict: 

49 """Get campus newsletter information.""" 

50 return await _get_newsletters(search)