@weppy/roblox-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. package/.claude-plugin/marketplace.json +39 -0
  2. package/CHANGELOG.md +37 -0
  3. package/LICENSE +53 -0
  4. package/README.md +162 -0
  5. package/assets/screenshots/connection_guide.png +3 -0
  6. package/assets/screenshots/connection_popup.png +3 -0
  7. package/assets/screenshots/plugin_main.png +3 -0
  8. package/assets/screenshots/settings.png +3 -0
  9. package/dist/http-bridge.d.ts +65 -0
  10. package/dist/http-bridge.d.ts.map +1 -0
  11. package/dist/http-bridge.js +1 -0
  12. package/dist/index.d.ts +3 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +2 -0
  15. package/dist/server.d.ts +13 -0
  16. package/dist/server.d.ts.map +1 -0
  17. package/dist/server.js +1 -0
  18. package/dist/tools/asset-tools.d.ts +10 -0
  19. package/dist/tools/asset-tools.d.ts.map +1 -0
  20. package/dist/tools/asset-tools.js +1 -0
  21. package/dist/tools/bulk-tools.d.ts +11 -0
  22. package/dist/tools/bulk-tools.d.ts.map +1 -0
  23. package/dist/tools/bulk-tools.js +1 -0
  24. package/dist/tools/camera-tools.d.ts +5 -0
  25. package/dist/tools/camera-tools.d.ts.map +1 -0
  26. package/dist/tools/camera-tools.js +1 -0
  27. package/dist/tools/connection-tools.d.ts +5 -0
  28. package/dist/tools/connection-tools.d.ts.map +1 -0
  29. package/dist/tools/connection-tools.js +1 -0
  30. package/dist/tools/environment-tools.d.ts +8 -0
  31. package/dist/tools/environment-tools.d.ts.map +1 -0
  32. package/dist/tools/environment-tools.js +1 -0
  33. package/dist/tools/index.d.ts +21 -0
  34. package/dist/tools/index.d.ts.map +1 -0
  35. package/dist/tools/index.js +1 -0
  36. package/dist/tools/instance-tools.d.ts +16 -0
  37. package/dist/tools/instance-tools.d.ts.map +1 -0
  38. package/dist/tools/instance-tools.js +1 -0
  39. package/dist/tools/log-tools.d.ts +6 -0
  40. package/dist/tools/log-tools.d.ts.map +1 -0
  41. package/dist/tools/log-tools.js +1 -0
  42. package/dist/tools/property-tools.d.ts +13 -0
  43. package/dist/tools/property-tools.d.ts.map +1 -0
  44. package/dist/tools/property-tools.js +1 -0
  45. package/dist/tools/raycast-tools.d.ts +11 -0
  46. package/dist/tools/raycast-tools.d.ts.map +1 -0
  47. package/dist/tools/raycast-tools.js +1 -0
  48. package/dist/tools/script-tools.d.ts +13 -0
  49. package/dist/tools/script-tools.d.ts.map +1 -0
  50. package/dist/tools/script-tools.js +1 -0
  51. package/dist/tools/search-tools.d.ts +11 -0
  52. package/dist/tools/search-tools.d.ts.map +1 -0
  53. package/dist/tools/search-tools.js +1 -0
  54. package/dist/tools/selection-tools.d.ts +16 -0
  55. package/dist/tools/selection-tools.d.ts.map +1 -0
  56. package/dist/tools/selection-tools.js +1 -0
  57. package/dist/tools/spatial-tools.d.ts +8 -0
  58. package/dist/tools/spatial-tools.d.ts.map +1 -0
  59. package/dist/tools/spatial-tools.js +1 -0
  60. package/dist/tools/state-tools.d.ts +12 -0
  61. package/dist/tools/state-tools.d.ts.map +1 -0
  62. package/dist/tools/state-tools.js +1 -0
  63. package/dist/tools/tag-tools.d.ts +8 -0
  64. package/dist/tools/tag-tools.d.ts.map +1 -0
  65. package/dist/tools/tag-tools.js +1 -0
  66. package/dist/tools/terrain-tools.d.ts +15 -0
  67. package/dist/tools/terrain-tools.d.ts.map +1 -0
  68. package/dist/tools/terrain-tools.js +1 -0
  69. package/dist/tools/visualization-tools.d.ts +9 -0
  70. package/dist/tools/visualization-tools.d.ts.map +1 -0
  71. package/dist/tools/visualization-tools.js +1 -0
  72. package/dist/types/index.d.ts +143 -0
  73. package/dist/types/index.d.ts.map +1 -0
  74. package/dist/types/index.js +1 -0
  75. package/dist/utils/logger.d.ts +16 -0
  76. package/dist/utils/logger.d.ts.map +1 -0
  77. package/dist/utils/logger.js +1 -0
  78. package/dist/utils/quota-checker.d.ts +46 -0
  79. package/dist/utils/quota-checker.d.ts.map +1 -0
  80. package/dist/utils/quota-checker.js +1 -0
  81. package/dist/utils/type-converter.d.ts +33 -0
  82. package/dist/utils/type-converter.d.ts.map +1 -0
  83. package/dist/utils/type-converter.js +1 -0
  84. package/dist/utils/validation.d.ts +17 -0
  85. package/dist/utils/validation.d.ts.map +1 -0
  86. package/dist/utils/validation.js +1 -0
  87. package/docs/ko/README.md +174 -0
  88. package/docs/ko/faq.md +188 -0
  89. package/docs/ko/installation/claude-code.md +110 -0
  90. package/docs/ko/installation/claude-desktop.md +145 -0
  91. package/docs/ko/installation/codex-cli.md +120 -0
  92. package/docs/ko/installation/cursor.md +122 -0
  93. package/docs/ko/installation/gemini-cli.md +136 -0
  94. package/docs/ko/installation/other-clients.md +180 -0
  95. package/docs/ko/installation/plugin.md +98 -0
  96. package/docs/ko/tools/overview.md +270 -0
  97. package/package.json +46 -0
  98. package/plugins/weppy-roblox-mcp/.claude-plugin/plugin.json +53 -0
  99. package/plugins/weppy-roblox-mcp/agents/roblox-engineer.md +65 -0
  100. package/plugins/weppy-roblox-mcp/dist/dist/http-bridge.d.ts +65 -0
  101. package/plugins/weppy-roblox-mcp/dist/dist/http-bridge.d.ts.map +1 -0
  102. package/plugins/weppy-roblox-mcp/dist/dist/http-bridge.js +1 -0
  103. package/plugins/weppy-roblox-mcp/dist/dist/index.d.ts +3 -0
  104. package/plugins/weppy-roblox-mcp/dist/dist/index.d.ts.map +1 -0
  105. package/plugins/weppy-roblox-mcp/dist/dist/index.js +2 -0
  106. package/plugins/weppy-roblox-mcp/dist/dist/server.d.ts +13 -0
  107. package/plugins/weppy-roblox-mcp/dist/dist/server.d.ts.map +1 -0
  108. package/plugins/weppy-roblox-mcp/dist/dist/server.js +1 -0
  109. package/plugins/weppy-roblox-mcp/dist/dist/tools/asset-tools.d.ts +10 -0
  110. package/plugins/weppy-roblox-mcp/dist/dist/tools/asset-tools.d.ts.map +1 -0
  111. package/plugins/weppy-roblox-mcp/dist/dist/tools/asset-tools.js +1 -0
  112. package/plugins/weppy-roblox-mcp/dist/dist/tools/bulk-tools.d.ts +11 -0
  113. package/plugins/weppy-roblox-mcp/dist/dist/tools/bulk-tools.d.ts.map +1 -0
  114. package/plugins/weppy-roblox-mcp/dist/dist/tools/bulk-tools.js +1 -0
  115. package/plugins/weppy-roblox-mcp/dist/dist/tools/camera-tools.d.ts +5 -0
  116. package/plugins/weppy-roblox-mcp/dist/dist/tools/camera-tools.d.ts.map +1 -0
  117. package/plugins/weppy-roblox-mcp/dist/dist/tools/camera-tools.js +1 -0
  118. package/plugins/weppy-roblox-mcp/dist/dist/tools/connection-tools.d.ts +5 -0
  119. package/plugins/weppy-roblox-mcp/dist/dist/tools/connection-tools.d.ts.map +1 -0
  120. package/plugins/weppy-roblox-mcp/dist/dist/tools/connection-tools.js +1 -0
  121. package/plugins/weppy-roblox-mcp/dist/dist/tools/environment-tools.d.ts +8 -0
  122. package/plugins/weppy-roblox-mcp/dist/dist/tools/environment-tools.d.ts.map +1 -0
  123. package/plugins/weppy-roblox-mcp/dist/dist/tools/environment-tools.js +1 -0
  124. package/plugins/weppy-roblox-mcp/dist/dist/tools/index.d.ts +21 -0
  125. package/plugins/weppy-roblox-mcp/dist/dist/tools/index.d.ts.map +1 -0
  126. package/plugins/weppy-roblox-mcp/dist/dist/tools/index.js +1 -0
  127. package/plugins/weppy-roblox-mcp/dist/dist/tools/instance-tools.d.ts +16 -0
  128. package/plugins/weppy-roblox-mcp/dist/dist/tools/instance-tools.d.ts.map +1 -0
  129. package/plugins/weppy-roblox-mcp/dist/dist/tools/instance-tools.js +1 -0
  130. package/plugins/weppy-roblox-mcp/dist/dist/tools/log-tools.d.ts +6 -0
  131. package/plugins/weppy-roblox-mcp/dist/dist/tools/log-tools.d.ts.map +1 -0
  132. package/plugins/weppy-roblox-mcp/dist/dist/tools/log-tools.js +1 -0
  133. package/plugins/weppy-roblox-mcp/dist/dist/tools/property-tools.d.ts +13 -0
  134. package/plugins/weppy-roblox-mcp/dist/dist/tools/property-tools.d.ts.map +1 -0
  135. package/plugins/weppy-roblox-mcp/dist/dist/tools/property-tools.js +1 -0
  136. package/plugins/weppy-roblox-mcp/dist/dist/tools/raycast-tools.d.ts +11 -0
  137. package/plugins/weppy-roblox-mcp/dist/dist/tools/raycast-tools.d.ts.map +1 -0
  138. package/plugins/weppy-roblox-mcp/dist/dist/tools/raycast-tools.js +1 -0
  139. package/plugins/weppy-roblox-mcp/dist/dist/tools/script-tools.d.ts +13 -0
  140. package/plugins/weppy-roblox-mcp/dist/dist/tools/script-tools.d.ts.map +1 -0
  141. package/plugins/weppy-roblox-mcp/dist/dist/tools/script-tools.js +1 -0
  142. package/plugins/weppy-roblox-mcp/dist/dist/tools/search-tools.d.ts +11 -0
  143. package/plugins/weppy-roblox-mcp/dist/dist/tools/search-tools.d.ts.map +1 -0
  144. package/plugins/weppy-roblox-mcp/dist/dist/tools/search-tools.js +1 -0
  145. package/plugins/weppy-roblox-mcp/dist/dist/tools/selection-tools.d.ts +16 -0
  146. package/plugins/weppy-roblox-mcp/dist/dist/tools/selection-tools.d.ts.map +1 -0
  147. package/plugins/weppy-roblox-mcp/dist/dist/tools/selection-tools.js +1 -0
  148. package/plugins/weppy-roblox-mcp/dist/dist/tools/spatial-tools.d.ts +8 -0
  149. package/plugins/weppy-roblox-mcp/dist/dist/tools/spatial-tools.d.ts.map +1 -0
  150. package/plugins/weppy-roblox-mcp/dist/dist/tools/spatial-tools.js +1 -0
  151. package/plugins/weppy-roblox-mcp/dist/dist/tools/state-tools.d.ts +12 -0
  152. package/plugins/weppy-roblox-mcp/dist/dist/tools/state-tools.d.ts.map +1 -0
  153. package/plugins/weppy-roblox-mcp/dist/dist/tools/state-tools.js +1 -0
  154. package/plugins/weppy-roblox-mcp/dist/dist/tools/tag-tools.d.ts +8 -0
  155. package/plugins/weppy-roblox-mcp/dist/dist/tools/tag-tools.d.ts.map +1 -0
  156. package/plugins/weppy-roblox-mcp/dist/dist/tools/tag-tools.js +1 -0
  157. package/plugins/weppy-roblox-mcp/dist/dist/tools/terrain-tools.d.ts +15 -0
  158. package/plugins/weppy-roblox-mcp/dist/dist/tools/terrain-tools.d.ts.map +1 -0
  159. package/plugins/weppy-roblox-mcp/dist/dist/tools/terrain-tools.js +1 -0
  160. package/plugins/weppy-roblox-mcp/dist/dist/tools/visualization-tools.d.ts +9 -0
  161. package/plugins/weppy-roblox-mcp/dist/dist/tools/visualization-tools.d.ts.map +1 -0
  162. package/plugins/weppy-roblox-mcp/dist/dist/tools/visualization-tools.js +1 -0
  163. package/plugins/weppy-roblox-mcp/dist/dist/types/index.d.ts +143 -0
  164. package/plugins/weppy-roblox-mcp/dist/dist/types/index.d.ts.map +1 -0
  165. package/plugins/weppy-roblox-mcp/dist/dist/types/index.js +1 -0
  166. package/plugins/weppy-roblox-mcp/dist/dist/utils/logger.d.ts +16 -0
  167. package/plugins/weppy-roblox-mcp/dist/dist/utils/logger.d.ts.map +1 -0
  168. package/plugins/weppy-roblox-mcp/dist/dist/utils/logger.js +1 -0
  169. package/plugins/weppy-roblox-mcp/dist/dist/utils/quota-checker.d.ts +46 -0
  170. package/plugins/weppy-roblox-mcp/dist/dist/utils/quota-checker.d.ts.map +1 -0
  171. package/plugins/weppy-roblox-mcp/dist/dist/utils/quota-checker.js +1 -0
  172. package/plugins/weppy-roblox-mcp/dist/dist/utils/type-converter.d.ts +33 -0
  173. package/plugins/weppy-roblox-mcp/dist/dist/utils/type-converter.d.ts.map +1 -0
  174. package/plugins/weppy-roblox-mcp/dist/dist/utils/type-converter.js +1 -0
  175. package/plugins/weppy-roblox-mcp/dist/dist/utils/validation.d.ts +17 -0
  176. package/plugins/weppy-roblox-mcp/dist/dist/utils/validation.d.ts.map +1 -0
  177. package/plugins/weppy-roblox-mcp/dist/dist/utils/validation.js +1 -0
  178. package/plugins/weppy-roblox-mcp/dist/http-bridge.d.ts +45 -0
  179. package/plugins/weppy-roblox-mcp/dist/http-bridge.d.ts.map +1 -0
  180. package/plugins/weppy-roblox-mcp/dist/http-bridge.js +434 -0
  181. package/plugins/weppy-roblox-mcp/dist/http-bridge.js.map +1 -0
  182. package/plugins/weppy-roblox-mcp/dist/index.d.ts +3 -0
  183. package/plugins/weppy-roblox-mcp/dist/index.d.ts.map +1 -0
  184. package/plugins/weppy-roblox-mcp/dist/index.js +59 -0
  185. package/plugins/weppy-roblox-mcp/dist/index.js.map +1 -0
  186. package/plugins/weppy-roblox-mcp/dist/server.d.ts +13 -0
  187. package/plugins/weppy-roblox-mcp/dist/server.d.ts.map +1 -0
  188. package/plugins/weppy-roblox-mcp/dist/server.js +260 -0
  189. package/plugins/weppy-roblox-mcp/dist/server.js.map +1 -0
  190. package/plugins/weppy-roblox-mcp/dist/tools/asset-tools.d.ts +10 -0
  191. package/plugins/weppy-roblox-mcp/dist/tools/asset-tools.d.ts.map +1 -0
  192. package/plugins/weppy-roblox-mcp/dist/tools/asset-tools.js +127 -0
  193. package/plugins/weppy-roblox-mcp/dist/tools/asset-tools.js.map +1 -0
  194. package/plugins/weppy-roblox-mcp/dist/tools/bulk-tools.d.ts +11 -0
  195. package/plugins/weppy-roblox-mcp/dist/tools/bulk-tools.d.ts.map +1 -0
  196. package/plugins/weppy-roblox-mcp/dist/tools/bulk-tools.js +225 -0
  197. package/plugins/weppy-roblox-mcp/dist/tools/bulk-tools.js.map +1 -0
  198. package/plugins/weppy-roblox-mcp/dist/tools/environment-tools.d.ts +8 -0
  199. package/plugins/weppy-roblox-mcp/dist/tools/environment-tools.d.ts.map +1 -0
  200. package/plugins/weppy-roblox-mcp/dist/tools/environment-tools.js +93 -0
  201. package/plugins/weppy-roblox-mcp/dist/tools/environment-tools.js.map +1 -0
  202. package/plugins/weppy-roblox-mcp/dist/tools/index.d.ts +18 -0
  203. package/plugins/weppy-roblox-mcp/dist/tools/index.d.ts.map +1 -0
  204. package/plugins/weppy-roblox-mcp/dist/tools/index.js +59 -0
  205. package/plugins/weppy-roblox-mcp/dist/tools/index.js.map +1 -0
  206. package/plugins/weppy-roblox-mcp/dist/tools/instance-tools.d.ts +15 -0
  207. package/plugins/weppy-roblox-mcp/dist/tools/instance-tools.d.ts.map +1 -0
  208. package/plugins/weppy-roblox-mcp/dist/tools/instance-tools.js +252 -0
  209. package/plugins/weppy-roblox-mcp/dist/tools/instance-tools.js.map +1 -0
  210. package/plugins/weppy-roblox-mcp/dist/tools/log-tools.d.ts +6 -0
  211. package/plugins/weppy-roblox-mcp/dist/tools/log-tools.d.ts.map +1 -0
  212. package/plugins/weppy-roblox-mcp/dist/tools/log-tools.js +53 -0
  213. package/plugins/weppy-roblox-mcp/dist/tools/log-tools.js.map +1 -0
  214. package/plugins/weppy-roblox-mcp/dist/tools/property-tools.d.ts +13 -0
  215. package/plugins/weppy-roblox-mcp/dist/tools/property-tools.d.ts.map +1 -0
  216. package/plugins/weppy-roblox-mcp/dist/tools/property-tools.js +213 -0
  217. package/plugins/weppy-roblox-mcp/dist/tools/property-tools.js.map +1 -0
  218. package/plugins/weppy-roblox-mcp/dist/tools/raycast-tools.d.ts +11 -0
  219. package/plugins/weppy-roblox-mcp/dist/tools/raycast-tools.d.ts.map +1 -0
  220. package/plugins/weppy-roblox-mcp/dist/tools/raycast-tools.js +420 -0
  221. package/plugins/weppy-roblox-mcp/dist/tools/raycast-tools.js.map +1 -0
  222. package/plugins/weppy-roblox-mcp/dist/tools/script-tools.d.ts +13 -0
  223. package/plugins/weppy-roblox-mcp/dist/tools/script-tools.d.ts.map +1 -0
  224. package/plugins/weppy-roblox-mcp/dist/tools/script-tools.js +229 -0
  225. package/plugins/weppy-roblox-mcp/dist/tools/script-tools.js.map +1 -0
  226. package/plugins/weppy-roblox-mcp/dist/tools/search-tools.d.ts +11 -0
  227. package/plugins/weppy-roblox-mcp/dist/tools/search-tools.d.ts.map +1 -0
  228. package/plugins/weppy-roblox-mcp/dist/tools/search-tools.js +196 -0
  229. package/plugins/weppy-roblox-mcp/dist/tools/search-tools.js.map +1 -0
  230. package/plugins/weppy-roblox-mcp/dist/tools/selection-tools.d.ts +16 -0
  231. package/plugins/weppy-roblox-mcp/dist/tools/selection-tools.d.ts.map +1 -0
  232. package/plugins/weppy-roblox-mcp/dist/tools/selection-tools.js +185 -0
  233. package/plugins/weppy-roblox-mcp/dist/tools/selection-tools.js.map +1 -0
  234. package/plugins/weppy-roblox-mcp/dist/tools/spatial-tools.d.ts +8 -0
  235. package/plugins/weppy-roblox-mcp/dist/tools/spatial-tools.d.ts.map +1 -0
  236. package/plugins/weppy-roblox-mcp/dist/tools/spatial-tools.js +155 -0
  237. package/plugins/weppy-roblox-mcp/dist/tools/spatial-tools.js.map +1 -0
  238. package/plugins/weppy-roblox-mcp/dist/tools/state-tools.d.ts +153 -0
  239. package/plugins/weppy-roblox-mcp/dist/tools/state-tools.d.ts.map +1 -0
  240. package/plugins/weppy-roblox-mcp/dist/tools/state-tools.js +481 -0
  241. package/plugins/weppy-roblox-mcp/dist/tools/state-tools.js.map +1 -0
  242. package/plugins/weppy-roblox-mcp/dist/tools/tag-tools.d.ts +8 -0
  243. package/plugins/weppy-roblox-mcp/dist/tools/tag-tools.d.ts.map +1 -0
  244. package/plugins/weppy-roblox-mcp/dist/tools/tag-tools.js +99 -0
  245. package/plugins/weppy-roblox-mcp/dist/tools/tag-tools.js.map +1 -0
  246. package/plugins/weppy-roblox-mcp/dist/tools/terrain-tools.d.ts +15 -0
  247. package/plugins/weppy-roblox-mcp/dist/tools/terrain-tools.d.ts.map +1 -0
  248. package/plugins/weppy-roblox-mcp/dist/tools/terrain-tools.js +549 -0
  249. package/plugins/weppy-roblox-mcp/dist/tools/terrain-tools.js.map +1 -0
  250. package/plugins/weppy-roblox-mcp/dist/types/index.d.ts +111 -0
  251. package/plugins/weppy-roblox-mcp/dist/types/index.d.ts.map +1 -0
  252. package/plugins/weppy-roblox-mcp/dist/types/index.js +8 -0
  253. package/plugins/weppy-roblox-mcp/dist/types/index.js.map +1 -0
  254. package/plugins/weppy-roblox-mcp/dist/utils/logger.d.ts +16 -0
  255. package/plugins/weppy-roblox-mcp/dist/utils/logger.d.ts.map +1 -0
  256. package/plugins/weppy-roblox-mcp/dist/utils/logger.js +87 -0
  257. package/plugins/weppy-roblox-mcp/dist/utils/logger.js.map +1 -0
  258. package/plugins/weppy-roblox-mcp/dist/utils/type-converter.d.ts +33 -0
  259. package/plugins/weppy-roblox-mcp/dist/utils/type-converter.d.ts.map +1 -0
  260. package/plugins/weppy-roblox-mcp/dist/utils/type-converter.js +203 -0
  261. package/plugins/weppy-roblox-mcp/dist/utils/type-converter.js.map +1 -0
  262. package/plugins/weppy-roblox-mcp/dist/utils/validation.d.ts +17 -0
  263. package/plugins/weppy-roblox-mcp/dist/utils/validation.d.ts.map +1 -0
  264. package/plugins/weppy-roblox-mcp/dist/utils/validation.js +26 -0
  265. package/plugins/weppy-roblox-mcp/dist/utils/validation.js.map +1 -0
  266. package/plugins/weppy-roblox-mcp/package.json +43 -0
  267. package/plugins/weppy-roblox-mcp/skills/roblox-game-dev/SKILL.md +548 -0
  268. package/plugins/weppy-roblox-mcp/skills/roblox-mcp-guide/SKILL.md +680 -0
  269. package/plugins/weppy-roblox-mcp/skills/roblox-mcp-guide/scripts/check-mcp.sh +86 -0
  270. package/plugins/weppy-roblox-mcp/skills/roblox-planner/SKILL.md +588 -0
  271. package/plugins/weppy-roblox-mcp/skills/roblox-planner/scripts/verify-plan.sh +134 -0
  272. package/plugins/weppy-roblox-mcp/skills/roblox-sync/SKILL.md +389 -0
  273. package/plugins/weppy-roblox-mcp/skills/roblox-sync/scripts/post-verify.sh +160 -0
  274. package/plugins/weppy-roblox-mcp/skills/roblox-sync/scripts/pre-check.sh +304 -0
  275. package/plugins/weppy-roblox-mcp/skills/roblox-sync/scripts/update-metadata.sh +27 -0
  276. package/plugins/weppy-roblox-mcp/skills/roblox-task-tracker/SKILL.md +349 -0
  277. package/plugins/weppy-roblox-mcp/skills/roblox-task-tracker/scripts/validate.sh +28 -0
  278. package/plugins/weppy-roblox-mcp/skills/roblox-templates/SKILL.md +244 -0
  279. package/plugins/weppy-roblox-mcp/skills/roblox-templates/assets/effects.json +118 -0
  280. package/plugins/weppy-roblox-mcp/skills/roblox-templates/assets/items.json +169 -0
  281. package/plugins/weppy-roblox-mcp/skills/roblox-templates/assets/maps/maps.json +763 -0
  282. package/plugins/weppy-roblox-mcp/skills/roblox-templates/assets/maps/sources/decorations.json +137 -0
  283. package/plugins/weppy-roblox-mcp/skills/roblox-templates/assets/maps/sources/standalone-maps.json +331 -0
  284. package/plugins/weppy-roblox-mcp/skills/roblox-templates/assets/maps/sources/terrain-presets.json +272 -0
  285. package/plugins/weppy-roblox-mcp/skills/roblox-templates/assets/monsters.json +132 -0
  286. package/plugins/weppy-roblox-mcp/skills/roblox-templates/assets/npcs.json +50 -0
  287. package/plugins/weppy-roblox-mcp/skills/roblox-templates/assets/weapons.json +140 -0
  288. package/plugins/weppy-roblox-mcp/skills/roblox-templates/references/animations.json +40 -0
  289. package/plugins/weppy-roblox-mcp/skills/roblox-templates/references/rpg-balance.json +236 -0
  290. package/plugins/weppy-roblox-mcp/skills/roblox-templates/references/rpg.md +304 -0
  291. package/plugins/weppy-roblox-mcp/skills/roblox-templates/references/terrain-generation.json +192 -0
  292. package/plugins/weppy-roblox-mcp/skills/roblox-templates/samples/SpawnConfig.luau +152 -0
  293. package/roblox-plugin/WeppyRobloxMCP-Free.rbxm +3 -0
@@ -0,0 +1,434 @@
1
+ import express from 'express';
2
+ import { randomUUID } from 'crypto';
3
+ import { createServer } from 'http';
4
+ import Logger from './utils/logger.js';
5
+ export class HTTPBridge {
6
+ app;
7
+ server = null;
8
+ config;
9
+ commandQueue = new Map();
10
+ pendingCommands = [];
11
+ sseClients = new Set();
12
+ startTime = Date.now();
13
+ requestCounts = new Map();
14
+ cachedSelection = null;
15
+ isClientMode = false;
16
+ baseUrl = '';
17
+ constructor(config) {
18
+ this.config = config;
19
+ this.app = express();
20
+ this.baseUrl = `http://${config.httpHost}:${config.httpPort}`;
21
+ this.setupMiddleware();
22
+ this.setupRoutes();
23
+ }
24
+ setupMiddleware() {
25
+ this.app.use(express.json());
26
+ this.app.use((_req, res, next) => {
27
+ res.setHeader('Access-Control-Allow-Origin', 'http://localhost:3002');
28
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
29
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
30
+ next();
31
+ });
32
+ this.app.use((req, res, next) => {
33
+ if (!this.checkRateLimit(req.ip || 'unknown')) {
34
+ res.status(429).json({
35
+ error: 'Rate limit exceeded',
36
+ limit: this.config.maxRequestsPerMinute,
37
+ });
38
+ return;
39
+ }
40
+ next();
41
+ });
42
+ this.app.use((req, _res, next) => {
43
+ Logger.debug(`${req.method} ${req.path}`, { ip: req.ip });
44
+ next();
45
+ });
46
+ }
47
+ checkRateLimit(ip) {
48
+ const now = Date.now();
49
+ const oneMinuteAgo = now - 60000;
50
+ let timestamps = this.requestCounts.get(ip) || [];
51
+ timestamps = timestamps.filter((t) => t > oneMinuteAgo);
52
+ if (timestamps.length >= this.config.maxRequestsPerMinute) {
53
+ return false;
54
+ }
55
+ timestamps.push(now);
56
+ this.requestCounts.set(ip, timestamps);
57
+ return true;
58
+ }
59
+ setupRoutes() {
60
+ this.app.get('/events', (req, res) => this.handleSSEConnection(req, res));
61
+ this.app.get('/commands', (_req, res) => this.handleCommandsPoll(res));
62
+ this.app.post('/result', (req, res) => this.handleResult(req, res));
63
+ this.app.post('/selection-update', (req, res) => this.handleSelectionUpdate(req, res));
64
+ this.app.post('/execute', (req, res) => this.handleExecute(req, res));
65
+ this.app.get('/cached-selection', (req, res) => this.handleCachedSelectionRequest(req, res));
66
+ this.app.get('/status', (_req, res) => this.handleStatus(res));
67
+ this.app.options('*', (_req, res) => {
68
+ res.sendStatus(200);
69
+ });
70
+ }
71
+ handleSSEConnection(_req, res) {
72
+ Logger.info('Plugin connected via SSE');
73
+ res.setHeader('Content-Type', 'text/event-stream');
74
+ res.setHeader('Cache-Control', 'no-cache');
75
+ res.setHeader('Connection', 'keep-alive');
76
+ this.sseClients.add(res);
77
+ this.sendSSEEvent(res, {
78
+ event: 'command',
79
+ id: randomUUID(),
80
+ data: {
81
+ action: 'connected',
82
+ requestId: randomUUID(),
83
+ params: {
84
+ serverVersion: '0.1.0',
85
+ timestamp: Date.now(),
86
+ },
87
+ },
88
+ });
89
+ const pingInterval = setInterval(() => {
90
+ this.sendSSEEvent(res, {
91
+ event: 'command',
92
+ id: randomUUID(),
93
+ data: {
94
+ action: 'keepalive',
95
+ requestId: randomUUID(),
96
+ params: { timestamp: Date.now() },
97
+ },
98
+ });
99
+ }, 30000);
100
+ res.on('close', () => {
101
+ Logger.info('Plugin disconnected from SSE');
102
+ clearInterval(pingInterval);
103
+ this.sseClients.delete(res);
104
+ });
105
+ }
106
+ sendSSEEvent(res, event) {
107
+ const data = JSON.stringify(event.data);
108
+ res.write(`event: ${event.event}\n`);
109
+ res.write(`id: ${event.id}\n`);
110
+ res.write(`data: ${data}\n\n`);
111
+ }
112
+ handleCommandsPoll(res) {
113
+ const commands = [...this.pendingCommands];
114
+ this.pendingCommands = [];
115
+ Logger.debug('Commands poll', {
116
+ commandsReturned: commands.length,
117
+ });
118
+ res.json(commands);
119
+ }
120
+ broadcastCommand(command) {
121
+ Logger.debug('Broadcasting command', {
122
+ action: command.data.action,
123
+ requestId: command.data.requestId,
124
+ sseClients: this.sseClients.size,
125
+ });
126
+ this.pendingCommands.push(command);
127
+ for (const client of this.sseClients) {
128
+ this.sendSSEEvent(client, command);
129
+ }
130
+ }
131
+ handleResult(req, res) {
132
+ const result = req.body;
133
+ Logger.debug('Received result from plugin', {
134
+ requestId: result.requestId,
135
+ success: result.success,
136
+ });
137
+ const command = this.commandQueue.get(result.requestId);
138
+ if (!command) {
139
+ Logger.warn('Received result for unknown request', {
140
+ requestId: result.requestId,
141
+ });
142
+ res.status(404).json({ error: 'Unknown request ID' });
143
+ return;
144
+ }
145
+ clearTimeout(command.timeoutId);
146
+ if (result.success) {
147
+ command.resolve(result);
148
+ }
149
+ else {
150
+ command.reject(new Error(result.error || 'Unknown error'));
151
+ }
152
+ this.commandQueue.delete(result.requestId);
153
+ res.json({ status: 'ok' });
154
+ }
155
+ handleSelectionUpdate(req, res) {
156
+ try {
157
+ const body = req.body;
158
+ if (!body || !Array.isArray(body.selection) || typeof body.count !== 'number') {
159
+ Logger.warn('Invalid selection update request', { body });
160
+ res.status(400).json({ error: 'Invalid request body' });
161
+ return;
162
+ }
163
+ this.cachedSelection = {
164
+ selection: body.selection,
165
+ count: body.count,
166
+ timestamp: Date.now(),
167
+ };
168
+ Logger.debug('Selection cache updated', {
169
+ count: body.count,
170
+ timestamp: this.cachedSelection.timestamp,
171
+ });
172
+ res.json({
173
+ status: 'ok',
174
+ timestamp: this.cachedSelection.timestamp,
175
+ });
176
+ }
177
+ catch (error) {
178
+ Logger.error('Error handling selection update', error);
179
+ res.status(500).json({ error: 'Internal server error' });
180
+ }
181
+ }
182
+ async handleExecute(req, res) {
183
+ try {
184
+ const { action, requestId, params } = req.body;
185
+ if (!action) {
186
+ res.status(400).json({ error: 'Missing action' });
187
+ return;
188
+ }
189
+ Logger.debug('Received execute request from client mode', {
190
+ action,
191
+ requestId,
192
+ });
193
+ const result = await this.executeCommandLocally(action, params, requestId);
194
+ res.json(result);
195
+ }
196
+ catch (error) {
197
+ Logger.error('Execute request failed', error);
198
+ res.status(500).json({
199
+ success: false,
200
+ error: error instanceof Error ? error.message : 'Unknown error',
201
+ });
202
+ }
203
+ }
204
+ async executeCommandLocally(action, params, requestId) {
205
+ Logger.debug('Executing command locally', { action, requestId });
206
+ const resultPromise = new Promise((resolve, reject) => {
207
+ const timeoutId = setTimeout(() => {
208
+ this.commandQueue.delete(requestId);
209
+ reject(new Error(`Command timeout after ${this.config.requestTimeout}ms: ${action}`));
210
+ }, this.config.requestTimeout);
211
+ const command = {
212
+ requestId,
213
+ action,
214
+ params,
215
+ timestamp: Date.now(),
216
+ resolve,
217
+ reject,
218
+ timeoutId,
219
+ };
220
+ this.commandQueue.set(requestId, command);
221
+ });
222
+ this.broadcastCommand({
223
+ event: 'command',
224
+ id: randomUUID(),
225
+ data: {
226
+ action,
227
+ requestId,
228
+ params,
229
+ },
230
+ });
231
+ return resultPromise;
232
+ }
233
+ handleCachedSelectionRequest(req, res) {
234
+ const maxAge = parseInt(req.query.maxAge) || 30000;
235
+ const cached = this.getCachedSelection(maxAge);
236
+ if (cached) {
237
+ res.json({
238
+ cached: true,
239
+ ...cached,
240
+ });
241
+ }
242
+ else {
243
+ res.json({
244
+ cached: false,
245
+ message: 'No cached selection available',
246
+ });
247
+ }
248
+ }
249
+ handleStatus(res) {
250
+ const status = {
251
+ status: 'online',
252
+ connectedClients: this.sseClients.size,
253
+ queuedCommands: this.commandQueue.size,
254
+ uptime: Date.now() - this.startTime,
255
+ version: '0.1.0',
256
+ isClientMode: this.isClientMode,
257
+ };
258
+ res.json(status);
259
+ }
260
+ getCachedSelection(maxAge = 30000) {
261
+ if (!this.cachedSelection) {
262
+ return null;
263
+ }
264
+ const age = Date.now() - this.cachedSelection.timestamp;
265
+ if (maxAge === 0 || age <= maxAge) {
266
+ return this.cachedSelection;
267
+ }
268
+ return null;
269
+ }
270
+ async executeCommandViaHttp(action, params) {
271
+ const requestId = randomUUID();
272
+ Logger.debug('Executing command via HTTP (client mode)', {
273
+ action,
274
+ requestId,
275
+ baseUrl: this.baseUrl,
276
+ });
277
+ try {
278
+ const response = await fetch(`${this.baseUrl}/execute`, {
279
+ method: 'POST',
280
+ headers: {
281
+ 'Content-Type': 'application/json',
282
+ },
283
+ body: JSON.stringify({
284
+ action,
285
+ requestId,
286
+ params,
287
+ }),
288
+ });
289
+ if (!response.ok) {
290
+ const errorText = await response.text();
291
+ throw new Error(`HTTP ${response.status}: ${errorText}`);
292
+ }
293
+ const result = await response.json();
294
+ return result;
295
+ }
296
+ catch (error) {
297
+ Logger.error('HTTP execute command failed', error);
298
+ return {
299
+ requestId,
300
+ success: false,
301
+ error: error instanceof Error ? error.message : 'Unknown error',
302
+ };
303
+ }
304
+ }
305
+ async executeCommand(action, params) {
306
+ if (this.isClientMode) {
307
+ return this.executeCommandViaHttp(action, params);
308
+ }
309
+ const requestId = randomUUID();
310
+ Logger.debug('Executing command', { action, requestId, params });
311
+ const resultPromise = new Promise((resolve, reject) => {
312
+ const timeoutId = setTimeout(() => {
313
+ this.commandQueue.delete(requestId);
314
+ reject(new Error(`Command timeout after ${this.config.requestTimeout}ms: ${action}`));
315
+ }, this.config.requestTimeout);
316
+ const command = {
317
+ requestId,
318
+ action,
319
+ params,
320
+ timestamp: Date.now(),
321
+ resolve,
322
+ reject,
323
+ timeoutId,
324
+ };
325
+ this.commandQueue.set(requestId, command);
326
+ });
327
+ this.broadcastCommand({
328
+ event: 'command',
329
+ id: randomUUID(),
330
+ data: {
331
+ action,
332
+ requestId,
333
+ params,
334
+ },
335
+ });
336
+ return resultPromise;
337
+ }
338
+ async checkExistingServer() {
339
+ try {
340
+ const controller = new AbortController();
341
+ const timeoutId = setTimeout(() => controller.abort(), 2000);
342
+ const response = await fetch(`${this.baseUrl}/status`, {
343
+ signal: controller.signal,
344
+ });
345
+ clearTimeout(timeoutId);
346
+ if (response.ok) {
347
+ const status = await response.json();
348
+ Logger.info('Existing HTTP Bridge detected', {
349
+ status: status.status,
350
+ uptime: status.uptime,
351
+ version: status.version,
352
+ });
353
+ return true;
354
+ }
355
+ return false;
356
+ }
357
+ catch {
358
+ return false;
359
+ }
360
+ }
361
+ async start() {
362
+ const existingServerAvailable = await this.checkExistingServer();
363
+ if (existingServerAvailable) {
364
+ this.isClientMode = true;
365
+ Logger.info('HTTP Bridge running in CLIENT MODE', {
366
+ baseUrl: this.baseUrl,
367
+ reason: 'Existing server detected on port',
368
+ });
369
+ return;
370
+ }
371
+ return new Promise((resolve, reject) => {
372
+ this.server = createServer(this.app);
373
+ this.server.on('error', async (error) => {
374
+ if (error.code === 'EADDRINUSE') {
375
+ Logger.warn('Port in use, attempting client mode fallback', {
376
+ port: this.config.httpPort,
377
+ });
378
+ await new Promise(r => setTimeout(r, 500));
379
+ const canConnect = await this.checkExistingServer();
380
+ if (canConnect) {
381
+ this.isClientMode = true;
382
+ Logger.info('HTTP Bridge running in CLIENT MODE (fallback)', {
383
+ baseUrl: this.baseUrl,
384
+ });
385
+ resolve();
386
+ }
387
+ else {
388
+ reject(new Error(`Port ${this.config.httpPort} is in use but server is not responding`));
389
+ }
390
+ }
391
+ else {
392
+ reject(error);
393
+ }
394
+ });
395
+ this.server.listen(this.config.httpPort, this.config.httpHost, () => {
396
+ this.isClientMode = false;
397
+ Logger.info('HTTP Bridge started in SERVER MODE', {
398
+ host: this.config.httpHost,
399
+ port: this.config.httpPort,
400
+ });
401
+ resolve();
402
+ });
403
+ });
404
+ }
405
+ async stop() {
406
+ Logger.info('Stopping HTTP Bridge', { isClientMode: this.isClientMode });
407
+ if (this.isClientMode) {
408
+ Logger.info('Client mode - nothing to stop');
409
+ return;
410
+ }
411
+ for (const client of this.sseClients) {
412
+ client.end();
413
+ }
414
+ this.sseClients.clear();
415
+ for (const [requestId, command] of this.commandQueue) {
416
+ clearTimeout(command.timeoutId);
417
+ command.reject(new Error('Server shutting down'));
418
+ this.commandQueue.delete(requestId);
419
+ }
420
+ if (this.server) {
421
+ await new Promise((resolve) => {
422
+ this.server.close(() => {
423
+ Logger.info('HTTP server closed');
424
+ resolve();
425
+ });
426
+ });
427
+ }
428
+ }
429
+ getIsClientMode() {
430
+ return this.isClientMode;
431
+ }
432
+ }
433
+ export default HTTPBridge;
434
+ //# sourceMappingURL=http-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-bridge.js","sourceRoot":"","sources":["../src/http-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env node
2
+ import RobloxMCPServer from './server.js';
3
+ import Logger from './utils/logger.js';
4
+ import { LogLevel } from './types/index.js';
5
+ function parseConfig() {
6
+ const config = {
7
+ httpPort: parseInt(process.env.HTTP_PORT || '3002', 10),
8
+ httpHost: process.env.HTTP_HOST || '127.0.0.1',
9
+ logLevel: process.env.LOG_LEVEL || LogLevel.INFO,
10
+ requestTimeout: parseInt(process.env.REQUEST_TIMEOUT || '30000', 10),
11
+ maxRequestsPerMinute: parseInt(process.env.MAX_REQUESTS_PER_MINUTE || '450', 10),
12
+ };
13
+ Logger.setLevel(config.logLevel);
14
+ return config;
15
+ }
16
+ async function main() {
17
+ try {
18
+ const config = parseConfig();
19
+ Logger.info('Weppy Roblox MCP Server', {
20
+ version: '0.1.0',
21
+ config: {
22
+ httpHost: config.httpHost,
23
+ httpPort: config.httpPort,
24
+ logLevel: config.logLevel,
25
+ requestTimeout: config.requestTimeout,
26
+ maxRequestsPerMinute: config.maxRequestsPerMinute,
27
+ },
28
+ });
29
+ const server = new RobloxMCPServer(config);
30
+ await server.start();
31
+ const shutdown = async (signal) => {
32
+ Logger.info(`Received ${signal}, shutting down gracefully`);
33
+ try {
34
+ await server.stop();
35
+ process.exit(0);
36
+ }
37
+ catch (error) {
38
+ Logger.error('Error during shutdown', error);
39
+ process.exit(1);
40
+ }
41
+ };
42
+ process.on('SIGINT', () => shutdown('SIGINT'));
43
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
44
+ process.on('uncaughtException', (error) => {
45
+ Logger.error('Uncaught exception', error);
46
+ process.exit(1);
47
+ });
48
+ process.on('unhandledRejection', (reason) => {
49
+ Logger.error('Unhandled rejection', reason);
50
+ process.exit(1);
51
+ });
52
+ }
53
+ catch (error) {
54
+ Logger.error('Failed to start server', error);
55
+ process.exit(1);
56
+ }
57
+ }
58
+ main();
59
+ //# 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,13 @@
1
+ import type { ServerConfig } from './types/index.js';
2
+ export declare class RobloxMCPServer {
3
+ private server;
4
+ private httpBridge;
5
+ private config;
6
+ constructor(config: ServerConfig);
7
+ private setupHandlers;
8
+ private executeTool;
9
+ start(): Promise<void>;
10
+ stop(): Promise<void>;
11
+ }
12
+ export default RobloxMCPServer;
13
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAiBrD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,EAAE,YAAY;IAgChC,OAAO,CAAC,aAAa;YAsEP,WAAW;IAyPZ,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAWnC;AAED,eAAe,eAAe,CAAC"}