Microsoft Teams Bot erstellen: Automatisierung ohne Code mit n8n und Make.com
Schritt-für-Schritt Anleitung zum Erstellen eines Teams Bots ohne Code.
Microsoft Teams ist aus dem Arbeitsalltag nicht mehr wegzudenken. Aber wussten Sie, dass Sie eigene Bots erstellen können – ohne zu programmieren? In diesem Guide zeigen wir, wie Sie Teams-Bots für Benachrichtigungen, Interaktionen und Automatisierung bauen.
Warum einen Teams Bot?
Typische Use Cases:| Use Case | Beschreibung |
|---|---|
| Benachrichtigungen | Server-Alerts, Bestellungen, Tickets |
| Interaktive Aktionen | Genehmigungen, Umfragen, Feedback |
| Informationsabruf | Status abfragen, Daten suchen |
| Prozess-Trigger | Workflows aus Teams starten |
- Direkt im Arbeitskontext (ähnlich wie bei einem Slack Bot)
- Keine zusätzliche App nötig
- Hohe Akzeptanz bei Nutzern
Teams Messaging-Optionen
1. Incoming Webhooks (Einfachste Variante)
Nur für Benachrichtigungen – keine Interaktion.
Einrichten:// Node: HTTP Request
{
"method": "POST",
"url": "https://outlook.office.com/webhook/abc123...",
"headers": { "Content-Type": "application/json" },
"body": {
"@type": "MessageCard",
"@context": "http://schema.org/extensions",
"themeColor": "0076D7",
"summary": "Neue Bestellung",
"sections": [{
"activityTitle": "Bestellung #12345",
"facts": [
{ "name": "Kunde", "value": "Max Mustermann" },
{ "name": "Betrag", "value": "149,00 €" }
],
"markdown": true
}]
}
}
2. Outgoing Webhooks
Teams sendet Nachrichten an Ihren Endpoint.
Einrichten:// Node: Webhook
// Teams sendet bei @Mention
{
"type": "message",
"text": "<at>BotName</at> Wie ist der Serverstatus?",
"from": {
"name": "Max Mustermann"
},
"channelId": "19:abc123..."
}
3. Bot Framework (Vollwertig)
Für komplexe Interaktionen – erfordert Azure Bot Service. Falls Sie n8n als Automatisierungsplattform nutzen möchten, hilft Ihnen unser n8n Tutorial für Anfänger beim Einstieg.
Workflow 1: Server-Monitoring Alerts
Der Workflow
Uptime Monitor (Server Down)
↓
Teams Webhook:
"⚠️ Server ist nicht erreichbar!"
↓
Mit Action Buttons:
[Acknowledge] [Escalate]
Adaptive Cards für reichhaltige Nachrichten
// Node: HTTP Request
{
"method": "POST",
"url": "{{ $env.TEAMS_WEBHOOK_URL }}",
"body": {
"type": "message",
"attachments": [
{
"contentType": "application/vnd.microsoft.card.adaptive",
"content": {
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"type": "AdaptiveCard",
"version": "1.4",
"body": [
{
"type": "TextBlock",
"size": "Large",
"weight": "Bolder",
"text": "⚠️ Server Alert",
"color": "Attention"
},
{
"type": "FactSet",
"facts": [
{ "title": "Server", "value": "{{ $json.server }}" },
{ "title": "Status", "value": "{{ $json.status }}" },
{ "title": "Zeit", "value": "{{ $now }}" }
]
}
],
"actions": [
{
"type": "Action.OpenUrl",
"title": "Dashboard öffnen",
"url": "https://monitoring.ihre-domain.de"
}
]
}
}
]
}
}
Workflow 2: Genehmigungs-Workflow
Der Workflow
Neue Urlaubsanfrage
↓
Teams an Vorgesetzten:
"Max möchte Urlaub vom 15.-20.01."
[Genehmigen] [Ablehnen]
↓
Vorgesetzter klickt
↓
n8n Webhook empfängt Antwort
↓
HR-System aktualisieren
Mitarbeiter benachrichtigen
Adaptive Card mit Actions
{
"type": "AdaptiveCard",
"version": "1.4",
"body": [
{
"type": "TextBlock",
"size": "Large",
"weight": "Bolder",
"text": "🏖️ Urlaubsanfrage"
},
{
"type": "FactSet",
"facts": [
{ "title": "Mitarbeiter", "value": "{{ $json.employeeName }}" },
{ "title": "Von", "value": "{{ $json.startDate }}" },
{ "title": "Bis", "value": "{{ $json.endDate }}" },
{ "title": "Tage", "value": "{{ $json.days }}" }
]
}
],
"actions": [
{
"type": "Action.Http",
"title": "✅ Genehmigen",
"method": "POST",
"url": "https://n8n.ihre-domain.de/webhook/vacation-approve",
"body": "{ \"requestId\": \"{{ $json.requestId }}\", \"action\": \"approve\" }"
},
{
"type": "Action.Http",
"title": "❌ Ablehnen",
"method": "POST",
"url": "https://n8n.ihre-domain.de/webhook/vacation-approve",
"body": "{ \"requestId\": \"{{ $json.requestId }}\", \"action\": \"reject\" }"
}
]
}
Webhook für Antwort
// Node: Webhook - Empfängt Klick
const { requestId, action } = $json;
if (action === 'approve') {
await updateHRSystem(requestId, 'approved');
await notifyEmployee(requestId, 'Ihr Urlaub wurde genehmigt!');
} else {
await updateHRSystem(requestId, 'rejected');
await notifyEmployee(requestId, 'Ihr Urlaub wurde leider abgelehnt.');
}
// Karte aktualisieren
return {
statusCode: 200,
type: "application/json",
body: {
// Aktualisierte Karte
}
};
Workflow 3: Tägliche Zusammenfassung
Der Workflow
Schedule (täglich 9:00)
↓
Daten sammeln:
- Offene Tickets
- Heutige Meetings
- Anstehende Deadlines
↓
Teams: Zusammenfassung senden
Implementation
// Daten sammeln
const tickets = await getOpenTickets();
const meetings = await getTodaysMeetings();
const deadlines = await getUpcomingDeadlines();
// Adaptive Card erstellen
const card = {
"type": "AdaptiveCard",
"version": "1.4",
"body": [
{
"type": "TextBlock",
"size": "Large",
"weight": "Bolder",
"text": "☀️ Guten Morgen! Hier ist Ihr Tages-Briefing"
},
{
"type": "TextBlock",
"text": 📋 <strong>${tickets.length} offene Tickets</strong>,
"wrap": true
},
{
"type": "TextBlock",
"text": 📅 <strong>${meetings.length} Meetings heute</strong>,
"wrap": true
},
{
"type": "TextBlock",
"text": ⏰ <strong>${deadlines.length} anstehende Deadlines</strong>,
"wrap": true
}
],
"actions": [
{
"type": "Action.OpenUrl",
"title": "Dashboard öffnen",
"url": "https://dashboard.ihre-domain.de"
}
]
};
Workflow 4: Interaktiver FAQ-Bot
Mit Power Virtual Agents (Low-Code)
Mit n8n (Custom)
Teams Outgoing Webhook
(User fragt: "Wie beantrage ich Urlaub?")
↓
Text analysieren (Keywords)
↓
Switch:
├─ "urlaub" → Urlaubs-Anleitung
├─ "passwort" → Passwort-Reset-Info
├─ "vpn" → VPN-Anleitung
└─ sonst → "Ich habe das nicht verstanden"
↓
Antwort an Teams senden
Implementation
// Node: Code - FAQ Matching
const message = $json.text.toLowerCase();
const faqs = {
'urlaub': 'Urlaub beantragen Sie über das HR-Portal unter hr.firma.de/urlaub',
'passwort': 'Passwort zurücksetzen: IT-Portal → Self-Service → Passwort',
'vpn': 'VPN-Zugang: Laden Sie den Client von vpn.firma.de herunter',
'krankmeldung': 'Krankmeldung: Bitte an hr@firma.de mit AU-Bescheinigung'
};
let response = 'Entschuldigung, dazu habe ich keine Information. Wenden Sie sich an IT-Support.';
for (const [keyword, answer] of Object.entries(faqs)) {
if (message.includes(keyword)) {
response = answer;
break;
}
}
return { response };
Make.com: Teams Module
Verfügbare Module
Beispiel-Szenario
Microsoft Teams (Watch Messages)
↓
Filter: Enthält "hilfe"
↓
OpenAI: Antwort generieren
↓
Microsoft Teams: Reply
Graph API für erweiterte Funktionen
Direktnachricht senden
// Node: HTTP Request
{
"method": "POST",
"url": "https://graph.microsoft.com/v1.0/users/{{ $json.userId }}/chats/{{ $json.chatId }}/messages",
"headers": {
"Authorization": "Bearer {{ $json.accessToken }}",
"Content-Type": "application/json"
},
"body": {
"body": {
"content": "Hallo! Hier ist eine wichtige Nachricht."
}
}
}
Chat erstellen
// 1:1 Chat mit User erstellen
{
"method": "POST",
"url": "https://graph.microsoft.com/v1.0/chats",
"body": {
"chatType": "oneOnOne",
"members": [
{
"@odata.type": "#microsoft.graph.aadUserConversationMember",
"roles": ["owner"],
"user@odata.bind": "https://graph.microsoft.com/v1.0/users/user1@firma.de"
},
{
"@odata.type": "#microsoft.graph.aadUserConversationMember",
"roles": ["owner"],
"user@odata.bind": "https://graph.microsoft.com/v1.0/users/user2@firma.de"
}
]
}
}
Nachrichtenformate
Einfache Nachricht
{
"text": "Hallo, das ist eine einfache Nachricht!"
}
Mit Markdown
{
"text": "<strong>Wichtig:</strong> Das ist _formatierter_ Text mit Link"
}
MessageCard (Legacy)
{
"@type": "MessageCard",
"@context": "http://schema.org/extensions",
"summary": "Zusammenfassung",
"themeColor": "0076D7",
"title": "Titel der Nachricht",
"sections": [
{
"facts": [
{ "name": "Fakt 1", "value": "Wert 1" }
]
}
],
"potentialAction": [
{
"@type": "OpenUri",
"name": "Mehr erfahren",
"targets": [
{ "os": "default", "uri": "https://example.com" }
]
}
]
}
Adaptive Card (Modern)
Adaptive Cards bieten mehr Flexibilität:
- Eingabefelder
- Dropdowns
- Datum-Picker
- Actions mit HTTP Callbacks
Best Practices
1. Nicht zu viele Nachrichten
// Batching: Mehrere Events sammeln
const events = await collectEvents(5 <em> 60 </em> 1000); // 5 Min
if (events.length > 0) {
await sendDigest(events);
}
2. Klare Actionable Messages
// Schlecht
{ "text": "Es ist etwas passiert." }
// Gut
{
"title": "🔴 Server webserver-01 ist ausgefallen",
"text": "Seit 10:30 Uhr nicht erreichbar",
"actions": [
{ "title": "Dashboard", "url": "..." },
{ "title": "Logs", "url": "..." }
]
}
3. Fehlerbehandlung
try {
await sendTeamsMessage(message);
} catch (error) {
if (error.status === 429) {
// Rate Limit
await wait(60000);
await sendTeamsMessage(message);
} else {
// Fallback: E-Mail senden
await sendEmail(message);
}
}
Kosten
| Lösung | Kosten |
|---|---|
| Incoming Webhooks | Kostenlos |
| Power Virtual Agents | Ab 170€/Monat |
| Azure Bot Service | Pay-per-use |
| n8n/Make.com | Ab 9€/Monat |
Fazit
Microsoft Teams Bots sind ein mächtiges Werkzeug:
- Benachrichtigungen direkt im Arbeitskontext
- Interaktive Workflows (Genehmigungen, etc.)
- FAQ-Bots für Self-Service
Weiterführende Artikel
- Slack Bot erstellen: Die Alternative für Nicht-Microsoft-Umgebungen
- Outlook Automatisierung: E-Mail-Workflows mit n8n und Make.com
- Make.com Tutorial: Vom ersten Workflow zum Profi
Nächste Schritte
Wir unterstützen Sie bei der Teams-Automatisierung – von der Einrichtung bis zum produktiven Bot.