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
« prev ^ index » next coverage.py v7.16.2, created at 2026-11-13 19:28 +0000
1"""Newsletter MCP tool."""
3from typing import Optional
5from data_api.mcp.server import mcp
6from data_api.mcp.tools.result_types import NewslettersResult
7from data_api.runtime import get_runtime
10async def _get_newsletters(
11 search: Optional[str] = None,
12) -> NewslettersResult:
13 """
14 Get campus newsletter information.
16 Args:
17 search: Optional search term to filter newsletter names.
19 Returns:
20 Dictionary with newsletter information.
21 """
22 _, newsletters = await get_runtime().newsletters.get_newsletters(name=search)
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 }
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)