Claude Code x Microsoft Teams API でカスタムBotを作成する完全ガイド
Claude Code + Microsoft Teams Webhook/Bot Frameworkで通知Bot・コマンドBot・FAQボットを実装。Teams上で業務自動化を実現する実践ガイド。Teamsを社内自動化ハブに変える方法。
目次 クリックで開く
|
blog

▲ 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を設定し、外部からメッセージを送信できるようにします。
– デイリーKPIサマリー(毎朝9時)
– システム障害アラート(即時)
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を作ります。
アダプティブカードで見やすいUIにしてください。
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:定時メッセージの自動投稿を設定する
毎朝の朝会報告・毎週の進捗サマリーなどを自動で投稿します。
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に自動通知します。
変更内容・担当者・影響範囲を含めてください。
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上で完結させます。
承認/却下ボタンをクリックすると自動でフローが進むコードを作ってください。
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で承認/却下ボタン付きの経費申請フォームが送信されました。マネージャーがボタンをクリックするだけで申請処理が完結します。
どんな現場で使われているか:活用シナリオ
実装で押さえるべき重要ポイント
- 1
Incoming Webhookから始めてBot Frameworkへ段階移行:まずシンプルなIncoming Webhookで通知Botを作り、双方向のやり取りが必要になったらBot Frameworkに移行する段階的なアプローチが失敗しにくいです。
- 2
Adaptive Cardsで視認性の高いメッセージを作成:プレーンテキストより、色・アイコン・ボタンが使えるAdaptive Cardsで投稿することで、メンバーが重要な情報を瞬時に把握できます。
- 3
メンション機能で担当者に確実に届ける:@ユーザーメンションをBotから送ることで担当者に確実に通知が届きます。UPN(ユーザープリンシパル名)をGraph APIで取得して実装します。
ビジネスインパクト
この記事のまとめ
- ✅ Incoming WebhookでTeamsチャンネルへの自動通知Botをすぐに実装できる
- ✅ Adaptive Cardsでグラフ・ボタン付きのリッチな投稿ができる
- ✅ Bot Frameworkで双方向のコマンド応答ボットを構築できる
- ✅ アラート通知・FAQボット・定期レポートを一元的にTeamsで管理できる
よくある質問(FAQ)
🤖 この自動化を活用している業種・ケース
IT・インフラ部門では、監視システムのアラートをTeamsの専用チャンネルに自動投稿することで、インシデント対応のスピードが大幅に向上しています。
人事部門では、採用・評価・入退社のステータス変更をTeamsで自動通知して、関係者への情報共有漏れをゼロにしています。
プロジェクト管理では、タスク管理ツールと連携してマイルストーンの達成・遅延をTeamsで自動通知するBotを活用しています。
受発注・在庫管理では、在庫アラートや発注タイミングの通知をTeamsで自動化して、欠品リスクを大幅に削減しています。
TeamsBot導入により情報の伝達コストを大幅に削減し、重要な情報が確実に届く組織体制を実現できます。
関連記事
Claude Codeの導入を、プロに任せてみませんか?
Aurant TechnologiesはClaude Code導入支援・業務自動化の専門チームです。
初回相談は無料。御社の課題をヒアリングして最適な自動化プランをご提案します。