spec: Add client features UX patterns (sampling/elicitation) (#1011)
Updates UX specs for better integration of client-initiated features: v2_ux_features.md: - Tools Screen: Inline client request queue during tool execution - History Screen: Hierarchical request trace showing parent-child relationships - Logging Screen: Request correlation with correlation IDs and chain filtering v2_ux_handlers.md: - Sampling Panel: Inline expansion pattern + tool calling flow (2025-11-25 spec) - Elicitation Handler: Inline expansion pattern with schema constraints - Sampling Providers & Testing Profiles: Extensible architecture for response handlers Key design decisions: - Request Trace Model shows causal chains between requests - Client requests appear inline with triggering tool calls - Auto-response profiles enable efficient testing workflows - Extensible provider architecture supports future LLM plugins 🤖 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
0ec2c24cbb
commit
39d923387d
3 changed files with 1492 additions and 461 deletions
File diff suppressed because it is too large
Load diff
|
|
@ -49,6 +49,44 @@ Each feature screen uses a **resizable panel layout** for flexibility.
|
|||
+---------------------+--------------------------------------+------------------------+
|
||||
```
|
||||
|
||||
**With Pending Client Requests (inline expansion):**
|
||||
|
||||
When a tool execution triggers sampling or elicitation requests, they appear inline:
|
||||
|
||||
```
|
||||
+---------------------+--------------------------------------------------------------+
|
||||
| Tools (4) | Tool: query_database [Executing...] |
|
||||
| +--------------------------------------------------------------+
|
||||
| [Search...] | Parameters: { "table": "users", "limit": 10 } |
|
||||
| +--------------------------------------------------------------+
|
||||
| (*) query_db | [!] Pending Client Requests (2) |
|
||||
| ( ) echo | |
|
||||
| ( ) add | +----------------------------------------------------------+ |
|
||||
| ( ) longOp | | sampling/createMessage [1 of 2] | |
|
||||
| | | Model hints: claude-3-sonnet | |
|
||||
| | | Messages: "Analyze this database schema..." | |
|
||||
| | | | |
|
||||
| | | Response: [Testing Profile: Quick Mock] | |
|
||||
| | | +------------------------------------------------------+ | |
|
||||
| | | | This is a mock LLM response for testing purposes. | | |
|
||||
| | | +------------------------------------------------------+ | |
|
||||
| | | | |
|
||||
| | | [Auto-respond] [Edit & Send] [Reject] | |
|
||||
| | +----------------------------------------------------------+ |
|
||||
| | |
|
||||
| | +----------------------------------------------------------+ |
|
||||
| | | elicitation/create (form) [2 of 2] | |
|
||||
| | | Message: "Please confirm the query parameters" | |
|
||||
| | | | |
|
||||
| | | table: [users ] limit: [10] [x] include_deleted | |
|
||||
| | | | |
|
||||
| | | [Cancel] [Submit] | |
|
||||
| | +----------------------------------------------------------+ |
|
||||
| | |
|
||||
| | [Cancel Tool] |
|
||||
+---------------------+--------------------------------------------------------------+
|
||||
```
|
||||
|
||||
**Features:**
|
||||
- **List Changed Indicator** - Shows when `notifications/tools/list_changed` received, with refresh button
|
||||
- Searchable/filterable tool list
|
||||
|
|
@ -72,6 +110,14 @@ Each feature screen uses a **resizable panel layout** for flexibility.
|
|||
- Elapsed time display
|
||||
- Execute button with loading state
|
||||
- **Cancel button** sends `notifications/cancelled`
|
||||
- **Inline Client Request Queue** - When tool triggers sampling/elicitation:
|
||||
- Pending requests shown inline (not as separate modal)
|
||||
- Queue counter shows total pending requests
|
||||
- Each request shows type, summary, and response options
|
||||
- **Auto-respond** button uses active Testing Profile
|
||||
- **Edit & Send** allows modifying response before sending
|
||||
- Requests processed in order, tool execution resumes after all resolved
|
||||
- Visible connection between tool call and its triggered requests
|
||||
- **Rich Result Display**:
|
||||
- JSON/text with syntax highlighting
|
||||
- Image preview for image content (base64)
|
||||
|
|
@ -233,10 +279,39 @@ Uses an **accordion layout** for the left panel to organize Resources, Templates
|
|||
| [x] ALERT | |
|
||||
| [x] EMERGENCY | |
|
||||
| | |
|
||||
| Request Filter: | |
|
||||
| +-----------------+ | |
|
||||
| | All requests v | | |
|
||||
| +-----------------+ | |
|
||||
| | |
|
||||
| [Clear] [Export] | [Auto-scroll] [Copy All] |
|
||||
+-----------------------+-----------------------------------------------------+
|
||||
```
|
||||
|
||||
**With Request Correlation:**
|
||||
|
||||
Logs can be filtered by the request that triggered them:
|
||||
|
||||
```
|
||||
+-----------------------+-----------------------------------------------------+
|
||||
| Log Controls (25%) | Log Stream (filtered by request) |
|
||||
+-----------------------+-----------------------------------------------------+
|
||||
| | |
|
||||
| Request Filter: | Showing logs for: tools/call (query_database) |
|
||||
| +-----------------+ | [View in History] |
|
||||
| | query_database | | ------------------------------------------------- |
|
||||
| | 14:32:10 v | | 14:32:10 [DEBUG] Starting query execution |
|
||||
| +-----------------+ | 14:32:11 [INFO] Requesting LLM analysis |
|
||||
| | 14:32:12 [DEBUG] Sampling response received |
|
||||
| Recent Requests: | 14:32:13 [WARNING] Query taking longer than usual |
|
||||
| ( ) query_database | 14:32:15 [INFO] Query completed, 42 rows |
|
||||
| ( ) analyze_data | |
|
||||
| ( ) prompts/get | |
|
||||
| | |
|
||||
| [Show All Logs] | [Auto-scroll] [Copy Filtered] |
|
||||
+-----------------------+-----------------------------------------------------+
|
||||
```
|
||||
|
||||
**Features:**
|
||||
- **Set Log Level** via `logging/setLevel` request
|
||||
- Options: debug, info, notice, warning, error, critical, alert, emergency
|
||||
|
|
@ -261,6 +336,12 @@ Uses an **accordion layout** for the left panel to organize Resources, Templates
|
|||
- Auto-scroll toggle
|
||||
- Export logs to file
|
||||
- Copy all logs to clipboard
|
||||
- **Request Correlation**:
|
||||
- Filter logs by request (shows logs emitted during a specific tool/resource/prompt call)
|
||||
- Recent requests dropdown shows last N requests
|
||||
- [View in History] link navigates to the request in History screen
|
||||
- Logs include correlation ID linking them to their parent request
|
||||
- Click any log entry to see which request chain it belongs to
|
||||
|
||||
## Tasks Screen
|
||||
|
||||
|
|
@ -314,46 +395,40 @@ Uses an **accordion layout** for the left panel to organize Resources, Templates
|
|||
|
||||
## History Screen
|
||||
|
||||
A unified history of all MCP requests with replay capability.
|
||||
A unified history of all MCP requests with **hierarchical request trace** capability. Shows parent-child relationships when tool calls trigger sampling or elicitation requests.
|
||||
|
||||
```
|
||||
+-------------------------------------------------------------------------------------+
|
||||
| History [Search...] [Filter v] [Clear All] |
|
||||
+-------------------------------------------------------------------------------------+
|
||||
| |
|
||||
| +---------------------------------------------------------------------------------+ |
|
||||
| | * 14:35:22 tools/call echo [Replay] [Pin] | |
|
||||
| | Parameters: { "message": "Hello world" } | |
|
||||
| | Result: Success (45ms) | |
|
||||
| | ------------------------------------------------------------------ | |
|
||||
| | Response: { "content": [{ "type": "text", "text": "Hello world" }] } | |
|
||||
| +---------------------------------------------------------------------------------+ |
|
||||
| [>] 14:35:22 tools/call query_database [success] 450ms [Replay] [Pin] |
|
||||
| +-- 14:35:23 sampling/createMessage claude-3-sonnet [+45ms] |
|
||||
| | Model: claude-3-sonnet-20241022 |
|
||||
| | Response: "Based on the schema, I recommend..." [Expand] |
|
||||
| +-- 14:35:24 sampling/createMessage gpt-4 [+120ms] |
|
||||
| | Model: gpt-4-turbo |
|
||||
| | Response: "The query should use an index..." [Expand] |
|
||||
| +-- 14:35:25 elicitation/create (form: confirm_action) [+200ms] |
|
||||
| User provided: { confirmed: true } |
|
||||
| |
|
||||
| +---------------------------------------------------------------------------------+ |
|
||||
| | 14:34:15 resources/read file:///config.json [Replay] [Pin] | |
|
||||
| | Result: Success (120ms) | |
|
||||
| | ------------------------------------------------------------------ | |
|
||||
| | Content: { "name": "my-app", "version": "1.0.0" } (collapsed) [Expand] | |
|
||||
| +---------------------------------------------------------------------------------+ |
|
||||
| [>] 14:34:15 resources/read file:///config.json [success] 120ms [Replay] [Pin] |
|
||||
| (no client requests) |
|
||||
| |
|
||||
| +---------------------------------------------------------------------------------+ |
|
||||
| | 14:33:45 prompts/get greeting_prompt [Replay] [Pin] | |
|
||||
| | Arguments: { "name": "John", "interests": "cats" } | |
|
||||
| | Result: Success (30ms) | |
|
||||
| +---------------------------------------------------------------------------------+ |
|
||||
| [>] 14:33:45 prompts/get greeting_prompt [success] 30ms [Replay] [Pin] |
|
||||
| Arguments: { "name": "John", "interests": "cats" } |
|
||||
| |
|
||||
| +---------------------------------------------------------------------------------+ |
|
||||
| | 14:32:10 tools/call query_database [Replay] [Pin] | |
|
||||
| | Parameters: { "table": "users", "limit": 10 } | |
|
||||
| | Result: [X] Error (200ms) | |
|
||||
| | ------------------------------------------------------------------ | |
|
||||
| | Error: "Table 'users' not found" | |
|
||||
| +---------------------------------------------------------------------------------+ |
|
||||
| [>] 14:32:10 tools/call analyze_data [success] 800ms [Replay] [Pin] |
|
||||
| +-- 14:32:11 sampling/createMessage claude-3-opus [+350ms] |
|
||||
| | Messages: "Analyze this dataset and identify..." |
|
||||
| | Response: "I've identified 3 key patterns..." [Expand] |
|
||||
| +-- 14:32:12 elicitation/create (url: oauth) [+400ms] |
|
||||
| Status: User completed OAuth flow |
|
||||
| |
|
||||
| Pinned Requests (2) |
|
||||
| +---------------------------------------------------------------------------------+ |
|
||||
| | * "Test echo" tools/call echo 14:35:22 [Replay] [Unpin] |
|
||||
| | * "Get config" resources/read file:///config.json 14:34:15 [Replay] [Unpin] |
|
||||
| | * "Test query" tools/call query_database 14:35:22 [Replay] [Unpin] | |
|
||||
| | * "Get config" resources/read config.json 14:34:15 [Replay] [Unpin] | |
|
||||
| +---------------------------------------------------------------------------------+ |
|
||||
| |
|
||||
| Showing 50 of 127 entries |
|
||||
|
|
@ -362,31 +437,46 @@ A unified history of all MCP requests with replay capability.
|
|||
```
|
||||
|
||||
**Features:**
|
||||
|
||||
- **Request Trace** - Hierarchical view showing causal relationships:
|
||||
- Top-level requests (tools/call, resources/read, prompts/get) shown as parent nodes
|
||||
- Client requests (sampling, elicitation) shown as nested children with timing offset
|
||||
- Expandable/collapsible tree structure
|
||||
- Visual connector lines showing the chain
|
||||
- **Correlation ID** links related requests together
|
||||
|
||||
- **Automatic Capture** - All MCP requests/responses logged automatically:
|
||||
- `tools/call` - Tool invocations
|
||||
- `resources/read` - Resource reads
|
||||
- `prompts/get` - Prompt retrievals
|
||||
- `sampling/createMessage` - Sampling requests/responses
|
||||
- `elicitation/create` - Elicitation requests/responses
|
||||
- `tools/call` - Tool invocations (parent)
|
||||
- `resources/read` - Resource reads (parent)
|
||||
- `prompts/get` - Prompt retrievals (parent)
|
||||
- `sampling/createMessage` - Sampling requests (child, nested under triggering request)
|
||||
- `elicitation/create` - Elicitation requests (child, nested under triggering request)
|
||||
|
||||
- **Request Details** displayed:
|
||||
- Timestamp
|
||||
- Timestamp (absolute for parents, relative offset for children)
|
||||
- Method name
|
||||
- Target (tool name, resource URI, prompt name)
|
||||
- Target (tool name, resource URI, prompt name, model hint)
|
||||
- Parameters/arguments
|
||||
- Result status (success/error)
|
||||
- Response time
|
||||
- Total response time (for parents), offset time (for children)
|
||||
- Response data (collapsible)
|
||||
|
||||
- **Replay** - Re-execute any request with original parameters:
|
||||
- Opens relevant screen (Tools, Resources, Prompts) pre-filled
|
||||
- Option to modify parameters before replay
|
||||
- Replaying a parent re-executes the full chain
|
||||
|
||||
- **Pin/Save** - Pin important requests for quick access:
|
||||
- Pinned requests persist across sessions
|
||||
- Optional custom label for pinned items
|
||||
- Pinned section at bottom for easy access
|
||||
|
||||
- **Filter** by:
|
||||
- Method type (tools, resources, prompts, sampling, elicitation)
|
||||
- Status (success, error)
|
||||
- Time range
|
||||
- Show/hide child requests (flatten view)
|
||||
|
||||
- **Search** across method names, parameters, and responses
|
||||
- **Pagination** - Load more for large histories
|
||||
- **Clear** - Clear history (with confirmation)
|
||||
|
|
@ -397,4 +487,4 @@ A unified history of all MCP requests with replay capability.
|
|||
2. Inspector navigates to the appropriate screen (Tools, Resources, Prompts)
|
||||
3. Form is pre-filled with the original parameters
|
||||
4. User can modify parameters or execute immediately
|
||||
5. New request is added to history
|
||||
5. New request is added to history (with any triggered client requests nested)
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@
|
|||
* [Elicitation Handler](#elicitation-handler)
|
||||
* [Roots Configuration](#roots-configuration)
|
||||
* [Experimental Features Panel](#experimental-features-panel)
|
||||
* [Sampling Providers & Testing Profiles](#sampling-providers--testing-profiles)
|
||||
* [Form Generation](#form-generation)
|
||||
* [Error Handling UX](#error-handling-ux)
|
||||
|
||||
|
|
@ -20,7 +21,53 @@ These are modals/panels that appear when the server invokes client capabilities.
|
|||
|
||||
### Sampling Panel
|
||||
|
||||
When server sends `sampling/createMessage` request:
|
||||
Sampling requests appear in two contexts:
|
||||
|
||||
1. **Inline** - When triggered during tool execution (shown in Tools screen)
|
||||
2. **Modal** - For standalone testing or when triggered outside tool context
|
||||
|
||||
#### Inline Expansion (Primary)
|
||||
|
||||
When a tool call triggers a sampling request, it appears inline within the tool execution flow:
|
||||
|
||||
```
|
||||
+-------------------------------------------------------------------------+
|
||||
| Tool: query_database [Executing...] |
|
||||
+-------------------------------------------------------------------------+
|
||||
| Parameters: { "table": "users", "limit": 10 } |
|
||||
+-------------------------------------------------------------------------+
|
||||
| [!] Sampling Request [Profile: Quick Mock v] |
|
||||
| |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| | Model hints: claude-3-sonnet, gpt-4 | |
|
||||
| | Messages: "Analyze this database schema and recommend an index..." | |
|
||||
| | [View Details] | |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| |
|
||||
| Response: |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| | Based on the query patterns, I recommend creating a composite | |
|
||||
| | index on (user_id, created_at) for optimal performance... | |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| |
|
||||
| Model Used: [mock-model-1.0] Stop Reason: [end_turn v] |
|
||||
| |
|
||||
| [Auto-respond] [Edit & Send] [Reject] |
|
||||
+-------------------------------------------------------------------------+
|
||||
```
|
||||
|
||||
**Inline Features:**
|
||||
- Compact view showing essential info (model hints, message preview)
|
||||
- [View Details] expands to show full request (like modal view)
|
||||
- **Testing Profile** dropdown to quickly switch response behavior
|
||||
- **[Auto-respond]** uses active Testing Profile to generate response
|
||||
- **[Edit & Send]** allows modifying response before sending
|
||||
- **[Reject]** declines the sampling request
|
||||
- Response field pre-filled based on active Testing Profile
|
||||
|
||||
#### Modal View (Standalone Testing)
|
||||
|
||||
For testing sampling outside of tool execution, or when [View Details] is clicked:
|
||||
|
||||
```
|
||||
+-------------------------------------------------------------------------+
|
||||
|
|
@ -55,7 +102,9 @@ When server sends `sampling/createMessage` request:
|
|||
| |
|
||||
| ----------------------------------------------------------------------- |
|
||||
| |
|
||||
| Response (enter mock response or connect to LLM): |
|
||||
| Testing Profile: [Quick Mock v] [Edit Profiles] |
|
||||
| |
|
||||
| Response: |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| | Based on the data chart, I can see several key trends: | |
|
||||
| | | |
|
||||
|
|
@ -64,29 +113,210 @@ When server sends `sampling/createMessage` request:
|
|||
| | | |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| |
|
||||
| Model Used: ________________ Stop Reason: [end_turn v] |
|
||||
| Model Used: [mock-model-1.0] Stop Reason: [end_turn v] |
|
||||
| |
|
||||
| [Auto-respond] [Reject Request] [Send Response] |
|
||||
+-------------------------------------------------------------------------+
|
||||
```
|
||||
|
||||
**Modal Features:**
|
||||
- Display full sampling request details:
|
||||
- Messages with text, image, and audio content
|
||||
- Model hints and preferences (cost, speed, intelligence priorities)
|
||||
- Max tokens, stop sequences, temperature
|
||||
- Context inclusion settings
|
||||
- **Tools** and **toolChoice** (if provided) for tool-enabled sampling
|
||||
- **Testing Profile** selector with [Edit Profiles] link
|
||||
- **[Auto-respond]** generates response from active profile
|
||||
- **Editable response field** for mock LLM testing
|
||||
- Model and stop reason fields for response
|
||||
- **Approve/Reject** with human-in-the-loop
|
||||
- Image/audio preview in messages
|
||||
- Integration with Testing Profiles (see below)
|
||||
|
||||
#### Sampling with Tool Calling (2025-11-25)
|
||||
|
||||
Sampling requests can include `tools` and `toolChoice` parameters, enabling multi-turn agentic loops where the LLM can request tool execution.
|
||||
|
||||
**Request with Tools:**
|
||||
|
||||
```
|
||||
+-------------------------------------------------------------------------+
|
||||
| Sampling Request (with tools) [x] |
|
||||
+-------------------------------------------------------------------------+
|
||||
| |
|
||||
| Messages: |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| | [0] role: user | |
|
||||
| | "What's the weather in Paris and London?" | |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| |
|
||||
| Available Tools (2): |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| | get_weather | |
|
||||
| | Get current weather for a city | |
|
||||
| | Parameters: { city: string } | |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| | get_forecast | |
|
||||
| | Get 5-day forecast for a city | |
|
||||
| | Parameters: { city: string, days: number } | |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| |
|
||||
| Tool Choice: [auto v] (auto | none | required | specific tool) |
|
||||
| |
|
||||
+-------------------------------------------------------------------------+
|
||||
```
|
||||
|
||||
**Response with Tool Use:**
|
||||
|
||||
When the LLM wants to call tools, the response includes `stopReason: "toolUse"`:
|
||||
|
||||
```
|
||||
+-------------------------------------------------------------------------+
|
||||
| Sampling Response |
|
||||
+-------------------------------------------------------------------------+
|
||||
| |
|
||||
| Response Content: |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| | I'll check the weather for both cities. | |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| |
|
||||
| Tool Calls Requested: |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| | [1] get_weather({ "city": "Paris" }) | |
|
||||
| | [2] get_weather({ "city": "London" }) | |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| |
|
||||
| Model Used: [claude-3-sonnet] Stop Reason: [toolUse] |
|
||||
| |
|
||||
| [!] Server must execute tools and send follow-up sampling request |
|
||||
| |
|
||||
| [Reject Request] [Send Response] |
|
||||
+-------------------------------------------------------------------------+
|
||||
```
|
||||
|
||||
**Features:**
|
||||
- Display full sampling request details:
|
||||
- Messages with text, image, and audio content
|
||||
- Model hints and preferences
|
||||
- Max tokens, stop sequences, temperature
|
||||
- Context inclusion settings
|
||||
- **Editable response field** for mock LLM testing
|
||||
- Model and stop reason fields for response
|
||||
- **Approve/Reject** with human-in-the-loop
|
||||
- Image/audio preview in messages
|
||||
- Option to integrate with real LLM (deferred to plugins)
|
||||
**Multi-Turn Tool Loop Flow:**
|
||||
|
||||
```
|
||||
Server Client (Inspector)
|
||||
| |
|
||||
| sampling/createMessage (with tools) |
|
||||
|--------------------------------------->|
|
||||
| | [User reviews request]
|
||||
| | [User approves/provides response]
|
||||
| Response (stopReason: toolUse) |
|
||||
|<---------------------------------------|
|
||||
| |
|
||||
| [Server executes requested tools] |
|
||||
| |
|
||||
| sampling/createMessage |
|
||||
| (history + tool_results + tools) |
|
||||
|--------------------------------------->|
|
||||
| | [User reviews continuation]
|
||||
| Response (stopReason: endTurn) |
|
||||
|<---------------------------------------|
|
||||
| |
|
||||
| [Server processes final response] |
|
||||
```
|
||||
|
||||
**Tool Results in Follow-up Request:**
|
||||
|
||||
The server sends tool results back in a continuation request:
|
||||
|
||||
```
|
||||
+-------------------------------------------------------------------------+
|
||||
| Sampling Request (continuation with tool results) [x] |
|
||||
+-------------------------------------------------------------------------+
|
||||
| |
|
||||
| Messages: |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| | [0] role: user | |
|
||||
| | "What's the weather in Paris and London?" | |
|
||||
| | | |
|
||||
| | [1] role: assistant | |
|
||||
| | "I'll check the weather for both cities." | |
|
||||
| | Tool calls: get_weather(Paris), get_weather(London) | |
|
||||
| | | |
|
||||
| | [2] role: user (tool_result) | |
|
||||
| | get_weather(Paris): { "temp": 18, "conditions": "Sunny" } | |
|
||||
| | get_weather(London): { "temp": 14, "conditions": "Cloudy" } | |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| |
|
||||
| Available Tools (2): [same as before] |
|
||||
| |
|
||||
+-------------------------------------------------------------------------+
|
||||
```
|
||||
|
||||
**History View:**
|
||||
|
||||
The History screen shows the complete tool loop as a nested chain:
|
||||
|
||||
```
|
||||
[>] 14:35:22 tools/call weather_report [success] 2.5s [Replay]
|
||||
+-- 14:35:23 sampling/createMessage (with tools) [+100ms]
|
||||
| Response: toolUse - get_weather(Paris), get_weather(London)
|
||||
+-- 14:35:24 [tool execution: get_weather x2] [+500ms]
|
||||
+-- 14:35:25 sampling/createMessage (continuation) [+1.2s]
|
||||
| Response: "Paris is 18C and sunny, London is 14C and cloudy"
|
||||
```
|
||||
|
||||
### Elicitation Handler
|
||||
|
||||
When server sends `elicitation/create` request:
|
||||
Elicitation requests appear in two contexts:
|
||||
|
||||
**Form Mode:**
|
||||
1. **Inline** - When triggered during tool execution (shown in Tools screen)
|
||||
2. **Modal** - For standalone testing or when triggered outside tool context
|
||||
|
||||
#### Inline Expansion (Form Mode)
|
||||
|
||||
When a tool call triggers a form elicitation, it appears inline:
|
||||
|
||||
```
|
||||
+-------------------------------------------------------------------------+
|
||||
| Tool: process_data [Executing...] |
|
||||
+-------------------------------------------------------------------------+
|
||||
| Parameters: { "dataset": "quarterly_sales" } |
|
||||
+-------------------------------------------------------------------------+
|
||||
| [!] Elicitation Request (form) |
|
||||
| |
|
||||
| "Please confirm the data processing parameters." |
|
||||
| |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| | include_deleted: [ ] No output_format: [CSV v] | |
|
||||
| | date_range: [2024-01-01] to [2024-12-31] | |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| |
|
||||
| WARNING: Server "data-processor" is requesting this data. |
|
||||
| |
|
||||
| [Cancel] [Submit] |
|
||||
+-------------------------------------------------------------------------+
|
||||
```
|
||||
|
||||
#### Inline Expansion (URL Mode)
|
||||
|
||||
When a tool call triggers a URL elicitation:
|
||||
|
||||
```
|
||||
+-------------------------------------------------------------------------+
|
||||
| Tool: connect_oauth [Executing...] |
|
||||
+-------------------------------------------------------------------------+
|
||||
| Parameters: { "provider": "github" } |
|
||||
+-------------------------------------------------------------------------+
|
||||
| [!] Elicitation Request (external URL) |
|
||||
| |
|
||||
| "Please complete OAuth authorization." |
|
||||
| |
|
||||
| URL: https://github.com/login/oauth/authorize?... [Copy] [Open] |
|
||||
| |
|
||||
| Status: Waiting for completion... (spinning) |
|
||||
| |
|
||||
| [Cancel] |
|
||||
+-------------------------------------------------------------------------+
|
||||
```
|
||||
|
||||
#### Modal View - Form Mode
|
||||
|
||||
For standalone testing or expanded view:
|
||||
|
||||
```
|
||||
+-------------------------------------------------------------------------+
|
||||
|
|
@ -124,7 +354,7 @@ When server sends `elicitation/create` request:
|
|||
+-------------------------------------------------------------------------+
|
||||
```
|
||||
|
||||
**URL Mode:**
|
||||
#### Modal View - URL Mode
|
||||
|
||||
```
|
||||
+-------------------------------------------------------------------------+
|
||||
|
|
@ -158,12 +388,22 @@ When server sends `elicitation/create` request:
|
|||
```
|
||||
|
||||
**Features:**
|
||||
|
||||
- **Inline Display:**
|
||||
- Compact form showing essential fields
|
||||
- Integrated with tool execution flow
|
||||
- Clear connection between tool call and elicitation
|
||||
- Same submit/cancel behavior as modal
|
||||
|
||||
- **Form Mode:**
|
||||
- Generate form from JSON Schema in request
|
||||
- **Schema restriction:** Flat objects with primitive properties only (string, number, boolean, enum) - no nested objects or arrays
|
||||
- Validate input before submission
|
||||
- Required field indicators
|
||||
- Security warning with server name
|
||||
- Submit returns response to server
|
||||
- Response `action`: "accept" | "decline" | "cancel"
|
||||
|
||||
- **URL Mode:**
|
||||
- Display URL for user to visit
|
||||
- Copy URL button
|
||||
|
|
@ -171,6 +411,7 @@ When server sends `elicitation/create` request:
|
|||
- Waiting indicator until `notifications/elicitation/complete` received
|
||||
- Elicitation ID display
|
||||
- Domain verification warning
|
||||
|
||||
- **Cancel** sends declined response
|
||||
|
||||
### Roots Configuration
|
||||
|
|
@ -324,6 +565,124 @@ Accessed via Settings or dedicated nav item:
|
|||
- Testing experimental methods before SDK support
|
||||
- Comparing behavior across different servers
|
||||
|
||||
## Sampling Providers & Testing Profiles
|
||||
|
||||
Testing Profiles allow quick switching between different sampling response strategies.
|
||||
|
||||
### Architecture
|
||||
|
||||
```
|
||||
Sampling Providers (built-in for V2):
|
||||
+-- Manual - User types each response
|
||||
+-- Mock/Template - Auto-respond with preconfigured templates
|
||||
|
||||
Testing Profiles (saved configurations):
|
||||
+-- Profile selects a provider
|
||||
+-- Profile configures that provider's settings
|
||||
+-- Quick switch between profiles for different testing scenarios
|
||||
```
|
||||
|
||||
### Testing Profiles Settings
|
||||
|
||||
```
|
||||
+-------------------------------------------------------------------------+
|
||||
| Sampling Settings |
|
||||
+-------------------------------------------------------------------------+
|
||||
| |
|
||||
| Active Profile: [Quick Mock v] [+ New Profile] |
|
||||
| |
|
||||
| Saved Profiles: |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| | (*) Quick Mock | Mock, auto-respond, simple template | |
|
||||
| | ( ) Detailed Mock | Mock, model-specific templates | |
|
||||
| | ( ) Manual Review | Manual, no auto-respond | |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| [Edit Selected] [Delete] |
|
||||
| |
|
||||
+-------------------------------------------------------------------------+
|
||||
| Profile: Quick Mock [Editing] |
|
||||
+-------------------------------------------------------------------------+
|
||||
| |
|
||||
| Profile Name: [Quick Mock ] |
|
||||
| |
|
||||
| Provider: [Mock/Template v] |
|
||||
| |
|
||||
| [x] Auto-respond to sampling requests |
|
||||
| |
|
||||
| Default Response Template: |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| | This is a mock LLM response for testing purposes. | |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| |
|
||||
| Default Model: [mock-model-1.0 ] |
|
||||
| Default Stop Reason: [end_turn v] |
|
||||
| |
|
||||
| Model-Specific Overrides: [+ Add] |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| | Pattern | Response Template | Actions | |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| | claude-* | "I'll analyze this as Claude would..." | [Edit] | |
|
||||
| | gpt-* | "As an AI assistant, I can help..." | [Edit] | |
|
||||
| +---------------------------------------------------------------------+ |
|
||||
| |
|
||||
| [Save Profile] [Cancel] |
|
||||
+-------------------------------------------------------------------------+
|
||||
```
|
||||
|
||||
### Provider: Manual
|
||||
|
||||
User manually enters each sampling response:
|
||||
|
||||
- No auto-respond
|
||||
- Response field starts empty
|
||||
- User must type or paste response
|
||||
- Best for careful testing of specific responses
|
||||
|
||||
### Provider: Mock/Template
|
||||
|
||||
Automatically generates responses based on templates:
|
||||
|
||||
- **Auto-respond** enabled by default
|
||||
- Default template used for all requests (unless overridden)
|
||||
- **Model-specific overrides** match model hints with patterns:
|
||||
- `claude-*` matches any Claude model hint
|
||||
- `gpt-*` matches any GPT model hint
|
||||
- First matching pattern wins
|
||||
- Response pre-filled in UI (user can still edit before sending)
|
||||
|
||||
### Profile Switching
|
||||
|
||||
Profiles can be switched from:
|
||||
|
||||
1. **Sampling Settings** panel (global)
|
||||
2. **Inline sampling request** dropdown (per-request override)
|
||||
3. **Modal sampling view** dropdown
|
||||
|
||||
### Extension Points (Future)
|
||||
|
||||
The provider interface is designed for future plugin extensions:
|
||||
|
||||
```typescript
|
||||
interface SamplingProvider {
|
||||
name: string;
|
||||
description: string;
|
||||
configure(): ProviderConfig; // Returns config UI schema
|
||||
respond(request: SamplingRequest, config: ProviderConfig): Promise<SamplingResponse>;
|
||||
}
|
||||
```
|
||||
|
||||
**Built-in providers (V2):**
|
||||
- Manual
|
||||
- Mock/Template
|
||||
|
||||
**Future plugin examples:**
|
||||
- OpenAI Provider (forwards to OpenAI API)
|
||||
- Anthropic Provider (forwards to Claude API)
|
||||
- Ollama Provider (local LLM)
|
||||
- Custom Provider (user-defined handler)
|
||||
|
||||
When plugins are installed, they appear as additional provider options in the profile configuration.
|
||||
|
||||
## Form Generation
|
||||
|
||||
Forms are dynamically generated from JSON Schema for tool inputs, prompt arguments, and resource template variables.
|
||||
|
|
|
|||
Loading…
Reference in a new issue