ms365-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ms365-mcpCreate a draft email to Jane about the quarterly report."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ms365-mcp
A Microsoft 365 MCP server sized for small local models.
Most MCP servers are built for frontier models with large context windows, so they expose everything the vendor API offers and let the model sort it out. The reference Microsoft 365 server exposes 326 tools generated from Microsoft's Graph OpenAPI spec.
That does not work for an 8B model at 8k context, where the entire tool list sits in the system prompt and the model starts choosing at random somewhere past twenty-five tools. This server takes the opposite approach:
Fourteen hand-written tools, with a hard ceiling of twenty. The tool list is a budget, not a feature list.
Descriptions written for a small model, not salvaged from API metadata.
Draft-first. Exactly one tool can transmit to another person, it takes a draft id rather than a recipient, and it is annotated destructive.
Every tool declares its own effect through MCP
readOnlyHintanddestructiveHintannotations, so a host can classify it without guessing from the tool's name.
Built for the Edge Harness, and useful to any MCP client.
Status
Early. Not usable yet. The plan is ten commits; see docs/PLAN.md for the full sequence and the reasoning behind each decision.
Scaffold, licence, CI | done |
MCP protocol over stdio | done |
The fourteen-tool surface | declared, handlers are stubs |
Sign-in | not started |
Microsoft Graph | not started |
Related MCP server: google-nice-mcp
Seeing the tool surface
--list-tools starts nothing and needs no account, so it answers "what would
a host be offered?" before any of it is wired up:
.venv/bin/python -m ms365_mcp --list-toolsAdd --json for a machine-readable version.
read whoami Return the display name, email address and timezone…
read resolve_person Look up a person by name or partial name and return…
read list_messages List messages in a mail folder, newest first, as se…
write create_draft Create a draft message. This does NOT send anything…
! write send_draft Send a draft that already exists, by its id. This r…
...
14 tools, 6 that change something, 4 marked destructive (!)Handlers are stubs today: a call returns a sentence saying the tool is declared but not implemented. The surface is deliberately fixed before any of it is built, because the tool names, descriptions and effect classes are what a host classifies and a model is prompted against, and those are expensive to change later.
Using it from the Edge Harness
The harness launches this server as a subprocess over stdio, so it runs under
its own interpreter and shares no dependencies with the host. That is not
incidental: the harness has a local package called mcp/ and the official SDK
on PyPI is also called mcp, so installing this server into the harness's
virtualenv shadows the harness's own package.
Its registry entry there is ms365-own, and pressing Check in the Agent
Lab run options lists every tool with its effect class. All fourteen classify
as declared, meaning the harness took them from this server's annotations
rather than guessing from tool names, and the entry needs no overrides.
In the harness's default draft mode, send_draft is withheld and the other
thirteen are available, so a run cannot reach a person.
Security
This repository is public and holds no credential of any kind.
Authentication uses the Microsoft device-code flow. The resulting token cache
is written to the operating system's config directory with owner-only
permissions, never into this repository or its working tree. .gitignore
covers token and cache filenames anyway, and a pre-commit hook scans staged
changes for credential-shaped strings, so committing one takes deliberate
effort rather than a slip.
A line ending in # pragma: allowlist secret is skipped by the hook. That
exists so this repository's own tests can contain fake credentials, and it
leaves a marker a reviewer can see in the diff, which --no-verify does not.
Use it only for data that is provably fake.
Development
python3 -m venv .venv
.venv/bin/pip install -e ".[dev]"
.venv/bin/pytest -qEnable the secret-scan hook once per clone:
git config core.hooksPath .githooksLicence
MIT. See LICENSE.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceA production-ready MCP server that provides secure, delegated access to Microsoft 365 services including Email, SharePoint, OneDrive, and Calendar. It enables AI models to search messages, browse files, manage calendar events, and parse document contents using OAuth 2.1 authentication.MIT
- AlicenseAqualityCmaintenanceA read-only MCP server for Gmail and Drive with only 5 tools, designed to be friendly to small local LLMs by minimizing context usage and simplifying inputs.5MIT
- AlicenseNot gradedqualityDmaintenanceLightweight MCP server that enables AI agents to manage Microsoft Outlook email, calendar, and files using PKCE authentication with only a Client ID.MIT
- AlicenseNot gradedqualityCmaintenanceMCP server that exposes a Microsoft 365 mailbox via the Model Context Protocol, enabling AI assistants to search, read, and download emails and attachments, and optionally send mail.9MIT
Related MCP Connectors
Hosted MCP endpoint with realistic fake data for prototyping agents. 12 tools, no setup.
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sunnycho100/ms365-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server