@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
JavaScript
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);
}
}
}