@occam-scaly/mcp-server 0.1.2

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 (91) hide show
  1. package/README.md +166 -0
  2. package/bin/scaly-mcp.js +6 -0
  3. package/dist/audit.d.ts +25 -0
  4. package/dist/audit.d.ts.map +1 -0
  5. package/dist/audit.js +182 -0
  6. package/dist/audit.js.map +1 -0
  7. package/dist/client.d.ts +16 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +142 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/config.d.ts +24 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +76 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/index.d.ts +3 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +279 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/resources/index.d.ts +17 -0
  20. package/dist/resources/index.d.ts.map +1 -0
  21. package/dist/resources/index.js +505 -0
  22. package/dist/resources/index.js.map +1 -0
  23. package/dist/tools/addons.d.ts +3 -0
  24. package/dist/tools/addons.d.ts.map +1 -0
  25. package/dist/tools/addons.js +128 -0
  26. package/dist/tools/addons.js.map +1 -0
  27. package/dist/tools/apps.d.ts +3 -0
  28. package/dist/tools/apps.d.ts.map +1 -0
  29. package/dist/tools/apps.js +121 -0
  30. package/dist/tools/apps.js.map +1 -0
  31. package/dist/tools/compute.d.ts +3 -0
  32. package/dist/tools/compute.d.ts.map +1 -0
  33. package/dist/tools/compute.js +135 -0
  34. package/dist/tools/compute.js.map +1 -0
  35. package/dist/tools/db.d.ts +3 -0
  36. package/dist/tools/db.d.ts.map +1 -0
  37. package/dist/tools/db.js +597 -0
  38. package/dist/tools/db.js.map +1 -0
  39. package/dist/tools/deployments.d.ts +3 -0
  40. package/dist/tools/deployments.d.ts.map +1 -0
  41. package/dist/tools/deployments.js +354 -0
  42. package/dist/tools/deployments.js.map +1 -0
  43. package/dist/tools/diagnose.d.ts +3 -0
  44. package/dist/tools/diagnose.d.ts.map +1 -0
  45. package/dist/tools/diagnose.js +213 -0
  46. package/dist/tools/diagnose.js.map +1 -0
  47. package/dist/tools/env.d.ts +3 -0
  48. package/dist/tools/env.d.ts.map +1 -0
  49. package/dist/tools/env.js +216 -0
  50. package/dist/tools/env.js.map +1 -0
  51. package/dist/tools/index.d.ts +38 -0
  52. package/dist/tools/index.d.ts.map +1 -0
  53. package/dist/tools/index.js +48 -0
  54. package/dist/tools/index.js.map +1 -0
  55. package/dist/tools/jobs.d.ts +3 -0
  56. package/dist/tools/jobs.d.ts.map +1 -0
  57. package/dist/tools/jobs.js +160 -0
  58. package/dist/tools/jobs.js.map +1 -0
  59. package/dist/tools/logs.d.ts +3 -0
  60. package/dist/tools/logs.d.ts.map +1 -0
  61. package/dist/tools/logs.js +157 -0
  62. package/dist/tools/logs.js.map +1 -0
  63. package/dist/tools/operations.d.ts +3 -0
  64. package/dist/tools/operations.d.ts.map +1 -0
  65. package/dist/tools/operations.js +262 -0
  66. package/dist/tools/operations.js.map +1 -0
  67. package/dist/tools/project.d.ts +3 -0
  68. package/dist/tools/project.d.ts.map +1 -0
  69. package/dist/tools/project.js +341 -0
  70. package/dist/tools/project.js.map +1 -0
  71. package/dist/tools/s3.d.ts +3 -0
  72. package/dist/tools/s3.d.ts.map +1 -0
  73. package/dist/tools/s3.js +256 -0
  74. package/dist/tools/s3.js.map +1 -0
  75. package/dist/tools/status.d.ts +3 -0
  76. package/dist/tools/status.d.ts.map +1 -0
  77. package/dist/tools/status.js +139 -0
  78. package/dist/tools/status.js.map +1 -0
  79. package/dist/tools/write.d.ts +3 -0
  80. package/dist/tools/write.d.ts.map +1 -0
  81. package/dist/tools/write.js +900 -0
  82. package/dist/tools/write.js.map +1 -0
  83. package/dist/utils/jwt.d.ts +3 -0
  84. package/dist/utils/jwt.d.ts.map +1 -0
  85. package/dist/utils/jwt.js +32 -0
  86. package/dist/utils/jwt.js.map +1 -0
  87. package/dist/utils/paths.d.ts +5 -0
  88. package/dist/utils/paths.d.ts.map +1 -0
  89. package/dist/utils/paths.js +26 -0
  90. package/dist/utils/paths.js.map +1 -0
  91. package/package.json +50 -0
@@ -0,0 +1,256 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.s3Tools = void 0;
7
+ const zod_1 = require("zod");
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const node_stream_1 = require("node:stream");
11
+ const promises_1 = require("node:stream/promises");
12
+ const client_js_1 = require("../client.js");
13
+ const config_js_1 = require("../config.js");
14
+ const jwt_js_1 = require("../utils/jwt.js");
15
+ const paths_js_1 = require("../utils/paths.js");
16
+ const index_js_1 = require("./index.js");
17
+ const LIST_BUCKET_OBJECTS = `
18
+ query ListBucketObjects($where: AddOnWhereUniqueInput!, $prefix: String, $cursor: String, $pageSize: Int) {
19
+ listBucketObjects(where: $where, prefix: $prefix, cursor: $cursor, pageSize: $pageSize) {
20
+ bucket
21
+ prefix
22
+ nextCursor
23
+ objects { key size lastModified }
24
+ }
25
+ }
26
+ `;
27
+ const GET_BUCKET_OBJECT_DOWNLOAD_LINK = `
28
+ query GetBucketObjectDownloadLink($where: AddOnWhereUniqueInput!, $key: String!) {
29
+ getBucketObjectDownloadLink(where: $where, key: $key) { url }
30
+ }
31
+ `;
32
+ const S3ListSchema = zod_1.z.object({
33
+ addon_id: zod_1.z.string().describe('Storage (S3) add-on id'),
34
+ prefix: zod_1.z.string().optional().describe('Optional key prefix'),
35
+ limit: zod_1.z.number().int().min(1).max(500).optional().default(100),
36
+ page_token: zod_1.z
37
+ .string()
38
+ .optional()
39
+ .describe('Pagination token from a previous response')
40
+ });
41
+ const S3DownloadSchema = zod_1.z.object({
42
+ addon_id: zod_1.z.string().describe('Storage (S3) add-on id'),
43
+ key: zod_1.z.string().min(1).describe('Object key'),
44
+ output_path: zod_1.z.string().describe('Workspace-relative file path to write to'),
45
+ overwrite: zod_1.z.boolean().optional().default(false),
46
+ max_bytes: zod_1.z
47
+ .number()
48
+ .int()
49
+ .min(1)
50
+ .max(2_000_000_000)
51
+ .optional()
52
+ .default(100 * 1024 * 1024)
53
+ });
54
+ exports.s3Tools = [
55
+ {
56
+ name: 'scaly_s3_list_objects',
57
+ description: 'List objects in an S3 storage add-on bucket (metadata only). Requires SCALY_OIDC_TOKEN.',
58
+ inputSchema: S3ListSchema,
59
+ handler: async (input) => {
60
+ try {
61
+ const cfg = (0, config_js_1.loadConfig)();
62
+ if (!cfg.oidcToken) {
63
+ return (0, index_js_1.fail)({
64
+ code: 'PERMISSION_DENIED',
65
+ message: 'SCALY_OIDC_TOKEN is required for S3 tools (set it in the MCP server env).',
66
+ retriable: false
67
+ });
68
+ }
69
+ if ((0, jwt_js_1.isJwtExpired)(cfg.oidcToken)) {
70
+ return (0, index_js_1.fail)({
71
+ code: 'TOKEN_EXPIRED',
72
+ message: 'SCALY_OIDC_TOKEN is expired. Refresh your Scaly session token and restart the MCP server.',
73
+ retriable: false
74
+ });
75
+ }
76
+ const data = await (0, client_js_1.oidcQuery)(LIST_BUCKET_OBJECTS, {
77
+ where: { id: input.addon_id },
78
+ prefix: input.prefix,
79
+ cursor: input.page_token,
80
+ pageSize: input.limit
81
+ });
82
+ return (0, index_js_1.ok)({
83
+ addon_id: input.addon_id,
84
+ bucket: data.listBucketObjects.bucket,
85
+ prefix: data.listBucketObjects.prefix,
86
+ objects: data.listBucketObjects.objects || [],
87
+ next_cursor: data.listBucketObjects.nextCursor,
88
+ count: (data.listBucketObjects.objects || []).length
89
+ });
90
+ }
91
+ catch (err) {
92
+ return (0, index_js_1.fail)({
93
+ code: 'INTERNAL_ERROR',
94
+ message: err.message,
95
+ retriable: true
96
+ });
97
+ }
98
+ }
99
+ },
100
+ {
101
+ name: 'scaly_s3_download_object',
102
+ description: 'Download a single object from an S3 storage add-on bucket to a local file. Requires SCALY_OIDC_TOKEN; content never appears in transcripts.',
103
+ inputSchema: S3DownloadSchema,
104
+ handler: async (input) => {
105
+ try {
106
+ const cfg = (0, config_js_1.loadConfig)();
107
+ if (!cfg.oidcToken) {
108
+ return (0, index_js_1.fail)({
109
+ code: 'PERMISSION_DENIED',
110
+ message: 'SCALY_OIDC_TOKEN is required for S3 tools (set it in the MCP server env).',
111
+ retriable: false
112
+ });
113
+ }
114
+ if ((0, jwt_js_1.isJwtExpired)(cfg.oidcToken)) {
115
+ return (0, index_js_1.fail)({
116
+ code: 'TOKEN_EXPIRED',
117
+ message: 'SCALY_OIDC_TOKEN is expired. Refresh your Scaly session token and restart the MCP server.',
118
+ retriable: false
119
+ });
120
+ }
121
+ const { abs, rel } = (0, paths_js_1.validateWorkspaceRelativePath)(input.output_path);
122
+ const existedBefore = node_fs_1.default.existsSync(abs);
123
+ if (existedBefore && !input.overwrite) {
124
+ return (0, index_js_1.fail)({
125
+ code: 'RESOURCE_EXISTS',
126
+ message: `Refusing to overwrite existing file: ${rel}`,
127
+ retriable: false
128
+ });
129
+ }
130
+ const data = await (0, client_js_1.oidcQuery)(GET_BUCKET_OBJECT_DOWNLOAD_LINK, {
131
+ where: { id: input.addon_id },
132
+ key: input.key
133
+ });
134
+ const url = data.getBucketObjectDownloadLink?.url;
135
+ if (!url) {
136
+ return (0, index_js_1.fail)({
137
+ code: 'RESOURCE_NOT_FOUND',
138
+ message: 'No download URL returned (object may not exist).',
139
+ retriable: false
140
+ });
141
+ }
142
+ const res = await fetch(url);
143
+ if (!res.ok || !res.body) {
144
+ return (0, index_js_1.fail)({
145
+ code: 'INTERNAL_ERROR',
146
+ message: `Download failed: HTTP ${res.status}`,
147
+ retriable: true
148
+ });
149
+ }
150
+ const contentLengthHeader = res.headers.get('content-length');
151
+ if (contentLengthHeader) {
152
+ const length = Number(contentLengthHeader);
153
+ if (Number.isFinite(length) && length > input.max_bytes) {
154
+ return (0, index_js_1.fail)({
155
+ code: 'VALIDATION_ERROR',
156
+ message: `Refusing to download ${length} bytes (exceeds max_bytes=${input.max_bytes}).`,
157
+ retriable: false
158
+ });
159
+ }
160
+ }
161
+ node_fs_1.default.mkdirSync(node_path_1.default.dirname(abs), { recursive: true });
162
+ const tmpAbs = `${abs}.tmp-${process.pid}-${Date.now()}`;
163
+ if (node_fs_1.default.existsSync(tmpAbs)) {
164
+ node_fs_1.default.unlinkSync(tmpAbs);
165
+ }
166
+ let bytesWritten = 0;
167
+ const limiter = new node_stream_1.Transform({
168
+ transform(chunk, _enc, cb) {
169
+ bytesWritten += Buffer.byteLength(chunk);
170
+ if (bytesWritten > input.max_bytes) {
171
+ cb(new Error(`Downloaded data exceeded max_bytes=${input.max_bytes} (partial file discarded).`));
172
+ return;
173
+ }
174
+ cb(null, chunk);
175
+ }
176
+ });
177
+ try {
178
+ const file = node_fs_1.default.createWriteStream(tmpAbs, { flags: 'w' });
179
+ await (0, promises_1.pipeline)(node_stream_1.Readable.fromWeb(res.body), limiter, file);
180
+ try {
181
+ node_fs_1.default.renameSync(tmpAbs, abs);
182
+ }
183
+ catch (err) {
184
+ if (existedBefore && input.overwrite) {
185
+ try {
186
+ node_fs_1.default.unlinkSync(abs);
187
+ }
188
+ catch { }
189
+ node_fs_1.default.renameSync(tmpAbs, abs);
190
+ }
191
+ else {
192
+ throw err;
193
+ }
194
+ }
195
+ }
196
+ catch (err) {
197
+ try {
198
+ if (node_fs_1.default.existsSync(tmpAbs))
199
+ node_fs_1.default.unlinkSync(tmpAbs);
200
+ }
201
+ catch { }
202
+ throw err;
203
+ }
204
+ return (0, index_js_1.ok)({
205
+ addon_id: input.addon_id,
206
+ key: input.key,
207
+ output_path: rel,
208
+ overwritten: Boolean(existedBefore && input.overwrite),
209
+ bytes_written: bytesWritten,
210
+ max_bytes: input.max_bytes
211
+ });
212
+ }
213
+ catch (err) {
214
+ return (0, index_js_1.fail)({
215
+ code: 'INTERNAL_ERROR',
216
+ message: err.message,
217
+ retriable: true
218
+ });
219
+ }
220
+ }
221
+ },
222
+ {
223
+ name: 'scaly_s3_upload_object',
224
+ description: 'NOT SUPPORTED YET: upload requires server-issued S3 write scopes (Phase 6 API work).',
225
+ inputSchema: zod_1.z.object({
226
+ addon_id: zod_1.z.string(),
227
+ source_path: zod_1.z.string(),
228
+ key: zod_1.z.string(),
229
+ confirm: zod_1.z.boolean().optional()
230
+ }),
231
+ handler: async () => {
232
+ return (0, index_js_1.fail)({
233
+ code: 'NOT_SUPPORTED',
234
+ message: 's3 upload is not supported yet (missing S3_WRITE scope in API).',
235
+ retriable: false
236
+ });
237
+ }
238
+ },
239
+ {
240
+ name: 'scaly_s3_delete_object',
241
+ description: 'NOT SUPPORTED YET: delete requires server-issued S3 delete scopes (Phase 6 API work).',
242
+ inputSchema: zod_1.z.object({
243
+ addon_id: zod_1.z.string(),
244
+ key: zod_1.z.string(),
245
+ confirm: zod_1.z.boolean().optional()
246
+ }),
247
+ handler: async () => {
248
+ return (0, index_js_1.fail)({
249
+ code: 'NOT_SUPPORTED',
250
+ message: 's3 delete is not supported yet (missing S3_DELETE scope in API).',
251
+ retriable: false
252
+ });
253
+ }
254
+ }
255
+ ];
256
+ //# sourceMappingURL=s3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3.js","sourceRoot":"","sources":["../../src/tools/s3.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type ToolDefinition } from './index.js';
2
+ export declare const statusTools: ToolDefinition[];
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/tools/status.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,cAAc,EAAY,MAAM,YAAY,CAAC;AAqD3D,eAAO,MAAM,WAAW,EAAE,cAAc,EA8IvC,CAAC"}
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.statusTools = void 0;
4
+ const client_js_1 = require("../client.js");
5
+ const zod_1 = require("zod");
6
+ const index_js_1 = require("./index.js");
7
+ const StatusSchema = zod_1.z.object({});
8
+ exports.statusTools = [
9
+ {
10
+ name: 'scaly_status',
11
+ description: 'Get an overview of stacks/apps and currently running deployments for the current API key.',
12
+ inputSchema: StatusSchema,
13
+ handler: async () => {
14
+ try {
15
+ const stacksGql = `
16
+ query ListStacks($take: Int) {
17
+ listStacks(take: $take) {
18
+ id
19
+ name
20
+ status
21
+ accountId
22
+ size
23
+ minIdle
24
+ apps {
25
+ id
26
+ name
27
+ }
28
+ account {
29
+ id
30
+ slug
31
+ name
32
+ region
33
+ }
34
+ }
35
+ }
36
+ `;
37
+ const appsGql = `
38
+ query ListApps($take: Int) {
39
+ listApps(take: $take) {
40
+ id
41
+ name
42
+ status
43
+ stackId
44
+ accountId
45
+ updatedAt
46
+ }
47
+ }
48
+ `;
49
+ const [stacksResult, appsResult] = await Promise.all([
50
+ (0, client_js_1.query)(stacksGql, { take: 50 }),
51
+ (0, client_js_1.query)(appsGql, { take: 200 })
52
+ ]);
53
+ const stacks = stacksResult.listStacks || [];
54
+ const apps = appsResult.listApps || [];
55
+ // Pick a representative account (most users have one account per key).
56
+ const account = stacks[0]?.account ?? null;
57
+ if (!account) {
58
+ // Fall back to accountId from apps if stacks are empty.
59
+ const accountId = apps[0]?.accountId ?? null;
60
+ if (!accountId) {
61
+ return (0, index_js_1.ok)({
62
+ generated_at: new Date().toISOString(),
63
+ account: null,
64
+ stacks: [],
65
+ apps: [],
66
+ operations: { running: [] }
67
+ });
68
+ }
69
+ }
70
+ const runningDeploymentsGql = `
71
+ query ListDeployments($where: DeploymentWhereInput, $take: Int, $orderBy: [DeploymentOrderByInput!]) {
72
+ listDeployments(where: $where, take: $take, orderBy: $orderBy) {
73
+ id
74
+ status
75
+ resourceType
76
+ stackId
77
+ appId
78
+ progressPct
79
+ queuedAt
80
+ }
81
+ }
82
+ `;
83
+ const runningResult = await (0, client_js_1.query)(runningDeploymentsGql, {
84
+ where: { status: { in: ['Queued', 'Pending', 'Deploying'] } },
85
+ take: 25,
86
+ orderBy: [{ queuedAt: 'desc' }]
87
+ });
88
+ const running = (runningResult.listDeployments || []).map((d) => ({
89
+ operation_id: d.id,
90
+ kind: `deployment.${String(d.resourceType).toLowerCase()}`,
91
+ status: String(d.status ?? '').toLowerCase(),
92
+ progress_percent: d.progressPct ?? undefined,
93
+ resource: d.resourceType === 'APP'
94
+ ? d.appId
95
+ ? { type: 'app', id: d.appId }
96
+ : undefined
97
+ : d.stackId
98
+ ? { type: 'stack', id: d.stackId }
99
+ : undefined
100
+ }));
101
+ return (0, index_js_1.ok)({
102
+ generated_at: new Date().toISOString(),
103
+ account: account
104
+ ? {
105
+ id: account.id,
106
+ slug: account.slug,
107
+ name: account.name,
108
+ region: account.region
109
+ }
110
+ : null,
111
+ stacks: stacks.map((s) => ({
112
+ id: s.id,
113
+ name: s.name,
114
+ status: s.status,
115
+ size: s.size,
116
+ min_idle: s.minIdle,
117
+ app_ids: (s.apps || []).map((a) => a.id)
118
+ })),
119
+ apps: apps.map((a) => ({
120
+ id: a.id,
121
+ name: a.name,
122
+ status: a.status,
123
+ stack_id: a.stackId,
124
+ updated_at: a.updatedAt
125
+ })),
126
+ operations: { running }
127
+ });
128
+ }
129
+ catch (err) {
130
+ return (0, index_js_1.fail)({
131
+ code: 'INTERNAL_ERROR',
132
+ message: err.message,
133
+ retriable: true
134
+ });
135
+ }
136
+ }
137
+ }
138
+ ];
139
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/tools/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type ToolDefinition } from './index.js';
2
+ export declare const writeTools: ToolDefinition[];
3
+ //# sourceMappingURL=write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,cAAc,EAAY,MAAM,YAAY,CAAC;AA4W3D,eAAO,MAAM,UAAU,EAAE,cAAc,EAirBtC,CAAC"}