@ifc-lite/cli 0.7.0 → 0.8.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/dist/commands/mcp.d.ts +2 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +158 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/package.json +5 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AA8BA,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8I9D"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
/**
|
|
5
|
+
* `ifc-lite mcp` — start an MCP server bound to the supplied IFC files.
|
|
6
|
+
*
|
|
7
|
+
* Thin wrapper that delegates to `@ifc-lite/mcp`'s CLI runtime so the
|
|
8
|
+
* surface stays in one place. We accept the same flags as `ifc-lite-mcp`
|
|
9
|
+
* but go through the @ifc-lite/cli help/discovery channel.
|
|
10
|
+
*/
|
|
11
|
+
import { resolve } from 'node:path';
|
|
12
|
+
import { StdioTransport, HttpTransport, BearerTokenAuth, AllowAllAuth, loadIfcModel, createMCPServer, InMemoryModelRegistry, fullScope, readOnlyScope, VERSION, } from '@ifc-lite/mcp';
|
|
13
|
+
import { fatal, hasFlag, getFlag, getAllFlags } from '../output.js';
|
|
14
|
+
export async function mcpCommand(args) {
|
|
15
|
+
if (args.length === 0 && (process.stdin.isTTY ?? false)) {
|
|
16
|
+
process.stderr.write([
|
|
17
|
+
'Usage: ifc-lite mcp <file.ifc> [more.ifc…] [options]',
|
|
18
|
+
'',
|
|
19
|
+
'Options:',
|
|
20
|
+
' --read-only Hide mutation tools.',
|
|
21
|
+
' --transport stdio|http (default stdio)',
|
|
22
|
+
' --port <n> HTTP port (default 8765)',
|
|
23
|
+
' --host <h> HTTP host (default 127.0.0.1; non-loopback requires --token or --insecure)',
|
|
24
|
+
' --token <bearer> HTTP token for full scope',
|
|
25
|
+
' --insecure Allow non-loopback bind without --token (DEV ONLY)',
|
|
26
|
+
' --bsdd <url> Override bSDD endpoint',
|
|
27
|
+
' --allow <path> Restrict file-system access',
|
|
28
|
+
' --viewer Auto-open the 3D viewer.',
|
|
29
|
+
' --viewer-port <n> Preferred viewer port (0 = auto).',
|
|
30
|
+
' --open Auto-open viewer AND open the URL in your browser.',
|
|
31
|
+
'',
|
|
32
|
+
'Examples:',
|
|
33
|
+
' ifc-lite mcp ./model.ifc',
|
|
34
|
+
' ifc-lite mcp --read-only ./model.ifc',
|
|
35
|
+
' ifc-lite mcp --viewer ./model.ifc',
|
|
36
|
+
' ifc-lite mcp --open ./model.ifc',
|
|
37
|
+
' ifc-lite mcp --transport http --port 8765 --token abc ./model.ifc',
|
|
38
|
+
].join('\n') + '\n');
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const transport = (getFlag(args, '--transport') ?? 'stdio');
|
|
42
|
+
const port = Number(getFlag(args, '--port') ?? 8765);
|
|
43
|
+
const host = getFlag(args, '--host');
|
|
44
|
+
const token = getFlag(args, '--token');
|
|
45
|
+
const bsdd = getFlag(args, '--bsdd');
|
|
46
|
+
const readOnly = hasFlag(args, '--read-only');
|
|
47
|
+
const insecure = hasFlag(args, '--insecure');
|
|
48
|
+
const autoViewer = hasFlag(args, '--viewer') || hasFlag(args, '--open');
|
|
49
|
+
const openBrowser = hasFlag(args, '--open');
|
|
50
|
+
const viewerPort = Number(getFlag(args, '--viewer-port') ?? 0);
|
|
51
|
+
const allowedPaths = getAllFlags(args, '--allow').map((p) => resolve(p));
|
|
52
|
+
// Parse positional .ifc paths. The naive `args.filter(a => !a.startsWith('-'))`
|
|
53
|
+
// also catches option values (e.g. `8765` after `--port`, `/models` after
|
|
54
|
+
// `--allow`), turning them into bogus IFC paths. Walk explicitly and skip
|
|
55
|
+
// each value-bearing flag's next token.
|
|
56
|
+
const VALUE_FLAGS = new Set([
|
|
57
|
+
'--transport', '--port', '--host', '--token', '--bsdd',
|
|
58
|
+
'--allow', '--viewer-port',
|
|
59
|
+
]);
|
|
60
|
+
const files = [];
|
|
61
|
+
for (let i = 0; i < args.length; i++) {
|
|
62
|
+
const arg = args[i];
|
|
63
|
+
if (arg.startsWith('-')) {
|
|
64
|
+
if (VALUE_FLAGS.has(arg))
|
|
65
|
+
i++; // consume the value as well
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
files.push(resolve(arg));
|
|
69
|
+
}
|
|
70
|
+
const scope = readOnly ? readOnlyScope() : fullScope();
|
|
71
|
+
if (transport === 'stdio') {
|
|
72
|
+
if (files.length === 0)
|
|
73
|
+
fatal('Provide at least one .ifc file (or use --transport http).');
|
|
74
|
+
const registry = new InMemoryModelRegistry();
|
|
75
|
+
for (const file of files) {
|
|
76
|
+
const m = await loadIfcModel(file, { allowedPaths: allowedPaths.length > 0 ? allowedPaths : undefined });
|
|
77
|
+
registry.add(m);
|
|
78
|
+
process.stderr.write(`[ifc-lite mcp] loaded ${m.name} (${m.id})\n`);
|
|
79
|
+
}
|
|
80
|
+
const server = createMCPServer({
|
|
81
|
+
version: VERSION,
|
|
82
|
+
registry,
|
|
83
|
+
scope,
|
|
84
|
+
config: {
|
|
85
|
+
readOnly,
|
|
86
|
+
bsddEndpoint: bsdd,
|
|
87
|
+
allowedPaths: allowedPaths.length > 0 ? allowedPaths : undefined,
|
|
88
|
+
samplingEnabled: false,
|
|
89
|
+
autoOpenViewer: autoViewer,
|
|
90
|
+
viewerPort,
|
|
91
|
+
},
|
|
92
|
+
logger: {
|
|
93
|
+
log(level, message, data) {
|
|
94
|
+
if (level === 'debug')
|
|
95
|
+
return;
|
|
96
|
+
process.stderr.write(`[ifc-lite mcp] ${level} ${message}${data ? ' ' + JSON.stringify(data) : ''}\n`);
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
const t = new StdioTransport();
|
|
101
|
+
await t.connect(server);
|
|
102
|
+
process.stderr.write(`[ifc-lite mcp] ready on stdio (${registry.count()} model${registry.count() === 1 ? '' : 's'}, read-only=${readOnly})\n`);
|
|
103
|
+
if (autoViewer && registry.count() > 0) {
|
|
104
|
+
const first = registry.list()[0];
|
|
105
|
+
try {
|
|
106
|
+
const state = await server.viewer.open(first, viewerPort);
|
|
107
|
+
const adapters = server.viewer.adapters();
|
|
108
|
+
if (adapters)
|
|
109
|
+
first.backend.attachStreamingAdapters(adapters.viewer, adapters.visibility);
|
|
110
|
+
process.stderr.write(`[ifc-lite mcp] viewer ready at ${state.url}\n`);
|
|
111
|
+
if (openBrowser) {
|
|
112
|
+
const cmd = process.platform === 'darwin' ? 'open'
|
|
113
|
+
: process.platform === 'win32' ? 'start'
|
|
114
|
+
: 'xdg-open';
|
|
115
|
+
try {
|
|
116
|
+
const { spawn } = await import('node:child_process');
|
|
117
|
+
spawn(cmd, [state.url], { detached: true, stdio: 'ignore' }).unref();
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
process.stderr.write(`[ifc-lite mcp] could not auto-open browser: ${err.message}\n`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
process.stderr.write(`[ifc-lite mcp] viewer auto-open failed: ${err.message}\n`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else if (transport === 'http') {
|
|
130
|
+
const resolvedHost = host ?? '127.0.0.1';
|
|
131
|
+
const isLoopback = resolvedHost === '127.0.0.1' || resolvedHost === 'localhost' || resolvedHost === '::1';
|
|
132
|
+
if (!isLoopback && !token && !insecure) {
|
|
133
|
+
fatal(`Refusing to bind ${resolvedHost} without --token. Pass --token <bearer> or --insecure to override.`);
|
|
134
|
+
}
|
|
135
|
+
const sessionFactory = {
|
|
136
|
+
build(scopeForSession) {
|
|
137
|
+
return createMCPServer({
|
|
138
|
+
version: VERSION,
|
|
139
|
+
registry: new InMemoryModelRegistry(),
|
|
140
|
+
scope: scopeForSession,
|
|
141
|
+
config: { readOnly, bsddEndpoint: bsdd, samplingEnabled: false },
|
|
142
|
+
});
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
const auth = token
|
|
146
|
+
? new BearerTokenAuth(new Map([[token, scope]]))
|
|
147
|
+
: new AllowAllAuth(scope);
|
|
148
|
+
const t = new HttpTransport({ port, host: resolvedHost, authenticator: auth, sessionFactory });
|
|
149
|
+
await t.listen();
|
|
150
|
+
process.stderr.write(`[ifc-lite mcp] listening on http://${resolvedHost}:${port}` +
|
|
151
|
+
(!token ? ' (no auth — loopback only unless --insecure)' : '') +
|
|
152
|
+
'\n');
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
fatal(`Unknown transport: ${transport}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -29,6 +29,7 @@ import { askCommand } from './commands/ask.js';
|
|
|
29
29
|
import { viewCommand } from './commands/view.js';
|
|
30
30
|
import { analyzeCommand } from './commands/analyze.js';
|
|
31
31
|
import { lodCommand } from './commands/lod.js';
|
|
32
|
+
import { mcpCommand } from './commands/mcp.js';
|
|
32
33
|
import { readFileSync } from 'node:fs';
|
|
33
34
|
import { fileURLToPath } from 'node:url';
|
|
34
35
|
import { dirname, join } from 'node:path';
|
|
@@ -73,6 +74,7 @@ const HELP = `
|
|
|
73
74
|
view <file.ifc> [--port N] Interactive 3D viewer in browser
|
|
74
75
|
analyze <file.ifc> --viewer <port> Query + visualize analysis results
|
|
75
76
|
lod <file.ifc> --level 0|1 Generate lightweight LOD artifacts
|
|
77
|
+
mcp <file.ifc> [--transport stdio|http] Start an MCP server bound to one or more IFC files
|
|
76
78
|
|
|
77
79
|
Options:
|
|
78
80
|
--help, -h Show help
|
|
@@ -129,6 +131,10 @@ const HELP = `
|
|
|
129
131
|
ifc-lite analyze model.ifc --viewer 3456 --rules rules.json --json
|
|
130
132
|
ifc-lite lod model.ifc --level 0 --out model.lod0.json
|
|
131
133
|
ifc-lite lod model.ifc --level 1 --out model.glb --meta model.lod1.json
|
|
134
|
+
ifc-lite mcp model.ifc
|
|
135
|
+
ifc-lite mcp model.ifc --read-only
|
|
136
|
+
ifc-lite mcp arch.ifc struct.ifc --federate
|
|
137
|
+
ifc-lite mcp model.ifc --transport http --port 8765 --token abc
|
|
132
138
|
|
|
133
139
|
Pipe-friendly:
|
|
134
140
|
ifc-lite query model.ifc --type IfcWall --json | jq '.[].name'
|
|
@@ -220,6 +226,9 @@ async function main() {
|
|
|
220
226
|
case 'lod':
|
|
221
227
|
await lodCommand(commandArgs);
|
|
222
228
|
break;
|
|
229
|
+
case 'mcp':
|
|
230
|
+
await mcpCommand(commandArgs);
|
|
231
|
+
break;
|
|
223
232
|
default:
|
|
224
233
|
process.stderr.write(`Unknown command: ${command}\n`);
|
|
225
234
|
process.stderr.write(`Run 'ifc-lite --help' for usage.\n`);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;+DAE+D;AAE/D;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,+DAA+D;QAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QACvD,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;AAE7B,MAAM,IAAI,GAAG;cACC,OAAO
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ifc-lite/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "CLI toolkit for IFC files — query, validate, export, create, and script BIM data",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -19,18 +19,19 @@
|
|
|
19
19
|
"README.md"
|
|
20
20
|
],
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@ifc-lite/parser": "^2.
|
|
22
|
+
"@ifc-lite/parser": "^2.3.0",
|
|
23
23
|
"@ifc-lite/query": "^1.14.7",
|
|
24
24
|
"@ifc-lite/data": "^1.15.2",
|
|
25
25
|
"@ifc-lite/sdk": "^1.15.0",
|
|
26
26
|
"@ifc-lite/export": "^1.18.0",
|
|
27
|
-
"@ifc-lite/ids": "^1.14.
|
|
27
|
+
"@ifc-lite/ids": "^1.14.11",
|
|
28
28
|
"@ifc-lite/bcf": "^1.15.3",
|
|
29
29
|
"@ifc-lite/create": "^1.15.0",
|
|
30
30
|
"@ifc-lite/encoding": "^1.14.6",
|
|
31
31
|
"@ifc-lite/sandbox": "^1.15.0",
|
|
32
32
|
"@ifc-lite/mutations": "^1.15.0",
|
|
33
|
-
"@ifc-lite/
|
|
33
|
+
"@ifc-lite/mcp": "^0.2.0",
|
|
34
|
+
"@ifc-lite/wasm": "^1.16.8",
|
|
34
35
|
"@ifc-lite/viewer-core": "^0.2.3"
|
|
35
36
|
},
|
|
36
37
|
"devDependencies": {
|