m365-reporting-mcp
Microsoft 365 Reporting MCP — v1.0
Корпоративный MCP-сервер, через который ChatGPT, Clause и других MCP-совместимые AI-клиенты получают контролируемый доступ к информационным источникам Microsoft 365 (Outlook, Календарь, Teams, расшифровки встреч, OneNote, SharePoint, OneDrive, Loop, Search, Users).
Принцип: read broadly, write narrowly. Широкий слой READ в пределах реальных прав M365 вошедшего пользователя; единственная возможность WRITE — отправка писем Outlook
(draft / send / reply / forward), причём каждая фактическая отправка находится за отдельным шлюзом confirm=true.
Архитектура
ChatGPT / Claude / MCP kliens
│ MCP over HTTPS (Streamable HTTP) + OAuth bearer token
▼
┌──────────────────────────────┐
│ m365-reporting-mcp │ Tool allowlist (86 tool, 11 WRITE = csak mail)
│ · JWT validálás (Entra) │ Nincs generikus graph-request / $batch passthrough
│ · On-Behalf-Of tokencsere │ Audit log (JSONL, tartalom nélkül)
│ · Pagination + 429 retry │ Forráskövetés (_source blokk minden objektumon)
│ · Admin dashboard (/admin) │
└──────────────┬───────────────┘
│ OAuth 2.0 OBO → delegated Graph token
▼
Microsoft Entra ID → Microsoft Graph API (v1.0)Сервер никогда не использует app-only разрешения: каждый Graph-вызов выполняется от имени вошедшего пользователя (delegated), поэтому MCP не может обойти существующие правила доступа M365.
Related MCP server: Microsoft Graph MCP Server
Регистрация приложения в Entra ID
Создайте App registration (single tenant).
Expose an API: Application ID URI =
api://<CLIENT_ID>, scope:access_as_user. УстановитеaccessTokenAcceptedVersionв значение 2 (manifest).API permissions (Microsoft Graph, Delegated) — полный список приведён в приложении docs/tool-matrix.md; вкратце:
READ:
Mail.Read,Mail.Read.Shared,Calendars.Read,Chat.Read,Team.ReadBasic.All,Channel.ReadBasic.All,ChannelMessage.Read.All,TeamMember.Read.All,OnlineMeetings.Read,OnlineMeetingTranscript.Read.All,OnlineMeetingRecording.Read.All,OnlineMeetingArtifact.Read.All,Notes.Read,Notes.Read.All,Sites.Read.All,Files.Read,Files.Read.All,People.Read,User.Read,User.ReadBasic.All,User.Read.AllWRITE (только почта):
Mail.ReadWrite,Mail.Send,Mail.ReadWrite.Shared,Mail.Send.SharedДля scope-ов
.Allтребуется Admin consent.
Для HTTP-режима: Certificates & secrets → client secret.
Для stdio/dev-режима: Authentication → «Allow public client flows» = Yes (device code).
Примечание к пункту 11 спецификации:
Sites.Selectedсуществует как application permission; в delegated-модели (от имени пользователя) ограничение на уровне сайта обеспечивается собственными правами пользователя SharePoint — MCP использует delegatedSites.Read.All, который сам по себе не даёт доступа к сайту, к которому у пользователя иначе нет доступа.
Установка и запуск
npm install
cp .env.example .env # töltsd ki: TENANT_ID, CLIENT_ID, CLIENT_SECRET, BASE_URL, ADMIN_KEY
npm run build
# Webapp (remote MCP) mód:
npm run start:http
# Lokális/dev (stdio, device code login):
npm run login # egyszeri bejelentkezés, token cache-elve
npm startEndpoints в HTTP-режиме:
URL | Описание |
| MCP endpoint (stateless Streamable HTTP), bearer token обязателен |
| Метаданные OAuth resource → указывают на встроенный OAuth-прокси |
| Метаданные OAuth AS (прокси) |
| Встроенный OAuth-прокси перед Entra ID |
| Admin dashboard: Настройки / Инструменты / Логи (X-Admin-Key) |
| Health check |
В HTTP-режиме сервер запускается даже без Entra-данных: превоначальную настройку можно выполнить через интерфейс /admin (Tenant ID, Client ID, Client Secret, Base URL, проверка подключения) — сохранение вступает в силу немедленно, настройки хранятся в data/settings.json и переопределяют значения .env.
Подключение ChatGPT (и других MCP-клиентов)
Сервер содержит встроенный OAuth-прокси перед Entra ID, поскольку коннектор ChatGPT ожидает dynamic client registration по RFC 7591, который Entra ID не поддерживает. Прокси предоставляет клиенту полный интерфейс OAuth 2.1 (DCR + PKCE), а в сторону Entra ID использует единственное зарегистрированное корпоративное приложение; выдаваемый клиенту access token — это сам токен, выпущенный Entra ID для api://<CLIENT_ID>, поэтому валидация на /mcp и OBO-обмен с Graphе остаются неизменными — все вызовы выполняются от имени вошедшего пользователя.
Подключение из ChatGPT:
В разделе Authentication приложения Entra ID добавьте как Web redirect URI:
https://<BASE_URL>/auth/callback(точное значение показано на вкладке «Настройки» в админ).ChatGPT → Settings → Connectors → new MCP connector, URL:
https://<BASE_URL>/mcp.Появившийся вход — это корпоративный вход Entra ID: пользователь входит с своей собственной учётной записью и получает только свои права M365.
Claude Desktop / Claude Code: тот же URL в качестве remote MCP или локально в stdio-режиме (claude mcp add m365-reporting -- node dist/index.js --stdio).
Уровень безопасности (см. п 19–20)
Нет универсального tool
graph_request(method, url, body)и нет$batchpassthrough — доступны только 86 allowlist-енных endpoints.Нет операций записи в Calendar/Teams/Files/Sites/OneNote/User/Group и нет delete нигде.
Создание черновика ≠ разрешение на отправку: каждый send/ reply/ forward защищён
confirm=true, и описание tool предписывает AI сначала получить явное подтверждение пользователя.С помощью env-переменной
READ_ONLY=trueможно отключить все операторы записи; черезENABLED_TOOLSETSможно сузить профиль на уровне toolset (например,mail,calendar,meetings).
Audit (см. спецификацию 21)
Каждый вызов логируется в JSONL (logs/audit-YYYY-MM-DD.jsonl): timestamp, user, session, tool, operation (READ/WRITE), resourceType, endpoint, httpMethod, success, durationMs, а для WRITE также sender, recipients, cc, subject, messageId, result. Содержимое (тело, транскрипт, документ, токен) никогда не попадает в журнал.
Отказоустойчивость (спецификация 22–23)
HTTP 429/503/504: автостатический retry с учётом
Retry-After(максимум 4 попытки);@odata.nextLinkпагиgnation во всех list-инструментах (параметрmaxItems, с явным указанием truncation);истекший токен / отказ доступа / отсутствующий ресурс: понятное и пригодное для AI сооб расшифровка об ошибке;
загрузка файлов с ограничением размера (
MAX_DOWNLOAD_BYTES), DOCX/XLSX/PPT/PDF/TXT/CSV → извлечение текста, прочие бинарные файлы → base64.
Инструмент-матрица (приложение для разработчика)
Полная матрица MCP tool → Graph endpoint → HTTP method → delegated permission → READ/WRITE → enabled генерируется как документ: docs/tool-matrix.md (npm run matrix обновляет её по определениям из src/tools/endpoints/*.ts).
Ограничения Loop-адаптера (спецификация 13)
Отдельного, доступного Graph API для Loop- рабочих пространств не существует, поэтому Loop-адаптер не использует вымышленные endpoints: через Search API и диски SharePoint/OneDrive он обращается к компонентам .loop/.fluid. Loop-workspaces, хранящиеся в контейнере SharePoint Embedded, могут быть недоступными через выполненный Graph — указание на это ограничение содержится в описании tool, чтобы AI сообщил о нём и пользователь знал.
Приёмочный тест (спецификация 26)
Из подключённого клиента на естественном языке: «Проанализй мою переписку, календарь, чаты Teams и расшифровки встреч за последние 30 дней… Составь сводку по проекту X… Подготовь из этого письмо и затем отправь его после отдельного подтверджения», — ожидаемая цепочка инструментов:
get-calendar-view → find-online-meeting-by-join-url → list-meeting-transcripts →
get-meeting-transcript-content + list-mail-messages + list-chat-messages +
search-onenote-pages + search-m365 → create-draft-email → (подтвердение пользователя) →
send-draft-email(confirm=true).
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
- AlicenseNot gradedqualityFmaintenanceEnables AI assistants to interact with Microsoft 365 services (users, mail, calendar, files) via Microsoft Graph API.371MIT

graphdo-tsofficial
AlicenseAqualityCmaintenanceEnables AI agents to send emails and manage tasks in Microsoft To Do with scoped, low-risk access to Microsoft Graph.3151MIT- AlicenseAqualityAmaintenanceEnables AI agents to read and manage Microsoft 365/Outlook email and calendar, with destructive actions (send email, create event) requiring human approval.8MIT
Related MCP Connectors
Your memory, everywhere AI goes. Build knowledge once, access it via MCP anywhere.
Official Microsoft MCP Server to query Microsoft Entra data using natural language
Remote MCP for MCP consent scope receipt, structured receipts, audit logs, and reviewer-ready eviden
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/kharonx/mcp_gateway'
If you have feedback or need assistance with the MCP directory API, please join our Discord server