godot-mcp-runtime 2.2.3 → 3.0.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/README.md +30 -93
- package/dist/dispatch.d.ts +1 -11
- package/dist/dispatch.d.ts.map +1 -1
- package/dist/dispatch.js +7 -8
- package/dist/dispatch.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -10
- package/dist/index.js.map +1 -1
- package/dist/scripts/godot_operations.gd +134 -283
- package/dist/scripts/mcp_bridge.gd +210 -43
- package/dist/tools/autoload-tools.d.ts +51 -0
- package/dist/tools/autoload-tools.d.ts.map +1 -0
- package/dist/tools/autoload-tools.js +187 -0
- package/dist/tools/autoload-tools.js.map +1 -0
- package/dist/tools/node-tools.d.ts +9 -78
- package/dist/tools/node-tools.d.ts.map +1 -1
- package/dist/tools/node-tools.js +114 -310
- package/dist/tools/node-tools.js.map +1 -1
- package/dist/tools/project-tools.d.ts +0 -168
- package/dist/tools/project-tools.d.ts.map +1 -1
- package/dist/tools/project-tools.js +120 -1192
- package/dist/tools/project-tools.js.map +1 -1
- package/dist/tools/runtime-tools.d.ts +108 -0
- package/dist/tools/runtime-tools.d.ts.map +1 -0
- package/dist/tools/runtime-tools.js +808 -0
- package/dist/tools/runtime-tools.js.map +1 -0
- package/dist/tools/scene-tools.d.ts +6 -48
- package/dist/tools/scene-tools.d.ts.map +1 -1
- package/dist/tools/scene-tools.js +67 -211
- package/dist/tools/scene-tools.js.map +1 -1
- package/dist/tools/validate-tools.d.ts.map +1 -1
- package/dist/tools/validate-tools.js +35 -29
- package/dist/tools/validate-tools.js.map +1 -1
- package/dist/utils/autoload-ini.d.ts +32 -0
- package/dist/utils/autoload-ini.d.ts.map +1 -0
- package/dist/utils/autoload-ini.js +111 -0
- package/dist/utils/autoload-ini.js.map +1 -0
- package/dist/utils/bridge-manager.d.ts +29 -0
- package/dist/utils/bridge-manager.d.ts.map +1 -0
- package/dist/utils/bridge-manager.js +136 -0
- package/dist/utils/bridge-manager.js.map +1 -0
- package/dist/utils/bridge-protocol.d.ts +34 -0
- package/dist/utils/bridge-protocol.d.ts.map +1 -0
- package/dist/utils/bridge-protocol.js +65 -0
- package/dist/utils/bridge-protocol.js.map +1 -0
- package/dist/utils/godot-runner.d.ts +70 -15
- package/dist/utils/godot-runner.d.ts.map +1 -1
- package/dist/utils/godot-runner.js +309 -277
- package/dist/utils/godot-runner.js.map +1 -1
- package/dist/utils/handler-helpers.d.ts +34 -0
- package/dist/utils/handler-helpers.d.ts.map +1 -0
- package/dist/utils/handler-helpers.js +55 -0
- package/dist/utils/handler-helpers.js.map +1 -0
- package/dist/utils/logger.d.ts +3 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +11 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +7 -4
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire format shared between the Node-side `GodotRunner.sendCommand` and the
|
|
3
|
+
* GDScript-side `McpBridge` autoload.
|
|
4
|
+
*
|
|
5
|
+
* KEEP IN SYNC: src/scripts/mcp_bridge.gd implements the same framing on the
|
|
6
|
+
* Godot side. Any change here MUST be mirrored there (and vice versa).
|
|
7
|
+
*
|
|
8
|
+
* Frame: 4-byte big-endian length prefix + UTF-8 JSON payload.
|
|
9
|
+
* Max frame size is 16 MiB; oversize frames are rejected on receive.
|
|
10
|
+
*/
|
|
11
|
+
export const DEFAULT_BRIDGE_PORT = 9900;
|
|
12
|
+
export const MAX_FRAME_BYTES = 16 * 1024 * 1024;
|
|
13
|
+
const FRAME_HEADER_BYTES = 4;
|
|
14
|
+
/**
|
|
15
|
+
* Resolve the bridge port. Reads `MCP_BRIDGE_PORT` from the environment, falls
|
|
16
|
+
* back to {@link DEFAULT_BRIDGE_PORT}. Invalid values fall back to the default.
|
|
17
|
+
*/
|
|
18
|
+
export function getBridgePort() {
|
|
19
|
+
const raw = process.env.MCP_BRIDGE_PORT;
|
|
20
|
+
if (!raw)
|
|
21
|
+
return DEFAULT_BRIDGE_PORT;
|
|
22
|
+
const parsed = Number.parseInt(raw, 10);
|
|
23
|
+
if (!Number.isFinite(parsed) || parsed <= 0 || parsed > 65535) {
|
|
24
|
+
return DEFAULT_BRIDGE_PORT;
|
|
25
|
+
}
|
|
26
|
+
return parsed;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Encode a JSON string as a length-prefixed frame.
|
|
30
|
+
*/
|
|
31
|
+
export function encodeFrame(payload) {
|
|
32
|
+
const body = Buffer.from(payload, 'utf8');
|
|
33
|
+
if (body.length > MAX_FRAME_BYTES) {
|
|
34
|
+
throw new Error(`Bridge frame too large: ${body.length} bytes (limit ${MAX_FRAME_BYTES})`);
|
|
35
|
+
}
|
|
36
|
+
const header = Buffer.alloc(FRAME_HEADER_BYTES);
|
|
37
|
+
header.writeUInt32BE(body.length, 0);
|
|
38
|
+
return Buffer.concat([header, body], FRAME_HEADER_BYTES + body.length);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Pull as many complete frames as possible from a streaming buffer. Any
|
|
42
|
+
* partial frame at the tail is returned as `remainder` for the next call.
|
|
43
|
+
*
|
|
44
|
+
* Throws if a header advertises a payload larger than {@link MAX_FRAME_BYTES} —
|
|
45
|
+
* the caller should treat this as a fatal protocol error and close the socket.
|
|
46
|
+
*/
|
|
47
|
+
export function parseFrames(buffer) {
|
|
48
|
+
const frames = [];
|
|
49
|
+
let offset = 0;
|
|
50
|
+
while (buffer.length - offset >= FRAME_HEADER_BYTES) {
|
|
51
|
+
const len = buffer.readUInt32BE(offset);
|
|
52
|
+
if (len > MAX_FRAME_BYTES) {
|
|
53
|
+
throw new Error(`Bridge frame header advertises ${len} bytes, exceeds limit ${MAX_FRAME_BYTES}`);
|
|
54
|
+
}
|
|
55
|
+
const frameStart = offset + FRAME_HEADER_BYTES;
|
|
56
|
+
const frameEnd = frameStart + len;
|
|
57
|
+
if (buffer.length < frameEnd)
|
|
58
|
+
break;
|
|
59
|
+
frames.push(buffer.subarray(frameStart, frameEnd));
|
|
60
|
+
offset = frameEnd;
|
|
61
|
+
}
|
|
62
|
+
const remainder = offset === 0 ? buffer : buffer.subarray(offset);
|
|
63
|
+
return { frames, remainder };
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=bridge-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge-protocol.js","sourceRoot":"","sources":["../../src/utils/bridge-protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AACxC,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAChD,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IACxC,IAAI,CAAC,GAAG;QAAE,OAAO,mBAAmB,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,GAAG,KAAK,EAAE,CAAC;QAC9D,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1C,IAAI,IAAI,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,CAAC,MAAM,iBAAiB,eAAe,GAAG,CAAC,CAAC;IAC7F,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAChD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;AACzE,CAAC;AAOD;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,OAAO,MAAM,CAAC,MAAM,GAAG,MAAM,IAAI,kBAAkB,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,GAAG,GAAG,eAAe,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,kCAAkC,GAAG,yBAAyB,eAAe,EAAE,CAChF,CAAC;QACJ,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,GAAG,kBAAkB,CAAC;QAC/C,MAAM,QAAQ,GAAG,UAAU,GAAG,GAAG,CAAC;QAClC,IAAI,MAAM,CAAC,MAAM,GAAG,QAAQ;YAAE,MAAM;QACpC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;QACnD,MAAM,GAAG,QAAQ,CAAC;IACpB,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAClE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import type { ChildProcess } from 'child_process';
|
|
2
|
+
/**
|
|
3
|
+
* Thrown when the bridge socket closes (Godot exited, port closed, or peer
|
|
4
|
+
* dropped the connection mid-flight). Lets callers distinguish
|
|
5
|
+
* "session ended" from generic transport errors.
|
|
6
|
+
*/
|
|
7
|
+
export declare class BridgeDisconnectedError extends Error {
|
|
8
|
+
constructor(message: string);
|
|
9
|
+
}
|
|
10
|
+
export declare const BRIDGE_WAIT_SPAWNED_TIMEOUT_MS = 8000;
|
|
2
11
|
/**
|
|
3
12
|
* Normalize a path for cross-platform comparison.
|
|
4
13
|
* Folds Windows backslashes to forward slashes and strips trailing slashes,
|
|
@@ -14,6 +23,7 @@ export declare function extractJson(output: string): string;
|
|
|
14
23
|
* Strip Godot banner and debug lines from output, keeping only meaningful content.
|
|
15
24
|
*/
|
|
16
25
|
export declare function cleanOutput(output: string): string;
|
|
26
|
+
export declare function cleanStdout(stdout: string): string;
|
|
17
27
|
export interface GodotProcess {
|
|
18
28
|
process: ChildProcess;
|
|
19
29
|
output: string[];
|
|
@@ -33,7 +43,6 @@ export interface RuntimeStopResult {
|
|
|
33
43
|
export interface GodotServerConfig {
|
|
34
44
|
godotPath?: string;
|
|
35
45
|
debugMode?: boolean;
|
|
36
|
-
strictPathValidation?: boolean;
|
|
37
46
|
}
|
|
38
47
|
export interface OperationParams {
|
|
39
48
|
[key: string]: unknown;
|
|
@@ -42,6 +51,13 @@ export interface OperationResult {
|
|
|
42
51
|
stdout: string;
|
|
43
52
|
stderr: string;
|
|
44
53
|
}
|
|
54
|
+
export interface ToolAnnotations {
|
|
55
|
+
readOnlyHint?: boolean;
|
|
56
|
+
destructiveHint?: boolean;
|
|
57
|
+
idempotentHint?: boolean;
|
|
58
|
+
openWorldHint?: boolean;
|
|
59
|
+
title?: string;
|
|
60
|
+
}
|
|
45
61
|
export interface ToolDefinition {
|
|
46
62
|
name: string;
|
|
47
63
|
description: string;
|
|
@@ -50,12 +66,37 @@ export interface ToolDefinition {
|
|
|
50
66
|
properties: Record<string, unknown>;
|
|
51
67
|
required: string[];
|
|
52
68
|
};
|
|
69
|
+
outputSchema?: {
|
|
70
|
+
type: string;
|
|
71
|
+
properties?: Record<string, unknown>;
|
|
72
|
+
required?: string[];
|
|
73
|
+
};
|
|
74
|
+
annotations?: ToolAnnotations;
|
|
75
|
+
}
|
|
76
|
+
export interface ToolResponse {
|
|
77
|
+
content: Array<{
|
|
78
|
+
type: string;
|
|
79
|
+
text?: string;
|
|
80
|
+
[k: string]: unknown;
|
|
81
|
+
}>;
|
|
82
|
+
isError?: boolean;
|
|
83
|
+
[k: string]: unknown;
|
|
53
84
|
}
|
|
54
|
-
export
|
|
55
|
-
export declare function logError(message: string): void;
|
|
85
|
+
export type ToolHandler = (runner: GodotRunner, args: OperationParams) => Promise<ToolResponse> | ToolResponse;
|
|
56
86
|
export declare function normalizeParameters(params: OperationParams): OperationParams;
|
|
57
87
|
export declare function convertCamelToSnakeCase(params: OperationParams): OperationParams;
|
|
58
88
|
export declare function validatePath(path: string): boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Return `error.message` when `error` is an `Error`, otherwise `'Unknown error'`.
|
|
91
|
+
* Centralizes the catch-block boilerplate so handlers can build error responses
|
|
92
|
+
* without repeating the `instanceof Error` ternary.
|
|
93
|
+
*/
|
|
94
|
+
export declare function getErrorMessage(error: unknown): string;
|
|
95
|
+
/**
|
|
96
|
+
* Build the absolute path to a project's `project.godot` manifest. Use this
|
|
97
|
+
* instead of `join(dir, 'project.godot')` ad hoc.
|
|
98
|
+
*/
|
|
99
|
+
export declare function projectGodotPath(projectDir: string): string;
|
|
59
100
|
/**
|
|
60
101
|
* Extract the first [ERROR] message from GDScript stderr output.
|
|
61
102
|
* Falls back to a generic message if no [ERROR] line is found.
|
|
@@ -83,13 +124,15 @@ export declare function validateSceneArgs(args: OperationParams, opts?: {
|
|
|
83
124
|
export declare class GodotRunner {
|
|
84
125
|
private godotPath;
|
|
85
126
|
private operationsScriptPath;
|
|
86
|
-
private
|
|
127
|
+
private bridge;
|
|
87
128
|
private validatedPaths;
|
|
88
|
-
private
|
|
89
|
-
private strictPathValidation;
|
|
129
|
+
private cachedVersion;
|
|
90
130
|
activeProcess: GodotProcess | null;
|
|
91
131
|
activeProjectPath: string | null;
|
|
92
132
|
activeSessionMode: RuntimeSessionMode | null;
|
|
133
|
+
private socket;
|
|
134
|
+
private rxBuffer;
|
|
135
|
+
private inFlight;
|
|
93
136
|
constructor(config?: GodotServerConfig);
|
|
94
137
|
private isValidGodotPathSync;
|
|
95
138
|
private spawnAsync;
|
|
@@ -97,22 +140,27 @@ export declare class GodotRunner {
|
|
|
97
140
|
detectGodotPath(): Promise<void>;
|
|
98
141
|
getGodotPath(): string | null;
|
|
99
142
|
getVersion(): Promise<string>;
|
|
100
|
-
isGodot44OrLater(version: string): boolean;
|
|
101
143
|
executeOperation(operation: string, params: OperationParams, projectPath: string, timeoutMs?: number): Promise<OperationResult>;
|
|
102
144
|
launchEditor(projectPath: string): ChildProcess;
|
|
103
145
|
runProject(projectPath: string, scene?: string, background?: boolean): GodotProcess;
|
|
104
|
-
attachProject(projectPath: string): void
|
|
105
|
-
stopProject(): RuntimeStopResult | null
|
|
146
|
+
attachProject(projectPath: string): Promise<void>;
|
|
147
|
+
stopProject(): Promise<RuntimeStopResult | null>;
|
|
106
148
|
hasActiveRuntimeSession(): boolean;
|
|
107
|
-
private removeAutoloadEntry;
|
|
108
149
|
/**
|
|
109
|
-
*
|
|
110
|
-
*
|
|
150
|
+
* Send a JSON command to the McpBridge over a long-lived TCP connection.
|
|
151
|
+
*
|
|
152
|
+
* MCP serializes tool calls so we hold one in-flight command at a time. The
|
|
153
|
+
* socket is lazy-connected on first call and persists across commands until
|
|
154
|
+
* `closeConnection` (or a peer-side close). A close mid-flight rejects with
|
|
155
|
+
* `BridgeDisconnectedError`; a per-command timeout rejects but does NOT
|
|
156
|
+
* close the socket — a slow command does not invalidate the session.
|
|
111
157
|
*/
|
|
112
|
-
injectBridgeAutoload(projectPath: string): void;
|
|
113
|
-
cleanupBridgeAutoload(projectPath: string): void;
|
|
114
|
-
private repairOrphanedBridge;
|
|
115
158
|
sendCommand(command: string, params?: Record<string, unknown>, timeoutMs?: number): Promise<string>;
|
|
159
|
+
/**
|
|
160
|
+
* Tear down the bridge socket. Idempotent. Any in-flight command is
|
|
161
|
+
* rejected with a session-ended error.
|
|
162
|
+
*/
|
|
163
|
+
closeConnection(): void;
|
|
116
164
|
getErrorCount(): number;
|
|
117
165
|
getErrorsSince(marker: number): string[];
|
|
118
166
|
private static readonly SCRIPT_ERROR_PATTERNS;
|
|
@@ -121,6 +169,13 @@ export declare class GodotRunner {
|
|
|
121
169
|
response: string;
|
|
122
170
|
runtimeErrors: string[];
|
|
123
171
|
}>;
|
|
172
|
+
/**
|
|
173
|
+
* Shared poll loop for `waitForBridge` (spawned) and `waitForBridgeAttached`.
|
|
174
|
+
* Sends `ping` payloads until the bridge replies with a pong that
|
|
175
|
+
* `validatePong` accepts, the deadline passes, or `shouldAbort` reports
|
|
176
|
+
* the spawned process has exited.
|
|
177
|
+
*/
|
|
178
|
+
private pollBridge;
|
|
124
179
|
waitForBridgeAttached(timeoutMs?: number, intervalMs?: number): Promise<{
|
|
125
180
|
ready: boolean;
|
|
126
181
|
error?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"godot-runner.d.ts","sourceRoot":"","sources":["../../src/utils/godot-runner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"godot-runner.d.ts","sourceRoot":"","sources":["../../src/utils/godot-runner.ts"],"names":[],"mappings":"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"}
|