UNPKG

chittycan

Version:

Your completely autonomous network that grows with you - DNA ownership platform with encrypted vaults, PDX portability, and ChittyFoundation governance

148 lines (121 loc) 5.09 kB
import { loadConfig, type ChittyConnectRemote } from "../lib/config.js"; import chalk from "chalk"; import path from "path"; import os from "os"; import fs from "fs"; /** * Generate Claude Code MCP configuration for ChittyConnect */ export async function generateMcpConfig(): Promise<void> { const config = loadConfig(); const connectRemote = config.remotes["connect"] as ChittyConnectRemote | undefined; if (!connectRemote || connectRemote.type !== "chittyconnect") { console.log(chalk.yellow("⚠ ChittyConnect not configured")); console.log(chalk.dim("Run: can connect setup\n")); return; } const hasToken = connectRemote.apiToken || process.env.CHITTY_TOKEN; if (!hasToken) { console.log(chalk.yellow("⚠ No API token found")); console.log(chalk.dim("Set CHITTY_TOKEN env var or run: can connect token\n")); return; } // Get absolute path to the MCP script const scriptPath = path.join(process.cwd(), "scripts", "mcp-chittyconnect.js"); // Check if script exists if (!fs.existsSync(scriptPath)) { console.log(chalk.yellow(`⚠ MCP script not found at: ${scriptPath}`)); console.log(chalk.dim("Make sure you're running from the chittycan project directory\n")); return; } console.log(chalk.bold("\n🔗 Claude Code MCP Configuration\n")); console.log(chalk.dim("Add this to your Claude Code MCP settings:\n")); const mcpConfig = { mcpServers: { chittyconnect: { command: "node", args: [scriptPath], env: { CHITTY_TOKEN: connectRemote.apiToken || "${CHITTY_TOKEN}", }, }, }, }; console.log(chalk.cyan(JSON.stringify(mcpConfig, null, 2))); console.log(chalk.dim("\n\nConfiguration file locations:")); console.log(chalk.dim(" Claude Code: ~/.config/claude-code/mcp.json")); console.log(chalk.dim(" Claude Desktop: ~/Library/Application Support/Claude/claude_desktop_config.json")); console.log(chalk.dim("\n\nQuick setup:")); console.log(chalk.cyan(" # Create/edit Claude Code MCP config")); console.log(chalk.cyan(" mkdir -p ~/.config/claude-code")); console.log(chalk.cyan(` echo '${JSON.stringify(mcpConfig, null, 2)}' > ~/.config/claude-code/mcp.json`)); console.log(chalk.dim("\n\nThen restart Claude Code to load the MCP server.")); console.log(chalk.bold("\n✨ Available Tools:\n")); console.log(chalk.dim(" • chitty_notion_query - Query Notion databases")); console.log(chalk.dim(" • chitty_github_sync - Sync GitHub repositories")); console.log(chalk.dim(" • chitty_ai_chat - AI chat with smart routing")); console.log(chalk.dim(" • chitty_context_get - Get session context")); console.log(chalk.dim(" • chitty_context_update - Update session context")); console.log(chalk.dim(" • chitty_integrations_list - List integrations\n")); } /** * Auto-install MCP config for Claude Code */ export async function installMcpConfig(): Promise<void> { const config = loadConfig(); const connectRemote = config.remotes["connect"] as ChittyConnectRemote | undefined; if (!connectRemote || connectRemote.type !== "chittyconnect") { console.log(chalk.yellow("⚠ ChittyConnect not configured")); console.log(chalk.dim("Run: can connect setup\n")); return; } const hasToken = connectRemote.apiToken || process.env.CHITTY_TOKEN; if (!hasToken) { console.log(chalk.yellow("⚠ No API token found")); console.log(chalk.dim("Set CHITTY_TOKEN env var or run: can connect token\n")); return; } const scriptPath = path.join(process.cwd(), "scripts", "mcp-chittyconnect.js"); if (!fs.existsSync(scriptPath)) { console.log(chalk.yellow(`⚠ MCP script not found at: ${scriptPath}`)); return; } const claudeCodeConfigDir = path.join(os.homedir(), ".config", "claude-code"); const claudeCodeConfigPath = path.join(claudeCodeConfigDir, "mcp.json"); const mcpConfig = { mcpServers: { chittyconnect: { command: "node", args: [scriptPath], env: { CHITTY_TOKEN: connectRemote.apiToken || process.env.CHITTY_TOKEN, }, }, }, }; // Create directory if it doesn't exist fs.mkdirSync(claudeCodeConfigDir, { recursive: true }); // Load existing config if present let existingConfig: any = {}; if (fs.existsSync(claudeCodeConfigPath)) { try { const data = fs.readFileSync(claudeCodeConfigPath, "utf8"); existingConfig = JSON.parse(data); } catch (error) { console.log(chalk.yellow("⚠ Could not parse existing config, creating new one")); } } // Merge configs const finalConfig = { ...existingConfig, mcpServers: { ...existingConfig.mcpServers, ...mcpConfig.mcpServers, }, }; // Write config fs.writeFileSync(claudeCodeConfigPath, JSON.stringify(finalConfig, null, 2), "utf8"); console.log(chalk.green("\n✓ MCP configuration installed!")); console.log(chalk.dim(` Config: ${claudeCodeConfigPath}`)); console.log(chalk.dim("\nRestart Claude Code to load the ChittyConnect MCP server.\n")); }