Zenn
🗒️

MCPサーバーを使って「練習データを解析→記事化→noteに投稿」を自動化してみた

に公開

前提

  • 練習時に、GarminとRunmetrixを装着して計測しています

構成

  • Windows11
  • Claude Desktop
  • MCPサーバー
    • filesystem
    • playwright
      • ブラウザモード
        • 挙動を確認したいから

できなかったこと

  • playwrightを使ったGarmin ConnectやRunning Data Manager(Runmetrixのデータが見れるサイト)からのCSVダウンロードができませんでした
    • bot的なアクセスを拒否ってる?

代替策

  • 自分でダウンロードして所定のフォルダに保存
    • filesystemにアクセス許可を与えておくこと
    • ファイル名のパターンを示すことでGarminのデータなのかRunmetrixのデータなのかを判別

プロンプト

  • プロジェクトナレッジを使いたいからプロジェクトを使います
  • プロジェクトナレッジの 「プロジェクトの指示を設定」 に、プロンプトに毎回入れるのがめんどくさいことを書いておいて実質的なプロンプトとして機能させて、実際のプロンプトはショートカット的に 記事を作って という超短文で指示完了。
実体
# ルール
- 日本語で返すこと
# 指示内容と作業手順
## noteへの記事投稿
### 指示
- 記事を作って
  - 多くの場合、前日日付の記事を作成することになるので、日付指定がない場合は前日を参照。
- ${日付}の記事を作って
### 作業手順
1. Garmin Connectのデータを
C:\Users\...(ファイルの置き場所)
からfilesystemを使って取得。
ファイル名は、activity_${数字}.csv
更新日時が指示当日のファイルが対象。
該当ファイルがなければ作業終了。後続の処理に進まないこと。
2. Runmetrixのデータを
C:\Users\...(ファイルの置き場所)
からfilesystemを使って取得。
ファイル名は、lap_form_data - ${数字}.csv
更新日時が指示当日のファイルが対象。
該当ファイルがなければ作業終了。後続の処理に進まないこと。
3. GarminのデータとRunmetrixのデータを解析
4. プロジェクトナレッジにある「noteへの投稿テンプレ(1日ずつ)」のフォーマットに従って記事の原稿を作成する
5. 作った記事原稿をplaywrightを使ったブラウザ経由でnoteに投稿する

プロジェクトナレッジに入れてる情報

更新できないから、内容に修正が必要になったらコピペして新規追加する必要がある。めんどい。

  • noteの認証情報
    • 抵抗感はある
  • 投稿する記事のテンプレ
実体
# ルール
- 「メニュー」はプロジェクトナレッジに入っている「練習メニュー」に記載されているメニューから指定された日付のメニューを参照して入れること。
- メニューは、練習メニュー/シューズの種類というフォーマットで書かれているので、練習メニューのみを入れること
- 「シューズ」はメニューで指定されている靴の種類に従ってプロジェクトナレッジに入っている「使用シューズ」に記載されているフォーマットで入れる。
- 「計測デバイス」は、GarminとRunmetrixで固定。
- 「結果」は、Garminのデータを入れる
- 「AIからのフィードバック」は、練習メニューと練習結果、GarminのデータとRunmetrixのデータを総合してあなたがフィードバックコメントを入れてください。
- 「ひとこと」は、自分で後から入力するので空白でOK。
- 「最後に」の◯◯の部分は記事の内容全体を踏まえてユーモアを交えた一言を入れてください。気に入らなければ僕が修正するのでフィードバックします。

# テンプレ
## タイトル
YYYY年MM月DD日のトレーニング

## コンテンツ
--
## 🏃 メニュー
## 👟 シューズ
## ⌚ 計測デバイス
- Garmin
- Runmetrix
## 📊 結果
- 距離:xx.xkm
- 時間:xx:xx
- ペース:x:xx/km
- ピッチ:xxxspm
- 心拍:Ave xxx / Max xxx
## 🤖 AIからのフィードバック
## 🧜‍♀️ 女子マネ(キャラ付けChatGPT)の一言
## 📝 所感
# 📎 最後に  
何が言いたいかって言うと、  
**ワイ × マラソン × テック = ○○**
ってこと!
--
## ハッシュタグ
- マラソン
- ランニング
- トレーニング
- AI
- Claude
- ChatGPT
- Garmin
- Runmetrix
  • 練習メニュー
  • 使用シューズの置換テーブル
実体
- ジョグ用→ジョグ用(ONEMIX)
- ペース走用→ペース走用(PUMA Electrify Nitro 3)
- ポイント練習用→ポイント練習用(XTEP 2000km 3.0)
- レース用→レース用(アシックス S4)

結果

僕は編集者として初稿をブラッシュアップしました。
https://note.com/0xkyosuke/n/n2d52c92e99b8

ToDo

  • データをGithubで管理
    • MCPサーバーは入れてるから簡単

MCPサーバーについておまけ

インストール済み

  • filesystem
    • ファイルシステムにアクセスできるやつ
  • notion
    • notionにアクセスできるやつ
      • ページの追加ができないのは不便
  • Slack
    • Slackにアクセスできるやつ
  • Claude code
    • すごいやつ
  • github
    • githubにアクセスできるやつ
  • playwright
    • ブラウザ操作してくれるやつ
      • ヘッドレスモード(ウインドウが立ち上がらないモード)も可能
  • supabase
    • Supabaseにアクセスできるやつ

設定ファイル

実体(実際にはないコメント付けてます)
{
  "mcpServers": {
    "filesystem": {
      "command": "C:\\Users\\...\\npx.cmd", // npxコマンドのフルパス
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "C:\\Users\\...\\Downloads", // アクセスしていいフォルダをコンマ区切りで列挙
      ]
    },
    "mcp_notion_server": {
      "command": "C:\\Users\\...\\node.exe", // nodeコマンドのフルパス
      "args": [
        "C:\\Users\\...\\index.js" // mcpサーバーのインストールフォルダ
      ],
      "env": {
        "NOTION_API_TOKEN": "..."
      },
      "disabled": false,
      "autoApprove": [
        "notion_create_database",
        "notion_append_block_children",
        "notion_create_database_item"
      ]
    },
    "slack_server": {
      "command": "C:\\Users\\...\\npx.cmd",
      "args": [
        "-y",
        "@modelcontextprotocol/server-slack"
      ],
      "env": {
        "SLACK_BOT_TOKEN": "...",
        "SLACK_TEAM_ID": "..."
      }
    },
    "claude_code": {
      "command": "wsl",
      "args": [
        "-e",
        "bash",
        "-l",
        "-c",
        "source ~/.nvm/nvm.sh && /home/.../bin/claude mcp serve"
      ],
      "env": {}
    },
    "github": {
      "command": "C:\\Users\\...\\npx.cmd",
      "args": [
        "-y",
        "@modelcontextprotocol/server-github"
      ],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "..."
      }
    },
    "playwright": {
      "command": "C:\\Users\\...\\npx.cmd",
      "args": [
        "@playwright/mcp@latest"
      ]
    },
    "supabase": {
      "command": "C:\\Users\\...\\npx.cmd",
      "args": [
        "-y",
        "@supabase/mcp-server-supabase@latest",
        "--access-token",
        "..."
      ]
    }
  }
}

注意事項

  • フルパスにしないと動かないものもあったのでフルパスで統一
  • フォルダ区切りはバックスラッシュでエスケープが必要

Discussion

ログインするとコメントできます