{"_id":"@alaxlee/mcp-rendered-fetch-server","_rev":"7-90b6ad57c253997f28f8dd15b822a6b3","name":"@alaxlee/mcp-rendered-fetch-server","dist-tags":{"latest":"1.2.1-hotfix.1"},"versions":{"1.0.0":{"name":"@alaxlee/mcp-rendered-fetch-server","version":"1.0.0","keywords":[],"author":{"name":"alax"},"license":"MIT","_id":"@alaxlee/mcp-rendered-fetch-server@1.0.0","maintainers":[{"name":"alaxlee","email":"windsteering@gmail.com"}],"contributors":[{"url":"zach.dev","name":"Zach Caceres"},{"url":"ilintar@gmail.com","name":"Piotr Wilkin"}],"bin":{"mcp-rendered-fetch-server":"dist/index.js"},"dist":{"shasum":"ecec578605e7077a59754e472b5c34765d9e6fe9","tarball":"https://registry.npmjs.org/@alaxlee/mcp-rendered-fetch-server/-/mcp-rendered-fetch-server-1.0.0.tgz","fileCount":6,"integrity":"sha512-cYI3g3Xs8ZjdOtET3U3NDqtO8z9IuNVpEyFRuL5vitqyS97FjNPOAlyu4AkIttjW73Xd7+jTP0fsSFCa7hJYOw==","signatures":[{"sig":"MEQCIHhSfwjgyh/JQWpvfP0CTAPicbrEAgWmykfeMIqL00xoAiA11NsZ4fcicmHsB80IaA51ZY/cFQgtt0RBhQwmPlzWsA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10103},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"884cb8b2e794564088d2a81779957f302002c40a","scripts":{"dev":"tsc --watch","test":"jest","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","prepare":"npm run build","postinstall":"npx playwright install"},"_npmUser":{"name":"alaxlee","email":"windsteering@gmail.com"},"_npmVersion":"10.8.2","description":"An MCP server that returns JS-rendered HTML via Playwright (inspired by zcaceres)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"zod":"^3.24.1","playwright":"^1.49.0","private-ip":"^3.0.2","@modelcontextprotocol/sdk":"^1.0.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"shx":"0.4.0","jest":"^29.7.0","ts-jest":"^29.2.5","typescript":"^5.7.2","@types/jest":"^29.5.14","@types/node":"^22.10.2"},"_npmOperationalInternal":{"tmp":"tmp/mcp-rendered-fetch-server_1.0.0_1764932175396_0.49990919240799525","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@alaxlee/mcp-rendered-fetch-server","version":"1.1.0","keywords":[],"author":{"name":"alax"},"license":"MIT","_id":"@alaxlee/mcp-rendered-fetch-server@1.1.0","maintainers":[{"name":"alaxlee","email":"windsteering@gmail.com"}],"contributors":[{"url":"zach.dev","name":"Zach Caceres"},{"url":"ilintar@gmail.com","name":"Piotr Wilkin"}],"bin":{"mcp-rendered-fetch-server":"dist/index.js"},"dist":{"shasum":"6a18fd9a007b2c03d09bd3dc410f054d1118ef58","tarball":"https://registry.npmjs.org/@alaxlee/mcp-rendered-fetch-server/-/mcp-rendered-fetch-server-1.1.0.tgz","fileCount":6,"integrity":"sha512-vu0fX0HjETNqwLvoOmWNdL+mqOdkRC28cd9FuLBlmWDobNXi0ARVmVYU3YaxJqESQa/Kb+dYOKWNTyawfMXcgQ==","signatures":[{"sig":"MEYCIQDUmyaN2evOV3eD2FUGlwvWgYWPApBPTyV0qVGHTF/4RwIhAKNdkAFMXvlcDs4uJUAtrHQM9kswTJoasf0+q1FQcXbT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12536},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"ffd3ea1a2c9764635ee239f5d9575ed9e97d484a","scripts":{"dev":"tsc --watch","test":"jest","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","prepare":"npm run build","postinstall":"npx playwright install"},"_npmUser":{"name":"alaxlee","email":"windsteering@gmail.com"},"_npmVersion":"10.8.2","description":"An MCP server that returns JS-rendered HTML via Playwright (inspired by zcaceres)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"zod":"^3.24.1","playwright":"^1.49.0","private-ip":"^3.0.2","@modelcontextprotocol/sdk":"^1.0.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"shx":"0.4.0","jest":"^29.7.0","ts-jest":"^29.2.5","typescript":"^5.7.2","@types/jest":"^29.5.14","@types/node":"^22.10.2"},"_npmOperationalInternal":{"tmp":"tmp/mcp-rendered-fetch-server_1.1.0_1765351094651_0.6127807917509214","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@alaxlee/mcp-rendered-fetch-server","version":"1.1.1","keywords":[],"author":{"name":"alax"},"license":"MIT","_id":"@alaxlee/mcp-rendered-fetch-server@1.1.1","maintainers":[{"name":"alaxlee","email":"windsteering@gmail.com"}],"contributors":[{"url":"zach.dev","name":"Zach Caceres"},{"url":"ilintar@gmail.com","name":"Piotr Wilkin"}],"bin":{"mcp-rendered-fetch-server":"dist/index.js"},"dist":{"shasum":"08738694d396a61312d553beec3178f5629e0d92","tarball":"https://registry.npmjs.org/@alaxlee/mcp-rendered-fetch-server/-/mcp-rendered-fetch-server-1.1.1.tgz","fileCount":6,"integrity":"sha512-uzD0K4R3jaIg/Pgs2TbdIb+0l3MbZHtUVKdg3oVKt9zsdaDFIWHw6B9F49DKFjs6jARC6d52/VWW/UW1+tF92Q==","signatures":[{"sig":"MEYCIQC/BK8KvzYA3YUtUdD+kn+bStEdDvCDWa5zahx8bfboIwIhAO3tc9n2Ew/uM1W08QLtGA3m4W/Yufi9Q+Xn4T3gThKT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13017},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"8f4725656aeee1ccb85edb01740cfb28c140b748","scripts":{"dev":"tsc --watch","test":"jest","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","prepare":"npm run build","postinstall":"npx playwright install"},"_npmUser":{"name":"alaxlee","email":"windsteering@gmail.com"},"_npmVersion":"10.8.2","description":"An MCP server that returns JS-rendered HTML via Playwright (inspired by zcaceres)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"zod":"^3.24.1","playwright":"^1.49.0","private-ip":"^3.0.2","@modelcontextprotocol/sdk":"^1.0.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"shx":"0.4.0","jest":"^29.7.0","ts-jest":"^29.2.5","typescript":"^5.7.2","@types/jest":"^29.5.14","@types/node":"^22.10.2"},"_npmOperationalInternal":{"tmp":"tmp/mcp-rendered-fetch-server_1.1.1_1765356624808_0.9931226180359227","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@alaxlee/mcp-rendered-fetch-server","version":"1.2.0","keywords":[],"author":{"name":"alax"},"license":"MIT","_id":"@alaxlee/mcp-rendered-fetch-server@1.2.0","maintainers":[{"name":"alaxlee","email":"windsteering@gmail.com"}],"contributors":[{"url":"zach.dev","name":"Zach Caceres"},{"url":"ilintar@gmail.com","name":"Piotr Wilkin"}],"bin":{"mcp-rendered-fetch-server":"dist/index.js"},"dist":{"shasum":"aaf888da21d33ccbc7fa332b549a1f94f9c8202b","tarball":"https://registry.npmjs.org/@alaxlee/mcp-rendered-fetch-server/-/mcp-rendered-fetch-server-1.2.0.tgz","fileCount":6,"integrity":"sha512-EuQarkrxCxS8relxVo5KIKkSDpxc1KnZUhISpoyLiCJOEe4fPymV0td8ETcY9ONCgVCvgef0m/MCg9YRN8MihQ==","signatures":[{"sig":"MEQCIDQCn+2X+vRhKq8CbYpXwvlllDbDJeI075GmTcSkg0R0AiBKJXAk2G2zQ5GirUKHGap3+NHT1vzjdOIUO3jFZ6xizA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17177},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"a898e5cca6d35234417b73d5a154e83ed58ac09b","scripts":{"dev":"tsc --watch","test":"jest","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","prepare":"npm run build","postinstall":"npx playwright install"},"_npmUser":{"name":"alaxlee","email":"windsteering@gmail.com"},"_npmVersion":"10.8.2","description":"An MCP server that returns JS-rendered HTML via Playwright (inspired by zcaceres)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"zod":"^3.24.1","playwright":"^1.49.0","private-ip":"^3.0.2","@modelcontextprotocol/sdk":"^1.0.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"shx":"0.4.0","jest":"^29.7.0","ts-jest":"^29.2.5","typescript":"^5.7.2","@types/jest":"^29.5.14","@types/node":"^22.10.2"},"_npmOperationalInternal":{"tmp":"tmp/mcp-rendered-fetch-server_1.2.0_1765367132356_0.19911924114189872","host":"s3://npm-registry-packages-npm-production"}},"1.2.1-hotfix.1":{"name":"@alaxlee/mcp-rendered-fetch-server","version":"1.2.1-hotfix.1","description":"An MCP server that returns JS-rendered HTML via Playwright (inspired by zcaceres)","type":"module","main":"dist/index.js","license":"MIT","author":{"name":"alax"},"contributors":[{"name":"Zach Caceres","url":"zach.dev"},{"name":"Piotr Wilkin","url":"ilintar@gmail.com"}],"scripts":{"build":"tsc && shx chmod +x dist/*.js","prepare":"npm run build","dev":"tsc --watch","start":"node dist/index.js","test":"jest","postinstall":"npx playwright install"},"bin":{"mcp-rendered-fetch-server":"dist/index.js"},"engines":{"node":">=18"},"publishConfig":{"access":"public"},"keywords":[],"dependencies":{"@modelcontextprotocol/sdk":"^1.0.4","private-ip":"^3.0.2","zod":"^3.24.1","playwright":"^1.49.0"},"devDependencies":{"@types/jest":"^29.5.14","@types/node":"^22.10.2","jest":"^29.7.0","ts-jest":"^29.2.5","typescript":"^5.7.2","shx":"0.4.0"},"gitHead":"1c05e6d34eeddc05dc6e8f3abb4c6f80ea27ac61","_id":"@alaxlee/mcp-rendered-fetch-server@1.2.1-hotfix.1","_nodeVersion":"22.18.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-GTvU4Qq/5bwYMTT/5DpHjCU7Y2yw9d87x6gwIsLDSrGtq2Zi+EyGDWB1hPw8NkgT3fM4mhvhwp0vq/wUUMCGZg==","shasum":"c3879fbbbe9260be26794010b6fd2bcba4698dbb","tarball":"https://registry.npmjs.org/@alaxlee/mcp-rendered-fetch-server/-/mcp-rendered-fetch-server-1.2.1-hotfix.1.tgz","fileCount":6,"unpackedSize":17236,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICoppoEmzb8GqrZSjwJpgmVctMjvkC/OBlfdVCIgdi1bAiEAmJ/AuaqzmvCzKHcLqrX4XUws8sOIFuNB7Ul2pyKgqnw="}]},"_npmUser":{"name":"alaxlee","email":"windsteering@gmail.com"},"directories":{},"maintainers":[{"name":"alaxlee","email":"windsteering@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-rendered-fetch-server_1.2.1-hotfix.1_1765384060654_0.5948095246465872"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-05T10:56:15.300Z","modified":"2025-12-10T16:27:40.990Z","1.0.0":"2025-12-05T10:56:15.551Z","1.1.0":"2025-12-10T07:18:14.793Z","1.1.1":"2025-12-10T08:50:24.965Z","1.2.0":"2025-12-10T11:45:32.498Z","1.2.1":"2025-12-10T16:00:01.793Z","1.2.1-hotfix.1":"2025-12-10T16:27:40.792Z"},"author":{"name":"alax"},"license":"MIT","keywords":[],"description":"An MCP server that returns JS-rendered HTML via Playwright (inspired by zcaceres)","contributors":[{"name":"Zach Caceres","url":"zach.dev"},{"name":"Piotr Wilkin","url":"ilintar@gmail.com"}],"maintainers":[{"name":"alaxlee","email":"windsteering@gmail.com"}],"readme":"# Fetch MCP Server\r\n\r\n![fetch mcp logo](logo.jpg)\r\n\r\n一个精简版 MCP 服务器，仅提供经无头浏览器渲染后的页面 HTML 抓取能力。\r\n\r\n本工程参考并致敬原项目 zcaceres/fetch（作者 Zach Caceres），并感谢贡献者 Piotr Wilkin；在其基础上进行精简与改造，仅保留渲染后 HTML 抓取工具。\r\n\r\n[NPM](https://www.npmjs.com/package/@alaxlee/mcp-rendered-fetch-server)\r\n\r\n<a href=\"https://glama.ai/mcp/servers/nu09wf23ao\">\r\n  <img width=\"380\" height=\"200\" src=\"https://glama.ai/mcp/servers/nu09wf23ao/badge\" alt=\"Fetch Server MCP server\" />\r\n</a>\r\n\r\n## 工具\r\n\r\n- `fetch_rendered_html`\r\n  - 功能：使用 Playwright 的 Chromium 渲染页面并返回当前 DOM 的完整 HTML（类似浏览器看到的页面）\r\n  - 输入参数：\r\n    - `url`（string，必填）：要抓取的页面 URL\r\n    - `headers`（object，可选）：请求时附加的自定义 headers\r\n    - `max_length`（number，可选）：返回内容最大字符数，默认从环境变量控制（默认 5000，`0` 表示不限制）\r\n    - `start_index`（number，可选）：从该字符索引开始返回内容，默认 `0`\r\n    - `wait_ms`（number，可选）：页面加载完成后额外等待的毫秒数，用于等待客户端渲染，默认 `2000`\r\n    - `simplify`（boolean，可选）：是否启用精简模式，默认 `false`\r\n    - `include_iframes`（boolean，可选）：是否将每个 `<iframe>` 的页面 HTML 直接写入最终 HTML 中对应的 `<iframe>` 标签内部（不改动 `src/srcdoc`），以便一次性查看完整页面。跨域 `iframe` 也支持。若子页面指向私网地址，则不抓取真实内容，改为在标签内部写入占位文本。默认 `false`\r\n  - 返回：`{ content: [{ type: \"text\", text: \"<html>...</html>\" }], isError: false }`\r\n\r\n## 安全\r\n\r\n- 自动阻止访问私有 IP（如 `127.0.0.1`、`10.x.x.x`、`192.168.x.x` 等），防止本地数据被外泄\r\n- 统一设置桌面浏览器 `User-Agent`，可通过 `headers` 叠加自定义头\r\n\r\n## 快速开始\r\n\r\n1. 克隆仓库\r\n2. 安装依赖：`npm install`\r\n3. 构建：`npm run build`\r\n4. 运行：`npm start`\r\n\r\n服务器通过 stdio 提供 MCP 能力。\r\n\r\n### 示例调用（工具入参）\r\n\r\n客户端调用工具 `fetch_rendered_html` 时，传参示例：\r\n\r\n```json\r\n{\r\n  \"name\": \"fetch_rendered_html\",\r\n  \"arguments\": {\r\n    \"url\": \"https://example.com\",\r\n    \"simplify\": true,\r\n    \"include_iframes\": true,\r\n    \"wait_ms\": 2000,\r\n    \"max_length\": 50000,\r\n    \"start_index\": 0\r\n  }\r\n}\r\n```\r\n\r\n### 参数默认值速览\r\n\r\n- `headers`：不设置（可选）\r\n- `max_length`：默认 `DEFAULT_LIMIT`（环境变量，默认 `5000`；设为 `0` 表示不限制）\r\n- `start_index`：默认 `0`\r\n- `wait_ms`：默认 `2000`\r\n- `simplify`：默认 `false`\r\n- `include_iframes`：默认 `false`\r\n\r\n## 环境变量\r\n\r\n- `DEFAULT_LIMIT`：默认内容长度限制（字符数），设置为 `0` 表示不限制，默认 `5000`\r\n\r\n## 在桌面应用中使用\r\n\r\n将以下配置加入你的应用（示例）：\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"fetch\": {\r\n      \"command\": \"npx\",\r\n      \"args\": [\"@alaxlee/mcp-rendered-fetch-server\"],\r\n      \"env\": {\r\n        \"DEFAULT_LIMIT\": \"50000\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n客户端调用工具名为 `fetch_rendered_html`。\r\n\r\n## 功能特性\r\n\r\n- 使用 Playwright 的 Chromium 渲染并返回页面 HTML\r\n- 支持自定义请求头、长度与起始位置控制、渲染后额外等待（`wait_ms`）\r\n- 可选精简模式：截断脚本、样式与超长属性值，降低返回体大小\r\n- 可选 iframe 内容嵌入：将子页面的 HTML 写入对应 `<iframe>` 标签内部（不改动属性）\r\n- 阻止私有 IP 访问，提升安全性\r\n\r\n## 精简模式说明（`simplify: true`）\r\n\r\n启用后在浏览器端对当前 DOM 进行以下精简，再返回 HTML：\r\n\r\n- `<script>` 内联内容仅保留前 100 个字符，后面追加 `...后续已忽略`\r\n- `<script>` 与 `<style>` 的内联内容仅保留前 100 个字符，后面追加 `...后续已忽略`\r\n- 所有元素的属性值长度超过 1000 时，仅保留前 100 个字符，后面追加 `...后续已忽略`\r\n\r\n精简在渲染完成与额外等待（`wait_ms`）之后执行，随后再获取页面内容并应用 `max_length` 与 `start_index` 截断。\r\n\r\n## iframe 内容嵌入说明（`include_iframes: true`）\r\n\r\n- 遍历所有子 frame，读取其 HTML 并将内容写入最终 HTML 中对应 `<iframe>` 标签的内部（`innerHTML`），不修改 `src/srcdoc` 等属性\r\n- 私网地址的 frame 不会嵌入真实内容，改为在标签内部写入占位文本 `[Blocked private IP content]`\r\n- 若启用精简模式，子 frame 内也会进行脚本、样式与长属性值的截断\r\n\r\n## 依赖与浏览器安装提示\r\n\r\n- 依赖：`@modelcontextprotocol/sdk`、`playwright`、`zod`、`private-ip`\r\n- 若首次运行遇到浏览器缺失错误，可执行：`npx playwright install`\r\n\r\n## 开发\r\n\r\n- `npm run dev`：启动 TypeScript 编译器 watch 模式\r\n- `npm test`：运行测试用例\r\n\r\n## 许可证\r\n\r\nMIT\r\n\r\n## 致谢\r\n\r\n- 参考项目：zcaceres/fetch\r\n- 原作者：Zach Caceres（zach.dev）\r\n- 贡献者：Piotr Wilkin（ilintar@gmail.com）\r\n","readmeFilename":"README.md"}