MCP Microsoft Office Bridge

Un servidor seguro, multiusuario que

Documentación

MseeP.ai Security Assessment Badge

MCP Microsoft Office

Un servidor MCP. Múltiples usuarios. Tráfico real de Microsoft 365 en tu inquilino de prueba.


El problema

Los inquilinos de prueba permanecen vacíos. Los datos de prueba estáticos no ejercitan flujos de trabajo reales. Cuando necesitas agentes que envíen correos reales, programen reuniones reales y colaboren en canales reales de Teams, los mocks y stubs se quedan cortos.

Qué resuelve esto

Este proyecto conecta cualquier cliente de IA compatible con MCP a Microsoft 365 a través de la Graph API. Cada agente se autentica como un usuario distinto del inquilino y realiza operaciones reales sobre datos reales.

  • 117 herramientas en 12 módulos: Mail, Calendar, Files, Excel, Word, PowerPoint, Teams, Contacts, To-Do, Groups, People, Search
  • Multiusuario: un solo servidor admite a todo tu equipo, cada uno con datos aislados
  • Llamadas reales a la Graph API: cada operación llega al inquilino real, no a un mock
  • Seguro: tokens cifrados en reposo, sin credenciales almacenadas en servidores de terceros

Arquitectura

                    ┌──────────────────┐
                    │  MCP Client      │
                    │  (Claude, etc.)  │
                    └────────┬─────────┘
                             │ JSON-RPC (stdin/stdout)
                    ┌────────▼─────────┐
                    │  MCP Adapter     │
                    │  (runs locally)  │
                    └────────┬─────────┘
                             │ HTTP + Bearer Token
                    ┌────────▼─────────┐
                    │  MCP Server      │
                    │  (local or       │
                    │   remote)        │
                    └────────┬─────────┘
                             │ Microsoft Graph API
                    ┌────────▼─────────┐
                    │  Microsoft 365   │
                    │  (your tenant)   │
                    └──────────────────┘

Tres partes:

  1. Cliente MCP -- la IA con la que interactúas
  2. Adaptador MCP -- un proceso de Node.js que traduce el protocolo MCP a solicitudes HTTP (se ejecuta en la misma máquina que el cliente)
  3. Servidor MCP -- gestiona la autenticación y llama a la Microsoft Graph API (se ejecuta localmente o en un servidor remoto)

Permisos

El servidor requiere 18 permisos delegados de Microsoft Graph. Doce funcionan sin consentimiento de administrador. Seis requieren que un administrador del inquilino otorgue su consentimiento.

Sin consentimiento de administrador requerido

PermisoHerramientas desbloqueadas
User.ReadAutenticación, perfil de usuario
Mail.ReadWritereadMail, readMailDetails, markEmailRead, flagMail, getMailAttachments, addMailAttachment, removeMailAttachment
Mail.SendsendMail, replyToMail
Calendars.ReadWritegetEvents, createEvent, updateEvent, cancelEvent, acceptEvent, tentativelyAcceptEvent, declineEvent, getAvailability, findMeetingTimes, getRooms, getCalendars, addAttachment, removeAttachment
Files.ReadWrite.AlllistFiles, uploadFile, downloadFile, getFileMetadata, getFileContent, setFileContent, updateFileContent, createSharingLink, getSharingLinks, removeSharingPermission, listChannelFiles, uploadFileToChannel, readChannelFile, todas las herramientas de libros de Excel, todas las herramientas de Word/PowerPoint
Contacts.ReadWritelistContacts, getContact, createContact, updateContact, deleteContact, searchContacts
Tasks.ReadWritelistTaskLists, getTaskList, createTaskList, updateTaskList, deleteTaskList, listTasks, getTask, createTask, updateTask, deleteTask, completeTask
Chat.ReadWritelistChats, createChat, getChatMessages, sendChatMessage
Channel.ReadBasic.AlllistTeamChannels, getChannelMessages
ChannelMessage.SendsendChannelMessage, replyToMessage
Channel.CreatecreateTeamChannel
OnlineMeetings.ReadWritecreateOnlineMeeting, getOnlineMeeting, listOnlineMeetings, getMeetingByJoinUrl

Requiere consentimiento de administrador

PermisoHerramientas adicionales desbloqueadas
User.Read.AllResolver IDs de usuario en Teams, búsqueda de People
People.Read.AllfindPeople, getRelevantPeople, getPersonById
Group.Read.AlllistGroups, getGroup, listGroupMembers, listMyGroups
ChannelMember.ReadWrite.AlladdChannelMember
ChannelMessage.Read.AllLeer historial de mensajes del canal
OnlineMeetingTranscript.Read.AllgetMeetingTranscripts, getMeetingTranscriptContent

Sin consentimiento de administrador, obtienes Mail, Calendar, Files, libros de Excel, documentos de Word, presentaciones de PowerPoint, Contacts, To-Do, Chat y operaciones básicas de canales de Teams. Con consentimiento de administrador, añades búsqueda en el directorio de People, Groups, gestión de miembros de canales y transcripciones de reuniones.


Inicio rápido

Requisitos previos

  • Node.js 18+ (descargar)
  • Claude Desktop (descargar) u otro cliente MCP
  • Cuenta de Microsoft 365 (de trabajo, educativa o personal)

Paso 1: Registro de aplicación en Azure

  1. Ve a Azure Portal > Microsoft Entra ID > Registros de aplicaciones > Nuevo registro
  2. Nómbralo MCP-Microsoft-Office, regístralo con tu tipo de cuenta preferido
  3. Copia el ID de aplicación (cliente) y el ID de directorio (inquilino)
  4. Ve a Permisos de API > Agregar un permiso > Microsoft Graph > Permisos delegados
  5. Añade los 18 permisos enumerados anteriormente
  6. Si eres administrador del inquilino, haz clic en Otorgar consentimiento de administrador
  7. Ve a Autenticación > Agregar una plataforma > Web
    • URI de redirección: http://localhost:3000/api/auth/callback
    • Habilita Permitir flujos de clientes públicos

Paso 2: Clonar y configurar

git clone https://github.com/Aanerud/MCP-Microsoft-Office.git
cd MCP-Microsoft-Office
npm install

Copia .env.example a .env y completa los detalles de tu aplicación de Azure:

MICROSOFT_CLIENT_ID=your-client-id
MICROSOFT_TENANT_ID=your-tenant-id

Paso 3: Iniciar el servidor y autenticarse

npm run dev:web

Abre http://localhost:3000 en tu navegador. Haz clic en Iniciar sesión con Microsoft, inicia sesión y otorga permisos. Luego haz clic en Generar token MCP y copia el token.

Paso 4: Configurar Claude Desktop

Edita tu configuración de Claude Desktop:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json

Claude Desktop tiene un límite práctico de ~55 herramientas por servidor MCP. Este proyecto expone 117 herramientas, por lo que las dividimos en tres servidores que comparten el mismo adaptador y backend:

{
  "mcpServers": {
    "microsoft-365": {
      "command": "node",
      "args": ["/path/to/MCP-Microsoft-Office/mcp-adapter.cjs"],
      "env": {
        "MCP_SERVER_URL": "http://localhost:3000",
        "MCP_BEARER_TOKEN": "paste-your-token-here",
        "MCP_MODULES": "search,mail,calendar,files,people,contacts,groups,query"
      }
    },
    "microsoft-365-teams": {
      "command": "node",
      "args": ["/path/to/MCP-Microsoft-Office/mcp-adapter.cjs"],
      "env": {
        "MCP_SERVER_URL": "http://localhost:3000",
        "MCP_BEARER_TOKEN": "paste-your-token-here",
        "MCP_MODULES": "teams,todo"
      }
    },
    "microsoft-365-office": {
      "command": "node",
      "args": ["/path/to/MCP-Microsoft-Office/mcp-adapter.cjs"],
      "env": {
        "MCP_SERVER_URL": "http://localhost:3000",
        "MCP_BEARER_TOKEN": "paste-your-token-here",
        "MCP_MODULES": "excel,word,powerpoint,files"
      }
    }
  }
}

MCP_MODULES filtra qué módulos expone el adaptador. Omítelo para exponer las 117 herramientas (funciona con clientes que no tienen límite de herramientas).

Establece MCP_DEBUG=1 en el bloque env para habilitar el registro de diagnóstico en stderr — útil para solucionar problemas de despacho de herramientas.

Reinicia Claude Desktop. Pregunta: "¿Qué hay en mi calendario hoy?" o "Crea un libro de Excel con una tabla de presupuesto."


Herramientas (117)

Mail (9)

HerramientaDescripción
readMailLeer mensajes de la bandeja de entrada
sendMailEnviar un correo electrónico
replyToMailResponder a un correo electrónico
readMailDetailsObtener el contenido completo del correo
markEmailReadMarcar correo como leído/no leído
flagMailMarcar o desmarcar un correo
getMailAttachmentsListar archivos adjuntos del correo
addMailAttachmentAñadir archivo adjunto al correo
removeMailAttachmentEliminar archivo adjunto del correo

Calendar (13)

HerramientaDescripción
getEventsObtener eventos del calendario
createEventCrear una reunión o evento
updateEventModificar un evento existente
cancelEventCancelar un evento
acceptEventAceptar una invitación a reunión
tentativelyAcceptEventAceptar provisionalmente
declineEventRechazar una invitación a reunión
getAvailabilityConsultar disponibilidad (libre/ocupado)
findMeetingTimesEncontrar horarios óptimos de reunión
getRoomsEncontrar salas de reuniones
getCalendarsListar todos los calendarios
addAttachmentAñadir archivo adjunto al evento
removeAttachmentEliminar archivo adjunto del evento

Files (10)

HerramientaDescripción
listFilesListar archivos de OneDrive
uploadFileSubir un archivo
downloadFileDescargar un archivo
getFileMetadataObtener información del archivo
getFileContentLeer contenido del archivo
setFileContentEscribir contenido del archivo
updateFileContentActualizar archivo existente
createSharingLinkCrear un enlace de uso compartido
getSharingLinksListar enlaces de uso compartido
removeSharingPermissionEliminar acceso de uso compartido

Excel (30)

Trabaja directamente con libros de Excel almacenados en OneDrive o SharePoint — sin necesidad de descargar archivos. Todas las operaciones pasan por la API de libros de Microsoft Graph con gestión transparente de sesiones.

HerramientaDescripción
createWorkbookSessionAbrir una sesión de libro (persistente o temporal)
closeWorkbookSessionCerrar una sesión de libro activa
listWorksheetsListar todas las hojas de cálculo de un libro
addWorksheetAñadir una nueva hoja de cálculo
getWorksheetObtener una hoja de cálculo por nombre o ID
updateWorksheetRenombrar, reposicionar u ocultar una hoja de cálculo
deleteWorksheetEliminar una hoja de cálculo
getRangeLeer valores de celda, fórmulas y formato
updateRangeEscribir valores en un rango de celdas
getRangeFormatObtener formato (fuente, relleno, bordes)
updateRangeFormatEstablecer formato (negrita, colores, formatos numéricos)
sortRangeOrdenar celdas en un rango
mergeRangeCombinar celdas
unmergeRangeSeparar celdas
listTablesListar todas las tablas de una hoja de cálculo
createTableCrear una tabla a partir de un rango
updateTableRenombrar o cambiar el estilo de una tabla
deleteTableEliminar una tabla
listTableRowsListar todas las filas de una tabla
addTableRowAñadir una fila a una tabla
deleteTableRowEliminar una fila por índice
listTableColumnsListar todas las columnas de una tabla
addTableColumnAñadir una columna a una tabla
deleteTableColumnEliminar una columna
sortTableOrdenar una tabla por columna
filterTableAplicar un filtro a una columna de tabla
clearTableFilterLimpiar un filtro de columna
convertTableToRangeConvertir una tabla de nuevo a un rango simple
callWorkbookFunctionLlamar a cualquiera de las más de 300 funciones de Excel (SUM, VLOOKUP, PMT, etc.)
calculateWorkbookRecalcular todas las fórmulas

Word (5)

Crea, lee y convierte documentos de Word. Los documentos se crean a partir de JSON estructurado y se almacenan en OneDrive. La lectura utiliza una cadena de respaldo de múltiples bibliotecas: mammoth (mejor HTML para .docx) → word-extractor (maneja tanto .doc como .docx) → respaldo webUrl. Las descargas binarias utilizan el endpoint /contentStream de la versión beta de Graph para una transferencia binaria fiable.

HerramientaDescripción
createWordDocumentCrear un .docx a partir de contenido estructurado (encabezados, párrafos, tablas, listas, imágenes)
readWordDocumentLeer un documento como HTML y texto plano
getWordDocumentMetadataObtener título, autor, fechas, palabras clave
getWordDocumentAsHtmlConvertir el contenido del documento a HTML
convertDocumentToPdfConvertir un documento de Word a PDF

Nota: Algunos inquilinos de SharePoint convierten los archivos .docx subidos a formato binario OLE2 en cuestión de segundos tras la carga. Cuando esto ocurre, las bibliotecas de análisis del lado del cliente no pueden leer el archivo. El servidor recurre elegantemente a devolver el webUrl para que el usuario pueda abrir el documento en el navegador.

PowerPoint (4)

Crea, lee y convierte presentaciones de PowerPoint. Las presentaciones se construyen a partir de datos estructurados de diapositivas y se almacenan en OneDrive. La lectura utiliza la conversión HTML de Graph con respaldo de jszip para la extracción de texto a nivel de diapositiva.

HerramientaDescripción
createPresentationCrear un .pptx con diapositivas de título, contenido y en blanco
readPresentationLeer contenido de diapositivas (elementos de texto por diapositiva)
getPresentationMetadataObtener título, autor, número de diapositivas, fechas
convertPresentationToPdfConvertir una presentación a PDF

Teams (21)

HerramientaDescripción
listChatsListar chats de Teams
createChatCrear un nuevo chat
getChatMessagesLeer mensajes de chat
sendChatMessageEnviar un mensaje de chat
listJoinedTeamsListar tus equipos
listTeamChannelsListar canales de equipo
createTeamChannelCrear un canal
addChannelMemberAñadir miembro al canal
getChannelMessagesLeer mensajes del canal
sendChannelMessagePublicar en un canal
replyToMessageResponder a un mensaje del canal
listChannelFilesListar archivos en un canal
uploadFileToChannelSubir archivo al canal
readChannelFileLeer un archivo del canal
createOnlineMeetingCrear una reunión de Teams
getOnlineMeetingObtener detalles de la reunión
listOnlineMeetingsListar reuniones en línea
getMeetingByJoinUrlEncontrar reunión por URL de unión
getMeetingTranscriptsObtener transcripciones de reuniones
getMeetingTranscriptContentLeer contenido de la transcripción

(Nota: addChannelMember se aplica solo a canales privados. Los canales estándar incluyen automáticamente a todos los miembros del equipo.)

Contacts (6)

HerramientaDescripción
listContactsListar contactos
getContactObtener detalles del contacto
createContactCrear un contacto
updateContactActualizar información del contacto
deleteContactEliminar un contacto
searchContactsBuscar contactos

To-Do (11)

HerramientaDescripción
listTaskListsListar listas de tareas
getTaskListObtener una lista de tareas
createTaskListCrear una lista de tareas
updateTaskListRenombrar una lista de tareas
deleteTaskListEliminar una lista de tareas
listTasksListar tareas
getTaskObtener detalles de una tarea
createTaskCrear una tarea
updateTaskActualizar una tarea
deleteTaskEliminar una tarea
completeTaskMarcar tarea como completada

Grupos (4)

HerramientaDescripción
listGroupsListar grupos de Microsoft 365
getGroupObtener detalles de un grupo
listGroupMembersListar miembros de un grupo
listMyGroupsListar tus grupos

Personas (3)

HerramientaDescripción
findPeopleBuscar en el directorio
getRelevantPeopleObtener contactos frecuentes
getPersonByIdObtener detalles de una persona

Búsqueda (1)

HerramientaDescripción
searchBúsqueda unificada en correos, archivos, eventos y mensajes de chat

Multi-Usuario

Cada usuario se autentica de forma independiente. El servidor aísla todos los datos por identidad de usuario.

  Alice (alice@contoso.com)          Bob (bob@contoso.com)
  ├─ Her own Microsoft tokens        ├─ His own Microsoft tokens
  ├─ Her own session                  ├─ His own session
  └─ Claude Desktop (her laptop)     └─ Claude Desktop (his PC)

              Complete data isolation.
         Alice never sees Bob's data.

Para pruebas automatizadas con múltiples agentes, use el flujo ROPC (Resource Owner Password Credentials) para autenticarse programáticamente:

# Start the server
npm run dev:web

# Run the E2E test suite (authenticates 3 users via ROPC)
node tests/run-all.cjs

El conjunto de pruebas autentica a múltiples usuarios y luego ejercita las 117 herramientas en 12 módulos más 5 flujos de trabajo entre módulos. Consulte tests/ para la implementación completa.


Conjunto de Pruebas E2E

El proyecto incluye un conjunto de pruebas integral que cubre las 117 herramientas.

# Run all tests (requires server running)
node tests/run-all.cjs

# Run a single module
node tests/run-all.cjs --bucket mail --buckets-only

# Run only workflows
node tests/run-all.cjs --workflows-only

Estructura de pruebas:

tests/
  lib/           Shared auth, HTTP client, reporter
  buckets/       One file per module (12 files, 117 tools)
  workflows/     Cross-module tests (5 files)
  run-all.cjs    Master runner

Las pruebas se autentican mediante ROPC (sin gestión manual de tokens) y se ejecutan en ~100 segundos.


Variables de Entorno

Copie .env.example a .env y configure:

VariableRequeridaDescripción
MICROSOFT_CLIENT_IDID de cliente de la aplicación Azure
MICROSOFT_TENANT_IDID de inquilino de Azure
MICROSOFT_REDIRECT_URINoURL de devolución de llamada OAuth (predeterminado: http://localhost:3000/api/auth/callback)
DEVICE_REGISTRY_ENCRYPTION_KEYProducciónClave de cifrado de 32 bytes para el almacenamiento de tokens
JWT_SECRETProducciónSecreto para firmar tokens JWT
CORS_ALLOWED_ORIGINSProducciónOrígenes permitidos separados por comas
PORTNoPuerto del servidor (predeterminado: 3000)
NODE_ENVNodevelopment o production

Despliegue

Local (Recomendado para Empezar)

npm install
npm run dev:web

Azure App Service

Consulte docs/azure-deployment.md para el despliegue CI/CD con GitHub Actions.


Seguridad

  • Almacenamiento cifrado: todos los tokens de Microsoft se cifran en reposo con AES-256
  • Sin secretos de cliente: usa flujo de cliente público (PKCE) para autenticación de escritorio
  • Aislamiento de tokens: los tokens de cada usuario se almacenan por separado con diferentes claves de cifrado
  • Limitación de velocidad: la limitación de velocidad integrada protege contra el abuso
  • Protección CORS: lista blanca de orígenes en producción
  • Caducidad de sesión: las sesiones caducan después de 24 horas

Lista de Verificación de Producción

  • Establecer NODE_ENV=production
  • Establecer DEVICE_REGISTRY_ENCRYPTION_KEY (32 bytes)
  • Establecer JWT_SECRET (cadena aleatoria fuerte)
  • Establecer CORS_ALLOWED_ORIGINS
  • Usar HTTPS con un certificado válido

Estructura del Proyecto

MCP-Microsoft-Office/
├── mcp-adapter.cjs          MCP protocol adapter (runs locally with Claude Desktop)
├── src/
│   ├── api/                 Express routes and controllers
│   ├── auth/                MSAL authentication (OAuth2, ROPC, token exchange)
│   ├── core/                Services (cache, storage, tools, error handling)
│   ├── graph/               Microsoft Graph API services
│   │   ├── graph-client.cjs   HTTP client with retry, binary support, sessions
│   │   ├── files-service.cjs  OneDrive file operations
│   │   ├── excel-service.cjs  Workbook API (sessions, ranges, tables, functions)
│   │   ├── word-service.cjs   Word create/read (docx + mammoth + word-extractor)
│   │   └── powerpoint-service.cjs  PPT create/read (pptxgenjs + jszip)
│   └── modules/             Feature modules (mail, calendar, excel, word, powerpoint, etc.)
├── public/                  Web UI for authentication
└── tests/                   E2E test suite (gitignored)

Contribuciones

  1. Haga un fork del repositorio
  2. Cree una rama de características
  3. Realice sus cambios
  4. Envíe una solicitud de extracción

Licencia

Licencia MIT -- consulte el archivo LICENSE.