#!/usr/bin/env node
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { DockerClient } from './docker/client.js';
import { ContainerManager } from './managers/container.js';
import { ImageManager } from './managers/image.js';
import { NetworkManager } from './managers/network.js';
import { VolumeManager } from './managers/volume.js';
import { SystemManager } from './managers/system.js';
import { ExecManager } from './managers/exec.js';
import { ComposeManager } from './managers/compose.js';
import { DockerHubClient } from './registries/dockerhub.js';
import { GHCRClient } from './registries/ghcr.js';
import { registerAllTools } from './tools/index.js';
async function main() {
// Initialize Docker client
const dockerClient = new DockerClient();
// Test connection
const isConnected = await dockerClient.testConnection();
if (!isConnected) {
console.error('Failed to connect to Docker daemon. Please ensure Docker is running.');
process.exit(1);
}
// Initialize managers
const containerManager = new ContainerManager(dockerClient);
const imageManager = new ImageManager(dockerClient);
const networkManager = new NetworkManager(dockerClient);
const volumeManager = new VolumeManager(dockerClient);
const systemManager = new SystemManager(dockerClient);
const execManager = new ExecManager(dockerClient);
const composeManager = new ComposeManager();
const dockerHubClient = new DockerHubClient();
const ghcrClient = new GHCRClient();
// Create MCP server
const server = new Server(
{
name: '@alisaitteke/docker-mcp',
version: '0.2.0',
},
{
capabilities: {
tools: {},
// Enable elicitation capability - client will negotiate if it supports it
// If client doesn't support elicitation, we fall back to confirm parameter
},
}
);
// Register all tools
registerAllTools(
server,
containerManager,
imageManager,
networkManager,
volumeManager,
systemManager,
execManager,
composeManager,
dockerHubClient,
ghcrClient
);
// Error handler
server.onerror = (error) => {
console.error('[MCP Error]', error);
};
// Connect to stdio transport
const transport = new StdioServerTransport();
await server.connect(transport);
console.error('Docker MCP Server running on stdio');
}
main().catch((error) => {
console.error('Fatal error:', error);
process.exit(1);
});