mirror of
https://github.com/hanzoai/mcp.git
synced 2026-10-15 12:30:12 +00:00
feat: Add multi-target install command
- New 'install' command with flags for different applications - Supports --claude-desktop, --claude-code, --cursor, --vscode - Add --all flag to install for all supported applications - Backward compatibility with deprecated install-desktop command - Improved server.js to default to serve command - Version bump to 2.0.2
This commit is contained in:
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@hanzo/mcp",
|
"name": "@hanzo/mcp",
|
||||||
"version": "2.0.1",
|
"version": "2.0.2",
|
||||||
"description": "Hanzo MCP Server - Unified search, TreeSitter AST, vector store, and agent orchestration",
|
"description": "Hanzo MCP Server - Unified search, TreeSitter AST, vector store, and agent orchestration",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -2,9 +2,15 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Hanzo MCP Server Entry Point
|
* Hanzo MCP Server Entry Point
|
||||||
* This file serves as a simple entry point for running the MCP server
|
* Starts the MCP server directly when executed
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// Add 'serve' to process.argv if no command is specified
|
||||||
|
// This makes the server start by default
|
||||||
|
if (!process.argv.slice(2).some(arg => ['serve', 'install', 'install-desktop', 'list-tools', '--version', '--help', '-V', '-h'].includes(arg))) {
|
||||||
|
process.argv.push('serve');
|
||||||
|
}
|
||||||
|
|
||||||
import('./dist/cli.js').catch(err => {
|
import('./dist/cli.js').catch(err => {
|
||||||
console.error('Failed to start Hanzo MCP server:', err);
|
console.error('Failed to start Hanzo MCP server:', err);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
|
|||||||
+185
-43
@@ -37,17 +37,7 @@ const program = new Command();
|
|||||||
program
|
program
|
||||||
.name('hanzo-mcp')
|
.name('hanzo-mcp')
|
||||||
.description('Hanzo MCP Server - Model Context Protocol tools for AI development')
|
.description('Hanzo MCP Server - Model Context Protocol tools for AI development')
|
||||||
.version(packageJson.version)
|
.version(packageJson.version);
|
||||||
.option('--version', 'Display version number')
|
|
||||||
.action((options) => {
|
|
||||||
// Default action when no command is specified
|
|
||||||
if (options.version) {
|
|
||||||
console.log(packageJson.version);
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
// If no options, show help
|
|
||||||
program.outputHelp();
|
|
||||||
});
|
|
||||||
|
|
||||||
program
|
program
|
||||||
.command('serve', { isDefault: true })
|
.command('serve', { isDefault: true })
|
||||||
@@ -169,48 +159,200 @@ program
|
|||||||
});
|
});
|
||||||
|
|
||||||
program
|
program
|
||||||
.command('install-desktop')
|
.command('install')
|
||||||
.description('Install MCP server for Claude Desktop')
|
.description('Install MCP server for various applications')
|
||||||
.action(async () => {
|
.option('--claude-desktop', 'Install for Claude Desktop')
|
||||||
console.log('Installing Hanzo MCP for Claude Desktop...');
|
.option('--claude-code', 'Install for Claude Code')
|
||||||
|
.option('--cursor', 'Install for Cursor IDE')
|
||||||
|
.option('--vscode', 'Install for VS Code')
|
||||||
|
.option('--all', 'Install for all supported applications')
|
||||||
|
.action(async (options) => {
|
||||||
|
const installations: Array<{ name: string; install: () => Promise<void> }> = [];
|
||||||
|
|
||||||
const configDir = path.join(process.env.HOME || '', 'Library', 'Application Support', 'Claude');
|
// Helper function to install for Claude Desktop
|
||||||
const configFile = path.join(configDir, 'claude_desktop_config.json');
|
const installClaudeDesktop = async () => {
|
||||||
|
console.log('📦 Installing for Claude Desktop...');
|
||||||
try {
|
const configDir = path.join(process.env.HOME || '', 'Library', 'Application Support', 'Claude');
|
||||||
// Ensure config directory exists
|
const configFile = path.join(configDir, 'claude_desktop_config.json');
|
||||||
await fs.mkdir(configDir, { recursive: true });
|
|
||||||
|
|
||||||
// Read existing config or create new one
|
|
||||||
let config: any = {};
|
|
||||||
try {
|
try {
|
||||||
const configContent = await fs.readFile(configFile, 'utf-8');
|
await fs.mkdir(configDir, { recursive: true });
|
||||||
config = JSON.parse(configContent);
|
let config: any = {};
|
||||||
} catch {
|
try {
|
||||||
// Config doesn't exist yet
|
const configContent = await fs.readFile(configFile, 'utf-8');
|
||||||
|
config = JSON.parse(configContent);
|
||||||
|
} catch {
|
||||||
|
// Config doesn't exist yet
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!config.mcpServers) {
|
||||||
|
config.mcpServers = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
config.mcpServers['hanzo-mcp'] = {
|
||||||
|
command: 'npx',
|
||||||
|
args: ['-y', '@hanzo/mcp', 'serve'],
|
||||||
|
env: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
await fs.writeFile(configFile, JSON.stringify(config, null, 2));
|
||||||
|
console.log(`✓ Claude Desktop configured: ${configFile}`);
|
||||||
|
} catch (error: any) {
|
||||||
|
console.error(`✗ Claude Desktop installation failed: ${error.message}`);
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Helper function to install for Claude Code
|
||||||
|
const installClaudeCode = async () => {
|
||||||
|
console.log('📦 Installing for Claude Code...');
|
||||||
|
const configDir = path.join(process.env.HOME || '', '.config', 'claude-code');
|
||||||
|
const configFile = path.join(configDir, 'mcp.json');
|
||||||
|
|
||||||
// Add our MCP server
|
try {
|
||||||
if (!config.mcpServers) {
|
await fs.mkdir(configDir, { recursive: true });
|
||||||
config.mcpServers = {};
|
let config: any = {};
|
||||||
|
try {
|
||||||
|
const configContent = await fs.readFile(configFile, 'utf-8');
|
||||||
|
config = JSON.parse(configContent);
|
||||||
|
} catch {
|
||||||
|
// Config doesn't exist yet
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!config.servers) {
|
||||||
|
config.servers = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
config.servers['hanzo-mcp'] = {
|
||||||
|
command: 'npx',
|
||||||
|
args: ['-y', '@hanzo/mcp', 'serve'],
|
||||||
|
env: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
await fs.writeFile(configFile, JSON.stringify(config, null, 2));
|
||||||
|
console.log(`✓ Claude Code configured: ${configFile}`);
|
||||||
|
} catch (error: any) {
|
||||||
|
console.error(`✗ Claude Code installation failed: ${error.message}`);
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Helper function to install for Cursor
|
||||||
|
const installCursor = async () => {
|
||||||
|
console.log('📦 Installing for Cursor IDE...');
|
||||||
|
const configDir = path.join(process.env.HOME || '', '.cursor', 'mcp');
|
||||||
|
const configFile = path.join(configDir, 'config.json');
|
||||||
|
|
||||||
config.mcpServers['hanzo-mcp'] = {
|
try {
|
||||||
command: 'npx',
|
await fs.mkdir(configDir, { recursive: true });
|
||||||
args: ['-y', '@hanzo/mcp', 'serve'],
|
let config: any = {};
|
||||||
env: {}
|
try {
|
||||||
};
|
const configContent = await fs.readFile(configFile, 'utf-8');
|
||||||
|
config = JSON.parse(configContent);
|
||||||
|
} catch {
|
||||||
|
// Config doesn't exist yet
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!config.servers) {
|
||||||
|
config.servers = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
config.servers['hanzo-mcp'] = {
|
||||||
|
command: 'npx',
|
||||||
|
args: ['-y', '@hanzo/mcp', 'serve'],
|
||||||
|
env: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
await fs.writeFile(configFile, JSON.stringify(config, null, 2));
|
||||||
|
console.log(`✓ Cursor configured: ${configFile}`);
|
||||||
|
} catch (error: any) {
|
||||||
|
console.error(`✗ Cursor installation failed: ${error.message}`);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Helper function to install for VS Code
|
||||||
|
const installVSCode = async () => {
|
||||||
|
console.log('📦 Installing for VS Code...');
|
||||||
|
const configDir = path.join(process.env.HOME || '', '.vscode', 'mcp');
|
||||||
|
const configFile = path.join(configDir, 'servers.json');
|
||||||
|
|
||||||
// Write config
|
try {
|
||||||
await fs.writeFile(configFile, JSON.stringify(config, null, 2));
|
await fs.mkdir(configDir, { recursive: true });
|
||||||
|
let config: any = {};
|
||||||
console.log('✓ Successfully installed Hanzo MCP for Claude Desktop');
|
try {
|
||||||
console.log(`✓ Configuration saved to: ${configFile}`);
|
const configContent = await fs.readFile(configFile, 'utf-8');
|
||||||
console.log('\nRestart Claude Desktop to use Hanzo MCP tools.');
|
config = JSON.parse(configContent);
|
||||||
} catch (error: any) {
|
} catch {
|
||||||
console.error(`Error installing: ${error.message}`);
|
// Config doesn't exist yet
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!config.servers) {
|
||||||
|
config.servers = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
config.servers['hanzo-mcp'] = {
|
||||||
|
command: 'npx',
|
||||||
|
args: ['-y', '@hanzo/mcp', 'serve'],
|
||||||
|
env: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
await fs.writeFile(configFile, JSON.stringify(config, null, 2));
|
||||||
|
console.log(`✓ VS Code configured: ${configFile}`);
|
||||||
|
} catch (error: any) {
|
||||||
|
console.error(`✗ VS Code installation failed: ${error.message}`);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Determine what to install
|
||||||
|
if (options.all) {
|
||||||
|
installations.push(
|
||||||
|
{ name: 'Claude Desktop', install: installClaudeDesktop },
|
||||||
|
{ name: 'Claude Code', install: installClaudeCode },
|
||||||
|
{ name: 'Cursor', install: installCursor },
|
||||||
|
{ name: 'VS Code', install: installVSCode }
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
if (options.claudeDesktop) {
|
||||||
|
installations.push({ name: 'Claude Desktop', install: installClaudeDesktop });
|
||||||
|
}
|
||||||
|
if (options.claudeCode) {
|
||||||
|
installations.push({ name: 'Claude Code', install: installClaudeCode });
|
||||||
|
}
|
||||||
|
if (options.cursor) {
|
||||||
|
installations.push({ name: 'Cursor', install: installCursor });
|
||||||
|
}
|
||||||
|
if (options.vscode) {
|
||||||
|
installations.push({ name: 'VS Code', install: installVSCode });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (installations.length === 0) {
|
||||||
|
console.log('No installation target specified. Use one of:');
|
||||||
|
console.log(' --claude-desktop Install for Claude Desktop');
|
||||||
|
console.log(' --claude-code Install for Claude Code');
|
||||||
|
console.log(' --cursor Install for Cursor IDE');
|
||||||
|
console.log(' --vscode Install for VS Code');
|
||||||
|
console.log(' --all Install for all supported applications');
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log(`\n🚀 Installing Hanzo MCP v${packageJson.version}...\n`);
|
||||||
|
|
||||||
|
// Run all installations
|
||||||
|
for (const { name, install } of installations) {
|
||||||
|
await install();
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('\n✅ Installation complete!');
|
||||||
|
console.log('Restart the respective applications to use Hanzo MCP tools.');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Keep the legacy command for backward compatibility
|
||||||
|
program
|
||||||
|
.command('install-desktop')
|
||||||
|
.description('Install MCP server for Claude Desktop (deprecated, use "install --claude-desktop")')
|
||||||
|
.action(async () => {
|
||||||
|
console.log('Note: This command is deprecated. Use "hanzo-mcp install --claude-desktop" instead.\n');
|
||||||
|
// Call the new install command with claude-desktop flag
|
||||||
|
await program.parseAsync(['node', 'cli', 'install', '--claude-desktop'], { from: 'user' });
|
||||||
});
|
});
|
||||||
|
|
||||||
async function startStdioServer(options: any, toolConfig: ToolConfig) {
|
async function startStdioServer(options: any, toolConfig: ToolConfig) {
|
||||||
|
|||||||
Reference in New Issue
Block a user