amenbo ðð§
English | æ¥æ¬èª
Skims the web without making waves â a Japanese-web-native MCP server for low-impact, token-efficient web collection.
amenbo(ã¢ã¡ã³ã / water strider)ã¯ãClaude Code ã Codex ã®ãããªã³ãŒãã£ã³ã°ãšãŒãžã§ã³ãåãã® MCP ãµãŒããŒã§ããæ°Žé¢ã«æ³¢ãç«ãŠãã«æ»ãè«ã®ããã«ãåéå ã«è² è·ãããããå°ãªãããŒã¯ã³ã§ Web ããæ å ±ãéããŸãããšãããæ¥æ¬èªãµã€ãã«æé©åããŠããŸããMCP ã¯ã©ã€ã¢ã³ããæããªãã·ã§ã«ç°å¢ããã¯ãåãã³ã¢ãå ±æãã CLI ãšããŠã䜿ããŸã(CLIãšããŠäœ¿ãåç §)ã
ãªã amenbo ã
æ±çšã®ã¹ã¯ã¬ã€ãã³ã°ããŒã«ã®å€ãã¯è±èªåã® Web ãåæã«äœãããŠãããæ¥æ¬èªãµã€ãã§ã¯æ¬¡ã®ãããªåãããŒããèµ·ããã¡ã§ããamenbo ã¯ãããã®èª²é¡ã«å¯Ÿå¿ããŸãã
- æ§é åãçããµã€ãïŒdiv ã®å ¥ãåãããŒãã«ã¬ã€ã¢ãŠããå€ãæ¥æ¬èªãµã€ãã§ããã¬ã³ããªã³ã°çµæã®ãžãªã¡ããª(èŠãç®ã®é 眮)ããæ¬æé åãæšå®ããŸã
- æååãïŒShift_JIS / EUC-JP / ISO-2022-JP ãèªåå€å¥
- ãµãããªïŒ
<ruby>ã®æ¯ãä»®åãé€å»ããæ¬æã®äºéåã鲿¢ - ç»åã§åºãæ å ±ïŒç»ååãããæé衚ããããŒäžå¿ã®ããŒãžã¯ãããã¹ãæœåºã貧匱ãªãšãèªåã§ã¹ã¯ãªãŒã³ã·ã§ããã«åãæ¿ã
- åœå äž»èŠãµã€ãïŒQiita / Zenn / note / ã¯ãŠãªããã° / Yahoo!ãã¥ãŒã¹ / PR TIMES / Wikipedia æ¥æ¬èªçã«å°çšã¢ããã¿
é¡äŒŒããŒã«(å
¬åŒ fetch MCP / Jina Reader / Playwright MCP / PixelRAG pixelshot)ãšã®å®æž¬æ¯èŒã¯ãèšäºããšãŒãžã§ã³ãã®WebååŸãããŒã«æ¬¡ç¬¬ã§ããŒã¯ã³ã5000åéã£ã話ããåç
§ããŠãã ãããããŒãã¹ãšçãã°ã¯ bench/ ã«ãããŸãã
ããŒã¯ã³ãç¯çŽããä»çµã¿
- 段éé瀺ïŒ
mode: outlineã§èŠåºãããªãŒãšåç¯ã®ããŒã¯ã³éã ãå ã«è¿ããå¿ èŠãªç¯ã ãsectionæå®ã§ååŸãé·å€§ãªããŒãžãäžžããšæµã蟌ã¿ãŸãã - CJK 察å¿ã®æ¬æãã«ãŒãã³ã°ïŒå¥èªç¹å¯åºŠãæåçš®æ¯çããªã³ã¯å¯åºŠã§ãã/åºå/ããã¿ãŒãé€å»
- å·®åå¿çïŒäžåºŠååŸãã URL ã®åååŸæã倿Žãç¡ããã°
unchangedãããã°å€æŽãããç¯ã ããè¿ããŸã - èªå Markdown/ç»ååæ¿ïŒå質ã¹ã³ã¢ãäœãããŒãžã ãã¹ã¯ãªãŒã³ã·ã§ããã«ããå£ãã Markdown ãèªãŸããŠåãçŽãåŸåŸ©ãé¿ããŸã
- CJK ããŒã¯ã³èŠç©ãïŒæ¥æ¬èªã¯è±èªããããŒã¯ã³å䟡ãéããããæåçš®å¥ã®ä¿æ°ã§ããŒãžåå²ã®äºç®ãèšç®ããŸã
åéå ãžã®äœè² è·
- äºæ®µãã§ããïŒãŸãçŽ ã® HTTP GETãJS æç»ãå¿ èŠãªããŒãžã ã headless Chromium ã«ææ Œããã®ã§ã倧åã®ååŸã§ãã©ãŠã¶ãèµ·åããŸãã
- ç€Œåæ£ããã¯ããŒã©ïŒrobots.txt ãš Crawl-Delay ãå°éãåäžãã¡ã€ã³ãžã¯çŽå + æ¢å® 1 req/ç§ããªã³ã¯åæã¯ sitemap / RSS ãåªå ãããŒãžãèããŸãã
- æ£çŽãª User-AgentïŒãããã§ããããšãæç€ºããŸããanti-bot åé¿ã¯å®è£ ããŸãã
- ãã£ãã·ã¥ïŒETag / If-Modified-Since ã§åæ€èšŒããç¡é§ãªåååŸãé¿ããŸã
ã€ã³ã¹ããŒã«
npm install -g amenbo
# postinstall ã§ Chromium ãå
¥ããŸã(SPAæç»ã»ã¹ã¯ãªãŒã³ã·ã§ããçš)
ãŸãã¯éçºçšé:
git clone https://github.com/Rererr/amenbo.git
cd amenbo
npm install
npm run build
Claude Code ãžã®ç»é²
.mcp.json(ãŸãã¯ã°ããŒãã«èšå®)ã«è¿œå ããŸã:
{
"mcpServers": {
"amenbo": {
"command": "amenbo"
}
}
}
ããŒã«ã«ãã«ãã䜿ãå Žå㯠"command": "node", "args": ["/path/to/amenbo/dist/server.js"]ã
ãšãŒãžã§ã³ãã«äœ¿ãæ¹ãæãã(æšå¥šããã³ãã)
ããŒã«å®çŸ©ã ãã§ã¯ã段éé瀺ã§åãããšãã£ãäœ¿ãæ¹ã®äœæ³ãŸã§ã¯äŒãããŸããã以äžã 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 察çã«ããååŸå€±æã¯ä»æ§(åé¿ããªã)ã倱æã¯ãã®ãŸãŸãŠãŒã¶ãŒã«å ±åãã
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ïŒãšãŒãžã§ã³ãã®äž»çµè·¯ããã©ãŠã¶(Chromium)ãããã»ã¹å ã§ãŠã©ãŒã ã«ä¿ãããã¹ã¯ãªãŒã³ã·ã§ããçã®ç»åãäŒè©±ãžçŽæ¥è¿ãããclaude.ai ã®ããã«ã·ã§ã«ãæããªããã¹ãã®ãšãŒãžã§ã³ãã«ãå±ã
- CLIïŒã·ã§ã«ã¹ã¯ãªãããCIããããã°çšéãåºåããã¡ã€ã«ã«èœãšããŠ
grep/éšåèªã¿ãããå ŽåããŸã㯠MCP é察å¿ã®ãšãŒãžã§ã³ã/ããŒã«ãã§ãŒã³ãã䜿ãå Žåã«åãã1 ã³ãã³ã= 1 ããã»ã¹ã®ãããã©ãŠã¶ã¯æ¯åèµ·åãã
ãã£ãã·ã¥ãå·®åå¿ç(unchanged/diff)ãã¬ãŒãå¶åŸ¡(robots.txt/ãã¡ã€ã³æ¯ã®çŽåã¢ã¯ã»ã¹)ã®ç¶æ
㯠MCP ãµãŒããŒãš CLI ã§å
±æãããŸã(åã ~/.cache/amenbo ã䜿ããã)ããã ãã¬ãŒãå¶åŸ¡ã®ããã»ã¹éå
±æã¯ãã¹ããšãã©ãŒãã§ããåäžãã¡ã€ã³ãžã®çŽååã¯åããã»ã¹å
ã§ã®ã¿å³å¯ã«ä¿èšŒãããMCP ãµãŒããŒãšè€æ°ã® CLI å®è¡ãåæã«åããã¡ã€ã³ãžã¢ã¯ã»ã¹ããå Žåãæå°ééãå€å°ããæããããšããããŸãã
ããŒã«
fetch ã§ããŒãžãååŸ
| ãã©ã¡ãŒã¿ | 説æ |
|---|---|
url | ååŸå¯Ÿè±¡ URL(http/https ã®ã¿ãPDF å¯) |
mode | auto(æ¢å®ã»å質ã¹ã³ã¢ã§ Markdown/screenshot èªååæ¿) / markdown / outline(èŠåºãèŠçŽ) / screenshot |
selector | æ¬æãçµã蟌ã CSS ã»ã¬ã¯ã¿ |
section | outline ã§åŸã section IDããã®ç¯ã® Markdown ã®ã¿è¿ã |
page | ããŒãžçªå·(æ¢å® 1) |
max_tokens | 1 ããŒãžã®æŠç®ããŒã¯ã³äžé(æ¢å® 8000) |
force_full | true ã§å·®åå¿çã»å®åãããã¯é€å»ãç¡å¹åãåžžã«å šæãè¿ã |
links ã§ãªã³ã¯ãåæ
| ãã©ã¡ãŒã¿ | 説æ |
|---|---|
url | èµ·ç¹ URL |
filter | URL/ãªã³ã¯ããã¹ãã®éšåäžèŽããŸã㯠* ã䜿ã£ã glob |
sitemap â RSS/Atom â ããŒãžå ãªã³ã¯ã®é ã§æ¢çŽ¢ããŸãã
screenshot ã§ã¹ã¯ãªãŒã³ã·ã§ãããæ®åœ±
| ãã©ã¡ãŒã¿ | 説æ |
|---|---|
url | æ®åœ±å¯Ÿè±¡ URL(http/https ã®ã¿) |
fullPage | æ¢å® trueãfalse ã§æåã®ãã¥ãŒããŒãåã®ã¿ |
width | ã¿ã€ã«å¹ px(æ¢å® 1280) |
scale | è§£å床ã¹ã±ãŒã« 0.5ã1.0(æ¢å® 1.0)ãå°ããã»ã©ç»åããŒã¯ã³æž |
ç°å¢å€æ°
| 倿° | æ¢å® | 説æ |
|---|---|---|
AMENBO_CACHE_DIR | ~/.cache/amenbo | ãã£ãã·ã¥(SQLite + PNG)ã®ä¿åå |
AMENBO_CACHE_TTL_MS | 900000(15å) | ãã£ãã·ã¥ã®æå¹æé |
AMENBO_MAX_BODY_BYTES | 20971520(20MB) | ååŸããã£ã®äžéãµã€ãº |
ã»ãã¥ãªãã£
- SSRF 察çïŒhttp/https 以å€ã®ã¹ããŒã (
file:,ftp:ç)ãæåŠãDNS 解決ããæ¥ç¶å ã private / loopback / link-local / äºçŽã¢ãã¬ã¹ãªãæåŠãDNS rebinding(TOCTOU)察çãšããŠå®æ¥ç¶ãæ€èšŒæžã¿ IP ã«åºå®ããŸã - ããã£ãµã€ãºäžéïŒå·šå€§ã¬ã¹ãã³ã¹ã«ãã OOM ã鲿¢
éçº
npm run typecheck # strict åãã§ãã¯
npm test # vitest
npm run build # dist/ ãžãã«ã