amenbo
# amenbo ðð§
[English](./README.en.md) | æ¥æ¬èª
[](https://doi.org/10.5281/zenodo.21553636)
**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](https://modelcontextprotocol.io) ãµãŒããŒã§ããæ°Žé¢ã«æ³¢ãç«ãŠãã«æ»ãè«ã®ããã«ã**åéå
ã«è² è·ãããããå°ãªãããŒã¯ã³ã§** Web ããæ
å ±ãéããŸãããšããã**æ¥æ¬èªãµã€ã**ã«æé©åããŠããŸããMCP ã¯ã©ã€ã¢ã³ããæããªãã·ã§ã«ç°å¢ããã¯ãåãã³ã¢ãå
±æãã CLI ãšããŠã䜿ããŸã([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åéã£ã話](https://zenn.dev/rererr_engineer/articles/e571e5b6eb1d53)ããåç
§ããŠãã ãããããŒãã¹ãšçãã°ã¯ [`bench/`](https://github.com/Rererr/amenbo/blob/main/bench/) ã«ãããŸãã
## ããŒã¯ã³ãç¯çŽããä»çµã¿
- **段éé瀺**ïŒ`mode: outline` ã§èŠåºãããªãŒãšåç¯ã®ããŒã¯ã³éã ãå
ã«è¿ããå¿
èŠãªç¯ã ã `section` æå®ã§ååŸãé·å€§ãªããŒãžãäžžããšæµã蟌ã¿ãŸãã
- **CJK 察å¿ã®æ¬æãã«ãŒãã³ã°**ïŒå¥èªç¹å¯åºŠãæåçš®æ¯çããªã³ã¯å¯åºŠã§ãã/åºå/ããã¿ãŒãé€å»
- **å·®åå¿ç**ïŒäžåºŠååŸãã URL ã®åååŸæã倿Žãç¡ããã° `unchanged`ãããã°å€æŽãããç¯ã ããè¿ããŸã
- **èªå Markdown/ç»ååæ¿**ïŒå質ã¹ã³ã¢ãäœãããŒãžã ãã¹ã¯ãªãŒã³ã·ã§ããã«ããå£ãã Markdown ãèªãŸããŠåãçŽãåŸåŸ©ãé¿ããŸã
- **æåçš®å¥ã®ããŒã¯ã³èŠç©ã**ïŒæ¥æ¬èªã»éåœèªã»ããªã«æåã»çµµæåãªã©ã¯è±èªããããŒã¯ã³å䟡ãéããããæåã¯ã©ã¹å¥ã®ä¿æ°(宿ž¬ã§æ ¡æ£)ã§ããŒãžåå²ã®äºç®ãèšç®ããŸã
## åéå
ãžã®äœè² è·
- **äºæ®µãã§ãã**ïŒãŸãçŽ ã® HTTP GETãJS æç»ãå¿
èŠãªããŒãžã ã headless Chromium ã«ææ Œããã®ã§ã倧åã®ååŸã§ãã©ãŠã¶ãèµ·åããŸãã
- **ç€Œåæ£ããã¯ããŒã©**ïŒrobots.txt ãš Crawl-Delay ãå°éãåäžãã¡ã€ã³ãžã¯çŽå + æ¢å® 1 req/ç§ïŒrobots.txt ã®ååŸããã®1ãªã¯ãšã¹ããšããŠæ°ããŸãïŒããªã³ã¯åæã¯ sitemap / RSS ãåªå
ãããŒãžãèããŸãã
- **æ£çŽãª 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` ã§æéãçž®ããããšã¯ããŸãã â äž»èŠãµã€ãã®å®æž¬ã§ã¯ãã®å®£èšã倧åã§ãåŸããšããŒã«åŒã³åºãã®åºŠã«ååŸãã«è¡ãããšã«ãªããäœè² è·ãšããåæã厩ããããã§ã
## ã€ã³ã¹ããŒã«
```bash
npm install -g amenbo
```
Markdown ååŸ(éåžžã® `fetch` / `links`)ã¯ããã ãã§åããŸããJS æç»ãå¿
èŠãª SPA ãžã®ææ Œãã¹ã¯ãªãŒã³ã·ã§ãããªã©ããã©ãŠã¶(Chromium)çµç±ã®ååŸã䜿ãå Žåã®ã¿ãååã«äžåºŠã ãå®è¡ããŠãã ãã(çŽ 170MB ã®ããŠã³ããŒã):
```bash
npx -y amenbo install-browser
```
ãŸãã¯éçºçšé:
```bash
git clone https://github.com/Rererr/amenbo.git
cd amenbo
npm install
npm run build
```
### MCP ã¯ã©ã€ã¢ã³ããžã®ç»é²
Claude Code(`--scope user` ã¯å
šãããžã§ã¯ãå
±éããããžã§ã¯ãåäœãªãå€ã):
```bash
claude mcp add --scope user amenbo -- amenbo
```
Codex CLI:
```bash
codex mcp add amenbo -- amenbo
```
VS Code:
```bash
code --add-mcp '{"name":"amenbo","command":"amenbo"}'
```
ãã®ä»ã®ã¯ã©ã€ã¢ã³ã(Cursor / Cline ãªã©)ã¯ãåã¯ã©ã€ã¢ã³ãã® MCP èšå®(Cursor: `~/.cursor/mcp.json`ãCline: MCP Servers ç»é¢ã® settings JSON)ã«æ¬¡ã®ãšã³ããªã远å ããŸã:
```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 ãå¹çãã䜿ãããã«ãªããŸãã
```markdown
## 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 察çã«ããååŸå€±æã¯ä»æ§(åé¿ããªã)ã倱æã¯ãã®ãŸãŸãŠãŒã¶ãŒã«å ±åãã
```
`CLAUDE.md` ã«æžããããã®å Žã®ã»ãã·ã§ã³ã ãã«èªã¿èŸŒãããšãã§ããŸããMCP ããã³ãã察å¿ã¯ã©ã€ã¢ã³ãã§ã¯ããµãŒããŒãåãäœæ³ã `usage` ããã³ãããšããŠé
åžããŠããŸã(Claude Code ã§ã¯ `/mcp__amenbo__usage`)ã
## CLIãšããŠäœ¿ã
`amenbo` 㯠MCP ãµãŒããŒãšåäžã®ã³ã¢(ååŸããã£ãã·ã¥ãpolitenessãæœåºããžãã¯)ãå
±æãã CLI ãšããŠãåäœããŸããåŒæ°ãªãããŸã㯠`amenbo serve` ã¯åŸæ¥éã MCP ãµãŒããŒãšããŠèµ·åãã(`.mcp.json` ã® `"command": "amenbo"` ã¯ãã®ãŸãŸåããŸã)ã®ã§ãæ¢åã® MCP ç»é²ã«ã¯åœ±é¿ããŸããã
```bash
# ããŒãžã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 ã®ã¿è¿ã(ç¥å
èŠåºããããã°å¿çã« `section_path`(` ⺠` åºåãã®ãã³ãã)ãä»äž) |
| `page` | ããŒãžçªå·(æ¢å® 1) |
| `max_tokens` | 1 ããŒãžã®æŠç®ããŒã¯ã³äžé(æ¢å® 8000) |
| `force_full` | true ã§å·®åå¿çã»å®åãããã¯é€å»ãç¡å¹åãã(`max_tokens` ã«ããããŒãžåå²ã¯åŸæ¥éãåã) |
### `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 ã鲿¢
## æ¢ç¥ã®å¶é
- **æ¬ææœåºã¯æ¥æ¬èªãã¥ãŒãã³ã°**ïŒæ®µéé瀺ã»ãã£ãã·ã¥ã»äœè² è·ã¯èšèªéäŸåã§ã鿥æ¬èªãµã€ãã§ãåããŸãããã ãæ¬ææœåºã®ãã¥ãŒãªã¹ãã£ãã¯ã¯æ¥æ¬èªããŒãžã§èª¿æŽããŠããããã鿥æ¬èªããŒãžã§æ¬æãæ¬ ããŠèŠãããšã㯠`selector` æå®ã `mode: "screenshot"` ã§åãçŽããŠãã ãã
- **HTTP ãããã·é察å¿**ïŒ`HTTP_PROXY` / `HTTPS_PROXY` çã®ç°å¢å€æ°ã¯å°éããŸãããSSRF 察çãšããŠæ¥ç¶å
ãæ€èšŒæžã¿ IP ã«åºå®ããèšèš(DNS rebinding 察ç)ãšããããã·ãžåå解決ãå§ããæ¹åŒãäž¡ç«ããªãããã§ããäžæµãããã·å¿
é ã®ãããã¯ãŒã¯ã§ã¯çŸç¶ãå©çšããã ããŸãã
- **anti-bot åé¿ã¯å®è£
ããŸãã**ïŒrobots.txt æåŠãããã察çã«ããååŸå€±æã¯ä»æ§ã§ãã倱æã¯ãã®ãŸãŸå ±åããŸã([åéå
ãžã®äœè² è·](#åéå
ãžã®äœè² è·)åç
§)
## éçº
clone åŸã«1åãç§å¯æ
å ±æ€æ»ïŒgitleaksïŒã® pre-commit ããã¯ãæå¹åãã:
```bash
git config core.hooksPath githooks
```
```bash
npm run typecheck # strict åãã§ãã¯
npm test # vitest
npm run build # dist/ ãžãã«ã
```
## åŒçš
èšäºãç ç©¶ã§åç
§ããå Žå㯠Zenodo ã® DOI ã䜿ã£ãŠãã ãããäžã®ãããžã® `10.5281/zenodo.21553636` ã¯**å
šããŒãžã§ã³å
±éã® Concept DOI** ã§ãåžžã«ææ°çãžè§£æ±ºãããŸããç¹å®ã®çãæãå Žåã¯ããã®çã® DOI ã [Zenodo ã®ã¬ã³ãŒã](https://zenodo.org/records/21553637)ããååŸããŠãã ããã
æ©æ¢°å¯èªãªåŒçšæ
å ±ã¯ [CITATION.cff](https://github.com/Rererr/amenbo/blob/main/CITATION.cff) ã«ãããŸã(GitHub ã® "Cite this repository" ãã BibTeX / APA ãçæã§ããŸã)ã
## ã©ã€ã»ã³ã¹
[MIT](./LICENSE)
TDQS
Scored across 3 tools
The three tools have clearly distinct primary purposes: fetch returns Markdown, screenshot returns images, and links enumerates URLs. The only slight overlap is fetch's 'screenshot' mode, but the descriptions explicitly direct users to the screenshot tool when layout is the priority, so confusion is minimal.
All tool names are single lowercase words following a consistent style: fetch, screenshot, links. While not verb_noun, the naming is predictable and uniform across the entire set.
Three tools is well-scoped for a web retrieval server. Each tool covers a distinct retrieval mode without redundancy, and the count feels neither thin nor bloated.
The server covers the full lifecycle of web content retrieval: discovering URLs (links), fetching text content (fetch), and capturing visual layout (screenshot). PDF handling and caching are built in, leaving no obvious gaps for its stated purpose.