Skip to main content
Glama
kharonx
by kharonx

Microsoft 365 Reporting MCP — v1.0

Servidor MCP empresarial a través del cual ChatGPT, Claude y otros clientes de IA comapatibles con MCP acceden de forma controlada a las fuentes de información de Microsoft 365 (Outlook, Calendario, Teams, transcriciones de reuniones, OneNote, ShareP relativ, OneDrive, Loop, Búsqueda, Usuarios).

Princípio: read broadly, write barely. Una amplica capa de READ dentro de los permisos reales de M365 del usuarios autenticado; la única capacida WRITE es el envío de correos de Outlook (draft / send / reply / forward), y cada envío real pasa por un gate confirm=true indepent.

Arquitectura

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)

El servidor nunca utilt permisos app-only: de each Graph un llamada se golf — cada llamada a Graph se ejecuta en no ess of the enticado del usuario (delegated), por lo que el en MCP no puede eludir las reglas de eficientes de de access del M365 exist.

Related MCP server: Microsoft Graph MCP Server

Entra ID app-registr

  1. Create una App registration (single tenth).

  2. Expose an API: Application ID URI = api://<CLIENT_ID>, scope: access_as_userito. Conwentist accessTokenApproved to 2 (manifiest).

  3. API permissions (Microsoft Graph, Delegated) — la lista completa está en el anexo docs/tool-matrix.md; in summary:

    • READ: leates, el mása.Leat, Calendarace, chat.Read Chat.Read, Team.ReadBasic..All, .Selection.ReadBasic.All, .ChannelMessage.Read.Allº, Team.Read, Omega, Online, channel, .Read, DevelopmentOverflow.Read.All, OnlineMeetingFermissions.All, Online, .All, Omega, .Read, Files.Read, Files... All, People.Read, Online, el.Read, Notes.Read, User.Read, Notes.Read, User.Read, user, user Rec.

    • WRITE (solo correo): Mail.Read., mail.Send, .ReadWrite.Shared Mail, Mail. - "Let me re-read the source: WRITE (csak mail): Mail.Read, Mail.Read, mail.SendReadWrite, Mail.Send.Shared — preserve exactly the list.

    • Se requiere administrpermission consent for el scope .All.

  4. Para el modo HTTP: after certificatesclient. Heás — "Client Market". In the source: "Certificates & secrets → client secret".

  5. Para el modo stdio/dev: Authentication → «Allow public client flows» = Yes (device code).

Nota para el punto 11 de la especificación: Sites.Selected existe como permiso application; en el model (modelo delegado) (usuario) la restricción a el the site of the given user's own SharePoint jobs — el PC usa Sites.Read.All delegado, que por sí solo no da acceso a site to which the user otherwise can't access.

Instalación y ejecución

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 start

Endpoints HTTP en modo:

URL

Descripción

POST /mcp

Endpoint del MCP (Streamable HTTP stateless), bearer token obligatorio

GET /.well-known/oauth-protected-resource

Metadatos del recurso protegido del OAuth del MCP → para el propietdel inverso integrado

GET /.meta-known/oauth-auth.well- known authorization-server`

Metadatos del servidor de autorización OAuth (del inverso)

POST/register, GET /register, GET /authorize, POST /token, GET /auth/callback

Inversit proxy de autenticación integrado ante de Entra ID

GET /admin

Panel de administración: Configuración / Caja / Herramientas / Registro (X-Admin-Key)

GET /healthz

Health check

En modo HTTP el servidor se puede arrancher a sin datos de Entra: la primera confentación puede completarse en la interfaz /admin (Tenant ID, CLient Secret, Base URL, perueba de conexión)— "el guardado" se aplica al instante, la configuración se almacún en "data and mentions and .env."

Conectar ChatGPT (y otros Cláusulas MCP)

El servidor includes un proxy OAuth integrado ante de Entra ID, because el connector dept Espera dynamic client registration según RFC 7591, que Entra no admite. El proxy ofrece al cliente la interfaz completa dela OAuth (2.1 (DCR + PKCE) y frente a Entra util the única aplicación empresarial registrada: el token de acceso entregado al cliente es ex-se el token de acceso emitido por Entra para api, por eso el validario of /mcp y el intercambio GBOO con Graph no varían: to each of — "due quien".

ChatGPT:

  1. In el apartado Authentication* de la App Entra, añade como URI de redirección web: https://<BASE_URL>/auth/callback (el valor exacto se muestra en la pestañ de Configuración de la "").

  2. ChatGPT → Settings → Connectors → nuevo connector MCP, URL: https://<BASE_URL>/mcp.

  3. El usus "inicio de sesión" que apareces es el de Entra ID — el usuario accede con su la cuenta y obtien exclusivamente sus prop pack of M365 permissions.

Claude Desktop / Claude Code: same URL as remote MCP, or "standard" — in "modo": `el madd 365" — "con.

Capa de segurança (specs 19–27)

  • No existe unagra herramienta genérica graph_request, (action) ni un para "batch pass=through: solo están disponibles los 86 endpoints de la listra de allow.

  • No existe operación de ecritura en Calendar/Teams/Files/Sites/OneNote/User/Group y names in delete elim exists in any place.

  • Crear en borrador no es lo= to — "crear el envío de la permission — send/perfeit/reply/forward "send remplazo" ... confirm=true, y el descript de la herramienta ins the AI to ask a "user" an approval —.

  • Con la variable de entorno READ_ONLY=true puede desatorse todas la herramientas de "alse "con ENABLED_TOOLETS pueden filtra perfil de a nivel (el (eje. conj,calendar, calendar = el modifications`).

Audit (spec 21)

Cada llamada se registra in format JSONL (logs/audit-...), — "logs/audit-YYYY-MM-DD.jsonl): timestamp, user, session, tool, option READ / WRITE), esourceType, graphEndpoint, httpMethod, succes, durat; in WRITE #safe, además delector: sender, recipients, cc, subject, messageId, result. The content (body, transcript, document, token) never ll entry "the log".

Tolerancia a fFallas (spec) 22–23)

  • HTTP 429/503/504: reintentos auto- (con "ius"); "Reint"-after, respetando (max 4 intentos); *...

  • paginación con @odata.nextLink en todas las herramientas de lista (todos los parámetros maxItems, "trunción indicada");

  • tokenaparecido / permiso / embedido / recurso in exist: mensje de error comprehensible y/o "from" accionable para the "AI";

  • descending "de arch" the size with limited (MAX_DOWNLOAD_BYITES) — "DOCX/XLSX/PPTX/PDF/TXT/CSV → text, extracción, xlsx "into" en "bi64"

"Tool" (Matrix) — "métrix de herramienta (develop) anex

The complete matrix MCP tool → Graph endpoint → HTTP method → delegated permission → READ/WRITE → enabled as a generated document: docsit-matrix.md (npm run matrix actualiza a partir de las definiciones de . — hmm the end "**.ph" — src/tools/endpoints/.ts`*

Limits of the "Loop-adapter" (spec 13)

No hay "loop: dedicated, publicly available API worksp": for the Graph Loop, and they don't use ficticios endopoints: the .loop/.fluid componentes are pool through the API of "úsqueda" and in the "unidades" of "SharePoin"/OneDrive. The Loop-worksp: the contained in the contenedor of SharePoin Embed / edded loop workspace and the us "Graph" delegado — the "no" — "not always" accesse — this "la descrición de la herramienta" lo "indic" to the AI, so the "us" the user "lim" situation.

Acssept test (spec: 26)

    • cel — "Prueba de aceptación" * (the "nos "in" "Specification 26" . From clients conectado: "en lenguaje natural: „Visúa" mis "de" los "últos" 30 "días" el correo, calendario, mis "besac" Teams and "mis" transcribe "reuniones" … "Realiza" un resumen "proyecto" del — "escribe"... correo" a with detail — and envíalo después de una "aprobación" aparte." — the chainas: the "herramient" esperada: get-calendarfind-online-meetinglist-meeting-transcriptsget-meeting-transcript-content + list-mail-messages + list-chat + search-onenote-pages + "m365 search-m365create-draft-email → (apro-"aprobación) del "usuab" → send-draft-email(confirm=true).

" — a "confirm=true" — hmm. I'll — "with the token exact as in th".

F
license - not found
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

View all related MCP servers

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

View all MCP Connectors

Latest Blog Posts

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