8.0 KiB
MCP Configuration UI Improvements - Design Document
Date: 2025-10-26 Status: Implemented Author: Design brainstorming session
Overview
Improve the MCP configuration UI in the Obsidian plugin settings to make it easier for users to configure different MCP clients. The current configuration is nested under Authentication and only shows a single Windsurf example. This design adds tab-based navigation to show client-specific configurations that are complete and ready to copy with a single click.
Goals
- Ease of use: Single-click copy of complete, ready-to-paste configurations
- Multi-client support: Provide configurations for Windsurf and Claude Code
- Clear guidance: Show file location and usage instructions inline
- Better organization: Combine Authentication and MCP Configuration into one collapsible section without nesting
Success Criteria
- Each config is complete with API key and port pre-populated
- One-click copy button for immediate paste into the client's config location
- Clear indication of where each config should be pasted
- Tab interface allows easy switching between client configs
Design
Overall Structure
Current state: MCP Configuration is nested inside Authentication (settings.ts:204-255)
New structure:
Settings Page
├── Server Status (unchanged)
├── Auto-start setting (unchanged)
├── Port setting (unchanged)
├── Authentication & Configuration ← Renamed from "Authentication"
│ ├── API Key Management (unchanged)
│ ├── MCP Client Configuration ← No longer nested, same level as API Key
│ │ ├── Tab: Windsurf
│ │ └── Tab: Claude Code
└── UI Notifications (unchanged)
Key changes:
- Rename "Authentication" section to "Authentication & Configuration"
- Remove the nested
<details>element for "MCP Client Configuration" - Place "MCP Client Configuration" at the same level as "API Key Management"
- Add tab interface to switch between client configs
Tab Interface Design
Visual structure:
┌─────────────────────────────────────────────────┐
│ [Windsurf] [Claude Code] │ ← Tab buttons
├─────────────────────────────────────────────────┤
│ Configuration file location: │
│ ~/.windsurf/config.json │ ← File path
│ │
│ [📋 Copy Configuration] │ ← Copy button
│ │
│ ┌─────────────────────────────────────────────┐│
│ │ { ││
│ │ "mcpServers": { ││
│ │ "obsidian": { ... } ││ ← JSON config
│ │ } ││
│ │ } ││
│ └─────────────────────────────────────────────┘│
│ │
│ After copying, paste into the config file │ ← Usage note
│ and restart the MCP client. │
└─────────────────────────────────────────────────┘
Tab switching:
- Button-based tabs (not native
<details>elements) - Only one tab's content visible at a time
- Active tab gets visual highlight (background color + border)
- Clicking a tab switches the displayed configuration
Content for each tab:
- Configuration file location path
- Copy button
- Complete JSON configuration (pre-formatted, monospace)
- Brief usage note
Client-Specific Configurations
1. Windsurf Tab
File location: ~/.windsurf/config.json
Configuration:
{
"mcpServers": {
"obsidian": {
"serverUrl": "http://127.0.0.1:3000/mcp",
"headers": {
"Authorization": "Bearer <actual-api-key>"
}
}
}
}
Usage note: "After copying, paste into the config file and restart Windsurf."
Dynamic values:
- Port:
this.plugin.settings.port - API Key:
this.plugin.settings.apiKey
2. Claude Code Tab
File location: ~/.claude.json
Configuration:
{
"mcpServers": {
"obsidian": {
"type": "http",
"url": "http://127.0.0.1:3000/mcp",
"headers": {
"Authorization": "Bearer <actual-api-key>"
}
}
}
}
Usage note: "After copying, paste into the config file and restart Claude Code."
Dynamic values:
- Port:
this.plugin.settings.port - API Key:
this.plugin.settings.apiKey
Key difference from Windsurf:
- Adds
"type": "http"field - Uses same URL format as Windsurf
Note on Claude Desktop
Claude Desktop configuration is omitted for now as it has not been tested with HTTP transport.
Implementation Details
HTML/CSS Structure
Tab buttons:
- Container with
display: flexfor horizontal layout - Active tab styling: distinct background + border-bottom
- Inactive tabs: subtle hover effect
- Consistent spacing and padding
Content area:
- Consistent padding and background color
- File path in monospace font with muted color
- Pre-formatted text block for JSON with syntax preservation
- Copy button with icon for clear affordance
Component State
Tab state management:
- Add
activeConfigTabproperty toMCPServerSettingTabclass - Type:
'windsurf' | 'claude-code' - Default:
'windsurf' - No need to persist in settings (ephemeral UI state)
Rendering strategy:
- Re-render only the config content area when tab changes
- Keep tab buttons static
- Avoid full page re-render for tab switches
Configuration Generation
Helper method:
generateConfigForClient(client: 'windsurf' | 'claude-code'): {
filePath: string;
config: object;
usageNote: string;
}
Returns:
filePath: Configuration file location for the clientconfig: Complete JSON configuration objectusageNote: Brief usage instructions
Dynamic interpolation:
- API key from
this.plugin.settings.apiKey - Port from
this.plugin.settings.port - Generated at render time to always reflect current settings
Migration Notes
Code Changes in settings.ts
-
Line 146-153: Rename section
- Change "Authentication" to "Authentication & Configuration"
-
Line 204-211: Remove nested details
- Remove the
<details>wrapper for "MCP Client Configuration" - Keep "MCP Client Configuration" as a heading/label
- Remove the
-
Line 213-255: Replace single config with tabs
- Remove current single Windsurf config display
- Add tab button container
- Add tab content rendering logic
- Implement tab switching
-
Add helper method:
generateConfigForClient()- Generate client-specific configurations
- Return structured data for rendering
-
Add state property:
activeConfigTab- Track which tab is selected
- Default to 'windsurf'
Backward Compatibility
- No breaking changes to settings structure
- No changes to stored settings (API key, port, etc.)
- Only UI presentation changes
Testing Considerations
- Verify both tab configs copy correctly to clipboard
- Test with different API keys and ports
- Ensure tab switching works smoothly
- Verify JSON formatting is preserved in clipboard
- Test that configs work when pasted into actual client config files
Future Enhancements
- Add Claude Desktop configuration once HTTP transport is tested
- Add validation to check if config files exist
- Add "Open config file" button that launches the file in system editor
- Add config file templates for other MCP clients
- Show detected MCP clients on the system