from __future__ import annotations from mcp.server.fastmcp import Context, FastMCP from app.config import get_settings from app.mcp.tools import ( check_availability as check_availability_impl, execute_unsubscribe as execute_unsubscribe_impl, list_unsubscribe_candidates as list_unsubscribe_candidates_impl, scan_mailbox as scan_mailbox_impl, ) settings = get_settings() mcp = FastMCP( "Personal Agent MCP", streamable_http_path="/", ) @mcp.tool(description="Check Google Calendar availability for a time range.") def check_availability( start: str, end: str, calendar_ids: list[str] | None = None, ctx: Context | None = None, ) -> dict[str, object]: return check_availability_impl( start=start, end=end, calendar_ids=calendar_ids, ctx=ctx, ) if settings.mcp_enable_mutation_tools: @mcp.tool( description="Scan unread root-inbox Gmail messages and apply classification labels." ) def scan_mailbox(max_results: int = 100, ctx: Context | None = None) -> dict[str, object]: return scan_mailbox_impl(max_results=max_results, ctx=ctx) @mcp.tool( description="List unsubscribe candidates discovered from advertising emails." ) def list_unsubscribe_candidates( max_results: int = 500, ctx: Context | None = None, ) -> dict[str, object]: return list_unsubscribe_candidates_impl(max_results=max_results, ctx=ctx) @mcp.tool( description="Execute unsubscribe actions for selected candidate IDs." ) def execute_unsubscribe( selected_candidate_ids: list[str], max_results: int = 500, remember_selection: bool = True, ctx: Context | None = None, ) -> dict[str, object]: return execute_unsubscribe_impl( selected_candidate_ids=selected_candidate_ids, max_results=max_results, remember_selection=remember_selection, ctx=ctx, )