mcpField
P
PageMap

PageMap

本地服务
github.com/Retio-ai浏览器自动化3623 周前更新

关于 PageMap

PageMap 将原始 HTML 转换为结构化的页面地图,供 AI Agent 读取和操作网页,可作为 MCP 服务、Python SDK 或命令行工具使用。相比完整 HTML 或无障碍树,它大幅减少每页的 token 消耗,并支持点击、输入等交互。

主要功能

  1. 01将 HTML 压缩为带编号引用的结构化页面地图
  2. 0213 个 MCP 工具覆盖浏览与交互流程
  3. 03自动识别 16 种页面类型
  4. 04内置 30 多个电商网站的结构化提取
  5. 05检测登录、验证码等阻碍并给出提示

适用场景

  1. 01Agent 在电商网站比较商品价格与规格
  2. 02在多页面会话中完成表单填写与导航
  3. 03抓取资讯或文档页面的结构化内容

MCP 相关

PageMap 是 MCP 服务,向 MCP 客户端暴露网页读取、点击、输入、标签页管理及截图等工具。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"retio-ai-pagemap": {
"command": "uvx",
"args": [
"retio-pagemap"
]
}
}
}
启动命令uvx retio-pagemap

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypiretio-pagemap0.7.3
ocidocker.io/retio1001/pagemap:0.7.3

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

PageMap

PageMap 可将原始 HTML(100K+ 个令牌)转换为结构化、便于 AI 读取的页面地图(2-5K 个令牌),减少 97% 的令牌用量。它可作为 MCP 服务、Python SDK 和 CLI 使用,支持 16 种页面类型和 30 多个电商网站。Agent 可以读取、点击、输入并浏览任意网页。

“让你的 Agent 在网上看得见、动得了。”

CI PyPI Python License: AGPL-3.0 Docker Awesome MCP Servers


为什么选择 PageMap?

Playwright MCP 会为每个页面生成 50-540KB 的无障碍快照,浏览 2-3 个页面后就会撑满上下文窗口。Firecrawl 和 Jina 会将 HTML 转换为 Markdown,但只能读取,无法交互。

PageMap 为你的 Agent 提供任意网页的精简、可操作视图:

PageMapPlaywright MCPFirecrawlJina Reader
每页令牌数2-5K6-50K10-50K10-50K
交互方式点击 / 输入 / 选择 / 悬停原始树解析只读只读
多页会话无限浏览 2-3 页后失效不适用不适用
任务成功率(94 项任务)84.7%61.5%64.5%57.8%
每项任务平均令牌数2,71013,73713,88811,424
94 项任务的成本$1.06$4.09$3.98$2.26

在 11 个电商网站、94 项静态任务和 7 种条件下进行基准测试。8,100 多项测试通过。


快速开始

首次使用时会自动安装 Chromium,无需手动运行 playwright install。

安装
pip install retio-pagemap
MCP 客户端配置

添加到 Claude Code、Cursor、Windsurf 或 Claude Desktop:

{
  "mcpServers": {
    "pagemap": {
      "command": "uvx",
      "args": ["retio-pagemap"]
    }
  }
}

Claude Desktop(macOS):使用 uvx 的绝对路径——运行 which uvx(例如 /opt/homebrew/bin/uvx)。

VS Code(Copilot):在 .vscode/mcp.json 中使用 "servers",而不是 "mcpServers"。

Docker
docker run -p 8000:8000 retio1001/pagemap --transport http

功能

13 个 MCP 工具——读取与交互

不只是读取——你的 Agent 还能点击按钮、填写表单、选择选项、管理标签页并跨页面浏览。13 个工具覆盖完整的浏览工作流:

get_page_map · execute_action · fill_form · scroll_page · wait_for · take_screenshot · get_page_state · navigate_back · batch_get_page_map · open_tab · switch_tab · list_tabs · close_tab

16 种自动检测的页面类型

PageMap 会自动对页面分类,并针对每种类型采用优化的提取方式:

product_detail · listing · search_results · article · news · video · login · form · checkout · dashboard · help_faq · settings · error · documentation · landing · blocked

全面覆盖电商网站

内置支持 4 个类别的 30 多个主要电商网站:

  • 全球大型平台 — Amazon、eBay、AliExpress、SHEIN、Walmart、Rakuten
  • 全球时尚品牌 — Zara、H&M、Nike、Uniqlo、ASOS、Zalando、SSENSE、Farfetch、COS
  • 韩国 — Coupang、Naver Shopping、Musinsa、29CM、W Concept、SSG、11st
  • 日本/中国 — ZOZO、Tmall、JD.com、Taobao

结构化提取价格、选项(尺码/颜色)、评分和库存情况,并自动处理 Cookie 同意提示及检测登录拦截。

智能恢复

PageMap 可检测问题,并告知 Agent 应采取的操作:

  • 障碍检测 — 需要登录?被机器人拦截?缺货?需要年龄验证?弹窗覆盖层?PageMap 会添加一个 barrier 字段,其中包含诊断结果和建议的后续步骤
  • 自动关闭 Cookie 同意提示 — 自动检测 7 个 CMP 提供商(Cookiebot、OneTrust、TrustArc、Didomi、Quantcast、Usercentrics,以及通用回退方案)。采用 5 层关闭流程:CMP JS API → 拒绝 → 接受 → 忽略 → 关闭符号。默认采用 GDPR 优先拒绝策略
  • 弹窗覆盖层检测 — 通过 AX 树 role="dialog" 和 HTML 正则表达式进行两阶段检测。自动关闭促销弹窗(新闻通讯、退出意图)
  • 机器人检测提示 — 可检测 Cloudflare、Turnstile、reCAPTCHA、hCaptcha 和 Akamai。报告提供商,并建议等待/重试策略
  • 过期引用恢复 — 当 DOM 变化导致引用失效时,PageMap 会返回明确的重新获取指引
内容智能
  • 8 种 JSON-LD schema — Product、NewsArticle、VideoObject、FAQPage、Event、LocalBusiness、BreadcrumbList 和 ItemList
  • 元数据提取 — 从结构化数据和 DOM 回退方案中提取价格、评分、评论、描述和图片
  • 两层缓存 — 命中缓存(约 10 ms)、刷新内容(约 500 ms)、完整重建(约 1.5 s)。对未变化的部分进行基于差异的更新
  • 增量证据包输出 - 可选的 to_delta_packet() 序列化器会输出与摘要绑定的证据单元、声明候选项、来源信息和权威性标记,供下游记忆/审核系统使用,且不会改变默认 MCP 输出
支持 10 种语言

根据 URL 自动检测区域设置。针对 CJK 脚本调整令牌预算。

语言区域设置语言区域设置
英语en中文zh
韩语ko西班牙语es
日语ja意大利语it
法语fr葡萄牙语pt
德语de荷兰语nl

部署

本地(STDIO)

默认模式。作为本地 MCP 服务运行,无需设置服务。

retio-pagemap
Docker
docker run -p 8000:8000 retio1001/pagemap --transport http

可在 Docker Hub 和 GitHub Container Registry 获取多架构映像(amd64/arm64)。


Python API

import asyncio
from pagemap.browser_session import BrowserSession
from pagemap.delta_serializer import to_delta_packet
from pagemap.page_map_builder import build_page_map_live
from pagemap.serializer import to_agent_prompt, to_json

async def main():
    async with BrowserSession() as session:
        page_map = await build_page_map_live(session, "https://example.com/product/123")
        print(to_agent_prompt(page_map))   # Agent-optimized text format
        print(to_json(page_map))           # Structured JSON
        print(to_delta_packet(page_map))   # Digest-bound evidence packet
        print(page_map.page_type)          # "product_detail"
        print(page_map.interactables)      # [Interactable(ref=1, role="button", ...)]
        print(page_map.metadata)           # {"name": "...", "price": "..."}

asyncio.run(main())

用于离线处理(无需浏览器):

from pagemap.page_map_builder import build_page_map_offline

page_map = build_page_map_offline(open("page.html").read(), url="https://example.com/product/123")

安全

PageMap 将所有网页内容视为不可信输入:

  • SSRF 防护 — 采用多层防护,抵御服务端请求伪造
  • 提示词注入防护 — 内容边界、角色前缀剥离、可疑内容标记
  • 遵循 robots.txt — 符合 RFC 9309。可通过 --ignore-robots 标记选择不遵循
  • 资源保护 — DOM 节点数限制、HTML 大小限制、响应大小限制
  • 会话隔离 — 每个会话都使用独立的 Cookie 和存储,并自动清理

本地开发:默认阻止私有 IP。使用 --allow-local 或 PAGEMAP_ALLOW_LOCAL=1。

免责声明

使用 PageMap 时,用户有责任遵守目标网站的服务条款及所有适用法律。


故障排除

“spawn uvx ENOENT”(macOS 上的 Claude Desktop) — Claude Desktop 不会继承 shell 的 PATH。运行 which uvx,并在配置中使用绝对路径。

首次加载页面耗时较长 — 首次导航时,Chromium 冷启动需要约 10~30 秒。后续页面会在 1~3 秒内加载。

localhost 被阻止 — 使用 --allow-local 标记或设置 PAGEMAP_ALLOW_LOCAL=1。

未找到 Chromium — 运行 pip install retio-pagemap && playwright install chromium 手动安装。


要求

  • Python 3.11+
  • Chromium(首次使用时自动安装)

社区

有疑问或想法?欢迎加入 GitHub Discussions 参与讨论。

开发

在 GitHub Codespaces 中打开

git clone https://github.com/Retio-ai/Retio-pagemap.git
cd Retio-pagemap
uv sync --group dev
playwright install chromium
uv run pytest --tb=short -q

定价

本地(STDIO) — 永久免费。可自托管,基于 AGPL-3.0 开源。

云 API — 托管式多租户服务,提供身份验证、速率限制和基于额度的计费。如需使用权限,请联系 [email protected]。

许可证

AGPL-3.0-only — 完整文本请参见 LICENSE。

如需了解商业许可选项,请联系 [email protected]。


面向 Agent

本节面向使用 PageMap 作为 MCP 工具的 AI Agent。

工具
工具使用时机
get_page_map从这里开始。 导航到某个 URL,并获取包含编号引用的完整结构化页面地图。
execute_action使用上次 get_page_map 返回的引用编号进行点击、输入、选择或悬停。
fill_form一次调用填写多个表单字段。比依次调用 execute_action 更高效。
get_page_state查看当前 URL 和标题,无需完整重建页面地图。适用于可能触发导航的操作之后。
scroll_page滚动页面以显示延迟加载的内容,然后再次调用 get_page_map。
wait_for等待动态内容出现(例如搜索或提交表单后)。
take_screenshot当仅凭 PageMap 无法明确判断时,捕获页面的视觉状态。
navigate_back返回浏览器历史记录中的上一步。
open_tab打开新的浏览器标签页并导航到指定 URL。
switch_tab按索引切换到其他已打开的标签页。
list_tabs列出所有已打开标签页的 URL 和标题。
close_tab按索引关闭标签页。
batch_get_page_map并行获取多个 URL。适用于比较任务。
输出格式
URL: https://example.com/product/123
Title: Product Name
Type: product_detail          # auto-detected page type

## Actions
[1] button: Add to cart (click)
[2] select: Size (select) — options: S, M, L, XL
[3] link: See all reviews (click)
...

## Info
Price: $49.99
Rating: 4.5 / 5 (128 reviews)
Description: ...

## Images
  [1] https://cdn.example.com/product.jpg

## Meta
Tokens: ~1,800 | Interactables: 24 | Generation: 380ms
  • ## Actions — 页面上的每个交互元素及其稳定的 ref 编号。
  • ## Info — 从 HTML 中提取的页面关键信息:价格、标题、评分、描述。
  • ## Images — 产品/内容图片 URL。
  • ## Meta — Token 数量、可交互元素数量、生成时间。
障碍检测

当 PageMap 遇到页面级障碍时,会在响应中包含 barrier 字段:

State:
  barrier: login_required
  barrier_hint: "Login form detected with email + password fields. Use fill_form to authenticate."

可能的障碍:cookie_consent、login_required、bot_blocked、out_of_stock、empty_results、error_page、age_verification、region_restricted、popup_overlay。

遇到障碍时: 按照 barrier_hint 中的指引操作。对于 bot_blocked,请等待后重试。对于 login_required,请使用 fill_form 填写凭据。

Ref 生命周期

引用由 get_page_map 分配,并且在页面状态发生变化前保持有效。

以下情况会导致引用失效:

  • 页面导航到新的 URL
  • 发生 DOM 变化(打开模态框、SPA 导航、切换手风琴菜单)
  • execute_action 导致页面级变化

遇到过期引用错误时: 再次调用 get_page_map 获取新的引用,然后重试。

Token 预算行为

当页面超出 Token 预算时,内容将按以下顺序删减:

  1. 首先移除导航菜单、页脚和侧边栏
  2. 缩减次要正文内容
  3. 始终保留 ## Actions 和 ## Info

如果发现缺少关键信息,请尝试使用 scroll_page 加载延迟内容,然后再次调用 get_page_map。

推荐工作流
1. get_page_map(url)          → read Actions + Info, pick refs
2. execute_action(ref, ...)   → interact
3. get_page_state()           → confirm navigation occurred
4. get_page_map(new_url)      → get fresh refs for next step

对于包含动态内容的页面(搜索结果、筛选器):

1. get_page_map(url)
2. execute_action(ref, "click")    → trigger search/filter
3. wait_for(text="results")        → wait for content
4. get_page_map(url)               → get updated map
已知限制
  • 需要登录的页面 — PageMap 不管理会话或 Cookie。必须通过外部方式处理身份验证。
  • 强力机器人检测(Cloudflare、Akamai)— 可能会阻止自动访问。PageMap 会检测提供方并建议应对策略,但无法绕过主动的机器人防护。
  • 访问专用网络 — 默认禁止。需要使用 --allow-local 标志。
  • iframe — 由于浏览器安全策略,无法访问跨源 iframe。

PageMap — 面向 Agent 时代的结构化 Web 智能。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。