Skip to main content
Glama
README.md
# amenbo 🐜💧

[English](./README.en.md) | 日本語

[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.21553636.svg)](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

A4.9/5.0

Scored across 3 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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.

Maintenance

ActivityActive
ResponsivenessNo issues