fix(mcp): restore HTTP /mcp endpoint after 855 regression
855 deleted the HTTP /mcp route and pointed agents at ws://...crdt-sync, but Claude Code's .mcp.json doesn't speak ws:// and the rendezvous WS never had MCP method handlers wired up — so every spawned Claude Code agent (gateway-routed and local) booted with zero huskies tools and died on --permission-prompt-tool=mcp__huskies__prompt_permission. Restore mcp_post_handler / mcp_get_handler / handle_initialize, re-add the /mcp route, and revert all three .mcp.json writers to emit http://localhost:{port}/mcp with explicit "type": "http". Reuses the already-extracted gateway::jsonrpc types and the surviving dispatch_tool_call / list_tools surfaces — net add ~140 lines. Federation work is unaffected: /crdt-sync continues to do CRDT sync, which is what it was actually doing. MCP-over-WebSocket for cross-LAN agents was never wired up by 855 and can be done as a proper follow-up with a regression test that boots a real claude and verifies tool registration. Verified end-to-end: /mcp initialize, tools/list (74 tools incl. prompt_permission), and tools/call all respond correctly from inside the rebuilt container. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -37,10 +37,10 @@ pub fn worktree_path(project_root: &Path, story_id: &str) -> PathBuf {
|
||||
}
|
||||
|
||||
/// Write a `.mcp.json` file in the given directory pointing to the huskies
|
||||
/// rendezvous WebSocket endpoint at the given port.
|
||||
/// HTTP MCP endpoint at the given port.
|
||||
pub fn write_mcp_json(dir: &Path, port: u16) -> Result<(), String> {
|
||||
let content = format!(
|
||||
"{{\n \"mcpServers\": {{\n \"huskies\": {{\n \"url\": \"ws://localhost:{port}/crdt-sync\"\n }}\n }}\n}}\n"
|
||||
"{{\n \"mcpServers\": {{\n \"huskies\": {{\n \"type\": \"http\",\n \"url\": \"http://localhost:{port}/mcp\"\n }}\n }}\n}}\n"
|
||||
);
|
||||
std::fs::write(dir.join(".mcp.json"), content).map_err(|e| format!("Write .mcp.json: {e}"))
|
||||
}
|
||||
@@ -91,7 +91,7 @@ mod tests {
|
||||
let tmp = TempDir::new().unwrap();
|
||||
write_mcp_json(tmp.path(), 4242).unwrap();
|
||||
let content = std::fs::read_to_string(tmp.path().join(".mcp.json")).unwrap();
|
||||
assert!(content.contains("ws://localhost:4242/crdt-sync"));
|
||||
assert!(content.contains("http://localhost:4242/mcp"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -99,7 +99,7 @@ mod tests {
|
||||
let tmp = TempDir::new().unwrap();
|
||||
write_mcp_json(tmp.path(), 3001).unwrap();
|
||||
let content = std::fs::read_to_string(tmp.path().join(".mcp.json")).unwrap();
|
||||
assert!(content.contains("ws://localhost:3001/crdt-sync"));
|
||||
assert!(content.contains("http://localhost:3001/mcp"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
Reference in New Issue
Block a user