SSD Nodes Learn 🎉 VPS $4.99/月〜
ガイド Matt Connor著者 Matt Connor

Agent skills・MCP servers・rules filesの違いと選び方

Agent skills、MCP servers、rules filesの違いを、読み込み時期とトークンコストで比較します。6週間有効な手順、変化するデータ、常時必要な事実の選び方が分かります。

Agent skills、MCP servers、rules files の違い:簡潔な答え

Agent skills、MCP servers、rules files は、いずれもコーディングエージェントに知識を与えます。知識の用途に応じて選択してください。MCP(model context protocol)は、次に参照したときに内容が変わる可能性があるデータに適しています。skill は、今日文書化しても 6 週間後に正しいままである手順に適しています。rules file は、すべてのセッションで必ず守る必要がある少数の事実に適しています。

この選択にはコストがあり、そのコストはコンテキストです。エージェントが必要としない指示に使うトークンは、エージェントが読み取るコードに使えません。また、リクエストごとにコンテキスト全体が再送されるため、そのトークンには毎回費用が発生します。したがって、重要なのは、どの仕組みでその作業を実行できるかではありません。多くの場合、3 つすべてで実行できます。重要なのは、使われないまま置かれている間のコストが最も低い仕組みはどれかという点です。

使用前に把握しておくべきコスト

3 つは異なるタイミングで読み込まれます。このタイミングが、両者の違いを決めます。

ルールファイルは、起動時に毎回、関連性に関係なく全体が読み込まれます。Claude Code は各会話の開始時に CLAUDE.md を読み込み、長さに関係なく全体をロードします。ドキュメントでは、各ファイルを 200 行未満にすることを推奨しています。ファイルが長いほどコンテキストを多く消費し、内容も一貫して守られにくくなるためです。この 2 つの影響は同じ方向に働くため、900 行のルールファイルは役に立たないどころか、状況を悪化させます。

スキルは 2 段階で読み込まれます。起動時には、各 SKILL.md frontmatter の description 行だけがコンテキストに入り、モデルはそのスキルの存在と、おおよその適用場面を把握します。本文はスキルが呼び出されたときに読み込まれます。そのため、400 行のリファレンスドキュメントでも、必要になるまでコストはほとんどかかりません。

以前は MCP サーバーが最も高コストでした。現在も多く見られる比較の大半は、ここが古くなっています。現在の Claude Code では、tool search がデフォルトで有効です。起動時に読み込まれるのはツール名とサーバーの instructions フィールドだけで、完全な JSON (JavaScript object notation) スキーマは Claude が検索するまで遅延されます。サーバーを追加しても、起動時に数千トークンを消費することはなくなりました。ただし、コストがゼロになったわけではありません。また、tool search を無効にした構成では、依然として全コストが起動時に発生します。

ChartStartup and post-use context cost, estimated tokens
The data behind this chart
[
  {
    "label": "Rules file, 200 lines",
    "at_startup": "2,500",
    "after_use": "2,500"
  },
  {
    "label": "Skill, 12 KB body",
    "at_startup": 40,
    "after_use": "3,000"
  },
  {
    "label": "MCP server, tool search on",
    "at_startup": 500,
    "after_use": "3,200"
  },
  {
    "label": "MCP server, tool search off",
    "at_startup": "4,500",
    "after_use": "4,500"
  }
]

これらは推定値であり、お使いのマシンで測定した値ではありません。各仕組みが読み込むテキスト量を基に、1 トークンあたり約 4 文字として算出しています。200 行のルールファイルは約 10 KB の markdown、スキルの説明は約 160 文字、12 個のツールを公開するサーバーは約 18 KB のスキーマと 2 KB の instructions ブロックを持つ想定です。Claude Code は各ツールの説明と各サーバーの instructions フィールドを 2 KB で切り詰めるため、この部分には上限があります。次のセクションでは、実際の値を自分で確認する方法を説明します。

最初の 2 行はまとめて読んでください。ルールファイルは、誰も必要としなかったセッションでも 2,500 トークンを消費します。スキルは同じセッションで 40 トークンを消費し、10 回に 1 回、スキルが実行されるセッションでは 3,000 になります。最後の 2 行は同じサーバーについて、tool search を有効にした場合と無効にした場合を示しています。消費量はそれぞれ 500 トークンと 4,500 トークンです。この差が、MCP のコンテキスト肥大化に関する古い助言が今も広まっている理由です。

tool search には tool_reference ブロックをサポートするモデルが必要です。2026 年 8 月時点では、Claude Sonnet 4.5、Haiku 4.5、Opus 4.5 以降が該当します。ANTHROPIC_BASE_URL がファーストパーティではないホストを指している場合、Claude Code は tool search を無効にします。ほとんどのプロキシがこれらのブロックを転送しないためです。ENABLE_TOOL_SEARCH を設定して動作を制御します。false はすべてのスキーマを起動時に読み込み、true はすべてを遅延し、auto はコンテキストウィンドウの 10% 以内に収まる場合だけ起動時に読み込みます。

# Load schemas up front only if they fit in 5% of the window
ENABLE_TOOL_SEARCH=auto:5 claude

データは呼び出しごとに変わりますか。

まずこの点を確認してください。これにより、選択肢を1つ除外できます。エージェントが、次に参照したときに内容が変わっている可能性のある情報を読み書きする必要があるなら、サーバーが必要です。課題管理システム、データベース、監視ダッシュボード、独自の内部 API(application programming interface)などが該当します。内容を書き留めても解決にはなりません。他の人がレコードを編集した時点で、書き留めた内容は古くなるためです。

誰も保守しなくても6週間後に正しいままであるなら、スキルが適しています。リリース用チェックリスト、移行手順、エラーレスポンスの形式、このリポジトリでテストを記述する方法などです。スキルは git に保存するファイルです。ポートもプロセスもなく、誤った内容になる以外の障害要因もありません。誤りはコードレビューで検出できます。

まだ検討していない作業にも適用する必要がある1つの事実なら、ルールファイルに記述してください。Run make lint before committing. Never push to main. Handlers live in src/api/handlers/. それぞれ1行で記述します。項目が手順に発展した時点で、それは事実ではなく手順になっています。そのため、スキルに移してください。

ルールファイルで十分な場合

ルールファイルは複数の場所から読み込まれます。範囲の広い順に、管理ポリシーファイル、個人用の ~/.claude/CLAUDE.md、プロジェクトの ./CLAUDE.md または ./.claude/CLAUDE.md、そして gitignore 対象の ./CLAUDE.local.md です。検出されたファイルは相互に上書きされず、連結されます。作業ディレクトリに近いファイルほど後に読み込まれます。

Claude Code が読み込むのは CLAUDE.md であり、AGENTS.md ではありません。リポジトリに他のツール用の AGENTS.md がすでにある場合は、内容が分岐する 2 つのコピーを管理しないでください。

ln -s AGENTS.md CLAUDE.md

シンボリックリンクでは、成功時に何も表示されません。セッションを開始して /context を実行し、Memory files の下に CLAUDE.md が表示されることを確認します。そこに表示されない場合、エージェントはそのファイルを一度も認識していません。言い換えても解決しません。Claude 固有の行も追加する場合は、代わりに import 形式を使用し、import の下に記述します。

@AGENTS.md

## Claude Code

Use plan mode for changes under `src/billing/`.

ここには注意点があります。@path の import ではコンテキストは節約されません。import されたファイルは、参照元のファイルとともに起動時に展開され、最大 4 段階まで読み込まれます。600 行のルールファイルを 6 つの import に分割しても、人間にとって整理しやすくなるだけです。トークンコストは正確に変わりません。レイアウトを決める前に、AGENTS.md と人間向けの対応ファイルに関する規約 を読む価値があります。

コストを削減できるのは、.claude/rules/paths フィールドを指定する方法です。paths フロントマターを持つルールファイルは、エージェントがパターンのいずれかに一致するファイルを操作した場合にだけ読み込まれます。

---
paths:
  - "src/api/**/*.ts"
---

# API rules

- Every endpoint validates its input.
- Use the standard error response shape.

paths フィールドのないルールは、.claude/CLAUDE.md と同じ優先度で起動時に読み込まれます。したがって、実用的な構成は短い無条件ルールと、1 つのディレクトリ内でだけ必要な内容に指定する paths リストの組み合わせです。

スキルが必要な場合

スキルは、内部に SKILL.md を含むディレクトリです。個人スキルは ~/.claude/skills/<name>/SKILL.md に置かれ、マシン上のすべてのプロジェクトに適用されます。プロジェクトスキルは .claude/skills/<name>/SKILL.md に置かれ、リポジトリとともに管理されるため、他のファイルと同様に pull request でレビューできます。

mkdir -p ~/.claude/skills/summarize-changes
---
name: summarize-changes
description: Summarizes uncommitted changes and flags anything risky. Use when the user asks what changed, wants a commit message, or asks to review their diff.
---

Run `git status` and `git diff` against the merge base.
Group the changes by intent, not by file.
Call out anything touching auth, migrations or deletions.

description は、スキルの実行前にそのファイルからコンテキストへ入る唯一の部分です。そのため、2 つの役割を担います。スキルの機能を示すと同時に、使用するタイミングも示します。「デプロイを支援します」のような説明では、モデルがリクエストと照合できません。その結果、スキルは実行されず、スキルが機能しないと判断することになります。

ディレクトリ名がコマンドになるため、上の例では /summarize-changes になります。個人スキルまたはプロジェクトスキルでは、frontmatter の name は一覧に表示するラベルだけを設定します。

スキルを呼び出すと、そのレンダリング済みの内容が 1 つのメッセージとして会話に入り、セッションの残りの間保持されます。Claude Code は、後続のターンでファイルを再読込しません。1 回限りの手順ではなく、継続的に適用する指示を記述してください。また、本文は簡潔に保ってください。その時点以降、本文の各行がリクエストごとに繰り返し発生するコストになるためです。自動コンパクションの後、Claude Code は各スキルの直近の呼び出しを再び追加します。各スキルの先頭 5,000 トークンを、合計 25,000 トークンの予算内に保持します。1 回のセッションで複数の大きなスキルを呼び出すと、古いものから完全に削除されます。そのため、長い会話の後にスキルの影響がなくなったように見えることがあります。再度呼び出せば、再び利用できます。同じ手順を複数のコードベースに適用する場合は、ファイルをコピーするのではなく、複数のリポジトリで 1 つのスキルを共有するようにしてください。

MCP サーバーが必要になる場合

追加は 1 つのコマンドで行え、トランスポートによって構成が決まります。

# Remote HTTP server
claude mcp add --transport http notion https://mcp.notion.com/mcp

# Remote HTTP server behind a bearer token
claude mcp add --transport http secure-api https://api.example.com/mcp \
  --header "Authorization: Bearer your-token"

# Local stdio server: everything after -- is passed through untouched
claude mcp add --env AIRTABLE_API_KEY=YOUR_KEY --transport stdio airtable \
  -- npx -y airtable-mcp-server

-- が重要です。stdio サーバーでは、Claude Code 自身のオプションとサーバーを起動するコマンドラインを分離します。省略すると、サーバー向けの --port 8080claude mcp add のオプションとして解析され、拒否されます。

claude mcp list
claude mcp get notion

claude mcp addAdded ... の行で確認を返しますが、これは設定がディスクに書き込まれたことしか示しません。実際の状態を確認するコマンドは claude mcp list です。各サーバーの横に、✔ Connected! Needs authentication✘ Failed to connect のいずれかのヘルスステータスが表示されます。失敗ステータスは Claude Code がそのサーバーに到達できなかったことを示し、一覧表示コマンド自体が失敗したことを示すものではありません。セッション内では、/mcp でサーバーごとの同じ情報に加えてツール数も確認できます。

MCP サーバーへの各呼び出しは独立しており、必要な情報をすべて保持します。これが、MCP サーバーが以前のリクエストを記憶しない理由です。これは、その影響を受け入れる必要がある設計上の選択です。保持する価値のある状態は、データベースやファイルなど、サーバーの背後に保存する必要があります。そして、その保存先は新たに運用する対象になります。

MCP サーバーは実行する必要があるプロセスです

ベンダー比較で省かれているコストがあります。スキルはファイルです。一方、MCP サーバーはどこかで実行するソフトウェアです。その実行場所が VPS (virtual private server) であれば、稼働時間の維持は自分の責任になります。

stdio サーバーは、コストが低いケースです。セッション開始時に Claude Code が子プロセスとして起動し、セッション終了時に停止します。監視するものはなく、独自のスケジュールでパッチを適用する必要もありません。リモート HTTP サーバーは長時間稼働するサービスであり、他の長時間稼働サービスと同じ運用が必要です。

[Unit]
Description=Notes MCP server
After=network-online.target
Wants=network-online.target

[Service]
User=mcp
WorkingDirectory=/srv/notes-mcp
ExecStart=/usr/bin/node /srv/notes-mcp/dist/server.js
Environment=PORT=8931
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
PrivateTmp=true

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now notes-mcp
systemctl is-active notes-mcp
journalctl -u notes-mcp -n 50 --no-pager

systemctl is-activeactive を出力するはずです。failed と出力された場合は、journal に原因が記録されています。初回実行時は、ほとんどの場合、環境変数が未設定か、別のプロセスがポートをすでに使用しています。ここでは Restart=on-failure は省略できません。クラッシュした MCP サーバーは、自動的に異常を通知しないためです。エージェントから issue tracker を読み取れないと通知されて、初めて問題に気付くことになります。

プロセスを 127.0.0.1 にバインドし、その前段に TLS (transport layer security) 対応のリバースプロキシを配置します。データベースに接続でき、認証なしで公開ポートに応答する MCP サーバーは、公開状態にしたデータベースと同じです。VPS 上で MCP サーバーを実行するでは、プロキシ、証明書、ファイアウォールの設定を適切に説明しています。

次に、継続的に発生する作業を正確に見積もります。サービスは、接続するエージェントとは無関係のスケジュールでセキュリティ更新を適用します。OAuth トークンは期限切れになり、都合の悪いタイミングで claude mcp list! Needs authentication の出力を開始します。認証情報は設定ファイルまたは Authorization ヘッダーに保存されるため、他の Secret と同じように管理する必要があります。これはそれだけで扱うべきテーマであり、AI エージェントの手の届かない場所で Secret を管理するで説明しています。スキルには、このような作業は一切ありません。

構築する前に、代替案と比較してください。提案するサーバーの背後にあるデータが四半期に 1 回程度しか変わらないなら、エージェントに参照先と各フィールドの意味を伝えるスキルのほうが、稼働を維持し続ける必要のあるサービスより安価です。

独自のコンテキストコストを測定する方法

推測をやめ、セッション内で /context を実行します。起動時の内訳として、システムプロンプト、メモリファイル、ツール、MCP サーバーと、それぞれのトークン量が表示されます。

2 つ確認します。メモリファイルで、想定しているすべてのルールファイルが一覧に含まれていることを確認します。ファイルがない場合、エージェントからは認識できません。そのため、指示が無視される場合は、最初にファイルの欠落を確認します。次に、各サーバーのコストを確認します。月に 2 回しか使わないサーバーが一覧の中で大きな割合を占めている場合は、/mcp で無効にし、必要なセッションで有効に戻します。どちらの場合も設定は保持されます。

リモートサーバーでは、cached 2h ago · connects on first use · 5 tools のようなステータスが表示されることもあります。これは、Claude Code が起動時に接続せず、前回のセッションからツール一覧を読み込んだことを示します。ツールが初めて呼び出された時点で接続します。最初のメッセージからツールを利用できるため、修正は不要です。すべてのサーバーを起動時に接続させる場合は、MCP_DISCOVERY_CACHE=0 を設定します。全体像については、Claude Code のコンテキストウィンドウを管理する方法でコンパクション後も保持される内容を確認できます。また、これらのトークンに実際にかかるコストでは、数値を金額に換算して説明しています。

スキルが起動しないのはなぜですか?

通常の原因は description です。スキルが実行される前のコンテキストに含まれる唯一のテキストであるため、状況が記述されていなければ一致しません。文にトリガーを記述してください。「ユーザーが変更内容を確認したい場合、コミットメッセージを求めた場合、または差分のレビューを依頼した場合に使用します。」曖昧な説明はエラーを表示せずに失敗するため、原因を見つけにくくなります。

2 つ目の原因は frontmatter のタイプミスです。こちらは明確にエラーになります。不明なキーは直ちに拒否されます。

Unexpected key(s) in SKILL.md frontmatter: argument-hint. Allowed properties are: allowed-tools, compatibility, description, license, metadata, name

3 つ目は配置場所です。プロジェクトスキルは、作業ディレクトリの .claude/skills/ と、リポジトリのルートまでのすべての親ディレクトリから読み込まれます。開始した場所より下のネストされたディレクトリにあるスキルは、起動時には読み込まれません。エージェントがそのサブディレクトリ内のファイルを初めて読み取るか編集した時点で読み込まれます。それまでは自動補完に表示されず、名前で呼び出すこともできません。

MCP で同様にエラーを表示せず失敗するのは、urltype がなく、.mcp.json のエントリがある場合です。Claude Code は type のないエントリを stdio サーバーとして読み取るため、そのエントリをスキップし、次のメッセージを表示します。

MCP server "notes" has a "url" but no "type"; add "type": "http" (or "sse" / "ws") to this entry

3 つすべてを組み合わせる

これらの仕組みは、同じ場所を奪い合うものではありません。うまく機能する構成では、それぞれを低コストで使える場所に配置します。ルールファイルには、どこでも当てはまる少数の行だけを記載します。Skills には手順を記載し、必要な場合にだけ読み込みます。内容を事前に予測できないシステムには、1 台の MCP server、場合によっては 2 台を接続します。前者の仕組みについてまだ理解を深めている段階であれば、agent skill とは何かで形式を詳しく説明しています。

どこに配置すべきかについての議論の多くは、1 つのテストで判断できます。それを削除して、新しいセッションを開始し、agent にタスクを与えます。agent の動作が単に遅くなっただけなら、それは skill に記載すべき内容でした。agent が確信を持って誤った回答をするなら、それはルールファイルに記載すべき内容でした。agent が情報をまったく取得できないなら、server が必要でした。その場合は、その server を稼働し続けるための計画も必要になります。

FAQ

スキルを作成すべきですか、それとも MCP server を立ち上げるべきですか?

情報が呼び出しごとに変わるかどうかで判断します。issue tracker、database、dashboard など、他の人が編集できる最新の状態をエージェントが読み取る必要がある場合は、MCP server が必要です。記録が変わった時点で、書き留めた内容が古くなるためです。6 週間後でも正しい回答を一度書いておけるなら、skill を作成します。skill は git 内のファイルであり、実行するプロセスも公開するポートもパッチ適用のスケジュールも必要ありません。そのため、可能な場合は skill のほうが低コストです。

MCP server は依然として context window を使い切りますか?

以前より大幅に少なくなっています。現在の Claude Code では tool search がデフォルトで有効です。そのため、セッション開始時に読み込まれるのは tool 名と server の instructions フィールドだけで、完全な schema は Claude が検索した時点で取得されます。tool search が無効な場合は、最初に読み込まれます。ENABLE_TOOL_SEARCH=false を使用している場合、ANTHROPIC_BASE_URL の接続先が first-party ではない proxy の場合、または Claude 4.5 世代より前の model を使用している場合が該当します。/context を実行して現在の状況を確認してください。古い比較記事の数値は、最初に読み込む方式を前提としているためです。

Claude Code は AGENTS.md を読み込みますか?

いいえ。Claude Code が読み込むのは CLAUDE.md です。repository に他の agent 用の AGENTS.md がすでにある場合は、2 つのコピーを保持せず、一方をもう一方に向けてください。通常の symlink には ln -s AGENTS.md CLAUDE.md を実行します。または、CLAUDE.md の先頭行に @AGENTS.md を記述し、その下に Claude 固有の指示を追加します。その後、セッションを開始して /context を実行し、CLAUDE.md が Memory files の下に表示されることを確認してください。

セッションの途中で skill の効果がなくなったのはなぜですか?

通常の原因は auto-compaction です。会話が要約されると、Claude Code は各 skill の直近の呼び出しを再度アタッチし、それぞれの先頭 5,000 tokens までを、全 skill 合計 25,000 tokens の予算内に収めます。予算は、直近に呼び出された skill から順に使用されます。そのため、大きな skill を複数呼び出している場合、古い skill は完全に削除されます。skill を再度呼び出すと、完全な内容が復元されます。

長い rules file が毎回のセッションで読み込まれないようにするにはどうすればよいですか?

状況によってのみ必要な部分を paths フィールド付きの .claude/rules/ file に移してください。これにより、agent が該当する file にアクセスしたときだけ各 file が読み込まれます。file を @path import に分割しても効果はありません。import された file は展開され、参照元の file とともに起動時に読み込まれるためです。継続的な事実ではなく複数の手順からなる操作は、skill にしてください。skill body は呼び出されるまでコストが発生しないためです。