セキュリティモデル
formulon-mcp は、エージェントに対して構造化された観測可能なワークブック操作を提供する設計です。保証は意図的に狭く、エージェントループに組み込んでもコード実行の経路にはならないようにしています。
用語: 許可リスト
サーバーが呼び出してよい Workbook メソッド名のリストです。リスト外は入力形に関係なく呼び出し層で拒否されます。実体は formulon-mcp リポジトリの src/sessions.ts にあります。
サーバーが しないこと
- 任意の JavaScript / TypeScript / Python / VBA を評価しない。数式評価は Formulon の C++17 エンジン内で完結する。
- ユーザー供給のネイティブモジュールを読み込まない。ネイティブコードはエンジン本体のみ。
- ネットワークソケットを開かない。transport は stdio で、HTTP サーバーもアウトバウンド fetcher も持たない。計算でネットワーク接続は不要。
- サーバー再起動をまたいで状態を保持しない。セッションはプロセスメモリ上のみ。
プロセス境界
stdio MCP サーバーはクライアントの子プロセスとして動きます。OS のプロセス境界がセキュリティ境界です。
- サーバーはクライアントのファイルシステム権限を継承する。クライアントをサンドボックス化すればサーバーもサンドボックス化される。
- クライアント(およびそれを所有するエージェント)を終了すればサーバーも終了し、開いていたセッションはすべて消える。
- クライアントが複数ある場合、それぞれ別プロセスのサーバーが動く。セッションが跨ぐことはない。
- クライアントプロセスライフタイムを所有。ここをサンドボックス化すれば下も同様
- formulon-mcp子プロセス。クライアント終了時に終了する
ファイルシステムアクセス
パスを引数に取るツール(formulon_open_workbook、formulon_save_session、パス直接の formulon_get_cell など)は、サーバープロセスから見えるパスに対して動きます。プロジェクト配下に閉じ込めたいなら、親プロセスの作業ディレクトリを制限するか、サンドボックス経由でエージェントを動かしてください。
エージェントの書き出しパス
formulon_save_session を呼ぶときは、必ず許可されたディレクトリ配下の明示的な outputPath を渡してください。省略してもディスクへの書き込みを避けられるわけではありません ─ 直前の保存で使われたセッションの outputPath、それもなければ元の sourcePath を再利用して上書きします。フォールバックチェーンの詳細は ワークフロー: 保存 を参照してください。サーバー側に独自の書き出し制限はなく、ホストの責任です。
入力のバリデーション
すべてのツール入力はエンジンに渡る前に JSON schema で検証されます。不正な入力はセッションに触れずに MCP エラー応答で戻ります。数値座標は範囲チェックされ、A1 参照はパースして解決不能なら拒否されます。
低レベルアクセスも許可リスト経由
formulon_workbook_call は、専用ツール化されていない高度な機能のために用意された低レベル入口ですが、それでもサーバーソース内で明示されたメソッドだけを呼び出します。
例として:
- PivotTable / PivotCache の読み取り
- style / merge / comment / hyperlink / validation の読み書き
- 条件付き書式の評価
- 依存関係グラフ照会(
precedents、dependents) - 関数メタデータと名前ヘルパ
- spill 情報
許可リストにないメソッド(広すぎるエンジン API を含む)は拒否されます。サーバーの更新時に許可リストは見直されます。
セッションの分離
sessionIdごとにワークブックインスタンス・依存関係グラフ・dirty 集合・再計算状態を別に持つ。- セッションが互いのセルを読むことはできない。
formulon_close_workbookは即座にエンジン状態を解放する。formulon_list_sessionsで何が開いているか確認できる。
VBA は保持するが実行しない
VBA を含むワークブックは往復保存できますが、マクロは保持対象のバイト列として扱われるだけで、コンパイルも解釈も実行もされません。