Filesystem MCPサーバーの使い方 — 読み書きできるディレクトリを絞る権限設計
Filesystem MCPサーバーの導入手順と、アクセス可能なディレクトリを決める2つの方式(コマンドライン引数とMCP Roots)の違いを扱います。Claude Codeでの権限設計の判断基準も示します。
Filesystem MCPサーバーは、指定したディレクトリだけに読み書きを絞ってファイル操作をツール化する公式MCPサーバーです。Claude Codeにはもともとファイルを読み書きするネイティブなツールが備わっているため、まず気になるのは「なぜ別途MCPサーバーが要るのか」でしょう。この記事では導入手順に加えて、その疑問への答えと、アクセス可能なディレクトリを決める2つの方式の違いを扱います。
MCPプロトコル自体の仕組みはMCPとは、MCPツールの権限ルールの一般的な書き方はMCPセキュリティガイドが対応します。
Filesystem MCPサーバーとは
Filesystem MCPサーバーとは、npmで@modelcontextprotocol/server-filesystemとして公開されているNode.js製の公式MCPサーバーで、ファイルの読み書き・ディレクトリの作成や一覧・移動・検索・メタデータ取得をツールとして提供します。Model Context Protocolの公式リポジトリmodelcontextprotocol/serversに含まれる、リファレンス実装の1つです。
このサーバーの設計上の中心は、アクセスを許可するディレクトリの制御です。指定したディレクトリの外にあるファイルへは、どのツールを使っても届きません。
用意されているツール
主なツールは次の13種類です。
| ツール | できること |
|---|---|
read_text_file | できることファイルをUTF-8テキストとして読む(head / tailで先頭・末尾N行のみ指定可) |
read_media_file | できること画像・音声などをBase64で返す |
read_multiple_files | できること複数ファイルを一括読み取り(一部失敗しても他は続行) |
write_file | できることファイルの新規作成・上書き |
edit_file | できることパターンマッチによる部分編集。dryRunで適用前にdiffを確認できる |
create_directory | できることディレクトリ作成(既存なら何もしない) |
list_directory / list_directory_with_sizes | できることディレクトリの一覧。後者はサイズ・件数の集計付き |
move_file | できることファイル・ディレクトリの移動やリネーム |
search_files | できることグロブパターンでの再帰検索 |
directory_tree | できることディレクトリ構造をJSONツリーで取得 |
get_file_info | できることサイズ・作成日時・更新日時・権限などのメタデータ |
list_allowed_directories | できること現在アクセスを許可されているディレクトリの一覧 |
各ツールにはMCPのToolAnnotationsが設定されており、読み取り専用か・べき等か・破壊的操作かをクライアント側が事前に判別できます。ファイル操作系ツールはすべてopenWorldHint: falseで、外部ネットワークには一切出ない設計です。
アクセス可能なディレクトリを決める2つの方式
ここがこのサーバーの核心です。アクセスを許可するディレクトリは、コマンドライン引数とMCP Rootsという2つの方式のどちらかで決まります。両方は同時に使えず、Rootsに対応したクライアントが接続すると、クライアント側の設定がサーバー起動時の引数を完全に置き換えます。
| 方式 | 決め方 | 動的更新 | 向くケース |
|---|---|---|---|
| コマンドライン引数 | 決め方サーバー起動時に固定 | 動的更新されない(再起動が必要) | 向くケースClaude Codeの作業ディレクトリと別の固定パスに絞りたいとき |
| MCP Roots(推奨) | 決め方クライアントがroots/listで通知する内容に従う | 動的更新される(roots/list_changedで自動反映) | 向くケースClaude Codeの作業ディレクトリにそのまま追随させたいとき |
方式1: コマンドライン引数で固定する
claude mcp add filesystem -- npx -y @modelcontextprotocol/server-filesystem /path/to/project /path/to/shared-dataこの方式では、Claude Codeの作業ディレクトリが変わっても、MCPサーバー側の許可ディレクトリは固定されたままです。共有.mcp.jsonにチーム向けの定義を置き、誰が接続しても常に同じデータ領域だけを触らせたい、といった用途に向きます。
方式2: MCP Rootsで動的に同期する(推奨)
コマンドライン引数を省略してサーバーを起動すると、Rootsに対応したクライアントからの通知を待つ状態になります。
claude mcp add filesystem -- npx -y @modelcontextprotocol/server-filesystemClaude Codeはroots/listのリクエストに対し、セッションの起動ディレクトリと、--add-dir・/add-dir・設定ファイルのadditionalDirectoriesで追加したすべてのディレクトリを返します。ディレクトリの追加・削除があればnotifications/roots/list_changedが飛び、サーバー側の許可リストも自動的に更新されます。つまりこの方式では、Filesystem MCPサーバーの境界はClaude Code自身の作業ディレクトリ設定をそのまま追随します。
引数もRoots対応クライアントからの通知も無い場合、サーバーは初期化時にエラーで停止します。少なくとも1つの許可ディレクトリが必須という制約は、どちらの方式でも変わりません。
なぜClaude Codeでこのサーバーが要るのか
ネイティブなRead/Write/Editツールがあるのに、あえてFilesystem MCPサーバーを足す理由は主に3つです。
- 作業ディレクトリと切り離した固定境界がほしい — Claude Codeを様々なディレクトリから起動する運用でも、特定の共有データ領域だけは常に同じパスで触らせたい場合、コマンドライン引数方式が有効です
- 複数のMCPクライアントで同じツール名を揃えたい — ファイル操作ツールを内蔵しないMCPクライアントと併用するワークフローでは、共通のツールインターフェースとして導入する意味があります
- ツール単位で許可・拒否を分けたい — Claude Codeの権限ルールは
mcp__<サーバー名>__<ツール名>という命名でMCPツール単位に指定でき、Filesystem MCPサーバーのwrite_fileやedit_fileも対象にできます。ネイティブなWriteツールの権限モードとは独立に、「読み取り系のMCPツールだけ許可し書き込み系はaskのまま残す」といった設定を、ネイティブツールの挙動を変えずに追加できます
逆に言えば、単に「Claude Codeでファイルを読み書きしたい」だけならネイティブツールで足りており、このMCPサーバーは不要です。境界を二重化する必要が明確にあるときに導入する、という判断が妥当です。
大きなディレクトリを扱うときの下見
list_directory_with_sizesは、ファイル数の多いディレクトリを扱う前の下見に向いています。ファイルサイズでのソートと、合計サイズ・ファイル数・ディレクトリ数の集計が一度で返るため、「まず全体をdirectory_treeで読み込む」よりもトークン消費を抑えられます。ログディレクトリや生成物の置き場のように、中身の量が読めない場所を最初に触るときは、list_directoryよりlist_directory_with_sizesから入るほうが安全です。
データベース接続用のMCPサーバーと組み合わせる場面もあります。読み取り専用のデータベース接続(MCPからデータベースに接続する方法参照)とFilesystem MCPサーバーを両方つなぎ、DBから抽出したレポートをファイルとして書き出す、といった構成です。この場合もFilesystem MCPサーバー側の許可ディレクトリは出力先だけに絞り、読み取り専用のデータベース側とは別の権限設計にするのが安全です。
よくあるつまずき
list_allowed_directoriesで確認してから動かす
意図した範囲外のファイルにアクセスできない、あるいは逆に想定より広く見えている場合は、まずlist_allowed_directoriesを呼んで現在の許可リストを確認します。コマンドライン引数とRootsのどちらが効いているかで結果が変わるため、原因の切り分けに直結します。
edit_fileはdryRunで先に確認する
edit_fileはパターンマッチで複数箇所を同時に書き換えられる分、意図しない箇所まで一致することがあります。dryRun: trueでdiffを確認してから本適用する運用が、公式ドキュメントでも推奨されています。
Rootsが効かない場合はバージョンを疑う
コマンドライン引数を省略したのにサーバーが初期化エラーで止まる場合、クライアントがRootsプロトコルに対応していないか、対応していても空のroots応答を返している状態です。Claude Codeであればバージョンが古い可能性を確認します。
よくある質問
Filesystem MCPサーバーはどこにインストールしますか
npmパッケージなので個別インストールは不要です。npx -y @modelcontextprotocol/server-filesystemでその都度取得・実行されます。バージョンを固定したい場合はグローバルインストールしてコマンドを直接指定する方法もあります。
許可ディレクトリの外を読もうとするとどうなりますか
拒否されます。すべてのファイル操作は許可ディレクトリの範囲内に制限される設計で、範囲外へのアクセス要求はエラーになります。
Claude Codeの--add-dirと何が違いますか
--add-dirはClaude Codeのネイティブなツール(Read/Write/Edit等)が触れる範囲を広げる機能です。Filesystem MCPサーバーはそれとは別の、MCPツール経由でのアクセス境界を持ちます。Roots方式で接続していれば、--add-dirで追加したディレクトリはこのMCPサーバー側にも自動的に反映されます。
書き込みだけを禁止する運用はできますか
サーバー自体にはそのような設定はありませんが、Claude Code側の権限ルールでwrite_fileやedit_fileに対応するMCPツール権限をdenyまたはaskにすれば、読み取り系ツールだけを自動許可する運用ができます。具体的な書き方は、冒頭で触れたMCPセキュリティガイドが詳しく扱っています。
プロジェクトチームで同じ設定を共有できますか
claude mcp addに--scope projectを付けると.mcp.jsonに書き込まれ、バージョン管理経由でチーム全員が同じ許可ディレクトリ設定を使えます。スコープの詳細はClaude Code MCP設定ガイドが扱っています。
まとめ
Filesystem MCPサーバーを入れるかどうかの判断は、「Claude Codeの標準的なファイル操作で足りているか」から始めるのが妥当です。足りていないと感じたら、次に決めるのはアクセス境界の作り方です。作業ディレクトリと切り離した固定パスに絞りたいならコマンドライン引数、Claude Code自身の作業ディレクトリ設定にそのまま追随させたいならMCP Rootsを選びます。後者はv2.1.203以降のClaude Codeで初めて動的更新が効くため、バージョンの確認を忘れずに。ローカルファイルを扱う他のMCPサーバーの選定はおすすめMCPサーバー10選も参考にしてください。