solidworks-mcp 0.0.0-beta-20260330162636
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/README.md +40 -0
- package/bin/solidworks-mcp-server.cmd +23 -0
- package/bin/solidworks-mcp-server.js +2 -0
- package/dist/bootstrap/bridge-bootstrap.d.ts +25 -0
- package/dist/bootstrap/bridge-bootstrap.d.ts.map +1 -0
- package/dist/bootstrap/bridge-bootstrap.js +175 -0
- package/dist/bootstrap/bridge-bootstrap.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +277 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/assembly-tools.d.ts +73 -0
- package/dist/tools/assembly-tools.d.ts.map +1 -0
- package/dist/tools/assembly-tools.js +92 -0
- package/dist/tools/assembly-tools.js.map +1 -0
- package/dist/tools/document-tools.d.ts +59 -0
- package/dist/tools/document-tools.d.ts.map +1 -0
- package/dist/tools/document-tools.js +82 -0
- package/dist/tools/document-tools.js.map +1 -0
- package/dist/tools/feature-tools.d.ts +83 -0
- package/dist/tools/feature-tools.d.ts.map +1 -0
- package/dist/tools/feature-tools.js +106 -0
- package/dist/tools/feature-tools.js.map +1 -0
- package/dist/tools/selection-tools.d.ts +58 -0
- package/dist/tools/selection-tools.d.ts.map +1 -0
- package/dist/tools/selection-tools.js +69 -0
- package/dist/tools/selection-tools.js.map +1 -0
- package/dist/tools/sketch-tools.d.ts +156 -0
- package/dist/tools/sketch-tools.d.ts.map +1 -0
- package/dist/tools/sketch-tools.js +123 -0
- package/dist/tools/sketch-tools.js.map +1 -0
- package/dist/transport/named-pipe-client.d.ts +53 -0
- package/dist/transport/named-pipe-client.d.ts.map +1 -0
- package/dist/transport/named-pipe-client.js +189 -0
- package/dist/transport/named-pipe-client.js.map +1 -0
- package/dist/types/solidworks.d.ts +60 -0
- package/dist/types/solidworks.d.ts.map +1 -0
- package/dist/types/solidworks.js +79 -0
- package/dist/types/solidworks.js.map +1 -0
- package/package.json +61 -0
- package/vendor/bridge/SolidWorks.Interop.sldworks.dll +0 -0
- package/vendor/bridge/SolidWorks.Interop.swconst.dll +0 -0
- package/vendor/bridge/SolidWorksBridge.deps.json +58 -0
- package/vendor/bridge/SolidWorksBridge.dll +0 -0
- package/vendor/bridge/SolidWorksBridge.exe +0 -0
- package/vendor/bridge/SolidWorksBridge.pdb +0 -0
- package/vendor/bridge/SolidWorksBridge.runtimeconfig.json +14 -0
package/README.md
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# solidworks-mcp
|
|
2
|
+
|
|
3
|
+
Windows-only MCP server for driving SolidWorks through a C# COM bridge.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```powershell
|
|
8
|
+
npm install -g solidworks-mcp
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Requirements
|
|
12
|
+
|
|
13
|
+
- Windows
|
|
14
|
+
- SolidWorks installed locally
|
|
15
|
+
- Node.js 18+
|
|
16
|
+
- .NET 8 runtime if you rebuild the bridge from source
|
|
17
|
+
|
|
18
|
+
## Package contents
|
|
19
|
+
|
|
20
|
+
- `dist/`: compiled MCP server
|
|
21
|
+
- `vendor/bridge/`: published `SolidWorksBridge.exe` bundle
|
|
22
|
+
- `bin/solidworks-mcp-server.cmd`: Windows CLI entrypoint
|
|
23
|
+
|
|
24
|
+
## Run
|
|
25
|
+
|
|
26
|
+
```powershell
|
|
27
|
+
solidworks-mcp-server
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
If your host process does not inherit the npm global bin folder on Windows, run the shim by absolute path instead:
|
|
31
|
+
|
|
32
|
+
```powershell
|
|
33
|
+
C:\Users\<you>\AppData\Roaming\npm\solidworks-mcp-server.cmd
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
The server uses stdio for MCP and starts the bundled bridge automatically. If you need to override the bridge location, set `SOLIDWORKS_MCP_BRIDGE_ROOT` to a folder containing `SolidWorksBridge.exe`.
|
|
37
|
+
|
|
38
|
+
## Development
|
|
39
|
+
|
|
40
|
+
Use the repository root documentation for local development, tests, VS Code integration, and release workflow.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
@echo off
|
|
2
|
+
setlocal
|
|
3
|
+
|
|
4
|
+
set "SCRIPT_DIR=%~dp0"
|
|
5
|
+
set "PACKAGE_ROOT=%SCRIPT_DIR%.."
|
|
6
|
+
set "NODE_EXE=%npm_node_execpath%"
|
|
7
|
+
|
|
8
|
+
if not "%NODE_EXE%"=="" if exist "%NODE_EXE%" goto run
|
|
9
|
+
if exist "%PACKAGE_ROOT%\node.exe" set "NODE_EXE=%PACKAGE_ROOT%\node.exe"
|
|
10
|
+
if not "%NODE_EXE%"=="" if exist "%NODE_EXE%" goto run
|
|
11
|
+
if defined ProgramFiles if exist "%ProgramFiles%\nodejs\node.exe" set "NODE_EXE=%ProgramFiles%\nodejs\node.exe"
|
|
12
|
+
if not "%NODE_EXE%"=="" if exist "%NODE_EXE%" goto run
|
|
13
|
+
if defined ProgramFiles(x86) if exist "%ProgramFiles(x86)%\nodejs\node.exe" set "NODE_EXE=%ProgramFiles(x86)%\nodejs\node.exe"
|
|
14
|
+
if not "%NODE_EXE%"=="" if exist "%NODE_EXE%" goto run
|
|
15
|
+
for %%I in (node.exe) do set "NODE_EXE=%%~$PATH:I"
|
|
16
|
+
if not "%NODE_EXE%"=="" goto run
|
|
17
|
+
|
|
18
|
+
>&2 echo Unable to locate node.exe. Install Node.js 18+ or set npm_node_execpath.
|
|
19
|
+
exit /b 1
|
|
20
|
+
|
|
21
|
+
:run
|
|
22
|
+
"%NODE_EXE%" "%PACKAGE_ROOT%\dist\index.js" %*
|
|
23
|
+
exit /b %ERRORLEVEL%
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export declare const PIPE_NAME = "SolidWorksMcpBridge";
|
|
2
|
+
export interface PipeConnectable {
|
|
3
|
+
readonly connected: boolean;
|
|
4
|
+
connect(): Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
export interface BridgeBootstrapOptions {
|
|
7
|
+
pipeName?: string;
|
|
8
|
+
probeTimeoutMs?: number;
|
|
9
|
+
startupTimeoutMs?: number;
|
|
10
|
+
retryDelayMs?: number;
|
|
11
|
+
probePipe?: () => Promise<boolean>;
|
|
12
|
+
startBridgeProcess?: () => Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
interface BridgeLaunchPlan {
|
|
15
|
+
command: string;
|
|
16
|
+
args: string[];
|
|
17
|
+
cwd: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function resolveBridgeLaunchPlan(): BridgeLaunchPlan;
|
|
20
|
+
export declare function probeNamedPipe(pipeName: string, timeoutMs?: number): Promise<boolean>;
|
|
21
|
+
export declare function startBridgeProcess(): Promise<void>;
|
|
22
|
+
export declare function ensureBridgeReady(options?: BridgeBootstrapOptions): Promise<void>;
|
|
23
|
+
export declare function ensurePipeClientReady(client: PipeConnectable, options?: BridgeBootstrapOptions): Promise<void>;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=bridge-bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge-bootstrap.d.ts","sourceRoot":"","sources":["../../src/bootstrap/bridge-bootstrap.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,SAAS,wBAAwB,CAAC;AAM/C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C;AAED,UAAU,gBAAgB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAyGD,wBAAgB,uBAAuB,IAAI,gBAAgB,CAY1D;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,SAAS,SAA2B,GACnC,OAAO,CAAC,OAAO,CAAC,CAmClB;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBxD;AAED,wBAAsB,iBAAiB,CACrC,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,eAAe,EACvB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import * as net from 'node:net';
|
|
4
|
+
import * as path from 'node:path';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
export const PIPE_NAME = 'SolidWorksMcpBridge';
|
|
7
|
+
const DEFAULT_PROBE_TIMEOUT_MS = 500;
|
|
8
|
+
const DEFAULT_STARTUP_TIMEOUT_MS = 15000;
|
|
9
|
+
const DEFAULT_RETRY_DELAY_MS = 500;
|
|
10
|
+
const BRIDGE_ENV_ROOT = 'SOLIDWORKS_MCP_BRIDGE_ROOT';
|
|
11
|
+
function sleep(ms) {
|
|
12
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
13
|
+
}
|
|
14
|
+
async function tryConnectClient(client) {
|
|
15
|
+
try {
|
|
16
|
+
await client.connect();
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function getMcpServerDir() {
|
|
24
|
+
const moduleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
25
|
+
return path.resolve(moduleDir, '..', '..');
|
|
26
|
+
}
|
|
27
|
+
function getConfiguredBridgeRoot() {
|
|
28
|
+
const configuredRoot = process.env[BRIDGE_ENV_ROOT]?.trim();
|
|
29
|
+
if (!configuredRoot) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
return path.resolve(configuredRoot);
|
|
33
|
+
}
|
|
34
|
+
function getBundledBridgeDir() {
|
|
35
|
+
return path.resolve(getMcpServerDir(), 'vendor', 'bridge');
|
|
36
|
+
}
|
|
37
|
+
function getBridgeProjectDir() {
|
|
38
|
+
return path.resolve(getMcpServerDir(), '..', 'bridge', 'SolidWorksBridge');
|
|
39
|
+
}
|
|
40
|
+
function getBridgeSearchRoots() {
|
|
41
|
+
return Array.from(new Set([
|
|
42
|
+
getConfiguredBridgeRoot(),
|
|
43
|
+
getBridgeProjectDir(),
|
|
44
|
+
getBundledBridgeDir(),
|
|
45
|
+
].filter((root) => Boolean(root))));
|
|
46
|
+
}
|
|
47
|
+
function resolveBridgeLaunchPlanFromRoot(bridgeRoot) {
|
|
48
|
+
const packagedExe = path.join(bridgeRoot, 'SolidWorksBridge.exe');
|
|
49
|
+
if (fs.existsSync(packagedExe)) {
|
|
50
|
+
return {
|
|
51
|
+
command: packagedExe,
|
|
52
|
+
args: [],
|
|
53
|
+
cwd: path.dirname(packagedExe),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
const releaseExe = path.join(bridgeRoot, 'bin', 'Release', 'net8.0-windows', 'win-x64', 'SolidWorksBridge.exe');
|
|
57
|
+
if (fs.existsSync(releaseExe)) {
|
|
58
|
+
return {
|
|
59
|
+
command: releaseExe,
|
|
60
|
+
args: [],
|
|
61
|
+
cwd: path.dirname(releaseExe),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const debugExe = path.join(bridgeRoot, 'bin', 'Debug', 'net8.0-windows', 'win-x64', 'SolidWorksBridge.exe');
|
|
65
|
+
if (fs.existsSync(debugExe)) {
|
|
66
|
+
return {
|
|
67
|
+
command: debugExe,
|
|
68
|
+
args: [],
|
|
69
|
+
cwd: path.dirname(debugExe),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const projectFile = path.join(bridgeRoot, 'SolidWorksBridge.csproj');
|
|
73
|
+
if (fs.existsSync(projectFile)) {
|
|
74
|
+
return {
|
|
75
|
+
command: 'dotnet',
|
|
76
|
+
args: ['run', '--project', projectFile],
|
|
77
|
+
cwd: path.dirname(projectFile),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
export function resolveBridgeLaunchPlan() {
|
|
83
|
+
const searchRoots = getBridgeSearchRoots();
|
|
84
|
+
for (const bridgeRoot of searchRoots) {
|
|
85
|
+
const plan = resolveBridgeLaunchPlanFromRoot(bridgeRoot);
|
|
86
|
+
if (plan) {
|
|
87
|
+
return plan;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
throw new Error(`SolidWorks bridge launch target not found. Checked: ${searchRoots.join(', ')}. Set ${BRIDGE_ENV_ROOT}, run scripts\\deploy-local.bat, or bundle the bridge into vendor\\bridge.`);
|
|
91
|
+
}
|
|
92
|
+
export function probeNamedPipe(pipeName, timeoutMs = DEFAULT_PROBE_TIMEOUT_MS) {
|
|
93
|
+
const pipePath = `\\\\.\\pipe\\${pipeName}`;
|
|
94
|
+
return new Promise((resolve) => {
|
|
95
|
+
const socket = net.connect(pipePath);
|
|
96
|
+
let settled = false;
|
|
97
|
+
const finish = (connected) => {
|
|
98
|
+
if (settled) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
settled = true;
|
|
102
|
+
socket.removeAllListeners();
|
|
103
|
+
socket.destroy();
|
|
104
|
+
resolve(connected);
|
|
105
|
+
};
|
|
106
|
+
const timer = setTimeout(() => finish(false), timeoutMs);
|
|
107
|
+
socket.once('connect', () => {
|
|
108
|
+
clearTimeout(timer);
|
|
109
|
+
finish(true);
|
|
110
|
+
});
|
|
111
|
+
socket.once('error', () => {
|
|
112
|
+
clearTimeout(timer);
|
|
113
|
+
finish(false);
|
|
114
|
+
});
|
|
115
|
+
socket.once('close', () => {
|
|
116
|
+
clearTimeout(timer);
|
|
117
|
+
finish(false);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
export async function startBridgeProcess() {
|
|
122
|
+
const plan = resolveBridgeLaunchPlan();
|
|
123
|
+
await new Promise((resolve, reject) => {
|
|
124
|
+
const child = spawn(plan.command, plan.args, {
|
|
125
|
+
cwd: plan.cwd,
|
|
126
|
+
detached: true,
|
|
127
|
+
stdio: 'ignore',
|
|
128
|
+
windowsHide: true,
|
|
129
|
+
});
|
|
130
|
+
child.once('error', reject);
|
|
131
|
+
child.once('spawn', () => {
|
|
132
|
+
child.unref();
|
|
133
|
+
resolve();
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
export async function ensureBridgeReady(options = {}) {
|
|
138
|
+
const pipeName = options.pipeName ?? PIPE_NAME;
|
|
139
|
+
const probePipe = options.probePipe ?? (() => probeNamedPipe(pipeName, options.probeTimeoutMs));
|
|
140
|
+
const startBridge = options.startBridgeProcess ?? startBridgeProcess;
|
|
141
|
+
const startupTimeoutMs = options.startupTimeoutMs ?? DEFAULT_STARTUP_TIMEOUT_MS;
|
|
142
|
+
const retryDelayMs = options.retryDelayMs ?? DEFAULT_RETRY_DELAY_MS;
|
|
143
|
+
if (await probePipe()) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
await startBridge();
|
|
147
|
+
const deadline = Date.now() + startupTimeoutMs;
|
|
148
|
+
while (Date.now() < deadline) {
|
|
149
|
+
if (await probePipe()) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
await sleep(retryDelayMs);
|
|
153
|
+
}
|
|
154
|
+
throw new Error(`Timed out waiting for SolidWorks bridge pipe "${pipeName}" after ${startupTimeoutMs}ms.`);
|
|
155
|
+
}
|
|
156
|
+
export async function ensurePipeClientReady(client, options = {}) {
|
|
157
|
+
if (client.connected) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (await tryConnectClient(client)) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
await ensureBridgeReady(options);
|
|
164
|
+
const startupTimeoutMs = options.startupTimeoutMs ?? DEFAULT_STARTUP_TIMEOUT_MS;
|
|
165
|
+
const retryDelayMs = options.retryDelayMs ?? DEFAULT_RETRY_DELAY_MS;
|
|
166
|
+
const deadline = Date.now() + startupTimeoutMs;
|
|
167
|
+
while (Date.now() < deadline) {
|
|
168
|
+
if (await tryConnectClient(client)) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
await sleep(retryDelayMs);
|
|
172
|
+
}
|
|
173
|
+
throw new Error(`Timed out connecting MCP client to bridge pipe "${options.pipeName ?? PIPE_NAME}" after ${startupTimeoutMs}ms.`);
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=bridge-bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge-bootstrap.js","sourceRoot":"","sources":["../../src/bootstrap/bridge-bootstrap.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAmGA,eAAO,MAAM,WAAW,0BAA0B,CAAC;AACnD,eAAO,MAAM,cAAc,UAAU,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { PIPE_NAME, ensurePipeClientReady } from './bootstrap/bridge-bootstrap.js';
|
|
6
|
+
import { NamedPipeClient } from './transport/named-pipe-client.js';
|
|
7
|
+
// ── Tool modules ──────────────────────────────────────────────
|
|
8
|
+
import { ConnectSchema, DisconnectSchema, NewDocumentSchema, OpenDocumentSchema, CloseDocumentSchema, SaveDocumentSchema, ListDocumentsSchema, GetActiveDocumentSchema, swConnect, swDisconnect, swNewDocument, swOpenDocument, swCloseDocument, swSaveDocument, swListDocuments, swGetActiveDocument, } from './tools/document-tools.js';
|
|
9
|
+
import { SelectByNameSchema, ListEntitiesSchema, SelectEntitySchema, ClearSelectionSchema, swSelectByName, swListEntities, swSelectEntity, swClearSelection, } from './tools/selection-tools.js';
|
|
10
|
+
import { InsertSketchSchema, FinishSketchSchema, AddPointSchema, AddEllipseSchema, AddPolygonSchema, AddTextSchema, AddLineSchema, AddCircleSchema, AddRectangleSchema, AddArcSchema, swInsertSketch, swFinishSketch, swAddPoint, swAddEllipse, swAddPolygon, swAddText, swAddLine, swAddCircle, swAddRectangle, swAddArc, } from './tools/sketch-tools.js';
|
|
11
|
+
import { ExtrudeSchema, ExtrudeCutSchema, RevolveSchema, FilletSchema, ChamferSchema, ShellSchema, SimpleHoleSchema, swExtrude, swExtrudeCut, swRevolve, swFillet, swChamfer, swShell, swSimpleHole, } from './tools/feature-tools.js';
|
|
12
|
+
import { InsertComponentSchema, AddMateCoincidentSchema, AddMateConcentricSchema, AddMateParallelSchema, AddMateDistanceSchema, AddMateAngleSchema, ListComponentsSchema, swInsertComponent, swAddMateCoincident, swAddMateConcentric, swAddMateParallel, swAddMateDistance, swAddMateAngle, swListComponents, } from './tools/assembly-tools.js';
|
|
13
|
+
// ── Server metadata ───────────────────────────────────────────
|
|
14
|
+
export const SERVER_NAME = 'solidworks-mcp-server';
|
|
15
|
+
export const SERVER_VERSION = '0.1.0';
|
|
16
|
+
// ── Tool definitions ──────────────────────────────────────────
|
|
17
|
+
const TOOLS = [
|
|
18
|
+
// Document
|
|
19
|
+
{ name: 'sw_connect', description: 'Connect to the running SolidWorks instance', inputSchema: ConnectSchema },
|
|
20
|
+
{ name: 'sw_disconnect', description: 'Disconnect from SolidWorks', inputSchema: DisconnectSchema },
|
|
21
|
+
{ name: 'sw_new_document', description: 'Create a new SolidWorks document (Part, Assembly, or Drawing)', inputSchema: NewDocumentSchema },
|
|
22
|
+
{ name: 'sw_open_document', description: 'Open an existing SolidWorks document from disk', inputSchema: OpenDocumentSchema },
|
|
23
|
+
{ name: 'sw_close_document', description: 'Close an open SolidWorks document', inputSchema: CloseDocumentSchema },
|
|
24
|
+
{ name: 'sw_save_document', description: 'Save an open SolidWorks document', inputSchema: SaveDocumentSchema },
|
|
25
|
+
{ name: 'sw_list_documents', description: 'List all currently open SolidWorks documents', inputSchema: ListDocumentsSchema },
|
|
26
|
+
{ name: 'sw_get_active_document', description: 'Get the currently active SolidWorks document', inputSchema: GetActiveDocumentSchema },
|
|
27
|
+
// Selection
|
|
28
|
+
{ name: 'sw_select_by_name', description: 'Select an entity in SolidWorks by name and type (e.g. plane, face, edge)', inputSchema: SelectByNameSchema },
|
|
29
|
+
{ name: 'sw_list_entities', description: 'List selectable topology entities on the active part or assembly so downstream tools can target exact faces, edges, or vertices', inputSchema: ListEntitiesSchema },
|
|
30
|
+
{ name: 'sw_select_entity', description: 'Select a topology entity by the index returned from sw_list_entities', inputSchema: SelectEntitySchema },
|
|
31
|
+
{ name: 'sw_clear_selection', description: 'Clear all current selections in SolidWorks', inputSchema: ClearSelectionSchema },
|
|
32
|
+
// Sketch
|
|
33
|
+
{ name: 'sw_insert_sketch', description: 'Open a new sketch on the currently selected plane or face', inputSchema: InsertSketchSchema },
|
|
34
|
+
{ name: 'sw_finish_sketch', description: 'Close (finish) the currently open sketch and keep the completed sketch selected for downstream feature operations', inputSchema: FinishSketchSchema },
|
|
35
|
+
{ name: 'sw_add_point', description: 'Add a point to the open sketch', inputSchema: AddPointSchema },
|
|
36
|
+
{ name: 'sw_add_ellipse', description: 'Add an ellipse to the open sketch', inputSchema: AddEllipseSchema },
|
|
37
|
+
{ name: 'sw_add_polygon', description: 'Add a regular polygon to the open sketch', inputSchema: AddPolygonSchema },
|
|
38
|
+
{ name: 'sw_add_text', description: 'Add text to the open sketch', inputSchema: AddTextSchema },
|
|
39
|
+
{ name: 'sw_add_line', description: 'Add a line segment to the open sketch', inputSchema: AddLineSchema },
|
|
40
|
+
{ name: 'sw_add_circle', description: 'Add a circle to the open sketch', inputSchema: AddCircleSchema },
|
|
41
|
+
{ name: 'sw_add_rectangle', description: 'Add a rectangle to the open sketch', inputSchema: AddRectangleSchema },
|
|
42
|
+
{ name: 'sw_add_arc', description: 'Add an arc to the open sketch', inputSchema: AddArcSchema },
|
|
43
|
+
// Feature
|
|
44
|
+
{ name: 'sw_extrude', description: 'Extrude the current open sketch into a 3D boss feature. Call while sketch is in edit mode (do not finish sketch first).', inputSchema: ExtrudeSchema },
|
|
45
|
+
{ name: 'sw_extrude_cut', description: 'Extrude-cut the current sketch to remove material. Works on the active sketch or on the sketch most recently finished with sw_finish_sketch.', inputSchema: ExtrudeCutSchema },
|
|
46
|
+
{ name: 'sw_revolve', description: 'Revolve the current open sketch around the selected axis', inputSchema: RevolveSchema },
|
|
47
|
+
{ name: 'sw_fillet', description: 'Apply a fillet to the selected edges', inputSchema: FilletSchema },
|
|
48
|
+
{ name: 'sw_chamfer', description: 'Apply a chamfer to the selected edges', inputSchema: ChamferSchema },
|
|
49
|
+
{ name: 'sw_shell', description: 'Shell the 3D body, removing the selected open faces', inputSchema: ShellSchema },
|
|
50
|
+
{ name: 'sw_simple_hole', description: 'Create a simple hole at the selected point on a face', inputSchema: SimpleHoleSchema },
|
|
51
|
+
// Assembly
|
|
52
|
+
{ name: 'sw_insert_component', description: 'Insert a part or sub-assembly into the active assembly', inputSchema: InsertComponentSchema },
|
|
53
|
+
{ name: 'sw_add_mate_coincident', description: 'Add a Coincident mate between two selected entities in the assembly', inputSchema: AddMateCoincidentSchema },
|
|
54
|
+
{ name: 'sw_add_mate_concentric', description: 'Add a Concentric mate between two selected circular entities', inputSchema: AddMateConcentricSchema },
|
|
55
|
+
{ name: 'sw_add_mate_parallel', description: 'Add a Parallel mate between two selected planar entities', inputSchema: AddMateParallelSchema },
|
|
56
|
+
{ name: 'sw_add_mate_distance', description: 'Add a Distance mate between two selected entities', inputSchema: AddMateDistanceSchema },
|
|
57
|
+
{ name: 'sw_add_mate_angle', description: 'Add an Angle mate between two selected entities', inputSchema: AddMateAngleSchema },
|
|
58
|
+
{ name: 'sw_list_components', description: 'List all top-level components in the active assembly', inputSchema: ListComponentsSchema },
|
|
59
|
+
];
|
|
60
|
+
// ── Convert Zod schema to MCP JSON Schema ─────────────────────
|
|
61
|
+
function zodToJsonSchema(schema) {
|
|
62
|
+
// Light-weight converter for the subset of Zod used here
|
|
63
|
+
if (schema instanceof z.ZodObject) {
|
|
64
|
+
const shape = schema.shape;
|
|
65
|
+
const properties = {};
|
|
66
|
+
const required = [];
|
|
67
|
+
for (const [key, val] of Object.entries(shape)) {
|
|
68
|
+
properties[key] = zodToJsonSchema(val);
|
|
69
|
+
const isOptional = val instanceof z.ZodOptional ||
|
|
70
|
+
val instanceof z.ZodDefault;
|
|
71
|
+
if (!isOptional)
|
|
72
|
+
required.push(key);
|
|
73
|
+
}
|
|
74
|
+
const result = { type: 'object', properties };
|
|
75
|
+
if (required.length > 0)
|
|
76
|
+
result.required = required;
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
if (schema instanceof z.ZodString)
|
|
80
|
+
return { type: 'string', description: schema.description };
|
|
81
|
+
if (schema instanceof z.ZodNumber)
|
|
82
|
+
return { type: 'number', description: schema.description };
|
|
83
|
+
if (schema instanceof z.ZodBoolean)
|
|
84
|
+
return { type: 'boolean', description: schema.description };
|
|
85
|
+
if (schema instanceof z.ZodEnum)
|
|
86
|
+
return { type: 'string', enum: schema.options, description: schema.description };
|
|
87
|
+
if (schema instanceof z.ZodOptional)
|
|
88
|
+
return zodToJsonSchema(schema.unwrap());
|
|
89
|
+
if (schema instanceof z.ZodDefault)
|
|
90
|
+
return zodToJsonSchema(schema._def.innerType);
|
|
91
|
+
return {};
|
|
92
|
+
}
|
|
93
|
+
// ── Main ──────────────────────────────────────────────────────
|
|
94
|
+
async function main() {
|
|
95
|
+
const client = new NamedPipeClient({ pipeName: PIPE_NAME });
|
|
96
|
+
let ensureClientReadyPromise = null;
|
|
97
|
+
const ensureClientReady = async () => {
|
|
98
|
+
if (client.connected) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (!ensureClientReadyPromise) {
|
|
102
|
+
ensureClientReadyPromise = ensurePipeClientReady(client, { pipeName: PIPE_NAME }).finally(() => {
|
|
103
|
+
ensureClientReadyPromise = null;
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
await ensureClientReadyPromise;
|
|
107
|
+
};
|
|
108
|
+
await ensureClientReady();
|
|
109
|
+
const server = new Server({ name: SERVER_NAME, version: SERVER_VERSION }, { capabilities: { tools: {} } });
|
|
110
|
+
// List tools
|
|
111
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
112
|
+
tools: TOOLS.map((t) => ({
|
|
113
|
+
name: t.name,
|
|
114
|
+
description: t.description,
|
|
115
|
+
inputSchema: zodToJsonSchema(t.inputSchema),
|
|
116
|
+
})),
|
|
117
|
+
}));
|
|
118
|
+
// Call tool
|
|
119
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
120
|
+
const { name, arguments: args } = request.params;
|
|
121
|
+
const params = (args ?? {});
|
|
122
|
+
try {
|
|
123
|
+
if (name !== 'sw_disconnect') {
|
|
124
|
+
await ensureClientReady();
|
|
125
|
+
}
|
|
126
|
+
let result;
|
|
127
|
+
switch (name) {
|
|
128
|
+
// Document
|
|
129
|
+
case 'sw_connect':
|
|
130
|
+
result = await swConnect(client);
|
|
131
|
+
break;
|
|
132
|
+
case 'sw_disconnect':
|
|
133
|
+
result = await swDisconnect(client);
|
|
134
|
+
break;
|
|
135
|
+
case 'sw_new_document':
|
|
136
|
+
result = await swNewDocument(client, NewDocumentSchema.parse(params));
|
|
137
|
+
break;
|
|
138
|
+
case 'sw_open_document':
|
|
139
|
+
result = await swOpenDocument(client, OpenDocumentSchema.parse(params));
|
|
140
|
+
break;
|
|
141
|
+
case 'sw_close_document':
|
|
142
|
+
result = await swCloseDocument(client, CloseDocumentSchema.parse(params));
|
|
143
|
+
break;
|
|
144
|
+
case 'sw_save_document':
|
|
145
|
+
result = await swSaveDocument(client, SaveDocumentSchema.parse(params));
|
|
146
|
+
break;
|
|
147
|
+
case 'sw_list_documents':
|
|
148
|
+
result = await swListDocuments(client);
|
|
149
|
+
break;
|
|
150
|
+
case 'sw_get_active_document':
|
|
151
|
+
result = await swGetActiveDocument(client);
|
|
152
|
+
break;
|
|
153
|
+
// Selection
|
|
154
|
+
case 'sw_select_by_name':
|
|
155
|
+
result = await swSelectByName(client, SelectByNameSchema.parse(params));
|
|
156
|
+
break;
|
|
157
|
+
case 'sw_list_entities':
|
|
158
|
+
result = await swListEntities(client, ListEntitiesSchema.parse(params));
|
|
159
|
+
break;
|
|
160
|
+
case 'sw_select_entity':
|
|
161
|
+
result = await swSelectEntity(client, SelectEntitySchema.parse(params));
|
|
162
|
+
break;
|
|
163
|
+
case 'sw_clear_selection':
|
|
164
|
+
await swClearSelection(client);
|
|
165
|
+
result = { cleared: true };
|
|
166
|
+
break;
|
|
167
|
+
// Sketch
|
|
168
|
+
case 'sw_insert_sketch':
|
|
169
|
+
await swInsertSketch(client);
|
|
170
|
+
result = { ok: true };
|
|
171
|
+
break;
|
|
172
|
+
case 'sw_finish_sketch':
|
|
173
|
+
await swFinishSketch(client);
|
|
174
|
+
result = { ok: true };
|
|
175
|
+
break;
|
|
176
|
+
case 'sw_add_point':
|
|
177
|
+
result = await swAddPoint(client, AddPointSchema.parse(params));
|
|
178
|
+
break;
|
|
179
|
+
case 'sw_add_ellipse':
|
|
180
|
+
result = await swAddEllipse(client, AddEllipseSchema.parse(params));
|
|
181
|
+
break;
|
|
182
|
+
case 'sw_add_polygon':
|
|
183
|
+
result = await swAddPolygon(client, AddPolygonSchema.parse(params));
|
|
184
|
+
break;
|
|
185
|
+
case 'sw_add_text':
|
|
186
|
+
result = await swAddText(client, AddTextSchema.parse(params));
|
|
187
|
+
break;
|
|
188
|
+
case 'sw_add_line':
|
|
189
|
+
result = await swAddLine(client, AddLineSchema.parse(params));
|
|
190
|
+
break;
|
|
191
|
+
case 'sw_add_circle':
|
|
192
|
+
result = await swAddCircle(client, AddCircleSchema.parse(params));
|
|
193
|
+
break;
|
|
194
|
+
case 'sw_add_rectangle':
|
|
195
|
+
result = await swAddRectangle(client, AddRectangleSchema.parse(params));
|
|
196
|
+
break;
|
|
197
|
+
case 'sw_add_arc':
|
|
198
|
+
result = await swAddArc(client, AddArcSchema.parse(params));
|
|
199
|
+
break;
|
|
200
|
+
// Feature
|
|
201
|
+
case 'sw_extrude':
|
|
202
|
+
result = await swExtrude(client, ExtrudeSchema.parse(params));
|
|
203
|
+
break;
|
|
204
|
+
case 'sw_extrude_cut':
|
|
205
|
+
result = await swExtrudeCut(client, ExtrudeCutSchema.parse(params));
|
|
206
|
+
break;
|
|
207
|
+
case 'sw_revolve':
|
|
208
|
+
result = await swRevolve(client, RevolveSchema.parse(params));
|
|
209
|
+
break;
|
|
210
|
+
case 'sw_fillet':
|
|
211
|
+
result = await swFillet(client, FilletSchema.parse(params));
|
|
212
|
+
break;
|
|
213
|
+
case 'sw_chamfer':
|
|
214
|
+
result = await swChamfer(client, ChamferSchema.parse(params));
|
|
215
|
+
break;
|
|
216
|
+
case 'sw_shell':
|
|
217
|
+
result = await swShell(client, ShellSchema.parse(params));
|
|
218
|
+
break;
|
|
219
|
+
case 'sw_simple_hole':
|
|
220
|
+
result = await swSimpleHole(client, SimpleHoleSchema.parse(params));
|
|
221
|
+
break;
|
|
222
|
+
// Assembly
|
|
223
|
+
case 'sw_insert_component':
|
|
224
|
+
result = await swInsertComponent(client, InsertComponentSchema.parse(params));
|
|
225
|
+
break;
|
|
226
|
+
case 'sw_add_mate_coincident':
|
|
227
|
+
await swAddMateCoincident(client, AddMateCoincidentSchema.parse(params));
|
|
228
|
+
result = { ok: true };
|
|
229
|
+
break;
|
|
230
|
+
case 'sw_add_mate_concentric':
|
|
231
|
+
await swAddMateConcentric(client, AddMateConcentricSchema.parse(params));
|
|
232
|
+
result = { ok: true };
|
|
233
|
+
break;
|
|
234
|
+
case 'sw_add_mate_parallel':
|
|
235
|
+
await swAddMateParallel(client, AddMateParallelSchema.parse(params));
|
|
236
|
+
result = { ok: true };
|
|
237
|
+
break;
|
|
238
|
+
case 'sw_add_mate_distance':
|
|
239
|
+
await swAddMateDistance(client, AddMateDistanceSchema.parse(params));
|
|
240
|
+
result = { ok: true };
|
|
241
|
+
break;
|
|
242
|
+
case 'sw_add_mate_angle':
|
|
243
|
+
await swAddMateAngle(client, AddMateAngleSchema.parse(params));
|
|
244
|
+
result = { ok: true };
|
|
245
|
+
break;
|
|
246
|
+
case 'sw_list_components':
|
|
247
|
+
result = await swListComponents(client);
|
|
248
|
+
break;
|
|
249
|
+
default:
|
|
250
|
+
return {
|
|
251
|
+
content: [{ type: 'text', text: `Unknown tool: ${name}` }],
|
|
252
|
+
isError: true,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
return {
|
|
256
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
catch (err) {
|
|
260
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
261
|
+
return {
|
|
262
|
+
content: [{ type: 'text', text: `Error: ${message}` }],
|
|
263
|
+
isError: true,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
const transport = new StdioServerTransport();
|
|
268
|
+
await server.connect(transport);
|
|
269
|
+
}
|
|
270
|
+
// Run only when this is the entry-point module (not during tests)
|
|
271
|
+
if (process.argv[1] && !process.env.VITEST) {
|
|
272
|
+
main().catch((err) => {
|
|
273
|
+
console.error('Fatal error:', err);
|
|
274
|
+
process.exit(1);
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|