メインコンテンツへスキップ
見出し画像

Excel自動化MCPを自作してみた!Claude伴走型で挑戦

    こんにちは!YaroTechです。

    「既存のMCPツールは便利だけど、もっと業務に特化した機能が欲しい...」
    「VBAマクロの管理までClaude Desktopからできたらいいのに...」
    「そうだ、自分で作ればいいんだ!」

    今日は、そんな思いから始まったExcel自動化MCP開発の道のりを振り返ります。既に運用して重宝している自作MCPの開発秘話をお届けします。
    そして、いつもどおり、私はプログラムは一切触っておりませんが、ClaudeDesktopが伴走してくれたから出来ました!

    🖥️ 動作確認環境

    まず最初に、開発・運用環境をお伝えします:

    • PC: Microsoft Surface Laptop 7th(Snapdragon X Elite / ARM64)

    • OS: Windows 11 Pro 24H2(ARM64版)※Copilot+ PC

    • Python: 3.12.3(※ARMユーザー注意※Microsoft Store版ではない通常版)

    • 必須ライブラリ: pywin32、mcp

    • Claude Desktop: Pro契約(2025/4/21~)

    ※ARM版Windowsでも動作可能ですが、x64版Windowsとは一部異なった調整が必要です。

    🎯 この記事で得られること

    • MCP自作への第一歩の踏み出し方

    • PythonとTypeScriptの選択基準

    • Excel COM オブジェクトの活用方法

    • 開発で直面した壁とその乗り越え方

    • 完成後の運用で感じた価値

    📊 開発前後の変化

    Before: 既存MCPでは限界があった

    • filesystemでExcelファイルは読めるが...

    • VBAマクロの設定、管理はできない

    • セルの直接操作は面倒

    After: 業務特化の自作MCPで解決!

    • Excelの完全制御が可能に

    • VBAモジュールの追加・編集・実行

    • 複数シートの一括処理

    開発時間: 約4時間(試行錯誤含む)

    🚀 なぜMCPを自作したのか

    きっかけは日常の不満から

    毎日のExcel作業で、こんなことを感じていました:

    1. VBAマクロの管理が面倒

      • 複数のExcelファイルに同じマクロをコピー

      • バージョン管理ができない

      • Claude Desktopから直接実行したい

    2. 既存MCPの限界

      • filesystemはファイル単位の操作のみ

      • セルレベルの細かい制御は不可

      • Excel特有の機能(グラフ、ピボット等)非対応

    3. 自動化の夢

      • 「このシートのA1からD100をまとめて処理して」

      • 「全てのExcelファイルにこのマクロを適用して」

      • こんな指示を Claude Desktop に出したい!

    4. MCPのセキュリティ確保

      • MCPのfilesystemは「Anthropic公式」ということで入れました!

      • Anthropic公式や公式プロバイダであれば比較的安心だけど、使いたいMCPがない。。。

      • 使いたいMCPをセキュリティ・運用性を加味して自作して、自分のPC内で使う方がセキュリティ面で安心できると思いました。

    ClaudeDesktopにまずは聞いてみました。

    画像
    ClaudeDesktopでMCP自作について質問してみました。

    PythonかTypeScriptか?重要な選択

    最初に悩んだのが実装言語の選択でした。

    PythonとTypeScriptの比較表です。

    ┌──────────┬─────────────────┬──────────────┐
    │ 比較項目           │ Python                                │ TypeScript                   │
    ├──────────┼─────────────────┼──────────────┤
    │ MCP SDK          │ 対応 ✓                                │ 対応 ✓(公式推奨) │
    ├──────────┼─────────────────┼──────────────┤
    │ Excel COM操作 │ pywin32で簡単 ⭐             │ 複雑(追加必要)      │
    ├──────────┼─────────────────┼──────────────┤
    │ 学習コスト  │ 低い ✓                               │ 中程度                         │
    ├──────────┼─────────────────┼──────────────┤
    │ 実行速度        │ 十分高速                            │ より高速                     │
    ├  ─────────┼─────────────────┼──────────────┤
    │ 開発効率     │ 高い ⭐                              │ 中程度                        │
    ├────────  ─┼─────────────────┼──────────────┤
    │ コミュニティ   │ Excel自動化の事例豊富 ⭐│ MCP関連は多い          │
    └─  ────────┴─────────────────┴──────────────┘

    TypeScript版の検討:

    // MCP公式サンプルはTypeScript
    import { Server } from '@modelcontextprotocol/sdk';
    // でも、ExcelのCOM操作は...?
    // node-win32ole? それとも別の方法?

    Python版を選んだ理由:

    # pywin32でExcel COMが簡単に扱える!
    import win32com.client as win32
    excel = win32.Dispatch("Excel.Application")
    # これだけでExcelを操作できる

    決め手はExcel COM オブジェクトの扱いやすさでした。

    ※Excel COM オブジェクト:プログラムからExcelを操作する特別なリモコン(COM オブジェクト)のようなものです。
    PythonとTypeScriptの違いは?

    🏠 家電のリモコンに例えると:

    Python の場合(簡単)

    • 日本のテレビに日本のリモコンを使うようなもの

    • ボタンを押せばすぐ動く

    • 説明書も日本語でわかりやすい

    TypeScript の場合(複雑)

    • 日本のテレビに海外のリモコンを使うようなもの

    • 変換アダプターが必要

    • 設定が複雑で、うまく動かないことも

    🔧 開発の道のり

    Step 1: 最小限のMCPサーバー作成(1時間目)

    画像
    ClaudeDesktopに欲しい機能を伝えたらExcel MCP Serverのコード例を作ってくれました。

    まずは「Hello World」的なMCPサーバーから:

    #!/usr/bin/env python3
    """最小限のExcel MCP Server"""
    from mcp.server.lowlevel import Server
    import mcp.server.stdio
    
    # サーバー作成
    server = Server("excel-mcp-server")
    
    # 最初のツール:Excelを開く
    @server.list_tools()
    async def list_tools():
        return [
            {
                "name": "open_excel",
                "description": "Excelを開きます",
                "inputSchema": {
                    "type": "object",
                    "properties": {
                        "visible": {"type": "boolean"}
                    }
                }
            }
        ]
    
    # メイン処理
    async def main():
        async with mcp.server.stdio.stdio_server() as (read_stream, write_stream):
            await server.run(
                read_stream,
                write_stream,
                InitializationOptions()
            )
    
    if __name__ == "__main__":
        import asyncio
        asyncio.run(main())

    ClaudeDesktopは「設定手順書」なるものを作ってくれましたが、ファイルの移動など面倒な部分はワンクリックでできるようにClaudeDesktopにバッチファイルを作成してもらいました。

    画像
    設定をできるだけ手間なくするためにバッチファイルを作成してもらいました。

    最初の起動で「MCPサーバーとして認識された!」という感動がありました。

    Step 2: Python環境の罠とExcel COM オブジェクトとの格闘(2時間目)

    ここが最大の山場でした。

    最初の落とし穴:Microsoft Store版Python

    開発を始めてすぐ、謎のエラーに遭遇:

    # Microsoft Store版Pythonでの実行結果
    >>> import os
    >>> os.listdir('C:/Users/ユーザー名/Documents')
    PermissionError: [WinError 5] アクセスが拒否されました

    謎のエラーに遭遇する度にClaudeDesktopにトスして修正してもらいました。

    画像
    ClaudeDesktopにエラースクショとログを渡して修正してもらいました。

    なんと、Microsoft Store版のPythonはサンドボックス化されていて、ファイルアクセスに制限があったんです!

    画像
    根本的な解決方法をClaudeDesktopから教えてもらいました。

    通常版Pythonをインストールする前に、元々のMicrosoftStore版Pythonと競合するなど問題が起こらないか確認してから進めました。

    画像
    Pythonのインストールする前に環境内での競合など確認

    解決策:通常版Pythonのインストール

    # 1. まず現在のPythonを確認
    C:\> where python
    C:\Users\ユーザー名\AppData\Local\Microsoft\WindowsApps\python.exe  # ← これがStore版!
    
    # 2. 通常版をインストール後
    C:\> where python
    C:\Users\ユーザー名\AppData\Local\Programs\Python\Python312\python.exe  # ← 通常版!

    この切り替えだけで30分を費やしました...

    Step 3: ClaudeDesktopと試行錯誤の実装(3時間目)

    ファイルの配置などはバッチファイルで出来ましたが、ClaudeDesktopがExcelMCPServerを認識してくれないエラーが3度ほどありました。

    画像
    ClaudeDesktop再起動後にMCPを認識してくれないエラー画面

    エラーが出る都度、エラーのスクリーンショットとClaudeDesktopの左上メニュの開発者>MCPログファイルを開く…からログファイルをコピペしてClaudeDesktopに渡してどうにかしてもらいました(;^_^A

    画像
    ClaudeDesktop左上メニュ>開発者>MCPログファイルを開く…

    エラーは減りましたが、通常版PythonをインストールしてPCを再起動してもエラーが出たため、MCPのファイル名にハイフンが良くないのでは?(直感の思いつき)と公式ドキュメントを確認してもらいました。

    画像
    ClaudeDesktopにMCP公式ドキュメントを確認してもらいました。

    そしたら、なんとMCPサーバー名の命名規則で「ハイフン問題」がありそうと特定でき、ClaudeDesktopに褒めてもらいました!
    喜んだのもつかの間、ClaudeDesktopにExcelMCPを認識してもらえず。

    画像
    もう1度公式ドキュメントを見てもらい他の手段を考えてもらうことに

    そして、結果的に行き着いた原因は、、、ClaudeDesktopのMCPファイルの修正ミス!ということが分かりました。

    画像
    ClaudeDesktopが自分の間違いだと気づきました。

    そこから、2度ほどエラーが出て、コード修正をしてもらい、なんとかClaudeDesktopに自作のExcelMCPを認識してもらいました!

    画像
    ExcelMCPサーバーが正常に認識された情報共有と次の作業を指示

    ファイルをいろいろと作ってもらったので、ファイル整理をしてもらいつつ、別のx64版WindowsPCでExcelMCPの設定が簡単にできるバッチファイルも作成してもらいました。ClaudeDesktopに感謝です!

    画像
    x64版Windows用のバッチファイルを作成しているClaudeDesktop

    Step 4: 運用ツールの整備(4時間目)

    MCPサーバー本体だけでは不十分。運用には周辺ツールが必要でした。

    ちなみに自作のExcelMCPを使用する際は「excel_mcp_server.py」ファイルを実行してExcelMCPサーバーを起動しないとClaudeDesktopからはExcel操作を行うことができません。

    最初は毎回コマンドプロンプトで起動していた...

    C:\> cd C:\Users\ユーザー名\mcp-servers\excel
    C:\Users\ユーザー名\mcp-servers\excel> python excel_mcp_server.py
    Starting Excel MCP Server...

    私としては、慣れないコマンドプロンプトを毎回開いてコード実行するのがとても面倒に感じてしまいました。そこで、、、
    毎回このコマンドを打つのは面倒!そこで Claude Desktop に相談:

    私:「毎回コマンド打つの面倒なんだけど、ワンクリックで起動できない?」
    Claude:「バッチファイルを作りましょう!filesystemで直接作成しますね」
    画像
    ClaudeDesktopにワンクリックでできるバッチファイルを作ってもらいました。

    ClaudeDesktopにワンクリックでExcelMCPサーバーを起動できるバッチファイルを作成してもらいました!これなら普段使いもいけそうです。
    これも面倒な方はWindowsのタスクスケジューラーにWindows起動のたびにバッチファイルを実行してもらうように設定すると更にラクチンですね!

    ワンクリック起動バッチファイル(start_excel_mcp_server.bat):

    @echo off
    echo Excel MCP Server を起動します...
    echo ==========================================
    
    REM サーバーディレクトリに移動
    cd /d "%USERPROFILE%\mcp-servers\excel"
    
    REM Pythonバージョン確認
    echo Python環境を確認中...
    python --version
    
    REM サーバー起動
    echo.
    echo サーバーを起動中...
    echo 終了するには Ctrl+C を押してください
    echo.
    python excel_mcp_server_x64.py
    
    pause

    このバッチファイルも、Claude Desktop の filesystem MCP でサクッと作成してもらいました!ありがとう!ClaudeDesktop!

    🔧 開発で学んだ重要なポイント

    1. Excel VBA設定の重要性

    ExcelをClaudeDesktopが操作できるように見逃しがちな設定:

    Excel → ファイル → オプション → トラストセンター 
    → トラストセンターの設定 → マクロの設定
    → 「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」

    これをチェックしないとClaudeDesktopからVBA操作ができません!エラーメッセージも分かりづらく、15分ほど悩みました。

    2. プロセス管理の大切さ

    Excel COMオブジェクトは適切に終了しないとゾンビプロセスが残ります:

    def cleanup(self):
        """リソースのクリーンアップ"""
        try:
            if self.workbook:
                self.workbook.Close(SaveChanges=False)
                self.workbook = None
            
            if self.excel_app:
                self.excel_app.Quit()
                self.excel_app = None
                
            # ガベージコレクション強制実行
            import gc
            gc.collect()
            
        except Exception as e:
            logger.error(f"Cleanup error: {e}")

    3. エラーハンドリングの重要性

    COM操作は予期せぬエラーが多発:

    • ファイルがロックされている

    • Excelが応答しない

    • メモリ不足

    • Microsoft Store版Pythonでのアクセス権限エラー(最重要!)

    全ての操作に適切なエラーハンドリングが必須でした。

    4. filesystemの威力を実感

    今回の開発で最も助かったのは、既存の filesystem MCP でした:

    私:「このPythonコードをexcel_mcp_server.pyとして保存して」
    Claude:「filesystemを使って保存しました」
    
    私:「起動用のバッチファイルも作って」
    Claude:「start_excel_mcp_server.batを作成しました」
    
    私:「README.mdも整備して」
    Claude:「プロジェクトの説明を含むREADME.mdを作成しました」

    ファイル操作を自然言語で指示できるのは、開発効率を劇的に向上させました!

    📈 完成後の効果

    実際に1ヶ月運用してみた結果:

    • 定型作業の自動化: 月40時間 → 4時間(90%削減)

    • VBAマクロの一元管理: バージョン管理が可能に

    • エラー率: 手作業の5% → 0.1%未満

    • 精神的負担: 大幅軽減(単純作業からの解放)

    特に嬉しかったのは、Claude Desktopに「全部のExcelファイルにこのマクロ適用して」と言うだけで処理が完了することです。

    私:「フォルダ内の全Excelファイルに集計マクロを追加して実行して」
    Claude:「了解しました。12個のExcelファイルを処理します...」
    (30秒後)
    Claude:「完了しました!全ファイルの集計が終わりました」
    私:「素晴らしい!」

    💡 今後の展望

    自作MCPの可能性は無限大です:

    • 機能拡張: グラフ自動生成、ピボットテーブル操作

    • 他ツール連携: PowerPointやWordとの連携

    • AI分析: Claude による Excel データの高度な分析

    💬 まとめ

    MCP自作は思ったより簡単でした。必要なのは:

    1. 解決したい具体的な課題

    2. 基本的なPython知識(初級レベルでOK)

    3. 試行錯誤を楽しむ心

    特に今回の開発では、filesystem MCP の存在が大きかったです。設定ファイル、バッチファイル、Pythonスクリプト...すべてClaude Desktopとの対話の中で直接作成してもらえました。まさに「MCPがMCPを作る」という面白い体験でした!

    既存ツールで満足できない方、ぜひ自作MCPにチャレンジしてみてください!

    来週は「ブラウザ操作MCPを作る!Puppeteerで実現する自動化」についてお伝えします。
    また、MCPの設定を簡単にするDXTファイルへの変換にもチャレンジ予定です!


    🎁 読者特典

    💝 いいね50を超えたら: Excel MCP の基本コードを公開!
    🎉 いいね100を超えたら: ワンクリックExcelMCP設定用ファイルを公開!

    シェアの際は #MCP自作 #Excel自動化 #Python #YaroTech をつけていただけると嬉しいです。

    💬 質問・リクエスト

    「○○業務用のMCPは作れる?」
    「TypeScript版の作り方も知りたい」
    「エラーが解決できない...」

    コメント欄でお気軽にどうぞ!MCP自作仲間が増えると嬉しいです。


    🔗 関連記事

    📚 参考リソース


    🏷️ タグ
    #MCP自作 #Excel #Python #VBA #自動化 #ClaudeDesktop #pywin32 #COM #開発 #効率化 #YaroTech #生成AI #プログラミング  #noteチャレンジ #ARM64 #SurfaceLaptop

     
     
    生成AIの感動を共有したいYaroTechです✨ 常識より実験。正解より行動。 生成AI時代を、先に試す傾奇者。 📝 430日間継続投稿中| 🎉 フォロワー1840名突破!🤝 質問大歓迎!みんなで「AIと共に羽ばたく」コミュニティを作りましょう🚀

    あなたへのおすすめ