agentic-msteams-mcp
by hdyrawan
README.md
# agentic-msteams-mcp
A self-hosted Microsoft Teams MCP server that serves as an agnostic human-in-the-loop gateway for AI agents.
## Overview
This project implements a dual-surface architecture to allow AI agents to interact with humans via Microsoft Teams without requiring the agent to have direct Graph API access or complex bot logic.
### v0.4.0 Feature: Human-in-the-Loop & Approvals
v0.4.0 provides a comprehensive suite of tools for agents to interact with humans via Microsoft Teams, including notifications, asynchronous questions, and formal approval workflows.
- **`msteams_send_notification`**: Sends one-way alerts.
- **`msteams_ask_user`**: Poses structured questions; returns `request_id`.
- **`msteams_get_user_reply`**: Tracks responses to asks.
- **`msteams_request_approval`**: Requests a formal binary decision (Approve/Reject).
- **`msteams_get_approval`**: Checks the state of an approval request.
## Core Architecture
### 1. The MCP Surface (Stdio)
The primary interface for AI agents. It exposes a strictly limited toolset of six tools:
- `msteams_health_check`: Verifies server connectivity.
- `msteams_send_notification`: Sends one-way alerts to allowlisted users/channels.
- `msteams_ask_user`: Requests information from an allowlisted user.
- `msteams_get_user_reply`: Checks the state of a requested reply.
- `msteams_request_approval`: Initiates a formal approval request.
- `msteams_get_approval`: Retrieves the decision for an approval request.
### 2. The Teams Surface (HTTP)
A lightweight FastAPI app that acts as the webhook receiver for Microsoft Teams. It is designed to be hosted behind a proxy/gateway.
## Security Model (Secure-by-Design)
### Closed-World Toolset
The server explicitly denies any arbitrary Graph API operations. All interactions are gated through specific, high-level tools.
### Fail-Closed Allowlist
Notifications and Asks are only delivered to IDs defined in the `MSTEAMS_ALLOWED_USER_IDS` or `MSTEAMS_ALLOWED_CHANNEL_IDS` environment variables. If an ID is not listed, the request is rejected immediately.
### Audit Logging
Every attempt to notify or ask a user is logged to a local audit file (`MSTEAMS_AUDIT_LOG_PATH`).
- **Privacy**: Log entries contain metadata and fingerprints but NEVER include the actual message or question body.
- **Stability**: Uses SHA-256 deterministic fingerprinting for audit evidence.
### Dry-Run Mode
By default, `MSTEAMS_NOTIFICATION_DRY_RUN=True`. In this mode, the server validates all requests and logs them to audit but does not actually call the Microsoft Graph API. NOTE: Real Teams/Graph delivery is currently not implemented; dry-run is the intended safe default for current versions.
## Installation & Configuration
### Environment Variables
| Variable | Default | Description |
| --- | --- | --- |
| `SERVER_HOST` | `127.0.0.1` | Bind address for the HTTP surface. |
| `SERVER_PORT` | `8000` | Port for the HTTP surface. |
| `MSTEAMS_ALLOWED_USER_IDS` | `""` | Comma-separated list of allowlisted User IDs (Required). |
| `MSTEAMS_ALLOWED_CHANNEL_IDS` | `""` | Comma-separated list of allowlisted Channel IDs. |
| `MSTEAMS_NOTIFICATION_DRY_RUN` | `True` | If true, no real Graph API calls are made. |
| `MSTEAMS_AUDIT_LOG_PATH` | `data/audit.log` | Path to the append-only audit log file. |
### Running the Server
The server provides two distinct modes:
**1. MCP Stdio Mode (for AI Agents)**
```bash
python -m agentic_msteams_mcp.main --mcp
```
**2. HTTP Surface Mode (for Teams Webhooks)**
```bash
python -m agentic_msteams_mcp.main --http
```
## Deployment
The server is provided as a Docker image for consistent runtime environments.
```bash
docker build -t agentic-msteams-mcp .
docker run -p 8000:8000 -e MSTEAMS_ALLOWED_USER_IDS="user1,user2" agentic-msteams-mcp --http
```
This server cannot be deployed
Maintenance
ActivityStale
ResponsivenessNo issues