multsearch-mcp
multsearch-mcp is a local MCP server for Claude Code that performs real web searches with two independent search paradigms and explicit source return.
web_search— Path A: runs Tavily + Firecrawl + SearXNG in parallel to gather sources, then an LLM (default GLM-5.2 via Volcengine Ark) synthesizes a cited answer with[n]inline references; returns asession_id,sources_count, and cache status. Optional per-requestmodelandextra_sourcesquota.gemini_search— Path B: native Google Search grounding via Gemini 2.5 Flash, giving a grounded answer plus Google citations from an entirely different index (for cross-validation).get_sources— retrieves the full source list for a previousweb_searchsession using itssession_id.web_fetch— fetches a URL and converts it to structured, full-fidelity Markdown (Tavily extract with Firecrawl fallback).web_map— crawls a site graph to list discoverable URLs, with controls formax_depth,max_breadth,limit,timeout, and natural-languageinstructionsfiltering.get_config_info— shows current configuration, tests API connectivity via the/modelsendpoint, and lists available models (keys masked).switch_model— changes the default LLM model for subsequent operations and persists it to~/.config/multsearch/config.json.
Integrates with Google Search via the Gemini API to perform grounded searches (Path B), providing answers with citations from Google's index for cross-verification of search results.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@multsearch-mcpsearch for 'machine learning trends 2025' and cross-validate"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
multsearch-mcp
Claude Code 多路联网搜索 MCP
两套搜索范式交叉验证 · 信源显式回传 · 国内可用
这是什么
一个为 Claude Code 设计的本地 MCP 服务器。装上之后,Claude 回答前会真的去网上查,并把信源显式带回来,而不是凭印象瞎答。
核心是两套搜索范式,互相交叉验证:
范式 | 工具 | 信源 | 模型 |
Path A · 信源聚合 |
| Tavily + Firecrawl + SearXNG 三路并行找源 | LLM 基于信源 summarize(默认火山方舟 Ark |
Path B · 原生 grounding |
| Google Search grounding | Gemini 2.5 Flash |
两套范式用的是完全不同的索引(Tavily / Firecrawl / SearXNG vs Google),适合对关键事实做交叉验证。除此之外还有网页抓取、站点扫描、信源回查、配置诊断等辅助工具。
Related MCP server: fast-webfetch-mcp
提供的工具
工具 | 作用 |
| Tavily + Firecrawl + SearXNG 并行找源 → LLM 综合成带 |
| Gemini + Google grounding 直接给 grounded 答案 + Google 引用(Path B) |
| 用 |
| 抓任意网页转结构化 Markdown(Tavily extract → Firecrawl 兜底) |
| 扫描一个站点,列出全部可访问 URL |
| 查看当前配置 + 测试 API 连通性 + 列出可用模型 |
| 切换默认 LLM 模型并持久化到 |
为什么不直接用 Claude Code 自带的 WebSearch / WebFetch?
自带工具受后端策略限制,部分地区不可用、命中率不稳定
自带工具不会把搜索结果显式喂给模型,Claude 经常仍走内部记忆,幻觉率高
没有结构化信源回传,难以追溯
本项目把这三件事都修好了,且主模型走火山方舟 Ark(国内直连、无需代理),Tavily / Firecrawl / Gemini 走代理,SearXNG 默认直连。
工作原理
你 → Claude Code → multsearch MCP → ┬─ Tavily + Firecrawl + SearXNG 找源 ─► LLM summarize (web_search, Path A)
├─ Gemini + Google grounding (gemini_search, Path B)
├─ Tavily extract / Firecrawl scrape (web_fetch)
└─ Tavily map (web_map)web_search 文本模式:Tavily + Firecrawl + SearXNG 并行抓信源 → 组装成编号信源文本 → 喂给 LLM(glm-5.2)让它只依据信源作答,每条事实带 [n] 引用。模型本身不联网,所以不会幻觉编造。信源以 Tavily / Firecrawl / SearXNG 的实际结果为准,模型若附了信源列表会被剥离。同 query + model 的响应走 LRU 缓存直接命中。
gemini_search:走 Gemini 原生 Google Search grounding,返回 grounded 答案 + Google 引用,遇 429 / 5xx 指数退避重试。
30 秒上手
两种安装方式:A. 让 Claude Code 自己配(推荐)/ B. 交互式向导。
A. Claude Code 驱动(非交互模式,推荐)
把这一段直接发给 Claude Code:
我本地有
multsearch-mcp源码(路径:<填绝对路径>),请把它安装到我当前项目里(scope=project)。 你需要先cd到我当前项目目录,然后通过下面这条命令完成安装。我会告诉你我的 Ark API Key(ark-...开头),Tavily / Firecrawl / Gemini 都跳过(SearXNG 默认就启用,无需配置):uvx --from '<源码路径>[setup]' \ multsearch-setup \ --non-interactive \ --package-spec <源码路径> \ --scope project \ --provider ark \ --api-key <我会粘贴的 Ark Key>装完检查 .mcp.json 是否只在当前目录、
claude mcp list是否能看到 multsearch。
B. 交互式向导(自己跑)
cd ~/your-project # ← 关键:决定 .mcp.json 写到哪里
uvx --from '<源码路径>[setup]' multsearch-setup --package-spec <源码路径>向导会一步步问 LLM 服务来源(Ark / 自定义)、API Key、Tavily / Firecrawl / Gemini(均可选)、作用域,全程键盘选项 + 回车,不需要手写任何配置文件。完成后自动跑 claude mcp add-json 注册到当前项目 .mcp.json。重启 Claude Code 后 /mcp 能看到 multsearch。
没装
uv?curl -LsSf https://astral.sh/uv/install.sh | sh然后重开终端。
API Key 申请指南
主 LLM Key 必需,其余可选。零成本组合 = Ark + Tavily + Gemini,三家都有免费额度,全程不用绑卡。SearXNG 默认免费开启、无需 key,作为 web_search 第三路信源。
1. 火山方舟 Ark(主 LLM,必需)
项 | 说明 |
控制台 | |
Key 前缀 |
|
模型 |
|
计费 | 按 token,有免费 / 体验额度 |
Ark 走国内直连,Tavily / Firecrawl / Gemini 走代理。
2. Tavily(强烈建议,可选)
项 | 说明 |
注册 | |
免费额度 | 1,000 次 / 月,无需绑卡 |
用途 |
|
不配 Tavily:web_search 退化为 Firecrawl + SearXNG 两路;web_fetch / web_map 不可用。
3. Firecrawl(可选)
项 | 说明 |
注册 | |
免费额度 | 1,000 credits / 月,无需绑卡 |
用途 |
|
4. Gemini(可选 · 第二路搜索)
项 | 说明 |
取 Key | |
用途 |
|
注意 | Google API 在中国大陆需走代理( |
5. SearXNG(可选 · 第三路信源)
项 | 说明 |
是什么 | 自建 / 公开的元搜索引擎,聚合 Google / Bing / DuckDuckGo 等多引擎结果 |
默认地址 |
|
用途 |
|
Key | 无需 API Key |
引擎 |
|
代理 | 代码内 |
注意 | 实例需在 |
配置文件形态
向导跑完后,项目根目录的 .mcp.json 大致长这样(敏感字段已脱敏):
{
"mcpServers": {
"multsearch": {
"type": "stdio",
"command": "uvx",
"args": ["--from", "<源码路径>", "multsearch"],
"env": {
"MULT_PROVIDER": "custom",
"MULT_API_URL": "https://ark.cn-beijing.volces.com/api/plan/v3",
"MULT_API_KEY": "ark-****",
"MULT_MODEL": "glm-5.2",
"MULT_MAX_TOKENS": "8192",
"TAVILY_API_KEY": "tvly-****",
"FIRECRAWL_API_KEY": "fc-****",
"GEMINI_API_KEY": "****",
"GEMINI_MODEL": "gemini-2.5-flash",
"HTTP_PROXY": "http://127.0.0.1:7890",
"HTTPS_PROXY": "http://127.0.0.1:7890",
"NO_PROXY": "localhost,127.0.0.1,ark.cn-beijing.volces.com,*.volces.com"
}
}
}
}Claude Code 启动时读这个文件,按 stdio 协议拉起一个 Python 进程(本项目),通过 MCP 协议转发工具调用。httpx 默认 trust_env=True,会读 HTTP_PROXY / NO_PROXY,所以 Tavily / Firecrawl / Gemini 走代理、Ark 走直连;SearXNG 单独用 trust_env=False 直连。
作用域怎么选
向导第 6 步选作用域:
Scope | 配置文件位置 | 谁能看到 | 推荐场景 |
project |
| 入 git 后团队共享 | 默认 |
user |
| 本机所有项目 | 一台机器多项目都用 |
local |
| 仅本机本项目 | 个人调试 |
新手选 project,把 .mcp.json 提交进 git 即可。
进阶配置
切换 Provider / 模型
向导第 2 步可选 Ark / 自定义。已装好想改:重新跑向导,或直接编辑 .mcp.json 的 env 段。运行时也可用 switch_model 工具切换模型并持久化到 ~/.config/multsearch/config.json。
完整环境变量参考
变量 | 默认值 | 说明 |
|
|
|
| — | OpenAI 兼容端点(Ark: |
| — | 必需 |
|
| LLM 模型,可用 |
| — | 推理模型建议 |
|
| LLM 流式请求的最大重试次数 |
|
| 指数退避 multiplier |
|
| 单次重试最大等待秒数 |
| — | 可选, |
|
| Tavily API 入口 |
|
| 关闭则跳过 Tavily 找源 |
| — | 可选, |
|
| Firecrawl API 入口 |
| — | 可选, |
|
| Gemini 模型 |
|
| Gemini API 入口 |
|
| SearXNG 实例地址(第三路信源) |
|
| 逗号分隔的引擎列表 |
|
| 关闭则不采集 SearXNG 信源 |
| — | 中国大陆访问 Tavily / Firecrawl / Gemini 需代理(SearXNG 直连不受影响) |
| — | 国内 API( |
|
| 详细日志 |
|
|
|
|
| 日志输出目录 |
配置优先级:环境变量 > ~/.config/multsearch/config.json。
验证安装
claude mcp list
# 应该出现一行:multsearch connected在 Claude Code 里新开会话:
用 multsearch 的 web_search 搜一下「AKShare stock_zh_a_spot_em 的 limit 参数默认返回多少只」,把信源列出来。
连通后会看到 Claude 调用 web_search,输出带 [编号] 引用的回答。再用 get_sources 取回完整信源列表。
第二路:
用 multsearch 的 gemini_search 搜同一个问题,对比两路结果。
开发与测试
# 安装开发依赖
uv sync --extra dev
# 跑纯函数单测(不依赖网络)
pytest tests/test_text_mode.py 是端到端活链路验证脚本:Tavily / Firecrawl 并行找源 → LLM summarize,需要先准备好 MULT_API_KEY / TAVILY_API_KEY / FIRECRAWL_API_KEY。
常见问题
Q:/mcp 看不到 multsearch?
A:99% 是 Claude Code 没重启。先 claude mcp list 看命令行是否能看到,能看到就完全重启 Claude Code(退出再开,不是新会话)。
Q:改了源码不生效?
A:uv tool run --from <path> 会缓存构建的 wheel。改源码后bump pyproject.toml 的 version(强制重建 wheel),或清 uv 缓存(sdists-v9/path + archive-v0 下本包目录),再 /mcp 重连。
Q:web_search 返回空 content?
A:多半是 Tavily / Firecrawl 没连上(代理没开 → HTTP 000)。代码里 except Exception: return None 静默兜底了;SearXNG 默认开启会兜底一路信源(走直连),若三路全空再开代理(Clash 127.0.0.1:7890),用 get_config_info 测连通性,或用 dangerouslyDisableSandbox 的 curl 直连 api.tavily.com 排查。
Q:gemini_search 报失败?
A:Google API 必须走代理(不在 NO_PROXY 里),且 GEMINI_API_KEY 要设置。免费档 15 RPM,并发下可能 429,已内置退避重试。
Q:能用其它 OpenAI 兼容端点吗?
A:可以。MULT_PROVIDER=custom + 自填 MULT_API_URL / MULT_MODEL 即可(如 DeepSeek、智谱、内网网关等)。
Q:为什么没有规划 / 任务拆解类工具?
A:早期版本有一套 6 阶段搜索规划状态机,实际使用中调用方很少走,维护成本高,已移除以聚焦两套搜索范式(Path A 多源聚合 + Path B Gemini grounding)。web_search 现在是直接的「找源 → 总结」流程,带同 query + model 的 LRU 响应缓存。
Available Tools
7 toolsgemini_searchA
Performs a web search via Gemini + Google Search grounding (Google's index).
Independent of Tavily/Firecrawl — use as a second search path for cross-validation.
Returns the grounded answer plus Google-sourced citations.
Requires GEMINI_API_KEY (get a free key at https://aistudio.google.com/apikey).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Clear natural-language search query. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the search mechanism, output type (grounded answer plus citations), independence from other tools, and API key requirement. However, it lacks details on rate limits, error handling, or what happens if the API key is invalid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each serving a distinct purpose: function, differentiation/use case, and setup requirement. No fluff, front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite missing output schema details, the description covers purpose, usage context, and authentication. The tool is simple with one parameter, and the description provides enough for an agent to decide when and how to use it. Output schema exists, so return values need not be described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the description adds no parameter-specific information beyond what the schema already provides. The baseline of 3 is appropriate since the schema fully documents the single 'query' parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Performs a web search via Gemini + Google Search grounding', identifying the specific verb, resource, and mechanism. It also distinguishes itself from siblings by noting 'Independent of Tavily/Firecrawl', making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'use as a second search path for cross-validation', providing a clear when-to-use context. It also names the alternatives (Tavily/Firecrawl) and mentions the prerequisite GEMINI_API_KEY, giving explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_config_infoA
Returns current multsearch MCP server configuration and tests API connectivity.
**Key Features:**
- **Configuration Check:** Verifies environment variables and current settings.
- **Connection Test:** Sends request to /models endpoint to validate API access.
- **Model Discovery:** Lists all available models from the API.
**Edge Cases & Best Practices:**
- Use this tool first when debugging connection or configuration issues.
- API keys are automatically masked for security in the response.
- Connection test timeout is 10 seconds; network issues may cause delays.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It discloses that API keys are automatically masked, connection test has a 10-second timeout, and it sends a request to the /models endpoint. These are valuable behavioral traits beyond the mere statement of function, making the tool's operation predictable and safe.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections for Key Features and Edge Cases/Best Practices. Every sentence provides useful information, and the bullet points make it scannable. It is appropriately sized, not overly verbose, and front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, so the description should explain return values. It mentions returning configuration, listing models, and testing connectivity, but does not specify the exact structure of the response. Given the simplicity of the tool and the richness of behavioral details provided, this is quite complete, though a brief mention of the response format would make it fully comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the input schema provides complete coverage. The description adds no parameter-specific information, but with no parameters, there is nothing to explain. The baseline for zero parameters is 4, which is appropriate here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Returns current multsearch MCP server configuration and tests API connectivity.' The verb 'returns' and 'tests' are specific, and the resource is well-defined. It also lists key features (configuration check, connection test, model discovery) which further clarifies the scope and distinguishes it from sibling tools like web_search or get_sources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'Use this tool first when debugging connection or configuration issues.' This gives a clear context for when to employ the tool, though it does not explicitly mention alternatives or exclusions. This is a clear context with no exclusions, qualifying for a 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sourcesB
When you feel confused or curious about the search response content, use the session_id returned by web_search to invoke the this tool to obtain the corresponding list of information sources.
Retrieve all cached sources for a previous web_search call.
Provide the session_id returned by web_search to get the full source list.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID from previous web_search call. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It conveys this is a read-only retrieval of cached sources, which is inherently safe, and hints that data persists ('cached'). It does not mention what happens for invalid/expired session_ids, auth requirements, or pagination, but for a simple retrieval tool the basic safety profile is adequately conveyed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is highly repetitive — three sentences effectively say the same thing: use the web_search session_id to get the source list. It also contains a typo ('invoke the this tool'). A single crisp sentence ('Retrieve all cached sources for a prior web_search call using its session_id.') would carry the full meaning. The redundant first sentence should be cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the return format is covered externally. For a low-complexity tool with a single required parameter, the description adequately covers when to use it (after web_search) and what it returns (the full source list). The main gaps — error behavior for invalid sessions and any filtering/ordering — are minor given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% — the schema already documents session_id as 'Session ID from previous web_search call.' The description reinforces that the ID must come from web_search, adding marginal provenance context, but it does not add meaningful syntax or format details beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The core purpose is clear: 'Retrieve all cached sources for a previous web_search call' states a specific verb and resource, and ties the tool to the web_search sibling via session_id. However, the opening sentence uses odd emotional framing ('When you feel confused or curious...') which muddies the definition rather than clarifying it. The purpose is distinguishable from siblings like web_fetch and web_map because it targets cached search sources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives useful context: the tool is invoked with a session_id returned by a prior web_search call, so it is clearly a follow-up to web_search. However, it never states when NOT to use it or names alternatives (e.g., web_fetch for fetching actual page content). The 'confused or curious' trigger is too vague to be actionable guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
switch_modelA
Switches the default LLM model used for search and fetch operations, persisting the setting.
**Key Features:**
- **Model Selection:** Change the AI model for web search synthesis and content fetching.
- **Persistent Storage:** Model preference saved to ~/.config/multsearch/config.json.
- **Immediate Effect:** New model used for all subsequent operations.
**Edge Cases & Best Practices:**
- Use get_config_info to verify available models before switching.
- Invalid model IDs may cause API errors in subsequent requests.
- Model changes persist across sessions until explicitly changed again.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | Model ID to switch to (e.g., 'glm-5.2'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for behavioral disclosure. It transparently reveals persistence to ~/.config/multsearch/config.json, immediate effect, and the risk of invalid model IDs causing API errors. It also notes that changes persist across sessions until explicitly changed, providing a complete behavioral picture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections for key features and edge cases. Every section provides meaningful information without fluff. The length is appropriate for the tool's complexity and the rich context it provides.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no output schema, no annotations), the description fully covers purpose, usage, persistence, immediate effect, and edge cases. It equips the agent with all necessary context to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers 100% of the parameter semantics with a clear description and example. The tool description adds value by warning about invalid model IDs and suggesting verification via get_config_info, which enriches the parameter's context beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action: 'Switches the default LLM model used for search and fetch operations, persisting the setting.' This specific verb+resource combination distinguishes it from sibling tools like web_search and get_config_info, which serve different functions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises using get_config_info to verify available models before switching, directly addressing when to use this tool versus an alternative. The 'Edge Cases & Best Practices' section further clarifies usage context and potential pitfalls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_fetchA
Fetches and extracts complete content from a URL, returning it as a structured Markdown document.
**Key Features:**
- **Full Content Extraction:** Retrieves and parses all meaningful content (text, images, links, tables, code blocks).
- **Markdown Conversion:** Converts HTML structure to well-formatted Markdown with preserved hierarchy.
- **Content Fidelity:** Maintains 100% content fidelity without summarization or modification.
**Edge Cases & Best Practices:**
- Ensure URL is complete and accessible (not behind authentication or paywalls).
- May not capture dynamically loaded content requiring JavaScript execution.
- Large pages may take longer to process; consider timeout implications.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Valid HTTP/HTTPS web address pointing to the target page. Must be complete and accessible. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses key behaviors: full content extraction, markdown conversion, 100% content fidelity without summarization, and limitations (dynamic content, large page timeouts). This is useful transparency for a fetch tool, though it does not explicitly state read-only nature or error handling on invalid URLs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with headers and bullet points, front-loading the main purpose. It is concise, though there is minor redundancy between 'Full Content Extraction' and 'Content Fidelity' (both imply completeness). Overall, it is compact and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description explains the return type (structured Markdown) and mentions edge cases (dynamic content, timeouts). However, it lacks explicit differentiation from sibling tools and does not address error handling (e.g., invalid URLs) or whether any side effects occur. It is adequate but not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides a complete description of the 'url' parameter (valid HTTP/HTTPS web address, must be complete and accessible) with 100% coverage. The tool description repeats this accessibility guidance but adds no new parameter semantics, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Fetches and extracts complete content from a URL') and the output (structured Markdown). It is distinct from web_search (which searches) and web_map (which likely maps links) by focusing on a single URL. The purpose is unambiguous and immediately understandable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies its use (when you have a specific URL and want its content) but does not explicitly state when to use this tool over alternatives like web_search. It provides edge cases (accessibility, dynamic content) but no exclusions or routing to siblings, leaving the choice largely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_mapA
Maps a website's structure by traversing it like a graph, discovering URLs and generating a comprehensive site map.
**Key Features:**
- **Graph Traversal:** Explores website structure starting from root URL.
- **Depth & Breadth Control:** Configure traversal limits to balance coverage and performance.
- **Instruction Filtering:** Use natural language to focus crawler on specific content types.
**Edge Cases & Best Practices:**
- Start with low max_depth (1-2) for initial exploration, increase if needed.
- Use instructions to filter for specific content (e.g., "only documentation pages").
- Large sites may hit timeout limits; adjust timeout and limit parameters accordingly.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Root URL to begin the mapping (e.g., 'https://docs.example.com'). | |
| limit | No | Total number of links to process before stopping. | |
| timeout | No | Maximum time in seconds for the operation. | |
| max_depth | No | Maximum depth of mapping from the base URL. | |
| max_breadth | No | Maximum number of links to follow per page. | |
| instructions | No | Natural language instructions for the crawler to filter or focus on specific content. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explains the graph traversal approach, depth/breadth controls, instruction filtering, and edge cases like timeout limits ('Large sites may hit timeout limits; adjust timeout and limit parameters accordingly'). This reveals non-destructive behavior implicitly (mapping a site does not modify it) and provides practical limits. It could be more explicit about being read-only, but the overall behavior is transparent enough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear headings ('Key Features', 'Edge Cases & Best Practices') and bullet points. It is front-loaded with the primary purpose, followed by relevant details. Every sentence contributes to understanding the tool or its usage, with no filler. It is appropriately sized for a tool with 6 parameters and multiple controls.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (6 parameters including traversal controls) and the presence of an output schema, the description covers the necessary ground: how it works (graph traversal), how to control it (depth/breadth/limit/timeout), and how to handle edge cases (timeouts, instructions for filtering). It doesn't explicitly mention prerequisites like authentication or public accessibility, but these are not critical for a mapping tool. The output schema covers return values, so that gap is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value beyond the schema by explaining the purpose of parameters in context (e.g., depth and breadth control under 'Depth & Breadth Control', instructions under 'Instruction Filtering') and giving concrete usage advice like 'Start with low max_depth (1-2) for initial exploration'. This goes beyond the schema's bare descriptions and provides actionable parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: 'Maps a website's structure by traversing it like a graph, discovering URLs and generating a comprehensive site map.' This is specific and distinguishes it from siblings like web_search (searching) and web_fetch (fetching a single page). The mention of 'site map' and graph traversal makes the tool's role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides best practices for using the tool (e.g., 'Start with low max_depth (1-2) for initial exploration', 'Use instructions to filter for specific content'), which gives practical usage context. However, it does not explicitly state when to use this tool versus alternatives or mention exclusions. There is no reference to sibling tools, so an agent must infer when web_map is appropriate. This is clear context but lacks explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_searchA
Performs a deep web search: Tavily + Firecrawl find sources, then the LLM (default GLM-5.2 via Ark) synthesizes a cited answer.
Returns:
- session_id string pass to get_sources to retrieve full source list
- content string LLM's source-based answer (with [n] inline citations)
- sources_count int
- cached bool true if response was served from in-memory result cache
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | Optional model ID for this request only. Used ONLY when user explicitly provided. | |
| query | Yes | Clear, self-contained natural-language search query. | |
| extra_sources | No | Number of additional reference results from Tavily/Firecrawl. Set 0 to disable. Default 0 = auto quota (Tavily 8 + Firecrawl 6). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and it delivers meaningful context: it discloses the underlying services (Tavily, Firecrawl), the default model (GLM-5.2 via Ark), and even the caching behavior via the 'cached' flag. This goes beyond a simple 'search tool' and gives the agent insight into how results are generated and possibly stale.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a purpose sentence followed by a bulleted return list. The return list is necessary because no output schema exists, and each bullet earns its place. It is slightly more verbose than necessary but remains focused and front-loaded with the main function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the search pipeline, default model, return values, and caching, and it links to a sibling tool (get_sources) via session_id. With no output schema, this is essential. It does not provide explicit alternatives for search-related choices (gemini_search), but that gap is primarily for usage guidelines. Overall, the description is reasonably complete for a read-only search tool with a rich schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains all three parameters clearly. The description adds little to parameter understanding, though it does connect the returned session_id to get_sources, which is output-related. Baseline 3 applies per the rubric.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'performs a deep web search' using Tavily + Firecrawl and synthesizes a cited answer with an LLM. This specific pipeline (multi-source + synthesis) distinguishes it from siblings like gemini_search, which likely uses a different search mechanism.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'deep web search' implies when to use it, and the return field 'pass to get_sources' suggests a workflow. However, it does not explicitly state when to use this tool versus alternatives like gemini_search, web_fetch, or web_map, nor does it mention any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v0.2.1- First observed
gemini_search - First observed
get_config_info - First observed
get_sources - First observed
switch_model - First observed
web_fetch - First observed
web_map - First observed
web_search
TDQS
Scored across 7 tools
Each tool has a distinct purpose: configuration, search (two providers), source retrieval, URL fetch, site mapping, and model switching. The two search tools (web_search and gemini_search) overlap in function but descriptions clearly position gemini_search as a cross-validation path, so an agent can disambiguate. Overall boundaries are clear.
Naming mixes verb-first and object-first conventions: get_config_info/get_sources/switch_model are verb_noun, while web_search/web_fetch/web_map/gemini_search are object_verb (or proper-noun_verb). This inconsistency is noticeable but all names are readable and lower_snake_case, so it is not chaotic.
Seven tools is well within the ideal 3–15 range. Each tool covers a distinct capability (config, search, sources, fetch, map, model switch) and none seem redundant or filler.
The surface covers the full workflow: search via two providers, retrieve sources via session_id, fetch single URLs, map website structures, and manage configuration/model. There are no obvious dead ends; the only minor gap might be a way to clear cache, but that is not essential to the core search/fetch/map domain.
Maintenance
Related MCP Connectors
Docs: https://docs.keenable.ai/mcp-server Keenable is a free, remote MCP server that gives agents access to the web index. Search the web with ranked results and date/site filters, then fetch any indexed page as clean markdown. Works out of the box with no account or API key.
- RampifyOAuthdev.rampify
SEO MCP server: crawl your site, find AI-visibility gaps, and ship the fix from your coding agent.
Related MCP Servers
- AlicenseAqualityDmaintenanceAn MCP server that enables Claude to perform web searches using Perplexity's API with intelligent model selection based on query intent and support for domain and recency filtering.64MIT
- AlicenseNot gradedqualityBmaintenanceA high-performance MCP server for web fetching in Claude Code using Firecrawl backend with automatic fallback.2MIT
- AlicenseAqualityCmaintenanceMCP server for web page fetching (converting to Markdown/text with automatic fallback between Tavily and Firecrawl) and web search via Tavily.2MIT
- AlicenseBqualityCmaintenanceMCP server for Claude Code that provides Google text search, web content extraction, and image search with dual-platform (Google Images + Pinterest) and AI visual analysis with quality scoring.5MIT