Base MCP Server

Official
by base
import fs from 'fs'; import os from 'os'; import path from 'path'; import { confirm, log } from '@clack/prompts'; import { ConfigureMcpClientOptions } from './utils.js'; /** * Configures Base MCP server for Claude Desktop. */ export async function configureClaude({ cdpKeyId, cdpSecret, mnemonicPhrase, optionalKeys, }: ConfigureMcpClientOptions) { const claudeConfigPath = path.join( os.homedir(), 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json', ); const baseMcpConfig = { // TODO: go back to base-mcp once https://github.com/modelcontextprotocol/servers/issues/64 is resolved command: 'npx', args: ['base-mcp'], env: { COINBASE_API_KEY_NAME: cdpKeyId, COINBASE_API_PRIVATE_KEY: cdpSecret, SEED_PHRASE: mnemonicPhrase, ...optionalKeys, }, }; if (fs.existsSync(claudeConfigPath)) { const existingConfig = JSON.parse( fs.readFileSync(claudeConfigPath, 'utf8'), ); if ('mcpServers' in existingConfig && 'base' in existingConfig.mcpServers) { const shouldOverwrite = await confirm({ message: 'Base MCP is already configured in Claude Desktop. Would you like to overwrite it?', }); if (!shouldOverwrite) { log.message('Skipping configuration...'); return; } } const newConfig = { ...existingConfig, mcpServers: { ...existingConfig.mcpServers, base: baseMcpConfig, }, }; fs.writeFileSync(claudeConfigPath, JSON.stringify(newConfig, null, 2)); log.success('✓ Base MCP configured for Claude Desktop.'); } else { const config = { mcpServers: { base: baseMcpConfig, }, }; fs.writeFileSync(claudeConfigPath, JSON.stringify(config, null, 2)); log.success('✓ Base MCP configured for Claude Desktop.'); } }