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:
@@ -40,7 +40,7 @@ pub(crate) async fn ensure_project_root_with_story_kit(
|
||||
// Always update .mcp.json with the current port so the bot connects to
|
||||
// the right endpoint even when HUSKIES_PORT changes between restarts.
|
||||
let mcp_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"
|
||||
);
|
||||
fs::write(path.join(".mcp.json"), mcp_content)
|
||||
.map_err(|e| format!("Failed to write .mcp.json: {}", e))?;
|
||||
|
||||
@@ -69,11 +69,11 @@ pub(crate) fn scaffold_story_kit(root: &Path, port: u16) -> Result<(), String> {
|
||||
)?;
|
||||
|
||||
// Write .mcp.json at the project root so agents can find the MCP server
|
||||
// via the rendezvous WebSocket endpoint.
|
||||
// via the HTTP MCP endpoint.
|
||||
// Only written when missing — never overwrites an existing file, because
|
||||
// the port is environment-specific and must not clobber a running instance.
|
||||
let mcp_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"
|
||||
);
|
||||
write_file_if_missing(&root.join(".mcp.json"), &mcp_content)?;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user