Skip to content

feat(mcp): .mcp.json config support and disconnect action in /mcp page#115

Merged
yishuiliunian merged 1 commit intomainfrom
feat/mcp-json-and-disconnect
Apr 16, 2026
Merged

feat(mcp): .mcp.json config support and disconnect action in /mcp page#115
yishuiliunian merged 1 commit intomainfrom
feat/mcp-json-and-disconnect

Conversation

@yishuiliunian
Copy link
Copy Markdown
Contributor

Summary

  • Support industry-standard .mcp.json config files in .loopal/ and plugin directories (camelCase mcpServers format, stdio implicit)
  • Add disconnect/reconnect action menu in /mcp sub-page (Enter opens menu instead of direct reconnect)
  • Full disconnect pipeline: protocol → runtime → MCP manager → tool registry cleanup

Changes

Config layer (loopal-config):

  • New mcp_json.rs: parser for standard .mcp.json format
  • loader.rs: load_layer_from_dir loads .mcp.json after settings.json, overrides by name
  • 12 unit + integration tests

Protocol layer (loopal-protocol):

  • ControlCommand::McpDisconnect variant + serde roundtrip test

MCP layer (loopal-mcp):

  • disconnect_connection() on McpManager — returns removed tool names for registry cleanup

Kernel layer (loopal-kernel):

  • unregister_tools() on Kernel
  • ToolRegistry::unregister() method

Runtime layer (loopal-runtime):

  • handle_mcp_disconnect() handler: disconnect → unregister tools → emit status

TUI layer (loopal-tui):

  • ActionMenu state model with dynamic options (Disconnect shown only when connected)
  • Two-mode key handler (list navigation vs menu selection)
  • mcp_action_menu.rs: centered overlay rendering
  • Status update clears stale action menu
  • tool_approve/tool_deny extracted to key_dispatch_ops.rs (line limit fix)
  • Updated existing tests + 6 new tests

Test plan

  • CI passes
  • bazel build //... --config=clippy zero warnings
  • bazel build //... --config=rustfmt zero diffs
  • 5 affected crate test suites pass (config, protocol, mcp, registry, tui)

#112)

Two features:

1. `.mcp.json` config file support — industry-standard camelCase format
   (`mcpServers`) in `.loopal/` and plugin directories. Stdio type is
   implicit (no `type` field needed). Within a layer, `.mcp.json`
   overrides `settings.json` same-name servers.

2. MCP sub-page action menu — Enter on a selected server opens a
   Disconnect/Reconnect menu instead of directly reconnecting.
   Full disconnect pipeline: TUI → ControlCommand::McpDisconnect →
   Runtime → McpManager::disconnect_connection → ToolRegistry cleanup.
@yishuiliunian yishuiliunian merged commit d2486ed into main Apr 16, 2026
4 checks passed
@yishuiliunian yishuiliunian deleted the feat/mcp-json-and-disconnect branch April 16, 2026 04:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant