tftsr-devops_investigation/MCP_SERVER_SUPPORT.md

85 lines
3.9 KiB
Markdown
Raw Permalink Normal View History

# 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`