@sashido/mcp-server 0.0.0-stage → 0.2.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 (191) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +201 -2
  3. package/dist/access.d.ts +47 -0
  4. package/dist/access.d.ts.map +1 -0
  5. package/dist/access.js +156 -0
  6. package/dist/access.js.map +1 -0
  7. package/dist/advice/format.d.ts +22 -0
  8. package/dist/advice/format.d.ts.map +1 -0
  9. package/dist/advice/format.js +70 -0
  10. package/dist/advice/format.js.map +1 -0
  11. package/dist/advice/schemaChecks.d.ts +17 -0
  12. package/dist/advice/schemaChecks.d.ts.map +1 -0
  13. package/dist/advice/schemaChecks.js +64 -0
  14. package/dist/advice/schemaChecks.js.map +1 -0
  15. package/dist/audit.d.ts +32 -0
  16. package/dist/audit.d.ts.map +1 -0
  17. package/dist/audit.js +41 -0
  18. package/dist/audit.js.map +1 -0
  19. package/dist/auth.d.ts +17 -0
  20. package/dist/auth.d.ts.map +1 -0
  21. package/dist/auth.js +72 -0
  22. package/dist/auth.js.map +1 -0
  23. package/dist/bin/login.d.ts +3 -0
  24. package/dist/bin/login.d.ts.map +1 -0
  25. package/dist/bin/login.js +16 -0
  26. package/dist/bin/login.js.map +1 -0
  27. package/dist/bin/mcp-server.d.ts +3 -0
  28. package/dist/bin/mcp-server.d.ts.map +1 -0
  29. package/dist/bin/mcp-server.js +27 -0
  30. package/dist/bin/mcp-server.js.map +1 -0
  31. package/dist/client/parse.d.ts +219 -0
  32. package/dist/client/parse.d.ts.map +1 -0
  33. package/dist/client/parse.js +414 -0
  34. package/dist/client/parse.js.map +1 -0
  35. package/dist/client/sashido.d.ts +213 -0
  36. package/dist/client/sashido.d.ts.map +1 -0
  37. package/dist/client/sashido.js +289 -0
  38. package/dist/client/sashido.js.map +1 -0
  39. package/dist/config.d.ts +27 -0
  40. package/dist/config.d.ts.map +1 -0
  41. package/dist/config.js +70 -0
  42. package/dist/config.js.map +1 -0
  43. package/dist/context.d.ts +33 -0
  44. package/dist/context.d.ts.map +1 -0
  45. package/dist/context.js +132 -0
  46. package/dist/context.js.map +1 -0
  47. package/dist/index.d.ts +10 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +8 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/server.d.ts +13 -0
  52. package/dist/server.d.ts.map +1 -0
  53. package/dist/server.js +60 -0
  54. package/dist/server.js.map +1 -0
  55. package/dist/session/redis-client.d.ts +23 -0
  56. package/dist/session/redis-client.d.ts.map +1 -0
  57. package/dist/session/redis-client.js +136 -0
  58. package/dist/session/redis-client.js.map +1 -0
  59. package/dist/session/session-manager.d.ts +6 -0
  60. package/dist/session/session-manager.d.ts.map +1 -0
  61. package/dist/session/session-manager.js +68 -0
  62. package/dist/session/session-manager.js.map +1 -0
  63. package/dist/session/sse-pubsub.d.ts +23 -0
  64. package/dist/session/sse-pubsub.d.ts.map +1 -0
  65. package/dist/session/sse-pubsub.js +121 -0
  66. package/dist/session/sse-pubsub.js.map +1 -0
  67. package/dist/session/types.d.ts +43 -0
  68. package/dist/session/types.d.ts.map +1 -0
  69. package/dist/session/types.js +2 -0
  70. package/dist/session/types.js.map +1 -0
  71. package/dist/tools/advisor/index.d.ts +3 -0
  72. package/dist/tools/advisor/index.d.ts.map +1 -0
  73. package/dist/tools/advisor/index.js +149 -0
  74. package/dist/tools/advisor/index.js.map +1 -0
  75. package/dist/tools/apps/index.d.ts +3 -0
  76. package/dist/tools/apps/index.d.ts.map +1 -0
  77. package/dist/tools/apps/index.js +113 -0
  78. package/dist/tools/apps/index.js.map +1 -0
  79. package/dist/tools/audit/index.d.ts +6 -0
  80. package/dist/tools/audit/index.d.ts.map +1 -0
  81. package/dist/tools/audit/index.js +69 -0
  82. package/dist/tools/audit/index.js.map +1 -0
  83. package/dist/tools/builds/index.d.ts +3 -0
  84. package/dist/tools/builds/index.d.ts.map +1 -0
  85. package/dist/tools/builds/index.js +85 -0
  86. package/dist/tools/builds/index.js.map +1 -0
  87. package/dist/tools/classes/index.d.ts +3 -0
  88. package/dist/tools/classes/index.d.ts.map +1 -0
  89. package/dist/tools/classes/index.js +223 -0
  90. package/dist/tools/classes/index.js.map +1 -0
  91. package/dist/tools/cloud-functions/index.d.ts +3 -0
  92. package/dist/tools/cloud-functions/index.d.ts.map +1 -0
  93. package/dist/tools/cloud-functions/index.js +154 -0
  94. package/dist/tools/cloud-functions/index.js.map +1 -0
  95. package/dist/tools/deployments/index.d.ts +3 -0
  96. package/dist/tools/deployments/index.d.ts.map +1 -0
  97. package/dist/tools/deployments/index.js +124 -0
  98. package/dist/tools/deployments/index.js.map +1 -0
  99. package/dist/tools/engines/index.d.ts +3 -0
  100. package/dist/tools/engines/index.d.ts.map +1 -0
  101. package/dist/tools/engines/index.js +68 -0
  102. package/dist/tools/engines/index.js.map +1 -0
  103. package/dist/tools/env/index.d.ts +3 -0
  104. package/dist/tools/env/index.d.ts.map +1 -0
  105. package/dist/tools/env/index.js +116 -0
  106. package/dist/tools/env/index.js.map +1 -0
  107. package/dist/tools/files/index.d.ts +3 -0
  108. package/dist/tools/files/index.d.ts.map +1 -0
  109. package/dist/tools/files/index.js +132 -0
  110. package/dist/tools/files/index.js.map +1 -0
  111. package/dist/tools/health/index.d.ts +3 -0
  112. package/dist/tools/health/index.d.ts.map +1 -0
  113. package/dist/tools/health/index.js +47 -0
  114. package/dist/tools/health/index.js.map +1 -0
  115. package/dist/tools/infrastructure/deployments.d.ts +23 -0
  116. package/dist/tools/infrastructure/deployments.d.ts.map +1 -0
  117. package/dist/tools/infrastructure/deployments.js +76 -0
  118. package/dist/tools/infrastructure/deployments.js.map +1 -0
  119. package/dist/tools/infrastructure/index.d.ts +9 -0
  120. package/dist/tools/infrastructure/index.d.ts.map +1 -0
  121. package/dist/tools/infrastructure/index.js +164 -0
  122. package/dist/tools/infrastructure/index.js.map +1 -0
  123. package/dist/tools/jobs/index.d.ts +3 -0
  124. package/dist/tools/jobs/index.d.ts.map +1 -0
  125. package/dist/tools/jobs/index.js +338 -0
  126. package/dist/tools/jobs/index.js.map +1 -0
  127. package/dist/tools/logs/index.d.ts +3 -0
  128. package/dist/tools/logs/index.d.ts.map +1 -0
  129. package/dist/tools/logs/index.js +133 -0
  130. package/dist/tools/logs/index.js.map +1 -0
  131. package/dist/tools/objects/index.d.ts +3 -0
  132. package/dist/tools/objects/index.d.ts.map +1 -0
  133. package/dist/tools/objects/index.js +185 -0
  134. package/dist/tools/objects/index.js.map +1 -0
  135. package/dist/tools/push/index.d.ts +3 -0
  136. package/dist/tools/push/index.d.ts.map +1 -0
  137. package/dist/tools/push/index.js +434 -0
  138. package/dist/tools/push/index.js.map +1 -0
  139. package/dist/tools/types/index.d.ts +3 -0
  140. package/dist/tools/types/index.d.ts.map +1 -0
  141. package/dist/tools/types/index.js +45 -0
  142. package/dist/tools/types/index.js.map +1 -0
  143. package/dist/tools/webhooks/index.d.ts +3 -0
  144. package/dist/tools/webhooks/index.d.ts.map +1 -0
  145. package/dist/tools/webhooks/index.js +443 -0
  146. package/dist/tools/webhooks/index.js.map +1 -0
  147. package/dist/transports/http.d.ts +4 -0
  148. package/dist/transports/http.d.ts.map +1 -0
  149. package/dist/transports/http.js +241 -0
  150. package/dist/transports/http.js.map +1 -0
  151. package/dist/transports/stdio.d.ts +7 -0
  152. package/dist/transports/stdio.d.ts.map +1 -0
  153. package/dist/transports/stdio.js +29 -0
  154. package/dist/transports/stdio.js.map +1 -0
  155. package/dist/typegen/dart.d.ts +3 -0
  156. package/dist/typegen/dart.d.ts.map +1 -0
  157. package/dist/typegen/dart.js +84 -0
  158. package/dist/typegen/dart.js.map +1 -0
  159. package/dist/typegen/kotlin.d.ts +3 -0
  160. package/dist/typegen/kotlin.d.ts.map +1 -0
  161. package/dist/typegen/kotlin.js +84 -0
  162. package/dist/typegen/kotlin.js.map +1 -0
  163. package/dist/typegen/model.d.ts +37 -0
  164. package/dist/typegen/model.d.ts.map +1 -0
  165. package/dist/typegen/model.js +82 -0
  166. package/dist/typegen/model.js.map +1 -0
  167. package/dist/typegen/swift.d.ts +3 -0
  168. package/dist/typegen/swift.d.ts.map +1 -0
  169. package/dist/typegen/swift.js +105 -0
  170. package/dist/typegen/swift.js.map +1 -0
  171. package/dist/typegen/typescript.d.ts +3 -0
  172. package/dist/typegen/typescript.d.ts.map +1 -0
  173. package/dist/typegen/typescript.js +73 -0
  174. package/dist/typegen/typescript.js.map +1 -0
  175. package/dist/upgrade/rules.d.ts +27 -0
  176. package/dist/upgrade/rules.d.ts.map +1 -0
  177. package/dist/upgrade/rules.js +133 -0
  178. package/dist/upgrade/rules.js.map +1 -0
  179. package/dist/upgrade/scan.d.ts +18 -0
  180. package/dist/upgrade/scan.d.ts.map +1 -0
  181. package/dist/upgrade/scan.js +38 -0
  182. package/dist/upgrade/scan.js.map +1 -0
  183. package/dist/upgrade/versions.d.ts +8 -0
  184. package/dist/upgrade/versions.d.ts.map +1 -0
  185. package/dist/upgrade/versions.js +25 -0
  186. package/dist/upgrade/versions.js.map +1 -0
  187. package/dist/version.d.ts +3 -0
  188. package/dist/version.d.ts.map +1 -0
  189. package/dist/version.js +3 -0
  190. package/dist/version.js.map +1 -0
  191. package/package.json +67 -4
@@ -0,0 +1,223 @@
1
+ import { z } from 'zod';
2
+ export function registerClassTools(server, ctx) {
3
+ const getParseClient = async (args, _extra) => ctx.parse(args.appObjectId);
4
+ // List Classes
5
+ server.tool('list_classes', 'List all classes (schemas) in a Parse Server application', {
6
+ appObjectId: z.string().describe('The application object ID'),
7
+ }, async (args, extra) => {
8
+ const parseClient = await getParseClient(args, extra);
9
+ const schemas = await parseClient.listClasses();
10
+ // Return only class names and field info, not sensitive data
11
+ const sanitizedSchemas = schemas.map(schema => ({
12
+ className: schema.className,
13
+ fields: Object.entries(schema.fields).map(([name, def]) => ({
14
+ name,
15
+ type: def.type,
16
+ targetClass: def.targetClass,
17
+ })),
18
+ }));
19
+ return {
20
+ content: [
21
+ {
22
+ type: 'text',
23
+ text: JSON.stringify(sanitizedSchemas, null, 2),
24
+ },
25
+ ],
26
+ };
27
+ });
28
+ // Get Class Schema
29
+ server.tool('get_class', 'Get detailed schema information for a specific class', {
30
+ appObjectId: z.string().describe('The application object ID'),
31
+ className: z.string().describe('The class name'),
32
+ }, async (args, extra) => {
33
+ const parseClient = await getParseClient(args, extra);
34
+ const schema = await parseClient.getClass(args.className);
35
+ return {
36
+ content: [
37
+ {
38
+ type: 'text',
39
+ text: JSON.stringify({
40
+ className: schema.className,
41
+ fields: schema.fields,
42
+ classLevelPermissions: schema.classLevelPermissions,
43
+ }, null, 2),
44
+ },
45
+ ],
46
+ };
47
+ });
48
+ // Create Class
49
+ server.tool('create_class', 'Create a new class (schema) in the Parse Server application', {
50
+ appObjectId: z.string().describe('The application object ID'),
51
+ className: z.string().describe('The class name to create'),
52
+ fields: z
53
+ .record(z.object({ type: z.string() }))
54
+ .optional()
55
+ .describe('Optional initial fields definition (e.g., {"name": {"type": "String"}})'),
56
+ }, async (args, extra) => {
57
+ const parseClient = await getParseClient(args, extra);
58
+ const schema = await parseClient.createClass(args.className, args.fields);
59
+ return {
60
+ content: [
61
+ {
62
+ type: 'text',
63
+ text: `Class "${args.className}" created successfully.\n\n${JSON.stringify(schema, null, 2)}`,
64
+ },
65
+ ],
66
+ };
67
+ });
68
+ // Delete Class
69
+ server.tool('delete_class', 'Delete a class (schema) from the Parse Server application. Parse refuses a class that still has objects: delete them first. Irreversible.', {
70
+ appObjectId: z.string().describe('The application object ID'),
71
+ className: z.string().describe('The class name to delete'),
72
+ confirmDelete: z
73
+ .boolean()
74
+ .describe('Must be true to confirm deletion. This action is irreversible!'),
75
+ }, async (args, extra) => {
76
+ if (!args.confirmDelete) {
77
+ return {
78
+ content: [
79
+ {
80
+ type: 'text',
81
+ text: 'Deletion cancelled. Set confirmDelete to true to proceed.',
82
+ },
83
+ ],
84
+ };
85
+ }
86
+ const parseClient = await getParseClient(args, extra);
87
+ await parseClient.deleteClass(args.className);
88
+ return {
89
+ content: [
90
+ {
91
+ type: 'text',
92
+ text: `Class "${args.className}" deleted successfully.`,
93
+ },
94
+ ],
95
+ };
96
+ });
97
+ // Add Field
98
+ server.tool('add_field', 'Add a new field to an existing class', {
99
+ appObjectId: z.string().describe('The application object ID'),
100
+ className: z.string().describe('The class name'),
101
+ fieldName: z.string().describe('The field name to add'),
102
+ fieldType: z
103
+ .enum([
104
+ 'String',
105
+ 'Number',
106
+ 'Boolean',
107
+ 'Date',
108
+ 'File',
109
+ 'GeoPoint',
110
+ 'Polygon',
111
+ 'Array',
112
+ 'Object',
113
+ 'Pointer',
114
+ 'Relation',
115
+ ])
116
+ .describe('The field type'),
117
+ targetClass: z
118
+ .string()
119
+ .optional()
120
+ .describe('For Pointer/Relation types, the target class name'),
121
+ }, async (args, extra) => {
122
+ const parseClient = await getParseClient(args, extra);
123
+ const schema = await parseClient.addField(args.className, args.fieldName, args.fieldType, args.targetClass);
124
+ return {
125
+ content: [
126
+ {
127
+ type: 'text',
128
+ text: `Field "${args.fieldName}" (${args.fieldType}) added to class "${args.className}".\n\n${JSON.stringify(schema.fields, null, 2)}`,
129
+ },
130
+ ],
131
+ };
132
+ });
133
+ // Delete Field
134
+ server.tool('delete_field', 'Delete a field from a class. WARNING: This will delete all data in this field!', {
135
+ appObjectId: z.string().describe('The application object ID'),
136
+ className: z.string().describe('The class name'),
137
+ fieldName: z.string().describe('The field name to delete'),
138
+ confirmDelete: z
139
+ .boolean()
140
+ .describe('Must be true to confirm deletion. This action is irreversible!'),
141
+ }, async (args, extra) => {
142
+ if (!args.confirmDelete) {
143
+ return {
144
+ content: [
145
+ {
146
+ type: 'text',
147
+ text: 'Deletion cancelled. Set confirmDelete to true to proceed.',
148
+ },
149
+ ],
150
+ };
151
+ }
152
+ const parseClient = await getParseClient(args, extra);
153
+ await parseClient.deleteField(args.className, args.fieldName);
154
+ return {
155
+ content: [
156
+ {
157
+ type: 'text',
158
+ text: `Field "${args.fieldName}" deleted from class "${args.className}".`,
159
+ },
160
+ ],
161
+ };
162
+ });
163
+ // Get Class Level Permissions
164
+ server.tool('get_class_permissions', 'Get Class Level Permissions (CLP) for a specific class', {
165
+ appObjectId: z.string().describe('The application object ID'),
166
+ className: z.string().describe('The class name'),
167
+ }, async (args, extra) => {
168
+ const parseClient = await getParseClient(args, extra);
169
+ const schema = await parseClient.getClass(args.className);
170
+ const clp = schema.classLevelPermissions || {};
171
+ // Format CLPs nicely
172
+ const operations = ['find', 'get', 'create', 'update', 'delete', 'addField'];
173
+ const formatted = operations.map(op => {
174
+ const perm = clp[op] || {};
175
+ const access = Object.entries(perm)
176
+ .map(([key, value]) => `${key}: ${value}`)
177
+ .join(', ') || 'No permissions set';
178
+ return `${op}: ${access}`;
179
+ });
180
+ return {
181
+ content: [
182
+ {
183
+ type: 'text',
184
+ text: `Class Level Permissions for "${args.className}":\n\n${formatted.join('\n')}\n\nRaw CLP:\n${JSON.stringify(clp, null, 2)}`,
185
+ },
186
+ ],
187
+ };
188
+ });
189
+ // Update Class Level Permissions
190
+ server.tool('update_class_permissions', 'Update Class Level Permissions (CLP) for a class. Use "*" for public access, role:RoleName for roles, or userId for specific users.', {
191
+ appObjectId: z.string().describe('The application object ID'),
192
+ className: z.string().describe('The class name'),
193
+ permissions: z
194
+ .string()
195
+ .describe('JSON string of CLP object. Example: {"find":{"*":true},"create":{"role:Admin":true},"delete":{"requiresAuthentication":true}}'),
196
+ }, async (args, extra) => {
197
+ let clp;
198
+ try {
199
+ clp = JSON.parse(args.permissions);
200
+ }
201
+ catch {
202
+ return {
203
+ content: [
204
+ {
205
+ type: 'text',
206
+ text: 'Error: Invalid JSON in "permissions" parameter.\n\nExample format:\n{\n "find": { "*": true },\n "get": { "*": true },\n "create": { "requiresAuthentication": true },\n "update": { "role:Admin": true },\n "delete": { "role:Admin": true },\n "addField": { "role:Admin": true }\n}',
207
+ },
208
+ ],
209
+ };
210
+ }
211
+ const parseClient = await getParseClient(args, extra);
212
+ const schema = await parseClient.updateClassLevelPermissions(args.className, clp);
213
+ return {
214
+ content: [
215
+ {
216
+ type: 'text',
217
+ text: `Class Level Permissions updated for "${args.className}".\n\nNew CLP:\n${JSON.stringify(schema.classLevelPermissions, null, 2)}`,
218
+ },
219
+ ],
220
+ };
221
+ });
222
+ }
223
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/classes/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ToolContext, ToolServer } from '../../context.js';
2
+ export declare function registerCloudFunctionTools(server: ToolServer, ctx: ToolContext): void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/cloud-functions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG3D,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAmLrF"}
@@ -0,0 +1,154 @@
1
+ import { z } from 'zod';
2
+ export function registerCloudFunctionTools(server, ctx) {
3
+ const getParseClient = async (args, _extra) => ctx.parse(args.appObjectId);
4
+ // Call Cloud Function
5
+ server.tool('call_cloud_function', 'Execute a Cloud Code function on the Parse Server', {
6
+ appObjectId: z.string().describe('The application object ID'),
7
+ functionName: z.string().describe('The name of the cloud function to call'),
8
+ params: z
9
+ .string()
10
+ .optional()
11
+ .describe('JSON string of parameters to pass to the function'),
12
+ }, async (args, extra) => {
13
+ let functionParams;
14
+ if (args.params) {
15
+ try {
16
+ functionParams = JSON.parse(args.params);
17
+ }
18
+ catch {
19
+ return {
20
+ content: [
21
+ {
22
+ type: 'text',
23
+ text: 'Error: Invalid JSON in "params" parameter',
24
+ },
25
+ ],
26
+ };
27
+ }
28
+ }
29
+ const parseClient = await getParseClient(args, extra);
30
+ try {
31
+ const result = await parseClient.callCloudFunction(args.functionName, functionParams);
32
+ return {
33
+ content: [
34
+ {
35
+ type: 'text',
36
+ text: `Cloud function "${args.functionName}" executed successfully.\n\nResult:\n${JSON.stringify(result, null, 2)}`,
37
+ },
38
+ ],
39
+ };
40
+ }
41
+ catch (error) {
42
+ const message = error instanceof Error ? error.message : 'Unknown error';
43
+ return {
44
+ content: [
45
+ {
46
+ type: 'text',
47
+ text: `Error calling cloud function "${args.functionName}": ${message}`,
48
+ },
49
+ ],
50
+ };
51
+ }
52
+ });
53
+ // === CLOUD CODE FILES ===
54
+ // List Cloud Code Files
55
+ server.tool('list_cloud_files', 'List all cloud code files deployed to the server', {
56
+ appObjectId: z.string().describe('The application object ID'),
57
+ }, async (args, extra) => {
58
+ try {
59
+ const parseClient = await getParseClient(args, extra);
60
+ const files = await parseClient.listCloudCodeFiles();
61
+ const output = [];
62
+ if (files.cloudFiles.length > 0) {
63
+ output.push('📁 Cloud Code Files:');
64
+ output.push('');
65
+ for (const file of files.cloudFiles) {
66
+ output.push(` • ${file.path}`);
67
+ }
68
+ }
69
+ if (files.userFiles.length > 0) {
70
+ if (output.length > 0)
71
+ output.push('');
72
+ output.push('📁 Public Files:');
73
+ output.push('');
74
+ for (const file of files.userFiles) {
75
+ output.push(` • ${file.path}`);
76
+ }
77
+ }
78
+ if (output.length === 0) {
79
+ return {
80
+ content: [
81
+ {
82
+ type: 'text',
83
+ text: 'No cloud code files are deployed. Cloud code is deployed from the app\'s GitHub repository (cloud/ and public/ folders).',
84
+ },
85
+ ],
86
+ };
87
+ }
88
+ output.push('');
89
+ output.push('💡 Use read_cloud_code to view the contents of a file.');
90
+ return {
91
+ content: [
92
+ {
93
+ type: 'text',
94
+ text: output.join('\n'),
95
+ },
96
+ ],
97
+ };
98
+ }
99
+ catch (error) {
100
+ const message = error instanceof Error ? error.message : 'Unknown error';
101
+ return {
102
+ content: [
103
+ {
104
+ type: 'text',
105
+ text: `❌ Failed to list cloud files: ${message}`,
106
+ },
107
+ ],
108
+ };
109
+ }
110
+ });
111
+ // Read Cloud Code File
112
+ server.tool('read_cloud_code', 'Read the contents of a cloud code file from the server. Use this to see what functions are defined.', {
113
+ appObjectId: z.string().describe('The application object ID'),
114
+ filePath: z.string().describe('The path to the file (e.g., "main.js" or "cloud/main.js")'),
115
+ }, async (args, extra) => {
116
+ try {
117
+ const parseClient = await getParseClient(args, extra);
118
+ const content = await parseClient.readCloudCodeFile(args.filePath);
119
+ // Try to extract function definitions for a helpful summary
120
+ const functionMatches = content.matchAll(/Parse\.Cloud\.(define|job|beforeSave|afterSave|beforeDelete|afterDelete|beforeFind|afterFind|beforeLogin|afterLogout)\s*\(\s*['"]([\w-]+)['"]/g);
121
+ const functions = [];
122
+ for (const match of functionMatches) {
123
+ functions.push(`${match[1]}: ${match[2]}`);
124
+ }
125
+ let output = `📄 ${args.filePath}\n${'─'.repeat(50)}\n\n${content}`;
126
+ if (functions.length > 0) {
127
+ output += `\n\n${'─'.repeat(50)}\n📋 Found ${functions.length} Cloud Code definitions:\n`;
128
+ for (const fn of functions) {
129
+ output += ` • ${fn}\n`;
130
+ }
131
+ }
132
+ return {
133
+ content: [
134
+ {
135
+ type: 'text',
136
+ text: output,
137
+ },
138
+ ],
139
+ };
140
+ }
141
+ catch (error) {
142
+ const message = error instanceof Error ? error.message : 'Unknown error';
143
+ return {
144
+ content: [
145
+ {
146
+ type: 'text',
147
+ text: `❌ Failed to read cloud code file: ${message}\n\nMake sure the file path is correct. Use list_cloud_files to see available files.`,
148
+ },
149
+ ],
150
+ };
151
+ }
152
+ });
153
+ }
154
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/cloud-functions/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ToolContext, ToolServer } from '../../context.js';
2
+ export declare function registerDeploymentTools(server: ToolServer, ctx: ToolContext): void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/deployments/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAK3D,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CA2KlF"}
@@ -0,0 +1,124 @@
1
+ import { z } from 'zod';
2
+ import { SashidoClient } from '../../client/sashido.js';
3
+ import { IN_PROGRESS, deploymentState, describeDeploymentState, newRecord } from '../infrastructure/deployments.js';
4
+ export function registerDeploymentTools(server, ctx) {
5
+ const getAuthFromRequest = (_args, _extra) => ctx.token;
6
+ // Get Deployment Info
7
+ server.tool('get_deployment_info', 'Get deployment info including active and running deployment names', {
8
+ appObjectId: z.string().describe('The application object ID'),
9
+ }, async (args, extra) => {
10
+ const auth = getAuthFromRequest(args, extra);
11
+ const client = new SashidoClient(auth);
12
+ const state = await deploymentState(client, args.appObjectId);
13
+ return { content: [{ type: 'text', text: describeDeploymentState(state).join('\n') }] };
14
+ });
15
+ // Deploy App
16
+ server.tool('deploy_app', 'Deploy an application to production', {
17
+ appObjectId: z.string().describe('The application object ID'),
18
+ region: z.string().optional().describe('Target region (optional)'),
19
+ }, async (args, extra) => {
20
+ const auth = getAuthFromRequest(args, extra);
21
+ const client = new SashidoClient(auth);
22
+ const before = await deploymentState(client, args.appObjectId);
23
+ await client.deployApp(args.appObjectId, args.region);
24
+ const record = await newRecord(client, args.appObjectId, before);
25
+ const lines = [
26
+ `Deployment started for app ${args.appObjectId}.`,
27
+ record
28
+ ? `In the deployment history it is ${record.name}: cancel_deployment with deploymentName="${record.name}" stops it while it rolls out.`
29
+ : "It isn't in the deployment history (yet), so it can't be cancelled by name now; get_deployment_info shows it once it is.",
30
+ `wait_for_deployment with after: ${before.serving ? before.serving.number : 0} waits until it serves traffic.`,
31
+ ];
32
+ return { content: [{ type: 'text', text: lines.join('\n\n') }] };
33
+ });
34
+ // Cancel Deployment
35
+ server.tool('cancel_deployment', 'Cancel a deployment that is rolling out. Takes its name in the deployment history (from get_deployment_info or deploy_app), which differs from the name of the containers serving traffic.', {
36
+ appObjectId: z.string().describe('The application object ID'),
37
+ deploymentName: z.string().describe("The deployment's name in the history, e.g. from get_deployment_info"),
38
+ region: z.string().optional().describe('Target region (optional)'),
39
+ }, async (args, extra) => {
40
+ const auth = getAuthFromRequest(args, extra);
41
+ const client = new SashidoClient(auth);
42
+ const state = await deploymentState(client, args.appObjectId);
43
+ const text = (t) => ({ content: [{ type: 'text', text: t }] });
44
+ if (state.records) {
45
+ const record = state.records.find((d) => d.name === args.deploymentName);
46
+ const rolling = state.rolling ? `"${state.rolling.name}"` : 'none';
47
+ if (!record) {
48
+ const serves = state.serving && state.serving.name === args.deploymentName;
49
+ return text(`❌ No deployment "${args.deploymentName}" in the deployment history${serves ? ' (that is the name of the containers serving traffic, not the history\'s)' : ''}. Rolling out in the history: ${rolling}.`);
50
+ }
51
+ if (!IN_PROGRESS.includes(record.phase)) {
52
+ return text(`❌ ${record.name} isn't rolling out: it is ${record.phase}. Rolling out in the history: ${rolling}.`);
53
+ }
54
+ }
55
+ await client.cancelDeployment(args.appObjectId, args.deploymentName, args.region);
56
+ return text(`Deployment "${args.deploymentName}" cancelled. get_deployment_info shows what serves traffic.`);
57
+ });
58
+ // Scale App
59
+ server.tool('scale_app', 'Configure scaling for an application', {
60
+ appObjectId: z.string().describe('The application object ID'),
61
+ // both are required: the API computes the new limits from them, and
62
+ // a missing one turns into NaN instances and NaN billed usage
63
+ min: z.number().int().min(1).describe('Minimum number of instances (the number that runs when auto-scaling is off)'),
64
+ max: z.number().int().min(1).describe('Maximum number of instances (with auto-scaling); at least min'),
65
+ auto: z.boolean().describe('Enable auto-scaling'),
66
+ cpuTarget: z.number().optional().describe('CPU target percentage for auto-scaling'),
67
+ region: z.string().optional().describe('Target region (optional)'),
68
+ }, async (args, extra) => {
69
+ if (args.max < args.min) {
70
+ return { content: [{ type: 'text', text: `❌ max (${args.max}) can't be less than min (${args.min}).` }] };
71
+ }
72
+ const auth = getAuthFromRequest(args, extra);
73
+ const client = new SashidoClient(auth);
74
+ await client.setScale(args.appObjectId, {
75
+ min: args.min,
76
+ max: args.max,
77
+ auto: args.auto,
78
+ cpuTarget: args.cpuTarget,
79
+ }, args.region);
80
+ return {
81
+ content: [
82
+ {
83
+ type: 'text',
84
+ text: `Scaling configuration updated for app ${args.appObjectId}`,
85
+ },
86
+ ],
87
+ };
88
+ });
89
+ // Set High Availability
90
+ server.tool('set_high_availability', 'Enable or disable high availability for an application', {
91
+ appObjectId: z.string().describe('The application object ID'),
92
+ enabled: z.boolean().describe('Enable or disable high availability'),
93
+ }, async (args, extra) => {
94
+ const auth = getAuthFromRequest(args, extra);
95
+ const client = new SashidoClient(auth);
96
+ await client.setHighAvailability(args.appObjectId, args.enabled);
97
+ return {
98
+ content: [
99
+ {
100
+ type: 'text',
101
+ text: `High availability ${args.enabled ? 'enabled' : 'disabled'} for app ${args.appObjectId}`,
102
+ },
103
+ ],
104
+ };
105
+ });
106
+ // Update App Name
107
+ server.tool('update_app_name', 'Update the name of an application', {
108
+ appObjectId: z.string().describe('The application object ID'),
109
+ name: z.string().describe('New application name'),
110
+ }, async (args, extra) => {
111
+ const auth = getAuthFromRequest(args, extra);
112
+ const client = new SashidoClient(auth);
113
+ await client.updateAppName(args.appObjectId, args.name);
114
+ return {
115
+ content: [
116
+ {
117
+ type: 'text',
118
+ text: `App name updated to "${args.name}"`,
119
+ },
120
+ ],
121
+ };
122
+ });
123
+ }
124
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/deployments/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ToolContext, ToolServer } from '../../context.js';
2
+ export declare function registerEngineTools(server: ToolServer, ctx: ToolContext): void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/engines/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAI3D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAkF9E"}
@@ -0,0 +1,68 @@
1
+ import { z } from 'zod';
2
+ import { SashidoClient } from '../../client/sashido.js';
3
+ export function registerEngineTools(server, ctx) {
4
+ const getAuthFromRequest = (_args, _extra) => ctx.token;
5
+ // List Available Engines
6
+ server.tool('list_engines', 'List all available Parse Server engines with their specs and pricing', {}, async (args, extra) => {
7
+ const auth = getAuthFromRequest(args, extra);
8
+ const client = new SashidoClient(auth);
9
+ const engines = await client.listEngines();
10
+ // Format engines for display
11
+ const formatted = engines.map(e => ({
12
+ name: e.name,
13
+ billingPolicy: e.billingPolicy,
14
+ price: `$${e.price}/${e.billingPolicy === 'monthly' ? 'month' : 'hour'}`,
15
+ cpu: `${e.params?.cpu ?? e.cpu ?? '?'} CPU`,
16
+ ram: `${e.params?.ram ?? e.ram ?? '?'} MB RAM`,
17
+ features: [
18
+ e.supportsAutoScaling ? 'Auto-scaling' : null,
19
+ e.supportsHighAvailability ? 'High Availability' : null,
20
+ e.allowedInTrial ? 'Available in Trial' : null,
21
+ e.default ? 'Default' : null,
22
+ ].filter(Boolean).join(', ') || 'Standard',
23
+ }));
24
+ return {
25
+ content: [
26
+ {
27
+ type: 'text',
28
+ text: `Available Parse Server Engines:\n\n${JSON.stringify(formatted, null, 2)}\n\nNote: Pricing shown is per container. Visit https://dashboard.sashido.io for full pricing details.`,
29
+ },
30
+ ],
31
+ };
32
+ });
33
+ // Change Engine
34
+ server.tool('set_engine', 'Change the Parse Server engine for an application. WARNING: This affects your monthly billing!', {
35
+ appObjectId: z.string().describe('The application object ID'),
36
+ engineName: z.string().describe('The engine name (e.g., "pico", "nano", "micro", "small", "medium", "large")'),
37
+ billingPolicy: z
38
+ .enum(['monthly', 'hourly'])
39
+ .describe('Billing policy - "monthly" for fixed monthly rate, "hourly" for pay-per-use'),
40
+ region: z.string().optional().describe('Target region (optional)'),
41
+ confirmBillingChange: z
42
+ .boolean()
43
+ .describe('Must be true to confirm you understand this will affect your billing'),
44
+ }, async (args, extra) => {
45
+ if (!args.confirmBillingChange) {
46
+ return {
47
+ content: [
48
+ {
49
+ type: 'text',
50
+ text: `BILLING WARNING: Changing the engine will affect your monthly bill.\n\nBefore proceeding:\n1. Visit https://dashboard.sashido.io to review current pricing\n2. Use the 'list_engines' tool to see available options and their costs\n3. Set confirmBillingChange to true to proceed\n\nThis action may result in:\n- Increased or decreased monthly charges\n- A brief service interruption during the change\n- Changes to available features (auto-scaling, high availability)`,
51
+ },
52
+ ],
53
+ };
54
+ }
55
+ const auth = getAuthFromRequest(args, extra);
56
+ const client = new SashidoClient(auth);
57
+ await client.setEngine(args.appObjectId, args.engineName, args.billingPolicy, args.region);
58
+ return {
59
+ content: [
60
+ {
61
+ type: 'text',
62
+ text: `Engine changed successfully!\n\nNew engine: ${args.engineName}\nBilling policy: ${args.billingPolicy}\n\nIMPORTANT: Your billing will be updated accordingly. Visit https://dashboard.sashido.io/billing to review your new charges.\n\nNote: A new deployment may be triggered to apply the changes.`,
63
+ },
64
+ ],
65
+ };
66
+ });
67
+ }
68
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/engines/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ToolContext, ToolServer } from "../../context.js";
2
+ export declare function registerEnvTools(server: ToolServer, ctx: ToolContext): void;
3
+ //# sourceMappingURL=index.d.ts.map