docs: revise v2 specs based on PR feedback
Address reviewer feedback from cliffhall, pcarleton, KKonstantinov, mattzcarey: v2_ux.md changes: - Add Server Settings Modal for per-server config (headers, metadata, timeouts, OAuth) - Add Clone button to Server Card Actions - Add OAuth Debugger section for debugging auth flows - Change Resources Screen from resizable panes to accordion pattern - Update Logging Screen to all 8 RFC 5424 levels with distinct colors - Clarify Browse button as local file picker - Expand JSON-RPC Tester to support all methods with custom headers - Add multi-select support for anyOf/oneOf enums in Form Generation v2_tech_stack.md changes: - Select Hono over Express based on community consensus - Add Hono Rationale section with comparison table 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
79b5e9fdd3
commit
b66b674430
2 changed files with 416 additions and 80 deletions
|
|
@ -29,9 +29,34 @@ Let's choose a feature-rich component set with easy theming control
|
||||||
|
|
||||||
### Transport Operation
|
### Transport Operation
|
||||||
Let's consider how to operate the server transports.
|
Let's consider how to operate the server transports.
|
||||||
* -[x] [Express](https://expressjs.com/)
|
* -[x] [Hono](https://hono.dev/)
|
||||||
|
* -[ ] [Express](https://expressjs.com/)
|
||||||
* -[ ] Node:[http](https://nodejs.org/docs/v22.18.0/api/http.html)
|
* -[ ] Node:[http](https://nodejs.org/docs/v22.18.0/api/http.html)
|
||||||
|
|
||||||
|
#### Hono Rationale
|
||||||
|
|
||||||
|
Hono is selected based on community consensus (PR #945 discussion) for alignment with modern web standards and the TypeScript SDK v2 direction.
|
||||||
|
|
||||||
|
**Why Hono over Express:**
|
||||||
|
|
||||||
|
| Requirement | Hono | Express |
|
||||||
|
|-------------|------|---------|
|
||||||
|
| Bundle size | 12kb | ~1mb |
|
||||||
|
| Web Standards (Request/Response) | Yes - Native | No - Shimmed |
|
||||||
|
| TypeScript native | Yes | No - @types package |
|
||||||
|
| Tree-shakable | Yes - Fully | No |
|
||||||
|
| HTTP/2 support | Yes | No (SPDY dropped) |
|
||||||
|
| Built-in middleware | Yes - Body parsing, auth, etc. | No - Requires plugins |
|
||||||
|
| Edge/serverless deployment | Yes - Native | Partial - Requires adapters |
|
||||||
|
|
||||||
|
**Benefits:**
|
||||||
|
|
||||||
|
1. **Web Standards Alignment** - Uses native `Request`/`Response` objects, enabling deployment across Node, Deno, Bun, serverless, and edge environments
|
||||||
|
2. **TypeScript Native** - Full type safety without external type packages, no monkey-patching of request objects
|
||||||
|
3. **Future-proofing** - HTTP/2 support enables potential gRPC transport; aligns with TypeScript SDK v2 plans
|
||||||
|
4. **Developer Experience** - Simpler API, type-safe context, smaller learning curve
|
||||||
|
5. **Bundle Efficiency** - Dramatically smaller footprint benefits both development and deployment
|
||||||
|
|
||||||
### Logging
|
### Logging
|
||||||
Let's step up our logging capability with an advanced logger:
|
Let's step up our logging capability with an advanced logger:
|
||||||
* -[ ] [Winston](https://github.com/winstonjs/winston?tab=readme-ov-file#winston)
|
* -[ ] [Winston](https://github.com/winstonjs/winston?tab=readme-ov-file#winston)
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,10 @@
|
||||||
* [Screen Flows](#screen-flows)
|
* [Screen Flows](#screen-flows)
|
||||||
* [Server List (Home)](#server-list-home)
|
* [Server List (Home)](#server-list-home)
|
||||||
* [Server Connection Card](#server-connection-card)
|
* [Server Connection Card](#server-connection-card)
|
||||||
|
* [Server Settings Modal](#server-settings-modal)
|
||||||
* [Import server.json Modal](#import-serverjson-modal)
|
* [Import server.json Modal](#import-serverjson-modal)
|
||||||
* [Server Info (Connected)](#server-info-connected)
|
* [Server Info (Connected)](#server-info-connected)
|
||||||
|
* [OAuth Debugger](#oauth-debugger)
|
||||||
* [Feature Screens](#feature-screens)
|
* [Feature Screens](#feature-screens)
|
||||||
* [Tools Screen](#tools-screen)
|
* [Tools Screen](#tools-screen)
|
||||||
* [Resources Screen](#resources-screen)
|
* [Resources Screen](#resources-screen)
|
||||||
|
|
@ -128,9 +130,106 @@ Each server in the list is displayed as a card with connection controls and stat
|
||||||
- **Toggle switch** - Connect/disconnect the server
|
- **Toggle switch** - Connect/disconnect the server
|
||||||
- **Copy** - Copy command/URL to clipboard
|
- **Copy** - Copy command/URL to clipboard
|
||||||
- **Server Info** - Opens server info modal
|
- **Server Info** - Opens server info modal
|
||||||
|
- **Settings** - Opens server settings modal (see below)
|
||||||
|
- **Clone** - Duplicates server config for creating variants
|
||||||
- **Edit** - Opens edit server modal
|
- **Edit** - Opens edit server modal
|
||||||
- **Remove** - Deletes server (with confirmation)
|
- **Remove** - Deletes server (with confirmation)
|
||||||
|
|
||||||
|
### Server Settings Modal
|
||||||
|
|
||||||
|
Per-server configuration for connection behavior, headers, metadata, timeouts, and OAuth credentials.
|
||||||
|
|
||||||
|
```
|
||||||
|
+---------------------------------------------------------------------------+
|
||||||
|
| Server Settings: my-server [x] |
|
||||||
|
+---------------------------------------------------------------------------+
|
||||||
|
| |
|
||||||
|
| Connection Mode |
|
||||||
|
| +-----------------------------------------------------------------------+ |
|
||||||
|
| | Via Proxy v | |
|
||||||
|
| +-----------------------------------------------------------------------+ |
|
||||||
|
| Direct - Connect directly to server (requires CORS support) |
|
||||||
|
| Via Proxy - Route through inspector proxy (required for STDIO) |
|
||||||
|
| |
|
||||||
|
| ---------------------------------------------------------------------------
|
||||||
|
| |
|
||||||
|
| Custom Headers |
|
||||||
|
| +-----------------------------------------------------------------------+ |
|
||||||
|
| | Authorization | Bearer sk-... [Remove]| |
|
||||||
|
| | X-Custom-Header | custom-value [Remove]| |
|
||||||
|
| +-----------------------------------------------------------------------+ |
|
||||||
|
| [+ Add Header] |
|
||||||
|
| |
|
||||||
|
| ---------------------------------------------------------------------------
|
||||||
|
| |
|
||||||
|
| Request Metadata |
|
||||||
|
| Metadata sent with every MCP request to this server. |
|
||||||
|
| +-----------------------------------------------------------------------+ |
|
||||||
|
| | session_id | abc123 [Remove]| |
|
||||||
|
| +-----------------------------------------------------------------------+ |
|
||||||
|
| [+ Add Metadata] |
|
||||||
|
| |
|
||||||
|
| ---------------------------------------------------------------------------
|
||||||
|
| |
|
||||||
|
| Timeouts |
|
||||||
|
| +-----------------------------------+-----------------------------------+ |
|
||||||
|
| | Connection Timeout | Request Timeout | |
|
||||||
|
| | +-----------------------------+ | +-----------------------------+ | |
|
||||||
|
| | | 30000 ms| | | 60000 ms| | |
|
||||||
|
| | +-----------------------------+ | +-----------------------------+ | |
|
||||||
|
| +-----------------------------------+-----------------------------------+ |
|
||||||
|
| |
|
||||||
|
| ---------------------------------------------------------------------------
|
||||||
|
| |
|
||||||
|
| OAuth Settings (for servers requiring authentication) |
|
||||||
|
| +-----------------------------------------------------------------------+ |
|
||||||
|
| | Client ID | |
|
||||||
|
| | +-------------------------------------------------------------------+ | |
|
||||||
|
| | | my-client-id | | |
|
||||||
|
| | +-------------------------------------------------------------------+ | |
|
||||||
|
| | | |
|
||||||
|
| | Client Secret | |
|
||||||
|
| | +-------------------------------------------------------------------+ | |
|
||||||
|
| | | ******** [Show/Hide] | | |
|
||||||
|
| | +-------------------------------------------------------------------+ | |
|
||||||
|
| | | |
|
||||||
|
| | Scopes | |
|
||||||
|
| | +-------------------------------------------------------------------+ | |
|
||||||
|
| | | read write profile | | |
|
||||||
|
| | +-------------------------------------------------------------------+ | |
|
||||||
|
| +-----------------------------------------------------------------------+ |
|
||||||
|
| |
|
||||||
|
| [Cancel] [Save Settings] |
|
||||||
|
+---------------------------------------------------------------------------+
|
||||||
|
```
|
||||||
|
|
||||||
|
**Connection Mode:**
|
||||||
|
- **Direct** - Browser connects directly to server (requires server to have CORS headers)
|
||||||
|
- **Via Proxy** - Route through inspector proxy (required for STDIO transport, useful for CORS-restricted servers)
|
||||||
|
|
||||||
|
**Custom Headers:**
|
||||||
|
- Key-value pairs sent with every HTTP request to this server
|
||||||
|
- Useful for API keys, authorization tokens, custom routing
|
||||||
|
|
||||||
|
**Request Metadata:**
|
||||||
|
- Data included in `_meta` field of every MCP request
|
||||||
|
- Per-server isolation (previously stored globally in localStorage)
|
||||||
|
|
||||||
|
**Timeouts:**
|
||||||
|
- **Connection Timeout** - Max time to establish connection (ms)
|
||||||
|
- **Request Timeout** - Max time for individual requests (ms)
|
||||||
|
|
||||||
|
**OAuth Settings:**
|
||||||
|
- Pre-configure OAuth credentials for servers requiring authentication
|
||||||
|
- Client ID and Client Secret for OAuth 2.0 flows
|
||||||
|
- Scopes to request during authorization
|
||||||
|
|
||||||
|
**Clone Functionality:**
|
||||||
|
The [Clone] button on the server card creates a duplicate configuration, enabling:
|
||||||
|
- Testing same server with different headers/metadata
|
||||||
|
- Comparing behavior with different timeout settings
|
||||||
|
- Maintaining separate OAuth credentials for different environments
|
||||||
|
|
||||||
### Import server.json Modal
|
### Import server.json Modal
|
||||||
|
|
||||||
Support for importing MCP Registry `server.json` format for testing servers before publishing.
|
Support for importing MCP Registry `server.json` format for testing servers before publishing.
|
||||||
|
|
@ -201,6 +300,11 @@ Support for importing MCP Registry `server.json` format for testing servers befo
|
||||||
└─────────────────────────────────────────────────────────────────────────────┘
|
└─────────────────────────────────────────────────────────────────────────────┘
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Browse Button:**
|
||||||
|
- Opens native file picker to select a local `server.json` file
|
||||||
|
- Supports `.json` file filter
|
||||||
|
- Note: Registry browser may be added as future enhancement or plugin
|
||||||
|
|
||||||
**Schema Validation:**
|
**Schema Validation:**
|
||||||
- Validate against official MCP Registry schema
|
- Validate against official MCP Registry schema
|
||||||
- Show validation errors inline with line numbers
|
- Show validation errors inline with line numbers
|
||||||
|
|
@ -289,6 +393,108 @@ Shown as a modal or dedicated screen after successful connection.
|
||||||
- Display server instructions if provided
|
- Display server instructions if provided
|
||||||
- Show OAuth tokens with copy and JWT decode options
|
- Show OAuth tokens with copy and JWT decode options
|
||||||
|
|
||||||
|
### OAuth Debugger
|
||||||
|
|
||||||
|
Accessed via [OAuth Debug] button on the server card (visible when server uses OAuth).
|
||||||
|
|
||||||
|
```
|
||||||
|
+---------------------------------------------------------------------------+
|
||||||
|
| OAuth Debugger: my-server [x] |
|
||||||
|
+---------------------------------------------------------------------------+
|
||||||
|
| |
|
||||||
|
| OAuth Flow Status |
|
||||||
|
| +-----------------------------------------------------------------------+ |
|
||||||
|
| | Step 1: Authorization Request [Completed] | |
|
||||||
|
| | +-------------------------------------------------------------------+ | |
|
||||||
|
| | | GET https://auth.example.com/authorize | | |
|
||||||
|
| | | ?client_id=my-client-id | | |
|
||||||
|
| | | &redirect_uri=http://localhost:5173/callback | | |
|
||||||
|
| | | &response_type=code | | |
|
||||||
|
| | | &scope=read%20write | | |
|
||||||
|
| | | &state=abc123 | | |
|
||||||
|
| | +-------------------------------------------------------------------+ | |
|
||||||
|
| | [Copy URL] | |
|
||||||
|
| +-----------------------------------------------------------------------+ |
|
||||||
|
| |
|
||||||
|
| +-----------------------------------------------------------------------+ |
|
||||||
|
| | Step 2: Authorization Code [Completed] | |
|
||||||
|
| | +-------------------------------------------------------------------+ | |
|
||||||
|
| | | code: xyz789... | | |
|
||||||
|
| | | state: abc123 (verified) | | |
|
||||||
|
| | +-------------------------------------------------------------------+ | |
|
||||||
|
| +-----------------------------------------------------------------------+ |
|
||||||
|
| |
|
||||||
|
| +-----------------------------------------------------------------------+ |
|
||||||
|
| | Step 3: Token Exchange [Completed] | |
|
||||||
|
| | +-------------------------------------------------------------------+ | |
|
||||||
|
| | | POST https://auth.example.com/token | | |
|
||||||
|
| | | grant_type=authorization_code&code=xyz789... | | |
|
||||||
|
| | +-------------------------------------------------------------------+ | |
|
||||||
|
| +-----------------------------------------------------------------------+ |
|
||||||
|
| |
|
||||||
|
| +-----------------------------------------------------------------------+ |
|
||||||
|
| | Step 4: Access Token [Active] | |
|
||||||
|
| | +-------------------------------------------------------------------+ | |
|
||||||
|
| | | access_token: eyJhbG... [Copy] [Decode] | | |
|
||||||
|
| | | token_type: Bearer | | |
|
||||||
|
| | | expires_in: 3600 (expires at 15:32:00) | | |
|
||||||
|
| | | scope: read write | | |
|
||||||
|
| | +-------------------------------------------------------------------+ | |
|
||||||
|
| +-----------------------------------------------------------------------+ |
|
||||||
|
| |
|
||||||
|
| +-----------------------------------------------------------------------+ |
|
||||||
|
| | Refresh Token | |
|
||||||
|
| | +-------------------------------------------------------------------+ | |
|
||||||
|
| | | refresh_token: def456... [Copy] | | |
|
||||||
|
| | +-------------------------------------------------------------------+ | |
|
||||||
|
| | [Test Refresh Now] | |
|
||||||
|
| +-----------------------------------------------------------------------+ |
|
||||||
|
| |
|
||||||
|
| ---------------------------------------------------------------------------
|
||||||
|
| |
|
||||||
|
| Decoded Access Token (JWT) |
|
||||||
|
| +-----------------------------------------------------------------------+ |
|
||||||
|
| | Header: | |
|
||||||
|
| | { "alg": "RS256", "typ": "JWT" } | |
|
||||||
|
| | | |
|
||||||
|
| | Payload: | |
|
||||||
|
| | { | |
|
||||||
|
| | "sub": "user123", | |
|
||||||
|
| | "aud": "my-client-id", | |
|
||||||
|
| | "scope": "read write", | |
|
||||||
|
| | "exp": 1732990800, | |
|
||||||
|
| | "iat": 1732987200 | |
|
||||||
|
| | } | |
|
||||||
|
| +-----------------------------------------------------------------------+ |
|
||||||
|
| |
|
||||||
|
| [Revoke Token] [Start New Flow] |
|
||||||
|
+---------------------------------------------------------------------------+
|
||||||
|
```
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- **Flow Visualization** - Step-by-step view of OAuth 2.0 flow
|
||||||
|
- Authorization request URL with all parameters
|
||||||
|
- Authorization code received
|
||||||
|
- Token exchange request/response
|
||||||
|
- Access token details
|
||||||
|
- **Token Display:**
|
||||||
|
- Access token with copy and decode options
|
||||||
|
- Token type and expiration time
|
||||||
|
- Refresh token (if available)
|
||||||
|
- Decoded JWT payload and header
|
||||||
|
- **Actions:**
|
||||||
|
- [Test Refresh Now] - Manually trigger token refresh
|
||||||
|
- [Revoke Token] - Revoke current access token
|
||||||
|
- [Start New Flow] - Begin fresh OAuth flow
|
||||||
|
- [Copy] - Copy tokens/URLs to clipboard
|
||||||
|
- [Decode] - Show JWT contents
|
||||||
|
|
||||||
|
**Use Cases:**
|
||||||
|
1. Debugging OAuth configuration issues
|
||||||
|
2. Verifying token claims and scopes
|
||||||
|
3. Testing token refresh behavior
|
||||||
|
4. Understanding the full OAuth handshake
|
||||||
|
|
||||||
### Feature Screens
|
### Feature Screens
|
||||||
|
|
||||||
Each feature screen uses a **resizable panel layout** for flexibility.
|
Each feature screen uses a **resizable panel layout** for flexibility.
|
||||||
|
|
@ -354,43 +560,76 @@ Each feature screen uses a **resizable panel layout** for flexibility.
|
||||||
|
|
||||||
#### Resources Screen
|
#### Resources Screen
|
||||||
|
|
||||||
|
Uses an **accordion layout** for the left panel to organize Resources, Templates, and Subscriptions into collapsible sections.
|
||||||
|
|
||||||
```
|
```
|
||||||
┌─────────────────────────┬─────────────────────────────────────────────────┐
|
┌────────────────────────────────┬────────────────────────────────────────────┐
|
||||||
│ Resources (12) │ Content Preview (65%) │
|
│ Resources │ Content Preview (65%) │
|
||||||
│ ● List updated │ │
|
│ ● List updated [Refresh Now] │ │
|
||||||
│ [Refresh Now] │ │
|
├────────────────────────────────┼────────────────────────────────────────────┤
|
||||||
├─────────────────────────┼─────────────────────────────────────────────────┤
|
│ │ │
|
||||||
│ │ │
|
│ [Search...] │ URI: file:///config.json │
|
||||||
│ [Search...] │ URI: file:///config.json │
|
│ │ MIME: application/json │
|
||||||
│ │ MIME: application/json │
|
│ [v] Resources (12) │ ───────────────────────────── │
|
||||||
│ ● config.json │ ───────────────────────────── │
|
│ ├─────────────────────────────┐│ │
|
||||||
│ [application] │ │
|
│ │ ● config.json ││ Annotations: │
|
||||||
│ [priority: 0.9] │ Annotations: │
|
│ │ [application] ││ Audience: application │
|
||||||
│ │ Audience: application │
|
│ │ [priority: 0.9] ││ Priority: 0.9 (high) │
|
||||||
│ ○ readme.md │ Priority: 0.9 (high) │
|
│ │ ││ │
|
||||||
│ [user] │ │
|
│ │ ○ readme.md ││ { │
|
||||||
│ │ { │
|
│ │ [user] ││ "name": "my-app", │
|
||||||
│ ○ data.csv │ "name": "my-app", │
|
│ │ ││ "version": "1.0.0" │
|
||||||
│ │ "version": "1.0.0" │
|
│ │ ○ data.csv ││ } │
|
||||||
│ Templates: │ } │
|
│ │ ○ schema.json ││ │
|
||||||
│ ○ user/{id} │ │
|
│ │ ... (8 more) ││ [Copy] [Subscribe] [Unsubscribe] │
|
||||||
│ [id: ________ ] [Go] │ [Copy] [Subscribe] [Unsubscribe] │
|
│ └─────────────────────────────┘│ │
|
||||||
│ │ │
|
│ │ Last updated: 14:32:05 │
|
||||||
│ Subscriptions: │ Last updated: 14:32:05 │
|
│ [>] Templates (2) │ │
|
||||||
│ ● config.json (active) │ │
|
│ │ │
|
||||||
│ │ │
|
│ [>] Subscriptions (1) │ │
|
||||||
└─────────────────────────┴─────────────────────────────────────────────────┘
|
│ │ │
|
||||||
|
└────────────────────────────────┴────────────────────────────────────────────┘
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Expanded Templates Section:**
|
||||||
|
```
|
||||||
|
│ [v] Templates (2) │
|
||||||
|
│ ├─────────────────────────────┐│
|
||||||
|
│ │ ○ user/{id} ││
|
||||||
|
│ │ [id: ________ ] [Go] ││
|
||||||
|
│ │ ││
|
||||||
|
│ │ ○ file/{path} ││
|
||||||
|
│ │ [path: _______ ] [Go] ││
|
||||||
|
│ └─────────────────────────────┘│
|
||||||
|
```
|
||||||
|
|
||||||
|
**Expanded Subscriptions Section:**
|
||||||
|
```
|
||||||
|
│ [v] Subscriptions (1) │
|
||||||
|
│ ├─────────────────────────────┐│
|
||||||
|
│ │ ● config.json ││
|
||||||
|
│ │ Last update: 14:32:05 ││
|
||||||
|
│ │ [Unsub] ││
|
||||||
|
│ └─────────────────────────────┘│
|
||||||
|
```
|
||||||
|
|
||||||
|
**Accordion Behavior:**
|
||||||
|
- Sections expand/collapse independently by clicking header
|
||||||
|
- [v] indicates expanded section, [>] indicates collapsed
|
||||||
|
- Empty sections show "(0)" count and collapse by default
|
||||||
|
- If only Resources exist, that section expands by default
|
||||||
|
- Search filters across all sections simultaneously
|
||||||
|
|
||||||
**Features:**
|
**Features:**
|
||||||
- **List Changed Indicator** - Shows when `notifications/resources/list_changed` received
|
- **List Changed Indicator** - Shows when `notifications/resources/list_changed` received
|
||||||
- List resources with pagination
|
- **Accordion Layout** - Collapsible sections for Resources, Templates, Subscriptions
|
||||||
|
- List resources with pagination within each section
|
||||||
- **Resource Annotations** displayed:
|
- **Resource Annotations** displayed:
|
||||||
- Audience badge ([user], [application/assistant])
|
- Audience badge ([user], [application/assistant])
|
||||||
- Priority indicator ([high], [medium], [low])
|
- Priority indicator ([high], [medium], [low])
|
||||||
- Resource templates with inline variable input
|
- Resource templates with inline variable input and [Go] button
|
||||||
- Subscribe/unsubscribe to resource updates
|
- Subscribe/unsubscribe to resource updates
|
||||||
- **Subscriptions Panel** shows active subscriptions with last update time
|
- **Subscriptions Section** shows active subscriptions with last update time
|
||||||
- Content viewer (JSON, text, binary preview)
|
- Content viewer (JSON, text, binary preview)
|
||||||
- Image preview for image resources
|
- Image preview for image resources
|
||||||
- Audio player for audio resources
|
- Audio player for audio resources
|
||||||
|
|
@ -447,31 +686,35 @@ Each feature screen uses a **resizable panel layout** for flexibility.
|
||||||
#### Logging Screen
|
#### Logging Screen
|
||||||
|
|
||||||
```
|
```
|
||||||
┌──────────────────────┬──────────────────────────────────────────────────┐
|
┌───────────────────────┬─────────────────────────────────────────────────────┐
|
||||||
│ Log Controls (25%) │ Log Stream (75%) │
|
│ Log Controls (25%) │ Log Stream (75%) │
|
||||||
│ ↔ resize │ │
|
│ ↔ resize │ │
|
||||||
├──────────────────────┼──────────────────────────────────────────────────┤
|
├───────────────────────┼─────────────────────────────────────────────────────┤
|
||||||
│ │ │
|
│ │ │
|
||||||
│ Log Level: │ 14:32:01 [INFO] Server initialized │
|
│ Log Level: │ 14:32:01 [INFO] Server initialized │
|
||||||
│ ┌────────────────┐ │ 14:32:02 [DEBUG] Loading tool: echo │
|
│ ┌─────────────────┐ │ 14:32:02 [DEBUG] Loading tool: echo │
|
||||||
│ │ debug ▼ │ │ 14:32:02 [DEBUG] Loading tool: add │
|
│ │ debug ▼ │ │ 14:32:02 [DEBUG] Loading tool: add │
|
||||||
│ └────────────────┘ │ 14:32:05 [WARN] Rate limit approaching │
|
│ └─────────────────┘ │ 14:32:03 [NOTICE] Configuration loaded │
|
||||||
│ │ 14:32:10 [ERROR] Failed to fetch resource: 404 │
|
│ │ 14:32:05 [WARNING] Rate limit approaching │
|
||||||
│ [Set Level] │ │
|
│ [Set Level] │ 14:32:10 [ERROR] Failed to fetch resource: 404 │
|
||||||
│ │ ───────────────────────────────────────────── │
|
│ │ 14:32:15 [CRITICAL] Database connection lost │
|
||||||
│ Filter: │ │
|
│ Filter: │ 14:32:16 [ALERT] Service degraded │
|
||||||
│ ┌────────────────┐ │ │
|
│ ┌─────────────────┐ │ 14:32:20 [EMERGENCY] System failure │
|
||||||
│ │ │ │ │
|
│ │ │ │ │
|
||||||
│ └────────────────┘ │ │
|
│ └─────────────────┘ │ ───────────────────────────────────────────────── │
|
||||||
│ │ │
|
│ │ │
|
||||||
│ Show Levels: │ │
|
│ Show Levels: │ │
|
||||||
│ ☑ DEBUG │ │
|
│ ☑ DEBUG │ │
|
||||||
│ ☑ INFO │ │
|
│ ☑ INFO │ │
|
||||||
│ ☑ WARNING │ │
|
│ ☑ NOTICE │ │
|
||||||
│ ☑ ERROR │ │
|
│ ☑ WARNING │ │
|
||||||
│ │ │
|
│ ☑ ERROR │ │
|
||||||
│ [Clear] [Export] │ [Auto-scroll ✓] [Copy All] │
|
│ ☑ CRITICAL │ │
|
||||||
└──────────────────────┴──────────────────────────────────────────────────┘
|
│ ☑ ALERT │ │
|
||||||
|
│ ☑ EMERGENCY │ │
|
||||||
|
│ │ │
|
||||||
|
│ [Clear] [Export] │ [Auto-scroll ✓] [Copy All] │
|
||||||
|
└───────────────────────┴─────────────────────────────────────────────────────┘
|
||||||
```
|
```
|
||||||
|
|
||||||
**Features:**
|
**Features:**
|
||||||
|
|
@ -479,12 +722,20 @@ Each feature screen uses a **resizable panel layout** for flexibility.
|
||||||
- Options: debug, info, notice, warning, error, critical, alert, emergency
|
- Options: debug, info, notice, warning, error, critical, alert, emergency
|
||||||
- **Real-time Log Stream** from `notifications/message`
|
- **Real-time Log Stream** from `notifications/message`
|
||||||
- Filter by text search
|
- Filter by text search
|
||||||
- Filter by log level checkboxes
|
- Filter by log level checkboxes (all 8 RFC 5424 levels)
|
||||||
- Color-coded by severity:
|
- **Color-coded by severity** (8 distinct visual treatments):
|
||||||
- DEBUG: gray
|
|
||||||
- INFO: blue
|
| Level | Color | Style |
|
||||||
- WARNING: yellow
|
|-------|-------|-------|
|
||||||
- ERROR: red
|
| DEBUG | Gray | Normal |
|
||||||
|
| INFO | Blue | Normal |
|
||||||
|
| NOTICE | Cyan | Normal |
|
||||||
|
| WARNING | Yellow | Normal |
|
||||||
|
| ERROR | Red | Normal |
|
||||||
|
| CRITICAL | Red | Bold |
|
||||||
|
| ALERT | Magenta | Bold |
|
||||||
|
| EMERGENCY | White on Red | Background highlight |
|
||||||
|
|
||||||
- Timestamp display
|
- Timestamp display
|
||||||
- Logger name display (if provided)
|
- Logger name display (if provided)
|
||||||
- Auto-scroll toggle
|
- Auto-scroll toggle
|
||||||
|
|
@ -846,7 +1097,7 @@ Accessed via Settings or dedicated nav item:
|
||||||
|
|
||||||
```
|
```
|
||||||
┌─────────────────────────────────────────────────────────────────────────┐
|
┌─────────────────────────────────────────────────────────────────────────┐
|
||||||
│ Experimental Features │
|
│ Experimental Features & Advanced Testing │
|
||||||
├─────────────────────────────────────────────────────────────────────────┤
|
├─────────────────────────────────────────────────────────────────────────┤
|
||||||
│ │
|
│ │
|
||||||
│ WARNING: These features are non-standard and may change or be removed. │
|
│ WARNING: These features are non-standard and may change or be removed. │
|
||||||
|
|
@ -873,18 +1124,30 @@ Accessed via Settings or dedicated nav item:
|
||||||
│ │
|
│ │
|
||||||
│ ───────────────────────────────────────────────────────────────────── │
|
│ ───────────────────────────────────────────────────────────────────── │
|
||||||
│ │
|
│ │
|
||||||
│ Raw JSON-RPC Tester: │
|
│ Advanced JSON-RPC Tester │
|
||||||
|
│ Send raw JSON-RPC requests to test ANY method (standard or experimental)│
|
||||||
|
│ │
|
||||||
|
│ Custom Headers (optional): │
|
||||||
|
│ ┌─────────────────────────────────────────────────────────────────────┐ │
|
||||||
|
│ │ X-Debug-Mode | true [Remove] │ │
|
||||||
|
│ │ X-Request-ID | test-123 [Remove] │ │
|
||||||
|
│ └─────────────────────────────────────────────────────────────────────┘ │
|
||||||
|
│ [+ Add Header] │
|
||||||
|
│ │
|
||||||
|
│ Request: │
|
||||||
│ ┌─────────────────────────────────────────────────────────────────────┐ │
|
│ ┌─────────────────────────────────────────────────────────────────────┐ │
|
||||||
│ │ { │ │
|
│ │ { │ │
|
||||||
│ │ "jsonrpc": "2.0", │ │
|
│ │ "jsonrpc": "2.0", │ │
|
||||||
│ │ "id": 1, │ │
|
│ │ "id": 1, │ │
|
||||||
│ │ "method": "experimental/myMethod", │ │
|
│ │ "method": "tools/call", │ │
|
||||||
│ │ "params": { │ │
|
│ │ "params": { │ │
|
||||||
│ │ "key": "value" │ │
|
│ │ "name": "echo", │ │
|
||||||
|
│ │ "arguments": { "message": "test" }, │ │
|
||||||
|
│ │ "_meta": { "progressToken": "abc123" } │ │
|
||||||
│ │ } │ │
|
│ │ } │ │
|
||||||
│ │ } │ │
|
│ │ } │ │
|
||||||
│ └─────────────────────────────────────────────────────────────────────┘ │
|
│ └─────────────────────────────────────────────────────────────────────┘ │
|
||||||
│ [Send Request] │
|
│ [Load from History ▼] [Send Request] │
|
||||||
│ │
|
│ │
|
||||||
│ Response: │
|
│ Response: │
|
||||||
│ ┌─────────────────────────────────────────────────────────────────────┐ │
|
│ ┌─────────────────────────────────────────────────────────────────────┐ │
|
||||||
|
|
@ -892,15 +1155,16 @@ Accessed via Settings or dedicated nav item:
|
||||||
│ │ "jsonrpc": "2.0", │ │
|
│ │ "jsonrpc": "2.0", │ │
|
||||||
│ │ "id": 1, │ │
|
│ │ "id": 1, │ │
|
||||||
│ │ "result": { │ │
|
│ │ "result": { │ │
|
||||||
│ │ "status": "success" │ │
|
│ │ "content": [{ "type": "text", "text": "test" }] │ │
|
||||||
│ │ } │ │
|
│ │ } │ │
|
||||||
│ │ } │ │
|
│ │ } │ │
|
||||||
│ └─────────────────────────────────────────────────────────────────────┘ │
|
│ └─────────────────────────────────────────────────────────────────────┘ │
|
||||||
|
│ [Copy] │
|
||||||
│ │
|
│ │
|
||||||
│ Request History: │
|
│ Request History: │
|
||||||
│ 14:32:05 - experimental/myMethod (success) │
|
│ 14:32:05 - tools/call (success) 45ms │
|
||||||
│ 14:31:22 - analytics/track (success) │
|
│ 14:31:22 - resources/list (success) 12ms │
|
||||||
│ 14:30:01 - stream/start (error) │
|
│ 14:30:01 - experimental/myMethod (error) 200ms │
|
||||||
│ │
|
│ │
|
||||||
└─────────────────────────────────────────────────────────────────────────┘
|
└─────────────────────────────────────────────────────────────────────────┘
|
||||||
```
|
```
|
||||||
|
|
@ -909,14 +1173,20 @@ Accessed via Settings or dedicated nav item:
|
||||||
- Display server's experimental capabilities from initialization
|
- Display server's experimental capabilities from initialization
|
||||||
- Toggle client experimental capabilities to advertise
|
- Toggle client experimental capabilities to advertise
|
||||||
- Add custom client experimental capabilities
|
- Add custom client experimental capabilities
|
||||||
- **Raw JSON-RPC Tester:**
|
- **Advanced JSON-RPC Tester:**
|
||||||
- JSON editor for arbitrary requests
|
- Test ANY JSON-RPC method (not just experimental)
|
||||||
- Send button
|
- **Custom headers** for per-request header injection
|
||||||
- Response display
|
- JSON editor with syntax highlighting
|
||||||
- Syntax highlighting
|
- Full control over `_meta` and `progressToken` fields
|
||||||
- Request history with timestamps and status
|
- [Load from History] to replay previous requests
|
||||||
- Test experimental methods directly
|
- Response display with copy button
|
||||||
- View raw request/response for debugging
|
- Request history with method, status, and duration
|
||||||
|
- **Use Cases:**
|
||||||
|
- Testing server behavior with invalid parameters
|
||||||
|
- Debugging SDK message formatting (see full request/response)
|
||||||
|
- Verifying `_meta`/`progressToken` handling
|
||||||
|
- Testing experimental methods before SDK support
|
||||||
|
- Comparing behavior across different servers
|
||||||
|
|
||||||
## Form Generation
|
## Form Generation
|
||||||
|
|
||||||
|
|
@ -927,23 +1197,64 @@ Forms are dynamically generated from JSON Schema for tool inputs, prompt argumen
|
||||||
|------------------|--------------|
|
|------------------|--------------|
|
||||||
| `string` | Text input |
|
| `string` | Text input |
|
||||||
| `string` (enum) | Select dropdown |
|
| `string` (enum) | Select dropdown |
|
||||||
|
| `string` (enum with `oneOf`) | Select dropdown with titles |
|
||||||
|
| `array` (enum items with `anyOf`) | Multi-select dropdown or checkboxes |
|
||||||
| `string` (format: uri) | URL input with validation |
|
| `string` (format: uri) | URL input with validation |
|
||||||
| `number` / `integer` | Number input |
|
| `number` / `integer` | Number input |
|
||||||
| `boolean` | Checkbox or toggle |
|
| `boolean` | Checkbox or toggle |
|
||||||
| `array` | Dynamic list with add/remove |
|
| `array` | Dynamic list with add/remove |
|
||||||
| `object` | Nested fieldset |
|
| `object` | Nested fieldset |
|
||||||
|
|
||||||
|
**Enum Handling (Single and Multi-select):**
|
||||||
|
|
||||||
|
The MCP 2025-11-25 spec supports titled enums using `oneOf`/`anyOf`:
|
||||||
|
|
||||||
|
```json
|
||||||
|
// Single-select enum (oneOf) - renders as dropdown
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"oneOf": [
|
||||||
|
{ "const": "small", "title": "Small (1-10 items)" },
|
||||||
|
{ "const": "medium", "title": "Medium (11-100 items)" },
|
||||||
|
{ "const": "large", "title": "Large (100+ items)" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Multi-select enum (anyOf with array) - renders as multi-select or checkboxes
|
||||||
|
{
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"anyOf": [
|
||||||
|
{ "const": "read", "title": "Read access" },
|
||||||
|
{ "const": "write", "title": "Write access" },
|
||||||
|
{ "const": "delete", "title": "Delete access" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
| Pattern | Form Control |
|
||||||
|
|---------|--------------|
|
||||||
|
| `oneOf` with `const` values | Single-select dropdown with titles |
|
||||||
|
| `anyOf` with `const` values in array items | Multi-select dropdown or checkboxes |
|
||||||
|
| Legacy `enum` array | Single-select dropdown (no titles) |
|
||||||
|
|
||||||
|
Note: For Shadcn, multi-select requires a third-party component (e.g., [shadcn-multi-select](https://shadcn-multi-select-component.vercel.app/)). Mantine has built-in `MultiSelect`.
|
||||||
|
|
||||||
**Schema Features:**
|
**Schema Features:**
|
||||||
- `required` - Mark fields as required (*)
|
- `required` - Mark fields as required (*)
|
||||||
- `default` - Pre-fill with default value
|
- `default` - Pre-fill with default value
|
||||||
- `description` - Show as helper text
|
- `description` - Show as helper text
|
||||||
|
- `title` - Display label (used in `oneOf`/`anyOf` for enum titles)
|
||||||
- `enum` - Render as select dropdown
|
- `enum` - Render as select dropdown
|
||||||
- `minimum` / `maximum` - Validation for numbers
|
- `minimum` / `maximum` - Validation for numbers
|
||||||
- `minLength` / `maxLength` - Validation for strings
|
- `minLength` / `maxLength` - Validation for strings
|
||||||
|
|
||||||
**Fallback:**
|
**Complex Schema Handling:**
|
||||||
- For complex schemas (`anyOf`, `oneOf`, `$ref`), show JSON editor as fallback
|
- `$ref` - Resolve references and render inline (when possible)
|
||||||
- Toggle between form view and JSON editor
|
- `anyOf` / `oneOf` (non-enum) - Show JSON editor as fallback
|
||||||
|
- Toggle between form view and JSON editor for complex cases
|
||||||
|
|
||||||
## Error Handling UX
|
## Error Handling UX
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue