@mcp-html-bridge/cli 0.1.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.
@@ -0,0 +1,2 @@
1
+ export declare function compile(serverCommand: string, outputPath: string): Promise<void>;
2
+ //# sourceMappingURL=compile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"AAMA,wBAAsB,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCtF"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.compile = compile;
4
+ // ── compile subcommand: connect to MCP server → extract schemas → generate SKILL.md ──
5
+ const node_fs_1 = require("node:fs");
6
+ const mcp_client_1 = require("@mcp-html-bridge/mcp-client");
7
+ const ui_engine_1 = require("@mcp-html-bridge/ui-engine");
8
+ async function compile(serverCommand, outputPath) {
9
+ const client = new mcp_client_1.MCPClient();
10
+ console.log(` Connecting to: ${serverCommand}`);
11
+ await client.connect({ command: serverCommand });
12
+ console.log(' Listing tools...');
13
+ const tools = await client.listTools();
14
+ console.log(` Found ${tools.length} tools`);
15
+ const sections = [];
16
+ sections.push('# MCP Tool UI Reference\n');
17
+ sections.push(`> Auto-generated by mcp-html-bridge from \`${serverCommand}\``);
18
+ sections.push(`> ${tools.length} tools discovered\n`);
19
+ for (const tool of tools) {
20
+ console.log(` Processing: ${tool.name}`);
21
+ const schema = tool.inputSchema;
22
+ const html = (0, ui_engine_1.renderFromSchema)(schema, {
23
+ toolName: tool.name,
24
+ toolDescription: tool.description,
25
+ });
26
+ sections.push(`## ${tool.name}\n`);
27
+ if (tool.description) {
28
+ sections.push(`${tool.description}\n`);
29
+ }
30
+ sections.push('```mcp-html');
31
+ sections.push(html);
32
+ sections.push('```\n');
33
+ }
34
+ const content = sections.join('\n');
35
+ (0, node_fs_1.writeFileSync)(outputPath, content);
36
+ console.log(`\n ✓ Written to ${outputPath}`);
37
+ await client.disconnect();
38
+ }
39
+ //# sourceMappingURL=compile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":";;AAMA,0BAuCC;AA7CD,wFAAwF;AACxF,qCAAwC;AACxC,4DAAwD;AACxD,0DAA8D;AAGvD,KAAK,UAAU,OAAO,CAAC,aAAqB,EAAE,UAAkB;IACrE,MAAM,MAAM,GAAG,IAAI,sBAAS,EAAE,CAAC;IAE/B,OAAO,CAAC,GAAG,CAAC,oBAAoB,aAAa,EAAE,CAAC,CAAC;IACjD,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;IAEjD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;IAE7C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,QAAQ,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC3C,QAAQ,CAAC,IAAI,CAAC,8CAA8C,aAAa,IAAI,CAAC,CAAC;IAC/E,QAAQ,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,qBAAqB,CAAC,CAAC;IAEtD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAE1C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAyB,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAA,4BAAgB,EAAC,MAAM,EAAE;YACpC,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,eAAe,EAAE,IAAI,CAAC,WAAW;SAClC,CAAC,CAAC;QAEH,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;QACnC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;QACzC,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,IAAA,uBAAa,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,oBAAoB,UAAU,EAAE,CAAC,CAAC;IAE9C,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ // ── CLI Entry: mcp-bridge command ──
5
+ const commander_1 = require("commander");
6
+ const test_mock_js_1 = require("./test-mock.js");
7
+ const compile_js_1 = require("./compile.js");
8
+ const program = new commander_1.Command();
9
+ program
10
+ .name('mcp-bridge')
11
+ .description('MCP-HTML-Bridge — render MCP schemas/data as self-contained HTML')
12
+ .version('0.1.0');
13
+ program
14
+ .command('compile <server-command>')
15
+ .description('Connect to an MCP server, extract tool schemas, and generate a SKILL.md file')
16
+ .option('-o, --output <path>', 'Output file path', 'SKILL.md')
17
+ .action(async (serverCommand, opts) => {
18
+ try {
19
+ console.log('\n mcp-bridge compile\n');
20
+ await (0, compile_js_1.compile)(serverCommand, opts.output);
21
+ }
22
+ catch (err) {
23
+ console.error('Error:', err.message);
24
+ process.exit(1);
25
+ }
26
+ });
27
+ program
28
+ .command('test-mock')
29
+ .description('Generate HTML from built-in mock datasets for browser testing')
30
+ .option('-o, --output <dir>', 'Output directory', './mcp-html-output')
31
+ .option('-d, --debug', 'Enable debug playground panel', false)
32
+ .action((opts) => {
33
+ console.log('\n mcp-bridge test-mock\n');
34
+ (0, test_mock_js_1.testMock)(opts.output, opts.debug);
35
+ });
36
+ program.parse();
37
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,sCAAsC;AACtC,yCAAoC;AACpC,iDAA0C;AAC1C,6CAAuC;AAEvC,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,kEAAkE,CAAC;KAC/E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,0BAA0B,CAAC;KACnC,WAAW,CAAC,8EAA8E,CAAC;KAC3F,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,EAAE,UAAU,CAAC;KAC7D,MAAM,CAAC,KAAK,EAAE,aAAqB,EAAE,IAAwB,EAAE,EAAE;IAChE,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,MAAM,IAAA,oBAAO,EAAC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,+DAA+D,CAAC;KAC5E,MAAM,CAAC,oBAAoB,EAAE,kBAAkB,EAAE,mBAAmB,CAAC;KACrE,MAAM,CAAC,aAAa,EAAE,+BAA+B,EAAE,KAAK,CAAC;KAC7D,MAAM,CAAC,CAAC,IAAwC,EAAE,EAAE;IACnD,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,IAAA,uBAAQ,EAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,103 @@
1
+ /** E-commerce SKU matrix dataset */
2
+ export declare const ecommerceData: {
3
+ store: string;
4
+ lastUpdated: string;
5
+ summary: {
6
+ totalSKUs: number;
7
+ totalRevenue: number;
8
+ avgPrice: number;
9
+ lowStockCount: number;
10
+ };
11
+ products: {
12
+ sku: string;
13
+ name: string;
14
+ category: string;
15
+ price: number;
16
+ stock: number;
17
+ status: string;
18
+ rating: number;
19
+ revenue: number;
20
+ }[];
21
+ };
22
+ /** Particle physics collision dataset */
23
+ export declare const physicsData: {
24
+ experiment: string;
25
+ runId: string;
26
+ timestamp: string;
27
+ beamEnergy: number;
28
+ luminosity: number;
29
+ description: string;
30
+ results: {
31
+ observedEvents: number;
32
+ backgroundEstimate: number;
33
+ signalExcess: number;
34
+ significance: number;
35
+ higgsMass: number;
36
+ massUncertainty: number;
37
+ signalStrength: number;
38
+ signalStrengthError: number;
39
+ };
40
+ eventSample: {
41
+ eventId: string;
42
+ energy: number;
43
+ eta: number;
44
+ phi: number;
45
+ pt: number;
46
+ channel: string;
47
+ selected: boolean;
48
+ }[];
49
+ };
50
+ /** Sample JSON Schema for a tool */
51
+ export declare const sampleToolSchema: {
52
+ name: string;
53
+ description: string;
54
+ inputSchema: {
55
+ type: "object";
56
+ properties: {
57
+ query: {
58
+ type: string;
59
+ description: string;
60
+ };
61
+ category: {
62
+ type: string;
63
+ enum: string[];
64
+ description: string;
65
+ };
66
+ priceRange: {
67
+ type: string;
68
+ properties: {
69
+ min: {
70
+ type: string;
71
+ minimum: number;
72
+ description: string;
73
+ };
74
+ max: {
75
+ type: string;
76
+ minimum: number;
77
+ description: string;
78
+ };
79
+ };
80
+ description: string;
81
+ };
82
+ inStockOnly: {
83
+ type: string;
84
+ default: boolean;
85
+ description: string;
86
+ };
87
+ sortBy: {
88
+ type: string;
89
+ enum: string[];
90
+ description: string;
91
+ };
92
+ limit: {
93
+ type: string;
94
+ minimum: number;
95
+ maximum: number;
96
+ default: number;
97
+ description: string;
98
+ };
99
+ };
100
+ required: string[];
101
+ };
102
+ };
103
+ //# sourceMappingURL=mock-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-data.d.ts","sourceRoot":"","sources":["../src/mock-data.ts"],"names":[],"mappings":"AAEA,oCAAoC;AACpC,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;CA2FzB,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BvB,CAAC;AAEF,oCAAoC;AACpC,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2C5B,CAAC"}
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ // ── Mock datasets for testing ──
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.sampleToolSchema = exports.physicsData = exports.ecommerceData = void 0;
5
+ /** E-commerce SKU matrix dataset */
6
+ exports.ecommerceData = {
7
+ store: 'TechMart Global',
8
+ lastUpdated: '2026-03-20T08:00:00Z',
9
+ summary: {
10
+ totalSKUs: 8,
11
+ totalRevenue: 284750.0,
12
+ avgPrice: 449.99,
13
+ lowStockCount: 2,
14
+ },
15
+ products: [
16
+ {
17
+ sku: 'TM-LAP-001',
18
+ name: 'UltraBook Pro 16"',
19
+ category: 'Laptops',
20
+ price: 1299.99,
21
+ stock: 142,
22
+ status: 'Active',
23
+ rating: 4.7,
24
+ revenue: 92399.29,
25
+ },
26
+ {
27
+ sku: 'TM-LAP-002',
28
+ name: 'DevStation X1 Carbon',
29
+ category: 'Laptops',
30
+ price: 1849.0,
31
+ stock: 67,
32
+ status: 'Active',
33
+ rating: 4.9,
34
+ revenue: 55470.0,
35
+ },
36
+ {
37
+ sku: 'TM-PHN-001',
38
+ name: 'Pixel Ultra 8',
39
+ category: 'Phones',
40
+ price: 899.0,
41
+ stock: 234,
42
+ status: 'Active',
43
+ rating: 4.5,
44
+ revenue: 44950.0,
45
+ },
46
+ {
47
+ sku: 'TM-PHN-002',
48
+ name: 'GalaxyFold Z7',
49
+ category: 'Phones',
50
+ price: 1799.0,
51
+ stock: 12,
52
+ status: 'Low Stock',
53
+ rating: 4.3,
54
+ revenue: 35980.0,
55
+ },
56
+ {
57
+ sku: 'TM-TAB-001',
58
+ name: 'iPad Air M3',
59
+ category: 'Tablets',
60
+ price: 649.0,
61
+ stock: 0,
62
+ status: 'Out of Stock',
63
+ rating: 4.8,
64
+ revenue: 25960.0,
65
+ },
66
+ {
67
+ sku: 'TM-AUD-001',
68
+ name: 'AirPods Max 2',
69
+ category: 'Audio',
70
+ price: 549.0,
71
+ stock: 89,
72
+ status: 'Active',
73
+ rating: 4.6,
74
+ revenue: 16470.0,
75
+ },
76
+ {
77
+ sku: 'TM-ACC-001',
78
+ name: 'MagSafe Charger Bundle',
79
+ category: 'Accessories',
80
+ price: 79.99,
81
+ stock: 456,
82
+ status: 'Active',
83
+ rating: 4.2,
84
+ revenue: 7999.0,
85
+ },
86
+ {
87
+ sku: 'TM-ACC-002',
88
+ name: 'USB-C Hub 12-in-1',
89
+ category: 'Accessories',
90
+ price: 129.99,
91
+ stock: 8,
92
+ status: 'Backorder',
93
+ rating: 4.4,
94
+ revenue: 5521.71,
95
+ },
96
+ ],
97
+ };
98
+ /** Particle physics collision dataset */
99
+ exports.physicsData = {
100
+ experiment: 'LHC Run 4 — Higgs Boson Decay Analysis',
101
+ runId: 'CERN-2026-0342',
102
+ timestamp: '2026-03-19T14:32:07.291Z',
103
+ beamEnergy: 13.6, // TeV
104
+ luminosity: 4.2e34, // cm⁻²s⁻¹
105
+ description: 'Analysis of diphoton invariant mass spectrum from proton-proton collisions at √s = 13.6 TeV. This run focused on measuring the Higgs boson signal strength in the H→γγ decay channel with improved electromagnetic calorimeter calibration. The observed excess at 125.09 GeV is consistent with the Standard Model Higgs boson prediction within 1.2σ.',
106
+ results: {
107
+ observedEvents: 14283,
108
+ backgroundEstimate: 13950,
109
+ signalExcess: 333,
110
+ significance: 5.2, // sigma
111
+ higgsMass: 125.09, // GeV/c²
112
+ massUncertainty: 0.24,
113
+ signalStrength: 1.12,
114
+ signalStrengthError: 0.09,
115
+ },
116
+ eventSample: [
117
+ { eventId: 'EVT-90341', energy: 125.3, eta: -1.42, phi: 2.81, pt: 64.2, channel: 'diphoton', selected: true },
118
+ { eventId: 'EVT-90342', energy: 124.8, eta: 0.67, phi: -1.23, pt: 58.7, channel: 'diphoton', selected: true },
119
+ { eventId: 'EVT-90343', energy: 91.2, eta: 2.11, phi: 0.45, pt: 42.1, channel: 'Z-boson', selected: false },
120
+ { eventId: 'EVT-90344', energy: 125.1, eta: -0.23, phi: -2.67, pt: 71.3, channel: 'diphoton', selected: true },
121
+ { eventId: 'EVT-90345', energy: 80.4, eta: 1.89, phi: 1.12, pt: 38.5, channel: 'W-boson', selected: false },
122
+ { eventId: 'EVT-90346', energy: 125.0, eta: 0.02, phi: -0.89, pt: 66.8, channel: 'diphoton', selected: true },
123
+ ],
124
+ };
125
+ /** Sample JSON Schema for a tool */
126
+ exports.sampleToolSchema = {
127
+ name: 'search_products',
128
+ description: 'Search the product catalog with filters and sorting options.',
129
+ inputSchema: {
130
+ type: 'object',
131
+ properties: {
132
+ query: {
133
+ type: 'string',
134
+ description: 'Search query string',
135
+ },
136
+ category: {
137
+ type: 'string',
138
+ enum: ['Laptops', 'Phones', 'Tablets', 'Audio', 'Accessories'],
139
+ description: 'Filter by product category',
140
+ },
141
+ priceRange: {
142
+ type: 'object',
143
+ properties: {
144
+ min: { type: 'number', minimum: 0, description: 'Minimum price' },
145
+ max: { type: 'number', minimum: 0, description: 'Maximum price' },
146
+ },
147
+ description: 'Price range filter',
148
+ },
149
+ inStockOnly: {
150
+ type: 'boolean',
151
+ default: true,
152
+ description: 'Only show in-stock items',
153
+ },
154
+ sortBy: {
155
+ type: 'string',
156
+ enum: ['price', 'rating', 'name', 'stock'],
157
+ description: 'Sort results by field',
158
+ },
159
+ limit: {
160
+ type: 'integer',
161
+ minimum: 1,
162
+ maximum: 100,
163
+ default: 20,
164
+ description: 'Maximum number of results',
165
+ },
166
+ },
167
+ required: ['query'],
168
+ },
169
+ };
170
+ //# sourceMappingURL=mock-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-data.js","sourceRoot":"","sources":["../src/mock-data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function testMock(outputDir: string, debug: boolean): void;
2
+ //# sourceMappingURL=test-mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-mock.d.ts","sourceRoot":"","sources":["../src/test-mock.ts"],"names":[],"mappings":"AAMA,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAmEhE"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.testMock = testMock;
4
+ // ── test-mock subcommand: render mock data to HTML files ──
5
+ const node_fs_1 = require("node:fs");
6
+ const node_path_1 = require("node:path");
7
+ const ui_engine_1 = require("@mcp-html-bridge/ui-engine");
8
+ const mock_data_js_1 = require("./mock-data.js");
9
+ function testMock(outputDir, debug) {
10
+ (0, node_fs_1.mkdirSync)(outputDir, { recursive: true });
11
+ const opts = { debug };
12
+ // 1. E-commerce data (composite: metrics + grid)
13
+ const ecommerceHtml = (0, ui_engine_1.renderFromData)(mock_data_js_1.ecommerceData, {
14
+ ...opts,
15
+ title: 'E-Commerce Dashboard — TechMart',
16
+ toolName: 'get_inventory',
17
+ });
18
+ const ecomPath = (0, node_path_1.join)(outputDir, 'ecommerce.html');
19
+ (0, node_fs_1.writeFileSync)(ecomPath, ecommerceHtml);
20
+ console.log(` ✓ ${ecomPath}`);
21
+ // 2. E-commerce products only (data grid)
22
+ const gridHtml = (0, ui_engine_1.renderFromData)(mock_data_js_1.ecommerceData.products, {
23
+ ...opts,
24
+ title: 'Product Grid',
25
+ toolName: 'list_products',
26
+ });
27
+ const gridPath = (0, node_path_1.join)(outputDir, 'data-grid.html');
28
+ (0, node_fs_1.writeFileSync)(gridPath, gridHtml);
29
+ console.log(` ✓ ${gridPath}`);
30
+ // 3. Physics data (composite: reading block + metrics + grid)
31
+ const physicsHtml = (0, ui_engine_1.renderFromData)(mock_data_js_1.physicsData, {
32
+ ...opts,
33
+ title: 'LHC Collision Analysis',
34
+ toolName: 'analyze_collisions',
35
+ });
36
+ const physicsPath = (0, node_path_1.join)(outputDir, 'physics.html');
37
+ (0, node_fs_1.writeFileSync)(physicsPath, physicsHtml);
38
+ console.log(` ✓ ${physicsPath}`);
39
+ // 4. Physics results only (metrics cards)
40
+ const metricsHtml = (0, ui_engine_1.renderFromData)(mock_data_js_1.physicsData.results, {
41
+ ...opts,
42
+ title: 'Collision Metrics',
43
+ toolName: 'get_results',
44
+ });
45
+ const metricsPath = (0, node_path_1.join)(outputDir, 'metrics.html');
46
+ (0, node_fs_1.writeFileSync)(metricsPath, metricsHtml);
47
+ console.log(` ✓ ${metricsPath}`);
48
+ // 5. Tool schema (form)
49
+ const formHtml = (0, ui_engine_1.renderFromSchema)(mock_data_js_1.sampleToolSchema.inputSchema, {
50
+ ...opts,
51
+ title: 'Search Products',
52
+ toolName: mock_data_js_1.sampleToolSchema.name,
53
+ toolDescription: mock_data_js_1.sampleToolSchema.description,
54
+ });
55
+ const formPath = (0, node_path_1.join)(outputDir, 'form.html');
56
+ (0, node_fs_1.writeFileSync)(formPath, formHtml);
57
+ console.log(` ✓ ${formPath}`);
58
+ // 6. Deep JSON (json-tree)
59
+ const treeHtml = (0, ui_engine_1.renderFromData)(mock_data_js_1.physicsData, {
60
+ ...opts,
61
+ title: 'Raw JSON Tree',
62
+ });
63
+ const treePath = (0, node_path_1.join)(outputDir, 'json-tree.html');
64
+ (0, node_fs_1.writeFileSync)(treePath, treeHtml);
65
+ console.log(` ✓ ${treePath}`);
66
+ console.log(`\n ${6} HTML files written to ${outputDir}`);
67
+ console.log(' Open them in a browser to verify rendering.');
68
+ }
69
+ //# sourceMappingURL=test-mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-mock.js","sourceRoot":"","sources":["../src/test-mock.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@mcp-html-bridge/cli",
3
+ "version": "0.1.0",
4
+ "description": "CLI adapter for MCP-HTML-Bridge",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "bin": {
8
+ "mcp-bridge": "./dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc -p tsconfig.json",
12
+ "clean": "rm -rf dist"
13
+ },
14
+ "dependencies": {
15
+ "@mcp-html-bridge/ui-engine": "*",
16
+ "@mcp-html-bridge/mcp-client": "*",
17
+ "commander": "^12.0.0"
18
+ },
19
+ "license": "MIT",
20
+ "publishConfig": {
21
+ "access": "public"
22
+ },
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "https://github.com/zhongkai/mcp-html-bridge.git",
26
+ "directory": "packages/adapter-cli"
27
+ }
28
+ }
package/src/compile.ts ADDED
@@ -0,0 +1,46 @@
1
+ // ── compile subcommand: connect to MCP server → extract schemas → generate SKILL.md ──
2
+ import { writeFileSync } from 'node:fs';
3
+ import { MCPClient } from '@mcp-html-bridge/mcp-client';
4
+ import { renderFromSchema } from '@mcp-html-bridge/ui-engine';
5
+ import type { JSONSchema } from '@mcp-html-bridge/ui-engine';
6
+
7
+ export async function compile(serverCommand: string, outputPath: string): Promise<void> {
8
+ const client = new MCPClient();
9
+
10
+ console.log(` Connecting to: ${serverCommand}`);
11
+ await client.connect({ command: serverCommand });
12
+
13
+ console.log(' Listing tools...');
14
+ const tools = await client.listTools();
15
+ console.log(` Found ${tools.length} tools`);
16
+
17
+ const sections: string[] = [];
18
+
19
+ sections.push('# MCP Tool UI Reference\n');
20
+ sections.push(`> Auto-generated by mcp-html-bridge from \`${serverCommand}\``);
21
+ sections.push(`> ${tools.length} tools discovered\n`);
22
+
23
+ for (const tool of tools) {
24
+ console.log(` Processing: ${tool.name}`);
25
+
26
+ const schema = tool.inputSchema as JSONSchema;
27
+ const html = renderFromSchema(schema, {
28
+ toolName: tool.name,
29
+ toolDescription: tool.description,
30
+ });
31
+
32
+ sections.push(`## ${tool.name}\n`);
33
+ if (tool.description) {
34
+ sections.push(`${tool.description}\n`);
35
+ }
36
+ sections.push('```mcp-html');
37
+ sections.push(html);
38
+ sections.push('```\n');
39
+ }
40
+
41
+ const content = sections.join('\n');
42
+ writeFileSync(outputPath, content);
43
+ console.log(`\n ✓ Written to ${outputPath}`);
44
+
45
+ await client.disconnect();
46
+ }
package/src/index.ts ADDED
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env node
2
+ // ── CLI Entry: mcp-bridge command ──
3
+ import { Command } from 'commander';
4
+ import { testMock } from './test-mock.js';
5
+ import { compile } from './compile.js';
6
+
7
+ const program = new Command();
8
+
9
+ program
10
+ .name('mcp-bridge')
11
+ .description('MCP-HTML-Bridge — render MCP schemas/data as self-contained HTML')
12
+ .version('0.1.0');
13
+
14
+ program
15
+ .command('compile <server-command>')
16
+ .description('Connect to an MCP server, extract tool schemas, and generate a SKILL.md file')
17
+ .option('-o, --output <path>', 'Output file path', 'SKILL.md')
18
+ .action(async (serverCommand: string, opts: { output: string }) => {
19
+ try {
20
+ console.log('\n mcp-bridge compile\n');
21
+ await compile(serverCommand, opts.output);
22
+ } catch (err) {
23
+ console.error('Error:', (err as Error).message);
24
+ process.exit(1);
25
+ }
26
+ });
27
+
28
+ program
29
+ .command('test-mock')
30
+ .description('Generate HTML from built-in mock datasets for browser testing')
31
+ .option('-o, --output <dir>', 'Output directory', './mcp-html-output')
32
+ .option('-d, --debug', 'Enable debug playground panel', false)
33
+ .action((opts: { output: string; debug: boolean }) => {
34
+ console.log('\n mcp-bridge test-mock\n');
35
+ testMock(opts.output, opts.debug);
36
+ });
37
+
38
+ program.parse();
@@ -0,0 +1,170 @@
1
+ // ── Mock datasets for testing ──
2
+
3
+ /** E-commerce SKU matrix dataset */
4
+ export const ecommerceData = {
5
+ store: 'TechMart Global',
6
+ lastUpdated: '2026-03-20T08:00:00Z',
7
+ summary: {
8
+ totalSKUs: 8,
9
+ totalRevenue: 284750.0,
10
+ avgPrice: 449.99,
11
+ lowStockCount: 2,
12
+ },
13
+ products: [
14
+ {
15
+ sku: 'TM-LAP-001',
16
+ name: 'UltraBook Pro 16"',
17
+ category: 'Laptops',
18
+ price: 1299.99,
19
+ stock: 142,
20
+ status: 'Active',
21
+ rating: 4.7,
22
+ revenue: 92399.29,
23
+ },
24
+ {
25
+ sku: 'TM-LAP-002',
26
+ name: 'DevStation X1 Carbon',
27
+ category: 'Laptops',
28
+ price: 1849.0,
29
+ stock: 67,
30
+ status: 'Active',
31
+ rating: 4.9,
32
+ revenue: 55470.0,
33
+ },
34
+ {
35
+ sku: 'TM-PHN-001',
36
+ name: 'Pixel Ultra 8',
37
+ category: 'Phones',
38
+ price: 899.0,
39
+ stock: 234,
40
+ status: 'Active',
41
+ rating: 4.5,
42
+ revenue: 44950.0,
43
+ },
44
+ {
45
+ sku: 'TM-PHN-002',
46
+ name: 'GalaxyFold Z7',
47
+ category: 'Phones',
48
+ price: 1799.0,
49
+ stock: 12,
50
+ status: 'Low Stock',
51
+ rating: 4.3,
52
+ revenue: 35980.0,
53
+ },
54
+ {
55
+ sku: 'TM-TAB-001',
56
+ name: 'iPad Air M3',
57
+ category: 'Tablets',
58
+ price: 649.0,
59
+ stock: 0,
60
+ status: 'Out of Stock',
61
+ rating: 4.8,
62
+ revenue: 25960.0,
63
+ },
64
+ {
65
+ sku: 'TM-AUD-001',
66
+ name: 'AirPods Max 2',
67
+ category: 'Audio',
68
+ price: 549.0,
69
+ stock: 89,
70
+ status: 'Active',
71
+ rating: 4.6,
72
+ revenue: 16470.0,
73
+ },
74
+ {
75
+ sku: 'TM-ACC-001',
76
+ name: 'MagSafe Charger Bundle',
77
+ category: 'Accessories',
78
+ price: 79.99,
79
+ stock: 456,
80
+ status: 'Active',
81
+ rating: 4.2,
82
+ revenue: 7999.0,
83
+ },
84
+ {
85
+ sku: 'TM-ACC-002',
86
+ name: 'USB-C Hub 12-in-1',
87
+ category: 'Accessories',
88
+ price: 129.99,
89
+ stock: 8,
90
+ status: 'Backorder',
91
+ rating: 4.4,
92
+ revenue: 5521.71,
93
+ },
94
+ ],
95
+ };
96
+
97
+ /** Particle physics collision dataset */
98
+ export const physicsData = {
99
+ experiment: 'LHC Run 4 — Higgs Boson Decay Analysis',
100
+ runId: 'CERN-2026-0342',
101
+ timestamp: '2026-03-19T14:32:07.291Z',
102
+ beamEnergy: 13.6, // TeV
103
+ luminosity: 4.2e34, // cm⁻²s⁻¹
104
+ description:
105
+ 'Analysis of diphoton invariant mass spectrum from proton-proton collisions at √s = 13.6 TeV. This run focused on measuring the Higgs boson signal strength in the H→γγ decay channel with improved electromagnetic calorimeter calibration. The observed excess at 125.09 GeV is consistent with the Standard Model Higgs boson prediction within 1.2σ.',
106
+ results: {
107
+ observedEvents: 14283,
108
+ backgroundEstimate: 13950,
109
+ signalExcess: 333,
110
+ significance: 5.2, // sigma
111
+ higgsMass: 125.09, // GeV/c²
112
+ massUncertainty: 0.24,
113
+ signalStrength: 1.12,
114
+ signalStrengthError: 0.09,
115
+ },
116
+ eventSample: [
117
+ { eventId: 'EVT-90341', energy: 125.3, eta: -1.42, phi: 2.81, pt: 64.2, channel: 'diphoton', selected: true },
118
+ { eventId: 'EVT-90342', energy: 124.8, eta: 0.67, phi: -1.23, pt: 58.7, channel: 'diphoton', selected: true },
119
+ { eventId: 'EVT-90343', energy: 91.2, eta: 2.11, phi: 0.45, pt: 42.1, channel: 'Z-boson', selected: false },
120
+ { eventId: 'EVT-90344', energy: 125.1, eta: -0.23, phi: -2.67, pt: 71.3, channel: 'diphoton', selected: true },
121
+ { eventId: 'EVT-90345', energy: 80.4, eta: 1.89, phi: 1.12, pt: 38.5, channel: 'W-boson', selected: false },
122
+ { eventId: 'EVT-90346', energy: 125.0, eta: 0.02, phi: -0.89, pt: 66.8, channel: 'diphoton', selected: true },
123
+ ],
124
+ };
125
+
126
+ /** Sample JSON Schema for a tool */
127
+ export const sampleToolSchema = {
128
+ name: 'search_products',
129
+ description: 'Search the product catalog with filters and sorting options.',
130
+ inputSchema: {
131
+ type: 'object' as const,
132
+ properties: {
133
+ query: {
134
+ type: 'string',
135
+ description: 'Search query string',
136
+ },
137
+ category: {
138
+ type: 'string',
139
+ enum: ['Laptops', 'Phones', 'Tablets', 'Audio', 'Accessories'],
140
+ description: 'Filter by product category',
141
+ },
142
+ priceRange: {
143
+ type: 'object',
144
+ properties: {
145
+ min: { type: 'number', minimum: 0, description: 'Minimum price' },
146
+ max: { type: 'number', minimum: 0, description: 'Maximum price' },
147
+ },
148
+ description: 'Price range filter',
149
+ },
150
+ inStockOnly: {
151
+ type: 'boolean',
152
+ default: true,
153
+ description: 'Only show in-stock items',
154
+ },
155
+ sortBy: {
156
+ type: 'string',
157
+ enum: ['price', 'rating', 'name', 'stock'],
158
+ description: 'Sort results by field',
159
+ },
160
+ limit: {
161
+ type: 'integer',
162
+ minimum: 1,
163
+ maximum: 100,
164
+ default: 20,
165
+ description: 'Maximum number of results',
166
+ },
167
+ },
168
+ required: ['query'],
169
+ },
170
+ };
@@ -0,0 +1,74 @@
1
+ // ── test-mock subcommand: render mock data to HTML files ──
2
+ import { writeFileSync, mkdirSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { renderFromData, renderFromSchema } from '@mcp-html-bridge/ui-engine';
5
+ import { ecommerceData, physicsData, sampleToolSchema } from './mock-data.js';
6
+
7
+ export function testMock(outputDir: string, debug: boolean): void {
8
+ mkdirSync(outputDir, { recursive: true });
9
+
10
+ const opts = { debug };
11
+
12
+ // 1. E-commerce data (composite: metrics + grid)
13
+ const ecommerceHtml = renderFromData(ecommerceData, {
14
+ ...opts,
15
+ title: 'E-Commerce Dashboard — TechMart',
16
+ toolName: 'get_inventory',
17
+ });
18
+ const ecomPath = join(outputDir, 'ecommerce.html');
19
+ writeFileSync(ecomPath, ecommerceHtml);
20
+ console.log(` ✓ ${ecomPath}`);
21
+
22
+ // 2. E-commerce products only (data grid)
23
+ const gridHtml = renderFromData(ecommerceData.products, {
24
+ ...opts,
25
+ title: 'Product Grid',
26
+ toolName: 'list_products',
27
+ });
28
+ const gridPath = join(outputDir, 'data-grid.html');
29
+ writeFileSync(gridPath, gridHtml);
30
+ console.log(` ✓ ${gridPath}`);
31
+
32
+ // 3. Physics data (composite: reading block + metrics + grid)
33
+ const physicsHtml = renderFromData(physicsData, {
34
+ ...opts,
35
+ title: 'LHC Collision Analysis',
36
+ toolName: 'analyze_collisions',
37
+ });
38
+ const physicsPath = join(outputDir, 'physics.html');
39
+ writeFileSync(physicsPath, physicsHtml);
40
+ console.log(` ✓ ${physicsPath}`);
41
+
42
+ // 4. Physics results only (metrics cards)
43
+ const metricsHtml = renderFromData(physicsData.results, {
44
+ ...opts,
45
+ title: 'Collision Metrics',
46
+ toolName: 'get_results',
47
+ });
48
+ const metricsPath = join(outputDir, 'metrics.html');
49
+ writeFileSync(metricsPath, metricsHtml);
50
+ console.log(` ✓ ${metricsPath}`);
51
+
52
+ // 5. Tool schema (form)
53
+ const formHtml = renderFromSchema(sampleToolSchema.inputSchema, {
54
+ ...opts,
55
+ title: 'Search Products',
56
+ toolName: sampleToolSchema.name,
57
+ toolDescription: sampleToolSchema.description,
58
+ });
59
+ const formPath = join(outputDir, 'form.html');
60
+ writeFileSync(formPath, formHtml);
61
+ console.log(` ✓ ${formPath}`);
62
+
63
+ // 6. Deep JSON (json-tree)
64
+ const treeHtml = renderFromData(physicsData, {
65
+ ...opts,
66
+ title: 'Raw JSON Tree',
67
+ });
68
+ const treePath = join(outputDir, 'json-tree.html');
69
+ writeFileSync(treePath, treeHtml);
70
+ console.log(` ✓ ${treePath}`);
71
+
72
+ console.log(`\n ${6} HTML files written to ${outputDir}`);
73
+ console.log(' Open them in a browser to verify rendering.');
74
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,12 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "rootDir": "./src"
6
+ },
7
+ "include": ["src/**/*"],
8
+ "references": [
9
+ { "path": "../core-ui-engine" },
10
+ { "path": "../core-mcp-client" }
11
+ ]
12
+ }