Source code for tavily_fastmcp.tools.map

"""Map tool registration.

Purpose:
    Register the namespaced Tavily map MCP tool.

Design:
    - Keep mapping focused on structural URL discovery.
    - Convert flat MCP arguments into the canonical request model.
"""

from __future__ import annotations

from typing import Annotated, Any, cast

from pydantic import Field

from tavily_fastmcp._typing import ToolRegistrar
from tavily_fastmcp.models import MapRequest, MapResponse
from tavily_fastmcp.service import TavilyServiceProtocol


[docs] def register_map_tool(mcp: Any, *, backend: TavilyServiceProtocol) -> None: """Register the ``tavily.map`` MCP tool. Args: mcp: FastMCP server instance. backend: Tavily service backend. Returns: ``None``. """ tool_server = cast(ToolRegistrar, mcp) @tool_server.tool( name="tavily.map", title="Tavily Map", description="Discover site structure and candidate URLs on a single domain.", tags={"map", "site", "readonly"}, annotations={ "title": "Tavily Map", "readOnlyHint": True, "openWorldHint": True, "idempotentHint": True, }, meta={"profile_hints": ["site-discovery"]}, ) async def tavily_map( url: Annotated[str, Field(description="Root URL to map.")], instructions: Annotated[str | None, Field(description="Optional mapping guidance.")] = None, ctx: Any | None = None, ) -> MapResponse: """Discover candidate URLs on a site. Args: url: Root URL to map. instructions: Optional mapping guidance. ctx: Optional FastMCP context. Returns: A normalized Tavily map response. """ request = MapRequest.model_validate({"url": url, "instructions": instructions}) if ctx is not None: await ctx.info(f"Mapping site: {url}") return backend.map_from_model(request)