Browse channels → Cmd K jump anywhere → DM — all keyboard-first. Try it live, no account needed.
Teamsly is an open-source, third-party web client for Microsoft Teams. It reads and writes your real Teams data via the official Microsoft Graph API — no scraping, no reverse engineering. Your messages stay in Microsoft's infrastructure. Teamsly is just a better interface.
| Clean message feed | Threaded replies, reactions, file attachments, inline images |
| Full DM & channel support | All chats and channels from your Microsoft 365 account |
| Fast keyboard navigation | Cmd/Ctrl+K jump-to, search, keyboard-first message input |
| AI catch-up | Summaries, TL;DR, and extracted action items for long threads (opt-in, uses OpenAI) |
| GIF search | Tenor-powered GIF picker in the message composer |
| File preview | Open and preview shared files without leaving the app |
| Smart notifications | Browser notifications with mentions-only and keyword filtering |
| Light & dark mode | Follows OS preference or override in Settings |
| MCP server | Let any AI agent read and send Teams messages on your behalf |
| Open source | AGPL-3.0 — inspect the code, self-host, or contribute |
Go to teamsly.app and sign in with your Microsoft 365 account. No credit card required.
# Docker
git clone https://github.com/mayurrawte/teamsly.git && cd teamsly
cp .env.example .env # fill in the Azure AD values (5 minutes, see SELF_HOSTING.md §1)
docker compose up -d # http://localhost:3000See SELF_HOSTING.md for the full guide — Azure AD app registration, environment variables, and deployment to Vercel, Fly, Render, Docker, or any Node.js host.
Company account says "Need admin approval"? Most tenants block users from consenting to third-party apps. Send your IT admin the link on the sign-in page (or self-host under your own Azure app, which admins can approve once for everyone).
Quick start for local development:
git clone https://github.com/mayurrawte/teamsly.git
cd teamsly
cp .env.example .env.local # fill in Azure AD credentials
npm install
npm run dev # http://localhost:3000Teamsly ships a Model Context Protocol server that lets any MCP-compatible AI client (Claude Desktop, Cursor, etc.) read and send messages in your Teams chats and channels.
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"teamsly": {
"command": "npx",
"args": ["-y", "@teamsly/mcp"]
}
}
}On first run, the server prints a URL and short code to the Claude Desktop logs. Open the URL, enter the code, sign in with Microsoft. Tokens are saved to ~/.config/teamsly-mcp/tokens.json and auto-refresh — no repeat setup needed.
Cursor / Windsurf: same config under Settings → MCP Servers.
Claude Code CLI:
claude mcp add teamsly -- npx -y @teamsly/mcp| Tool | Description |
|---|---|
list_chats |
List your DM conversations |
get_chat_messages |
Read messages from a DM |
send_chat_message |
Send a DM |
list_teams |
List your joined teams |
list_channels |
List channels in a team |
get_channel_messages |
Read messages from a channel |
send_channel_message |
Post to a channel |
find_people |
Search your organization's directory for a person |
send_dm |
Send a direct message to someone by name or user ID |
To point the server at your own Azure app instead of the public Teamsly one, set TEAMSLY_CLIENT_ID and TEAMSLY_TENANT_ID (they default to Teamsly's app on the common tenant). Tokens are cached in ~/.config/teamsly-mcp/; override the location with TEAMSLY_TOKEN_DIR.
src/
├── app/
│ ├── api/ # Next.js API routes — thin proxy to Graph API
│ │ ├── auth/ # Auth.js (NextAuth v5) handler
│ │ ├── teams/ # GET /api/teams
│ │ ├── messages/ # GET+POST channel messages
│ │ ├── chats/ # GET /api/chats + messages
│ │ ├── mcp/ # MCP-compatible HTTP endpoints
│ │ └── ... # presence, files, GIFs, activity scan
│ ├── workspace/ # Authenticated app shell
│ │ ├── t/[teamId]/[channelId]/ # Channel view
│ │ ├── dm/[chatId]/ # DM view
│ │ ├── activity/ # Notification feed
│ │ ├── files/ # File browser
│ │ ├── meetings/ # Calendar
│ │ └── later/ # Saved messages
│ ├── login/ # Sign-in page
│ └── page.tsx # Marketing landing page
├── components/
│ ├── layout/ # AppShell, Sidebar, LeftRail, SignInPage
│ ├── messages/ # ChannelView, ChatView, MessageFeed, MessageItem, MessageInput
│ └── modals/ # Search, JumpTo, Preferences, GIF picker
├── lib/
│ ├── auth/ # Auth.js config + token refresh
│ └── graph/ # Microsoft Graph API client
├── store/ # Zustand state (workspace, drafts, bookmarks, toasts)
└── types/ # TypeScript types (MSTeam, MSMessage, etc.)
Data flow: Browser → Next.js API route → Microsoft Graph API → Microsoft's servers
Nothing is stored in Teamsly. The API routes act as a thin authenticated proxy.
- Next.js 16 (App Router) + TypeScript
- Tailwind CSS v4 + Radix UI primitives
- Auth.js v5 with Microsoft Entra ID provider (OAuth 2.0)
- Microsoft Graph API via
@microsoft/microsoft-graph-client - Zustand for client-side state
- OpenAI SDK for optional AI catch-up (summaries + action items)
Built entirely on the Microsoft Graph API (official, public). This project:
- Does not reverse-engineer the Teams client
- Does not use private or undocumented APIs
- Does not store user data outside Microsoft's infrastructure
- Is not affiliated with or endorsed by Microsoft Corporation
Users authenticate directly with Microsoft via OAuth 2.0. Teamsly never sees your password.
PRs welcome. Open areas:
- Graph change notifications (replace 5-second polling with webhooks)
- Richer markdown editor in the composer
- Emoji picker improvements
Teamsly is free — no paywall, no feature gates. If it saves you from the official Teams client daily, consider sponsoring to cover hosting and AI-summary inference costs.
AGPL-3.0 — free to use, self-host, and modify. If you distribute a modified version as a hosted service, you must open-source your changes under the same license.
Built by @mayurrawte · Not affiliated with Microsoft