Source code for tavily_fastmcp.tools.crawl

"""Crawl tool registration.

Purpose:
    Register the namespaced Tavily crawl MCP tool.

Design:
    - Reserve crawling for multi-page site reading.
    - 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 CrawlRequest, CrawlResponse
from tavily_fastmcp.service import TavilyServiceProtocol


[docs] def register_crawl_tool(mcp: Any, *, backend: TavilyServiceProtocol) -> None: """Register the ``tavily.crawl`` MCP tool. Args: mcp: FastMCP server instance. backend: Tavily service backend. Returns: ``None``. """ tool_server = cast(ToolRegistrar, mcp) @tool_server.tool( name="tavily.crawl", title="Tavily Crawl", description="Traverse a site and retrieve multi-page content.", tags={"crawl", "site", "readonly"}, annotations={ "title": "Tavily Crawl", "readOnlyHint": True, "openWorldHint": True, "idempotentHint": True, }, meta={"profile_hints": ["site-crawl"]}, ) async def tavily_crawl( url: Annotated[str, Field(description="Root URL to begin crawling.")], instructions: Annotated[ str | None, Field(description="Optional crawling guidance.") ] = None, ctx: Any | None = None, ) -> CrawlResponse: """Crawl a site and retrieve multi-page content. Args: url: Root URL to begin crawling. instructions: Optional crawling guidance. ctx: Optional FastMCP context. Returns: A normalized Tavily crawl response. """ request = CrawlRequest.model_validate({"url": url, "instructions": instructions}) if ctx is not None: await ctx.info(f"Crawling site: {url}") return backend.crawl_from_model(request)