快速回答
如何通过 MCP 为 Claude Desktop 或 Cursor 添加网页读取工具?
运行一个小型 MCP server,暴露一个调用 WebReaderAPI 的 read_url 工具,然后在客户端的 MCP 设置中注册它,并把密钥放在 env 中。之后模型就能把任意公开网页读取为干净的 Markdown。每次网页读取消耗 1 积分,使用浏览器时为 2 积分,截至 2026 年 10 月,起步价为 US$0.07/千页。无需 KYC;使用加密货币支付。
MCP server 概览
| 语言 | Python 3.10+,使用 mcp 和 httpx 包 |
|---|---|
| 传输方式 | stdio:客户端以本地进程方式启动该 server |
| 工具 | read_url(url, max_chars) → 标题、来源 URL,然后是页面的 Markdown |
| 为什么不用 web_fetch | Claude Code 和 OpenClaw 已内置一个同名工具 |
| 密钥 | 在 server 的环境变量中从 WEBREADER_API_KEY 读取 |
| 计费 | 1 积分 = 读取 1 个页面且无需浏览器;当页面需要浏览器渲染 JavaScript 时为 2 积分。失败的请求,或被网站 robots.txt 拒绝的请求,不扣费 |
为什么用 read_url 工具而不是 web_fetch?
因为两个同名工具会让客户端和模型都混淆。Claude Code 和 OpenClaw 已内置一个名为 web_fetch 的工具。一个不同的名字 read_url 和清晰的描述,能让模型在需要网页正文(包括 JavaScript 页面和 PDF)时选择我们的工具。
该工具返回文本,而不是 JSON。模型处理简短的头部和 Markdown 比处理嵌套字段更好,而且头部会让来源 URL 始终可见,以便答案引用。
import os
import httpx
from mcp.server.fastmcp import FastMCP
API = "https://webreaderapi.com/api/v1/read"
KEY = os.environ["WEBREADER_API_KEY"]
mcp = FastMCP("webreaderapi")
@mcp.tool()
def read_url(url: str, max_chars: int = 20000) -> str:
"""Read a public web page and return its main content as Markdown.
Use it when the user gives a link or when a page must be read to answer.
max_chars caps the length of the returned text (1,000 to 500,000).
"""
params = {"url": url, "max_chars": max(1000, min(int(max_chars), 500000))}
try:
resp = httpx.get(API, params=params, headers={"Authorization": "Bearer " + KEY}, timeout=75)
except httpx.HTTPError as exc:
return "Network error while reading the page: " + str(exc)
body = resp.json()
if resp.status_code != 200:
err = body.get("error", {})
return "Could not read the page: " + err.get("code", str(resp.status_code)) + ". " + err.get("message", "")
title = body.get("title") or url
return "# " + title + "\nSource: " + body.get("final_url", url) + "\n\n" + body.get("markdown", "")
if __name__ == "__main__":
mcp.run()
如何安装和测试该 server?
创建一个虚拟环境,安装 mcp 和 httpx,并保存上面的文件。mcp 包是 Model Context Protocol 的官方 Python SDK;FastMCP 会把带类型标注的 Python 函数转成工具,并以 docstring 作为其描述。
在接入客户端之前,先在终端中设置好密钥并运行一次该文件。它会静默地在 stdin 上等待客户端,这意味着它已正确启动;按 Ctrl+C 停止它。
python -m venv .venv
. .venv/bin/activate
pip install "mcp[cli]" httpx
WEBREADER_API_KEY="your-key" python webreader_mcp.py如何在 Claude Desktop 中注册?
打开 Claude Desktop 的开发者设置,编辑 claude_desktop_config.json,并在 mcpServers 下添加一个条目。使用绝对路径:虚拟环境中的 Python 和 server 文件。把密钥放在 env 中,这样它永远不会出现在工具参数或对话里。重启 Claude Desktop,read_url 就会出现在工具列表中。
Cursor 从它自己的 MCP 配置文件中读取相同的 mcpServers 结构,Claude Code 可以用它的 claude mcp add 命令注册同一条命令。关于 OpenClaw,请参阅 OpenClaw 页面。
{
"mcpServers": {
"webreaderapi": {
"command": "/home/you/webreader/.venv/bin/python",
"args": ["/home/you/webreader/webreader_mcp.py"],
"env": { "WEBREADER_API_KEY": "your-key" }
}
}
}如何让页面保持在模型的上下文中?
降低 max_chars。默认的 20,000 字符对大多数文章来说足够了,并能防止长页面占满上下文。模型在一个回答中读取多个页面时,每页 8,000 到 12,000 字符效果更好。
让模型只读取它需要的页面,而不是它看到的每一个链接。在项目说明中加入一句简短的话,例如“每个问题最多读取三个页面”,就能同时控制成本和上下文。
当站点拒绝读取时会发生什么?
工具会返回一条带有错误代码的简短消息,例如 blocked_by_robots 或 target_refused,并且不会计费。我们遵守 robots.txt:我们的爬虫以 WebReaderAPI 标识自身,遵循专为其或为所有爬虫编写的规则,不读取网站禁止的页面。被拒绝的页面不扣费。如果网站拒绝我们的请求,我们会返回其答复:我们从不破解 CAPTCHA、不登录账户,也不试图绕过封锁或付费墙。然后模型可以说该页面无法供自动化读取器使用,并改用其他来源。
MCP server:常见问题
WebReaderAPI 有官方 MCP 包吗?
没有。本页面上的文件就是集成:40 行代码,你可以自己阅读、修改和运行。无需从我们这里安装任何东西,你的密钥除了在调用我们的 API 时,永远不会离开你的机器。
模型能用这个 server 搜索网页吗?
不能。read_url 读取的是你或模型已经拥有地址的页面。将其与你客户端提供的任意搜索工具配合使用;模型先搜索,然后读取重要的页面。
用这个运行一个助手需要多少费用?
每次网页读取消耗 1 积分,需要浏览器时为 2 积分。一个每天读取 50 个页面的助手每月大约消耗 1,500 积分,而 10,000 个网页(US$3.75)大约能覆盖六个月。
该 server 能离线工作吗?
不能。它每次读取页面都会调用 https://webreaderapi.com/api/v1/read,因此需要互联网访问和有效的密钥。