tftsr-devops_investigation/MCP_SERVER_SUPPORT.md
Shaun Arman 3588399dfd
Some checks failed
Test / rust-fmt-check (pull_request) Failing after 2m12s
Test / frontend-typecheck (pull_request) Successful in 2m23s
Test / frontend-tests (pull_request) Successful in 2m22s
Test / rust-clippy (pull_request) Successful in 3m55s
Test / rust-tests (pull_request) Successful in 5m10s
PR Review Automation / review (pull_request) Failing after 11m6s
feat(mcp): add MCP Server Support with TDD implementation
Adds full Model Context Protocol (MCP) server management, enabling the
AI assistant to discover and call tools from external MCP servers during
triage conversations.

Backend (Rust):
- rmcp 1.7.0 dependency (client + stdio + Streamable HTTP transports)
- Migration 018: mcp_servers, mcp_tools, mcp_resources tables with
  CHECK constraints for transport_type, auth_type, discovery_status
- src/mcp/ module: models, store, client, adapter, discovery, commands,
  transport/{stdio,http}
- AppState gains mcp_connections: Arc<TokioMutex<HashMap<...>>>
- .setup() hook auto-discovers enabled servers at startup
- 8 new Tauri commands wired into invoke_handler
- execute_mcp_tool_call: PII scan + mandatory audit_log before execution
- Auth values encrypted at rest via integrations::auth::encrypt_token();
  scrubbed before any frontend response

Frontend:
- MCPServers.tsx settings page (/settings/mcp) with server list,
  status badges, Discover Now, Add/Edit modal, enable/disable toggle
- tauriCommands.ts: McpServer, McpTool, McpServerStatus types + 8 cmds
- App.tsx: Plug icon, /settings/mcp route, sidebar nav entry

Tests (TDD): 15 new tests, all green
- 5 migration tests (written before migration, red → green)
- 5 store CRUD + encryption tests
- 5 adapter sanitization + conversion tests

Verification: 185/185 Rust, 94/94 Vitest, clippy -D warnings: 0
2026-05-23 16:23:48 -05:00

85 lines
3.9 KiB
Markdown

# MCP Server Support — Ticket Summary
## Description
Adds MCP (Model Context Protocol) server management to the application, allowing the AI assistant
to discover and call tools from external MCP servers during triage conversations.
The implementation covers:
- Settings page at `/settings/mcp` for managing server connections
- Support for `stdio` (local processes) and `http` (Streamable HTTP) transports
- Auth types: `none`, `api_key`, `bearer`, `oauth2`
- Auto-discovery of enabled servers at application startup
- Transparent injection of discovered tools into every AI chat session
- Security-first design: encrypted credential storage, mandatory audit logging, PII scanning
---
## Acceptance Criteria
- [x] Users can add, edit, enable/disable, and delete MCP server configurations
- [x] "Discover Now" connects to the server, lists tools and resources, and persists results
- [x] Enabled servers auto-connect on app launch via `.setup()` hook
- [x] MCP tools appear in the AI chat tool list and are callable by the AI
- [x] `auth_value` is always AES-256-GCM encrypted at rest; never returned to frontend
- [x] `write_audit_event()` is called before every MCP tool execution
- [x] PII scan on tool call arguments (non-blocking warning on detection)
- [x] stdio transport rejects relative paths; never uses `sh -c`
- [x] All existing tests continue to pass (185 Rust, 94 Vitest)
- [x] Zero clippy warnings; zero TypeScript errors
---
## Work Implemented
### Backend (Rust)
| Phase | Files | Description |
|-------|-------|-------------|
| 0 | `Cargo.toml` | Added `rmcp = "1.7.0"` with client + transport features; version → 0.3.0 |
| 1 | `db/migrations.rs` | Migration 018: `mcp_servers`, `mcp_tools`, `mcp_resources` tables with CHECK constraints |
| 2a | `mcp/models.rs`, `mcp/store.rs` | Data types; full CRUD with encrypted auth storage |
| 2b | `mcp/transport/stdio.rs`, `mcp/transport/http.rs` | Transport builders for subprocess and Streamable HTTP |
| 2c | `mcp/client.rs` | `McpConnection` type alias; connect/list/call wrappers |
| 2d | `mcp/adapter.rs` | `sanitize_name`, `build_tool_key`, `mcp_tools_to_ai_tools`, `get_enabled_mcp_tools` |
| 2e | `mcp/discovery.rs` | `discover_server`, `init_all_servers` |
| 2f | `mcp/commands.rs`, `state.rs`, `lib.rs` | 8 Tauri commands; `mcp_connections` field on `AppState`; `.setup()` hook |
| 5 | `ai/tools.rs`, `commands/ai.rs` | `get_enabled_mcp_tools` async helper; `execute_mcp_tool_call` with PII scan + audit |
### Frontend (TypeScript / React)
| Phase | Files | Description |
|-------|-------|-------------|
| 3 | `src/lib/tauriCommands.ts` | `McpServer`, `McpTool`, `McpResource`, `McpServerStatus`, request types; 8 command wrappers |
| 4 | `src/pages/Settings/MCPServers.tsx` | Full settings page: server list, status badges, Discover Now, Add/Edit modal |
| 4 | `src/App.tsx` | Added `Plug` icon, `/settings/mcp` route and nav entry |
### Wiki
- `docs/wiki/MCP-Servers.md` — new
- `docs/wiki/Database.md` — migration 018 documented
- `docs/wiki/IPC-Commands.md` — 8 new commands
- `docs/wiki/Security-Model.md` — MCP security section
---
## Testing Needed
### Automated (all passing)
- Rust: 185 tests (64 existing + 5 migration 018 + 5 store + 3 adapter + 5 migration idempotency + misc)
- Vitest: 94 tests (all existing + 3 new MCP frontend tests)
- `cargo clippy -- -D warnings`: zero warnings
- `npx tsc --noEmit`: zero errors
### Manual verification checklist
- [ ] Add an HTTP MCP server → click Discover Now → tools appear in list
- [ ] Add a stdio MCP server → Discover Now → process spawns, tools appear
- [ ] Disable a server → its tools absent from next triage chat session
- [ ] Start a triage chat → MCP tools visible in AI tool suggestions
- [ ] AI calls an MCP tool → audit log entry written in Security page
- [ ] Delete a server → live connection removed, tools gone from next session
- [ ] Enter an invalid command path (relative) for stdio → error shown in UI
### Branch
`feature/mcp-server-support`