Skip to main content
Glama

SharePoint Online MCP Server

by Zerg00s
auth_factory.ts3.9 kB
// src/auth_factory.ts - Fixed version import { SharePointConfig, SharePointSecretConfig, SharePointCertConfig } from './config'; import { getSharePointHeaders as getSharePointHeadersSecret, getRequestDigest as getRequestDigestSecret, AuthHeaders } from './auth'; import { getSharePointHeaders as getSharePointHeadersCert } from './azure_cert_auth'; import axios from 'axios'; /** * Get the appropriate SharePoint authentication headers based on the configuration * @param url The SharePoint site URL * @param config The SharePoint configuration * @returns Authentication headers for API requests */ export async function getSharePointHeaders(url: string, config: SharePointConfig): Promise<AuthHeaders> { // Determine which authentication method to use if (config.authType === 'certificate') { // Use certificate-based authentication const certConfig: SharePointCertConfig = config; return getSharePointHeadersCert(url, certConfig); } else { // Use client secret authentication const secretConfig: SharePointSecretConfig = config; return getSharePointHeadersSecret(url, secretConfig); } } /** * Get a request digest for SharePoint POST operations * This works with both certificate and client secret authentication * @param url The SharePoint site URL * @param headers The authentication headers * @returns Request digest value */ export async function getRequestDigest(url: string, headers: AuthHeaders): Promise<string> { try { console.error("Getting request digest for POST operations..."); if (!headers || Object.keys(headers).length === 0) { throw new Error("Headers are empty or undefined"); } const digestUrl = `${url}/_api/contextinfo`; console.error(`Requesting digest from: ${digestUrl}`); const digestResponse = await axios({ url: digestUrl, method: 'POST', headers: { ...headers, 'Accept': 'application/json;odata=verbose' }, timeout: 30000 }); // Check the response status if (digestResponse.status >= 400) { throw new Error(`HTTP Error ${digestResponse.status}: ${JSON.stringify(digestResponse.data)}`); } if (!digestResponse.data || !digestResponse.data.d || !digestResponse.data.d.GetContextWebInformation) { console.error("Unexpected digest response format:", JSON.stringify(digestResponse.data)); throw new Error("Invalid digest response format"); } const digestValue = digestResponse.data.d.GetContextWebInformation.FormDigestValue; console.error("Request digest obtained successfully"); return digestValue; } catch (error) { console.error('Error getting request digest:'); // Enhanced error handling if (error instanceof Error) { console.error(`Error message: ${error.message}`); console.error(`Error stack: ${error.stack}`); // Try to identify common issues if (error.message.includes("403")) { console.error("This appears to be a permissions issue. Check your app permissions."); } else if (error.message.includes("404")) { console.error("The contextinfo endpoint could not be found. Check your site URL."); } else if (error.message.includes("timeout")) { console.error("The request timed out. Check your network connection."); } } else { console.error(error); } throw new Error('Failed to get request digest required for operations. Check app permissions and URL.'); } } export default { getSharePointHeaders, getRequestDigest };

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/Zerg00s/server-sharepoint'

If you have feedback or need assistance with the MCP directory API, please join our Discord server