mcpField
W
web-fetch

web-fetch

github.com/mathews-tom生産性338123 回インストール1 日前に更新
リポジトリ

web-fetch について

Web Fetch は、Claude Code 内蔵の WebFetch ツールまたは curl でウェブコンテンツを取得・抽出するスキルです。読みやすいページ、未加工データ、認証付きリクエストなどに応じた使い分けを説明します。

主な機能

  1. 01用途に応じて WebFetch と curl を選択
  2. 02読みやすいページ内容を取得
  3. 03JSON、ヘッダー、認証に対応
  4. 04HTTP メソッドとページネーションを解説
  5. 05エラー、タイムアウト、制限を説明

活用シーン

  1. 01ドキュメントや記事の閲覧
  2. 02認証が必要な API レスポンスの取得
  3. 03大きな JSON から必要な項目を抽出

MCP 対応

MCP サーバーは不要で、Claude Code の標準 WebFetch と curl で Fetch MCP の操作を代替できると説明しています。Fetch MCP のツールと代替手段の対応も示します。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mathews-tom/armory --skill web-fetch

インストール後、Claude Code で/web-fetchを入力して読み込まれたか確認します。

同梱ファイルevals/cases.yaml

詳細

Web Fetch

すべてのウェブコンテンツの取得には、curl(Bash)または組み込みのWebFetchツールを使用します。MCP サーバーは不要です。Claude Code のネイティブツールを使えば、あらゆる Fetch MCP 操作をより細かく制御できます。

クイックリファレンス

Fetch MCP ツール代替手段使用する場面
fetch_htmlcurl -s URL解析用に生の HTML が必要な場合
fetch_jsoncurl -s URL | jq '.'API レスポンスや構造化データ
fetch_markdownWebFetch読みやすいページコンテンツ(デフォルトの出力は Markdown)
fetch_txtcurl -s URL または WebFetchプレーンテキストの抽出

基本の選択肢: 一般的なページコンテンツにはWebFetchを使用します。ヘッダー、認証、POST ボディ、生の形式を制御する必要がある場合はcurlを使用します。


WebFetch(組み込みツール)

WebFetchツールは URL を取得し、整形された Markdown コンテンツを返します。JavaScript でレンダリングされるページに対応し、ナビゲーションや定型部分を取り除いて、読みやすいテキストを返します。

最適な用途:ドキュメントページ、記事、ブログ投稿、README ファイルなど、生の HTML ではなく読みやすいテキストが必要なコンテンツ。

制限事項:カスタムヘッダー、POST ボディ、Cookie 管理には対応していません。これらにはcurlを使用します。


curl のパターン

HTML の取得
curl -sL "https://example.com/page"
フラグ用途
-sサイレントモード — 進行状況の表示を抑制
-Lリダイレクト(3xx)に従う
-o file.html標準出力の代わりにファイルへ保存
-Iヘッダーのみ(HEAD リクエスト)
-i出力にレスポンスヘッダーを含める

xmllintまたはpython3を使って取得し、特定の要素を抽出します。

curl -sL "https://example.com" | python3 -c "
from html.parser import HTMLParser
import sys

class TitleParser(HTMLParser):
    def __init__(self):
        super().__init__()
        self.in_title = False
        self.title = ''
    def handle_starttag(self, tag, attrs):
        self.in_title = tag == 'title'
    def handle_data(self, data):
        if self.in_title:
            self.title += data
    def handle_endtag(self, tag):
        if tag == 'title':
            self.in_title = False

p = TitleParser()
p.feed(sys.stdin.read())
print(p.title)
"
JSON の取得
curl -s "https://api.example.com/v1/data" \
  -H "Accept: application/json" | jq '.'

JSON レスポンスのフィルタリングと整形:

# Extract specific fields
curl -s "https://api.example.com/users" | jq '.[] | {name, email}'

# Filter by condition
curl -s "https://api.example.com/items" | jq '[.[] | select(.status == "active")]'

# Count results
curl -s "https://api.example.com/items" | jq 'length'

# Get nested value
curl -s "https://api.example.com/config" | jq '.database.host'
プレーンテキストの取得
# Strip HTML tags for plain text
curl -sL "https://example.com/page" | python3 -c "
import html.parser, sys

class Stripper(html.parser.HTMLParser):
    def __init__(self):
        super().__init__()
        self.text = []
    def handle_data(self, d):
        self.text.append(d)
    def get_text(self):
        return ''.join(self.text)

s = Stripper()
s.feed(sys.stdin.read())
print(s.get_text())
"

またはWebFetchを使用すると、整形された Markdown が返されます。多くの用途ではプレーンテキストに近い内容です。


認証付きリクエスト

Bearer トークン
curl -s "https://api.example.com/data" \
  -H "Authorization: Bearer $API_TOKEN" \
  -H "Content-Type: application/json"
ヘッダー内の API キー
curl -s "https://api.example.com/data" \
  -H "X-API-Key: $API_KEY"
クエリパラメーター内の API キー
curl -s "https://api.example.com/data?api_key=$API_KEY"
Basic 認証
curl -s -u "username:$PASSWORD" "https://api.example.com/data"

認証情報は環境変数に保存してください。トークンやパスワードをコマンドに直接記述しないでください。


POST、PUT、PATCH、DELETE

JSON ボディを使った POST
curl -s -X POST "https://api.example.com/items" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $API_TOKEN" \
  -d '{
    "name": "item-name",
    "value": 42
  }' | jq '.'
フォームデータを使った POST
curl -s -X POST "https://api.example.com/upload" \
  -F "file=@./document.pdf" \
  -F "description=Uploaded via curl"
PUT(全体更新)
curl -s -X PUT "https://api.example.com/items/123" \
  -H "Content-Type: application/json" \
  -d '{"name": "updated-name", "value": 99}' | jq '.'
PATCH(部分更新)
curl -s -X PATCH "https://api.example.com/items/123" \
  -H "Content-Type: application/json" \
  -d '{"value": 100}' | jq '.'
DELETE
curl -s -X DELETE "https://api.example.com/items/123" \
  -H "Authorization: Bearer $API_TOKEN"

高度なパターン

ページネーション
PAGE=1
while true; do
  RESPONSE=$(curl -s "https://api.example.com/items?page=$PAGE&per_page=50" \
    -H "Authorization: Bearer $API_TOKEN")
  COUNT=$(echo "$RESPONSE" | jq 'length')
  echo "$RESPONSE" | jq '.[]'
  [ "$COUNT" -lt 50 ] && break
  PAGE=$((PAGE + 1))
done
タイムアウトと再試行
curl -s --connect-timeout 10 --max-time 30 \
  --retry 3 --retry-delay 2 \
  "https://api.example.com/data"
レスポンスヘッダーの確認
curl -sI "https://example.com" | grep -i "content-type"
ステータスコードとともにレスポンスを保存
HTTP_CODE=$(curl -s -o /tmp/response.json -w "%{http_code}" "https://api.example.com/data")
echo "Status: $HTTP_CODE"
cat /tmp/response.json | jq '.'
Cookie の処理
# Save cookies
curl -s -c /tmp/cookies.txt "https://example.com/login" \
  -d "user=admin&pass=$PASSWORD"

# Reuse cookies
curl -s -b /tmp/cookies.txt "https://example.com/dashboard"

エラー処理

HTTP ステータス意味解決方法
301/302リダイレクト-Lフラグを追加してリダイレクトに従う
401認証されていないトークン/認証情報を確認し、環境変数が設定されているか確認
403アクセス禁止権限不足または IP 制限
404見つからないURL パスを確認する。リソースが削除されている可能性があります
429レート制限Retry-Afterヘッダーに従い、リクエスト間に遅延を設ける
500サーバーエラー1 回再試行し、解消しない場合は上流に報告する
SSL error証明書の問題-k(安全でない)を使用せず、根本原因を解決する
Timeoutネットワーク/サーバーの応答が遅い--max-timeを増やし、接続を確認する

複雑な操作を行う前に、URL に到達できることを確認してください。

curl -sI -o /dev/null -w "%{http_code}" "https://example.com"

制限事項

  • WebFetch はカスタムヘッダー、POST ボディ、Cookie をサポートしていません。認証が必要なリクエストや状態を保持するリクエストには curl を使用してください。
  • curl は JavaScript をレンダリングしません。JavaScript を多用する SPA には、レンダリングされたコンテンツを処理できる WebFetch を優先してください。
  • 大きなレスポンス はコンテキストの上限を超えることがあります。コンテキストに読み込む前に、jq、head、または python3 を通して必要なデータだけを抽出してください。
  • バイナリコンテンツ(画像、PDF、アーカイブ)は、標準出力にパイプせず、-o を指定してディスクに保存してください。

調整ルール

  1. Web ページの読み取りには、デフォルトで WebFetch を使用してください。 クリーンな Markdown を返し、JavaScript のレンダリングに対応していて、フラグも不要です。ヘッダー、認証、POST、または生の形式の制御が必要な場合にのみ curl に切り替えてください。
  2. JSON は必ず jq を通してください。 生の JSON をコンテキストに含めるとトークンを浪費します。必要なフィールドだけに絞り込んでください。
  3. 認証情報をハードコードしないでください。 $ENV_VAR 参照を使用してください。変数が設定されていない場合は、直ちにエラーを提示してください。
  4. デフォルトでリダイレクトに従ってください。 リダイレクトの経路を確認する必要がある場合を除き、curl では常に -L を使用してください。
  5. curl のすべての呼び出しで、-s(サイレント)を優先してください。 進行状況メーターは出力にノイズを加えます。

コメント