@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 @@
1
+ {"version":3,"file":"swift.d.ts","sourceRoot":"","sources":["../../src/typegen/swift.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAmC,MAAM,YAAY,CAAC;AAoGzE,wBAAgB,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAMlE"}
@@ -0,0 +1,105 @@
1
+ import { isIdentifier, targetName } from "./model.js";
2
+ // ParseSwift: a struct per class conforming to ParseObject (ParseUser,
3
+ // ParseRole, ParseInstallation for the built-in classes).
4
+ const PROTOCOL = {
5
+ User: "ParseUser",
6
+ Role: "ParseRole",
7
+ Installation: "ParseInstallation",
8
+ };
9
+ // what the protocols require besides the common fields
10
+ const REQUIRED_VARS = {
11
+ User: [
12
+ "var username: String?",
13
+ "var email: String?",
14
+ "var emailVerified: Bool?",
15
+ "var password: String?",
16
+ "var authData: [String: [String: String]?]?",
17
+ ],
18
+ Role: ["var name: String?"],
19
+ Installation: [
20
+ "var installationId: String?",
21
+ "var deviceType: String?",
22
+ "var deviceToken: String?",
23
+ "var badge: Int?",
24
+ "var timeZone: String?",
25
+ "var channels: [String]?",
26
+ "var appName: String?",
27
+ "var appIdentifier: String?",
28
+ "var appVersion: String?",
29
+ "var parseVersion: String?",
30
+ "var localeIdentifier: String?",
31
+ ],
32
+ };
33
+ function swiftType(field) {
34
+ switch (field.type) {
35
+ case "String":
36
+ case "Bytes":
37
+ return "String";
38
+ case "Number":
39
+ return "Double";
40
+ case "Boolean":
41
+ return "Bool";
42
+ case "Date":
43
+ return "Date";
44
+ case "Object":
45
+ return "[String: AnyCodable]";
46
+ case "Array":
47
+ return "[AnyCodable]";
48
+ case "File":
49
+ return "ParseFile";
50
+ case "GeoPoint":
51
+ return "ParseGeoPoint";
52
+ case "Polygon":
53
+ return "ParsePolygon";
54
+ case "Pointer":
55
+ // Pointer<T> needs the target's struct: generate it too (classes)
56
+ return field.targetGenerated ? `Pointer<${targetName(field, "")}>` : null;
57
+ case "ACL":
58
+ return "ParseACL";
59
+ default:
60
+ // relations aren't stored properties in ParseSwift: use
61
+ // object.relation("<field>", child: ...) instead
62
+ return null;
63
+ }
64
+ }
65
+ function struct(model) {
66
+ const protocol = model.builtIn ? PROTOCOL[model.builtIn] : "ParseObject";
67
+ const lines = [
68
+ ...(model.builtIn ? [] : [`// Parse class ${JSON.stringify(model.className)}`]),
69
+ `struct ${model.typeName}: ${protocol} {`,
70
+ " var originalData: Data?",
71
+ " var objectId: String?",
72
+ " var createdAt: Date?",
73
+ " var updatedAt: Date?",
74
+ " var ACL: ParseACL?",
75
+ ...(REQUIRED_VARS[model.builtIn || ""] || []).map((v) => ` ${v}`),
76
+ ];
77
+ if (!model.builtIn) {
78
+ lines.splice(1, 0, ` static var className: String { ${JSON.stringify(model.className)} }`);
79
+ }
80
+ for (const f of model.fields) {
81
+ const type = swiftType(f);
82
+ if (!type && f.type === "Pointer") {
83
+ lines.push(` // ${f.name}: Pointer to ${f.target} - generate ${f.target} too for Pointer<...>`);
84
+ }
85
+ else if (!type) {
86
+ lines.push(` // ${f.name}: Relation<${targetName(f, f.target || "ParseObject")}> - use relation("${f.name}", child: ...)`);
87
+ }
88
+ else if (!isIdentifier(f.name)) {
89
+ lines.push(` // ${JSON.stringify(f.name)}: ${type} - not a Swift identifier, map it with CodingKeys`);
90
+ }
91
+ else {
92
+ lines.push(` var ${f.name}: ${type}?`);
93
+ }
94
+ }
95
+ lines.push("}");
96
+ return lines;
97
+ }
98
+ export function swift(models, header) {
99
+ const out = [`// ${header}`, "import Foundation", "import ParseSwift", ""];
100
+ for (const model of models) {
101
+ out.push(...struct(model), "");
102
+ }
103
+ return out.join("\n");
104
+ }
105
+ //# sourceMappingURL=swift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swift.js","sourceRoot":"","sources":["../../src/typegen/swift.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ClassModel } from "./model.js";
2
+ export declare function typescript(models: ClassModel[], header: string): string;
3
+ //# sourceMappingURL=typescript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript.d.ts","sourceRoot":"","sources":["../../src/typegen/typescript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAmC,MAAM,YAAY,CAAC;AAuEzE,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAMvE"}
@@ -0,0 +1,73 @@
1
+ import { isIdentifier, targetName } from "./model.js";
2
+ // The Parse JavaScript SDK (parse, with its bundled types): typed attributes
3
+ // and a subclass per class, registered so queries return it.
4
+ const SDK_CLASS = {
5
+ User: "Parse.User",
6
+ Role: "Parse.Role",
7
+ Installation: "Parse.Installation",
8
+ };
9
+ function tsType(field) {
10
+ switch (field.type) {
11
+ case "String":
12
+ return "string";
13
+ case "Number":
14
+ return "number";
15
+ case "Boolean":
16
+ return "boolean";
17
+ case "Date":
18
+ return "Date";
19
+ case "Object":
20
+ return "Record<string, unknown>";
21
+ case "Array":
22
+ return "unknown[]";
23
+ case "File":
24
+ return "Parse.File";
25
+ case "GeoPoint":
26
+ return "Parse.GeoPoint";
27
+ case "Polygon":
28
+ return "Parse.Polygon";
29
+ case "Pointer":
30
+ return targetName(field, "Parse.Object");
31
+ case "Relation":
32
+ return `Parse.Relation<Parse.Object, ${targetName(field, "Parse.Object")}>`;
33
+ case "ACL":
34
+ return "Parse.ACL";
35
+ default:
36
+ return "string";
37
+ }
38
+ }
39
+ function attributes(model) {
40
+ const lines = [`export interface ${model.typeName}Attributes {`];
41
+ for (const f of model.fields) {
42
+ const key = isIdentifier(f.name) ? f.name : JSON.stringify(f.name);
43
+ lines.push(` ${key}${f.required ? "" : "?"}: ${tsType(f)};`);
44
+ }
45
+ lines.push("}");
46
+ return lines;
47
+ }
48
+ function subclass(model) {
49
+ const base = model.builtIn ? SDK_CLASS[model.builtIn] : `Parse.Object<${model.typeName}Attributes>`;
50
+ if (model.builtIn) {
51
+ // the SDK's own class, with this app's fields
52
+ return [
53
+ `export class ${model.typeName} extends ${base}<${model.typeName}Attributes> {}`,
54
+ `Parse.Object.registerSubclass(${JSON.stringify(model.className)}, ${model.typeName});`,
55
+ ];
56
+ }
57
+ return [
58
+ `export class ${model.typeName} extends ${base} {`,
59
+ ` constructor(attributes?: ${model.typeName}Attributes) {`,
60
+ ` super(${JSON.stringify(model.className)}, attributes as ${model.typeName}Attributes);`,
61
+ " }",
62
+ "}",
63
+ `Parse.Object.registerSubclass(${JSON.stringify(model.className)}, ${model.typeName});`,
64
+ ];
65
+ }
66
+ export function typescript(models, header) {
67
+ const out = [`// ${header}`, 'import Parse from "parse";', ""];
68
+ for (const model of models) {
69
+ out.push(...attributes(model), "", ...subclass(model), "");
70
+ }
71
+ return out.join("\n");
72
+ }
73
+ //# sourceMappingURL=typescript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript.js","sourceRoot":"","sources":["../../src/typegen/typescript.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * What breaks in an app's cloud code between Parse Server major versions,
3
+ * from Parse Server's own migration guides and changelogs (sources below):
4
+ * only what concerns the code customers write. What SashiDo runs for them
5
+ * (Node.js, MongoDB, how the server starts, masterKeyIps) is in PLATFORM.
6
+ */
7
+ export interface UpgradeRule {
8
+ id: string;
9
+ /** The major version that breaks it */
10
+ major: number;
11
+ title: string;
12
+ /** Found in a cloud code file, line by line */
13
+ pattern: RegExp;
14
+ /** breaks: fix before upgrading; check: may change behaviour */
15
+ severity: "breaks" | "check";
16
+ fix: string;
17
+ source: string;
18
+ }
19
+ export declare const RULES: UpgradeRule[];
20
+ /** What changes with a major version but SashiDo runs: nothing to do */
21
+ export declare const PLATFORM: Array<{
22
+ major: number;
23
+ note: string;
24
+ }>;
25
+ /** Majors an upgrade crosses: from 3.6.0 to 8.x: 4..8 */
26
+ export declare function majorsCrossed(from: number, to: number): number[];
27
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/upgrade/rules.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,KAAK,EAAE,WAAW,EA6G9B,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAI3D,CAAC;AAEF,yDAAyD;AACzD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAMhE"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * What breaks in an app's cloud code between Parse Server major versions,
3
+ * from Parse Server's own migration guides and changelogs (sources below):
4
+ * only what concerns the code customers write. What SashiDo runs for them
5
+ * (Node.js, MongoDB, how the server starts, masterKeyIps) is in PLATFORM.
6
+ */
7
+ const GUIDE_3 = "https://github.com/parse-community/parse-server/blob/3.0.0/3.0.0.md";
8
+ const CHANGES = "https://github.com/parse-community/parse-server/blob/alpha/changelogs/CHANGELOG_release.md";
9
+ export const RULES = [
10
+ {
11
+ id: "response-success",
12
+ major: 3,
13
+ title: "response.success / response.error in functions and triggers",
14
+ pattern: /\bresponse\.(success|error)\s*\(/,
15
+ severity: "breaks",
16
+ fix: "Handlers take only the request: return the result (or nothing) instead of response.success, throw instead of response.error. A beforeSave that never returns or throws no longer hangs; it saves.",
17
+ source: GUIDE_3,
18
+ },
19
+ {
20
+ id: "job-status",
21
+ major: 3,
22
+ title: "status.success / status.error / status.message in jobs",
23
+ pattern: /\bstatus\.(success|error|message)\s*\(/,
24
+ severity: "breaks",
25
+ fix: "Jobs have no status object: use request.message(...) for progress, return (or resolve) when done, throw to fail. Jobs that wait for status.success never finish on Parse Server 3+.",
26
+ source: GUIDE_3,
27
+ },
28
+ {
29
+ id: "backbone-callbacks",
30
+ major: 3,
31
+ title: "{ success, error } callbacks",
32
+ pattern: /\b(success|error)\s*:\s*(function\b|\(|[A-Za-z_$][\w$]*\s*=>)/,
33
+ severity: "breaks",
34
+ fix: "Cloud code runs with the Parse JS SDK 2+, which has no callback options: use the returned promises (await query.find(), await object.save()).",
35
+ source: GUIDE_3,
36
+ },
37
+ {
38
+ id: "parse-promise",
39
+ major: 3,
40
+ title: "Parse.Promise",
41
+ pattern: /\bParse\.Promise\b/,
42
+ severity: "breaks",
43
+ fix: "Parse.Promise is gone with the Parse JS SDK 2: use native Promise (Promise.all, Promise.resolve, async/await).",
44
+ source: GUIDE_3,
45
+ },
46
+ {
47
+ id: "http-request",
48
+ major: 6,
49
+ title: "Parse.Cloud.httpRequest",
50
+ pattern: /\bParse\.Cloud\.httpRequest\s*\(/,
51
+ severity: "breaks",
52
+ fix: "Removed in Parse Server 6: use an HTTP library (e.g. axios, added to the cloud code's package.json) or Node's https.",
53
+ source: CHANGES,
54
+ },
55
+ {
56
+ id: "aggregate-syntax",
57
+ major: 6,
58
+ title: "Aggregation pipeline stages without $",
59
+ pattern: /(^|[{,\s])(match|group|project|lookup|unwind|sort|limit|skip|count|sample)\s*:/,
60
+ severity: "check",
61
+ fix: "From Parse Server 6 aggregate pipelines use MongoDB's syntax: stages with a leading $ ($match, $group, ...) and the document id as _id, not objectId. Only applies where this is an aggregation pipeline.",
62
+ source: CHANGES,
63
+ },
64
+ {
65
+ id: "internal-fields",
66
+ major: 6,
67
+ title: "Reading internal _ fields of users",
68
+ pattern: /['"]_(hashed_password|email_verify_token|perishable_token|failed_login_count|account_lockout_expires_at|password_history|password_changed_at|email_verify_token_expires_at|perishable_token_expires_at)['"]/,
69
+ severity: "breaks",
70
+ fix: "From Parse Server 6 the master key no longer reads Parse Server's internal fields (prefixed with _); they need the maintenance key. Don't depend on them in cloud code.",
71
+ source: CHANGES,
72
+ },
73
+ {
74
+ id: "after-login-throw",
75
+ major: 6,
76
+ title: "Errors thrown in afterLogin / afterLogout",
77
+ pattern: /\bParse\.Cloud\.after(Login|Logout)\s*\(/,
78
+ severity: "check",
79
+ fix: "From Parse Server 6 an error thrown in afterLogin or afterLogout rejects the request instead of crashing the server; make sure these triggers only throw when the login should fail.",
80
+ source: CHANGES,
81
+ },
82
+ {
83
+ id: "private-users",
84
+ major: 6,
85
+ title: "Queries of other users",
86
+ pattern: /new\s+Parse\.Query\(\s*(Parse\.User|["']_User["'])/,
87
+ severity: "check",
88
+ fix: "Parse Server 6 turns on enforcePrivateUsers: new users are saved readable only by themselves. Queries of other users without the master key find fewer users; use { useMasterKey: true } in cloud code where that is intended.",
89
+ source: CHANGES,
90
+ },
91
+ {
92
+ id: "file-triggers",
93
+ major: 7,
94
+ title: "File triggers (beforeSaveFile, afterDeleteFile, ...)",
95
+ pattern: /\bParse\.Cloud\.(before|after)(Save|Delete|Find)File\s*\(/,
96
+ severity: "breaks",
97
+ fix: "From Parse Server 7 file triggers use the object trigger syntax: Parse.Cloud.beforeSave(Parse.File, (request) => {...}) instead of Parse.Cloud.beforeSaveFile(...).",
98
+ source: CHANGES,
99
+ },
100
+ {
101
+ id: "session-current",
102
+ major: 7,
103
+ title: "Parse.Session.current()",
104
+ pattern: /\bParse\.Session\.current\s*\(/,
105
+ severity: "check",
106
+ fix: "From Parse Server 7 Parse.Session.current() returns an expired session (with its expiresAt) instead of throwing: check expiresAt where it matters.",
107
+ source: CHANGES,
108
+ },
109
+ {
110
+ id: "encode-parse-objects",
111
+ major: 8,
112
+ title: "Cloud functions returning Parse objects",
113
+ pattern: /\bParse\.Cloud\.define\s*\(/,
114
+ severity: "check",
115
+ fix: "From Parse Server 8 (encodeParseObjectInCloudFunction) Parse objects a cloud function returns reach the clients as Parse objects, not plain JSON. Clients that read the result as JSON (e.g. result.name instead of result.get('name')) need a change, or return object.toJSON().",
116
+ source: CHANGES,
117
+ },
118
+ ];
119
+ /** What changes with a major version but SashiDo runs: nothing to do */
120
+ export const PLATFORM = [
121
+ { major: 6, note: "Node.js, MongoDB, how Parse Server starts, masterKeyIps and trustProxy: set by SashiDo." },
122
+ { major: 7, note: "Social logins are turned on per provider in App Settings > Users; Node.js 18+." },
123
+ { major: 8, note: "Email verification and password reset links no longer carry the username: check customized email templates and pages in App Settings. Node.js 18+, MongoDB 6+: set by SashiDo." },
124
+ ];
125
+ /** Majors an upgrade crosses: from 3.6.0 to 8.x: 4..8 */
126
+ export function majorsCrossed(from, to) {
127
+ const out = [];
128
+ for (let m = from + 1; m <= to; m++) {
129
+ out.push(m);
130
+ }
131
+ return out;
132
+ }
133
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/upgrade/rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { UpgradeRule } from "./rules.js";
2
+ export interface Finding {
3
+ rule: UpgradeRule;
4
+ file: string;
5
+ /** 1-based */
6
+ line: number;
7
+ text: string;
8
+ }
9
+ /** The rules for an upgrade from one major version to another */
10
+ export declare function rulesFor(fromMajor: number, toMajor: number): UpgradeRule[];
11
+ /** Where a cloud code file uses what the upgrade breaks */
12
+ export declare function scanFile(file: string, content: string, rules: UpgradeRule[]): Finding[];
13
+ /** Findings by rule, the rules that break first */
14
+ export declare function byRule(findings: Finding[]): Array<{
15
+ rule: UpgradeRule;
16
+ places: Finding[];
17
+ }>;
18
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/upgrade/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,WAAW,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,iEAAiE;AACjE,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAE1E;AAOD,2DAA2D;AAC3D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,CAgBvF;AAED,mDAAmD;AACnD,wBAAgB,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC,CAU3F"}
@@ -0,0 +1,38 @@
1
+ import { RULES } from "./rules.js";
2
+ /** The rules for an upgrade from one major version to another */
3
+ export function rulesFor(fromMajor, toMajor) {
4
+ return RULES.filter((r) => r.major > fromMajor && r.major <= toMajor);
5
+ }
6
+ // a line that is only a comment (or inside a block comment) says nothing
7
+ function isComment(line) {
8
+ return /^\s*(\/\/|\/\*|\*)/.test(line);
9
+ }
10
+ /** Where a cloud code file uses what the upgrade breaks */
11
+ export function scanFile(file, content, rules) {
12
+ const findings = [];
13
+ const lines = content.split("\n");
14
+ // the stage names only matter in aggregation pipelines
15
+ const aggregates = /\.aggregate\s*\(/.test(content);
16
+ for (const rule of rules) {
17
+ if (rule.id === "aggregate-syntax" && !aggregates) {
18
+ continue;
19
+ }
20
+ lines.forEach((line, i) => {
21
+ if (!isComment(line) && rule.pattern.test(line)) {
22
+ findings.push({ rule, file, line: i + 1, text: line.trim().slice(0, 140) });
23
+ }
24
+ });
25
+ }
26
+ return findings;
27
+ }
28
+ /** Findings by rule, the rules that break first */
29
+ export function byRule(findings) {
30
+ const groups = new Map();
31
+ for (const f of findings) {
32
+ const group = groups.get(f.rule.id) || { rule: f.rule, places: [] };
33
+ group.places.push(f);
34
+ groups.set(f.rule.id, group);
35
+ }
36
+ return [...groups.values()].sort((a, b) => (a.rule.severity === b.rule.severity ? a.rule.major - b.rule.major : a.rule.severity === "breaks" ? -1 : 1));
37
+ }
38
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/upgrade/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAe,MAAM,YAAY,CAAC;AAUhD,iEAAiE;AACjE,MAAM,UAAU,QAAQ,CAAC,SAAiB,EAAE,OAAe;IACzD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,SAAS,IAAI,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC;AACxE,CAAC;AAED,yEAAyE;AACzE,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,OAAe,EAAE,KAAoB;IAC1E,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,uDAAuD;IACvD,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,EAAE,KAAK,kBAAkB,IAAI,CAAC,UAAU,EAAE,CAAC;YAClD,SAAS;QACX,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACxB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,MAAM,CAAC,QAAmB;IACxC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoD,CAAC;IAC3E,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACpE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAC9B,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACtH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ /** "release-6.5.11-ubi8-node18" -> [6, 5, 11]; [0, 0, 0] when unknown */
2
+ export declare function versionParts(tag?: string): [number, number, number];
3
+ export declare function compareVersions(a?: string, b?: string): number;
4
+ /** The app servers' own checks (GET /app_checks) exist from 6.5.11 */
5
+ export declare function hasAppChecks(tag?: string): boolean;
6
+ /** Parse Server majors that no longer get updates upstream */
7
+ export declare function isOutdated(tag?: string): boolean;
8
+ //# sourceMappingURL=versions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versions.d.ts","sourceRoot":"","sources":["../../src/upgrade/versions.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAGnE;AAED,wBAAgB,eAAe,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAS9D;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,8DAA8D;AAC9D,wBAAgB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAGhD"}
@@ -0,0 +1,25 @@
1
+ /** "release-6.5.11-ubi8-node18" -> [6, 5, 11]; [0, 0, 0] when unknown */
2
+ export function versionParts(tag) {
3
+ const match = /(\d+)\.(\d+)\.(\d+)/.exec(tag || "");
4
+ return match ? [Number(match[1]), Number(match[2]), Number(match[3])] : [0, 0, 0];
5
+ }
6
+ export function compareVersions(a, b) {
7
+ const x = versionParts(a);
8
+ const y = versionParts(b);
9
+ for (let i = 0; i < 3; i++) {
10
+ if (x[i] !== y[i]) {
11
+ return x[i] - y[i];
12
+ }
13
+ }
14
+ return 0;
15
+ }
16
+ /** The app servers' own checks (GET /app_checks) exist from 6.5.11 */
17
+ export function hasAppChecks(tag) {
18
+ return compareVersions(tag, "6.5.11") >= 0;
19
+ }
20
+ /** Parse Server majors that no longer get updates upstream */
21
+ export function isOutdated(tag) {
22
+ const major = versionParts(tag)[0];
23
+ return major > 0 && major < 6;
24
+ }
25
+ //# sourceMappingURL=versions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versions.js","sourceRoot":"","sources":["../../src/upgrade/versions.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAU,EAAE,CAAU;IACpD,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClB,OAAO,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,OAAO,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,UAAU,CAAC,GAAY;IACrC,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,OAAO,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const SERVER_NAME = "sashido-mcp-server";
2
+ export declare const SERVER_VERSION = "0.2.0";
3
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,uBAAuB,CAAC;AAChD,eAAO,MAAM,cAAc,UAAU,CAAC"}
@@ -0,0 +1,3 @@
1
+ export const SERVER_NAME = 'sashido-mcp-server';
2
+ export const SERVER_VERSION = '0.2.0';
3
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,oBAAoB,CAAC;AAChD,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,69 @@
1
1
  {
2
2
  "name": "@sashido/mcp-server",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.2.0",
4
+ "description": "MCP Server for SashiDo - Backend as a Service platform",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "type": "module",
8
+ "bin": {
9
+ "sashido-mcp-server": "./dist/bin/mcp-server.js",
10
+ "sashido-mcp-login": "./dist/bin/login.js"
11
+ },
12
+ "files": [
13
+ "dist",
14
+ "README.md"
15
+ ],
16
+ "scripts": {
17
+ "build": "tsc",
18
+ "prepublishOnly": "npm run build",
19
+ "dev": "tsx watch src/bin/mcp-server.ts",
20
+ "start": "node dist/bin/mcp-server.js --transport=http",
21
+ "start:stdio": "node dist/bin/mcp-server.js --transport=stdio",
22
+ "start:http": "node dist/bin/mcp-server.js --transport=http",
23
+ "login": "node dist/bin/login.js",
24
+ "lint": "eslint src --ext .ts",
25
+ "test": "vitest",
26
+ "test:run": "vitest run",
27
+ "clean": "rm -rf dist",
28
+ "typecheck": "tsc --noEmit"
29
+ },
30
+ "keywords": [
31
+ "mcp",
32
+ "model-context-protocol",
33
+ "sashido",
34
+ "parse-server",
35
+ "baas",
36
+ "ai"
37
+ ],
38
+ "author": "SashiDo",
39
+ "license": "MIT",
40
+ "engines": {
41
+ "node": ">=18.17"
42
+ },
43
+ "repository": {
44
+ "type": "git",
45
+ "url": "git+https://github.com/sashido/sashido-mcp-server.git"
46
+ },
47
+ "bugs": {
48
+ "url": "https://github.com/sashido/sashido-mcp-server/issues"
49
+ },
50
+ "homepage": "https://github.com/sashido/sashido-mcp-server#readme",
51
+ "dependencies": {
52
+ "@modelcontextprotocol/sdk": "^1.25.2",
53
+ "axios": "^1.6.0",
54
+ "dotenv": "^16.3.0",
55
+ "express": "^5.2.1",
56
+ "redis": "^4.6.0",
57
+ "zod": "^3.25.0"
58
+ },
59
+ "devDependencies": {
60
+ "@types/express": "^5.0.6",
61
+ "@types/node": "^20.10.0",
62
+ "@typescript-eslint/eslint-plugin": "^6.13.0",
63
+ "@typescript-eslint/parser": "^6.13.0",
64
+ "eslint": "^8.55.0",
65
+ "tsx": "^4.6.0",
66
+ "typescript": "^5.3.0",
67
+ "vitest": "^1.0.0"
68
+ }
69
+ }