camera-mcp

camera-mcp

MCP server for controlling USB-connected DSLR cameras (e.g., Canon EOS 6D) via natural language, with features like capture, exposure settings, and autonomous timelapse with feedback-based auto exposure.

Category
访问服务器

README

camera-mcp

USB接続の一眼レフ(Canon EOS 6D で開発)を MCP(Model Context Protocol)サーバーとして公開し、 AIアシスタントから自然言語で操作できるようにする試作です。

Wi-Fi API(Canon CCAPI)を持たない世代のカメラでも、Windows用フリーソフト digiCamControl(内部はCanon EDSDK)のCLIをラップすることで 「今夜0時から100秒間隔で、白飛びしないように撮って」が通ります。

これは個人の実験プロジェクトです。 メーカー非公式で、EOS 6D + Windows 環境でしか動作確認していません。


できること(MCPツール9本)

ツール 内容
camera_status 接続状態・現在のISO/絞り/シャッター速度・実行中ジョブ
camera_capture 1枚撮影してファイルパスを返す
camera_set iso / aperture / shutterspeed / exposurecompensation / whitebalance の変更
camera_focus ライブビュー中のフォーカスモーター駆動(near/far × ステップ数)
timelapse_start タイムラプス開始(間隔・枚数・開始/終了時刻の予約。バックグラウンド実行)
timelapse_stop / timelapse_status 停止 / 進行状況(撮影枚数・エラー数・現在の露出)
timelapse_list 過去セッションの一覧
video_create 連番写真から mp4 を生成(ffmpeg)

目玉:フィードバック式自動露出(ホーリーグレイル対応)

夜から朝にかけてのタイムラプスは、固定露出だと明け方に必ず白飛びします。 timelapse_start(auto_exposure=True) を指定すると、

撮影 → 届いた画像の平均輝度と白飛び率を測定 → 目標輝度とのズレを 1/3 段刻みで補正 → 次のコマ

というループが回ります(USB接続で撮影画像が即PCに届くことを利用)。

  • 明るくする方向:シャッターを長く(上限まで)→ 足りなければISOを上げる
  • 暗くする方向:ISOを下げる → その後シャッターを短く
  • 1コマあたりの変化量を制限してチラつきを抑制
  • 既定はオフ。完全固定露出との比較ができます

実測(8秒/ISO6400 で開始した一晩、203コマ)では、夜明けの平均輝度を最大149.4・白飛び率1.4%に抑えて 約100分で16段ぶん露出を下げ切りました。


必要なもの

  • Windows(digiCamControl が Windows 専用のため)
  • Python 3.10 以上
  • digiCamControl(winget install digiCamControl など)
    • 同梱の ffmpeg.exe を動画生成に使います
  • digiCamControl 対応のカメラ(USB接続。開発機は Canon EOS 6D)
  • Python パッケージ:fastmcp==3.4.4 / Pillow

インストール

cd C:\path\to\camera-mcp
py -3 -m venv .venv
.\.venv\Scripts\python.exe -m pip install -e .

動作確認(カメラ不要のオフラインテスト):

.\.venv\Scripts\python.exe test_ae.py

実機での通しテスト(実際にシャッターを4回切ります):

.\.venv\Scripts\python.exe test_e2e.py

MCPサーバーとして登録する

Claude Code の場合:

claude mcp add camera --scope user -- C:\path\to\camera-mcp\.venv\Scripts\python.exe -m camera_mcp

設定ファイルに直接書く場合(claude_desktop_config.json 等):

{
  "mcpServers": {
    "camera": {
      "command": "C:\\path\\to\\camera-mcp\\.venv\\Scripts\\python.exe",
      "args": ["-m", "camera_mcp"],
      "env": {
        "CAMERA_MCP_DATA_DIR": "D:\\CameraMCP\\sessions"
      }
    }
  }
}

pip install -e . をしていない場合は、スクリプトを直接指すこともできます (args を ["C:\\path\\to\\camera-mcp\\src\\camera_mcp\\server.py"] にする)。

登録後は「1枚撮って」「ISOを800にして」「30秒間隔で撮影開始」といった日本語で呼び出せます。


設定(環境変数)

すべて任意。既定値のままで標準構成なら動きます(src/camera_mcp/config.py)。

環境変数 既定値 用途
CAMERA_MCP_DCC_DIR C:\Program Files (x86)\digiCamControl digiCamControl のインストール先
CAMERA_MCP_REMOTE_CMD <DCC_DIR>\CameraControlRemoteCmd.exe CLI本体
CAMERA_MCP_APP <DCC_DIR>\CameraControl.exe GUI本体(未起動なら自動で起動する)
CAMERA_MCP_FFMPEG <DCC_DIR>\ffmpeg.exe 動画生成に使う ffmpeg
CAMERA_MCP_DATA_DIR <ホーム>\CameraMCP\sessions 撮影データの保存先
CAMERA_MCP_STABLE_TIMEOUT 15 撮影ファイルの書き込み完了待ちの上限(秒)

保存先はクラウド同期フォルダの外にすること。 一晩で1,000枚・数GBになるため、 OneDrive等の配下に置くと同期が破綻します(digiCamControl の既定保存先は同期フォルダ配下なので要変更)。


撮影前のチェックリスト(実戦で効いたもの)

  • 電源:一晩撮るならACアダプター推奨。バッテリー運用ならGPS・Wi-Fi・撮影後の画像表示を「切」に
  • オートパワーオフを「切」に
  • ホワイトバランスは固定(太陽光など)。オートだとコマごとに色基準が変わり、後処理の色解析が成立しない
  • 置きピン:AFで合わせてからレンズをMFへ。autofocus=False で撮影する
  • カメラ内蔵時計を合わせる(EXIFの時刻がずれる。本実装の log.jsonl はPC側の時刻を記録している)
  • ae_max_shutter は撮影間隔より必ず短く(露光がインターバルを超えるとリズムが崩れる)
  • シャッター耐久は有限(EOS 6D は約10万回)。間隔と枚数は意識して設計する

既知の制約

  • Windows専用・digiCamControl依存。EOS 6D 以外は未検証
  • digiCamControl と EOS Utility は同時にカメラを掴めない(EOS Utility は終了しておく)
  • セッションを閉じるとジョブも止まる:撮影ループはMCPサーバープロセス内のスレッドで動くため、 クライアント(Claude Code等)を終了するとサーバーごと落ちます。常駐デーモン化は未対応
  • ジョブは同時に1本だけ
  • 測光は全画面平均(200pxサムネイル)。中央重点もROI指定も無いので、 構図内の変化(花が開く等)を明るさの変化と誤認することがあります
  • 白飛び率は縮小画像で測定しているため、実際よりやや小さく出ます(相対比較用の指標)
  • 露出ステップはEVではなくリストのインデックスを数えています。高感度域は刻みが粗いので、 「1コマ最大1段」の意図に対して実際は1段を超えて動くことがあります
  • P制御+デッドバンドのみ(ヒステリシス・積分項なし)。境界付近で明滅(ハンチング)することがあります
  • 雲によるチラつきは撮影中には消せません。フィードバックは常に1コマ遅れなので、 外光が100秒単位で激変する状況では原理的に間に合いません。後処理(デフリッカー)で処理してください
  • UACダイアログや初回接続の承認など、人間の操作が必要な場面があります

先行事例

自動露出ランピング自体は新しい発想ではありません。Magic Lantern の Auto Exposure Ramping、 qDslrDashboard の Auto Holy Grail が同じ考え方を10年以上前から実装しています。 本プロジェクトの位置づけは、その制御ループをMCPツールとして公開し、自然言語で目標を渡せるようにした インターフェース層にあります。

ライセンス

MIT

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选