Something went wrong. Try again.
source dump of claude code forked from oppi.li/claude-code
Something went wrong. Try again.
4.1 kB · 152 lines
TypeScript
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153import { readdir, readFile, stat } from 'fs/promises'import { homedir } from 'os'import { join } from 'path'import { type McpServerConfig, McpStdioServerConfigSchema,} from '../services/mcp/types.js'import { getErrnoCode } from './errors.js'import { safeParseJSON } from './json.js'import { logError } from './log.js'import { getPlatform, SUPPORTED_PLATFORMS } from './platform.js'
export async function getClaudeDesktopConfigPath(): Promise<string> { const platform = getPlatform()
if (!SUPPORTED_PLATFORMS.includes(platform)) { throw new Error( `Unsupported platform: ${platform} - Claude Desktop integration only works on macOS and WSL.`, ) }
if (platform === 'macos') { return join( homedir(), 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json', ) }
// First, try using USERPROFILE environment variable if available const windowsHome = process.env.USERPROFILE ? process.env.USERPROFILE.replace(/\\/g, '/') // Convert Windows backslashes to forward slashes : null
if (windowsHome) { // Remove drive letter and convert to WSL path format const wslPath = windowsHome.replace(/^[A-Z]:/, '') const configPath = `/mnt/c${wslPath}/AppData/Roaming/Claude/claude_desktop_config.json`
// Check if the file exists try { await stat(configPath) return configPath } catch { // File doesn't exist, continue } }
// Alternative approach - try to construct path based on typical Windows user location try { // List the /mnt/c/Users directory to find potential user directories const usersDir = '/mnt/c/Users'
try { const userDirs = await readdir(usersDir, { withFileTypes: true })
// Look for Claude Desktop config in each user directory for (const user of userDirs) { if ( user.name === 'Public' || user.name === 'Default' || user.name === 'Default User' || user.name === 'All Users' ) { continue // Skip system directories }
const potentialConfigPath = join( usersDir, user.name, 'AppData', 'Roaming', 'Claude', 'claude_desktop_config.json', )
try { await stat(potentialConfigPath) return potentialConfigPath } catch { // File doesn't exist, continue } } } catch { // usersDir doesn't exist or can't be read } } catch (dirError) { logError(dirError) }
throw new Error( 'Could not find Claude Desktop config file in Windows. Make sure Claude Desktop is installed on Windows.', )}
export async function readClaudeDesktopMcpServers(): Promise< Record<string, McpServerConfig>> { if (!SUPPORTED_PLATFORMS.includes(getPlatform())) { throw new Error( 'Unsupported platform - Claude Desktop integration only works on macOS and WSL.', ) } try { const configPath = await getClaudeDesktopConfigPath()
let configContent: string try { configContent = await readFile(configPath, { encoding: 'utf8' }) } catch (e: unknown) { const code = getErrnoCode(e) if (code === 'ENOENT') { return {} } throw e }
const config = safeParseJSON(configContent)
if (!config || typeof config !== 'object') { return {} }
const mcpServers = (config as Record<string, unknown>).mcpServers if (!mcpServers || typeof mcpServers !== 'object') { return {} }
const servers: Record<string, McpServerConfig> = {}
for (const [name, serverConfig] of Object.entries( mcpServers as Record<string, unknown>, )) { if (!serverConfig || typeof serverConfig !== 'object') { continue }
const result = McpStdioServerConfigSchema().safeParse(serverConfig)
if (result.success) { servers[name] = result.data } }
return servers } catch (error) { logError(error) return {} }}