Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 15 additions & 6 deletions Sources/mcs/Doctor/CoreDoctorChecks.swift
Original file line number Diff line number Diff line change
Expand Up @@ -68,13 +68,22 @@ struct MCPServerCheck: DoctorCheck {
guard let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any] else {
return .fail("~/.claude.json contains invalid JSON")
}
// Check project-scoped servers first (stored under projects[path].mcpServers)
// Walk up to the git root: Claude CLI keys local-scope servers by the git root,
// which may differ from the mcs project root in subdirectory projects.
if let root = projectRoot,
let projects = json[Constants.JSONKeys.projects] as? [String: Any],
let projectEntry = projects[root.path] as? [String: Any],
let projectMCP = projectEntry[Constants.JSONKeys.mcpServers] as? [String: Any],
projectMCP[serverName] != nil {
return .pass("registered")
let projects = json[Constants.JSONKeys.projects] as? [String: Any] {
var candidate: URL? = root
while let path = candidate, path.path != "/" {
if let projectEntry = projects[path.path] as? [String: Any],
let projectMCP = projectEntry[Constants.JSONKeys.mcpServers] as? [String: Any],
projectMCP[serverName] != nil {
return .pass("registered")
}
if FileManager.default.fileExists(atPath: path.appendingPathComponent(".git").path) {
break
}
candidate = path.deletingLastPathComponent()
}
}
// Fall back to global/user-scoped servers
if let mcpServers = json[Constants.JSONKeys.mcpServers] as? [String: Any],
Expand Down
Loading