SimConnect MCP について
SimConnect MCPは、アドオン開発向けにAIコーディングエージェントをMicrosoft Flight Simulatorへ接続します。シミュレーター変数とイベントの読み書き、機体別のPMDGデータ、施設検索、シナリオ用ツールに加え、ドキュメントを内蔵しています。
主な機能
- 01SimVarとL-varの読み書き
- 02シミュレーターイベントとカスタムイベントの実行
- 03RPN計算機コードの実行
- 04PMDG 777と737 NG3のデータ取得
- 05施設とHubHopプリセットの検索
- 06フライトの読み込みとシナリオ設定
活用シーン
- 01フライトシミュレーターアドオンの開発とテスト
- 02機体変数とシステム状態の確認
- 03再現可能な飛行テストシナリオの準備
- 04空港と航法施設の検索
MCP 対応
32個の型付きツールと内蔵SimConnectドキュメントをMCPクライアントに提供します。ツールはSimConnect経由でMSFSに接続し、L-var機能にはオプションでMobiFlight WASM Moduleを使用します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
32掲載時のツール一覧 · 2 週間前に更新
このツールにパラメーターはありません。
詳細
SimConnect MCP サーバー
AI コーディングエージェントを SimConnect 経由で Microsoft Flight Simulator に接続する MCP(Model Context Protocol) サーバーです。このサーバーはアドオン開発向けに構築されており、SimVar と L-var の完全な読み書き、イベント、計算機コードの実行、ドキュメントの埋め込みに対応しています。
できること
- 任意の SimVar の読み書き — 高度、機首方位、速度、オートパイロット設定、エンジンパラメーターなど、包括的な組み込みカタログに収録された 1,080 件以上の SimVar に対応し、単位を選択できます。書き込みが拒否された場合は、正確に失敗を通知します
- L-var の読み書き — アドオン開発者が使用する機体固有のローカル変数(Fenix A320、FlyByWire A32NX、PMDG など)に対応し、読み込まれた機体に実際に登録されている変数をリアルタイムで列挙できます
- PMDG 777 および 737 NG3 のネイティブ SDK に対応 — PMDG SDK Client Data Areas 経由で機体データフィールドと制御イベントに直接アクセスできるほか、色や書式を含めて CDU 画面を読み取れます
- イベントのトリガー — スイッチの切り替え、オートパイロットモードの設定、ライトの制御、カスタム MobiFlight イベントの発火
- RPN 計算機コードの実行 — 任意の逆ポーランド記法コードをシミュレーター内で直接実行
- 変数の検索と確認 — 人が読みやすい名前と有効な値を備えた、検索可能な SimVar、イベント、機体固有 L-var のカタログ
- 施設情報の検索 — 距離順に並べた近隣空港の一覧と、ICAO 識別子を指定した空港、ウェイポイント、NDB、VOR の詳細検索に対応し、SimConnect の施設サブスクリプションから直接読み取ります
- フライトとシナリオのツール —
.FLTフライトの読み込みと保存、.PLNフライトプランの読み込み、AI 機やオブジェクトの生成に対応し、手作業で設定する代わりにテストシナリオをスクリプト化できます - ドキュメントの埋め込み — SimConnect リファレンスドキュメントを MCP リソースとして提供し、オフラインで利用できます
- 機体固有のカタログ — パネルごとの分類、表示名、値の説明を含む、事前構築済みの変数データベースです。PMDG 777 の変数 1,607 件(777-200LR/200F/300ER/F)と PMDG 737 NG3 の変数 1,861 件(-600/700/800/900、BBJ/BDSF/BCF を含む)を収録しています
- HubHop との連携 — MobiFlight HubHop のコミュニティプリセットデータベースを MCP ツールとして直接検索できるほか、組み込みクライアントを使って、サポート対象の任意の機体向けに L-var カタログを生成・拡張できます
前提条件
- Microsoft Flight Simulator(MSFS 2020 または 2024)が同じマシンで実行されていること
- uv — サーバーと Python ランタイムを取得する
uvxを提供します - MobiFlight WASM Module(任意、L-var 対応に必要)— MSFS の Community フォルダーにインストールします。MobiFlight からダウンロードできます
インストール
PyPI では simconnect-mcp として公開されており、
MCP Registry には
io.github.robin24/simconnect-mcp として登録されています。
uv をインストールすれば、個別のインストール手順は不要です。
uvx が必要に応じてサーバーを取得して実行します。
uvx simconnect-mcp
これにより、MCP クライアントが起動する場合と同様に、サーバーが stdio で起動します。手動で実行するのは、起動することを確認するときだけにしてください。停止するには Ctrl+C を押します。
バージョンを固定するには、uvx [email protected] を使用します。
ソースから(開発向け)
git clone https://github.com/robin24/simconnect-mcp.git
cd simconnect-mcp
# Creates the virtual environment and installs the dev group too
uv sync
MCP サーバーとしての設定
Claude Code
CLI 経由:
claude mcp add --transport stdio simconnect -- uvx simconnect-mcp
すべてのプロジェクトで利用できるようにするには:
claude mcp add --transport stdio --scope user simconnect -- uvx simconnect-mcp
JSON 経由(~/.claude/settings.json またはプロジェクトレベルの .claude/settings.json):
{
"mcpServers": {
"simconnect": {
"command": "uvx",
"args": ["simconnect-mcp"]
}
}
}
OpenAI Codex CLI
CLI 経由:
codex mcp add simconnect -- uvx simconnect-mcp
JSON 経由:
{
"mcpServers": {
"simconnect": {
"command": "uvx",
"args": ["simconnect-mcp"]
}
}
}
Gemini CLI
CLI 経由:
gemini mcp add --transport stdio simconnect -- uvx simconnect-mcp
JSON 経由(~/.gemini/settings.json):
{
"mcpServers": {
"simconnect": {
"command": "uvx",
"args": ["simconnect-mcp"]
}
}
}
MCP Inspector(対話型テスト)
uv run mcp dev src/simconnect_mcp/server.py
Note: 公開済みパッケージではなく、ローカルのチェックアウトを実行するには、
uvx simconnect-mcpをuv run --directory /path/to/simconnect-mcp simconnect-mcpに置き換えてください。 クローンの絶対パスを使用してください。
ツール(32)
すべてのツールには msfs_ の接頭辞が付き、明示的な readOnlyHint/destructiveHint アノテーションが付与されています。また、型付きの結果または構造化されたエラーを返します。成功を捏造することはありません。以下の表は、稼働中のサーバーから生成されたものです(名前、種類、タイトルは各ツールの ToolAnnotations から取得しています)。説明は、ツール自身の docstring に記載されている1行の要約です。
uv run python -c "
import asyncio
from simconnect_mcp.server import mcp
async def m():
for t in sorted(await mcp.list_tools(), key=lambda x: x.name):
kind = 'read' if t.annotations.readOnlyHint else 'write'
print(f'| \`{t.name}\` | {kind} | {t.annotations.title} |')
asyncio.run(m())"
接続(3)
| ツール | 種類 | 説明 |
|---|---|---|
msfs_connect | write | MSFS への SimConnect 接続を確立します |
msfs_disconnect | write | MSFS への SimConnect 接続を閉じます |
msfs_get_connection_status | read | 接続状態と、シミュレーターが実行中か一時停止中かを確認します |
SimVar の操作(6)
| ツール | 種類 | 説明 |
|---|---|---|
msfs_get_simvar | read | 指定した単位で、名前を指定して SimVar の値を読み取ります |
msfs_set_simvar | write | 設定可能な SimVar に値を書き込みます。書き込みが拒否された場合は、成功を報告せず、正しく失敗します |
msfs_get_simvars_bulk | read | 1回の呼び出しで複数の SimVar を読み取ります。1つの項目でエラーが発生しても、残りの処理は中断されません |
msfs_search_simvars | read | キーワードで SimVar カタログを検索します |
msfs_list_simvar_categories | read | 各 SimVar カテゴリとその変数数をすべて一覧表示します |
msfs_watch_simvar | read | SimVar を一定時間サンプリングし、デバッグ用の時系列データを返します |
単位: msfs_get_simvar(および msfs_set_simvar)は省略可能な unit 引数を受け付け、結果では実際に使用された単位を必ず報告します。unit を省略すると、同梱の SimVar カタログがその変数に適したデフォルト値を指定します。カタログにない変数の場合、デフォルトは "number" です。
イベントの操作(3)
| ツール | 種類 | 説明 |
|---|---|---|
msfs_trigger_event | write | オプションのパラメーターを指定して SimConnect イベントを発行します |
msfs_search_events | read | キーワードで SimConnect イベントを検索します。カテゴリによる絞り込みも可能です |
msfs_trigger_custom_event | write | MobiFlight WASM モジュールを通じて、カスタムイベントをキーイベントとして発行します |
L-Var の操作(6)
| ツール | 種類 | 説明 |
|---|---|---|
msfs_get_lvar | read | 現在の航空機から L-var(ローカル変数)の値を読み取ります |
msfs_set_lvar | write | 現在の航空機の L-var に値を書き込みます |
msfs_list_lvars | read | 現在読み込まれている航空機が登録した L-var を列挙します |
msfs_execute_calculator_code | write | シミュレーターで RPN 計算機コードを実行します |
msfs_search_lvars | read | 同梱カタログ全体から、キーワードで既知の航空機 L-var を検索します |
msfs_browse_lvar_catalog | read | 航空機の L-var カタログを参照します。カタログ、カタログ内のパネル、またはパネル上の変数を一覧表示します |
msfs_list_lvars は MobiFlight WASM モジュールに、航空機が実際に登録した項目をリアルタイムで列挙するよう要求します。ただし、モジュールの応答は名前1,000個までに制限されており、切り捨てられてもリストは完全であると報告されます。GSX などを含むアドオン構成が多い場合、航空機固有の変数が応答から完全に押し出されることがあります。truncated: true に注意してください。カタログとリアルタイムの一覧は出発点として扱い、完全な目録が保証されるものではありません。msfs_get_lvar は、どちらにも表示されていない名前も含め、指定した任意の名前を読み取ります。
航空機の状態(1)
| ツール | 種類 | 説明 |
|---|---|---|
msfs_get_aircraft_snapshot | read | 現在の航空機の状態(位置、速度、姿勢、主要システム)を1回の呼び出しでスナップショットとして読み取ります |
施設(2)
| ツール | 種類 | 説明 |
|---|---|---|
msfs_get_nearby_airports | 読み取り | 指定地点の近くにある空港を、近い順に一覧表示します |
msfs_get_facility_info | 読み取り | ICAO 識別子を使って、空港、ウェイポイント、NDB、VOR のいずれかを検索します |
空港は全世界を対象とします(SimConnect は全 85,249 空港の一覧を返し、初回の取得後にキャッシュされます)。ウェイポイント、NDB、VOR は航空機の現在位置周辺が対象となるため、キャッシュせず、呼び出しのたびに再取得されます。キャッシュされた航法援助施設の一覧では、位置の変更やフライトの後も航空機の 以前の 位置に対する応答が返されてしまうためです。
ユーティリティ(2)
| ツール | 種類 | 説明 |
|---|---|---|
msfs_send_sim_text | 書き込み | シミュレーターにテキストオーバーレイメッセージを表示します(デバッグ用フィードバック) |
msfs_set_aircraft_position | 書き込み | 航空機の位置を変更します(テストシナリオのセットアップ) |
PMDG 777 / 737 NG3(3)
| ツール | 種類 | 説明 |
|---|---|---|
msfs_get_pmdg_var | 読み取り | 名前を指定して PMDG 航空機のデータフィールドを読み取ります。スイッチ、MCP 値、燃料量、FMC データなどに対応します(777 または 737 NG3) |
msfs_get_pmdg_cdu | 読み取り | PMDG CDU の画面を、セルごとの色と書式情報を含むテキスト行として読み取ります |
msfs_send_pmdg_event | 書き込み | PMDG の制御イベントを送信します。スイッチの切り替え、ボタンの押下、セレクターの設定などに対応します(777 または 737 NG3) |
これらのツールは PMDG SDK Client Data Areas を使用し、航空機の状態にバイナリで直接アクセスするため、MobiFlight の L-var ブリッジを介しません。適切な SDK(777 または 737 NG3)は読み込まれた航空機から自動検出されますが、variant 引数で指定することもできます。航空機の options.ini(777_Options.ini または 737NG3_Options.ini)で EnableDataBroadcast=1 と EnableCDUBroadcast.N=1 を設定する必要があります。777 には CDU が 3 台(Capt/Center/F-O)、737 NG3 には 2 台(Capt/F-O)あります。詳細は PMDG 777 SDK Reference と PMDG 737 NG3 SDK Reference をご覧ください。
HubHop(2)
| ツール | 種類 | 説明 |
|---|---|---|
msfs_search_hubhop | 読み取り | MobiFlight HubHop コミュニティのプリセットデータベースを検索します |
msfs_list_hubhop_aircraft | 読み取り | HubHop にプリセットがある航空機を一覧表示します |
ほかのすべてのツールとは異なり、この 2 つはシミュレーターではなく HubHop の HTTP API にアクセスするため、MSFS を終了した状態でも動作します。初回の呼び出しではプリセットデータベース全体(約 17 MB)をダウンロードしてキャッシュします。同じサーバープロセス内での以降の呼び出しでは、その両方のツールで共有され、6 時間ごとに自動再取得されるインメモリキャッシュから応答します。どちらのツールも refresh=true を指定すると、すぐに再取得できます。
Flight and Scenario (4)
| ツール | 種類 | 説明 |
|---|---|---|
msfs_load_flight | 書き込み | 保存済みのフライトを読み込み、現在のフライトを置き換えます |
msfs_save_flight | 書き込み | 現在のフライトを .FLT ファイルに保存します。overwrite=true を明示的に指定しない限り、既存のファイルへの上書きは拒否されます |
msfs_load_flight_plan | 書き込み | .PLN フライトプランを機体の GPS/FMS に読み込み、現在有効なプランを置き換えます |
msfs_create_ai_object | 書き込み | AI 機体またはオブジェクトを指定した位置に出現させます。SimConnect がリクエストを受け付けたかどうかを報告しますが、これはオブジェクトが存在することと同じではありません(MSFS は一致するタイトルがない場合、通知なしで無視します) |
これらは、シミュレーター独自の UI で手動操作するのではなく、スクリプトでテスト環境(「このアプローチを読み込む」「現在の状態を保存する」「近くにトラフィックを出現させる」など)を設定するために、基盤となる SimConnect のフライト/シナリオファイル操作をラップします。msfs_create_ai_object は、tests/live/test_live_flight.py によって、出現、対象を絞った SimVar リクエストへの応答確認、その後の削除まで、エンドツーエンドで実際に動作することが確認されています。msfs_save_flight も実動作が確認されており、CLAUDE.md の「既知のシミュレーター動作」に記載されている、保存後に SimConnect が数秒間停止する現象も含まれます。この確認結果が記録されたため、残る機能(上書きガードのロジック)は純粋な Python であり、tests/test_flight.py のモックですでにテストされていることから、2026-08-29 のライブテストスイートの整理時に、これらのライブテストは廃止されました。msfs_load_flight と msfs_load_flight_plan は設計上モックのみでテストされます。その理由については、tests/live/test_live_flight.py のモジュール docstring を参照してください。以下のライブテストの実行を参照してください。
変数カタログ
サーバーには検索と探索のための包括的な変数カタログが含まれているため、AI エージェントは推測することなく適切な変数名を見つけられます。
SimVar カタログ(1,080 以上の変数)
組み込みの SimVar カタログは、25 のカテゴリにわたる、文書化されたすべての MSFS シミュレーション変数を網羅しています。
| カテゴリ | 変数数 | カテゴリ | 変数数 |
|---|---|---|---|
| 機体エンジン | 112 | 機体アビオニクス | 122 |
| 機体燃料 | 48 | その他 | 162 |
| 機体操作系統 | 50 | ランディングギア | 54 |
| オートパイロット | 39 | 飛行計器 | 45 |
| 機体灯火 | 25 | 機体位置と速度 | 46 |
| カメラ | 34 | 無線航法 | 66 |
| サービス | 42 | 機体電気系統 | 47 |
| 飛行モデル | 11 | 機体システム | 24 |
| 環境 | 14 | など... |
このカタログは SimConnect Python パッケージとMSFS 公式 SDK ドキュメントの両方を情報源としており、カメラ操作、地上サービス、サーキットブレーカー、GPS/NAV/COM 無線機、飛行モデル変数を含め、完全に網羅しています。
航空機 L-Var カタログ
L-var カタログは、特定の航空機アドオン向けに検索可能な、人が読みやすいデータベースを提供します。サーバーは 3 段階でカタログを選択し、結果の message でどの段階が該当したかを示します。3 段階の信頼度は大きく異なります。
- PMDG SDK クライアントのデータ領域を調べます。 信頼性が高く、航空機が自機を何と呼んでいるかに左右されません。重要なのはこの段階です。PMDG の機体は、自機を PMDG として識別しないためです。実際の PMDG 737-800 は、
TITLEを737-800 PAX SSW TCと報告し、ベンダー名はどこにも含みません。タイトルだけでの照合は、PMDG では機能したことがありません。 TITLE/ATC_MODELに対してtitle_patternを照合します。 フォールバックであり、ユーザーが独自に用意するカタログで利用できる唯一の方法です。- すべてのカタログを検索し、その旨を伝えます。 結果には
Catalog列が表示されるため、別の航空機の変数を自機のものとして読み違えることなく、各行がどの航空機に属するかを確認できます。
検索範囲を明示するには catalog=<key> を渡すか、引数なしで msfs_browse_lvar_catalog を呼び出して、利用可能なキーを一覧表示します。
分かりやすい近道として
title_patternを737に広げる方法がありますが、意図的に採用していません。これでは iFly 737 MAX も Asobo 製の 737 も同じように一致し、PMDG ではない航空機のユーザーに PMDG カタログを渡すことになります。自信満々に間違えるより、「カタログを検出できません」と正直に伝えるほうが適切です。
同梱カタログ:
| 航空機 | 変数 | パネル | ソース |
|---|---|---|---|
| PMDG 777(全バリアント) | 1,607 | 28 | SDK ヘッダーの解析 + HubHop |
| PMDG 737 NG3(-600/700/800/900/BBJ/BDSF/BCF) | 1,861 | 27 | SDK ヘッダーの解析 + HubHop |
各変数には、表示名、カテゴリ、書き込み可能フラグ、および(該当する場合)有効な値のマップが含まれます。
Fenix カタログは同梱されていません。以前の fenix_a320.json(1,433 個のプレーンな L-var)は削除し、より広範でコミュニティによってメンテナンスされている HubHop 独自の FenixSim カバレッジ(2,273 個のプリセット)を利用するようにしました。Fenix のアップデートがリリースされるとすぐに最新になりますが、同梱したスナップショットは古くなるだけです。msfs_search_hubhop(vendor="FenixSim") でライブ検索するか、以下の HubHop クライアントを使ってローカルのカタログファイルを再生成し、src/simconnect_mcp/data/ に配置してください。そこにあるすべての *.json は起動時に自動検出されるため、コードを変更せずにすぐ利用できます。
新しい航空機カタログの追加
新しい航空機を追加する最も簡単な方法は、組み込みの HubHop クライアントを使うことです。
# See what's available
python -m simconnect_mcp.data.hubhop --list-vendors
# Generate a catalog (example: FlyByWire A32NX)
python -m simconnect_mcp.data.hubhop \
--vendor "FlyByWire Simulations" \
--aircraft "A320neo" \
--aircraft-name "FlyByWire A32NX" \
--title-pattern "A32NX" \
-o fbw_a32nx.json
既存のカタログを更新することもできます。
python -m simconnect_mcp.data.hubhop --vendor FenixSim --merge fenix_a320.json
Python API も使用できます。
from simconnect_mcp.data.hubhop import HubHopClient
client = HubHopClient()
presets = client.fetch_presets(vendor="FlyByWire Simulations", aircraft="A320neo")
catalog = client.build_catalog(presets, aircraft="FlyByWire A32NX", title_pattern="A32NX")
client.save_catalog(catalog, "fbw_a32nx.json")
また、src/simconnect_mcp/data/ に JSON ファイルを配置して、手動でカタログを作成することもできます。すべての *.json ファイルは起動時に自動検出されます。詳しいガイド、JSON スキーマ、ベストプラクティスについては、docs/extending-catalogs.md を参照してください。
リソース
| URI | タイプ | 内容 |
|---|---|---|
simconnect://docs/overview | text/markdown | SimConnect のアーキテクチャと主要な概念 |
simconnect://docs/simvars/{category} | text/markdown | カテゴリ別の SimVar リファレンス |
simconnect://docs/events/{category} | text/markdown | カテゴリ別のイベントリファレンス |
simconnect://docs/rpn | text/markdown | RPN 計算機の構文ガイド |
simconnect://docs/lvars | text/markdown | アドオン開発向け L-var の使用方法 |
simconnect://docs/best-practices | text/markdown | よくある落とし穴とパフォーマンスのヒント |
simconnect://docs/pmdg/{variant} | text/markdown | PMDG SDK リファレンス。variant は 777 または 737(先頭の B も使用可能、大文字と小文字は区別されません) |
simconnect://state/connection | application/json | ライブ接続ステータス |
simconnect://state/aircraft | application/json | 現在の航空機のタイトル、タイプ、位置 |
プロンプト
| プロンプト | 目的 |
|---|---|
debug_simvar | 誤動作する SimVar のデバッグ手順を順を追って案内します |
analyze_aircraft_vars | 現在の航空機にあるすべての L-var を列挙して分類します |
create_addon_boilerplate | 種類に応じたアドオンのスターターコードを生成します |
rpn_helper | 自然言語を RPN 電卓コードに変換します |
simconnect_code_review | よくある問題がないか SimConnect コードをレビューします |
プロジェクト構成
src/simconnect_mcp/
├── server.py # FastMCP instance, lifespan, tool registration
├── connection.py # SimConnectManager singleton + native set_lvar
├── dispatch.py # SimConnectDispatcher — owns the SimConnect dispatch loop
├── simvar_access.py # SimVarAccessor — generic SimVar reads/writes via data definitions
├── facilities.py # Facility (*_LIST) message parsing and accumulation
├── pmdg.py # PMDG 777 SDK structs, CDU rendering, data manager
├── pmdg_ng3.py # PMDG 737 NG3 SDK structs, CDU rendering, data manager
├── tools/
│ ├── __init__.py # @handle_simconnect_errors, @require_connection decorators
│ ├── connection_tools.py # connect_to_sim, disconnect_from_sim, get_connection_status
│ ├── simvars.py # SimVar CRUD via SimVarAccessor (1,080+ vars in the catalog)
│ ├── events.py # Event trigger/search + built-in catalog
│ ├── lvars.py # L-var read/write/search/enumerate/browse catalogs/calculator code
│ ├── pmdg.py # PMDG tools — auto-dispatch to 777 or 737 NG3
│ ├── aircraft.py # get_aircraft_snapshot — combined state snapshot
│ ├── facilities.py # Airport/navaid lookup on top of facilities.py
│ ├── flight.py # load/save flight, load flight plan, spawn AI object
│ ├── hubhop.py # HubHop preset search, exposed as MCP tools
│ ├── utilities.py # send_sim_text, set_aircraft_position
│ ├── models.py # Shared Pydantic result/error models
│ └── formatting.py # Pagination and markdown-table helpers
├── data/
│ ├── catalog.py # L-var catalog loader and search engine
│ ├── simvar_catalog.py # SimVar catalog loader, unit resolution, string-var detection
│ ├── hubhop.py # MobiFlight HubHop API client (CLI + library), in-memory cache
│ ├── pmdg_777.json # PMDG 777 catalog (1,607 vars, 28 panels)
│ ├── pmdg_737.json # PMDG 737 NG3 catalog (1,861 vars, 27 panels)
│ └── simvars_catalog.json # Built-in SimVar catalog (1,080+ vars, 25 categories)
├── vendor/ # Byte-faithful to upstream except two documented local changes
│ ├── simconnect_mobiflight.py # unmodified
│ └── mobiflight_variable_requests.py # log-level demotion + response-channel routing
└── docs/ # Embedded documentation, served as MCP resources
├── overview.md, simvars.md, events.md, rpn.md, lvars.md, best_practices.md
├── pmdg_777.md # PMDG 777 SDK reference
└── pmdg_737.md # PMDG 737 NG3 SDK reference
PMDG カタログは、scripts/parse_pmdg_sdk.py を使って SDK ヘッダーから再生成されます。このスクリプトは構造体名と CDU の数を自動検出するため、777 と 737 NG3 の両方で同じスクリプトを使用できます。
開発
# Run the mocked test suite (no MSFS required; live tests are deselected by default)
uv run pytest
# Run tests with verbose output
uv run pytest -v
# Run only specific test files
uv run pytest tests/test_hubhop.py # HubHop client tests
uv run pytest tests/test_simvars.py # SimVar catalog tests
# Lint
uv run ruff check src/ tests/
テストでは SimConnect をモックするため、MSFS がなくても上記のテストスイートを実行できます。tests/conftest.py では、現実的な SimVar 値を持つ SimConnect のモックを提供します。
ライブテストの実行
tests/live/ にある別のテストスイートでは、実際の SimConnect DLL をテストし、@pytest.mark.live が付けられています。pyproject.toml ではデフォルトでこのテストが除外されるため(addopts = "-m 'not live'")、CI を含め、MSFS のないマシンで実行されることはありません。
このスイートは意図的に小規模に保たれています。自己整合性のあるモックであれば、コードが正しいかどうかにかかわらず、それ自体と矛盾しない結果を返せるテストだけがここに含まれます。たとえば、単一の L-var 名を書き込んで読み戻すだけの往復テストでは、エンコードの正しさを証明できません。データ名が誤って変換されていても、誤った変数に対して書き込みと読み戻しが一致してしまうためです(tests/live/test_live_lvars.py の test_two_distinct_lvars_do_not_collide を参照)。この基準で絞り込んだ後に残るのは、モックでは検証できず、単に正しいと仮定するしかない、実際の DLL とその周辺の挙動です。具体的には、物理定数を用いた単位変換、サードパーティのバインディングがこのプロジェクトで一度誤っていたことが判明した構造体のワイヤーデコード、実際に書き込みを受け入れる SimVar/イベントと、拒否または無視されるものの違い、文書化されていない MobiFlight/WASM プロトコルの癖、そして実際の PMDG のバイナリクライアントデータ領域が、構造体デコードで想定されているとおりにプローブへ応答するかどうかです。
ライブテストで判明した内容をコミット済みのフィクスチャに固定してオフラインで再生できる場合は、ライブテストよりもそちらを優先します。tests/fixtures/facilities/ には、実際の SimConnect のワイヤーバイトが一度だけキャプチャされて保存されています。シミュレーターがなくても、また不安定な結果を心配することなく、実行のたびにモックを使った tests/test_facilities_parsing.py で再生できます。その日の読み込み状況に左右されず、同じ検出結果を決定的に確認できます。
uv run pytest -m live
MSFS を起動し、航空機を読み込んでおく必要があります。接続を試みて失敗したテストは失敗扱いではなくスキップされます(tests/live/conftest.py の live_manager フィクスチャを参照)。tests/live/test_live_pmdg.py のテストには実際の PMDG 737/777 の読み込みが必要です。読み込まれた航空機が PMDG 737/777 ではない場合、テストは失敗扱いではなくスキップされます(tests/live/conftest.py にある同ファイルの判定処理を参照)。
ライセンス
Copyright (C) 2025-2026 Robin Kipp
このプログラムはフリーソフトウェアです。Free Software Foundation が公開する GNU Affero General Public License の条件に従って、再配布または改変できます。同ライセンスのバージョン 3、または(任意で)それ以降のバージョンが適用されます。全文は LICENSE.txt を参照してください。
このプロジェクトが AGPL-3.0 であるのは、 Python-SimConnect に依存しており、 このライブラリ自体も AGPL-3.0 でライセンスされているためです。
src/simconnect_mcp/vendor/ に同梱されている MobiFlight ブリッジは別の
成果物であり、Koseng による MIT ライセンスです。詳細は
src/simconnect_mcp/vendor/MOBIFLIGHT_LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。