ArduPilotドローンを操作するMCPサーバーを自作する
はじめに
MCP(Model Context Protocol)の学習を兼ねて、ArduPilotドローンを操作する MCPサーバーを自作してみました。
Claude DesktopやClineといったMCPクライアントのチャット欄から「離陸して、結果をLINEしといてー」といった自然文で指示を出します。MCPの各Tool(arm/takeoffなど)に分解・実行され、MAVLink経由でシミュレータを制御できること、他MCPサーバー(LINE)と連携できることを目指します。
▼ソースコードは以下に公開していますので、ぜひ触ってみてください:
https://github.com/hfujikawa77/ardupilot-mcp-server-sandbox
▼ 動画で見たい方はこちら
ArduPilotとは
ArduPilot はオープンソースのフライト制御ソフトウェアで、マルチコプターに限らず固定翼やローバー、水中機など多くの機体に対応しています。MAVLinkという通信プロトコルを通じて外部ソフトウェアと接続でき、Pythonでは pymavlink ライブラリを使って機体の制御や情報取得が可能です。
動作環境(シミュレータテスト可能)
- ArduPilot (シミュレータ or 実機)
 - MAVLink 通信が 
tcp:127.0.0.1:5762で受け付け可能であること - Python 3.10+
 
Mission Planner のシミュレータを使う場合
ArduPilotドローンのシミュレーションを簡単に試すには、Mission Planner の内蔵シミュレータを使うのが便利です。
- Mission Planner をインストール
 - 起動後、上部メニューの 
シミュレーションボタンをクリック - 次の画面で 
Multirotor(マルチローター)を選択 - ダイアログの 
Stableボタンをクリック - ArduPilotシミュレータが起動し、tcp:127.0.0.1:5762 で待ち受けを開始します
 
機能概要
- ArduPilotへの TCP 経由での MAVLink 通信
 - 
arm()/disarm()/takeoff()/change_mode()などの基本操作をMCPツール化 - ClaudeやClineとの連携による 自然言語での指示実行
 - 操作結果をLINEに通知する拡張も容易(例:離陸完了を即時通知)
 
サーバーのPython実装例
基本的な構成は次の通りです:
from mcp.server.fastmcp import FastMCP
from pymavlink import mavutil
import time
mcp = FastMCP("ArduPilot Controller", debug=True)
def connect_to_ardupilot():
    return mavutil.mavlink_connection(
        "tcp:127.0.0.1:5762",
        source_system=1,
        source_component=90
    )
@mcp.tool()
def arm() -> str:
    conn = connect_to_ardupilot()
    try:
        conn.wait_heartbeat()
        conn.arducopter_arm()
        conn.motors_armed_wait()
        return "機体をアームしました"
    finally:
        conn.close()
その他
disarm(),takeoff(),change_mode()も同構造で実装することができます。
MCPサーバーの起動
python ardupilot_mcp_server.py
"MCPサーバーを起動します..." と表示されたら正常に起動しています。
Cline との連携手順
- OpenRouter にサインアップ&APIキー取得
 - VS Code + Cline 拡張 を設定
 - 
settings.jsonに MCPサーバーを追加 
"cline.apiKey": "sk-xxxxx...",
"cline.apiBaseUrl": "https://openrouter.ai/api/v1",
"cline.defaultModel": "openrouter/claude-3-haiku",
"cline.mcpServers": {
  "ardupilot-controller": {
    "command": "python",
    "args": [
      "${workspaceFolder}/ardupilot_mcp_server.py"
    ],
    "env": {
      "PYTHONPATH": "${env:USERPROFILE}\.local\lib\python3.12\site-packages"
    }
  }
}
- Cline チャットに「10メートルまで離陸して」などを入力するだけ!
 
Claude Desktop からの連携
- Claude Desktop をインストール
 - 
claude_desktop_config.jsonに MCPサーバーを登録 
{
  "mcpServers": {
    "ardupilot-controller": {
      "command": "python",
      "args": ["C:/path/to/ardupilot_mcp_server.py"],
      "alwaysAllow": ["arm", "disarm", "takeoff", "change_mode"]
    }
  }
}
- Claude Desktop を再起動し、チャットから呼び出せるようになります
 
実行例 (Prompt)
- 「ArduPilotをアームして」
 - 「10メートルまで離陸して」
 - 「GUIDEDモードにして」
 
Claude または Cline が、これらの指示を MCP ツールに変換して実行してくれます。
おわりに
MCPを使って「チャットからドローンを自然言語で操作する」という面白い体験が手軽に構築できました。今回は機体操作をしてみましたが、実際の運用では撮影した画像、位置情報、ログ、ミッションといった各種データの管理・解析のワークフローの自動化の用途が考えられます。
さらに、ClineのようなAIコーディングツール兼MCPクライアントを使うと、単なるチャット操作にとどまらず、問題発生時に自動でコード修正を試みるような高度な振る舞いまでできました。
Clineを無料で試すなら、OpenRouterで使える deepseek/deepseek-chat-v3-0324:free モデルが快適でした(10クレジット購入しておくと1000リクエスト/日まで無料で使えるのも魅力です)。
Discussion