1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python】Claude Desktopからローカルの画像管理アプリ(Eagle)を操作する「MCPサーバー」を自作した話

Posted at

はじめに:AIが「私のPC」を操作する時代

「Claude、Eagleにある『黒色の猫』の画像を探して」
「この画像の雰囲気を分析して、適切なタグを付けておいて」

もし、チャットボットに自然言語で話しかけるだけで、ローカルPCにある31万枚の画像コレクションを自由自在に操れるとしたら?

そんな「LLMとローカル環境の連携」を標準化し、実用的な操作を可能にする共通規格が、Anthropicの提唱する MCP (Model Context Protocol) です。

この記事では、画像管理アプリ Eagle をClaude Desktopから直接操作できる 「Eagle MCP Server」 を自作し、31万枚の画像整理をAIエージェントに任せてみた記録を共有します。

Claude DesktopでEagleを操作しているデモ画面

MCP (Model Context Protocol) とは?

MCP は、ClaudeのようなLLM(大規模言語モデル)と、外部のデータやツールを接続するための標準規格です。

これまで、AIにローカルのツールを使わせるには、複雑な「Function Calling」の実装や、独自のプラグイン開発が必要でした。しかしMCPを使えば、「ツール(関数)」を定義してサーバーとして公開するだけで、Claude Desktopなどのクライアントアプリが自動的にそれを認識し、使用してくれるようになります。

まさに、「LLMのためのUSB規格」 と呼ぶべき画期的なプロトコルです。

なぜ作ったのか:31万枚の「未分類」地獄

私はEagleという素晴らしいアプリに、31万枚以上の画像や素材を保存しています。しかし、その整理はとうの昔に破綻していました。

「いつか整理しよう」と思って放り込んだ画像が、数万枚単位で「未分類」フォルダに眠っている...。
探したい画像があっても、キーワードが曖昧で見つからない...。

そこで考えました。
「AIに画像を見せて、勝手に整理させればいいじゃないか」

システム構成:WSL2 × Eagle API × MCP

私の開発環境は Windows 11 + WSL2 (Ubuntu) です。
ここで少し技術的な壁があります。

  1. Eagleアプリ: Windows側で動作(APIサーバーもWindows)
  2. MCPサーバー: Python環境の管理しやすさからWSL2で動かしたい
  3. Claude Desktop: Windowsアプリとして動作

これらを繋ぐため、以下のような構成にしました。

実装:Pythonで「FastMCP」を使う

MCPサーバーの実装には、Python製のSDK fastmcp を使用しました。これを使うと、驚くほど簡単にサーバーが書けます。

1. サーバーの初期化

from fastmcp import FastMCP

# サーバー名を指定して初期化
mcp = FastMCP("Eagle-AI-Server")

たったこれだけです。

2. ツール(機能)の定義

Claudeに使わせたい機能を、デコレータ @mcp.tool() を付けて関数として定義します。
ドキュメンテーション文字列(docstring)がそのまま「AIへの説明書」になるため、詳細に書くのがコツです。

画像検索ツール

@mcp.tool()
def search_eagle(keyword: str) -> str:
    """
    Eagle ライブラリの中から、キーワードや条件に一致する画像を探します。
    ユーザーが「猫の画像」と言ったら "" で検索してください。
    
    Args:
        keyword: 検索したいキーワード(例: "", "風景", "Screenshot""""
    # Eagle APIを叩いて検索
    results = eagle_client.search(keyword)
    
    # AIが読みやすい形式に整形して返す
    return format_search_results(results)

画像分析ツール

ローカルのVLM(Qwen2-VL)を使って、画像を詳しく分析するツールも作りました。

@mcp.tool()
def analyze_image(file_path: str) -> str:
    """
    指定された画像の視覚的な内容、雰囲気、文字情報(OCR)を詳しく分析します。
    """
    # WindowsパスをWSLパスに変換する処理が必要(後述)
    wsl_path = convert_win_to_wsl(file_path)
    
    # VLMで分析(重い処理)
    analysis_result = vlm_analyzer.analyze(wsl_path)
    
    return analysis_result

3. サーバーの実行

if __name__ == "__main__":
    mcp.run(transport="stdio")

これで、標準入出力(stdio)を通じてClaudeと会話できるサーバーの完成です。

技術的なハマりどころと解決策

実装自体は簡単でしたが、環境特有の問題にいくつか直面しました。

課題1: Windows (Claude) と WSL2 (MCP) の接続

Claude Desktop(Windowsアプリ)の設定ファイルに、WSL2上のPythonスクリプトを登録する必要があります。しかし、単にパスを書くだけでは動きません。

解決策: バッチファイルでブリッジする

Windows側に、WSL2内のコマンドを叩くためのバッチファイル(run_eagle_mcp.bat)を用意しました。

@echo off
chcp 65001 >nul
wsl.exe -d Ubuntu-20.04 -u user --cd /home/user/dev/Eagle_API bash -c "source .venv/bin/activate && python mcp_server.py"

そして、Claude Desktopの config.json にはこのバッチファイルを指定します。

{
  "mcpServers": {
    "eagle-ai": {
      "command": "C:\\Users\\user\\Scripts\\run_eagle_mcp.bat",
      "args": []
    }
  }
}

これで、Claude Desktop → バッチファイル → WSL2 → Python という経路が開通しました。

課題2: パスの壁(Z:ドライブ vs /mnt/z)

Eagle APIから返ってくるファイルパスはWindows形式(例: Z:\Images\cat.jpg)ですが、WSL2上のPythonから画像を開くにはWSL形式(/mnt/z/Images/cat.jpg)が必要です。

これには地道なパス変換関数を実装して対応しました。

def wsl_path_converter(windows_path: str) -> str:
    # ドライブレター置換
    if len(windows_path) > 1 and windows_path[1] == ':':
        drive = windows_path[0].lower()
        rest = windows_path[2:].replace("\\", "/")
        return f"/mnt/{drive}{rest}"
    return windows_path

実際の動作デモ:AIエージェントに任せる「画像管理」

実際に Claude Code (Sonnet 4.5) で動かしてみた様子を紹介します。

1. 検索 + 詳細分析の連携

: 「Eagleで『女の子』の画像を検索して、その中から一番最近追加された画像を1枚選んで、内容を詳しく分析して。」

AI: (内部で search_eagle を実行。「女の子」ではファイルが見つからなかったため、自動で「girl」に切り替えて再検索を実行)

Claude Codeでの検索・分析プロセス

Claudeの回答(分析結果):

画像分析結果の出力

画像分析結果
20代後半の日本のギャル系女性のイラストです。金髪/白髪系の明るい髪色にフープピアス、黒いチョーカーを身に着け、タブレットPCとスマートフォンを持っています。夜の都市のネオンサインを背景に、都会的な雰囲気を感じさせます。

このように、一度の指示で「検索 → 最適な1枚を選択 → 詳細情報の取得 → AIによる画像分析」までが、一気通貫で自動実行されます。

2. 複数アイテムの検索 + 一覧表作成

: 「『no human』タグが付いている画像を3枚探して、それぞれの解像度と付いているタグを一覧表にしてまとめて。」

一覧表作成のデモ

複数のアイテムに対しても、AIが個別に情報を取得し、人間が読みやすい表形式にサマライズしてくれます。

3. エラーハンドリング(パス変換の検証)

あえて存在しないWindows形式のパスを渡して、WSL2側での変換とエラー処理が機能するかテストしました。

: 「C:\dummy.jpg を分析してみて。」

エラーハンドリングのテスト

内部で analyze_image(file_path: "C:\\dummy.jpg") が呼ばれ、WSL2側のパス /mnt/c/dummy.jpg として正しく解釈された上で、「ファイルが見つからない」という適切なエラーが返ってきています。

まとめ:MCPは「個人開発者」にこそおすすめしたい

MCPの登場によって、LLMは単なる「話し相手」から、「PC操作の代行者」 へと進化しました。

特に、EagleのようなローカルアプリのAPIをMCPでラップするだけで、「自分専用の最強AIアシスタント」 が爆誕します。
今回は画像管理でしたが、他にも:

  • Obsidian MCP: メモの検索・要約・リンク作成
  • Git MCP: ローカルリポジトリのコミット履歴分析
  • Home Automation MCP: 自宅のIoT機器操作

など、アイデア次第で可能性は無限大です。

皆さんもぜひ、fastmcp で「俺専用MCPサーバー」を作ってみてください。世界が変わります。

参考リンク


システムの全体像について

本記事では「AIによる操作(MCP)」にフォーカスしましたが、そもそもなぜ31万枚もの画像を整理する必要があったのか?という背景や、RTX 5090 を活用したローカルVLMマシンの構成など、システム全体のアーキテクチャについてはZennで詳しく解説しています。


1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?