はじめに
使い方・セットアップ
やりたいことは2通り。「QGISを外から動かしたい」だけなら Driver単体、 「WebEngineプラグインをAIで作りたい」なら Harnessごと使う。
使い方(A): Driver単体で使う
QGISをAIツールや自作アプリから遠隔操作したい人向け。リポジトリもNodeも不要。
- QGISプラグインリポジトリから QGIS Live Driver をインストール
(または
qgis_live_driver/フォルダをpython/plugins/へコピー) プラグイン > QGIS Live Driver > リモート制御 (localhostのみ)をON (初回は警告ダイアログ→Yes。QSettingsに保存され次回起動から自動有効)- 接続は4系統のどれでもよい(Driver詳細):
- MCP stdio — AIクライアントのMCP設定に
python <profile>/python/plugins/qgis_live_driver/mcp_stdio.pyを登録するだけ - MCP/REST HTTP —
~/.qgis-live/<pid>-qgis_live_driver.jsonからmcp_url/http_portとtokenを読み Bearer 認証で接続 - ファイルJSONL —
commands.jsonlに{"type":...,"token":...}を追記 →results.jsonlで結果受取
- MCP stdio — AIクライアントのMCP設定に
できること: pyeval(任意Python実行・iface/QgsProjectに直接アクセス)/
screenshot/status/open_plugin/reload_plugin/
bridge_call + plugin_id 転送(hub)。
セキュリティの境界: localhost限定・全チャネルでセッショントークン必須で、 他のOSユーザ・ブラウザ発のページ・外部ネットワークからは遮断される。 ただし同一ユーザ権限のプロセスはトークンを読めるため防げない (信頼境界=ローカルユーザアカウント)。詳細は セキュリティモデル を参照。
使い方(B): Harnessでプラグインを開発する
WebEngineベースのQGISプラグインをAIと一緒に作りたい人向け。リポジトリをクローンして使う。
セットアップ(初回のみ)
クローン直後は scripts\setup.ps1 が前提ツール
(QGIS 4.x / Node.js 24+ / Python 3.13+)の確認・不足分のインストール(winget経由)から
npm install・プラグイン配置までを一括で行う:
git clone <repo> && cd qgis_live_harness
powershell -ExecutionPolicy Bypass -File scripts\setup.ps1
# -Yes / -CheckOnly / -SkipPlaywright / -SkipDeploy オプションあり
手動でセットアップする場合(スクリプトと等価):
npm install
npm run deploy # 管理プラグインをQGISプラグインディレクトリへjunction配置+有効化(開発モード)
npx playwright install # L1テスト(npm test)を回す場合のみ
pip install pytest # ユニットテスト(test:unit)を回す場合のみ
開発対象プラグインは qgis-plugin/<id>/ に配置する。
開発対象の切替は plugin.config.json の id を書き換える。
開発ループ
npm run live:ensure # 常駐QGISを用意(起動済みならアタッチ、未起動なら起動)
# ※deployはしない — 未配置なら先に npm run deploy を手動で
# → bridge.py / logic.py / ui/* を編集
npm run live:devreload # repo側コードを即反映(deploy不要)
npm run test:live # 実QGIS内で検証(pyevalで内部状態assert含む)
器側(main_plugin.py/live_driver.py等)を変更した時だけ:
npm run live:reload # 実行中QGISでホットリロード(deployはしない)
deployモード(開発/利用の明示切替)
同じQGISプロファイル内で「開発」と「利用(通常使用)」を
配置形態で明示切替する。モード宣言は
profiles/<profile>/qgis_live_mode.json に記録される
(宣言は意図の記録であり、現在モードの判定は配置実態
(junction/dir)が優先。乖離時は宣言も併記される)。
現在モードは npm run deploy:status、Driverメニューの
配置モード ダイアログ(現在モード+各プラグインの実配置形態+退避状態)、
および GeoSuiteツールバー先頭のモードバッジ
(開発=「開発モード」の赤背景白文字、利用=歯車アイコンのみで非侵襲。
クリックでダイアログを開く)で確認できる。
GeoSuiteは管理対象プラグインのツールバー項目を集約した共有ツールバー。
| 開発モード(dev) | 利用モード(use) | |
|---|---|---|
| 切替操作 | npm run deploy — UI操作のみ |
npm run deploy:use — UI操作のみ |
| 配置物 | python/plugins/<id> = qgis-plugin/<id> へのjunction |
python/plugins/<id> = 実体dir(退避版の復元) |
| 動くコード | repoワーキングツリーそのもの(未コミット変更も含む) | 退避版の復元(退避も既存実体も無ければ未インストールのまま=そのプラグインは利用されていなかった) |
| repo編集の影響 | そのままQGISへ届く(reload_plugin/live:devreloadで反映) |
一切届かない(junction自体が存在しない) |
| 既存利用版の扱い | profiles/<profile>/qgis_live_parked/<id> へ退避(QGIS不可視) |
退避版をそのまま復元 |
| repo編集の反映手段 | reload_plugin / live:devreload / live:watch |
なし(MCP系操作= pyeval/bridge_call/status 等のみ) |
| 自動処理のdeploy | 存在しない。live系コマンドはQGIS起動/接続のみ行い、配置変更のコード経路自体を持たない(deploy/deploy:use/deploy:install は全てUI操作) |
|
利用モード ── npm run deploy ──→ 利用版を qgis_live_parked/ へ退避 → junction張付 = 開発モード
開発モード ── npm run deploy:use → junction解除 → parked利用版を復元 = 利用モード
任意 ── npm run deploy:install → repo現状を利用版として配置(旧parked破棄) = 利用モード
(「開発を終えて戻る」=「保存した利用版に戻る」。開発往復で利用版は上書きされない)
安全性の最強ルール:
deploy-plugin.ps1(プラグインフォルダへの あらゆる書込み)はAIエージェント・自動スクリプトから一切呼ばれない。qgis-session.mjsはdeployのコード経路自体を持たないため、 非devモードではAIからプラグイン内容を変える手段が存在しない。 AIが書き換えるのはrepoの作業ツリーのみである。
利用版の新規インストール/更新(リリース)は別コマンド:
npm run deploy:install がrepoの現状を利用版として配置する
(junction解除・旧parked破棄・repo copy)。確定 → git commit/tag →
deploy:install の順で実行すれば、利用版=正式リリース版として追跡できる。
テスト
npm test # L1: UI単体E2E(ブラウザ+mock。WebEngineプラグインのみ)
npm run test:unit # Pythonロジックのpytest
npm run test:live # L2: 実QGIS内検証(QGIS未起動でも自動起動)
Qt Widgets製プラグインもL2の検証対象になる(WebEngineへの作り替えは不要)。
pyevalでQtウィジェットを直接検査・操作し、live dirを持たないプラグインも
plugin.config.jsonに列挙すればhub経由でtest:liveが検証する。
詳しくは QGIS Live Harness を参照。
ディレクトリ構成
qgis-plugin/ プラグイン群のルート(複数プラグインをここに並べる)
<plugin_id>/ プラグイン1つ分。フォルダ名=QGISのプラグインID
metadata.txt プラグイン定義(name=はQGIS上の表示名)
__init__.py エントリポイント(classFactory)
main_plugin.py ダイアログ/view/channel/ドライバ起動 + dev source loader
live_driver.py view用ファイルドライバ
(eval/pyeval/screenshot/devreload + 共通コマンド)
bridge.py ★開発対象: WebChannel経由でJSに公開するAPI
logic.py ★開発対象: QGIS非依存の純粋ロジック(pytest対象)
ui/ ★開発対象: HTML/CSS/JS (mockでブラウザ単体動作も可)
qgis_live_driver/ QGIS Live Driver。制御専用プラグイン(UIなし・汎用部品)
live_driver.py pyeval/screenshot + status/open_plugin/reload_plugin/
bridge_call + plugin_id転送の実行体
(ファイル+メモリキューdispatch)
mcp_http.py 内蔵HTTPサーバ(/mcp=MCP Streamable HTTP, /api/*=REST)
mcp_stdio.py stdio↔ファイルJSONLブリッジ(同梱・stdlibのみ)
詳細: docs/driver.html
plugin.config.json 開発対象のプラグインID(qgis-plugin/下のフォルダ名)
scripts/
live-drive.mjs LivePage: クライアント側API(evaluate/pyeval/devreload等)
qgis-session.mjs ensure/reload/devreloadのオーケストレーション
qgis-live-check.mjs L2検証ランナー(npm run test:live)
qgis-mcp.mjs MCPサーバ(stdio)。tools: pyeval/eval/screenshot/...
scan-ini.js QGIS4.iniの肥大化/破損診断
repair-ini.js QGIS4.iniの破損エントリ修復(backup付き)
tests/e2e/ Playwright (L1 = mock使用)
tests/unit/ pytest
docs/ GitHub Pages用HTML(直接編集)
プラグインの追加・複数開発
qgis-plugin/ の下に プラグインIDと同じ名前のフォルダ で管理する。
複数フォルダを並べると 1つのQGISインスタンスで全プラグインを同時起動
でき、live dirは qgis-<pid>/<plugin_id>/ で分離されるため各プラグインを
独立にeval/pyeval/testできる。deployはqgis-plugin/直下の全プラグインを
一括配置し、test:live は検出した全プラグインに対してチェックを回す。
plugin.config.json の id はserve-uiやMCPのデフォルト対象を指す
(metadata.txt の name= は表示名)。
外部API(接続面まとめ)
| 面 | 形態 | 対象クライアント例 | 提供元 |
|---|---|---|---|
| ファイルプロトコル | commands.jsonl に {id,type:eval|pyeval|screenshot|devreload|status|open_plugin|reload_plugin|bridge_call,token} を追記、結果は results.jsonl |
任意言語(最下位の基底) | Driver/器 |
| HTTP REST | POST 127.0.0.1:<port>/api/pyeval {"code":"..."} 等。ポートは ~/.qgis-live/ で自動検出 |
curl・function calling系AI・自作エージェント | Driver |
| MCP Streamable HTTP | POST 127.0.0.1:<port>/mcp (JSON-RPC)。セッショントークン認証必須、QGIS_LIVE_TOOLS でツール絞り込み可 |
HTTP transport対応MCPクライアント(localhost限定) | Driver |
| MCP stdio | python <profile>/python/plugins/qgis_live_driver/mcp_stdio.py をspawn |
stdio型MCPクライアント全般 | Driver |
| Nodeライブラリ | new LivePage(dir) → evaluate/pyeval/devreload/waitFor/screenshot |
scripts/ 内実装参照 |
Harness |
| CLI | npm run live:* |
シェル/CI | Harness |
| MCP(Harness側) | .devin/mcp_config.json の qgis-live サーバ(qgis-mcp.mjs) |
Devin等のMCPクライアント | Harness |
MCPツール(Harness側)
qgis_ensure / qgis_pyeval / qgis_eval / qgis_bridge_call /
qgis_screenshot / qgis_status / qgis_open_plugin /
qgis_devreload / qgis_reload
どのツールも内部でensureするため、QGIS未起動でも自動で立ち上がる。
npm run mcp:qgis # 手動でMCPサーバ(stdio)を起動する場合