amenbo
amenbo ðð§
English | æ¥æ¬èª
Skims the web without making waves â a Japanese-web-native MCP server for low-impact, token-efficient web collection: outlineâsection progressive disclosure and diff-only refetches keep context small.
amenbo(ã¢ã¡ã³ã / water strider)ã¯ãClaude Code ã Codex ã®ãããªã³ãŒãã£ã³ã°ãšãŒãžã§ã³ãåãã® MCP ãµãŒããŒã§ããæ°Žé¢ã«æ³¢ãç«ãŠãã«æ»ãè«ã®ããã«ãåéå ã«è² è·ãããããå°ãªãããŒã¯ã³ã§ Web ããæ å ±ãéããŸãããšãããæ¥æ¬èªãµã€ãã«æé©åããŠããŸããMCP ã¯ã©ã€ã¢ã³ããæããªãã·ã§ã«ç°å¢ããã¯ãåãã³ã¢ãå ±æãã CLI ãšããŠã䜿ããŸã(CLIãšããŠäœ¿ãåç §)ã
ãªã amenbo ã
æ±çšã®ã¹ã¯ã¬ã€ãã³ã°ããŒã«ã®å€ãã¯è±èªåã® Web ãåæã«äœãããŠãããæ¥æ¬èªãµã€ãã§ã¯æ¬¡ã®ãããªåãããŒããèµ·ããã¡ã§ããamenbo ã¯ãããã®èª²é¡ã«å¯Ÿå¿ããŸãã
æ§é åãçããµã€ãïŒdiv ã®å ¥ãåãããŒãã«ã¬ã€ã¢ãŠããå€ãæ¥æ¬èªãµã€ãã§ããã¬ã³ããªã³ã°çµæã®ãžãªã¡ããª(èŠãç®ã®é 眮)ããæ¬æé åãæšå®ããŸã
æååãïŒShift_JIS / EUC-JP / ISO-2022-JP ãèªåå€å¥
ãµãããªïŒ
<ruby>ã®æ¯ãä»®åãé€å»ããæ¬æã®äºéåã鲿¢ç»åã§åºãæ å ±ïŒç»ååãããæé衚ããããŒäžå¿ã®ããŒãžã¯ãããã¹ãæœåºã貧匱ãªãšãèªåã§ã¹ã¯ãªãŒã³ã·ã§ããã«åãæ¿ã
è¡šã®æ¬ èœã»åŽ©ãïŒãªã³ã¯å¯åºŠã®é«ãããŒã¿è¡š(æ¯èŒè¡šãªã©)ã¯æ¬ææœåºæã«äžžããšèœã¡ãããšããããããããè¡šãæ€åºããŠå ã®äœçœ®ãžåŸ©å ããŸããæ¬æã«æ®ã£ã衚ã colspan/rowspanã»å€æ®µããããæ£èŠåããåãºã¬ãé²ããŸã
èŠåºãã®æ¶å€±ïŒèŠåºããç·šéãªã³ã¯ä»ãã©ãããŒã«å ãŸããããŒãž(Wikiç³»ãªã©)ã§ã¯æ¬ææœåºæã«èŠåºãæ§é ãäžžããšå€±ãããããšããããæ¬æãæ®ã£ãŠããç¯ã®èŠåºããæ€åºããŠå ã®äœçœ®ãžåŸ©å ããŸã(outline / section ã®æ®µéé瀺ãå®å®)
åœå äž»èŠãµã€ãïŒQiita / Zenn / note / ã¯ãŠãªããã° / Yahoo!ãã¥ãŒã¹ / PR TIMES ã«å°çšã¢ããã¿
é¡äŒŒããŒã«(å
¬åŒ fetch MCP / Jina Reader / Playwright MCP / PixelRAG pixelshot)ãšã®å®æž¬æ¯èŒã¯ãèšäºããšãŒãžã§ã³ãã®WebååŸãããŒã«æ¬¡ç¬¬ã§ããŒã¯ã³ã5000åéã£ã話ããåç
§ããŠãã ãããããŒãã¹ãšçãã°ã¯ bench/ ã«ãããŸãã
Related MCP server: Charlotte
ããŒã¯ã³ãç¯çŽããä»çµã¿
段éé瀺ïŒ
mode: outlineã§èŠåºãããªãŒãšåç¯ã®ããŒã¯ã³éã ãå ã«è¿ããå¿ èŠãªç¯ã ãsectionæå®ã§ååŸãé·å€§ãªããŒãžãäžžããšæµã蟌ã¿ãŸããCJK 察å¿ã®æ¬æãã«ãŒãã³ã°ïŒå¥èªç¹å¯åºŠãæåçš®æ¯çããªã³ã¯å¯åºŠã§ãã/åºå/ããã¿ãŒãé€å»
å·®åå¿çïŒäžåºŠååŸãã URL ã®åååŸæã倿Žãç¡ããã°
unchangedãããã°å€æŽãããç¯ã ããè¿ããŸãèªå Markdown/ç»ååæ¿ïŒå質ã¹ã³ã¢ãäœãããŒãžã ãã¹ã¯ãªãŒã³ã·ã§ããã«ããå£ãã Markdown ãèªãŸããŠåãçŽãåŸåŸ©ãé¿ããŸã
æåçš®å¥ã®ããŒã¯ã³èŠç©ãïŒæ¥æ¬èªã»éåœèªã»ããªã«æåã»çµµæåãªã©ã¯è±èªããããŒã¯ã³å䟡ãéããããæåã¯ã©ã¹å¥ã®ä¿æ°(宿ž¬ã§æ ¡æ£)ã§ããŒãžåå²ã®äºç®ãèšç®ããŸã
åéå ãžã®äœè² è·
äºæ®µãã§ããïŒãŸãçŽ ã® HTTP GETãJS æç»ãå¿ èŠãªããŒãžã ã headless ãã©ãŠã¶ã«ææ Œããã®ã§ã倧åã®ååŸã§ãã©ãŠã¶ãèµ·åããŸãã
ç€Œåæ£ããã¯ããŒã©ïŒrobots.txt ãš Crawl-Delay ãå°éãåäžãã¡ã€ã³ãžã¯çŽå + æ¢å® 1 req/ç§ïŒrobots.txt ã®ååŸããã®1ãªã¯ãšã¹ããšããŠæ°ããŸãïŒãrobots.txt ã 5xx ãè¿ããŠèŠåã確èªã§ããªããšãã¯ãRFC 9309 ã«åŸãå šé¢æåŠãšããŠæ±ããŸã(5 ååŸã«åãçŽããŸã)ããªã³ã¯åæã¯ sitemap / RSS ãåªå ãããŒãžãèããŸãã
robots.txt ã®äŸå€ã¯å©çšè ã1ä»¶ãã€èš±å¯ãããšãã ãïŒrobots.txt ãæåŠããããŒãžã§ããå©çšè ãããã§ãèŠãããšãã¯ã
fetch/screenshotã«ask_robots_override: trueïŒCLI ã¯--ask-robots-overrideïŒãä»ãããšãamenbo ãå©çšè ã«ç¢ºèªããŸããMCP ã§ã¯ã¯ã©ã€ã¢ã³ãã®ç»é¢(elicitation)ã§ãCLI ã§ã¯ç«¯æ«ã§ç¢ºèªããèš±å¯ããããã®1åã®åŒã³åºãã«éã£ãŠã確èªç»é¢ã«åºããããŒãžãšåããªãªãžã³(ã¹ããŒã ã»ãã¹ãã»ããŒããåãç¯å²)ãžã® robots.txt ã®æåŠãé©çšããŸãããå¥ã®ãªãªãžã³ãžã®è»¢éå (httpâhttps ã www ã®ä»ãå€ããå«ã)ã¯ããã® URL ã瀺ããŠæ¹ããŠç¢ºèªããŸã(1åã®åŒã³åºãã§ 3 ãªãªãžã³ãŸã§)ãåŒæ°ã ãã§ã¯åé¿ããŸãã(åŒæ°ã¯ LLM ãæžãããã)ãã¢ã¯ã»ã¹ééãš Crawl-Delay ã¯ãã®ãšããå®ããŸããèš±å¯ããŠååŸããå 容ã¯éåžžã©ãããã£ãã·ã¥ã«å ¥ããæå¹æéå ã¯ç¢ºèªãªãã§åå©çšãããŸã(å æ¹ãžã®ã¢ã¯ã»ã¹ã¯çºçããŸãã)ãbot 察çãããŠãã倧æ(Googleã»Amazonã»Xã»Facebookã»Instagramã»LinkedIn)ã¯ãèš±å¯ããŠã bot 察çã§æãããã ããªã®ã§ã確èªãåºããã«äŸå€ã®å¯Ÿè±¡å€ãšããŸãæããããåŒãïŒãµã€ãã 429 ã
Retry-Afterä»ãã®å¿çã§ååŸãæã£ããããã®ãã¹ããžã®ã¢ã¯ã»ã¹ãRetry-Afterã®æé(ç¡ããã° 30 åãæé· 24 æé)æ¢ããŸããæ¢ããŠããéã¯çžæã«ã¢ã¯ã»ã¹ãããçç±ãšåéã®æå»ã瀺ããŠå€±æããŸããæéã¯ãã£ãã·ã¥ã«æ®ãã®ã§ãMCP ãµãŒããŒãš CLI ã®éã§ãå ±æããŸãããã©ãŠã¶çµç±ã®ååŸã§ãã400 以äžã®å¿ç㯠HTTP ã®ååŸãšåãã倱æãšããŠè¿ããŸã(bot 察çã®ç»é¢ãååŸæåãšããŠè¿ããªããã)æ£çŽãª User-AgentïŒãããã§ããããšãæç€ºããŸããanti-bot åé¿ã¯å®è£ ããŸãã
ãã£ãã·ã¥ïŒETag / If-Modified-Since ã§åæ€èšŒããç¡é§ãªåååŸãé¿ããŸããæå¹æéã¯æ¢å® 15 åïŒ
AMENBO_CACHE_TTL_MSïŒã§ãCache-Controlã¯å»¶é·æ¹åã®ã¿æ¡çšããŸãïŒmax-ageã 15 åããé·ããã°ãã¡ãã䜿ããäžé 24 æéãno-storeã¯ä¿åããŸããïŒãmax-age=0ãno-cacheã§æéãçž®ããããšã¯ããŸãã â äž»èŠãµã€ãã®å®æž¬ã§ã¯ãã®å®£èšã倧åã§ãåŸããšããŒã«åŒã³åºãã®åºŠã«ååŸãã«è¡ãããšã«ãªããäœè² è·ãšããåæã厩ããããã§ã
ã€ã³ã¹ããŒã«
npm install -g amenboMarkdown ååŸ(éåžžã® fetch / links)ã¯ããã ãã§åããŸããJS æç»ãå¿
èŠãª SPA ãžã®ææ Œãã¹ã¯ãªãŒã³ã·ã§ãããªã©ããã©ãŠã¶çµç±ã®ååŸã«ã¯ã€ã³ã¹ããŒã«æžã¿ã® Google Chrome ã䜿ããŸããChrome ãç¡ãç°å¢ã§ãã©ãŠã¶çµç±ã®ååŸã䜿ãå Žåã®ã¿ãååã«äžåºŠã ãå®è¡ããŠãã ãã(Chromium ãçŽ 170MB ããŠã³ããŒãããŸã):
npx -y amenbo install-browserãŸãã¯éçºçšé:
git clone https://github.com/Rererr/amenbo.git
cd amenbo
npm install
npm run buildMCP ã¯ã©ã€ã¢ã³ããžã®ç»é²
Claude Code(--scope user ã¯å
šãããžã§ã¯ãå
±éããããžã§ã¯ãåäœãªãå€ã):
claude mcp add --scope user amenbo -- amenboCodex CLI:
codex mcp add amenbo -- amenboVS Code:
code --add-mcp '{"name":"amenbo","command":"amenbo"}'ãã®ä»ã®ã¯ã©ã€ã¢ã³ã(Cursor / Cline ãªã©)ã¯ãåã¯ã©ã€ã¢ã³ãã® MCP èšå®(Cursor: ~/.cursor/mcp.jsonãCline: MCP Servers ç»é¢ã® settings JSON)ã«æ¬¡ã®ãšã³ããªã远å ããŸã:
{
"mcpServers": {
"amenbo": {
"command": "amenbo"
}
}
}ã°ããŒãã«ã€ã³ã¹ããŒã«ãé¿ããå Žå㯠"command": "npx", "args": ["-y", "amenbo"]ãããŒã«ã«ãã«ãã䜿ãå Žå㯠"command": "node", "args": ["/path/to/amenbo/dist/server.js"] ãæå®ããŠãã ããã
stdio çµç±ã§ MCP ã® 2026-07-28(ã¹ããŒãã¬ã¹ã³ã¢)ãš 2025 ç³»ã®äž¡æ¹ã«å¿çããŸããã¯ã©ã€ã¢ã³ããã©ã¡ãã®çã話ããã«é¢ããããäžèšã®èšå®ã®ãŸãŸç¹ãããŸãã
ãšãŒãžã§ã³ãã«äœ¿ãæ¹ãæãã(æšå¥šããã³ãã)
ããŒã«å®çŸ©ã ãã§ã¯ã段éé瀺ã§åãããšãã£ãäœ¿ãæ¹ã®äœæ³ãŸã§ã¯äŒãããŸããã以äžã CLAUDE.md ã AGENTS.md ã«ã³ãããããšããšãŒãžã§ã³ãã amenbo ãå¹çãã䜿ãããã«ãªããŸãã
## WebååŸã¯ amenbo ã䜿ã
- ããŒãžååŸã¯ `fetch`(mode æ¢å® `auto`)ãé·ãããªããŒãžãäžéšããèŠããªãããŒãžã¯ã
ãŸã `mode: "outline"` ã§èŠåºããšåç¯ã®ããŒã¯ã³éã確èªããå¿
èŠãªç¯ã ã `section` æå®ã§ååŸãã
- åã URL ã®åååŸã§ `unchanged` / `diff` ãè¿ãã®ã¯æ£åžž(倿Žãªã / 倿Žç¯ã®ã¿)ã
å·®åã§ã¯ãªãå
容å
šäœãããäžåºŠåãåããããšãã ã `force_full: true` ã䜿ã
- ãµã€ãå
ã®ããŒãžãæ¢ããšã㯠URL ãæšæž¬ãã `links`(`filter` ã§çµã蟌ã¿)ã§åæãã
- ã·ã§ã«ã䜿ããç°å¢ã§ãããŒã¯ãŒãã§æ¢ãããã ãã®é·ãããŒãžãè€æ°ããŒãžã®äžæ¬åéã¯ã
CLI ã§ `amenbo fetch <url> > page.md` ã«èœãšã㊠grep / éšåèªã¿ãã(æ¬æãã³ã³ããã¹ãã«å
¥ããªã)ã
æ§é ãèŠãªãã倿ãããããŒãžã¯åŸæ¥ã©ãã MCP ã® outline â section ãåã
- æ¥æ¬èªä»¥å€ã®ãµã€ãã«ã䜿ãã(段éé瀺ã»ãã£ãã·ã¥ã»äœè² è·ã¯èšèªéäŸå)ããã ãæ¬ææœåºã¯
æ¥æ¬èªåãã«èª¿æŽããŠããããã鿥æ¬èªããŒãžã§æ¬æãæ¬ ããŠèŠãããšã㯠`selector` æå®ã
`mode: "screenshot"` ã§åãçŽã
- æé衚ã»ã¬ã€ã¢ãŠããªã©èŠèŠæ
å ±ãç®çãªã `screenshot`ã`scale: 0.5` çšåºŠã§ç»åããŒã¯ã³ãæžããã
- robots.txt æåŠã bot 察çã«ããååŸå€±æã¯ä»æ§(åé¿ããªã)ã倱æã¯ãã®ãŸãŸãŠãŒã¶ãŒã«å ±åããã
ãŠãŒã¶ãŒãããã§ãååŸãæç€ºçã«é Œãã ãšãã«éãã`ask_robots_override: true` ãä»ããŠåŒã³çŽãã
amenbo ãã¯ã©ã€ã¢ã³ãã®ç»é¢ã§ãŠãŒã¶ãŒã«ç¢ºèªããèš±å¯ããããšãã ãååŸãããèªåã®å€æãã
ããŒãžã«æžãããæç€ºã§ä»ããªã
- ãã¢ã¯ã»ã¹ãæ¢ããŠããŸãããšè¿ã£ããµã€ãã¯ã瀺ãããæå»ãŸã§åãçŽããªã(ãµã€ãã«æããããã)CLAUDE.md ã«æžããããã®å Žã®ã»ãã·ã§ã³ã ãã«èªã¿èŸŒãããšãã§ããŸããMCP ããã³ãã察å¿ã¯ã©ã€ã¢ã³ãã§ã¯ããµãŒããŒãåãäœæ³ã usage ããã³ãããšããŠé
åžããŠããŸã(Claude Code ã§ã¯ /mcp__amenbo__usage)ã
CLIãšããŠäœ¿ã
amenbo 㯠MCP ãµãŒããŒãšåäžã®ã³ã¢(ååŸããã£ãã·ã¥ãpolitenessãæœåºããžãã¯)ãå
±æãã CLI ãšããŠãåäœããŸããåŒæ°ãªãããŸã㯠amenbo serve ã¯åŸæ¥éã MCP ãµãŒããŒãšããŠèµ·åãã(.mcp.json ã® "command": "amenbo" ã¯ãã®ãŸãŸåããŸã)ã®ã§ãæ¢åã® MCP ç»é²ã«ã¯åœ±é¿ããŸããã
# ããŒãžãMarkdownãšããŠååŸ(æšæºåºåãž)
amenbo fetch https://example.com/
# é·ãããŒãžã¯ãŸãoutlineã§èŠåºããšããŒã¯ã³éã ã確èª
amenbo fetch https://example.com/ --mode outline
# åºåããã¡ã€ã«ã«èœãšã㊠grep ãéšåèªã¿(head/sed)ãã
amenbo fetch https://example.com/ > page.md
grep -A3 "æé" page.md
# ãµã€ãå
ã®ãªã³ã¯ãåæ(sitemap/RSSåªå
)
amenbo links https://example.com/ --filter "blog/*"
# ã¹ã¯ãªãŒã³ã·ã§ãã(ã¿ã€ã«PNGã¯--out-dirãžä¿åããããã¹ãæšæºåºåã«åæããã)
amenbo screenshot https://example.com/ --viewport-only --scale 0.5 --out-dir ./shotsåãµãã³ãã³ãã®è©³çŽ°ã¯ amenbo <fetch|links|screenshot> --help ãåç
§ããŠãã ããã
MCP ãš CLI ã®äœ¿ãåã:
MCPïŒãšãŒãžã§ã³ãã®äž»çµè·¯ããã©ãŠã¶ãããã»ã¹å ã§ãŠã©ãŒã ã«ä¿ãããã¹ã¯ãªãŒã³ã·ã§ããçã®ç»åãäŒè©±ãžçŽæ¥è¿ãããclaude.ai ã®ããã«ã·ã§ã«ãæããªããã¹ãã®ãšãŒãžã§ã³ãã«ãå±ã
CLIïŒã·ã§ã«ã¹ã¯ãªãããCIããããã°çšéãåºåããã¡ã€ã«ã«èœãšããŠ
grep/éšåèªã¿ãããå ŽåããŸã㯠MCP é察å¿ã®ãšãŒãžã§ã³ã/ããŒã«ãã§ãŒã³ãã䜿ãå Žåã«åãã1 ã³ãã³ã= 1 ããã»ã¹ã®ãããã©ãŠã¶ã¯æ¯åèµ·åãã
ãã£ãã·ã¥ãå·®åå¿ç(unchanged/diff)ãã¬ãŒãå¶åŸ¡(robots.txt/ãã¡ã€ã³æ¯ã®çŽåã¢ã¯ã»ã¹)ã®ç¶æ
㯠MCP ãµãŒããŒãš CLI ã§å
±æãããŸã(åã ~/.cache/amenbo ã䜿ããã)ããã ãã¬ãŒãå¶åŸ¡ã®ããã»ã¹éå
±æã¯ãã¹ããšãã©ãŒãã§ããåäžãã¡ã€ã³ãžã®çŽååã¯åããã»ã¹å
ã§ã®ã¿å³å¯ã«ä¿èšŒãããMCP ãµãŒããŒãšè€æ°ã® CLI å®è¡ãåæã«åããã¡ã€ã³ãžã¢ã¯ã»ã¹ããå Žåãæå°ééãå€å°ããæããããšããããŸãã
ããŒã«
fetch ã§ããŒãžãååŸ
ãã©ã¡ãŒã¿ | 説æ |
| ååŸå¯Ÿè±¡ URL(http/https ã®ã¿ãPDF å¯) |
|
|
| æ¬æãçµã蟌ã CSS ã»ã¬ã¯ã¿ |
| outline ã§åŸã section IDããã®ç¯ã® Markdown ã®ã¿è¿ã(ç¥å
èŠåºããããã°å¿çã« |
| ããŒãžçªå·(æ¢å® 1) |
| 1 ããŒãžã®æŠç®ããŒã¯ã³äžé(æ¢å® 8000) |
| true ã§å·®åå¿çã»å®åãããã¯é€å»ãç¡å¹åãã( |
| ãŠãŒã¶ãŒã robots.txt ã®æåŠãæ¿ç¥ã§ååŸãæç€ºçã«é Œãã ãšãã ã trueãamenbo ãã¯ã©ã€ã¢ã³ãã®ç»é¢ã§ç¢ºèªããèš±å¯ããããšãã ãååŸãã |
links ã§ãªã³ã¯ãåæ
ãã©ã¡ãŒã¿ | 説æ |
| èµ·ç¹ URL |
| URL/ãªã³ã¯ããã¹ãã®éšåäžèŽããŸã㯠|
sitemap â RSS/Atom â ããŒãžå ãªã³ã¯ã®é ã§æ¢çŽ¢ããŸãã
screenshot ã§ã¹ã¯ãªãŒã³ã·ã§ãããæ®åœ±
ãã©ã¡ãŒã¿ | 説æ |
| æ®åœ±å¯Ÿè±¡ URL(http/https ã®ã¿) |
| æ¢å® trueãfalse ã§æåã®ãã¥ãŒããŒãåã®ã¿ |
| ã¿ã€ã«å¹ px(æ¢å® 1280) |
| è§£å床ã¹ã±ãŒã« 0.5ã1.0(æ¢å® 1.0)ãå°ããã»ã©ç»åããŒã¯ã³æž |
|
|
ç°å¢å€æ°
倿° | æ¢å® | 説æ |
|
| ãã£ãã·ã¥(SQLite + PNG)ã®ä¿åå |
|
| ãã£ãã·ã¥ã®æå¹æé |
|
| ååŸããã£ã®äžéãµã€ãº |
ã»ãã¥ãªãã£
SSRF 察çïŒhttp/https 以å€ã®ã¹ããŒã (
file:,ftp:ç)ãæåŠãDNS 解決ããæ¥ç¶å ã private / loopback / link-local / äºçŽã¢ãã¬ã¹ãªãæåŠãDNS rebinding(TOCTOU)察çãšããŠå®æ¥ç¶ãæ€èšŒæžã¿ IP ã«åºå®ããŸãããã£ãµã€ãºäžéïŒå·šå€§ã¬ã¹ãã³ã¹ã«ãã OOM ã鲿¢
ãã©ãŠã¶ã®éé¢ïŒãã©ãŠã¶çµç±ã®ååŸã¯ãã€ã³ã¹ããŒã«æžã¿ã® Google Chrome(èªåæŽæ°ã§ã»ãã¥ãªãã£ä¿®æ£ãå±ããåžžé§äžã® amenbo ãžåæ ãããã®ã¯åèµ·ååŸ)ãåªå ããŠäœ¿ããç¡ãç°å¢ã«éã Playwright 忢±ã® Chromium ã䜿ããŸããDocker ã€ã¡ãŒãžã«ã¯ Chrome ãç¡ããããåžžã«å梱㮠Chromium ã䜿ããŸããã©ã¡ãã OS ã®ãµã³ãããã¯ã¹ãæå¹ã«ããŠèµ·åããŸãããããã£ãŒã«ã¯èµ·åããšã®äžæãã£ã¬ã¯ããªã§ãéåžžã®çµäºæã«åé€ãããŸã(Chrome ãç¡ãç°å¢ã§ã¯ãChrome ã®èµ·åã詊ã¿ãéã®ç©ºã®ãã£ã¬ã¯ããªãäžæãã©ã«ãã«æ®ããŸã)ãæ®æ®µã䜿ãã® Chrome ã®å±¥æŽã»Cookieã»ãã°ã€ã³ç¶æ ã«ã¯è§ŠããŸãã
æ¢ç¥ã®å¶é
æ¬ææœåºã¯æ¥æ¬èªãã¥ãŒãã³ã°ïŒæ®µéé瀺ã»ãã£ãã·ã¥ã»äœè² è·ã¯èšèªéäŸåã§ã鿥æ¬èªãµã€ãã§ãåããŸãããã ãæ¬ææœåºã®ãã¥ãŒãªã¹ãã£ãã¯ã¯æ¥æ¬èªããŒãžã§èª¿æŽããŠããããã鿥æ¬èªããŒãžã§æ¬æãæ¬ ããŠèŠãããšãã¯
selectoræå®ãmode: "screenshot"ã§åãçŽããŠãã ããHTTP ãããã·é察å¿ïŒ
HTTP_PROXY/HTTPS_PROXYçã®ç°å¢å€æ°ã¯å°éããŸãããSSRF 察çãšããŠæ¥ç¶å ãæ€èšŒæžã¿ IP ã«åºå®ããèšèš(DNS rebinding 察ç)ãšããããã·ãžåå解決ãå§ããæ¹åŒãäž¡ç«ããªãããã§ããäžæµãããã·å¿ é ã®ãããã¯ãŒã¯ã§ã¯çŸç¶ãå©çšããã ããŸãããã©ãŠã¶ã¯ãµã³ãããã¯ã¹å¿ é ïŒOS ã®ãµã³ãããã¯ã¹ãæå¹ã«ã§ããªãç°å¢(root ã§ã®å®è¡ããŠãŒã¶ãŒåå空éãå¶éãã Linux ãªã©)ã§ã¯ããã©ãŠã¶çµç±ã®ååŸã¯çç±ã瀺ããŠå€±æããŸãããµã³ãããã¯ã¹ãç¡å¹ã«ããŠåããèšå®ã¯ãããŸãã
anti-bot åé¿ã¯å®è£ ããŸããïŒrobots.txt æåŠãããã察çã«ããååŸå€±æã¯ä»æ§ã§ãã倱æã¯ãã®ãŸãŸå ±åããŸã(åéå ãžã®äœè² è·åç §)ãrobots.txt ã®æåŠã ãã¯ãå©çšè ã1ä»¶ãã€èš±å¯ãããšãã«éãäŸå€ã«ã§ããŸããããã察ç(403 ãªã©)ã¯äŸå€ã«ããŸãããrobots.txt ãèŠãŠã bot 察çã®æç¡ã¯ããããªããããäŸå€ãèš±å¯ããŠã bot 察çã§æãããããšããããŸãããŸãã200 ãè¿ã㊠CAPTCHA ãªã©ã®ç»é¢ãåºããµã€ãã¯æ€åºã§ããããã®ç»é¢ãååŸçµæãšããŠè¿ããŸã
robots.txt ã®äŸå€ã確èªã§ããªãç°å¢ãããïŒMCP ã§ã¯ã確èªãã©ãŒã (elicitation ã® form)ã«å¯Ÿå¿ããã¯ã©ã€ã¢ã³ãã§ã®ã¿äœ¿ããŸããæªå¯Ÿå¿ã®ã¯ã©ã€ã¢ã³ãã§ã¯çç±ã瀺ããŠæåŠããŸãã確èªã®åç㯠10 åãŸã§åŸ ã¡ãŸãã2025 ç³»ã®ãããã³ã«ã§æ¥ç¶ããã¯ã©ã€ã¢ã³ãã§ã¯ãæ¥ãªããã°çç±ã瀺ããŠæåŠããŸãã2026-07-28 çã§æ¥ç¶ããã¯ã©ã€ã¢ã³ãã§ã¯ã10 åãéããåçã¯ãããã³ã«ã®ãšã©ãŒ(Invalid or expired requestState)ã«ãªããamenbo ã®çç±æã¯åºãŸãããCLI 㯠stdin ãš stderr ã端æ«ã®ãšãã ã確èªãããšãŒãžã§ã³ãã®ã·ã§ã«ããã€ãããã¯æåŠããŸãããã ãããšãŒãžã§ã³ããã³ãã³ããæ¬äŒŒç«¯æ«(PTY)ã®äžã§åããç°å¢ã§ã¯ããšãŒãžã§ã³ãèªèº«ã端æ«ã§çããããŠããŸããŸã
éçº
clone åŸã«1åãç§å¯æ å ±æ€æ»ïŒgitleaksïŒã® pre-commit ããã¯ãæå¹åãã:
git config core.hooksPath githooksnpm run typecheck # strict åãã§ãã¯
npm test # vitest
npm run build # dist/ ãžãã«ãåŒçš
èšäºãç ç©¶ã§åç
§ããå Žå㯠Zenodo ã® DOI ã䜿ã£ãŠãã ãããäžã®ãããžã® 10.5281/zenodo.21553636 ã¯å
šããŒãžã§ã³å
±éã® Concept DOI ã§ãåžžã«ææ°çãžè§£æ±ºãããŸããç¹å®ã®çãæãå Žåã¯ããã®çã® DOI ã Zenodo ã®ã¬ã³ãŒãããååŸããŠãã ããã
æ©æ¢°å¯èªãªåŒçšæ å ±ã¯ CITATION.cff ã«ãããŸã(GitHub ã® "Cite this repository" ãã BibTeX / APA ãçæã§ããŸã)ã
ã©ã€ã»ã³ã¹
Available Tools
3 toolsfetchFetch a web page as MarkdownARead-only
Fetch a web page (Japanese-web-native) as low-impact, token-efficient Markdown. Built-in robots.txt compliance, rate limiting, and caching. mode: auto (default; quality score picks Markdown or screenshot) / markdown / outline (heading summary) / screenshot. Refetching a cached URL returns cache: unchanged, or diff (changed sections only), to save tokens. PDF URLs are handled automatically. mode: screenshot is the retry for pages whose Markdown came back poor; when the layout itself is the information or you need viewport/scale control, use the screenshot tool instead.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Target URL (http/https only; PDF supported) | |
| mode | No | Default: auto | |
| page | No | Page number (default 1) | |
| section | No | Section ID obtained from outline mode; returns only that section's Markdown | |
| selector | No | CSS selector to narrow the content | |
| force_full | No | Default false. If true, disables diff responses (unchanged/diff) and boilerplate-block removal (pagination by max_tokens still applies) | |
| max_tokens | No | Approximate token budget per page (default 8000) | |
| ask_robots_override | No | Set true only when the user explicitly asked to fetch this page even though robots.txt denies it. amenbo then asks the user to confirm in the client UI and fetches only if they approve; this flag alone never bypasses robots.txt |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint/openWorldHint the description discloses robots.txt compliance, rate limiting, caching with `unchanged`/`diff` responses, automatic PDF handling, and the important nuance that `ask_robots_override` merely triggers a user confirmation rather than bypassing robots.txt. These are exactly the behaviors an agent cannot infer from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose then behavior then routing, so the most decision-relevant content comes first. Slightly dense â the `mode` values are enumerated mid-paragraph and then revisited at the end for the screenshot retry case â but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, no-output-schema tool, the description covers the mutation-free safety profile, return shapes (Markdown, outline, screenshot, unchanged/diff), token budgeting via max_tokens pagination, and the consent flow for robots-denied pages. Nothing an agent needs before calling it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description earns above that by explaining what the `mode` enum values actually do (auto quality scoring, outline as heading summary) and by tying `section` implicitly to outline output and `force_full` to diff suppression. Remaining parameters (page, selector, max_tokens) are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Fetch a web page') plus the transformation applied ('as ... Markdown'), and explicitly names the sibling it is not: partial-layout work belongs to the `screenshot` tool. An agent can distinguish fetch from screenshot and links without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules: default to `auto`, drop to `screenshot` mode as the retry when Markdown quality is poor, and switch to the separate `screenshot` tool when the layout itself is the information or viewport/scale control is needed. It also explains the refetch path (cached URL returns `unchanged` or `diff`), which is when-not-to-expect-fresh-content guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linksList links from a page (sitemap/RSS-first)ARead-only
Enumerate URLs under a site or page without fetching each one. Tries sitemap.xml, then RSS/Atom feeds, then falls back to links found in the page itself; the response header reports which source was used (source:), the count:, and (truncated) when more than 200 links were cut. Each link is one line, - <title> â <url> (title omitted when unknown). filter narrows by substring or * glob against URL and link text; an empty result states whether the filter removed everything or the source had no links. Use it to find the right page before fetch. It does not return page content and does not follow more than the first 3 child sitemaps.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Starting URL | |
| filter | No | Substring match against URL/link text, or a glob using * |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses network behavior: it tries sitemap.xml, RSS/Atom feeds, then page links; it limits child sitemaps to 3; it reports source, count, and truncation in the response; and it explicitly does not return page content. This adds substantial behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence adds value: the core purpose, the fallback chain, the output format, the filter behavior, the usage guidance, and the limitations. It is well-organized and front-loaded with the primary function, making it efficient for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description fully specifies the output format ('- <title> â <url>'), edge cases (truncated at 200, empty filter results), and restrictions (no page content, max 3 child sitemaps). This makes the tool's behavior predictable and complete for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are fully described. `url` is defined as 'Starting URL' with a URI format. `filter` is detailed as 'Substring match against URL/link text, or a glob using *', which precisely explains its matching behavior. The schema description coverage is 100% and the descriptions add meaningful semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Enumerate URLs under a site or page without fetching each one.' It differentiates from siblings by targeting link discovery, with explicit guidance 'Use it to find the right page before fetch', which aligns with the presence of `fetch` as a sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use it (before fetching) and when not to (it does not return page content), plus details the fallback chain (sitemap, RSS/Atom, page links). This is sufficient guidance relative to the sibling tools `screenshot` and `fetch`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenshotCapture a tiled screenshot of a web pageARead-only
Render a page in a headless browser and return it as up to 10 tiled PNG images (1280px wide by default; fullPage: false returns only the first viewport). Pages taller than 10 tiles are cut off and the response says truncated: true. Use it when the layout or an image is the information (pricing tables, banners, visual QA) or when you need explicit viewport/scale control; scale: 0.5 roughly halves image tokens. For text content use fetch. Built-in robots.txt compliance, rate limiting, and caching.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Target URL (http/https only) | |
| scale | No | Resolution scale (0.5-1.0, default 1.0); lower reduces image tokens | |
| width | No | Tile width in px (default 1280) | |
| fullPage | No | Default true. If false, captures only the first viewport (1 tile) | |
| ask_robots_override | No | Set true only when the user explicitly asked to fetch this page even though robots.txt denies it. amenbo then asks the user to confirm in the client UI and fetches only if they approve; this flag alone never bypasses robots.txt |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/openWorldHint annotations by disclosing the hard 10-tile cap, the `truncated: true` signal, the `fullPage` default, the token cost tradeoff of `scale: 0.5`, and the built-in robots.txt compliance, rate limiting, and caching. These are exactly the operational constraints an agent needs before committing to a render.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the tool returns before the usage conditions and alternatives; parenthetical examples replace whole sentences. No sentence is filler and nothing is buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still characterizes the response shape (tuples of tiles, truncation flag). Behavior, limits, alternatives, and cost controls are all present for a five-parameter open-world tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds practical meaning: `fullPage: false` is framed as "only the first viewport," and `scale: 0.5` is quantified as roughly halving image tokens. It stops short of explaining how `width` interacts with the 10-tile cutoff, which is the one genuinely non-obvious parameter relationship.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (render a page in a headless browser) plus the exact output form (up to 10 tiled PNGs, 1280px wide default). The explicit handoff to `fetch` for text content separates it from the closest sibling without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the selection conditions directly: use when layout or an image is the information (pricing tables, banners, visual QA) or when explicit viewport/scale control is needed, and use `fetch` instead for text. This is explicit when-to-use plus a named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v0.7.0- Changed
fetch1 field changed- added
Input schema / properties / ask_robots_overrideAdded value: +{ + "description": "Set true only when the user explicitly asked to fetch this page even though robots.txt denies it. amenbo then asks the user to confirm in the client UI and fetches only if they approve; this flag alone never bypasses robots.txt", + "type": "boolean" +}
- Changed
screenshot1 field changed- added
Input schema / properties / ask_robots_overrideAdded value: +{ + "description": "Set true only when the user explicitly asked to fetch this page even though robots.txt denies it. amenbo then asks the user to confirm in the client UI and fetches only if they approve; this flag alone never bypasses robots.txt", + "type": "boolean" +}
3 tool updates
v0.6.0- Changed
fetch2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / force_full / descriptionPrevious value: -"Default false. If true, disables diff responses (unchanged/diff) and boilerplate-block removal, always returning the full content"New value: +"Default false. If true, disables diff responses (unchanged/diff) and boilerplate-block removal (pagination by max_tokens still applies)"
- Changed
links1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
screenshot1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
3 tool updates
v0.1.5- Changed
fetch7 fields changed- changed
Input schema / properties / force_full / descriptionPrevious value: -"æ¢å®falseãtrueã§å·®åå¿ç(unchanged/diff)ãšå®åãããã¯é€å»ãç¡å¹åãåžžã«å šæãè¿ã"New value: +"Default false. If true, disables diff responses (unchanged/diff) and boilerplate-block removal, always returning the full content" - changed
Input schema / properties / max_tokens / descriptionPrevious value: -"1ããŒãžã®æŠç®ããŒã¯ã³äžé(æ¢å®8000)"New value: +"Approximate token budget per page (default 8000)" - changed
Input schema / properties / mode / descriptionPrevious value: -"æ¢å®auto"New value: +"Default: auto" - changed
Input schema / properties / page / descriptionPrevious value: -"ããŒãžçªå·(æ¢å®1)"New value: +"Page number (default 1)" - changed
Input schema / properties / section / descriptionPrevious value: -"outlineã§åŸãsection IDãæå®æã¯ãã®ç¯ã®Markdownã®ã¿è¿ã"New value: +"Section ID obtained from outline mode; returns only that section's Markdown" - changed
Input schema / properties / selector / descriptionPrevious value: -"æ¬æãçµã蟌ãCSSã»ã¬ã¯ã¿"New value: +"CSS selector to narrow the content" - changed
Input schema / properties / url / descriptionPrevious value: -"ååŸå¯Ÿè±¡URL(http/httpsã®ã¿ãPDFãå¯)"New value: +"Target URL (http/https only; PDF supported)"
- Changed
links2 fields changed- changed
Input schema / properties / filter / descriptionPrevious value: -"URL/ãªã³ã¯ããã¹ãã®éšåäžèŽããŸãã¯*ã䜿ã£ãglob"New value: +"Substring match against URL/link text, or a glob using *" - changed
Input schema / properties / url / descriptionPrevious value: -"èµ·ç¹URL"New value: +"Starting URL"
- Changed
screenshot4 fields changed- changed
Input schema / properties / fullPage / descriptionPrevious value: -"æ¢å®trueãfalseã®å Žåã¯æåã®ãã¥ãŒããŒãå(1ã¿ã€ã«)ã®ã¿æ®åœ±ãã"New value: +"Default true. If false, captures only the first viewport (1 tile)" - changed
Input schema / properties / scale / descriptionPrevious value: -"è§£å床ã¹ã±ãŒã«(0.5ã1.0ãæ¢å®1.0)ãå°ããã»ã©ç»åãµã€ãº(ããŒã¯ã³)ãæžã"New value: +"Resolution scale (0.5-1.0, default 1.0); lower reduces image tokens" - changed
Input schema / properties / url / descriptionPrevious value: -"æ®åœ±å¯Ÿè±¡ã®URL(http/httpsã®ã¿)"New value: +"Target URL (http/https only)" - changed
Input schema / properties / width / descriptionPrevious value: -"ã¿ã€ã«å¹ (px)ãæ¢å®1280"New value: +"Tile width in px (default 1280)"
3 tool updates
- First observed
fetch - First observed
links - First observed
screenshot
TDQS
Scored across 3 tools
fetch, screenshot, and links have largely distinct purposes, and the descriptions explicitly cross-reference each other to steer selection (text vs. layout vs. URL discovery). The remaining ambiguity is that fetch embeds a `mode: screenshot` that partially duplicates the standalone screenshot tool, requiring the agent to read the guidance to pick correctly.
All three names are short, lowercase, single-token identifiers with no style mixing, which is easy to scan and predict. However, they are not a verb_noun pattern and mix grammatical forms (verb 'fetch' vs. nouns 'screenshot'/'links'), so the convention is consistent in form but not in structure.
Three tools is lean for the stated scope, but this server targets a narrow purpose (token-efficient web retrieval) and each tool covers a genuinely different need: content, rendering, and link discovery. Nothing feels padded or missing at the tool level.
The surface covers the main retrieval lifecycle: discover URLs (links), get text (fetch), and get visual layout (screenshot), including caching/diff and PDF handling. Gaps are minor and acknowledged (links follows only 3 child sitemaps, no crawling or structured extraction), and agents can chain the tools to work around them.
Maintenance
Related MCP Connectors
Hosted Web Crawler MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Web search API and MCP server for developers building AI agents.
One MCP server for all web data. Scrape, search, crawl, and AI research in one install.
Turn any public website into an MCP server for agents to search, read and navigate.
Related MCP Servers
- AlicenseAqualityDmaintenanceA comprehensive MCP server providing 15 web tools including search, scraping, screenshots, SEO audits, and DNS/SSL checks through a single installation. It delivers clean, LLM-optimized outputs so AI agents can focus on reasoning rather than parsing raw HTML.1511 npmMIT
- AlicenseAqualityBmaintenanceA token-efficient MCP server that gives AI agents structured access to the web, returning compact page summaries and targeted queries instead of full accessibility dumps.23348 npm184MIT

Yutori MCPofficial
AlicenseAqualityBmaintenanceMCP server enabling web monitoring, deep research, and browser automation through Yutori's web agentic technology.1367 PyPI25Apache 2.0- AlicenseNot gradedqualityDmaintenanceMCP server for web scraping and browser automation, enabling AI agents to extract clean, token-efficient content from web pages.1MIT