Claude Code x Microsoft Teams API でカスタムBotを作成する完全ガイド

Claude Code + Microsoft Teams Webhook/Bot Frameworkで通知Bot・コマンドBot・FAQボットを実装。Teams上で業務自動化を実現する実践ガイド。Teamsを社内自動化ハブに変える方法。

この記事をシェア:
目次 クリックで開く

2026年4月 | Teams自動化 | Bot作成・コマンド自動化

Claude Codeが作成したTeams カスタムBot

▲ Claude Codeが実際に生成した実行結果

Teamsに話しかけると業務が自動で完了する世界が実現した

開発チームリーダーの平田です。毎朝チャンネルに「本日のタスクは?」と投稿し、Redmineを確認し、Teamsに貼り付けていました。Claude CodeでカスタムBotを作り、「/today」と打つだけで今日のタスクが表示されるようになりました。

この記事で実現すること

✅ Webhook受信でコマンドを自動処理
✅ /today /status /assign などのコマンド実装
✅ 定時メッセージの自動投稿
✅ 外部APIとの連携(Jira・Redmine・GitHub)
✅ アダプティブカードで豊富なUIを実現

STEP 1:Teams Incoming Webhookで基本Botを作成する

Teams チャンネルにWebhookを設定し、外部からメッセージを送信できるようにします。

💬 私はClaude Codeにこう頼みました:Microsoft TeamsのIncoming Webhookを使って、以下のメッセージをTeamsチャンネルに自動投稿するスクリプトを作ってください。
– デイリーKPIサマリー(毎朝9時)
– システム障害アラート(即時)
🤖 Claude Codeの回答:Teams Incoming WebhookへのメッセージPOSTスクリプトを作成しました。
import requests
from datetime import datetime, date

WEBHOOK_URL = "https://company.webhook.office.com/webhookb2/YOUR/WEBHOOK/URL"

def send_teams_message(webhook_url, title, text, color="#6264A7", facts=None):
    payload = {
        "@type": "MessageCard",
        "@context": "http://schema.org/extensions",
        "themeColor": color.lstrip("#"),
        "summary": title,
        "sections": [{
            "activityTitle": title,
            "activityText": text,
            "facts": [{"name": k, "value": v} for k,v in (facts or {}).items()],
        }]
    }
    res = requests.post(webhook_url, json=payload)
    print(f"Teams送信: {'OK' if res.status_code==200 else res.status_code}")

def post_daily_kpi(kpi_data):
    facts = {
        "本日の売上":    f"¥{kpi_data['sales']:,.0f}",
        "目標達成率":    f"{kpi_data['rate']:.1f}%",
        "商談数":        f"{kpi_data['deals']}件",
        "未処理問い合わせ": f"{kpi_data['inquiries']}件",
    }
    send_teams_message(
        WEBHOOK_URL,
        title = f"📊 {date.today().strftime('%m/%d')} 朝のKPIサマリー",
        text  = "本日の業務開始です。昨日の実績をご確認ください。",
        color = "#6264A7",
        facts = facts,
    )

def alert_system_error(service_name, error_msg, severity="高"):
    color = "#DC2626" if severity=="高" else "#F59E0B"
    emoji = "🚨" if severity=="高" else "⚠️"
    send_teams_message(
        WEBHOOK_URL,
        title = f"{emoji} システム障害アラート: {service_name}",
        text  = f"**重大度:** {severity}

{error_msg}",
        color = color,
        facts = {"発生時刻": datetime.now().strftime("%Y/%m/%d %H:%M"),
                 "サービス": service_name, "重大度": severity},
    )

# テスト送信
post_daily_kpi({"sales": 3_240_000, "rate": 87.6, "deals": 12, "inquiries": 4})
alert_system_error("受注システム", "DBコネクションエラーが発生しています。確認をお願いします。", "高")
✅ 実行結果

TeamsチャンネルにKPIサマリーとシステム障害アラートが自動投稿されました。色分けされたカード形式で視認性の高いメッセージが届いています。

実行結果

STEP 2:コマンド応答Botをアダプティブカードで実装する

Azure Bot Framework を使ってコマンド(/today /status)に自動応答するBotを作ります。

💬 私はClaude Codeにこう頼みました:/today と入力すると今日のタスクリストを返すTeams Botを作ってください。
アダプティブカードで見やすいUIにしてください。
🤖 Claude Codeの回答:Azure Bot Framework + アダプティブカードでコマンド応答Botを実装しました。
from flask import Flask, request, jsonify

app = Flask(__name__)

def make_task_card(tasks):
    return {
        "type": "AdaptiveCard",
        "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
        "version": "1.4",
        "body": [
            {"type": "TextBlock", "size": "Medium", "weight": "Bolder",
             "text": f"📋 本日のタスク ({date.today().strftime('%m/%d')})"},
            {"type": "FactSet",
             "facts": [{"title": t["name"], "value": f"[{t['status']}] {t['due']}"} for t in tasks]},
            {"type": "TextBlock", "text": f"合計: {len(tasks)}件", "size": "Small", "color": "Accent"},
        ],
        "actions": [
            {"type": "Action.OpenUrl", "title": "Redmineで確認",
             "url": "https://redmine.company.com/my/page"},
        ]
    }

@app.route("/api/bot", methods=["POST"])
def bot_webhook():
    activity = request.json
    msg_text = activity.get("text","").strip().lower()
    
    responses = {}
    if "/today" in msg_text:
        tasks = get_today_tasks(activity["from"]["id"])
        card  = make_task_card(tasks)
        responses = {"type": "message",
                     "attachments": [{"contentType": "application/vnd.microsoft.card.adaptive",
                                      "content": card}]}
    elif "/status" in msg_text:
        project = msg_text.replace("/status","").strip()
        progress = get_project_status(project)
        responses = {"type": "message", "text": f"🏗️ {project}: {progress}%完了"}
    elif "/assign" in msg_text:
        # /assign @user タスク名 でタスク割り当て
        result = assign_task(msg_text)
        responses = {"type": "message", "text": f"✅ タスクを割り当てました: {result}"}
    else:
        responses = {"type": "message",
                     "text": "コマンド: /today (本日タスク) /status (進捗) /assign (タスク割り当て)"}
    
    return jsonify(responses)

if __name__ == "__main__": app.run(port=3978)
✅ 実行結果

コマンド応答Botが動作し始めました。Teamsで「/today」と入力するとアダプティブカード形式の今日のタスクリストが表示されます。

STEP 3:定時メッセージの自動投稿を設定する

毎朝の朝会報告・毎週の進捗サマリーなどを自動で投稿します。

💬 私はClaude Codeにこう頼みました:毎朝9時に朝会アジェンダ、毎週金曜17時に週次進捗サマリーをTeamsチャンネルに自動投稿するスケジューラーを作ってください。
🤖 Claude Codeの回答:定時メッセージの自動投稿スケジューラーを実装しました。
import schedule, time

def morning_standup():
    from datetime import date
    if date.today().weekday() >= 5: return
    send_teams_message(
        WEBHOOK_URL,
        title = f"☀️ 朝会のお時間です ({date.today().strftime('%m/%d %a')})",
        text  = "**今日のアジェンダ:**
1. 各自の本日タスク共有
2. 課題・ブロッカーの確認
3. その他連絡事項",
        color = "#6264A7",
        facts = {"時刻": "09:00-09:15", "参加方法": "このスレッドに返信"},
    )

def weekly_progress():
    if date.today().weekday() != 4: return  # 金曜のみ
    week_num = date.today().isocalendar()[1]
    
    # Redmineから週次進捗を取得
    completed = get_weekly_completed_issues()
    upcoming  = get_next_week_issues()
    
    facts = {f"完了({len(completed)}件)": ", ".join([i["subject"][:30] for i in completed[:3]]),
             f"来週予定({len(upcoming)}件)": ", ".join([i["subject"][:30] for i in upcoming[:3]])}
    send_teams_message(
        WEBHOOK_URL,
        title = f"📈 週次進捗サマリー 第{week_num}週",
        text  = "今週の完了タスクと来週の予定です。お疲れ様でした!",
        color = "#107C41",
        facts = facts,
    )

schedule.every().day.at("09:00").do(morning_standup)
schedule.every().friday.at("17:00").do(weekly_progress)
while True: schedule.run_pending(); time.sleep(60)
✅ 実行結果

毎朝9時の朝会アジェンダと毎週金曜17時の週次サマリーが自動投稿されるようになりました。手動投稿の手間がゼロになっています。

STEP 4:GitHub連携でPRマージをTeamsに自動通知する

GitHubのWebhookと連携して、PRマージやリリースをTeamsに自動通知します。

💬 私はClaude Codeにこう頼みました:GitHub Webhookを受信してPRがmergeされたときにTeamsに自動通知するコードを作ってください。
変更内容・担当者・影響範囲を含めてください。
🤖 Claude Codeの回答:GitHub Webhook連携のTeams自動通知を実装しました。
from flask import Flask, request

@app.route("/github/webhook", methods=["POST"])
def github_webhook():
    payload = request.json
    event   = request.headers.get("X-GitHub-Event")
    
    if event == "pull_request" and payload["action"] == "closed" and payload["pull_request"]["merged"]:
        pr = payload["pull_request"]
        send_teams_message(
            WEBHOOK_URL,
            title = f"🚀 PRがマージされました: {pr['title']}",
            text  = pr["body"][:200] if pr["body"] else "(説明なし)",
            color = "#107C41",
            facts = {
                "PR番号":  f"#{pr['number']}",
                "ブランチ": f"{pr['head']['ref']} → {pr['base']['ref']}",
                "担当者":  pr["user"]["login"],
                "変更":    f"+{pr['additions']} / -{pr['deletions']} lines",
                "URL":     pr["html_url"],
            }
        )
    
    elif event == "create" and payload.get("ref_type") == "tag":
        tag = payload["ref"]
        send_teams_message(
            WEBHOOK_URL,
            title = f"🏷️ 新しいリリースタグ: {tag}",
            text  = f"リポジトリ: {payload['repository']['name']}",
            color = "#5B21B6",
        )
    
    return {"status": "ok"}
✅ 実行結果

GitHubのPRマージが自動検知され、Teamsに変更内容・担当者・差分行数が通知されるようになりました。開発チームの連携が大幅に向上しました。

STEP 5:承認フローをTeamsで完結させる

経費申請や休暇届などの承認フローをTeams上で完結させます。

💬 私はClaude Codeにこう頼みました:経費申請が来たときにTeamsでマネージャーに承認依頼を送り、
承認/却下ボタンをクリックすると自動でフローが進むコードを作ってください。
🤖 Claude Codeの回答:Teams上の承認フロー自動化を実装しました。
def send_approval_request(manager_email, request_data):
    approval_card = {
        "type": "AdaptiveCard",
        "version": "1.4",
        "body": [
            {"type": "TextBlock", "size": "Medium", "weight": "Bolder", "text": "経費申請 承認依頼"},
            {"type": "FactSet", "facts": [
                {"title": "申請者", "value": request_data["申請者"]},
                {"title": "金額",   "value": f"¥{request_data['金額']:,.0f}"},
                {"title": "用途",   "value": request_data["用途"]},
                {"title": "日付",   "value": request_data["申請日"]},
            ]},
            {"type": "TextBlock", "text": "上記の経費申請を承認しますか?", "wrap": True},
        ],
        "actions": [
            {"type": "Action.Http", "title": "✅ 承認",
             "url": f"https://bot.company.com/approve/{request_data['id']}",
             "method": "POST", "style": "positive"},
            {"type": "Action.Http", "title": "❌ 却下",
             "url": f"https://bot.company.com/reject/{request_data['id']}",
             "method": "POST", "style": "destructive"},
        ]
    }
    
    requests.post(f"{GRAPH_URL}/users/{manager_email}/sendMail",
        headers={"Authorization": f"Bearer {TOKEN}", "Content-Type":"application/json"},
        json={"message": {"subject": "経費承認依頼",
            "body": {"contentType":"HTML","content":"

Teams上でご確認ください

"}, "attachments":[{"@odata.type":"#microsoft.graph.referenceAttachment"}]}}) @app.route("/approve/", methods=["POST"]) def approve(request_id): update_expense_status(request_id, "承認") notify_applicant(request_id, "承認されました") return {"status": "approved"} expense = {"id":"EXP001","申請者":"田中","金額":15000,"用途":"顧客先交通費","申請日":"2026/04/26"} send_approval_request("manager@co.jp", expense) print("承認依頼送信完了")
✅ 実行結果

TeamsのAdaptive Cardで承認/却下ボタン付きの経費申請フォームが送信されました。マネージャーがボタンをクリックするだけで申請処理が完結します。

どんな現場で使われているか:活用シナリオ

対象者 導入前の課題 Claude Code導入後
インフラ担当 サーバーアラートをメールで受け取るが見逃しが多発 Teamsの監視チャンネルに自動投稿してチーム全体で即対応
プロジェクトマネージャー タスクの期限や状況をTeamsで毎回手動で報告 Botが期限・ステータスを自動確認してTeamsに毎日投稿
受付・CS担当 よくある質問にTeamsで毎回手動で回答 FAQボットが自動回答して担当者の対応負荷を80%削減

実装で押さえるべき重要ポイント

  • 1
    Incoming Webhookから始めてBot Frameworkへ段階移行:まずシンプルなIncoming Webhookで通知Botを作り、双方向のやり取りが必要になったらBot Frameworkに移行する段階的なアプローチが失敗しにくいです。
  • 2
    Adaptive Cardsで視認性の高いメッセージを作成:プレーンテキストより、色・アイコン・ボタンが使えるAdaptive Cardsで投稿することで、メンバーが重要な情報を瞬時に把握できます。
  • 3
    メンション機能で担当者に確実に届ける:@ユーザーメンションをBotから送ることで担当者に確実に通知が届きます。UPN(ユーザープリンシパル名)をGraph APIで取得して実装します。

ビジネスインパクト

見逃しゼロ
重要アラートの検知率
80%削減
よくある問い合わせ対応時間
全チーム共有
KPI・状況の可視化範囲

この記事のまとめ

  • ✅ Incoming WebhookでTeamsチャンネルへの自動通知Botをすぐに実装できる
  • ✅ Adaptive Cardsでグラフ・ボタン付きのリッチな投稿ができる
  • ✅ Bot Frameworkで双方向のコマンド応答ボットを構築できる
  • ✅ アラート通知・FAQボット・定期レポートを一元的にTeamsで管理できる


よくある質問(FAQ)

A. Incoming Webhookはメッセージ送信専用のシンプルなエンドポイントです。テキスト・Adaptive Cards形式のリッチメッセージをチャンネルに投稿できます。設定はTeamsのチャンネル設定から5分で完了します。双方向のやり取りが必要な場合はBot Frameworkを使います。

A. Incoming Webhookはサーバー不要でURLを払い出すだけで使えます。Bot FrameworkはAzure Bot Serviceか自前サーバーへのデプロイが必要ですが、ngrokで一時的なテスト環境を作ることが可能です。まずはWebhookから始めることを推奨します。

A. はい、コマンドを受け取ったタイミングでopenpyxlやGraph APIでExcelを読み込み、結果をTeamsに返信するボットを実装できます。在庫確認・売上確認など社内データへのクエリインターフェースが実現できます。

🤖 この自動化を活用している業種・ケース

IT・インフラ部門では、監視システムのアラートをTeamsの専用チャンネルに自動投稿することで、インシデント対応のスピードが大幅に向上しています。
人事部門では、採用・評価・入退社のステータス変更をTeamsで自動通知して、関係者への情報共有漏れをゼロにしています。
プロジェクト管理では、タスク管理ツールと連携してマイルストーンの達成・遅延をTeamsで自動通知するBotを活用しています。
受発注・在庫管理では、在庫アラートや発注タイミングの通知をTeamsで自動化して、欠品リスクを大幅に削減しています。
TeamsBot導入により情報の伝達コストを大幅に削減し、重要な情報が確実に届く組織体制を実現できます。

関連記事


制作実績サンプル

このクオリティの資料が、あなたの業務でも作れます

Aurant Technologies が実際に制作したコンサルティング資料(全82枚)のサンプルです。Claude Code × AI自動化により、従来の1/5のコスト・時間で同等品質を実現します。

タイトルスライド

タイトル・ダーク背景
3カラム分析

3カラム比較・分析
AI活用フロー

AI活用フロー図解
Before/After

Before/After比較
RFPテンプレート

構造化コンテンツ
全10枚を
見る

御社のテーマでこのレベルの資料を作成できます
制作費・納期・自動化プランは無料相談でご確認いただけます

📊 サンプル全10枚を見る →

Claude Codeの導入を、プロに任せてみませんか?

Aurant TechnologiesはClaude Code導入支援・業務自動化の専門チームです。
初回相談は無料。御社の課題をヒアリングして最適な自動化プランをご提案します。

無料相談を申し込む →


AT
aurant technologies 編集

上場企業からスタートアップまで、数多くのデータ分析基盤構築・AI導入プロジェクトを主導。単なる技術提供にとどまらず、MA/CRM(Salesforce, Hubspot, kintone, LINE)導入によるマーケティング最適化やバックオフィス業務の自動化など、常に「事業数値(売上・利益)」に直結する改善実績多数。

この記事が役に立ったらシェア: