@mcp-html-bridge/claude-skill 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/commands/mcp-render.md +40 -70
- package/dist/config-cmd.d.ts +10 -0
- package/dist/config-cmd.d.ts.map +1 -0
- package/dist/config-cmd.js +55 -0
- package/dist/config-cmd.js.map +1 -0
- package/dist/config.d.ts +27 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +54 -0
- package/dist/config.js.map +1 -0
- package/dist/index.js +28 -14
- package/dist/index.js.map +1 -1
- package/dist/render.d.ts +5 -2
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +52 -38
- package/dist/render.js.map +1 -1
- package/package.json +1 -1
package/commands/mcp-render.md
CHANGED
|
@@ -1,55 +1,33 @@
|
|
|
1
|
-
You are the rendering decision-maker for MCP tool results. You analyze data
|
|
1
|
+
You are the rendering decision-maker for MCP tool results. You analyze data and decide whether a GUI rendering would benefit the user — or if plain text is sufficient.
|
|
2
2
|
|
|
3
3
|
## Your Role
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
MCP-HTML-Bridge is a **generic MCP GUI wrapper**. It supports two rendering modes:
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
When the user asks to render MCP tool output (or you see tool results that would benefit from visualization), follow this process:
|
|
10
|
-
|
|
11
|
-
### Step 1: Understand the Data
|
|
7
|
+
1. **LLM-powered semantic rendering** — An LLM analyzes the JSON, understands what the data *means* (SVG, markdown, images, charts, code, etc.), and produces the best HTML visualization.
|
|
8
|
+
2. **Structural fallback** — When no LLM is configured, renders JSON mechanically (tables for arrays of objects, key-value pairs for flat objects, etc.)
|
|
12
9
|
|
|
13
|
-
|
|
14
|
-
- What does this data represent? (products, metrics, config, logs, comparison, narrative, error...)
|
|
15
|
-
- Who is the audience? (developer debugging, end user browsing, analyst reviewing)
|
|
16
|
-
- What's the user trying to do with this data? (compare, explore, overview, drill down)
|
|
10
|
+
## Decision Framework
|
|
17
11
|
|
|
18
|
-
### Step
|
|
12
|
+
### Step 1: Decide — GUI or Not?
|
|
19
13
|
|
|
20
14
|
**Skip GUI rendering when:**
|
|
21
15
|
- Data is a simple success/failure status or short message
|
|
22
16
|
- Data is a single scalar value or very small object (< 5 fields)
|
|
23
17
|
- The user is debugging and just wants to see raw JSON
|
|
24
18
|
- The data is an error response — just explain the error
|
|
25
|
-
- A text summary would be more helpful than a visual
|
|
26
19
|
|
|
27
20
|
**Use GUI rendering when:**
|
|
28
|
-
- Data has tabular structure
|
|
21
|
+
- Data has tabular structure, nested objects, or complex content
|
|
29
22
|
- There are many items to compare or browse
|
|
30
|
-
-
|
|
31
|
-
- The
|
|
32
|
-
- A form would help the user construct input for a tool
|
|
33
|
-
|
|
34
|
-
If you decide to skip GUI, just present the data as formatted text/table in your response. Say why you skipped visual rendering.
|
|
35
|
-
|
|
36
|
-
### Step 3: Choose a Renderer
|
|
23
|
+
- The data contains rich content (SVG, markdown, HTML, images, code)
|
|
24
|
+
- The user explicitly asks for a visual/HTML rendering
|
|
37
25
|
|
|
38
|
-
|
|
39
|
-
|---|---|---|
|
|
40
|
-
| `data-grid` | Tabular data where columns matter. Comparison tables, search results, inventory lists, leaderboards. | Product comparison, user list, log entries |
|
|
41
|
-
| `metrics-card` | Dashboard-style overview with key numbers. Small set of important KPIs. | Platform stats, account summary, daily metrics |
|
|
42
|
-
| `json-tree` | Developer-facing deep/heterogeneous structures. Config dumps, API responses, debug output. | Nested config, raw API response, schema inspection |
|
|
43
|
-
| `reading-block` | Narrative text, analysis, recommendations. Long-form content that needs formatting. | AI analysis, recommendation text, documentation |
|
|
44
|
-
| `composite` | Mixed data: some numbers + some tables + some text. The data has distinct semantic sections. | Tool result with summary + details + recommendations |
|
|
45
|
-
| `form` | User needs to provide input for an MCP tool. Use with `--schema`. | Tool input forms |
|
|
26
|
+
### Step 2: Render
|
|
46
27
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
### Step 4: Render
|
|
50
|
-
|
|
51
|
-
Write the JSON data to a temp file, then call the renderer with your explicit choice:
|
|
28
|
+
Write the JSON data to a temp file, then call the renderer.
|
|
52
29
|
|
|
30
|
+
**With LLM semantic rendering (recommended for rich data):**
|
|
53
31
|
```bash
|
|
54
32
|
cat <<'MCPJSON' > /tmp/mcp-render-input.json
|
|
55
33
|
<THE_JSON_DATA>
|
|
@@ -57,74 +35,66 @@ MCPJSON
|
|
|
57
35
|
|
|
58
36
|
mcp-html-skill render \
|
|
59
37
|
--data /tmp/mcp-render-input.json \
|
|
60
|
-
--renderer <your-choice> \
|
|
61
38
|
--title "<descriptive title>" \
|
|
62
|
-
--
|
|
39
|
+
--api-url "https://api.openai.com/v1" \
|
|
40
|
+
--api-key "$OPENAI_API_KEY" \
|
|
41
|
+
--model "gpt-4o-mini" \
|
|
42
|
+
--open
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**Without LLM (structural fallback):**
|
|
46
|
+
```bash
|
|
47
|
+
mcp-html-skill render \
|
|
48
|
+
--data /tmp/mcp-render-input.json \
|
|
49
|
+
--title "<descriptive title>" \
|
|
63
50
|
--open
|
|
64
51
|
```
|
|
65
52
|
|
|
66
|
-
For schema/form rendering
|
|
53
|
+
**For schema/form rendering:**
|
|
67
54
|
```bash
|
|
68
55
|
mcp-html-skill render \
|
|
69
56
|
--schema /tmp/mcp-schema.json \
|
|
70
57
|
--title "<title>" \
|
|
71
|
-
--tool-name "<tool_name>" \
|
|
72
58
|
--open
|
|
73
59
|
```
|
|
74
60
|
|
|
75
61
|
If `mcp-html-skill` is not in PATH:
|
|
76
62
|
```bash
|
|
77
|
-
npx @mcp-html-bridge/claude-skill render --data /tmp/mcp-render-input.json --
|
|
63
|
+
npx @mcp-html-bridge/claude-skill render --data /tmp/mcp-render-input.json --open
|
|
78
64
|
```
|
|
79
65
|
|
|
80
|
-
### Step
|
|
66
|
+
### Step 3: Explain
|
|
81
67
|
|
|
82
68
|
After rendering, briefly tell the user:
|
|
83
|
-
- What renderer you chose and why
|
|
84
69
|
- The file path (from command output)
|
|
85
70
|
- What they'll see when they open it
|
|
86
71
|
|
|
87
|
-
##
|
|
72
|
+
## LLM Providers
|
|
88
73
|
|
|
89
|
-
|
|
90
|
-
|---|---|---|---|
|
|
91
|
-
| `data-grid` | Yes | Yes (click headers) | Yes |
|
|
92
|
-
| `metrics-card` | Yes | No | Yes |
|
|
93
|
-
| `json-tree` | Yes | No (collapsible) | Yes |
|
|
94
|
-
| `reading-block` | Yes | No | Yes |
|
|
95
|
-
| `composite` | Yes | Mixed | Yes |
|
|
96
|
-
| `auto` | Yes | Depends | Yes |
|
|
74
|
+
The `--api-url` flag accepts any OpenAI-compatible endpoint:
|
|
97
75
|
|
|
98
|
-
|
|
76
|
+
| Provider | API URL |
|
|
77
|
+
|---|---|
|
|
78
|
+
| OpenAI | `https://api.openai.com/v1` |
|
|
79
|
+
| Baidu ERNIE | `https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop` |
|
|
80
|
+
| Anthropic (via proxy) | `https://api.anthropic.com/v1` |
|
|
81
|
+
| Ollama (local) | `http://localhost:11434/v1` |
|
|
82
|
+
| vLLM (local) | `http://localhost:8000/v1` |
|
|
99
83
|
|
|
100
84
|
## Options
|
|
101
85
|
|
|
102
86
|
| Flag | Description |
|
|
103
87
|
|---|---|
|
|
104
|
-
| `--renderer <type>` | **Your choice.** data-grid, metrics-card, json-tree, reading-block, composite, auto |
|
|
105
88
|
| `--data <file>` | Input JSON data file |
|
|
106
89
|
| `--schema <file>` | Input JSON Schema (renders as form) |
|
|
90
|
+
| `--json <string>` | Inline JSON string |
|
|
107
91
|
| `--title <title>` | Page title |
|
|
108
92
|
| `--tool-name <name>` | MCP tool name |
|
|
109
|
-
| `--debug` | Add
|
|
93
|
+
| `--debug` | Add debug playground panel |
|
|
110
94
|
| `--open` | Auto-open in browser |
|
|
111
95
|
| `--stdout` | Print raw HTML to stdout |
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
**Product comparison table** → `data-grid`
|
|
116
|
-
"This is a comparison across multiple products with consistent dimensions. A sortable table lets the user scan and compare at a glance."
|
|
117
|
-
|
|
118
|
-
**Platform dashboard stats** → `metrics-card`
|
|
119
|
-
"These are high-level KPIs (total products, active merchants, avg commission). Large formatted numbers with labels communicate this best."
|
|
120
|
-
|
|
121
|
-
**AI recommendation with analysis** → `composite`
|
|
122
|
-
"This has a text analysis section, a ranked list of recommendations each with pros/cons, and a budget summary. Multiple renderers composed together."
|
|
123
|
-
|
|
124
|
-
**Deeply nested API config** → `json-tree`
|
|
125
|
-
"This is a raw configuration object. A developer needs to drill into specific paths. Collapsible tree with search is ideal."
|
|
126
|
-
|
|
127
|
-
**Simple 'ok' status** → Skip GUI
|
|
128
|
-
"This is just `{ status: 'success', message: 'Created' }`. No need to generate a whole HTML page — I'll just tell the user it succeeded."
|
|
96
|
+
| `--api-url <url>` | LLM API base URL |
|
|
97
|
+
| `--api-key <key>` | LLM API key |
|
|
98
|
+
| `--model <model>` | LLM model name |
|
|
129
99
|
|
|
130
100
|
$ARGUMENTS
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-cmd.d.ts","sourceRoot":"","sources":["../src/config-cmd.ts"],"names":[],"mappings":"AAMA,UAAU,aAAa;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAmDnD"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mcp-html-skill config` subcommand.
|
|
3
|
+
*/
|
|
4
|
+
import { loadConfig, saveConfig, getConfigPath } from './config.js';
|
|
5
|
+
export function config(options) {
|
|
6
|
+
if (options.show) {
|
|
7
|
+
const cfg = loadConfig();
|
|
8
|
+
const path = getConfigPath();
|
|
9
|
+
if (cfg.llm) {
|
|
10
|
+
console.log(`Config: ${path}`);
|
|
11
|
+
console.log(` API URL: ${cfg.llm.apiUrl}`);
|
|
12
|
+
console.log(` API Key: ${cfg.llm.apiKey ? cfg.llm.apiKey.slice(0, 8) + '...' : '(not set)'}`);
|
|
13
|
+
console.log(` Model: ${cfg.llm.model}`);
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
console.log(`No LLM configured. Config path: ${path}`);
|
|
17
|
+
console.log('Run: mcp-html-skill config --api-url <url> --model <model>');
|
|
18
|
+
}
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (options.clear) {
|
|
22
|
+
saveConfig({});
|
|
23
|
+
console.log('Config cleared.');
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (!options.apiUrl && !options.model && !options.apiKey) {
|
|
27
|
+
console.error('Usage:');
|
|
28
|
+
console.error(' mcp-html-skill config --api-url <url> --model <model> [--api-key <key>]');
|
|
29
|
+
console.error(' mcp-html-skill config --show');
|
|
30
|
+
console.error(' mcp-html-skill config --clear');
|
|
31
|
+
console.error('');
|
|
32
|
+
console.error('Examples:');
|
|
33
|
+
console.error(' mcp-html-skill config --api-url http://localhost:11434/v1 --model qwen2');
|
|
34
|
+
console.error(' mcp-html-skill config --api-url https://api.deepseek.com/v1 --api-key sk-xxx --model deepseek-chat');
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
const existing = loadConfig();
|
|
38
|
+
const llm = existing.llm ?? { apiUrl: '', model: '' };
|
|
39
|
+
if (options.apiUrl)
|
|
40
|
+
llm.apiUrl = options.apiUrl;
|
|
41
|
+
if (options.apiKey)
|
|
42
|
+
llm.apiKey = options.apiKey;
|
|
43
|
+
if (options.model)
|
|
44
|
+
llm.model = options.model;
|
|
45
|
+
if (!llm.apiUrl || !llm.model) {
|
|
46
|
+
console.error('Both --api-url and --model are required.');
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
saveConfig({ ...existing, llm });
|
|
50
|
+
console.log(`Saved to ${getConfigPath()}`);
|
|
51
|
+
console.log(` API URL: ${llm.apiUrl}`);
|
|
52
|
+
console.log(` Model: ${llm.model}`);
|
|
53
|
+
console.log(` API Key: ${llm.apiKey ? llm.apiKey.slice(0, 8) + '...' : '(not set)'}`);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=config-cmd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-cmd.js","sourceRoot":"","sources":["../src/config-cmd.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface BridgeConfig {
|
|
2
|
+
llm?: {
|
|
3
|
+
apiUrl: string;
|
|
4
|
+
apiKey?: string;
|
|
5
|
+
model: string;
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
/** Read config from ~/.mcp-html-bridge/config.json */
|
|
9
|
+
export declare function loadConfig(): BridgeConfig;
|
|
10
|
+
/** Write config to ~/.mcp-html-bridge/config.json */
|
|
11
|
+
export declare function saveConfig(config: BridgeConfig): void;
|
|
12
|
+
/** Get config file path */
|
|
13
|
+
export declare function getConfigPath(): string;
|
|
14
|
+
/**
|
|
15
|
+
* Resolve LLM config from all sources.
|
|
16
|
+
* Priority: CLI flags > env vars > config file
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolveLLMConfig(cliFlags: {
|
|
19
|
+
apiUrl?: string;
|
|
20
|
+
apiKey?: string;
|
|
21
|
+
model?: string;
|
|
22
|
+
}): {
|
|
23
|
+
apiUrl: string;
|
|
24
|
+
apiKey?: string;
|
|
25
|
+
model: string;
|
|
26
|
+
} | undefined;
|
|
27
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE;QACJ,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,sDAAsD;AACtD,wBAAgB,UAAU,IAAI,YAAY,CAUzC;AAED,qDAAqD;AACrD,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAGrD;AAED,2BAA2B;AAC3B,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAkBjE"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration management for MCP-HTML-Bridge.
|
|
3
|
+
*
|
|
4
|
+
* Config file: ~/.mcp-html-bridge/config.json
|
|
5
|
+
* Env vars: MCP_HTML_LLM_API_URL, MCP_HTML_LLM_API_KEY, MCP_HTML_LLM_MODEL
|
|
6
|
+
* CLI flags: --api-url, --api-key, --model (highest priority)
|
|
7
|
+
*/
|
|
8
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { homedir } from 'node:os';
|
|
11
|
+
const CONFIG_DIR = join(homedir(), '.mcp-html-bridge');
|
|
12
|
+
const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
|
|
13
|
+
/** Read config from ~/.mcp-html-bridge/config.json */
|
|
14
|
+
export function loadConfig() {
|
|
15
|
+
try {
|
|
16
|
+
if (existsSync(CONFIG_FILE)) {
|
|
17
|
+
const raw = readFileSync(CONFIG_FILE, 'utf-8');
|
|
18
|
+
return JSON.parse(raw);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// Corrupt config, ignore
|
|
23
|
+
}
|
|
24
|
+
return {};
|
|
25
|
+
}
|
|
26
|
+
/** Write config to ~/.mcp-html-bridge/config.json */
|
|
27
|
+
export function saveConfig(config) {
|
|
28
|
+
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
29
|
+
writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
30
|
+
}
|
|
31
|
+
/** Get config file path */
|
|
32
|
+
export function getConfigPath() {
|
|
33
|
+
return CONFIG_FILE;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Resolve LLM config from all sources.
|
|
37
|
+
* Priority: CLI flags > env vars > config file
|
|
38
|
+
*/
|
|
39
|
+
export function resolveLLMConfig(cliFlags) {
|
|
40
|
+
const file = loadConfig();
|
|
41
|
+
const apiUrl = cliFlags.apiUrl
|
|
42
|
+
?? process.env['MCP_HTML_LLM_API_URL']
|
|
43
|
+
?? file.llm?.apiUrl;
|
|
44
|
+
const model = cliFlags.model
|
|
45
|
+
?? process.env['MCP_HTML_LLM_MODEL']
|
|
46
|
+
?? file.llm?.model;
|
|
47
|
+
if (!apiUrl || !model)
|
|
48
|
+
return undefined;
|
|
49
|
+
const apiKey = cliFlags.apiKey
|
|
50
|
+
?? process.env['MCP_HTML_LLM_API_KEY']
|
|
51
|
+
?? file.llm?.apiKey;
|
|
52
|
+
return { apiUrl, apiKey, model };
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,kBAAkB,CAAC,CAAC;AACvD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAUpD,sDAAsD;AACtD,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;QACzC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,UAAU,CAAC,MAAoB;IAC7C,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AAC9E,CAAC;AAED,2BAA2B;AAC3B,MAAM,UAAU,aAAa;IAC3B,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAIhC;IACC,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAE1B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM;WACzB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;WACnC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;IAEtB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK;WACvB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;WACjC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC;IAErB,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAExC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM;WACzB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;WACnC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;IAEtB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACnC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,39 +2,53 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* @mcp-html-bridge/claude-skill
|
|
4
4
|
*
|
|
5
|
-
* CLI
|
|
6
|
-
* mcp-html-skill
|
|
7
|
-
* mcp-html-skill render
|
|
5
|
+
* CLI for MCP-HTML-Bridge:
|
|
6
|
+
* mcp-html-skill config — configure LLM provider
|
|
7
|
+
* mcp-html-skill render — render JSON to HTML
|
|
8
|
+
* mcp-html-skill install — install /mcp-render into Claude Code
|
|
8
9
|
*/
|
|
9
10
|
import { Command } from 'commander';
|
|
10
11
|
import { install } from './install.js';
|
|
11
12
|
import { render } from './render.js';
|
|
13
|
+
import { config } from './config-cmd.js';
|
|
12
14
|
const program = new Command();
|
|
13
15
|
program
|
|
14
16
|
.name('mcp-html-skill')
|
|
15
|
-
.description('
|
|
16
|
-
.version('0.
|
|
17
|
+
.description('MCP-HTML-Bridge — render any JSON as self-contained HTML')
|
|
18
|
+
.version('0.5.0');
|
|
17
19
|
program
|
|
18
|
-
.command('
|
|
19
|
-
.description('
|
|
20
|
-
.option('--
|
|
21
|
-
.option('--
|
|
22
|
-
.
|
|
20
|
+
.command('config')
|
|
21
|
+
.description('Configure LLM provider (saved to ~/.mcp-html-bridge/config.json)')
|
|
22
|
+
.option('--api-url <url>', 'LLM API base URL')
|
|
23
|
+
.option('--api-key <key>', 'LLM API key')
|
|
24
|
+
.option('--model <model>', 'LLM model name')
|
|
25
|
+
.option('--show', 'Show current config')
|
|
26
|
+
.option('--clear', 'Clear saved config')
|
|
27
|
+
.action(config);
|
|
23
28
|
program
|
|
24
29
|
.command('render')
|
|
25
30
|
.description('Render MCP tool schema or result data as HTML')
|
|
26
31
|
.option('--schema <file>', 'JSON Schema file (renders input form)')
|
|
27
32
|
.option('--data <file>', 'JSON data file (renders result view)')
|
|
28
33
|
.option('--json <string>', 'Inline JSON string')
|
|
29
|
-
.option('--mode <mode>', 'Force render mode: schema | data
|
|
30
|
-
.option('--renderer <type>', 'Explicit renderer: data-grid | metrics-card | json-tree | reading-block | composite | auto')
|
|
34
|
+
.option('--mode <mode>', 'Force render mode: schema | data')
|
|
31
35
|
.option('--title <title>', 'Page title')
|
|
32
|
-
.option('--tool-name <name>', 'Tool name
|
|
36
|
+
.option('--tool-name <name>', 'Tool name')
|
|
33
37
|
.option('--tool-desc <desc>', 'Tool description')
|
|
34
38
|
.option('--debug', 'Enable debug playground panel')
|
|
35
39
|
.option('--output <dir>', 'Output directory', '/tmp/mcp-html-bridge')
|
|
36
40
|
.option('--open', 'Open in browser after rendering')
|
|
37
|
-
.option('--stdout', 'Print raw HTML to stdout
|
|
41
|
+
.option('--stdout', 'Print raw HTML to stdout')
|
|
42
|
+
.option('--api-url <url>', 'LLM API URL (overrides config)')
|
|
43
|
+
.option('--api-key <key>', 'LLM API key (overrides config)')
|
|
44
|
+
.option('--model <model>', 'LLM model (overrides config)')
|
|
45
|
+
.option('--no-llm', 'Force structural rendering, skip LLM')
|
|
38
46
|
.action(render);
|
|
47
|
+
program
|
|
48
|
+
.command('install')
|
|
49
|
+
.description('Install /mcp-render command into Claude Code')
|
|
50
|
+
.option('--global', 'Install to global ~/.claude/commands/ (default)', true)
|
|
51
|
+
.option('--project', 'Install to current project .claude/commands/')
|
|
52
|
+
.action(install);
|
|
39
53
|
program.parse();
|
|
40
54
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,gBAAgB,CAAC;KACtB,WAAW,CAAC,0DAA0D,CAAC;KACvE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,kEAAkE,CAAC;KAC/E,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;KAC7C,MAAM,CAAC,iBAAiB,EAAE,aAAa,CAAC;KACxC,MAAM,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;KAC3C,MAAM,CAAC,QAAQ,EAAE,qBAAqB,CAAC;KACvC,MAAM,CAAC,SAAS,EAAE,oBAAoB,CAAC;KACvC,MAAM,CAAC,MAAM,CAAC,CAAC;AAElB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,iBAAiB,EAAE,uCAAuC,CAAC;KAClE,MAAM,CAAC,eAAe,EAAE,sCAAsC,CAAC;KAC/D,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC;KAC/C,MAAM,CAAC,eAAe,EAAE,kCAAkC,CAAC;KAC3D,MAAM,CAAC,iBAAiB,EAAE,YAAY,CAAC;KACvC,MAAM,CAAC,oBAAoB,EAAE,WAAW,CAAC;KACzC,MAAM,CAAC,oBAAoB,EAAE,kBAAkB,CAAC;KAChD,MAAM,CAAC,SAAS,EAAE,+BAA+B,CAAC;KAClD,MAAM,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,sBAAsB,CAAC;KACpE,MAAM,CAAC,QAAQ,EAAE,iCAAiC,CAAC;KACnD,MAAM,CAAC,UAAU,EAAE,0BAA0B,CAAC;KAC9C,MAAM,CAAC,iBAAiB,EAAE,gCAAgC,CAAC;KAC3D,MAAM,CAAC,iBAAiB,EAAE,gCAAgC,CAAC;KAC3D,MAAM,CAAC,iBAAiB,EAAE,8BAA8B,CAAC;KACzD,MAAM,CAAC,UAAU,EAAE,sCAAsC,CAAC;KAC1D,MAAM,CAAC,MAAM,CAAC,CAAC;AAElB,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,8CAA8C,CAAC;KAC3D,MAAM,CAAC,UAAU,EAAE,iDAAiD,EAAE,IAAI,CAAC;KAC3E,MAAM,CAAC,WAAW,EAAE,8CAA8C,CAAC;KACnE,MAAM,CAAC,OAAO,CAAC,CAAC;AAEnB,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/dist/render.d.ts
CHANGED
|
@@ -3,7 +3,6 @@ interface RenderOptions {
|
|
|
3
3
|
data?: string;
|
|
4
4
|
json?: string;
|
|
5
5
|
mode?: 'schema' | 'data';
|
|
6
|
-
renderer?: string;
|
|
7
6
|
title?: string;
|
|
8
7
|
toolName?: string;
|
|
9
8
|
toolDesc?: string;
|
|
@@ -11,7 +10,11 @@ interface RenderOptions {
|
|
|
11
10
|
output?: string;
|
|
12
11
|
open?: boolean;
|
|
13
12
|
stdout?: boolean;
|
|
13
|
+
apiUrl?: string;
|
|
14
|
+
apiKey?: string;
|
|
15
|
+
model?: string;
|
|
16
|
+
llm?: boolean;
|
|
14
17
|
}
|
|
15
|
-
export declare function render(options: RenderOptions): void
|
|
18
|
+
export declare function render(options: RenderOptions): Promise<void>;
|
|
16
19
|
export {};
|
|
17
20
|
//# sourceMappingURL=render.d.ts.map
|
package/dist/render.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAYA,UAAU,aAAa;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAiED,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA4ClE"}
|
package/dist/render.js
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Render MCP tool schema or data as a self-contained HTML page.
|
|
3
|
+
*
|
|
4
|
+
* LLM config resolution order:
|
|
5
|
+
* CLI flags > env vars > ~/.mcp-html-bridge/config.json > no LLM (structural)
|
|
3
6
|
*/
|
|
4
7
|
import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
5
8
|
import { join } from 'node:path';
|
|
6
9
|
import { execSync } from 'node:child_process';
|
|
7
|
-
import { renderFromSchema, renderFromData } from '@mcp-html-bridge/ui-engine';
|
|
8
|
-
|
|
10
|
+
import { renderFromSchema, renderFromData, renderFromDataSync } from '@mcp-html-bridge/ui-engine';
|
|
11
|
+
import { resolveLLMConfig } from './config.js';
|
|
9
12
|
function loadJSON(options) {
|
|
10
13
|
let raw;
|
|
11
14
|
if (options.schema) {
|
|
@@ -22,7 +25,6 @@ function loadJSON(options) {
|
|
|
22
25
|
parsed.type === 'object' && parsed.properties;
|
|
23
26
|
return { json: parsed, detectedMode: isSchema ? 'schema' : 'data' };
|
|
24
27
|
}
|
|
25
|
-
// Try reading from stdin if piped
|
|
26
28
|
try {
|
|
27
29
|
raw = readFileSync('/dev/stdin', 'utf-8');
|
|
28
30
|
if (raw.trim()) {
|
|
@@ -33,43 +35,12 @@ function loadJSON(options) {
|
|
|
33
35
|
}
|
|
34
36
|
}
|
|
35
37
|
catch {
|
|
36
|
-
// Not piped
|
|
38
|
+
// Not piped
|
|
37
39
|
}
|
|
38
|
-
console.error('
|
|
39
|
-
console.error(' Use --schema <file>, --data <file>, --json <string>, or pipe via stdin.');
|
|
40
|
+
console.error('Error: No input. Use --schema, --data, --json, or pipe via stdin.');
|
|
40
41
|
process.exit(1);
|
|
41
42
|
}
|
|
42
|
-
function
|
|
43
|
-
const rendererChoice = options.renderer && options.renderer !== 'auto'
|
|
44
|
-
? options.renderer
|
|
45
|
-
: undefined;
|
|
46
|
-
if (mode === 'schema') {
|
|
47
|
-
return renderFromSchema(json, {
|
|
48
|
-
title: options.title ?? options.toolName ?? 'MCP Tool Input',
|
|
49
|
-
toolName: options.toolName,
|
|
50
|
-
toolDescription: options.toolDesc,
|
|
51
|
-
debug: options.debug ?? true,
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
return renderFromData(json, {
|
|
55
|
-
title: options.title ?? options.toolName ?? 'MCP Tool Result',
|
|
56
|
-
toolName: options.toolName,
|
|
57
|
-
toolDescription: options.toolDesc,
|
|
58
|
-
debug: options.debug,
|
|
59
|
-
renderer: rendererChoice,
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
export function render(options) {
|
|
63
|
-
// Validate renderer choice
|
|
64
|
-
if (options.renderer && !VALID_RENDERERS.includes(options.renderer)) {
|
|
65
|
-
console.error(` Error: Unknown renderer "${options.renderer}".`);
|
|
66
|
-
console.error(` Available: ${VALID_RENDERERS.join(', ')}`);
|
|
67
|
-
process.exit(1);
|
|
68
|
-
}
|
|
69
|
-
const { json, detectedMode } = loadJSON(options);
|
|
70
|
-
const mode = options.mode ?? detectedMode;
|
|
71
|
-
const html = buildHTML(json, mode, options);
|
|
72
|
-
// --stdout: print raw HTML to stdout (for embedding in response streams)
|
|
43
|
+
function writeAndOpen(html, options) {
|
|
73
44
|
if (options.stdout) {
|
|
74
45
|
process.stdout.write(html);
|
|
75
46
|
return;
|
|
@@ -88,8 +59,51 @@ export function render(options) {
|
|
|
88
59
|
execSync(`${cmd} "${outPath}"`, { stdio: 'ignore' });
|
|
89
60
|
}
|
|
90
61
|
catch {
|
|
91
|
-
//
|
|
62
|
+
// Can't open browser
|
|
92
63
|
}
|
|
93
64
|
}
|
|
94
65
|
}
|
|
66
|
+
export async function render(options) {
|
|
67
|
+
const { json, detectedMode } = loadJSON(options);
|
|
68
|
+
const mode = options.mode ?? detectedMode;
|
|
69
|
+
if (mode === 'schema') {
|
|
70
|
+
const html = renderFromSchema(json, {
|
|
71
|
+
title: options.title ?? options.toolName ?? 'MCP Tool Input',
|
|
72
|
+
toolName: options.toolName,
|
|
73
|
+
toolDescription: options.toolDesc,
|
|
74
|
+
debug: options.debug ?? true,
|
|
75
|
+
});
|
|
76
|
+
writeAndOpen(html, options);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// Resolve LLM config (CLI flags > env vars > config file)
|
|
80
|
+
// --no-llm forces structural rendering
|
|
81
|
+
const llm = options.llm === false
|
|
82
|
+
? undefined
|
|
83
|
+
: resolveLLMConfig({
|
|
84
|
+
apiUrl: options.apiUrl,
|
|
85
|
+
apiKey: options.apiKey,
|
|
86
|
+
model: options.model,
|
|
87
|
+
});
|
|
88
|
+
if (llm) {
|
|
89
|
+
console.error(` LLM: ${llm.model} @ ${llm.apiUrl}`);
|
|
90
|
+
const html = await renderFromData(json, {
|
|
91
|
+
title: options.title ?? options.toolName ?? 'MCP Tool Result',
|
|
92
|
+
toolName: options.toolName,
|
|
93
|
+
toolDescription: options.toolDesc,
|
|
94
|
+
debug: options.debug,
|
|
95
|
+
llm,
|
|
96
|
+
});
|
|
97
|
+
writeAndOpen(html, options);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const html = renderFromDataSync(json, {
|
|
101
|
+
title: options.title ?? options.toolName ?? 'MCP Tool Result',
|
|
102
|
+
toolName: options.toolName,
|
|
103
|
+
toolDescription: options.toolDesc,
|
|
104
|
+
debug: options.debug,
|
|
105
|
+
});
|
|
106
|
+
writeAndOpen(html, options);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
95
109
|
//# sourceMappingURL=render.js.map
|
package/dist/render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED