Break up v2_ux.md (1400+ lines) into smaller, focused documents: - v2_ux.md - Core UX (overview, server list, modals) - v2_ux_features.md - Feature screens (Tools, Resources, etc.) - v2_ux_handlers.md - Client handlers, form generation, errors - v2_screenshots.md - Visual reference with Shadcn prototype screenshots Add screenshots from Shadcn prototype to specification/screenshots/. Update navigation headers across all spec files. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
7.5 KiB
Inspector V2 Tech Stack
Brief | V1 Problems | V2 Scope | V2 Tech Stack
UX: Overview | Features | Handlers | Screenshots
Table of Contents
Web Client
Language and Framework
- Typescript
- React
Components and Theme
Let's choose a feature-rich component set with easy theming control
Shadcn Rationale
Shadcn is recommended based on evaluation of both prototype implementations (v2/prototype/shadcn and v2/prototype/mantine).
Why Shadcn over Mantine:
| Requirement | Shadcn | Mantine |
|---|---|---|
| Component ownership | Yes - Copy to codebase | No - npm dependency |
| Styling approach | Tailwind CSS | CSS-in-JS (emotion) |
| Bundle size | Minimal - Only used components | Larger - Full library |
| Customization | Full control - Edit source directly | Theme config only |
| Dark mode | CSS variables | Context provider |
Benefits:
-
Component Ownership - Components are copied into your project, not installed as dependencies. This means:
- More control over implementation details
- Easier to modify for project-specific needs
-
Tailwind CSS Integration:
- Theme customization via CSS variables
- Smaller production bundles (unused styles purged)
-
Simpler Theme Architecture - CSS variables for theming:
- Light/dark mode via CSS class toggle
- Easy to extend with custom color schemes
- Works seamlessly with Tailwind
-
Developer Experience from Prototype:
- Faster iteration when modifying components
- More readable component code
- Easier debugging (source is in your project)
Tradeoffs:
- Initial setup - Requires adding components individually (vs Mantine's single install)
- Less "batteries included" - Some advanced features need additional work (e.g., date pickers, rich text)
- Documentation - Mantine has more extensive API docs for each prop
Prototype Comparison:
Both prototypes implement the same V2 UX spec. Key observations:
| Aspect | Shadcn Prototype | Mantine Prototype |
|---|---|---|
| Code clarity | Component code visible in project | Abstracted in node_modules |
| Theme toggle | CSS class swap | useMantineColorScheme hook |
| Custom styling | Add Tailwind classes directly | Override with sx prop or styles API |
| Component modification | Edit the file | Create wrapper or fork |
Proxy Server
Language and Runtime
- Typescript
- Node
Transport Operation
Let's consider how to operate the server transports.
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:
- Web Standards Alignment - Uses native
Request/Responseobjects, enabling deployment across Node, Deno, Bun, serverless, and edge environments - TypeScript Native - Full type safety without external type packages, no monkey-patching of request objects
- Future-proofing - HTTP/2 support enables potential gRPC transport; aligns with TypeScript SDK v2 plans
- Developer Experience - Simpler API, type-safe context, smaller learning curve
- Bundle Efficiency - Dramatically smaller footprint benefits both development and deployment
Logging
Let's step up our logging capability with an advanced logger:
Pino Rationale
Pino is selected for synergy with the History Screen feature. The log file serves dual purposes:
- Server diagnostics - Standard application logging
- History persistence - Request/response replay source
Why Pino over Winston:
| Requirement | Pino | Winston |
|---|---|---|
| Default JSON format | Yes - NDJSON | No - Text (needs config) |
| Line-by-line parsing | Yes - Native | No - Extra work |
| High-throughput logging | Yes - Very fast | Partial - Slower |
| Log rotation | Yes - pino-roll | Yes - winston-daily-rotate |
| Dev-friendly output | Yes - pino-pretty | Yes - Built-in |
Architecture:
┌─────────────────────────────────────────────────────────────────┐
│ Proxy Server │
│ │
│ MCP Request ──▶ Pino Logger ──┬──▶ history.ndjson (file) │
│ │ │
│ └──▶ Console (pino-pretty) │
│ │
│ History API: GET /api/history?method=tools/call&limit=50 │
│ (parses history.ndjson, returns filtered JSON) │
└─────────────────────────────────────────────────────────────────┘
Log Entry Schema:
Each MCP operation logs a request/response pair:
{"ts":1732987200000,"level":"info","type":"mcp_request","method":"tools/call","target":"echo","params":{"message":"hello"},"requestId":"abc123","serverId":"my-server"}
{"ts":1732987200045,"level":"info","type":"mcp_response","requestId":"abc123","result":{"content":[{"type":"text","text":"hello"}]},"duration":45,"success":true}
Schema fields:
| Field | Description |
|---|---|
ts |
Unix timestamp (ms) |
level |
Log level (info, error) |
type |
mcp_request or mcp_response |
method |
MCP method (tools/call, resources/read, prompts/get, etc.) |
target |
Tool name, resource URI, or prompt name |
params |
Request parameters |
requestId |
Correlation ID linking request to response |
serverId |
Server identifier |
result |
Response data (for mcp_response) |
error |
Error message (for failed requests) |
duration |
Response time in ms |
success |
Boolean success indicator |
Dependencies:
pino- Core loggerpino-pretty- Dev console formattingpino-roll- Log rotation (optional)pino-http- Express integration