This project implements a pure Model Context Protocol (MCP) server that bridges Microsoft Teams and MCP-compatible clients (LLMs, agentic frameworks, and a rich CLI MCP client). All features are exposed via MCP tools, resources, and events—no REST API endpoints.
- Microsoft Teams chat/message integration via MCP
- PostgreSQL-based Information Retrieval (IR) server for advanced search capabilities
- Persistent storage in DuckDB for chat/message history
- Hybrid semantic and lexical search (BM25 + vector, FlockMTL-style)
- CLI for login/token management and a rich MCP client for local testing
- Polling-based event emission for new messages
- Live event streaming and search for LLMs and CLI
- Single-agent (bot) account, not multi-user
+-------------------+ +-------------------+ +-------------------+
| CLI MCP Client |<---->| MCP Server |<---->| Microsoft Teams |
| (rich terminal UI)| | (Python, FastMCP) | | (Graph API) |
+-------------------+ +-------------------+ +-------------------+
| |
| v
| +-------------------+ +-------------------+
| | DuckDB DB | | IR Server |
| +-------------------+ | (PostgreSQL, API) |
+-------------------+
|
v
+-------------------+
| PostgreSQL DB |
| (with pgvector) |
+-------------------+
- All chat/message/search logic is via MCP tools/resources/events
- Teams MCP server uses DuckDB for message storage
- IR server provides advanced search capabilities with PostgreSQL and pgvector
- IR server exposes an HTTP API for MCP server communication
- Python 3.9+
- pip
- Docker and Docker Compose (for containerized deployment)
git clone <your-repo-url>
cd mcp-teams
pip install -r requirements.txt
Copy the template and fill in your Azure AD/Teams credentials:
cp .env.template .env
# Edit .env and fill in your Azure AD and other settings
See the table below for variable descriptions.
git clone <your-repo-url>
cd mcp-teams
Copy the template and fill in your credentials:
cp .env.template .env
# Edit .env and fill in your settings
docker-compose up -d
Variable | Description | Example / Default |
---|---|---|
AZURE_CLIENT_ID | Azure AD Application (client) ID | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
AZURE_CLIENT_SECRET | Azure AD Application secret | your-secret |
AZURE_TENANT_ID | Azure AD Tenant ID | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
AZURE_APP_OBJECT_ID | Azure AD Application object ID | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
DUCKDB_PATH | Path to DuckDB database file | db/teams_mcp.duckdb |
TOKEN_PATH | Path to store persistent token cache | db/token_cache.json |
POLL_INTERVAL | Polling interval (seconds) for new messages | 10 |
DEMO_MODE | Set to true for mock/demo mode (no real Teams API calls) |
false |
OPENAI_API_KEY | OpenAI API key for embedding generation | sk-... |
POSTGRES_USER | PostgreSQL username | postgres |
POSTGRES_PASSWORD | PostgreSQL password | postgres |
POSTGRES_DB | PostgreSQL database name | mcp_ir |
IR_SERVER_HOST | IR server hostname | ir_server |
IR_SERVER_PORT | IR server port | 8090 |
python mcp_server/server.py
docker-compose up -d
To check logs:
docker-compose logs -f teams_mcp # Teams MCP server logs
docker-compose logs -f ir_server # IR server logs
Set DEMO_MODE=true
in your .env
and run as above.
python cli/login.py login
python cli/login.py status
python cli/login.py logout
All commands below use the MCP stdio protocol to talk to the server.
python cli/mcp_client.py list_chats
python cli/mcp_client.py get_messages <chat_id>
python cli/mcp_client.py send_message <chat_id> "Hello from CLI!"
python cli/mcp_client.py create_chat <user_id_or_email>
python cli/mcp_client.py search_messages "project update" --mode hybrid --top_k 5
python cli/mcp_client.py stream
The IR server provides advanced search capabilities with PostgreSQL and pgvector. It exposes an HTTP API for MCP server communication.
GET http://localhost:8090/
GET http://localhost:8090/api/tools
POST http://localhost:8090/api/tools/search
Body:
{
"query": "your search query",
"search_type": "hybrid",
"limit": 10
}
POST http://localhost:8090/api/tools/index_content
Body:
{
"content": "Text content to index",
"source_type": "teams",
"metadata": {
"author": "User Name",
"created": "2025-04-01T12:00:00Z"
}
}
For more detailed IR server documentation, see ir/README.md.
- Hybrid search: Combines BM25 and vector search with LLM reranking
- Live streaming: Subscribe to
messages/incoming
for real-time updates
- Add new MCP tools/resources in
mcp_server/server.py
- Extend Teams integration in
teams/graph.py
- Modify IR capabilities in the IR server
- Add analytics, summarization, or RAG features using DuckDB, PostgreSQL, and LLMs
- Use the CLI as a test harness for all MCP features
- Login fails: Check your Azure AD credentials and
.env
values - No messages appear: Ensure polling is running and your bot account is in the Teams chat
- DuckDB errors: Check file permissions and paths in
.env
- IR server not responding: Check Docker logs and ensure the container is running
- Demo mode: Set
DEMO_MODE=true
for local testing without real Teams
- Beyond Quacking: Deep Integration of Language Models and RAG into DuckDB (FlockMTL)
- Model Context Protocol documentation
- Microsoft Graph API docs
- PostgreSQL with pgvector extension
For full product details, see specs/app-spec.md
.