快速回答
如何将网页搜索 MCP server 添加到 Claude Code 或 Claude Desktop?
保存本页的简短 Python server,它公开了调用 LLMWebSearch 的 search_web 和 read_urls 工具,然后用 claude mcp add 或在 claude_desktop_config.json 中注册,将密钥放在 env 中。模型随后可以搜索实时网络并以 Markdown 读取热门页面。截至 2026 年 10 月,一次搜索花费 1 个积分,起价 US$1.20/千次搜索。无需 KYC;使用加密货币支付。
MCP server 一览
| 语言 | Python 3.10+,需要 mcp 和 httpx 包 |
|---|---|
| 传输 | stdio:客户端将 server 作为本地进程启动 |
| 工具 1 | search_web(query, max_results=5, read=3) → 带 URL 和页面文本的编号来源 |
| 工具 2 | read_urls(urls) → 1 到 20 个已知页面的正文内容 |
| 名称 | 不要用 web_search 或 web_fetch:Claude Code 和 OpenClaw 已自带同名工具 |
| 密钥 | 从 server 环境中的 LLMWEBSEARCH_API_KEY 读取 |
| 计费 | 1 积分支付一次查询:最多 20 条排名结果,其中前 3 条的页面会被读取并以 Markdown 返回。读取 4 到 10 个页面为 2 积分。以错误结束的调用不收费. 读取你已持有 URL 的页面:每开始一组 3 个返回内容的页面计 1 积分,每次调用最多 20 个 URL;被拒绝或失败的 URL 不计入 |
为什么工具叫 search_web 和 read_urls?
因为两个同名工具会让客户端和模型混淆。Claude Code 和 OpenClaw 各自包含名为 web_search 和 web_fetch 的内置工具。不同的名称加上清晰的描述,能让模型有意识地选择我们的工具,也让你在日志中区分这些调用。
两个工具都返回文本,而不是原始 JSON。每个来源以编号、标题及其 URL 开头,这样模型可以引用 [1] 或 [2],读者也可以核查该页面。
import os
import httpx
from mcp.server.fastmcp import FastMCP
BASE = "https://llmwebsearch.com/api/v1"
HEADERS = {"Authorization": "Bearer " + os.environ["LLMWEBSEARCH_API_KEY"]}
mcp = FastMCP("llmwebsearch")
def _call(path: str, body: dict) -> dict:
resp = httpx.post(BASE + path, json=body, headers=HEADERS, timeout=90)
data = resp.json()
if resp.status_code != 200:
err = data.get("error", {})
raise RuntimeError(err.get("code", str(resp.status_code)) + ": " + err.get("message", ""))
return data
def _page(n: int, item: dict) -> str:
head = f"[{n}] {item.get('title') or item['url']}\n{item['url']}\n"
if item.get("content_status") == "ok":
return head + item["content"]
return head + "(not read: " + item.get("content_status", "unknown") + ") " + item.get("snippet", "")
@mcp.tool()
def search_web(query: str, max_results: int = 5, read: int = 3) -> str:
"""Search the live web and return numbered sources; the first `read` pages include their text.
Use it for current facts, documentation and news. Cite sources by their number.
"""
body = {"q": query, "max_results": max(1, min(max_results, 20)), "read": max(0, min(read, 10)), "max_chars": 5000}
data = _call("/search", body)
return "\n\n".join(_page(i, r) for i, r in enumerate(data["results"], start=1))
@mcp.tool()
def read_urls(urls: list[str]) -> str:
"""Read 1 to 20 public web pages whose URLs you already have and return their main text."""
data = _call("/extract", {"urls": urls[:20], "max_chars": 12000})
return "\n\n".join(_page(i, r) for i, r in enumerate(data["results"], start=1))
if __name__ == "__main__":
mcp.run()
如何安装和测试该 server?
创建虚拟环境,安装 mcp 和 httpx,并保存上面的文件。mcp 是 Model Context Protocol 的官方 Python SDK;其 FastMCP 类将带类型的 Python 函数转为工具,并将每个 docstring 用作工具的描述。
在终端中设置好密钥后启动该文件一次。它会安静地等待客户端从标准输入连接,这意味着它正常工作;用 Ctrl+C 停止。API 的错误会作为带有错误代码的工具错误抛出,因此模型会以通俗语言看到 rate_limited 或 insufficient_credits。
python -m venv .venv
. .venv/bin/activate
pip install "mcp[cli]" httpx
LLMWEBSEARCH_API_KEY="your-key" python llmwebsearch_mcp.py如何将其添加到 Claude Code?
使用 claude mcp add。Claude Code 的文档给出格式 claude mcp add [options] <name> -- <command> [args...]:它自己的选项在前,然后是一个双横线,再是启动 server 的命令。环境变量放在 --env KEY=value 中,且 --env 与 server 名称之间至少要有另一个选项,例如 --transport stdio。
添加 --scope user 可使 server 在所有项目中可用;默认作用域 local 仅覆盖当前项目。虚拟环境的 Python 和 server 文件请使用绝对路径。
claude mcp add --env LLMWEBSEARCH_API_KEY=your-key --transport stdio --scope user llmwebsearch \
-- /home/you/llmwebsearch/.venv/bin/python /home/you/llmwebsearch/llmwebsearch_mcp.py如何将它添加到 Claude Desktop 和其他客户端?
Claude Desktop 从 claude_desktop_config.json 读取服务器,位于 mcpServers 下。为服务器指定名称、命令、其参数以及一个存放密钥的 env 对象,然后重启应用;search_web 和 read_urls 会出现在工具列表中。
其他 MCP 客户端(例如 Cursor)会在各自的 MCP 设置中要求同样的三项内容:命令、其参数和环境变量。密钥绝不会出现在工具参数或对话中。
{
"mcpServers": {
"llmwebsearch": {
"command": "/home/you/llmwebsearch/.venv/bin/python",
"args": ["/home/you/llmwebsearch/llmwebsearch_mcp.py"],
"env": { "LLMWEBSEARCH_API_KEY": "your-key" }
}
}
}如何让搜索既省钱又简短?
在指令中告诉模型如何搜索:每个问题一到两次搜索,只有在来源互相矛盾时才继续阅读。服务器已将 search_web 中每页内容限制为 5,000 个字符,read_urls 中为 12,000 个字符;对于小型模型,可以调低这些数字。
每次 search_web 调用(read 最多为 3)计为一个积分。每天运行 40 次搜索的助手每月约使用 1,200 个积分,因此 5,000 次搜索(US$9.25)大约能用四个月。查询积分永不过期:这个月没用完的,明年还在。
当页面无法读取时,模型会看到什么?
来源仍会出现,包含其编号、标题和 URL,后面跟着方括号中的原因和搜索摘要。我们的读取器遵守 robots.txt:它会以 LLMWebSearch 表明身份,遵守网站为它或为所有机器人写下的规则,并排除任何它无权读取的页面内容。当网站拒绝我们的读取器时,结果会不带内容返回,并附上该网站的状态:我们绝不破解 CAPTCHA、不登录账户,也不绕过封锁或付费墙。模型随后可以依赖其他来源,或说明某个页面不可用。
MCP 服务器:常见问题
是否有官方的 LLMWebSearch MCP 包或托管端点?
没有。本页面上的文件就是集成方案:大约 50 行代码,你可以阅读和修改。它运行在你的机器上,你的密钥只会传输到我们的 API。
我应该关闭 Claude Code 内置的网页搜索吗?
无需关闭。两者都可以保留;描述会告诉模型各自的作用。当你希望结果中包含页面文本、每次搜索价格固定,或希望搜索日志集中在一个地方时,请保留我们的方案。
可以配合 OpenClaw 使用吗?
可以,作为通过 openclaw mcp add 注册的 MCP 服务器。OpenClaw 页面 给出了命令,并说明了它如何与 OpenClaw 内置的搜索提供程序并存。
服务器会保留我的搜索记录吗?
不会。它在调用之间不保留任何内容。在我们这边,我们不会用你的查询或 API 返回的内容训练任何模型,也不会自行添加任何禁止存储结果的规则;你读取的页面所属网站的权利仍然适用。
来源 (1)
- 通过 MCP 将 Claude Code 连接到工具 — Claude Code docs (read 2026-10-22)