MCP App
vastgrid-mcp は MCP App を持つ MCP サーバーです。エージェントがどんな大きさの CSV・TSV・Parquet・JSON Lines・Excel のファイルを開くと、チャットの中に表が現れ、エージェントと人が同じ表を扱います。エージェントは表の状態と行を読み、グリッドのコマンドを適用します。人は表をスクロールし、並べ替え・絞り込み・選択・編集をします。一方がしたことは、もう一方にも見えます。ファイルはサーバーの DuckDB(Node.js)が読みます。ホストの中のページは素の JavaScript と canvas だけで、WebAssembly も Worker も自分のネットワークも使いません。
MCP App を表示できるホスト(Claude Desktop、VS Code、ChatGPT、Goose など。一覧)にサーバーを加えます。
{ "mcpServers": { "vastgrid": { "command": "npx", "args": ["-y", "vastgrid-mcp", "/path/to/data"] } }}vastgrid-mcp [--save] <フォルダー>… は、渡したフォルダー(なければいまのフォルダー)のファイルだけを開きます。ファイルの実際の場所(リンクは辿った先)がそのどれかの中になければなりません。--save を付けると、表で書き込んだセルを CSV・TSV のファイルに、編集していないバイトを残して保存できます。付けなければ、書き込んだセルはサーバーが止まるまでファイルとは別に持ちます。Node.js 20 以降と、DuckDB の Node.js バインディングがある環境が必要です。
チャットでファイルを頼んでください。たとえば「sales.parquet を vastgrid で開いて、2025 年の大きい注文を 20 件見せて」。エージェントが open_grid を呼び、ホストが答えの下に表を示します。
| ツール | 使う側 | すること |
|---|---|---|
list_files |
エージェント | フォルダーの表のファイルを 2 階層まで一覧にする |
open_grid |
エージェント、App | ファイルを新しい表で開く。最初のドキュメントも渡せる。結果が App を表示する |
grid_state |
エージェント | ドキュメント、セッション、表示している列、ビューの行数、未保存の編集 |
grid_rows |
エージェント | ビューの行を JSON の値で返す。一度に 500 行まで、文字列は 1,000 文字で切る |
grid_command |
エージェント | 人のキーやメニューと同じようにコマンドを適用し、新しい状態を返す |
vastgrid_message |
App | グリッドの要求をエンジンへ運ぶ |
grid_sync |
App | App のドキュメントとセッションを表のものと揃え、エンジンのイベントを届ける |
grid_export_file |
App | target なしの書き出しのファイルを、ホストがダウンロードするために渡す |
データが届いたときにグリッド自身が適用するコマンド(view.update、history.push、history.undone、history.redone)は断ります。失敗したコマンドは何も変えず、理由と位置を付けた invalid_command を返します。セルを書くときは人と同じ手順で、select、文字列を付けた edit.begin、edit.commit の順です。history.undo と history.redo は、エージェントの書き込みも人の書き込みも同じように取り消し・やり直しします。
エージェントと人で 1 つの状態
Section titled “エージェントと人で 1 つの状態”サーバーは表ごとに、画面のないストア(vastgrid/core の GridStore)を DuckDB エンジンの表の上に持ち、エージェントのコマンドは、画面の表がディスパッチするのとまったく同じようにそこへ届きます。App の DataGrid は同じドキュメントとセッションの自分のストアを持ち、どちらもエンジンの同じ表を読むので、一方が書いたセルをもう一方が読みます。
grid_sync が 2 つの状態をつなぎます。表には版があり、ドキュメントかセッションが変わるたびに上がって、同じ部分の変更は新しいほうが勝ちます。人の変更は最後の変更から 250 ms 後にまとめて送り、その間 App はエージェントの変更とエンジンのイベントを待ちます。読み込み直した App(会話を再読み込みしたときや、スクロールして戻ったとき)は、表の状態をすべて受け取り直します。
App はスクリプトとスタイルを中に含む 1 つの HTML ファイルで、開いたときに読み込むメニューやパネルも入っています。ホストはこれを UI リソースとして配信し、ページは何も読み込みません。ドメインを宣言しないので、ホストは既定の Content Security Policy を与えます。大きさは 1.2 MB(gzip で 330 KB)で、多くは ext-apps の MCP クライアントと zod、次に React とグリッドです。テーマと言語(英語・日本語・中国語・韓国語・スペイン語・ポルトガル語・フランス語・ドイツ語)はホストに従います。
まだできないこと
Section titled “まだできないこと”- App の高さは 520 ピクセルで、全画面表示は求めません。
- 人がしたことを App からエージェントに伝えません。エージェントは
grid_stateで読みます。 - 表はサーバーが動いている間だけ残ります。最大 16 個で、使っていないものから閉じます。
詳しくは GitHub の mcp-app.md(英語)にあり、ツール、同期の仕組み、試験の方法を書いています。