slack-mcp-server
Version:
Model Context Protocol (MCP) server for Slack Workspaces. This integration supports both Stdio and SSE transports, proxy settings and does not require any permissions or bots being created or approved by Workspace admins
64 lines (54 loc) • 2.31 kB
JavaScript
const fs = require('fs');
const path = require('path');
const childProcess = require('child_process');
const BINARY_MAP = {
darwin_x64: { name: 'slack-mcp-server-darwin-amd64', suffix: '' },
darwin_arm64: { name: 'slack-mcp-server-darwin-arm64', suffix: '' },
linux_x64: { name: 'slack-mcp-server-linux-amd64', suffix: '' },
linux_arm64: { name: 'slack-mcp-server-linux-arm64', suffix: '' },
win32_x64: { name: 'slack-mcp-server-windows-amd64', suffix: '.exe' },
win32_arm64: { name: 'slack-mcp-server-windows-arm64', suffix: '.exe' },
};
function resolveBinaryPath() {
// If DXT installation then we fix empty variables, it's a DXT bug.
if (process.env.SLACK_MCP_DXT) {
if (process.env.SLACK_MCP_XOXC_TOKEN === '${user_config.xoxc_token}') {
process.env.SLACK_MCP_XOXC_TOKEN = '';
}
if (process.env.SLACK_MCP_XOXD_TOKEN === '${user_config.xoxd_token}') {
process.env.SLACK_MCP_XOXD_TOKEN = '';
}
if (process.env.SLACK_MCP_XOXP_TOKEN === '${user_config.xoxp_token}') {
process.env.SLACK_MCP_XOXP_TOKEN = '';
}
if (process.env.SLACK_MCP_ADD_MESSAGE_TOOL === '${user_config.add_message_tool}') {
process.env.SLACK_MCP_ADD_MESSAGE_TOOL = '';
}
}
const key = `${process.platform}_${process.arch}`;
const binary = BINARY_MAP[key];
if (!binary) {
throw new Error(`Could not resolve binary for platform/arch: ${process.platform}/${process.arch}`);
}
if (process.env.SLACK_MCP_DXT) {
return require.resolve(path.join(__dirname, `${binary.name}${binary.suffix}`));
} else {
return require.resolve(`${binary.name}/bin/${binary.name}${binary.suffix}`);
}
}
const binPath = resolveBinaryPath();
// Workaround for https://github.com/anthropics/dxt/issues/13
if (process.env.SLACK_MCP_DXT) {
const stats = fs.statSync(binPath);
const execMask = fs.constants.S_IXUSR
| fs.constants.S_IXGRP
| fs.constants.S_IXOTH;
if ((stats.mode & execMask) !== execMask) {
const newMode = stats.mode | execMask;
fs.chmodSync(binPath, newMode);
}
}
childProcess.execFileSync(binPath, process.argv.slice(2), {
stdio: 'inherit',
});