npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

msteams-mcp

v0.22.3

Published

MCP server for Microsoft Teams - search messages, send replies, manage favourites

Downloads

1,019

Readme

Teams MCP Server

CI License: MIT Node.js

An MCP (Model Context Protocol) server that enables AI assistants to interact with Microsoft Teams. Search messages, send replies, manage favourites, and more.

How It Works

This server calls Microsoft's Teams APIs directly (Substrate, chatsvc, CSA) - the same APIs the Teams web app uses. No Azure AD app registration or admin consent required.

Authentication flow:

  1. AI runs teams_login to open a browser for you to log in
  2. OAuth tokens are extracted and cached
  3. All operations use cached tokens directly (no browser needed)
  4. Automatic token refresh (~1 hour)

Security: Uses the same authentication as the Teams web client - your access is limited to what your account can already do.

Installation

Prerequisites

  • Node.js 18+
  • A Microsoft account with Teams access
  • Google Chrome, Microsoft Edge, or Chromium browser installed

Configure Your MCP Client

Add to your MCP client configuration (e.g., Claude Desktop, Windsurf, Cursor):

{
  "mcpServers": {
    "teams": {
      "command": "npx",
      "args": ["-y", "msteams-mcp@latest"]
    }
  }
}

That's it. npx will automatically download and run the latest version.

From Source (alternative)

If you prefer to run from a local clone:

git clone https://github.com/m0nkmaster/msteams-mcp.git
cd msteams-mcp
npm install && npm run build

Then configure your MCP client:

{
  "mcpServers": {
    "teams": {
      "command": "node",
      "args": ["/path/to/msteams-mcp/dist/index.js"]
    }
  }
}

The server uses your system's Chrome (macOS/Linux) or Edge (Windows) for authentication.

Available Tools

Search & Discovery

| Tool | Description | |------|-------------| | teams_search | Search Teams messages with operators (from:, sent:, in:, hasattachment:, etc.) | | teams_search_email | Search emails in your mailbox (same auth as Teams — no extra login) | | teams_get_message | Get a single message by ID with full content (any age) | | teams_get_thread | Get messages from a conversation/thread | | teams_find_channel | Find channels by name (your teams + org-wide discovery) | | teams_get_activity | Get activity feed (mentions, reactions, replies, notifications) |

Messaging

| Tool | Description | |------|-------------| | teams_send_message | Send a message (default: self-chat/notes). Use replyToMessageId for thread replies | | teams_edit_message | Edit one of your own messages | | teams_delete_message | Delete one of your own messages (soft delete) |

People & Contacts

| Tool | Description | |------|-------------| | teams_get_me | Get current user profile (email, name, ID) | | teams_search_people | Search for people by name or email | | teams_get_frequent_contacts | Get frequently contacted people (useful for name resolution) | | teams_get_chat | Get conversation ID for 1:1 chat with a person | | teams_create_group_chat | Create a new group chat with multiple people (2+ others) |

Organisation

| Tool | Description | |------|-------------| | teams_get_favorites | Get pinned/favourite conversations | | teams_add_favorite | Pin a conversation | | teams_remove_favorite | Unpin a conversation | | teams_save_message | Bookmark a message | | teams_unsave_message | Remove bookmark from a message | | teams_get_saved_messages | Get list of saved/bookmarked messages with source references | | teams_get_followed_threads | Get list of followed threads with source references | | teams_get_unread | Get unread counts (aggregate or per-conversation) | | teams_mark_read | Mark a conversation as read up to a message |

Reactions

| Tool | Description | |------|-------------| | teams_search_emoji | Search for emojis by name (standard + custom org emojis) | | teams_add_reaction | Add an emoji reaction to a message | | teams_remove_reaction | Remove an emoji reaction from a message |

Quick reactions: like, heart, laugh, surprised, sad, angry can be used directly without searching.

Calendar & Meetings

| Tool | Description | |------|-------------| | teams_get_meetings | Get meetings from calendar (defaults to next 7 days) | | teams_get_transcript | Get meeting transcript (requires threadId from teams_get_meetings) |

teams_get_meetings returns: subject, times, organiser, join URL, threadId for meeting chat. Use threadId with teams_get_thread to read meeting chat, or with teams_get_transcript to get the full transcript with speakers and timestamps.

Files

| Tool | Description | |------|-------------| | teams_get_shared_files | Get files and links shared in a conversation (supports pagination) |

Returns both files (name, extension, URL, size) and links (URL, title), along with who shared each item. Works for channels, group chats, 1:1 chats, and meeting chats.

Session

| Tool | Description | |------|-------------| | teams_login | Trigger manual login (opens browser) | | teams_status | Check authentication and session state |

Search Operators

Both teams_search (Teams messages) and teams_search_email (emails) support native operators:

from:[email protected]     # Messages/emails from person
sent:2026-01-20            # From specific date
sent:>=2026-01-15          # Since date
in:project-alpha           # Messages in channel (Teams only)
subject:"budget"           # By subject (email)
"Rob Smith"                # Find @mentions (name in quotes)
hasattachment:true         # With files
is:unread                  # Unread emails (email only)
NOT from:[email protected]      # Exclude results

Combine operators: from:[email protected] sent:>=2026-01-18 hasattachment:true

Note: @me, from:me, to:me do NOT work. Use teams_get_me first to get your email/displayName. sent:today works, but sent:lastweek and sent:thisweek do NOT - use explicit dates or omit (results are sorted by recency).

MCP Resources

The server also exposes passive resources for context discovery:

| Resource URI | Description | |--------------|-------------| | teams://me/profile | Current user's profile | | teams://me/favorites | Pinned conversations | | teams://status | Authentication status |

CLI Tools (Development)

For local development, CLI tools are available for testing and debugging:

# Check authentication status
npm run cli -- status

# Search messages
npm run cli -- search "meeting notes"
npm run cli -- search "project" --from 0 --size 50

# Search emails
npm run cli -- teams_search_email --query "from:[email protected]"

# Send messages (default: your own notes/self-chat)
npm run cli -- send "Hello from Teams MCP!"
npm run cli -- send "Message" --to "conversation-id"

# Force login
npm run cli -- login --force

# Output as JSON
npm run cli -- search "query" --json

MCP Test Harness

Test the server through the actual MCP protocol:

# List available tools
npm run cli

# Call any tool
npm run cli -- search "your query"
npm run cli -- status
npm run cli -- people "john smith"
npm run cli -- favorites
npm run cli -- activity              # Get activity feed
npm run cli -- unread                # Check unread counts
npm run cli -- teams_search_emoji --query "heart"  # Search emojis

Limitations

  • Login required - Run teams_login to authenticate (opens browser)
  • Token expiry - Tokens expire after ~1 hour; headless refresh is attempted or run teams_login again when needed
  • Undocumented APIs - Uses Microsoft's internal APIs which may change without notice
  • Search limitations - Full-text search only; thread replies not matching search terms won't appear (use teams_get_thread for full context)
  • Own messages only - Edit/delete only works on your own messages

Session Files

Session files are stored in a user config directory (encrypted):

  • macOS/Linux: ~/.teams-mcp-server/
  • Windows: %APPDATA%\teams-mcp-server\

Contents: session-state.json, token-cache.json, browser-profile/

If your session expires, call teams_login or delete the config directory.

Development

For local development:

git clone https://github.com/m0nkmaster/msteams-mcp.git
cd msteams-mcp
npm install
npm run build

Development commands:

npm run dev          # Run MCP server in dev mode
npm run build        # Compile TypeScript
npm run lint         # Run ESLint
npm run research     # Explore Teams APIs (logs network calls)
npm test             # Run unit tests
npm run typecheck    # TypeScript type checking

For development with hot reload, configure your MCP client:

{
  "mcpServers": {
    "teams": {
      "command": "npx",
      "args": ["tsx", "/path/to/msteams-mcp/src/index.ts"]
    }
  }
}

See AGENTS.md for detailed architecture and contribution guidelines.


Teams Chat Export Bookmarklet

This repo also includes a standalone bookmarklet for exporting Teams chat messages to Markdown. See teams-bookmarklet/README.md.