# 适用于 Claude Code、Claude Desktop、Cursor 及其他 MCP 客户端的网页搜索 MCP server

> 适用于 Claude Code、Claude Desktop 和 Cursor 的网页搜索 MCP server：一个简短的 Python 文件，包含 search_web 和 read_urls 工具，一条命令即可注册。无需 KYC。

- URL: https://llmwebsearch.com/zh/docs/mcp/
- 最后更新: 2026-10-22
- 发布者: LLMWebSearch (https://llmwebsearch.com)

为任意 MCP 客户端提供两个工具：`search_web`，返回已读取热门页面的排序来源；以及 `read_urls`，读取模型已有的链接。该 server 是一个 Python 文件，在你自己的机器上运行，密钥放在其环境变量中。

**快速回答 — 如何将网页搜索 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]`，读者也可以核查该页面。

*llmwebsearch_mcp.py*

```python
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`。

*安装并启动一次*

```bash
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 Code 中注册 server*

```bash
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 设置中要求同样的三项内容：命令、其参数和环境变量。密钥绝不会出现在工具参数或对话中。

*claude_desktop_config.json*

```json
{
  "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 页面](https://llmwebsearch.com/zh/docs/openclaw/) 给出了命令，并说明了它如何与 OpenClaw 内置的搜索提供程序并存。

### 服务器会保留我的搜索记录吗？

不会。它在调用之间不保留任何内容。在我们这边，我们不会用你的查询或 API 返回的内容训练任何模型，也不会自行添加任何禁止存储结果的规则；你读取的页面所属网站的权利仍然适用。

## 来源

1. [通过 MCP 将 Claude Code 连接到工具](https://code.claude.com/docs/en/mcp) — Claude Code docs (read 2026-10-22)

---

LLMWebSearch: LLMWebSearch 是一款面向 AI 智能体的网页搜索 API，返回排序后的搜索结果，并附带热门页面的 Markdown 格式内容，采用加密货币支付，无需上传证件。预付费积分低至 US$1.20/千次搜索，永不过期。无 KYC——无需证件、无需自拍、无需提交任何文件。加密货币支付。
