mcpField
T
teams-migration

teams-migration

github.com/julianobarbosa生産性1455 回インストール2 日前に更新
リポジトリ

teams-migration について

TeamsMigration は、Microsoft Teams のチャット内容を移行・エクスポートするスキルです。チャットをチームチャネルにコピーしたりバックアップしたりする用途向けで、送信者情報、タイムスタンプ、画像、添付ファイルを保持します。読み取りには `teams-mcp`、一括投稿には Microsoft Graph API を使います。

主な機能

  1. 01チャット内容をチームチャネルへ移行
  2. 02チャットメッセージを JSON に出力
  3. 03ページネーションで全メッセージを取得
  4. 04送信者と時刻の情報を保持
  5. 05Graph API でレート制限付き一括投稿

活用シーン

  1. 01会議チャットをチームチャネルへ移行
  2. 02グループチャットや会議チャットを保存
  3. 03多数のチャットメッセージを一括投稿
  4. 04移行した件数と内容を確認

MCP 対応

`teams-mcp` MCP サーバーで Teams のチャットメッセージを読み取ります。大量投稿は Microsoft Graph API を直接使用します。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/julianobarbosa/claude-code-skills --skill teams-migration

インストール後、Claude Code で/teams-migrationを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

Tools/
MigrateChat.mjs
Workflows/
ExportChat.md
MigrateChat.md

詳細

カスタマイズ

実行前に、次の場所にユーザー設定があるか確認してください: ~/.claude/skills/PAI/USER/SKILLCUSTOMIZATIONS/TeamsMigration/

このディレクトリが存在する場合は、そこにある PREFERENCES.md、設定、またはリソースを読み込んで適用してください。これらはデフォルトの動作より優先されます。ディレクトリが存在しない場合は、スキルのデフォルト設定に従ってください。

音声通知

このスキルが呼び出されたら、ほかの操作を行う前に、必ずこの通知を送信してください。

  1. 音声通知を送信:

    curl -s -X POST http://localhost:8888/notify \
      -H "Content-Type: application/json" \
      -d '{"message": "Running the WORKFLOWNAME workflow in the TeamsMigration skill to ACTION"}' \
      > /dev/null 2>&1 &
    
  2. テキスト通知を出力:

    Running the **WorkflowName** workflow in the **TeamsMigration** skill to ACTION...
    

TeamsMigration

Teams の会議チャットまたはグループチャットの内容をチームチャネルに移行し、送信者の帰属、タイムスタンプ、画像、添付ファイルを保持します。読み取りには teams-mcp MCP サーバーを使用し、大量の投稿には Microsoft Graph API を直接使用します。トークンの自動更新とレート制限に対応しています。

ワークフローの振り分け

ワークフロートリガーファイル
MigrateChat「チャットを移行」「チャットをチャネルにコピー」「メッセージを移動」Workflows/MigrateChat.md
ExportChat「チャットをエクスポート」「チャットをバックアップ」「メッセージをダウンロード」Workflows/ExportChat.md

例

例 1:会議チャットをチームチャネルに移行する

User: "Migrate the Teams meeting chat to the DevOps channel"
--> Invokes MigrateChat workflow
--> Verifies auth, fetches all messages with pagination
--> Filters system/deleted messages, reverses to chronological order
--> Posts each message with sender + timestamp attribution
--> Verifies count parity and spot-checks content

例 2:チャットメッセージをローカルファイルにエクスポートする

User: "Export all messages from our DevOps chat"
--> Invokes ExportChat workflow
--> Fetches all messages with full pagination
--> Saves to JSON file with metadata

クイックリファレンス

  • MCP サーバー: @floriscornel/teams-mcp(npm)
  • 認証ファイル: ~/.msgraph-mcp-auth.json
  • トークンキャッシュ: ~/.teams-mcp-token-cache.json
  • 認証コマンド: npx @floriscornel/teams-mcp@latest authenticate
  • 移行ツール: Tools/MigrateChat.mjs(Node.js、依存関係なし)

主な知見

  • Graph API は descending: false に対応していません -- 降順で取得し、配列を逆順にします
  • download_message_hosted_content はチャネルメッセージでのみ機能し、チャットメッセージでは機能しません
  • トークンの自動更新 は ~/.teams-mcp-token-cache.json 内の MSAL 更新トークンを介して行われます
  • レート制限 は、429 応答の Retry-After ヘッダーに従って処理されます
  • 一括投稿(50 件以上のメッセージ)には、 MCP ツール呼び出しではなく、Graph API を直接使用する Tools/MigrateChat.mjs を使います
  • アカウントには Teams ライセンスが必要です -- ライセンスがないと Chat.* エンドポイントは失敗します(403)

注意点

  • Graph API はチャットメッセージで descending: false を無視します: エンドポイントは常に降順で返しますが、エラーは通知されません。必ず降順で取得し、ローカルで配列を逆順にしてください。昇順だと仮定すると、移行先にメッセージが新しい順で投稿されます。
  • download_message_hosted_content はチャネルメッセージでのみ機能し、チャットメッセージでは機能しません: 会議チャットやグループチャット内の画像には、/chats/{id}/messages/{id}/hostedContents を経由する別のコードパスが必要です。チャットメッセージに対してこれを呼び出すと、「content not found」という誤解を招くメッセージとともに 404 が返されます。
  • ~/.teams-mcp-token-cache.json 内の MSAL 更新トークンは、90 日間使用しないと有効期限が切れます: 長期間空いた後の最初の移行は AADSTS700082 で失敗します。npx @floriscornel/teams-mcp@latest authenticate を再実行してください。トークンの更新は、失敗するまではサイレントに行われます。
  • Chat.* Graph エンドポイントには、呼び出し元アカウントの Teams ライセンスが必要です: ライセンスのないサービスアカウントは、ライセンスではなく権限に言及するテキストとともに 403 を返します。Graph のスコープを調べる前に、az ad user show --id <upn> --query assignedLicenses で確認してください。
  • MCP ツール呼び出しには、毎秒約 50 メッセージのレート制限があります: MCP レイヤー経由の一括移行は、スロットリングによって数時間かかることがあります。50 件以上のメッセージでは、MCP を介さずに Tools/MigrateChat.mjs を使い、Retry-After に対応したうえで Graph に直接接続してください。
  • 投稿時、送信者名はメタデータではなく本文に保持されます: 移行先のチャネルでは移行ボットが投稿者として表示され、元の送信者はメッセージ本文に埋め込まれます。投稿者を基準とするコンプライアンス/eDiscovery クエリでは、移行されたコンテンツがまったく見つかりません。

コメント