mcpField
V
Virtual Filesystem

Virtual Filesystem

ローカル
npmjs.comファイル・ストレージ336 週間前に更新

Virtual Filesystem について

Virtual Filesystemは、AIエージェント向けにPostgreSQLベースの永続ファイルワークスペースを提供するMCPサーバーです。セッション分離、名前付きストアの共有、ファイル検索に対応し、ホストのファイルシステムにはアクセスしません。

主な機能

  1. 01PostgreSQLによる永続ファイル保存
  2. 02セッションの自動分離
  3. 03名前付きストアの共有
  4. 04POSIX形式のファイル操作
  5. 05Globと正規表現による検索
  6. 06オプションの行レベルセキュリティ

活用シーン

  1. 01ツール呼び出し間でエージェントの作業ファイルを保持
  2. 02セッションをまたいだメモリの保存
  3. 03複数エージェント間でのファイル共有
  4. 04CI/CD成果物の保存と検索

MCP 対応

`read`、`write`、`glob`、`grep`などの標準MCPツールとしてファイル操作と検索を公開します。MCPクライアントからサーバーとして設定でき、セッションIDは自動処理されます。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"virtual-fs": {
"command": "npx",
"args": [
"-y",
"mcp-virtual-fs"
],
"env": {
"DATABASE_URL": "<DATABASE_URL>",
"VFS_AUTO_INIT": "<VFS_AUTO_INIT>",
"VFS_SESSION_ID": "<VFS_SESSION_ID>",
"VFS_ENABLE_RLS": "<VFS_ENABLE_RLS>"
}
}
}
}
起動コマンドnpx -y mcp-virtual-fs
設定が必要な環境変数
DATABASE_URLシークレットPostgreSQL connection string (e.g. postgresql://user:pass@host:5432/dbname)
VFS_AUTO_INITAuto-create database tables on startup (set to 'true' for first run)
VFS_SESSION_IDDeterministic session ID for resumable sessions across restarts
VFS_ENABLE_RLSEnable PostgreSQL Row Level Security for database-enforced session isolation

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npmmcp-virtual-fs0.2.2

ツール

11

掲載時のツール一覧 · 3 週間前に更新

パラメーター型必須説明
pathstringはいファイルの絶対パス(例:/src/index.ts)
storestringいいえセッションをまたいでアクセスするための名前付き永続ストア。セッションは一時的で(MCP 接続ごとに 1 つ)、名前付きストアは無期限に保持されます。省略すると、セッション独自の名前空間を使用します。

詳細

mcp-virtual-fs

npm version CI npm downloads License: MIT Node.js

AI エージェントに永続的な PostgreSQL ベースの仮想ファイルシステムを提供する MCP サーバーです。セッションごとに分離されたファイル操作、セッション間で共有できるストア、glob/grep 検索、行レベルセキュリティをサポートし、標準の Model Context Protocol ツールとしてすべての機能を利用できます。

あらゆる MCP クライアントに対応しています。Claude Desktop、Claude Code、Cursor、Windsurf、Cline などで動作します。

機能

  • 永続的なファイルストレージ — ファイルは PostgreSQL に保存され、プロセスの再起動、コンテナの再利用、再デプロイ後も保持されます
  • セッションの分離 — 各エージェントセッションに専用の名前空間が自動的に割り当てられ、設定は不要です
  • セッション間で共有できるストア — エージェント間のデータ共有や、エージェントの長期記憶に使える名前付きの永続ストアです
  • POSIX 形式の 11 個のツール — read、write、append、stat、ls、mkdir、rm、mv、glob、grep、stores
  • Glob/grep 検索 — パターン(**/*.ts)でファイルを検索したり、正規表現で内容を検索したりできます。PostgreSQL のトライグラムインデックスを利用します
  • 行レベルセキュリティ — マルチテナント環境でセッション間の分離をデータベース側で強制できます(任意)
  • 設定不要 — VFS_AUTO_INIT=true により初回実行時にテーブルを自動作成します

ユースケース

  • エージェントのスクラッチパッド — ツール呼び出しをまたいでファイルを読み書きできる永続的な作業領域を LLM エージェントに提供します
  • エージェントの長期記憶 — 名前付きストアを使って、セッションをまたいでメモ、コンテキスト、知識を保存します
  • マルチエージェントの連携 — 複数のエージェントがセッション間で共有できるストアを通じてファイルを共有します
  • サンドボックス化されたファイル操作 — エージェントはホスト OS ではなく、仮想ファイルシステムを操作します
  • CI/CD アーティファクトの保存 — ビルド出力、ログ、レポートを検索可能なファイルシステムに保存します

背景

エージェントはコンテキスト管理にファイルシステムを活用できますが、ストレージをエージェントのランタイムに結び付けると、ポッドの再起動やコンテナの再利用時にデータが失われます。この MCP サーバーは、ファイル操作を PostgreSQL に移すことでストレージをランタイムから切り離し、ホストのファイルシステムに触れることなく、エージェントに永続的で分離された検索可能なファイルストレージを提供します。

前提条件

  • Node.js 20 以降
  • PostgreSQL 14 以降(pg_trgm 拡張機能が必要です。ほとんどのディストリビューションに含まれています)

クイックスタート

1. PostgreSQL をセットアップする
# Using Docker
docker run -d --name vfs-postgres \
  -e POSTGRES_DB=vfs \
  -e POSTGRES_PASSWORD=postgres \
  -p 5432:5432 \
  postgres:16-alpine
2. MCP クライアントを設定する

MCP クライアントの設定ファイルに追加します(例:Claude Desktop の claude_desktop_config.json または Claude Code の .mcp.json)。

{
  "mcpServers": {
    "virtual-fs": {
      "command": "npx",
      "args": ["-y", "mcp-virtual-fs"],
      "env": {
        "DATABASE_URL": "postgresql://postgres:postgres@localhost:5432/vfs",
        "VFS_AUTO_INIT": "true"
      }
    }
  }
}

以上です。VFS_AUTO_INIT=true を指定すると、初回実行時にテーブルが作成されます。

3. ツールを使う

ツール名には短い POSIX 形式の名前を使用します。

write({ path: "/notes/todo.md", content: "# My Tasks\n- Ship feature" })
read({ path: "/notes/todo.md" })
ls({ path: "/notes" })
glob({ pattern: "**/*.md" })
grep({ pattern: "TODO" })

すべてのツールは、構造化された JSON レスポンスを返します。

ツール

ツールパラメーター戻り値説明
readpath{content, size}ファイルの内容を読み取ります
writepath、content{path, size, has_parents}ファイルを書き込みます(親ディレクトリは自動的に作成されます)
appendpath、content{path, appended_bytes}ファイルに追記します(ファイルがない場合は作成します)
statpath{exists, type?, size?, children?}存在を確認し、メタデータを取得します
lspath{entries: [{name, type}]}ディレクトリを一覧表示します(ディレクトリが先、その後にアルファベット順で表示)
mkdirpath{path, already_existed}ディレクトリと親ディレクトリを作成します(mkdir -p)
rmpath{path, deleted}ファイルまたはディレクトリを再帰的に削除します
mvsource、destination{source, destination}ファイルまたはディレクトリを移動/名前変更します
globpattern{files, count}glob でファイルを検索します(例:**/*.ts、**/*.{js,ts})
greppattern、path_filter?{matches, count}正規表現でファイルの内容を検索します
stores(なし){stores, count}永続ストア名をすべて一覧表示します

stores を除くすべてのツールは、セッションをまたいで永続ストレージを利用するための省略可能な store パラメーターを受け付けます。

セッション管理

セッションは自動的に処理されます。ツールのパラメーターにセッション ID を指定する必要はありません。

仕組み:

トランスポートセッションの識別方法動作
stdioプロセスごとに自動生成される UUIDMCP 接続ごとに一意のセッションが作成されます
HTTP/SSEトランスポートが提供する sessionIdMCP プロトコルが処理します
任意VFS_SESSION_ID 環境変数決定的/再開可能なセッション

優先順位:トランスポートの sessionId > VFS_SESSION_ID 環境変数 > 自動生成される UUID。

再開可能なセッション

プロセスの再起動後に以前のセッションを再開するには、決定的なセッション ID を設定します。

{
  "env": {
    "DATABASE_URL": "postgresql://...",
    "VFS_SESSION_ID": "my-agent-session-1"
  }
}

セッション間で共有されるストア

名前付きストアはセッションをまたいで保持されます。store パラメーターを渡すことで、任意のセッションからストアの読み書きができます。

// Session A writes to a store
write({ path: "/context.md", content: "project notes", store: "agent-memory" })

// Session B (days later) reads from the same store
read({ path: "/context.md", store: "agent-memory" })

// Without `store`, operations target the session's own namespace
write({ path: "/scratch.txt", content: "session-only data" })

// List all available stores
stores()

ストアは初回使用時に自動作成されます。

環境変数

変数必須デフォルト説明
DATABASE_URLはい—PostgreSQL 接続文字列
VFS_AUTO_INITいいえfalse起動時にテーブルを自動作成します
VFS_SESSION_IDいいえrandom UUID決定的なセッション ID
VFS_ENABLE_RLSいいえfalse行レベルセキュリティを有効にします
VFS_STORAGE_BACKENDいいえpostgresストレージバックエンドの種類

データベースの手動セットアップ

VFS_AUTO_INIT を使用せず、自分でスキーマを管理する場合:

psql $DATABASE_URL -f sql/schema.sql
行レベルセキュリティ(任意)

RLS により、データベース側でセッション分離が適用されます。アプリケーションコードに不具合があり、WHERE session_id = 句が省略された場合でも、PostgreSQL 自体がセッションをまたぐアクセスを防ぎます。

# Run after schema.sql
psql $DATABASE_URL -f sql/rls.sql

# Update the vfs_app password
psql $DATABASE_URL -c "ALTER ROLE vfs_app PASSWORD 'your-secure-password'"

次に、vfs_app として接続するよう MCP サーバーを設定します。

{
  "env": {
    "DATABASE_URL": "postgresql://vfs_app:your-secure-password@localhost:5432/vfs",
    "VFS_ENABLE_RLS": "true"
  }
}

開発

要件
  • Node.js 20+
  • Docker(統合テスト用 — testcontainers を介して PostgreSQL を実行します)
git clone https://github.com/lu-zhengda/mcp-virtual-fs.git
cd mcp-virtual-fs
npm install
npm run build
コマンド
コマンド説明
npm run buildTypeScript をコンパイルします
npm testすべてのテストを実行します(Docker が必要です)
npm run test:unitユニットテストのみを実行します
npm run test:integration統合テストのみを実行します
npm run lintESLint を実行します
npm run lint:fixlint の問題を自動修正します
npm run devtsx で実行します(ビルド手順なし)
テスト

テストでは testcontainers を使用して、Docker 内に実際の PostgreSQL インスタンスを起動します。モックは使用せず、統合テストでは実際の SQL クエリ、トライグラムインデックス、RLS ポリシーを検証します。

# Requires Docker running
npm test

セッションのクリーンアップ

一時セッションは定期的にクリーンアップできます。

DELETE FROM vfs_sessions
WHERE is_persistent = false
  AND created_at < now() - interval '7 days';

vfs_nodes の ON DELETE CASCADE により、ファイルは自動的にクリーンアップされます。store パラメーターで作成された永続ストアには影響しません。

ライセンス

MIT

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。