@keeveeg/godot-mcp 1.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.
Files changed (285) hide show
  1. package/dist/config.d.ts +30 -0
  2. package/dist/config.d.ts.map +1 -0
  3. package/dist/config.js +28 -0
  4. package/dist/config.js.map +1 -0
  5. package/dist/godot-bridge.d.ts +81 -0
  6. package/dist/godot-bridge.d.ts.map +1 -0
  7. package/dist/godot-bridge.js +294 -0
  8. package/dist/godot-bridge.js.map +1 -0
  9. package/dist/index.d.ts +9 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +61 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/server.d.ts +25 -0
  14. package/dist/server.d.ts.map +1 -0
  15. package/dist/server.js +45 -0
  16. package/dist/server.js.map +1 -0
  17. package/dist/tools/accessibility.d.ts +7 -0
  18. package/dist/tools/accessibility.d.ts.map +1 -0
  19. package/dist/tools/accessibility.js +71 -0
  20. package/dist/tools/accessibility.js.map +1 -0
  21. package/dist/tools/addon_management.d.ts +7 -0
  22. package/dist/tools/addon_management.d.ts.map +1 -0
  23. package/dist/tools/addon_management.js +64 -0
  24. package/dist/tools/addon_management.js.map +1 -0
  25. package/dist/tools/analysis.d.ts +7 -0
  26. package/dist/tools/analysis.d.ts.map +1 -0
  27. package/dist/tools/analysis.js +43 -0
  28. package/dist/tools/analysis.js.map +1 -0
  29. package/dist/tools/analytics.d.ts +7 -0
  30. package/dist/tools/analytics.d.ts.map +1 -0
  31. package/dist/tools/analytics.js +76 -0
  32. package/dist/tools/analytics.js.map +1 -0
  33. package/dist/tools/animation.d.ts +7 -0
  34. package/dist/tools/animation.d.ts.map +1 -0
  35. package/dist/tools/animation.js +142 -0
  36. package/dist/tools/animation.js.map +1 -0
  37. package/dist/tools/asset_pipeline.d.ts +7 -0
  38. package/dist/tools/asset_pipeline.d.ts.map +1 -0
  39. package/dist/tools/asset_pipeline.js +102 -0
  40. package/dist/tools/asset_pipeline.js.map +1 -0
  41. package/dist/tools/asset_scaffolding.d.ts +7 -0
  42. package/dist/tools/asset_scaffolding.d.ts.map +1 -0
  43. package/dist/tools/asset_scaffolding.js +113 -0
  44. package/dist/tools/asset_scaffolding.js.map +1 -0
  45. package/dist/tools/audio.d.ts +7 -0
  46. package/dist/tools/audio.d.ts.map +1 -0
  47. package/dist/tools/audio.js +116 -0
  48. package/dist/tools/audio.js.map +1 -0
  49. package/dist/tools/audio_config.d.ts +7 -0
  50. package/dist/tools/audio_config.d.ts.map +1 -0
  51. package/dist/tools/audio_config.js +83 -0
  52. package/dist/tools/audio_config.js.map +1 -0
  53. package/dist/tools/batch.d.ts +7 -0
  54. package/dist/tools/batch.d.ts.map +1 -0
  55. package/dist/tools/batch.js +96 -0
  56. package/dist/tools/batch.js.map +1 -0
  57. package/dist/tools/build_config.d.ts +7 -0
  58. package/dist/tools/build_config.d.ts.map +1 -0
  59. package/dist/tools/build_config.js +98 -0
  60. package/dist/tools/build_config.js.map +1 -0
  61. package/dist/tools/cicd_pipeline.d.ts +7 -0
  62. package/dist/tools/cicd_pipeline.d.ts.map +1 -0
  63. package/dist/tools/cicd_pipeline.js +125 -0
  64. package/dist/tools/cicd_pipeline.js.map +1 -0
  65. package/dist/tools/cloud_services.d.ts +7 -0
  66. package/dist/tools/cloud_services.d.ts.map +1 -0
  67. package/dist/tools/cloud_services.js +97 -0
  68. package/dist/tools/cloud_services.js.map +1 -0
  69. package/dist/tools/code_generation.d.ts +7 -0
  70. package/dist/tools/code_generation.d.ts.map +1 -0
  71. package/dist/tools/code_generation.js +79 -0
  72. package/dist/tools/code_generation.js.map +1 -0
  73. package/dist/tools/code_quality.d.ts +7 -0
  74. package/dist/tools/code_quality.d.ts.map +1 -0
  75. package/dist/tools/code_quality.js +98 -0
  76. package/dist/tools/code_quality.js.map +1 -0
  77. package/dist/tools/collaboration.d.ts +7 -0
  78. package/dist/tools/collaboration.d.ts.map +1 -0
  79. package/dist/tools/collaboration.js +73 -0
  80. package/dist/tools/collaboration.js.map +1 -0
  81. package/dist/tools/debug_config.d.ts +7 -0
  82. package/dist/tools/debug_config.d.ts.map +1 -0
  83. package/dist/tools/debug_config.js +77 -0
  84. package/dist/tools/debug_config.js.map +1 -0
  85. package/dist/tools/debugging.d.ts +7 -0
  86. package/dist/tools/debugging.d.ts.map +1 -0
  87. package/dist/tools/debugging.js +90 -0
  88. package/dist/tools/debugging.js.map +1 -0
  89. package/dist/tools/documentation_tools.d.ts +7 -0
  90. package/dist/tools/documentation_tools.d.ts.map +1 -0
  91. package/dist/tools/documentation_tools.js +89 -0
  92. package/dist/tools/documentation_tools.js.map +1 -0
  93. package/dist/tools/editor.d.ts +7 -0
  94. package/dist/tools/editor.d.ts.map +1 -0
  95. package/dist/tools/editor.js +97 -0
  96. package/dist/tools/editor.js.map +1 -0
  97. package/dist/tools/editor_config.d.ts +7 -0
  98. package/dist/tools/editor_config.d.ts.map +1 -0
  99. package/dist/tools/editor_config.js +92 -0
  100. package/dist/tools/editor_config.js.map +1 -0
  101. package/dist/tools/export.d.ts +7 -0
  102. package/dist/tools/export.d.ts.map +1 -0
  103. package/dist/tools/export.js +81 -0
  104. package/dist/tools/export.js.map +1 -0
  105. package/dist/tools/game_template.d.ts +7 -0
  106. package/dist/tools/game_template.d.ts.map +1 -0
  107. package/dist/tools/game_template.js +112 -0
  108. package/dist/tools/game_template.js.map +1 -0
  109. package/dist/tools/gameplay_automation.d.ts +7 -0
  110. package/dist/tools/gameplay_automation.d.ts.map +1 -0
  111. package/dist/tools/gameplay_automation.js +109 -0
  112. package/dist/tools/gameplay_automation.js.map +1 -0
  113. package/dist/tools/git_integration.d.ts +7 -0
  114. package/dist/tools/git_integration.d.ts.map +1 -0
  115. package/dist/tools/git_integration.js +75 -0
  116. package/dist/tools/git_integration.js.map +1 -0
  117. package/dist/tools/headless_testing.d.ts +7 -0
  118. package/dist/tools/headless_testing.d.ts.map +1 -0
  119. package/dist/tools/headless_testing.js +65 -0
  120. package/dist/tools/headless_testing.js.map +1 -0
  121. package/dist/tools/iap_monetization.d.ts +7 -0
  122. package/dist/tools/iap_monetization.d.ts.map +1 -0
  123. package/dist/tools/iap_monetization.js +70 -0
  124. package/dist/tools/iap_monetization.js.map +1 -0
  125. package/dist/tools/index.d.ts +12 -0
  126. package/dist/tools/index.d.ts.map +1 -0
  127. package/dist/tools/index.js +93 -0
  128. package/dist/tools/index.js.map +1 -0
  129. package/dist/tools/input.d.ts +7 -0
  130. package/dist/tools/input.d.ts.map +1 -0
  131. package/dist/tools/input.js +110 -0
  132. package/dist/tools/input.js.map +1 -0
  133. package/dist/tools/localization.d.ts +7 -0
  134. package/dist/tools/localization.d.ts.map +1 -0
  135. package/dist/tools/localization.js +97 -0
  136. package/dist/tools/localization.js.map +1 -0
  137. package/dist/tools/marketing.d.ts +7 -0
  138. package/dist/tools/marketing.d.ts.map +1 -0
  139. package/dist/tools/marketing.js +87 -0
  140. package/dist/tools/marketing.js.map +1 -0
  141. package/dist/tools/memory_profiling.d.ts +7 -0
  142. package/dist/tools/memory_profiling.d.ts.map +1 -0
  143. package/dist/tools/memory_profiling.js +58 -0
  144. package/dist/tools/memory_profiling.js.map +1 -0
  145. package/dist/tools/mod_support.d.ts +7 -0
  146. package/dist/tools/mod_support.d.ts.map +1 -0
  147. package/dist/tools/mod_support.js +93 -0
  148. package/dist/tools/mod_support.js.map +1 -0
  149. package/dist/tools/navigation.d.ts +7 -0
  150. package/dist/tools/navigation.d.ts.map +1 -0
  151. package/dist/tools/navigation.js +133 -0
  152. package/dist/tools/navigation.js.map +1 -0
  153. package/dist/tools/networking.d.ts +7 -0
  154. package/dist/tools/networking.d.ts.map +1 -0
  155. package/dist/tools/networking.js +94 -0
  156. package/dist/tools/networking.js.map +1 -0
  157. package/dist/tools/node.d.ts +7 -0
  158. package/dist/tools/node.d.ts.map +1 -0
  159. package/dist/tools/node.js +209 -0
  160. package/dist/tools/node.js.map +1 -0
  161. package/dist/tools/node_config.d.ts +7 -0
  162. package/dist/tools/node_config.d.ts.map +1 -0
  163. package/dist/tools/node_config.js +97 -0
  164. package/dist/tools/node_config.js.map +1 -0
  165. package/dist/tools/particles.d.ts +7 -0
  166. package/dist/tools/particles.d.ts.map +1 -0
  167. package/dist/tools/particles.js +118 -0
  168. package/dist/tools/particles.js.map +1 -0
  169. package/dist/tools/performance_optimization.d.ts +7 -0
  170. package/dist/tools/performance_optimization.d.ts.map +1 -0
  171. package/dist/tools/performance_optimization.js +75 -0
  172. package/dist/tools/performance_optimization.js.map +1 -0
  173. package/dist/tools/physics.d.ts +7 -0
  174. package/dist/tools/physics.d.ts.map +1 -0
  175. package/dist/tools/physics.js +106 -0
  176. package/dist/tools/physics.js.map +1 -0
  177. package/dist/tools/physics_config.d.ts +7 -0
  178. package/dist/tools/physics_config.d.ts.map +1 -0
  179. package/dist/tools/physics_config.js +95 -0
  180. package/dist/tools/physics_config.js.map +1 -0
  181. package/dist/tools/platform_export.d.ts +7 -0
  182. package/dist/tools/platform_export.d.ts.map +1 -0
  183. package/dist/tools/platform_export.js +76 -0
  184. package/dist/tools/platform_export.js.map +1 -0
  185. package/dist/tools/platform_specific.d.ts +7 -0
  186. package/dist/tools/platform_specific.d.ts.map +1 -0
  187. package/dist/tools/platform_specific.js +92 -0
  188. package/dist/tools/platform_specific.js.map +1 -0
  189. package/dist/tools/profiling.d.ts +7 -0
  190. package/dist/tools/profiling.d.ts.map +1 -0
  191. package/dist/tools/profiling.js +28 -0
  192. package/dist/tools/profiling.js.map +1 -0
  193. package/dist/tools/project.d.ts +7 -0
  194. package/dist/tools/project.d.ts.map +1 -0
  195. package/dist/tools/project.js +86 -0
  196. package/dist/tools/project.js.map +1 -0
  197. package/dist/tools/project_config.d.ts +7 -0
  198. package/dist/tools/project_config.d.ts.map +1 -0
  199. package/dist/tools/project_config.js +143 -0
  200. package/dist/tools/project_config.js.map +1 -0
  201. package/dist/tools/project_creation.d.ts +7 -0
  202. package/dist/tools/project_creation.d.ts.map +1 -0
  203. package/dist/tools/project_creation.js +147 -0
  204. package/dist/tools/project_creation.js.map +1 -0
  205. package/dist/tools/rendering_config.d.ts +7 -0
  206. package/dist/tools/rendering_config.d.ts.map +1 -0
  207. package/dist/tools/rendering_config.js +110 -0
  208. package/dist/tools/rendering_config.js.map +1 -0
  209. package/dist/tools/resource.d.ts +7 -0
  210. package/dist/tools/resource.d.ts.map +1 -0
  211. package/dist/tools/resource.js +124 -0
  212. package/dist/tools/resource.js.map +1 -0
  213. package/dist/tools/resource_config.d.ts +7 -0
  214. package/dist/tools/resource_config.d.ts.map +1 -0
  215. package/dist/tools/resource_config.js +76 -0
  216. package/dist/tools/resource_config.js.map +1 -0
  217. package/dist/tools/runtime.d.ts +7 -0
  218. package/dist/tools/runtime.d.ts.map +1 -0
  219. package/dist/tools/runtime.js +231 -0
  220. package/dist/tools/runtime.js.map +1 -0
  221. package/dist/tools/save_load.d.ts +7 -0
  222. package/dist/tools/save_load.d.ts.map +1 -0
  223. package/dist/tools/save_load.js +63 -0
  224. package/dist/tools/save_load.js.map +1 -0
  225. package/dist/tools/scene.d.ts +7 -0
  226. package/dist/tools/scene.d.ts.map +1 -0
  227. package/dist/tools/scene.js +129 -0
  228. package/dist/tools/scene.js.map +1 -0
  229. package/dist/tools/scene3d.d.ts +7 -0
  230. package/dist/tools/scene3d.d.ts.map +1 -0
  231. package/dist/tools/scene3d.js +82 -0
  232. package/dist/tools/scene3d.js.map +1 -0
  233. package/dist/tools/scene_config.d.ts +7 -0
  234. package/dist/tools/scene_config.d.ts.map +1 -0
  235. package/dist/tools/scene_config.js +79 -0
  236. package/dist/tools/scene_config.js.map +1 -0
  237. package/dist/tools/scene_scaffolding.d.ts +7 -0
  238. package/dist/tools/scene_scaffolding.d.ts.map +1 -0
  239. package/dist/tools/scene_scaffolding.js +110 -0
  240. package/dist/tools/scene_scaffolding.js.map +1 -0
  241. package/dist/tools/script.d.ts +7 -0
  242. package/dist/tools/script.d.ts.map +1 -0
  243. package/dist/tools/script.js +111 -0
  244. package/dist/tools/script.js.map +1 -0
  245. package/dist/tools/script_scaffolding.d.ts +7 -0
  246. package/dist/tools/script_scaffolding.d.ts.map +1 -0
  247. package/dist/tools/script_scaffolding.js +115 -0
  248. package/dist/tools/script_scaffolding.js.map +1 -0
  249. package/dist/tools/security.d.ts +7 -0
  250. package/dist/tools/security.d.ts.map +1 -0
  251. package/dist/tools/security.js +73 -0
  252. package/dist/tools/security.js.map +1 -0
  253. package/dist/tools/shader.d.ts +7 -0
  254. package/dist/tools/shader.d.ts.map +1 -0
  255. package/dist/tools/shader.js +118 -0
  256. package/dist/tools/shader.js.map +1 -0
  257. package/dist/tools/shared-types.d.ts +138 -0
  258. package/dist/tools/shared-types.d.ts.map +1 -0
  259. package/dist/tools/shared-types.js +170 -0
  260. package/dist/tools/shared-types.js.map +1 -0
  261. package/dist/tools/testing.d.ts +7 -0
  262. package/dist/tools/testing.d.ts.map +1 -0
  263. package/dist/tools/testing.js +78 -0
  264. package/dist/tools/testing.js.map +1 -0
  265. package/dist/tools/theme.d.ts +7 -0
  266. package/dist/tools/theme.d.ts.map +1 -0
  267. package/dist/tools/theme.js +97 -0
  268. package/dist/tools/theme.js.map +1 -0
  269. package/dist/tools/tilemap.d.ts +7 -0
  270. package/dist/tools/tilemap.d.ts.map +1 -0
  271. package/dist/tools/tilemap.js +89 -0
  272. package/dist/tools/tilemap.js.map +1 -0
  273. package/dist/tools/version_control_advanced.d.ts +7 -0
  274. package/dist/tools/version_control_advanced.d.ts.map +1 -0
  275. package/dist/tools/version_control_advanced.js +100 -0
  276. package/dist/tools/version_control_advanced.js.map +1 -0
  277. package/dist/tools/visual_testing.d.ts +7 -0
  278. package/dist/tools/visual_testing.d.ts.map +1 -0
  279. package/dist/tools/visual_testing.js +81 -0
  280. package/dist/tools/visual_testing.js.map +1 -0
  281. package/dist/types.d.ts +77 -0
  282. package/dist/types.d.ts.map +1 -0
  283. package/dist/types.js +37 -0
  284. package/dist/types.js.map +1 -0
  285. package/package.json +49 -0
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Godot MCP Server Configuration
3
+ */
4
+ /** Base port for WebSocket connections */
5
+ export declare const WS_BASE_PORT = 6505;
6
+ /** Maximum number of concurrent AI sessions (ports 6505-6514) */
7
+ export declare const MAX_SESSIONS = 10;
8
+ /** Request timeout in milliseconds */
9
+ export declare const REQUEST_TIMEOUT_MS = 30000;
10
+ /** Ping interval for WebSocket keepalive in milliseconds */
11
+ export declare const PING_INTERVAL_MS = 30000;
12
+ /** Ping timeout - disconnect if no pong received within this time */
13
+ export declare const PING_TIMEOUT_MS = 15000;
14
+ /** Maximum message size in bytes (10MB) */
15
+ export declare const MAX_MESSAGE_SIZE: number;
16
+ /** Server version */
17
+ export declare const SERVER_VERSION = "1.0.0";
18
+ /** Server name for MCP identification */
19
+ export declare const SERVER_NAME = "godot-mcp";
20
+ /** JSON-RPC version used for communication */
21
+ export declare const JSONRPC_VERSION: "2.0";
22
+ /** Reconnect delay in milliseconds */
23
+ export declare const RECONNECT_DELAY_MS = 1000;
24
+ /** Maximum reconnection attempts */
25
+ export declare const MAX_RECONNECT_ATTEMPTS = 5;
26
+ /** Log level configuration */
27
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
28
+ /** Current log level */
29
+ export declare const LOG_LEVEL: LogLevel;
30
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,0CAA0C;AAC1C,eAAO,MAAM,YAAY,OAAO,CAAC;AAEjC,iEAAiE;AACjE,eAAO,MAAM,YAAY,KAAK,CAAC;AAE/B,sCAAsC;AACtC,eAAO,MAAM,kBAAkB,QAAS,CAAC;AAEzC,4DAA4D;AAC5D,eAAO,MAAM,gBAAgB,QAAS,CAAC;AAEvC,qEAAqE;AACrE,eAAO,MAAM,eAAe,QAAS,CAAC;AAEtC,2CAA2C;AAC3C,eAAO,MAAM,gBAAgB,QAAmB,CAAC;AAEjD,qBAAqB;AACrB,eAAO,MAAM,cAAc,UAAU,CAAC;AAEtC,yCAAyC;AACzC,eAAO,MAAM,WAAW,cAAc,CAAC;AAEvC,8CAA8C;AAC9C,eAAO,MAAM,eAAe,EAAG,KAAc,CAAC;AAE9C,sCAAsC;AACtC,eAAO,MAAM,kBAAkB,OAAQ,CAAC;AAExC,oCAAoC;AACpC,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,8BAA8B;AAC9B,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,wBAAwB;AACxB,eAAO,MAAM,SAAS,EAAE,QAAiB,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Godot MCP Server Configuration
3
+ */
4
+ /** Base port for WebSocket connections */
5
+ export const WS_BASE_PORT = 6505;
6
+ /** Maximum number of concurrent AI sessions (ports 6505-6514) */
7
+ export const MAX_SESSIONS = 10;
8
+ /** Request timeout in milliseconds */
9
+ export const REQUEST_TIMEOUT_MS = 30_000;
10
+ /** Ping interval for WebSocket keepalive in milliseconds */
11
+ export const PING_INTERVAL_MS = 30_000;
12
+ /** Ping timeout - disconnect if no pong received within this time */
13
+ export const PING_TIMEOUT_MS = 15_000;
14
+ /** Maximum message size in bytes (10MB) */
15
+ export const MAX_MESSAGE_SIZE = 10 * 1024 * 1024;
16
+ /** Server version */
17
+ export const SERVER_VERSION = '1.0.0';
18
+ /** Server name for MCP identification */
19
+ export const SERVER_NAME = 'godot-mcp';
20
+ /** JSON-RPC version used for communication */
21
+ export const JSONRPC_VERSION = '2.0';
22
+ /** Reconnect delay in milliseconds */
23
+ export const RECONNECT_DELAY_MS = 1_000;
24
+ /** Maximum reconnection attempts */
25
+ export const MAX_RECONNECT_ATTEMPTS = 5;
26
+ /** Current log level */
27
+ export const LOG_LEVEL = 'info';
28
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AAEjC,iEAAiE;AACjE,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC;AAE/B,sCAAsC;AACtC,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAEzC,4DAA4D;AAC5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEvC,qEAAqE;AACrE,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC;AAEtC,2CAA2C;AAC3C,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEjD,qBAAqB;AACrB,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAEtC,yCAAyC;AACzC,MAAM,CAAC,MAAM,WAAW,GAAG,WAAW,CAAC;AAEvC,8CAA8C;AAC9C,MAAM,CAAC,MAAM,eAAe,GAAG,KAAc,CAAC;AAE9C,sCAAsC;AACtC,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAExC,oCAAoC;AACpC,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAKxC,wBAAwB;AACxB,MAAM,CAAC,MAAM,SAAS,GAAa,MAAM,CAAC"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * WebSocket bridge for communicating with Godot EditorPlugin
3
+ *
4
+ * Godot connects as a WebSocket CLIENT to this server.
5
+ * Uses JSON-RPC 2.0 for message format.
6
+ */
7
+ import type { ConnectionState } from './types.js';
8
+ /**
9
+ * WebSocket bridge that manages communication with Godot EditorPlugin.
10
+ *
11
+ * The bridge starts a WebSocket server that Godot connects to.
12
+ * Each tool request is forwarded as a JSON-RPC 2.0 call.
13
+ */
14
+ export declare class GodotBridge {
15
+ private wss;
16
+ private client;
17
+ private port;
18
+ private state;
19
+ private pendingRequests;
20
+ private pingInterval;
21
+ private lastPongTime;
22
+ private requestIdCounter;
23
+ constructor(port?: number);
24
+ /**
25
+ * Start the WebSocket server, trying ports 6505-6514 if busy.
26
+ */
27
+ start(): Promise<number>;
28
+ /**
29
+ * Try to listen on a specific port.
30
+ */
31
+ private tryListen;
32
+ /**
33
+ * Set up the WebSocket server event handlers.
34
+ */
35
+ private setupServer;
36
+ /**
37
+ * Set up event handlers for a connected client.
38
+ */
39
+ private setupClientHandlers;
40
+ /**
41
+ * Start the ping/pong keepalive interval.
42
+ */
43
+ private startPingInterval;
44
+ /**
45
+ * Stop the ping interval.
46
+ */
47
+ private stopPingInterval;
48
+ /**
49
+ * Handle an incoming WebSocket message.
50
+ */
51
+ private handleMessage;
52
+ /**
53
+ * Send a JSON-RPC 2.0 request to Godot and wait for a response.
54
+ */
55
+ sendRequest(method: string, params?: Record<string, unknown>): Promise<unknown>;
56
+ /**
57
+ * Send a JSON-RPC 2.0 notification (no response expected).
58
+ */
59
+ sendNotification(method: string, params?: Record<string, unknown>): void;
60
+ /**
61
+ * Clean up connection state.
62
+ */
63
+ private cleanup;
64
+ /**
65
+ * Get the current connection state.
66
+ */
67
+ getState(): ConnectionState;
68
+ /**
69
+ * Check if a Godot client is connected.
70
+ */
71
+ isConnected(): boolean;
72
+ /**
73
+ * Get the port the server is listening on.
74
+ */
75
+ getPort(): number;
76
+ /**
77
+ * Shut down the bridge and close all connections.
78
+ */
79
+ shutdown(): Promise<void>;
80
+ }
81
+ //# sourceMappingURL=godot-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"godot-bridge.d.ts","sourceRoot":"","sources":["../src/godot-bridge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,OAAO,KAAK,EAMV,eAAe,EAChB,MAAM,YAAY,CAAC;AA6BpB;;;;;GAKG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,eAAe,CAAmD;IAC1E,OAAO,CAAC,YAAY,CAA+C;IACnE,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,gBAAgB,CAAa;gBAEzB,IAAI,GAAE,MAAqB;IAIvC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAe9B;;OAEG;IACH,OAAO,CAAC,SAAS;IAyBjB;;OAEG;IACH,OAAO,CAAC,WAAW;IAuBnB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAmB3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAqBzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACH,OAAO,CAAC,aAAa;IAoCrB;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAyCzF;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,IAAI;IAe5E;;OAEG;IACH,OAAO,CAAC,OAAO;IAaf;;OAEG;IACH,QAAQ,IAAI,eAAe;IAI3B;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAahC"}
@@ -0,0 +1,294 @@
1
+ /**
2
+ * WebSocket bridge for communicating with Godot EditorPlugin
3
+ *
4
+ * Godot connects as a WebSocket CLIENT to this server.
5
+ * Uses JSON-RPC 2.0 for message format.
6
+ */
7
+ import { WebSocketServer, WebSocket } from 'ws';
8
+ import { randomUUID } from 'node:crypto';
9
+ import { WS_BASE_PORT, MAX_SESSIONS, REQUEST_TIMEOUT_MS, PING_INTERVAL_MS, PING_TIMEOUT_MS, MAX_MESSAGE_SIZE, JSONRPC_VERSION } from './config.js';
10
+ import { isSuccessResponse, isErrorResponse } from './types.js';
11
+ /** Logger helper */
12
+ function log(level, message, ...args) {
13
+ const timestamp = new Date().toISOString();
14
+ const prefix = `[GodotBridge ${timestamp}]`;
15
+ switch (level) {
16
+ case 'error':
17
+ console.error(prefix, message, ...args);
18
+ break;
19
+ case 'warn':
20
+ console.warn(prefix, message, ...args);
21
+ break;
22
+ case 'debug':
23
+ // Only log debug in development
24
+ if (process.env.GODOT_MCP_DEBUG) {
25
+ console.error(prefix, message, ...args);
26
+ }
27
+ break;
28
+ default:
29
+ console.error(prefix, message, ...args);
30
+ }
31
+ }
32
+ /**
33
+ * WebSocket bridge that manages communication with Godot EditorPlugin.
34
+ *
35
+ * The bridge starts a WebSocket server that Godot connects to.
36
+ * Each tool request is forwarded as a JSON-RPC 2.0 call.
37
+ */
38
+ export class GodotBridge {
39
+ wss = null;
40
+ client = null;
41
+ port;
42
+ state = 'disconnected';
43
+ pendingRequests = new Map();
44
+ pingInterval = null;
45
+ lastPongTime = 0;
46
+ requestIdCounter = 0;
47
+ constructor(port = WS_BASE_PORT) {
48
+ this.port = port;
49
+ }
50
+ /**
51
+ * Start the WebSocket server, trying ports 6505-6514 if busy.
52
+ */
53
+ async start() {
54
+ for (let portOffset = 0; portOffset < MAX_SESSIONS; portOffset++) {
55
+ const tryPort = this.port + portOffset;
56
+ const success = await this.tryListen(tryPort);
57
+ if (success) {
58
+ this.port = tryPort;
59
+ log('info', `Listening on port ${tryPort}`);
60
+ return tryPort;
61
+ }
62
+ }
63
+ throw new Error(`Failed to bind to any port in range ${WS_BASE_PORT}-${WS_BASE_PORT + MAX_SESSIONS - 1}`);
64
+ }
65
+ /**
66
+ * Try to listen on a specific port.
67
+ */
68
+ tryListen(port) {
69
+ return new Promise((resolve) => {
70
+ const wss = new WebSocketServer({
71
+ port,
72
+ maxPayload: MAX_MESSAGE_SIZE,
73
+ });
74
+ wss.on('listening', () => {
75
+ this.wss = wss;
76
+ this.setupServer(wss);
77
+ resolve(true);
78
+ });
79
+ wss.on('error', (err) => {
80
+ if (err.code === 'EADDRINUSE') {
81
+ log('debug', `Port ${port} is busy`);
82
+ resolve(false);
83
+ } else {
84
+ log('error', `Server error on port ${port}:`, err.message);
85
+ resolve(false);
86
+ }
87
+ });
88
+ });
89
+ }
90
+ /**
91
+ * Set up the WebSocket server event handlers.
92
+ */
93
+ setupServer(wss) {
94
+ wss.on('connection', (ws) => {
95
+ // Only allow one client at a time
96
+ if (this.client && this.client.readyState === WebSocket.OPEN) {
97
+ log('warn', 'Rejecting new client - one client already connected');
98
+ ws.close(1013, 'Another client is already connected');
99
+ return;
100
+ }
101
+ this.client = ws;
102
+ this.state = 'connected';
103
+ this.lastPongTime = Date.now();
104
+ log('info', 'Godot editor connected');
105
+ this.setupClientHandlers(ws);
106
+ this.startPingInterval(ws);
107
+ });
108
+ wss.on('error', (err) => {
109
+ log('error', 'WebSocket server error:', err.message);
110
+ });
111
+ }
112
+ /**
113
+ * Set up event handlers for a connected client.
114
+ */
115
+ setupClientHandlers(ws) {
116
+ ws.on('message', (data) => {
117
+ this.handleMessage(data);
118
+ });
119
+ ws.on('close', (code, reason) => {
120
+ log('info', `Godot editor disconnected (code: ${code}, reason: ${reason.toString()})`);
121
+ this.cleanup();
122
+ });
123
+ ws.on('error', (err) => {
124
+ log('error', 'Client WebSocket error:', err.message);
125
+ });
126
+ ws.on('pong', () => {
127
+ this.lastPongTime = Date.now();
128
+ });
129
+ }
130
+ /**
131
+ * Start the ping/pong keepalive interval.
132
+ */
133
+ startPingInterval(ws) {
134
+ this.stopPingInterval();
135
+ this.pingInterval = setInterval(() => {
136
+ if (ws.readyState !== WebSocket.OPEN) {
137
+ this.stopPingInterval();
138
+ return;
139
+ }
140
+ // Check if last pong was too long ago
141
+ const timeSinceLastPong = Date.now() - this.lastPongTime;
142
+ if (timeSinceLastPong > PING_INTERVAL_MS + PING_TIMEOUT_MS) {
143
+ log('warn', 'No pong received, closing connection');
144
+ ws.terminate();
145
+ return;
146
+ }
147
+ ws.ping();
148
+ }, PING_INTERVAL_MS);
149
+ }
150
+ /**
151
+ * Stop the ping interval.
152
+ */
153
+ stopPingInterval() {
154
+ if (this.pingInterval) {
155
+ clearInterval(this.pingInterval);
156
+ this.pingInterval = null;
157
+ }
158
+ }
159
+ /**
160
+ * Handle an incoming WebSocket message.
161
+ */
162
+ handleMessage(data) {
163
+ let message;
164
+ try {
165
+ message = JSON.parse(data.toString());
166
+ } catch {
167
+ log('error', 'Failed to parse message as JSON');
168
+ return;
169
+ }
170
+ // Check if this is a response to a pending request
171
+ if ('id' in message && message.id !== undefined && message.id !== null) {
172
+ const pending = this.pendingRequests.get(message.id);
173
+ if (pending) {
174
+ this.pendingRequests.delete(message.id);
175
+ clearTimeout(pending.timer);
176
+ const response = message;
177
+ if (isSuccessResponse(response)) {
178
+ log('debug', `Response for ${pending.method}: success`);
179
+ pending.resolve(response.result);
180
+ } else if (isErrorResponse(response)) {
181
+ const err = response;
182
+ const error = new Error(err.error.message);
183
+ error.code = err.error.code;
184
+ error.data = err.error.data;
185
+ log('debug', `Response for ${pending.method}: error - ${err.error.message}`);
186
+ pending.reject(error);
187
+ }
188
+ return;
189
+ }
190
+ }
191
+ // Otherwise it might be a notification from Godot (e.g., scene_changed)
192
+ log('debug', 'Received notification:', message);
193
+ }
194
+ /**
195
+ * Send a JSON-RPC 2.0 request to Godot and wait for a response.
196
+ */
197
+ async sendRequest(method, params = {}) {
198
+ if (!this.client || this.client.readyState !== WebSocket.OPEN) {
199
+ throw new Error('Godot editor is not connected');
200
+ }
201
+ const id = `mcp_${++this.requestIdCounter}_${randomUUID().slice(0, 8)}`;
202
+ const request = {
203
+ jsonrpc: JSONRPC_VERSION,
204
+ id,
205
+ method,
206
+ params,
207
+ };
208
+ return new Promise((resolve, reject) => {
209
+ const timer = setTimeout(() => {
210
+ this.pendingRequests.delete(id);
211
+ reject(new Error(`Request ${method} timed out after ${REQUEST_TIMEOUT_MS}ms`));
212
+ }, REQUEST_TIMEOUT_MS);
213
+ this.pendingRequests.set(id, {
214
+ id,
215
+ method,
216
+ resolve,
217
+ reject,
218
+ timer,
219
+ });
220
+ const message = JSON.stringify(request);
221
+ log('debug', `Sending request: ${method} (id: ${id})`);
222
+ this.client.send(message, (err) => {
223
+ if (err) {
224
+ this.pendingRequests.delete(id);
225
+ clearTimeout(timer);
226
+ reject(new Error(`Failed to send request: ${err.message}`));
227
+ }
228
+ });
229
+ });
230
+ }
231
+ /**
232
+ * Send a JSON-RPC 2.0 notification (no response expected).
233
+ */
234
+ sendNotification(method, params = {}) {
235
+ if (!this.client || this.client.readyState !== WebSocket.OPEN) {
236
+ log('warn', `Cannot send notification ${method}: Godot not connected`);
237
+ return;
238
+ }
239
+ const notification = {
240
+ jsonrpc: JSONRPC_VERSION,
241
+ method,
242
+ params,
243
+ };
244
+ this.client.send(JSON.stringify(notification));
245
+ }
246
+ /**
247
+ * Clean up connection state.
248
+ */
249
+ cleanup() {
250
+ this.state = 'disconnected';
251
+ this.client = null;
252
+ this.stopPingInterval();
253
+ // Reject all pending requests
254
+ for (const [, pending] of this.pendingRequests) {
255
+ clearTimeout(pending.timer);
256
+ pending.reject(new Error('Connection closed'));
257
+ }
258
+ this.pendingRequests.clear();
259
+ }
260
+ /**
261
+ * Get the current connection state.
262
+ */
263
+ getState() {
264
+ return this.state;
265
+ }
266
+ /**
267
+ * Check if a Godot client is connected.
268
+ */
269
+ isConnected() {
270
+ return this.client !== null && this.client.readyState === WebSocket.OPEN;
271
+ }
272
+ /**
273
+ * Get the port the server is listening on.
274
+ */
275
+ getPort() {
276
+ return this.port;
277
+ }
278
+ /**
279
+ * Shut down the bridge and close all connections.
280
+ */
281
+ async shutdown() {
282
+ log('info', 'Shutting down bridge...');
283
+ this.cleanup();
284
+ if (this.wss) {
285
+ await new Promise((resolve) => {
286
+ this.wss.close(() => {
287
+ this.wss = null;
288
+ resolve();
289
+ });
290
+ });
291
+ }
292
+ }
293
+ }
294
+ //# sourceMappingURL=godot-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"godot-bridge.js","sourceRoot":"","sources":["../src/godot-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Godot MCP Server Entry Point
4
+ *
5
+ * Creates the MCP server with stdio transport and WebSocket bridge
6
+ * for communicating with Godot EditorPlugin.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
package/dist/index.js ADDED
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Godot MCP Server Entry Point
4
+ *
5
+ * Creates the MCP server with stdio transport and WebSocket bridge
6
+ * for communicating with Godot EditorPlugin.
7
+ */
8
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
9
+ import { GodotBridge } from './godot-bridge.js';
10
+ import { createServer } from './server.js';
11
+ import { registerAllTools } from './tools/index.js';
12
+ import { SERVER_NAME, SERVER_VERSION } from './config.js';
13
+ async function main() {
14
+ // Log to stderr (stdout is reserved for MCP protocol)
15
+ console.error(`[${SERVER_NAME}] Starting v${SERVER_VERSION}...`);
16
+ // Create the Godot bridge (WebSocket server)
17
+ const bridge = new GodotBridge();
18
+ const port = await bridge.start();
19
+ console.error(`[${SERVER_NAME}] WebSocket bridge listening on port ${port}`);
20
+ // Create the MCP server
21
+ const server = createServer(bridge);
22
+ // Register all tools
23
+ registerAllTools(server, bridge);
24
+ console.error(`[${SERVER_NAME}] Tools registered`);
25
+ // Connect stdio transport
26
+ const transport = new StdioServerTransport();
27
+ await server.connect(transport);
28
+ console.error(`[${SERVER_NAME}] MCP server connected via stdio`);
29
+ // Graceful shutdown
30
+ const shutdown = async (signal) => {
31
+ console.error(`\n[${SERVER_NAME}] Received ${signal}, shutting down...`);
32
+ try {
33
+ await server.close();
34
+ await bridge.shutdown();
35
+ console.error(`[${SERVER_NAME}] Shutdown complete`);
36
+ process.exit(0);
37
+ } catch (err) {
38
+ console.error(`[${SERVER_NAME}] Error during shutdown:`, err);
39
+ process.exit(1);
40
+ }
41
+ };
42
+ process.on('SIGINT', () => shutdown('SIGINT'));
43
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
44
+ // Handle stdin close (MCP client disconnected)
45
+ process.stdin.on('close', () => {
46
+ console.error(`[${SERVER_NAME}] stdin closed, shutting down...`);
47
+ void shutdown('stdin-close');
48
+ });
49
+ // Handle uncaught errors
50
+ process.on('uncaughtException', (err) => {
51
+ console.error(`[${SERVER_NAME}] Uncaught exception:`, err);
52
+ });
53
+ process.on('unhandledRejection', (reason) => {
54
+ console.error(`[${SERVER_NAME}] Unhandled rejection:`, reason);
55
+ });
56
+ }
57
+ main().catch((err) => {
58
+ console.error(`[${SERVER_NAME}] Fatal error:`, err);
59
+ process.exit(1);
60
+ });
61
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * McpServer factory with tool registration
3
+ */
4
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import { GodotBridge } from './godot-bridge.js';
6
+ import type { ToolResult } from './types.js';
7
+ /**
8
+ * Type for a tool handler function.
9
+ * Receives parsed params and the bridge, returns a ToolResult.
10
+ */
11
+ export type ToolHandler = (params: Record<string, unknown>, bridge: GodotBridge) => Promise<ToolResult>;
12
+ /**
13
+ * Create and configure the MCP server instance.
14
+ */
15
+ export declare function createServer(_bridge: GodotBridge): McpServer;
16
+ /**
17
+ * Register a tool with the MCP server.
18
+ * This wraps the handler to always receive the bridge instance.
19
+ */
20
+ export declare function registerTool(server: McpServer, bridge: GodotBridge, name: string, description: string, schema: Record<string, import('zod').ZodType>, handler: ToolHandler): void;
21
+ /**
22
+ * Helper to call Godot via the bridge and format the result.
23
+ */
24
+ export declare function callGodot(bridge: GodotBridge, method: string, params?: Record<string, unknown>): Promise<ToolResult>;
25
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,CACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC,UAAU,CAAC,CAAC;AAEzB;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CAO5D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,OAAO,CAAC,EAC7C,OAAO,EAAE,WAAW,GACnB,IAAI,CAUN;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACnC,OAAO,CAAC,UAAU,CAAC,CASrB"}
package/dist/server.js ADDED
@@ -0,0 +1,45 @@
1
+ /**
2
+ * McpServer factory with tool registration
3
+ */
4
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import { SERVER_NAME, SERVER_VERSION } from './config.js';
6
+ import { createErrorResult } from './types.js';
7
+ /**
8
+ * Create and configure the MCP server instance.
9
+ */
10
+ export function createServer(_bridge) {
11
+ const server = new McpServer({
12
+ name: SERVER_NAME,
13
+ version: SERVER_VERSION,
14
+ });
15
+ return server;
16
+ }
17
+ /**
18
+ * Register a tool with the MCP server.
19
+ * This wraps the handler to always receive the bridge instance.
20
+ */
21
+ export function registerTool(server, bridge, name, description, schema, handler) {
22
+ server.tool(name, description, schema, async (args) => {
23
+ try {
24
+ const result = await handler(args, bridge);
25
+ return result;
26
+ } catch (error) {
27
+ const message = error instanceof Error ? error.message : String(error);
28
+ return createErrorResult(`Tool ${name} failed: ${message}`);
29
+ }
30
+ });
31
+ }
32
+ /**
33
+ * Helper to call Godot via the bridge and format the result.
34
+ */
35
+ export async function callGodot(bridge, method, params = {}) {
36
+ try {
37
+ const result = await bridge.sendRequest(method, params);
38
+ const text = typeof result === 'string' ? result : JSON.stringify(result, null, 2);
39
+ return { content: [{ type: 'text', text }] };
40
+ } catch (error) {
41
+ const message = error instanceof Error ? error.message : String(error);
42
+ return createErrorResult(`Godot request failed: ${message}`);
43
+ }
44
+ }
45
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAW/C;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAoB;IAC/C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,cAAc;KACxB,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAiB,EACjB,MAAmB,EACnB,IAAY,EACZ,WAAmB,EACnB,MAA6C,EAC7C,OAAoB;IAEpB,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,IAA6B,EAAE,EAAE;QAC7E,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC3C,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,iBAAiB,CAAC,QAAQ,IAAI,YAAY,OAAO,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,MAAmB,EACnB,MAAc,EACd,SAAkC,EAAE;IAEpC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACnF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,iBAAiB,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Accessibility tools - 6 tools for accessibility auditing and compliance
3
+ */
4
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ import type { GodotBridge } from "../godot-bridge.js";
6
+ export declare function registerAccessibilityTools(server: McpServer, bridge: GodotBridge): void;
7
+ //# sourceMappingURL=accessibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accessibility.d.ts","sourceRoot":"","sources":["../../src/tools/accessibility.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAItD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAqEvF"}