UNPKG

@dav3/mcp-dynamics365-server

Version:

Generic MCP server for Dynamics 365 CRM operations (AI-generated side project with limited maintenance)

80 lines (79 loc) 2.86 kB
import { Server } from "@modelcontextprotocol/sdk/server/index.js"; import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js"; import dotenv from "dotenv"; import { readFileSync } from "fs"; import { dirname, join } from "path"; import { fileURLToPath } from "url"; import { D365ApiClient } from "./api-client.js"; import { allTools, handleToolCall } from "./tools/index.js"; import { startHttpTransport, startStdioTransport } from "./transports/index.js"; // Load environment variables dotenv.config(); // Get package version const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const packageJson = JSON.parse(readFileSync(join(__dirname, "../package.json"), "utf8")); const packageVersion = packageJson.version; export class D365MCPServer { server; apiClient; constructor() { // Validate required environment variables this.validateConfig(); const config = { baseUrl: process.env.D365_BASE_URL, clientId: process.env.D365_CLIENT_ID, clientSecret: process.env.D365_CLIENT_SECRET, tenantId: process.env.D365_TENANT_ID, resource: process.env.D365_RESOURCE, }; this.apiClient = new D365ApiClient(config); this.server = new Server({ name: "dynamics365-crm-server", version: packageVersion, }, { capabilities: { tools: {}, }, }); this.setupToolHandlers(); } validateConfig() { const required = [ "D365_BASE_URL", "D365_CLIENT_ID", "D365_CLIENT_SECRET", "D365_TENANT_ID", "D365_RESOURCE", ]; const missing = required.filter((key) => !process.env[key]); if (missing.length > 0) { throw new Error(`Missing required environment variables: ${missing.join(", ")}`); } } setupToolHandlers() { // List available tools this.server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: this.getAvailableTools(), }; }); // Handle tool calls this.server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; return await handleToolCall(name, args, this.apiClient); }); } getAvailableTools() { return allTools; } async run(transport = 'stdio', port = 3300, host = 'localhost') { console.error(`Starting Dynamics 365 MCP Server v${packageVersion}`); if (transport === 'http') { await startHttpTransport(this.server, port, host); } else { await startStdioTransport(this.server); } } }