UNPKG

@softeria/ms-365-mcp-server

Version:

A Model Context Protocol (MCP) server for interacting with Microsoft 365 and Office services through the Graph API

52 lines (51 loc) 1.8 kB
import { ProxyOAuthServerProvider } from "@modelcontextprotocol/sdk/server/auth/providers/proxyProvider.js"; import logger from "./logger.js"; import { getCloudEndpoints } from "./cloud-config.js"; class MicrosoftOAuthProvider extends ProxyOAuthServerProvider { constructor(authManager, secrets) { const tenantId = secrets.tenantId || "common"; const clientId = secrets.clientId; const cloudEndpoints = getCloudEndpoints(secrets.cloudType); super({ endpoints: { authorizationUrl: `${cloudEndpoints.authority}/${tenantId}/oauth2/v2.0/authorize`, tokenUrl: `${cloudEndpoints.authority}/${tenantId}/oauth2/v2.0/token`, revocationUrl: `${cloudEndpoints.authority}/${tenantId}/oauth2/v2.0/logout` }, verifyAccessToken: async (token) => { try { const response = await fetch(`${cloudEndpoints.graphApi}/v1.0/me`, { headers: { Authorization: `Bearer ${token}` } }); if (response.ok) { const userData = await response.json(); logger.info(`OAuth token verified for user: ${userData.userPrincipalName}`); await authManager.setOAuthToken(token); return { token, clientId, scopes: [] }; } else { throw new Error(`Token verification failed: ${response.status}`); } } catch (error) { logger.error(`OAuth token verification error: ${error}`); throw error; } }, getClient: async (client_id) => { return { client_id, redirect_uris: ["http://localhost:3000/callback"] }; } }); this.authManager = authManager; } } export { MicrosoftOAuthProvider };