Skip to main content
Glama

tavily-fastmcp

CI Docs PyPI Python License Typing

Typed, ergonomic FastMCP server for Tavily search, extract, map, crawl, and research workflows.

It ships with:

  • namespaced MCP tools like tavily.search and tavily.research

  • packaged prompt profiles and large markdown system prompts

  • static resources and dynamic resource templates for profiles, prompts, examples, and server catalogs

  • a small direct Python API for local use without MCP

  • docs, examples, CI, publishing workflow, coverage, Ruff, and mypy

Why this package

langchain-tavily already gives you the raw Tavily tools. tavily-fastmcp adds a cleaner MCP boundary around them:

  • richer metadata for MCP clients

  • reusable profiles for common workflows

  • discoverable prompt and resource surfaces

  • stable typed request/response models you can test directly

  • easier LangChain + MCP composition

Tavily's official LangChain package provides the raw Tavily tools, and this package wraps them in a typed FastMCP server surface with prompts, resources, profiles, and example client configuration.

Related MCP server: tavily-mcp

Installation

pdm add tavily-fastmcp

For LangChain helpers:

pdm add "tavily-fastmcp[langchain]"

For LangGraph workflows:

pdm add "tavily-fastmcp[langchain]" langgraph

With uv:

uv add "tavily-fastmcp[langchain]" langgraph

For docs and development:

pdm install -G :all

Environment

Tavily uses the TAVILY_API_KEY environment variable. This package preserves that variable directly and layers package-specific settings under the TAVILY_FASTMCP_ prefix.

cp .env.example .env

Put real keys only in .env; it is ignored by Git. Keep .env.example as placeholders.

To run the opt-in live smoke test:

make test-live

Quick start

Run the MCP server

tavily-fastmcp

Or:

python -m tavily_fastmcp.server --transport stdio

Direct Python usage

from tavily_fastmcp.service import LangChainTavilyService
from tavily_fastmcp.settings import get_settings

service = LangChainTavilyService(get_settings())
response = service.search_from_model(query="latest FastMCP prompts docs")
print(response.results[0].url)

Create a FastMCP server in code

from tavily_fastmcp.server import create_server

server = create_server()

Use through LangChain over MCP

import asyncio

from langchain.agents import create_agent
from langchain_mcp_adapters.client import MultiServerMCPClient


async def main() -> None:
    client = MultiServerMCPClient(
        {
            "tavily": {
                "command": "python",
                "args": ["-m", "tavily_fastmcp.server", "--transport", "stdio"],
                "transport": "stdio",
            }
        }
    )
    tools = await client.get_tools()
    agent = create_agent(model="openai:gpt-5", tools=tools)
    result = await agent.ainvoke(
        {
            "messages": [
                {
                    "role": "user",
                    "content": "Research the best docs pages for FastMCP resource templates.",
                }
            ]
        }
    )
    print(result)


asyncio.run(main())

Build a focused research agent

Use MCP when you want the model to choose among Tavily search, extract, map, crawl, and research tools at runtime:

import asyncio

from langchain.agents import create_agent
from langchain_mcp_adapters.client import MultiServerMCPClient


async def build_agent():
    client = MultiServerMCPClient(
        {
            "tavily": {
                "transport": "stdio",
                "command": "python",
                "args": ["-m", "tavily_fastmcp.server", "--transport", "stdio"],
                "env": {"TAVILY_API_KEY": "tvly-your-key-here"},
            }
        }
    )
    tools = await client.get_tools()
    return create_agent(
        model="openai:gpt-5",
        tools=tools,
        system_prompt=(
            "Use Tavily for current web research. Prefer tavily.search for broad "
            "discovery, tavily.extract for source reading, and tavily.research "
            "when a synthesized report is requested."
        ),
    )


async def main() -> None:
    agent = await build_agent()
    result = await agent.ainvoke(
        {
            "messages": [
                {
                    "role": "user",
                    "content": "Compare three recent MCP client patterns and cite sources.",
                }
            ]
        }
    )
    print(result)


asyncio.run(main())

Use Tavily tools inside a custom LangGraph

Use LangGraph when you want explicit state transitions around the Tavily MCP tools, such as adding review, persistence, retries, or a human approval step.

import asyncio

from langchain_openai import ChatOpenAI
from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.graph import START, MessagesState, StateGraph
from langgraph.prebuilt import ToolNode, tools_condition


async def main() -> None:
    client = MultiServerMCPClient(
        {
            "tavily": {
                "transport": "stdio",
                "command": "python",
                "args": ["-m", "tavily_fastmcp.server", "--transport", "stdio"],
                "env": {"TAVILY_API_KEY": "tvly-your-key-here"},
            }
        }
    )
    tools = await client.get_tools()
    model = ChatOpenAI(model="gpt-5").bind_tools(tools)

    async def call_model(state: MessagesState) -> dict:
        response = await model.ainvoke(state["messages"])
        return {"messages": [response]}

    graph_builder = StateGraph(MessagesState)
    graph_builder.add_node("agent", call_model)
    graph_builder.add_node("tools", ToolNode(tools))
    graph_builder.add_edge(START, "agent")
    graph_builder.add_conditional_edges("agent", tools_condition)
    graph_builder.add_edge("tools", "agent")
    graph = graph_builder.compile()

    result = await graph.ainvoke(
        {
            "messages": [
                {
                    "role": "user",
                    "content": "Map the FastMCP docs site and identify the pages about prompts.",
                }
            ]
        }
    )
    print(result["messages"][-1].content)


asyncio.run(main())

Agent tool routing guide

  • Use tavily.search for broad discovery, current facts, and source finding.

  • Use tavily.extract after search when the agent needs page text from known URLs.

  • Use tavily.map to discover a site's URL structure before targeted extraction.

  • Use tavily.crawl when the agent must inspect multiple pages from one domain.

  • Use tavily.research for multi-source synthesized reports.

  • Use tavily.catalog and profile resources when an agent needs to learn the available tools and prompt profiles before deciding how to route a task.

Included profiles and prompts

The package ships with large markdown prompts and reusable profiles for:

  • router

  • suite-overview

  • quick-search

  • tool-search

  • extract-and-summarize

  • tool-extract

  • site-discovery

  • tool-map

  • site-crawl

  • tool-crawl

  • deep-research

  • tool-research

  • tool-get-research

  • routing-matrix

  • synthesis-policy

  • mcp-usage-guide

They are exposed both as packaged markdown files and as MCP resources / prompts. The richer catalog now also includes a composite suite overview, per-tool deep guides, a routing matrix, a synthesis policy, and an MCP usage guide.

Example URIs:

  • resource://tavily-fastmcp/catalog/server

  • resource://tavily-fastmcp/catalog/profiles

  • resource://tavily-fastmcp/profile/deep-research

  • resource://tavily-fastmcp/prompt/router

  • resource://tavily-fastmcp/prompt/deep-research

  • resource://tavily-fastmcp/example/claude-desktop-config

The server is organized so MCP clients can discover tools, prompts, resources, examples, and workflow profiles through namespaced metadata and resource URIs.

Tools exposed

  • tavily.health

  • tavily.catalog

  • tavily.search

  • tavily.extract

  • tavily.map

  • tavily.crawl

  • tavily.research

  • tavily.get_research

All tools use typed arguments, tags, annotations, titles, and custom metadata.

MCP client examples

Claude Code project setup

Claude Code can run this package as a local stdio MCP server. Keep the Tavily key in your shell or project secret manager, then add the server:

export TAVILY_API_KEY="tvly-your-key-here"
claude mcp add tavily-fastmcp --scope project \
  --env TAVILY_API_KEY="$TAVILY_API_KEY" \
  -- python -m tavily_fastmcp.server --transport stdio

Useful checks:

claude mcp list
claude mcp get tavily-fastmcp

For a checked-in Claude Code project config, use .mcp.json with environment expansion so secrets stay outside Git:

{
  "mcpServers": {
    "tavily-fastmcp": {
      "type": "stdio",
      "command": "python",
      "args": ["-m", "tavily_fastmcp.server", "--transport", "stdio"],
      "env": {
        "TAVILY_API_KEY": "${TAVILY_API_KEY}"
      }
    }
  }
}

Claude Desktop config snippet

{
  "mcpServers": {
    "tavily-fastmcp": {
      "command": "python",
      "args": ["-m", "tavily_fastmcp.server", "--transport", "stdio"],
      "env": {
        "TAVILY_API_KEY": "tvly-your-key-here"
      }
    }
  }
}

Cursor / Codex style stdio config

{
  "name": "tavily-fastmcp",
  "command": "python",
  "args": ["-m", "tavily_fastmcp.server", "--transport", "stdio"],
  "env": {
    "TAVILY_API_KEY": "tvly-your-key-here"
  }
}

Development

Install everything:

pdm install -G :all

Run the standard checks:

make lint
make type
make test
make docs

Equivalent PDM commands:

pdm run ruff check .
pdm run mypy src
pdm run pytest
pdm run sphinx-build -b html docs/source docs/source/_build/html

Documentation

make docs

The documentation is grouped under:

  • docs/source/usage/: MCP, direct Python, and LangChain usage.

  • docs/source/guides/: development, automation, and publishing workflows.

  • docs/source/reference/: configuration, tools, and profiles.

Publishing

Publishing is intended to run through GitHub Releases and PyPI trusted publishing. Configure the PyPI trusted publisher for repository pr1m8/tavily-fastmcp and workflow file release.yml with environment pypi. If PyPI trusted publishing is not ready yet, add a PyPI API token as the GitHub secret PYPI_API_TOKEN; the release workflow will use it before falling back to OIDC. For the first upload of a brand-new PyPI project, this may need to be an account-scoped token. Rotate it to a project-scoped token after the project exists. Use the local publish gate before tagging:

make publish-check

Then create and push a version tag such as v0.3.1, publish the GitHub Release, and let the Release workflow upload distributions to PyPI. The local make publish target prints the release flow and does not upload packages.

Automation

This project now includes GitHub automation for the full package lifecycle:

  • CI runs linting, typing, and tests on pushes and pull requests.

  • Docs builds the Sphinx site and uploads the rendered HTML as an artifact.

  • Build creates source and wheel distributions and validates them with twine check.

  • Release rebuilds the distributions on GitHub Releases and publishes them to PyPI using trusted publishing.

  • .readthedocs.yaml configures Read the Docs to build the Sphinx documentation with Python 3.13.

Available Tools

8 tools
tavily.catalogTavily CatalogA
Read-onlyIdempotent

Return the structured server catalog that describes tools, resources, and prompts.

ParametersJSON Schema
NameRequiredDescriptionDefault
ctxNoOptional FastMCP context.

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYes
versionYes
package_nameYes
prompt_namesNo
profile_slugsNo
tool_namesNo
resource_urisNo
example_resource_urisNo
metaNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, and the description adds value by specifying what the catalog contains (tools, resources, prompts). No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence with no wasted words. It conveys the essential purpose efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity, optional parameter, and presence of an output schema, the description is sufficiently complete. It does not need to elaborate on return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter 'ctx' is fully described in the input schema (100% coverage). The description adds no additional meaning beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Return') and the resource ('structured server catalog'), and the scope ('describes tools, resources, and prompts') differentiates it from sibling tools like crawl, extract, or research.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like the other tavily tools. It does not mention when not to use it or offer any usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tavily.crawlTavily CrawlA
Read-onlyIdempotent

Traverse a site and retrieve multi-page content.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesRoot URL to begin crawling.
instructionsNoOptional crawling guidance.
ctxNoOptional FastMCP context.

Output Schema

ParametersJSON Schema
NameRequiredDescription
base_urlNo
resultsNo
request_idNo
response_timeNo

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint. The description adds the multi-page scope but lacks details on crawling depth, rate limits, or behavior on large sites. It does not contradict annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no wasted words. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema and rich annotations, the description is fairly complete for a straightforward crawling tool. However, it could mention depth or limits.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 100% coverage with descriptions for url and instructions. The description adds no extra meaning beyond what is already in the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses specific verbs 'Traverse' and 'retrieve' and identifies the resource as 'site' and 'multi-page content'. It clearly distinguishes from siblings like tavily.search or tavily.extract.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for multi-page content retrieval from a root URL, but does not explicitly state when not to use it or mention alternative tools for single-page extraction or search.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tavily.extractTavily ExtractA
Read-onlyIdempotent

Extract content from specific known URLs.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlsYesURLs to extract.
extract_depthNoExtraction depth.basic
include_imagesNoInclude image metadata.
ctxNoOptional FastMCP context.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsNo
failed_resultsNo
response_timeNo

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, indicating safe read operations. The description adds minimal behavioral context beyond stating it extracts content, which is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence of 8 words, perfectly front-loaded, no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema, annotated safety, and fully described parameters, the description is complete for this simple read operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions for each parameter. The description does not add extra meaning beyond what the schema provides, meeting the baseline for high coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the verb 'extract' and the resource 'content from specific known URLs', distinguishing it from sibling tools like tavily.search (search) and tavily.crawl (crawl).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

While not explicit about when-not-to-use, the description 'extract content from specific known URLs' clearly implies the tool is for known URLs, contrasting with siblings for search or crawling. The context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tavily.get_researchTavily Get ResearchA
Read-onlyIdempotent

Retrieve the status or result of an existing Tavily research task.

ParametersJSON Schema
NameRequiredDescriptionDefault
request_idYesTavily research request identifier.
ctxNoOptional FastMCP context.

Output Schema

ParametersJSON Schema
NameRequiredDescription
request_idNo
created_atNo
completed_atNo
statusNo
inputNo
modelNo
contentNo
sourcesNo
response_timeNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint and idempotentHint, so the description's role is lighter. It correctly adds that the tool retrieves status/result, aligning with annotations. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single efficient sentence with no extraneous words. Front-loaded with the key purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema and full annotations, the description is complete for this simple retrieval tool. No further details needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema fully describes the request_id and ctx parameters. The description adds no extra semantic value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves status/result of an existing research task, with a specific verb and resource. It distinguishes from siblings like tavily.research (likely creation) and tavily.search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for checking existing tasks but gives no explicit when-to-use or when-not-to-use guidance, nor does it mention alternatives like tavily.research.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tavily.healthTavily HealthA
Read-onlyIdempotent

Return package and server health metadata.

ParametersJSON Schema
NameRequiredDescriptionDefault
ctxNoOptional FastMCP context.

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
server_nameYes
versionYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint and idempotentHint; description adds context about the scope of health metadata (package and server). No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, front-loaded, no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given low complexity, presence of output schema, and clear purpose, the description is sufficiently complete for a health check tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a well-described 'ctx' parameter; description adds no additional parameter semantics beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Return' and the resource 'package and server health metadata', distinguishing it from sibling tools like tavily.search or tavily.crawl.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives; usage is implied but not stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tavily.mapTavily MapA
Read-onlyIdempotent

Discover site structure and candidate URLs on a single domain.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesRoot URL to map.
instructionsNoOptional mapping guidance.
ctxNoOptional FastMCP context.

Output Schema

ParametersJSON Schema
NameRequiredDescription
base_urlNo
resultsNo
request_idNo
response_timeNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint, idempotentHint, openWorldHint. Description adds that it discovers site structure on a single domain, which is useful but does not go beyond annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single, front-loaded sentence that conveys purpose efficiently with zero waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with strong annotations and output schema, description is adequate but lacks usage context or behavioral details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with parameter descriptions. The tool description adds no additional meaning beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the verb 'discover', the resource 'site structure and candidate URLs', and scope 'on a single domain'. This distinguishes it from sibling tools like tavily.search or tavily.crawl.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives. No exclusion criteria or context for optimal use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tavily.researchTavily ResearchB
Read-only

Create a deep multi-source Tavily research task.

ParametersJSON Schema
NameRequiredDescriptionDefault
inputYesResearch task or question.
modelNoResearch model.auto
citation_formatNoCitation format.numbered
streamNoWhether Tavily should stream results.
output_schemaNoOptional JSON schema for structured output.
ctxNoOptional FastMCP context.

Output Schema

ParametersJSON Schema
NameRequiredDescription
request_idNo
created_atNo
completed_atNo
statusNo
inputNo
modelNo
contentNo
sourcesNo
response_timeNo

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations include readOnlyHint=true, indicating no side effects. The description adds that the research is 'deep multi-source', which is useful but does not conflict with annotations. With annotations already covering safety, the description provides adequate but minimal additional behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that is clear and efficient. While it is concise, it could benefit from slightly more detail without becoming verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of the tool (6 parameters, multiple siblings), the description is too minimal. It does not explain how a research task differs from other tools or what workflow to expect. The presence of an output schema partially compensates, but the description remains incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameters are well-documented in the schema. The tool description does not add any extra meaning or context to the parameters beyond what is already in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool creates a deep multi-source research task, indicating it's more comprehensive than a simple search. However, it does not explicitly distinguish from sibling tools like tavily.search or tavily.extract, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. The description only states what it does, without any context on prerequisites, exclusions, or preferred scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tavily.searchTavily SearchB
Read-onlyIdempotent

Search the web when relevant URLs are not yet known.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesNatural-language web search query.
max_resultsNoMaximum number of results.
topicNoSearch topic mode.general
include_answerNoInclude Tavily's answer field.
include_raw_contentNoInclude cleaned page content.
include_imagesNoInclude image URLs.
include_image_descriptionsNoInclude image descriptions.
search_depthNoTavily search depth.basic
time_rangeNoRelative publish-date filter.
start_dateNoInclusive start date in YYYY-MM-DD format.
end_dateNoInclusive end date in YYYY-MM-DD format.
include_domainsNoDomains to include.
exclude_domainsNoDomains to exclude.
include_usageNoInclude usage metadata.
ctxNoOptional FastMCP context.

Output Schema

ParametersJSON Schema
NameRequiredDescription
queryNo
answerNo
resultsNo
imagesNo
response_timeNo
request_idNo
follow_up_questionsNo
usageNo

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already confirm read-only, idempotent, and open-world behavior. The description adds no additional behavioral context (e.g., rate limits, pagination, or result composition). With annotations covering safety, the description falls short of enhancing transparency beyond the structured data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that immediately conveys the core purpose. It is efficient but could be slightly restructured to include a brief mention of key features or output without losing brevity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema, the description is too sparse for a tool with 15 parameters and complex filtering capabilities. It does not indicate the rich set of options (date range, domains, depth) available, leaving agents unaware of the tool's full potential.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with each parameter having a description. The tool description itself does not elaborate on parameters, but the schema already does so adequately. Baseline score of 3 is appropriate given the high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool performs web searches when URLs are not known, distinguishing it from siblings like 'extract' (which requires URLs). However, it does not explicitly mention the return of search results or snippets, which would further clarify its purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear usage context ('when relevant URLs are not yet known'), implying when to use this tool versus others like 'extract' or 'crawl'. However, it lacks explicit guidance on when not to use it or direct comparisons with sibling tools, leaving room for ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

A4/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose: catalog and health are meta; crawl, extract, map, search, research, and get_research each target different research stages. No overlap.

Naming Consistency5/5

All tools follow a consistent 'tavily.<verb>' or 'tavily.get_research' pattern with snake_case, making the naming predictable.

Tool Count5/5

8 tools is well within the ideal 3-15 range, and each tool serves a necessary function in the research workflow.

Completeness5/5

The tool set covers the full lifecycle: search for unknown URLs, map/extract/crawl for content, research for deep analysis, and get_research for results, plus health and catalog for metadata. No obvious gaps.

Maintenance

ActivityNo data
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Enables web search capabilities through the Tavily API and serves as a demonstration platform for building custom MCP tools. Designed for educational purposes to showcase MCP server development and LangGraph integration.
    6
  • A
    license
    Not graded
    quality
    C
    maintenance
    A web search and extraction MCP server powered by Tavily, providing tools for AI-powered search, content extraction from URLs, and Q\&A with source citations.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    MCP server for web page fetching (converting to Markdown/text with automatic fallback between Tavily and Firecrawl) and web search via Tavily.
    2
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/pr1m8/tavily-fastmcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server