@intellectronica/ruler
Version:
Ruler — apply the same rules to all coding agents
66 lines (65 loc) • 2.37 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getAgentMcpCapabilities = getAgentMcpCapabilities;
exports.agentSupportsMcp = agentSupportsMcp;
exports.filterMcpConfigForAgent = filterMcpConfigForAgent;
/**
* Derives MCP capabilities for an agent
*/
function getAgentMcpCapabilities(agent) {
return {
supportsStdio: agent.supportsMcpStdio?.() ?? false,
supportsRemote: agent.supportsMcpRemote?.() ?? false,
};
}
/**
* Checks if an agent supports any MCP functionality
*/
function agentSupportsMcp(agent) {
const capabilities = getAgentMcpCapabilities(agent);
return capabilities.supportsStdio || capabilities.supportsRemote;
}
/**
* Filters MCP configuration based on agent capabilities
*/
function filterMcpConfigForAgent(mcpConfig, agent) {
const capabilities = getAgentMcpCapabilities(agent);
if (!agentSupportsMcp(agent)) {
return null;
}
const servers = mcpConfig.mcpServers;
if (!servers) {
return null;
}
const filteredServers = {};
for (const [serverName, serverConfig] of Object.entries(servers)) {
const config = serverConfig;
// Determine server type
const hasCommand = 'command' in config;
const hasUrl = 'url' in config;
const isStdio = hasCommand && !hasUrl;
const isRemote = hasUrl && !hasCommand;
// Include server if agent supports its type
if (isStdio && capabilities.supportsStdio) {
filteredServers[serverName] = serverConfig;
}
else if (isRemote && capabilities.supportsRemote) {
filteredServers[serverName] = serverConfig;
}
else if (isRemote &&
!capabilities.supportsRemote &&
capabilities.supportsStdio) {
// Transform remote server to stdio server using mcp-remote
const transformedConfig = {
command: 'npx',
args: ['-y', 'mcp-remote@latest', config.url],
...Object.fromEntries(Object.entries(config).filter(([key]) => key !== 'url')),
};
filteredServers[serverName] = transformedConfig;
}
// Note: Mixed servers (both command and url) are excluded
}
return Object.keys(filteredServers).length > 0
? { mcpServers: filteredServers }
: null;
}