🚀 superFetch MCP Server
superFetch MCP Serverは、Model Context Protocol (MCP) サーバーです。ウェブページを取得し、Mozilla Readabilityを使用して読みやすいコンテンツを抽出し、AIに適したJSONLまたはMarkdownを返します。
クイックスタート | ツールの選び方 | 利用可能なツール | リソース | 設定 | セキュリティ | 開発
MCP Registryに公開されています - io.github.j0hanz/superfetch を検索してください。
⚠️ 重要提示
このサーバーは、AIアシスタントの代わりにURLにアクセスできます。組み込みのSSRF保護により、プライベートIP範囲とクラウドメタデータエンドポイントがブロックされますが、機密環境でのデプロイ時には注意してください。
✨ 主な機能
| 機能 |
説明 |
| スマート抽出 |
Mozilla Readabilityを有効にすると、広告、ナビゲーション、定型文が削除されます |
| JSONL + Markdown |
JSONLのセマンティックブロックまたはフロントマター付きのクリーンなMarkdown |
| 構造化ブロック |
見出し、段落、リスト、コード、テーブル、画像、引用符付きのブロック |
| 組み込みキャッシュ |
TTL、最大キー数、リソースサブスクリプションを持つメモリ内キャッシュ |
| 強力なフェッチ |
リダイレクトの処理と指数関数的バックオフ + ジッターによるリトライ |
| セキュリティ重視 |
URL検証、SSRF/DNS/IPブロックリスト、ヘッダーサニタイズ |
| HTTPモード |
APIキー認証、セッション管理、レート制限、CORS |
ツールの選び方
このガイドを使用して、ウェブコンテンツ抽出のニーズに合った適切なツールを選択してください。
決定木
AI用のウェブコンテンツが必要ですか?
- 構造化されたJSONLブロックが必要 -> fetch-url (形式: jsonl)
- クリーンなMarkdownが必要 -> fetch-markdown
- Markdownが必要で、contentBlocksの数も必要 -> fetch-url (形式: markdown)
クイックリファレンステーブル
| ツール |
最適な用途 |
出力形式 |
使用する場合 |
fetch-url |
構造化ブロックを持つ単一ページ |
JSONL (または format を使用してMarkdown) |
RAGパイプライン、コンテンツ解析、分析 |
fetch-markdown |
読みやすい形式の単一ページ |
Markdown + フロントマター |
ドキュメント、要約、人間によるレビュー |
一般的な使用例
| タスク |
推奨ツール |
理由 |
| AI用にブログ記事を解析する |
fetch-url |
セマンティックブロック (見出し、段落、コード) を返します |
| ドキュメントを生成する |
fetch-markdown |
フロントマター付きのクリーンなMarkdown |
| RAG用に記事を抽出する |
fetch-url + extractMainContent: true |
広告/ナビゲーションを削除し、主要コンテンツを保持します |
🚀 クイックスタート
superFetchをMCPクライアント設定に追加するだけで、インストールは不要です。
Claude Desktop
claude_desktop_config.json に追加します。
{
"mcpServers": {
"superFetch": {
"command": "npx",
"args": ["-y", "@j0hanz/superfetch@latest", "--stdio"]
}
}
}
VS Code
ワークスペースの .vscode/mcp.json に追加します。
{
"servers": {
"superFetch": {
"command": "npx",
"args": ["-y", "@j0hanz/superfetch@latest", "--stdio"]
}
}
}
カスタム設定を使用する場合
env プロパティに環境変数を追加して、SuperFetchの動作を設定します。
{
"servers": {
"superFetch": {
"command": "npx",
"args": ["-y", "@j0hanz/superfetch@latest", "--stdio"],
"env": {
"CACHE_TTL": "7200",
"LOG_LEVEL": "debug",
"FETCH_TIMEOUT": "60000"
}
}
}
}
すべての利用可能なオプションについては、設定 を参照してください。
Cursor
- Cursor設定を開きます。
- 機能 > MCPサーバー に移動します。
- "+ 新しいグローバルMCPサーバーを追加" をクリックします。
- この設定を追加します。
{
"mcpServers": {
"superFetch": {
"command": "npx",
"args": ["-y", "@j0hanz/superfetch@latest", "--stdio"]
}
}
}
ヒント (Windows): 問題が発生した場合は、cmd /c "npx -y @j0hanz/superfetch@latest --stdio" を試してください。
Codex IDE
~/.codex/config.toml ファイルに追加します。
基本設定:
[mcp_servers.superfetch]
command = "npx"
args = ["-y", "@j0hanz/superfetch@latest", "--stdio"]
環境変数を使用する場合:
[mcp_servers.superfetch]
command = "npx"
args = ["-y", "@j0hanz/superfetch@latest", "--stdio"]
env = { CACHE_TTL = "7200", LOG_LEVEL = "debug", FETCH_TIMEOUT = "60000" }
設定ファイルにアクセスするには: 歯車アイコンをクリック -> "Codex設定 > config.tomlを開く"
ドキュメント: Codex MCPガイド
Cline (VS Code拡張機能)
Cline MCP設定ファイルを開きます。
macOS:
code ~/Library/Application\ Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json
Windows:
code %APPDATA%\Code\User\globalStorage\saoudrizwan.claude-dev\settings\cline_mcp_settings.json
設定を追加します。
{
"mcpServers": {
"superFetch": {
"command": "npx",
"args": ["-y", "@j0hanz/superfetch@latest", "--stdio"],
"disabled": false,
"autoApprove": []
}
}
}
Windsurf
./codeium/windsurf/model_config.json に追加します。
{
"mcpServers": {
"superFetch": {
"command": "npx",
"args": ["-y", "@j0hanz/superfetch@latest", "--stdio"]
}
}
}
Claude Desktop (設定ファイルの場所)
macOS:
open -e "$HOME/Library/Application Support/Claude/claude_desktop_config.json"
code "$HOME/Library/Application Support/Claude/claude_desktop_config.json"
Windows:
code %APPDATA%\Claude\claude_desktop_config.json
📦 インストール
グローバルインストール
npm install -g @j0hanz/superfetch
superfetch --stdio
superfetch
ソースからインストール
git clone https://github.com/j0hanz/super-fetch-mcp-server.git
cd super-fetch-mcp-server
npm install
npm run build
サーバーの実行
stdioモード (直接のMCP統合)
node dist/index.js --stdio
HTTPモード (デフォルト)
HTTPモードでは API_KEY が必要で、ALLOW_REMOTE=true でない限り、ループバックアドレスにのみバインドされます。
API_KEY=supersecret npx -y @j0hanz/superfetch@latest
Windows (PowerShell):
$env:API_KEY = "supersecret"
npx -y @j0hanz/superfetch@latest
エンドポイント (すべて Authorization: Bearer <API_KEY> または X-API-Key: <API_KEY> が必要):
GET /health
POST /mcp
GET /mcp (SSEストリーム)
DELETE /mcp
GET /mcp/downloads/:namespace/:hash
セッションは mcp-session-id ヘッダーを介して管理されます (詳細は HTTPモードの詳細 を参照)。
💻 利用可能なツール
ツールのレスポンスに関する注意事項
両方のツールは次を返します。
- 機械可読フィールドの
structuredContent
- 次を含む
content ブロック:
structuredContent のJSONを含む text ブロック
- 完全なコンテンツを含む
file:///... URIを持つ resource ブロック (stdioに適しています)
- コンテンツが
MAX_INLINE_CONTENT_CHARS を超え、キャッシュが有効な場合の resource_link ブロック
コンテンツが大きすぎてキャッシュが無効な場合、サーバーは出力を切り捨て、...[truncated] を追加します。
fetch-url
ウェブページを取得し、セマンティックコンテンツブロックを持つAIが読めるJSONL形式に変換します。format: "markdown" でMarkdownを要求することもできます。
| パラメータ |
タイプ |
デフォルト |
説明 |
url |
文字列 |
必須 |
取得するURL |
format |
"jsonl" | "markdown" |
"jsonl" |
出力形式 |
extractMainContent |
ブール値 |
true |
Readabilityを使用して主要コンテンツを抽出する |
includeMetadata |
ブール値 |
true |
ページのメタデータを含める |
maxContentLength |
数値 |
- |
文字数での最大コンテンツ長 |
customHeaders |
オブジェクト |
- |
カスタムHTTPヘッダー (サニタイズされます) |
timeout |
数値 |
30000 |
リクエストのタイムアウト (ミリ秒) (1000-120000) |
retries |
数値 |
3 |
リトライ試行回数 (1-10) |
structuredContent の例:
{
"url": "https://example.com/article",
"title": "Example Article",
"contentBlocks": 42,
"fetchedAt": "2025-12-11T10:30:00.000Z",
"format": "jsonl",
"contentSize": 12345,
"cached": false,
"content": "{\"type\":\"metadata\",\"title\":\"Example Article\",\"url\":\"https://example.com/article\"}\n{\"type\":\"heading\",\"level\":1,\"text\":\"Introduction\"}"
}
fetch-markdown
ウェブページを取得し、オプションのフロントマター付きのクリーンなMarkdownに変換します。
| パラメータ |
タイプ |
デフォルト |
説明 |
url |
文字列 |
必須 |
取得するURL |
extractMainContent |
ブール値 |
true |
主要コンテンツのみを抽出する |
includeMetadata |
ブール値 |
true |
YAMLフロントマターを含める |
maxContentLength |
数値 |
- |
文字数での最大コンテンツ長 |
customHeaders |
オブジェクト |
- |
カスタムHTTPヘッダー (サニタイズされます) |
timeout |
数値 |
30000 |
リクエストのタイムアウト (ミリ秒) (1000-120000) |
retries |
数値 |
3 |
リトライ試行回数 (1-10) |
structuredContent の例:
{
"url": "https://example.com/docs",
"title": "Documentation",
"fetchedAt": "2025-12-11T10:30:00.000Z",
"markdown": "---\ntitle: Documentation\nsource: \"https://example.com/docs\"\n---\n\n# Getting Started\n\nWelcome...",
"contentSize": 9876,
"cached": false,
"truncated": false,
"file": {
"downloadUrl": "/mcp/downloads/markdown/abc123def456",
"fileName": "documentation.md",
"expiresAt": "2025-12-11T11:30:00.000Z"
}
}
file は、コンテンツがキャッシュされ、インライン表示に大きすぎる場合にのみ、HTTPモードで含まれます。
大きなコンテンツの処理
- インライン制限:
MAX_INLINE_CONTENT_CHARS (デフォルト 20000)。
- コンテンツが制限を超え、キャッシュが有効な場合、レスポンスには
resourceUri と resource_link ブロックが含まれます。
- キャッシュが無効な場合、コンテンツは
...[truncated] で切り捨てられます。
- リクエストごとに
maxContentLength を使用して、より低い制限を適用できます。
リソース
| URI |
説明 |
superfetch://health |
リアルタイムのサーバーの健全性とメモリチェック |
superfetch://stats |
サーバーの統計情報とキャッシュメトリクス |
superfetch://cache/list |
キャッシュされたエントリとそのリソースURIのリスト |
superfetch://cache/{namespace}/{urlHash} |
キャッシュされたコンテンツエントリ (namespace: url, markdown) |
リソースサブスクリプションは、キャッシュエントリが更新されたときにクライアントに通知します。
ダウンロードエンドポイント (HTTPモード)
HTTPモードで実行すると、キャッシュされたコンテンツを直接ダウンロードできます。
エンドポイント
GET /mcp/downloads/:namespace/:hash
namespace: markdown または url
- 認証が必要 (
Authorization: Bearer <API_KEY> または X-API-Key: <API_KEY>)
レスポンスヘッダー
| ヘッダー |
値 |
Content-Type |
text/markdown; charset=utf-8 または application/x-ndjson; charset=utf-8 |
Content-Disposition |
attachment; filename="<name>" |
Cache-Control |
private, max-age=<CACHE_TTL> |
使用例
curl -H "Authorization: Bearer $API_KEY" \
http://localhost:3000/mcp/downloads/markdown/abc123.def456 \
-o article.md
エラーレスポンス
| ステータス |
コード |
説明 |
| 400 |
BAD_REQUEST |
無効な名前空間またはハッシュ形式 |
| 404 |
NOT_FOUND |
コンテンツが見つからないまたは期限切れ |
| 503 |
SERVICE_UNAVAILABLE |
ダウンロードサービスが無効 |
設定
MCPクライアント設定の env プロパティに環境変数を追加して、SuperFetchの動作を設定します。
フェッチャー設定
| 変数 |
デフォルト |
有効な値 |
説明 |
FETCH_TIMEOUT |
30000 |
5000-120000 |
リクエストのタイムアウト (ミリ秒) |
USER_AGENT |
superFetch-MCP/1.0 |
有効なユーザーエージェント |
カスタムユーザーエージェント |
キャッシュ設定
| 変数 |
デフォルト |
有効な値 |
説明 |
CACHE_ENABLED |
true |
true / false |
レスポンスキャッシュを有効にする |
CACHE_TTL |
3600 |
60-86400 |
キャッシュの有効期限 (秒) |
CACHE_MAX_KEYS |
100 |
10-1000 |
最大キャッシュエントリ数 |
出力設定
| 変数 |
デフォルト |
有効な値 |
説明 |
MAX_INLINE_CONTENT_CHARS |
20000 |
1000-200000 |
resource_link の前のインラインコンテンツ制限 |
ロギング設定
| 変数 |
デフォルト |
有効な値 |
説明 |
LOG_LEVEL |
info |
debug / info / warn / error |
ロギングの詳細度 |
ENABLE_LOGGING |
true |
true / false |
ロギングを有効/無効にする |
抽出設定
| 変数 |
デフォルト |
有効な値 |
説明 |
EXTRACT_MAIN_CONTENT |
true |
true / false |
Readabilityを使用して主要コンテンツを抽出する |
INCLUDE_METADATA |
true |
true / false |
メタデータ/フロントマターを含める |
HTTPサーバー設定
| 変数 |
デフォルト |
説明 |
API_KEY |
- |
HTTPモードで必須 |
HOST |
127.0.0.1 |
HTTPサーバーのホスト |
PORT |
3000 |
HTTPサーバーのポート |
ALLOW_REMOTE |
false |
非ループバックインターフェースへのバインドを許可する |
TRUST_PROXY |
false |
クライアントIP解決のためにプロキシヘッダーを信頼する |
SESSION_TTL_MS |
1800000 |
セッションの有効期限 (ミリ秒) (30分) |
SESSION_INIT_TIMEOUT_MS |
10000 |
セッション初期化に許可される時間 |
MAX_SESSIONS |
200 |
最大アクティブセッション数 |
CORS設定
| 変数 |
デフォルト |
説明 |
ALLOWED_ORIGINS |
[] |
許可されるオリジンのカンマ区切りリスト |
CORS_ALLOW_ALL |
false |
すべてのオリジンを許可する (開発用のみ) |
レート制限
| 変数 |
デフォルト |
有効な値 |
説明 |
RATE_LIMIT_ENABLED |
true |
true / false |
HTTPレート制限を有効/無効にする |
RATE_LIMIT_MAX |
100 |
1-10000 |
ウィンドウごとのIPごとの最大リクエスト数 |
RATE_LIMIT_WINDOW_MS |
60000 |
1000-3600000 |
レート制限のウィンドウ (ミリ秒) |
RATE_LIMIT_CLEANUP_MS |
60000 |
10000-3600000 |
制限エントリのクリーンアップ間隔 |
設定プリセット
デフォルト (推奨) - 設定不要
{
"servers": {
"superFetch": {
"command": "npx",
"args": ["-y", "@j0hanz/superfetch@latest", "--stdio"]
}
}
}
デバッグモード - 詳細なロギングとキャッシュ無効
{
"servers": {
"superFetch": {
"command": "npx",
"args": ["-y", "@j0hanz/superfetch@latest", "--stdio"],
"env": {
"LOG_LEVEL": "debug",
"CACHE_ENABLED": "false"
}
}
}
}
パフォーマンスモード - 高速化のための積極的なキャッシュ
{
"servers": {
"superFetch": {
"command": "npx",
"args": ["-y", "@j0hanz/superfetch@latest", "--stdio"],
"env": {
"CACHE_TTL": "7200",
"CACHE_MAX_KEYS": "500",
"LOG_LEVEL": "warn"
}
}
}
}
カスタムユーザーエージェント - ボットをブロックするサイト用
{
"servers": {
"superFetch": {
"command": "npx",
"args": ["-y", "@j0hanz/superfetch@latest", "--stdio"],
"env": {
"USER_AGENT": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
}
}
}
低速ネットワーク / CI - 拡張されたタイムアウト
{
"servers": {
"superFetch": {
"command": "npx",
"args": ["-y", "@j0hanz/superfetch@latest", "--stdio"],
"env": {
"FETCH_TIMEOUT": "60000",
"CACHE_ENABLED": "false",
"LOG_LEVEL": "warn"
}
}
}
}
HTTPモードの詳細
HTTPモードは、MCP Streamable HTTPトランスポートを使用します。ワークフローは次のとおりです。
POST /mcp を initialize リクエストで、なし mcp-session-id ヘッダーで送信します。
- サーバーはレスポンスヘッダーに
mcp-session-id を返します。
- そのヘッダーを後続の
POST /mcp、GET /mcp、および DELETE /mcp リクエストに使用します。
MAX_SESSIONS に達すると、サーバーは可能な場合は最も古いセッションを削除し、そうでない場合は503を返します。
コンテンツブロックのタイプ
JSONL出力にはセマンティックコンテンツブロックが含まれます。
| タイプ |
Description |
metadata |
最小限のページメタデータ (タイプ、タイトル、URL) |
heading |
レベルインジケータ付きの見出し (h1-h6) |
paragraph |
テキスト段落 |
list |
順序付き/順序なしリスト |
code |
オプションの言語付きのコードブロック |
table |
ヘッダーと行を持つテーブル |
image |
srcとaltテキストを持つ画像 |
blockquote |
ブロック引用テキスト |
セキュリティ
SSRF保護
ブロックされる宛先には次が含まれます。
- ローカルホストとループバックアドレス
- プライベートIP範囲 (
10.x.x.x, 172.16-31.x.x, 192.168.x.x)
- クラウドメタデータエンドポイント (AWS、GCP、Azure)
- IPv6のリンクローカルおよび一意のローカルアドレス
.local や .internal などの内部サフィックス
URL検証
http および https URLのみ
- URLに埋め込まれた資格情報はなし
- 最大URL長: 2048文字
ヘッダーサニタイズ
ブロックされるヘッダー: host, authorization, cookie, x-forwarded-for, x-real-ip, proxy-authorization
レート制限
デフォルト: 100リクエスト/分 ごとのIP (HTTPモードのみ)。RATE_LIMIT_MAX と RATE_LIMIT_WINDOW_MS で設定します。
開発
スクリプト
| コマンド |
説明 |
npm run dev |
ホットリロード付きの開発サーバー |
npm run build |
TypeScriptをコンパイルする |
npm start |
本番サーバー |
npm run lint |
ESLintを実行する |
npm run type-check |
TypeScriptの型チェック |
npm run format |
Prettierでフォーマットする |
npm test |
Vitestテストを実行する |
npm run test:coverage |
カバレッジ付きでテストを実行する |
npm run bench |
最小限のパフォーマンスベンチマークを実行する |
npm run release |
新しいリリースを作成する |
npm run knip |
未使用のエクスポート/依存関係を見つける |
npm run knip:fix |
未使用のコードを自動修正する |
テクノロジースタック
| カテゴリ |
テクノロジー |
| ランタイム |
Node.js >=20.12 |
| 言語 |
TypeScript 5.9 |
| MCP SDK |
@modelcontextprotocol/sdk ^1.25.1 |
| コンテンツ抽出 |
@mozilla/readability ^0.6.0 |
| HTML解析 |
Cheerio ^1.1.2, LinkeDOM ^0.18.12 |
| Markdown |
Turndown ^7.2.2 |
| HTTP |
Express ^5.2.1, undici ^6.22.0 |
| 検証 |
Zod ^3.24.1 |
コントリビューション
- リポジトリをフォークします。
- 機能ブランチを作成します:
git checkout -b feature/amazing-feature
- リントが通過することを確認します:
npm run lint
- テストを実行します:
npm test
- 変更をコミットします:
git commit -m 'Add amazing feature'
- プッシュします:
git push origin feature/amazing-feature
- プルリクエストを開きます。
他のMCPサーバーの例については、github.com/modelcontextprotocol/servers を参照してください。