Typed FastMCP server, prompts, resources, and profiles for Tavily-powered research workflows.
Project description
tavily-fastmcp
Typed, ergonomic FastMCP server for Tavily search, extract, map, crawl, and research workflows.
It ships with:
- namespaced MCP tools like
tavily.searchandtavily.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.
Installation
pdm add tavily-fastmcp
For LangChain helpers:
pdm add tavily-fastmcp[langchain]
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())
Included profiles and prompts
The package ships with large markdown prompts and reusable profiles for:
routersuite-overviewquick-searchtool-searchextract-and-summarizetool-extractsite-discoverytool-mapsite-crawltool-crawldeep-researchtool-researchtool-get-researchrouting-matrixsynthesis-policymcp-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/serverresource://tavily-fastmcp/catalog/profilesresource://tavily-fastmcp/profile/deep-researchresource://tavily-fastmcp/prompt/routerresource://tavily-fastmcp/prompt/deep-researchresource://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.healthtavily.catalogtavily.searchtavily.extracttavily.maptavily.crawltavily.researchtavily.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:
CIruns linting, typing, and tests on pushes and pull requests.Docsbuilds the Sphinx site and uploads the rendered HTML as an artifact.Buildcreates source and wheel distributions and validates them withtwine check.Releaserebuilds the distributions on GitHub Releases and publishes them to PyPI using trusted publishing..readthedocs.yamlconfigures Read the Docs to build the Sphinx documentation with Python 3.13.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tavily_fastmcp-0.3.0.tar.gz.
File metadata
- Download URL: tavily_fastmcp-0.3.0.tar.gz
- Upload date:
- Size: 49.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0a0072717af49f095bb56480c2343074a054ce713fb3027fcbb5546b715a7626
|
|
| MD5 |
8cb45b95c2e9054900a08357c288171a
|
|
| BLAKE2b-256 |
2c63b3a9cda152d233446300c9d138a7a627d280fcd1baa3fc3a7380080a85ca
|
Provenance
The following attestation bundles were made for tavily_fastmcp-0.3.0.tar.gz:
Publisher:
release.yml on pr1m8/tavily-fastmcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tavily_fastmcp-0.3.0.tar.gz -
Subject digest:
0a0072717af49f095bb56480c2343074a054ce713fb3027fcbb5546b715a7626 - Sigstore transparency entry: 1358423729
- Sigstore integration time:
-
Permalink:
pr1m8/tavily-fastmcp@1a163924e228279ecd0c282d920e086a008bfaed -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/pr1m8
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1a163924e228279ecd0c282d920e086a008bfaed -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file tavily_fastmcp-0.3.0-py3-none-any.whl.
File metadata
- Download URL: tavily_fastmcp-0.3.0-py3-none-any.whl
- Upload date:
- Size: 57.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
67725e6439779ca64a14667781b0dfc46a380fc3821c16c58e3cc233829960b4
|
|
| MD5 |
38053047799c2078a9d0bc0787be1f51
|
|
| BLAKE2b-256 |
0a587741bcba631a02637a9fe9066e6e59f65e3168ed7613c3449531879a8476
|
Provenance
The following attestation bundles were made for tavily_fastmcp-0.3.0-py3-none-any.whl:
Publisher:
release.yml on pr1m8/tavily-fastmcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tavily_fastmcp-0.3.0-py3-none-any.whl -
Subject digest:
67725e6439779ca64a14667781b0dfc46a380fc3821c16c58e3cc233829960b4 - Sigstore transparency entry: 1358423734
- Sigstore integration time:
-
Permalink:
pr1m8/tavily-fastmcp@1a163924e228279ecd0c282d920e086a008bfaed -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/pr1m8
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1a163924e228279ecd0c282d920e086a008bfaed -
Trigger Event:
workflow_dispatch
-
Statement type: