@sashido/mcp-server 0.0.0-stage → 0.2.1

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 +68 -4
@@ -0,0 +1,32 @@
1
+ /**
2
+ * The tool call an API request belongs to. Every request to the SashiDo
3
+ * API carries it as headers, so the API's audit log (Activity) records that
4
+ * it came through this server, from which AI client and tool. The API takes
5
+ * them for the trace only, never for access.
6
+ */
7
+ export interface ToolCall {
8
+ tool: string;
9
+ /** e.g. "claude-code/2.1.0" */
10
+ mcpClient?: string;
11
+ requestId: string;
12
+ }
13
+ export declare function runToolCall<T>(call: ToolCall, work: () => Promise<T>): Promise<T>;
14
+ /** Headers for the API, for the tool call running now (if any) */
15
+ export declare function auditHeaders(): Record<string, string>;
16
+ export declare function newRequestId(): string;
17
+ /** A short, stable id of a token for logs: never the token */
18
+ export declare function tokenFingerprint(token: string): string;
19
+ /**
20
+ * One line of JSON per tool call on stderr (stdout carries the protocol
21
+ * over stdio). No argument values: they can hold app data or secrets.
22
+ */
23
+ export declare function logToolCall(entry: {
24
+ requestId: string;
25
+ tool: string;
26
+ mcpClient?: string;
27
+ token: string;
28
+ app?: string;
29
+ ok: boolean;
30
+ durationMs: number;
31
+ }): void;
32
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAEjF;AAED,kEAAkE;AAClE,wBAAgB,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAWrD;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,8DAA8D;AAC9D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,IAAI,CAUP"}
package/dist/audit.js ADDED
@@ -0,0 +1,41 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+ import { createHash, randomUUID } from "node:crypto";
3
+ import { SERVER_VERSION } from "./version.js";
4
+ const calls = new AsyncLocalStorage();
5
+ export function runToolCall(call, work) {
6
+ return calls.run(call, work);
7
+ }
8
+ /** Headers for the API, for the tool call running now (if any) */
9
+ export function auditHeaders() {
10
+ const headers = { "X-SashiDo-Client": `mcp/${SERVER_VERSION}` };
11
+ const call = calls.getStore();
12
+ if (call) {
13
+ headers["X-SashiDo-MCP-Tool"] = call.tool;
14
+ headers["X-Request-Id"] = call.requestId;
15
+ if (call.mcpClient) {
16
+ headers["X-SashiDo-MCP-Client"] = call.mcpClient;
17
+ }
18
+ }
19
+ return headers;
20
+ }
21
+ export function newRequestId() {
22
+ return randomUUID();
23
+ }
24
+ /** A short, stable id of a token for logs: never the token */
25
+ export function tokenFingerprint(token) {
26
+ return createHash("sha256").update(token).digest("hex").slice(0, 12);
27
+ }
28
+ /**
29
+ * One line of JSON per tool call on stderr (stdout carries the protocol
30
+ * over stdio). No argument values: they can hold app data or secrets.
31
+ */
32
+ export function logToolCall(entry) {
33
+ const { token, ...rest } = entry;
34
+ console.error(JSON.stringify({
35
+ at: new Date().toISOString(),
36
+ event: "tool_call",
37
+ ...rest,
38
+ token: tokenFingerprint(token),
39
+ }));
40
+ }
41
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAe9C,MAAM,KAAK,GAAG,IAAI,iBAAiB,EAAY,CAAC;AAEhD,MAAM,UAAU,WAAW,CAAI,IAAc,EAAE,IAAsB;IACnE,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAA2B,EAAE,kBAAkB,EAAE,OAAO,cAAc,EAAE,EAAE,CAAC;IACxF,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC9B,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;QAC1C,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;QACzC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;QACnD,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACvE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAQ3B;IACC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IACjC,OAAO,CAAC,KAAK,CACX,IAAI,CAAC,SAAS,CAAC;QACb,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5B,KAAK,EAAE,WAAW;QAClB,GAAG,IAAI;QACP,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC;KAC/B,CAAC,CACH,CAAC;AACJ,CAAC"}
package/dist/auth.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ import { Access } from "./access.js";
2
+ import { TokenInfo } from "./client/sashido.js";
3
+ export declare class AuthError extends Error {
4
+ statusCode: number;
5
+ constructor(message: string, statusCode?: number);
6
+ }
7
+ export declare function isAccessToken(value: string): boolean;
8
+ /** The token of an `Authorization: Bearer` header. */
9
+ export declare function bearerToken(header: string | string[] | undefined): string;
10
+ export declare function tokenHash(token: string): string;
11
+ /** What the API says about the token (scopes, apps), briefly cached. */
12
+ export declare function getTokenInfo(token: string, apiUrl?: string): Promise<TokenInfo>;
13
+ /** The access a token gives, before any options narrow it. */
14
+ export declare function accessFromTokenInfo(info: TokenInfo, local: boolean): Access;
15
+ /** For tests */
16
+ export declare function clearTokenInfoCache(): void;
17
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAkC,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAUhF,qBAAa,SAAU,SAAQ,KAAK;IAGzB,UAAU,EAAE,MAAM;gBADzB,OAAO,EAAE,MAAM,EACR,UAAU,GAAE,MAAY;CAKlC;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,sDAAsD;AACtD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,CAUzE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAID,wEAAwE;AACxE,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,SAAS,CAAC,CAuBpB;AAED,8DAA8D;AAC9D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAQ3E;AAED,gBAAgB;AAChB,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C"}
package/dist/auth.js ADDED
@@ -0,0 +1,72 @@
1
+ import { createHash } from "crypto";
2
+ import { SashidoApiError, SashidoClient } from "./client/sashido.js";
3
+ // sashido_pat_<30 random><6 checksum> (sashido-api lib/accessTokens/format.ts)
4
+ const ACCESS_TOKEN_PATTERN = /^sashido_pat_[0-9A-Za-z]{36}$/;
5
+ // how long what the API said about a token is reused; a revoked token keeps
6
+ // working here at most this long (the API refuses it right away)
7
+ const TOKEN_INFO_TTL_MS = 60 * 1000;
8
+ const MAX_CACHED_TOKENS = 10000;
9
+ export class AuthError extends Error {
10
+ statusCode;
11
+ constructor(message, statusCode = 401) {
12
+ super(message);
13
+ this.statusCode = statusCode;
14
+ this.name = "AuthError";
15
+ }
16
+ }
17
+ export function isAccessToken(value) {
18
+ return ACCESS_TOKEN_PATTERN.test(value);
19
+ }
20
+ /** The token of an `Authorization: Bearer` header. */
21
+ export function bearerToken(header) {
22
+ const value = Array.isArray(header) ? header[0] : header;
23
+ const match = /^Bearer\s+(\S+)\s*$/i.exec(value || "");
24
+ if (!match || !isAccessToken(match[1])) {
25
+ throw new AuthError("Send a SashiDo personal access token as Authorization: Bearer sashido_pat_... " +
26
+ "Create one in the dashboard: Account > Access Tokens.");
27
+ }
28
+ return match[1];
29
+ }
30
+ export function tokenHash(token) {
31
+ return createHash("sha256").update(token).digest("hex");
32
+ }
33
+ const cache = new Map();
34
+ /** What the API says about the token (scopes, apps), briefly cached. */
35
+ export async function getTokenInfo(token, apiUrl) {
36
+ const key = tokenHash(token);
37
+ const cached = cache.get(key);
38
+ if (cached && cached.expiresAt > Date.now()) {
39
+ return cached.info;
40
+ }
41
+ let info;
42
+ try {
43
+ info = await new SashidoClient(token, apiUrl).getTokenInfo();
44
+ }
45
+ catch (e) {
46
+ // SashidoClient turns API errors into SashidoApiError with the status
47
+ if (e instanceof SashidoApiError && (e.statusCode === 401 || e.statusCode === 403)) {
48
+ throw new AuthError("The access token is invalid, expired or revoked.");
49
+ }
50
+ throw e;
51
+ }
52
+ if (cache.size >= MAX_CACHED_TOKENS) {
53
+ cache.clear();
54
+ }
55
+ cache.set(key, { info, expiresAt: Date.now() + TOKEN_INFO_TTL_MS });
56
+ return info;
57
+ }
58
+ /** The access a token gives, before any options narrow it. */
59
+ export function accessFromTokenInfo(info, local) {
60
+ return {
61
+ scopes: info.scopes,
62
+ appIds: info.appIds,
63
+ readOnly: false,
64
+ groups: null,
65
+ local,
66
+ };
67
+ }
68
+ /** For tests */
69
+ export function clearTokenInfoCache() {
70
+ cache.clear();
71
+ }
72
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/bin/login.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ // The MCP server no longer logs in with a password or uses session tokens:
3
+ // it takes a personal access token with only the permissions you choose.
4
+ console.log(`
5
+ SashiDo MCP Server uses personal access tokens.
6
+
7
+ 1. Open the SashiDo Dashboard: Account > Access Tokens.
8
+ 2. Create a token (Read-only is the safe choice for AI assistants).
9
+ 3. Set it for the server, e.g.:
10
+
11
+ SASHIDO_ACCESS_TOKEN=sashido_pat_... npx @sashido/mcp-server
12
+
13
+ The dashboard shows ready configurations for Claude, Cursor, VS Code and more.
14
+ `);
15
+ export {};
16
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/bin/login.ts"],"names":[],"mappings":";AAEA,2EAA2E;AAC3E,yEAAyE;AAEzE,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;CAUX,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=mcp-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/bin/mcp-server.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env node
2
+ import { startStdioServer } from '../transports/stdio.js';
3
+ const args = process.argv.slice(2);
4
+ const transportArg = args.find((arg) => arg.startsWith('--transport='));
5
+ const transport = transportArg?.split('=')[1] ?? 'stdio';
6
+ async function main() {
7
+ try {
8
+ if (transport === 'stdio') {
9
+ await startStdioServer();
10
+ }
11
+ else if (transport === 'http') {
12
+ const { startHttpServer } = await import('../transports/http.js');
13
+ await startHttpServer();
14
+ }
15
+ else {
16
+ console.error(`Unknown transport: ${transport}`);
17
+ console.error('Available transports: stdio, http');
18
+ process.exit(1);
19
+ }
20
+ }
21
+ catch (error) {
22
+ console.error('Failed to start MCP server:', error);
23
+ process.exit(1);
24
+ }
25
+ }
26
+ main();
27
+ //# sourceMappingURL=mcp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/bin/mcp-server.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;AACxE,MAAM,SAAS,GAAG,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;AAEzD,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,gBAAgB,EAAE,CAAC;QAC3B,CAAC;aAAM,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;YAChC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;YAClE,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;YACjD,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
@@ -0,0 +1,219 @@
1
+ export interface ParseSchema {
2
+ className: string;
3
+ fields: Record<string, {
4
+ type: string;
5
+ targetClass?: string;
6
+ }>;
7
+ classLevelPermissions?: Record<string, unknown>;
8
+ indexes?: Record<string, unknown>;
9
+ }
10
+ export interface ParseObject {
11
+ objectId: string;
12
+ createdAt: string;
13
+ updatedAt: string;
14
+ [key: string]: unknown;
15
+ }
16
+ export interface ParseQueryResult {
17
+ results: ParseObject[];
18
+ count?: number;
19
+ }
20
+ export interface ParseFile {
21
+ name: string;
22
+ url: string;
23
+ }
24
+ export interface CloudFunction {
25
+ functionName: string;
26
+ }
27
+ export interface FunctionWebhook {
28
+ functionName: string;
29
+ url: string;
30
+ }
31
+ export interface TriggerWebhook {
32
+ className: string;
33
+ triggerName: string;
34
+ url: string;
35
+ }
36
+ export interface AppCheck {
37
+ id: string;
38
+ title: string;
39
+ state: 'ok' | 'warning' | 'fail' | 'error';
40
+ message: string;
41
+ solution?: string;
42
+ }
43
+ export interface AppChecks {
44
+ state: string;
45
+ checkedAt: string;
46
+ summary: {
47
+ total: number;
48
+ ok: number;
49
+ warning: number;
50
+ fail: number;
51
+ error: number;
52
+ };
53
+ groups: Array<{
54
+ id: string;
55
+ name: string;
56
+ state: string;
57
+ checks: AppCheck[];
58
+ }>;
59
+ }
60
+ export type TriggerType = 'beforeSave' | 'afterSave' | 'beforeDelete' | 'afterDelete' | 'beforeFind' | 'afterFind';
61
+ export declare class ParseClient {
62
+ private client;
63
+ constructor(token: string, appObjectId: string, apiUrl?: string);
64
+ listClasses(): Promise<ParseSchema[]>;
65
+ getClass(className: string): Promise<ParseSchema>;
66
+ createClass(className: string, fields?: Record<string, {
67
+ type: string;
68
+ }>): Promise<ParseSchema>;
69
+ deleteClass(className: string): Promise<void>;
70
+ addField(className: string, fieldName: string, fieldType: string, targetClass?: string): Promise<ParseSchema>;
71
+ deleteField(className: string, fieldName: string): Promise<ParseSchema>;
72
+ updateClassLevelPermissions(className: string, clp: Record<string, Record<string, boolean>>): Promise<ParseSchema>;
73
+ queryObjects(className: string, options?: {
74
+ where?: Record<string, unknown>;
75
+ limit?: number;
76
+ skip?: number;
77
+ order?: string;
78
+ keys?: string;
79
+ include?: string;
80
+ count?: boolean;
81
+ }): Promise<ParseQueryResult>;
82
+ getObject(className: string, objectId: string): Promise<ParseObject>;
83
+ createObject(className: string, data: Record<string, unknown>): Promise<ParseObject>;
84
+ updateObject(className: string, objectId: string, data: Record<string, unknown>): Promise<ParseObject>;
85
+ deleteObject(className: string, objectId: string): Promise<void>;
86
+ uploadFile(fileName: string, fileData: Buffer, contentType: string): Promise<ParseFile>;
87
+ callCloudFunction(functionName: string, params?: Record<string, unknown>): Promise<unknown>;
88
+ listCloudFunctions(): Promise<string[]>;
89
+ listCloudCodeFiles(): Promise<{
90
+ userFiles: Array<{
91
+ path: string;
92
+ checksum: string;
93
+ }>;
94
+ cloudFiles: Array<{
95
+ path: string;
96
+ checksum: string;
97
+ }>;
98
+ }>;
99
+ readCloudCodeFile(filePath: string): Promise<string>;
100
+ sendPush(data: {
101
+ where?: Record<string, unknown>;
102
+ channels?: string[];
103
+ data: {
104
+ alert?: string;
105
+ badge?: number | string;
106
+ sound?: string;
107
+ [key: string]: unknown;
108
+ };
109
+ push_time?: string;
110
+ expiration_time?: string;
111
+ expiration_interval?: number;
112
+ }): Promise<{
113
+ result: boolean;
114
+ }>;
115
+ listAudiences(limit?: number): Promise<{
116
+ audiences: Array<{
117
+ objectId: string;
118
+ name: string;
119
+ query: Record<string, unknown>;
120
+ createdAt: string;
121
+ updatedAt: string;
122
+ lastUsed?: string;
123
+ timesUsed: number;
124
+ }>;
125
+ }>;
126
+ createAudience(name: string, query: Record<string, unknown>): Promise<{
127
+ success: boolean;
128
+ objectId: string;
129
+ }>;
130
+ deleteAudience(objectId: string): Promise<{
131
+ success: boolean;
132
+ }>;
133
+ listAvailableDevices(): Promise<string[]>;
134
+ getConfig(): Promise<Record<string, unknown>>;
135
+ updateConfig(params: Record<string, unknown>): Promise<{
136
+ result: boolean;
137
+ }>;
138
+ /**
139
+ * The app server's own production checks (Parse Server 6.5.11+): security,
140
+ * users and sessions, database; each with what to change
141
+ */
142
+ getAppChecks(): Promise<AppChecks>;
143
+ checkHealth(): Promise<{
144
+ status: string;
145
+ [key: string]: unknown;
146
+ }>;
147
+ getLogs(options?: {
148
+ level?: 'info' | 'error' | 'warn' | 'debug';
149
+ limit?: number;
150
+ }): Promise<Array<{
151
+ timestamp: string;
152
+ level: string;
153
+ message: string;
154
+ [key: string]: unknown;
155
+ }>>;
156
+ listScheduledJobs(limit?: number): Promise<{
157
+ jobs: Array<{
158
+ objectId: string;
159
+ name: string;
160
+ description?: string;
161
+ startAfter?: string;
162
+ repeatInterval?: string;
163
+ nextRunAt?: string;
164
+ lastRunAt?: string;
165
+ type?: string;
166
+ data?: Record<string, unknown>;
167
+ failReason?: string;
168
+ failCount?: number;
169
+ }>;
170
+ }>;
171
+ listAvailableJobs(): Promise<{
172
+ jobs: string[];
173
+ inUse: string[];
174
+ }>;
175
+ getJobStatus(limit?: number): Promise<Array<{
176
+ objectId: string;
177
+ jobName: string;
178
+ status: string;
179
+ message?: string;
180
+ createdAt: string;
181
+ finishedAt?: string;
182
+ }>>;
183
+ /**
184
+ * The newest job runs. Neither the app servers' GET /job/status (it reads
185
+ * its limit from the body) nor sorting _JobStatus by createdAt works on
186
+ * apps whose older runs stored createdAt as a Date and newer ones as a
187
+ * string: Mongo sorts by type first. Runs are inserted in order, so take
188
+ * the last ones and sort them here.
189
+ */
190
+ private latestJobRuns;
191
+ scheduleJob(params: {
192
+ jobName: string;
193
+ description?: string;
194
+ startAfter: string;
195
+ repeatMinutes?: number;
196
+ params?: Record<string, unknown>;
197
+ objectId?: string;
198
+ }): Promise<{
199
+ success: boolean;
200
+ objectId: string;
201
+ }>;
202
+ deleteJob(objectId: string): Promise<{
203
+ success: boolean;
204
+ }>;
205
+ runJob(jobName: string, params?: Record<string, unknown>): Promise<{
206
+ statusId: string;
207
+ }>;
208
+ listFunctionWebhooks(): Promise<FunctionWebhook[]>;
209
+ getFunctionWebhook(functionName: string): Promise<FunctionWebhook>;
210
+ createFunctionWebhook(functionName: string, url: string): Promise<FunctionWebhook>;
211
+ updateFunctionWebhook(functionName: string, url: string): Promise<FunctionWebhook>;
212
+ deleteFunctionWebhook(functionName: string): Promise<void>;
213
+ listTriggerWebhooks(): Promise<TriggerWebhook[]>;
214
+ getTriggerWebhook(className: string, triggerName: TriggerType): Promise<TriggerWebhook>;
215
+ createTriggerWebhook(className: string, triggerName: TriggerType, url: string): Promise<TriggerWebhook>;
216
+ updateTriggerWebhook(className: string, triggerName: TriggerType, url: string): Promise<TriggerWebhook>;
217
+ deleteTriggerWebhook(className: string, triggerName: TriggerType): Promise<void>;
218
+ }
219
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/client/parse.ts"],"names":[],"mappings":"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"}