studiograph 1.3.48-next.35 → 1.3.48-next.36

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 (58) hide show
  1. package/dist/cli/commands/mcp.js +3 -1
  2. package/dist/cli/commands/mcp.js.map +1 -1
  3. package/dist/core/types.d.ts +22 -22
  4. package/dist/mcp/server.d.ts +8 -2
  5. package/dist/mcp/server.js +26 -4
  6. package/dist/mcp/server.js.map +1 -1
  7. package/dist/mcp/tools.d.ts +11 -2
  8. package/dist/mcp/tools.js +150 -86
  9. package/dist/mcp/tools.js.map +1 -1
  10. package/dist/server/index.js +20 -3
  11. package/dist/server/index.js.map +1 -1
  12. package/dist/server/routes/auth-api.js +39 -0
  13. package/dist/server/routes/auth-api.js.map +1 -1
  14. package/dist/server/routes/graph-api.js +13 -58
  15. package/dist/server/routes/graph-api.js.map +1 -1
  16. package/dist/server/routes/mcp.d.ts +6 -3
  17. package/dist/server/routes/mcp.js +14 -3
  18. package/dist/server/routes/mcp.js.map +1 -1
  19. package/dist/services/access-control.d.ts +46 -0
  20. package/dist/services/access-control.js +100 -0
  21. package/dist/services/access-control.js.map +1 -0
  22. package/dist/services/auth-service.d.ts +25 -0
  23. package/dist/services/auth-service.js +56 -1
  24. package/dist/services/auth-service.js.map +1 -1
  25. package/dist/web/_app/immutable/chunks/{BFaJ7BBQ.js → B32tD4pl.js} +1 -1
  26. package/dist/web/_app/immutable/chunks/{DaIQcaRU.js → BC7ktj07.js} +1 -1
  27. package/dist/web/_app/immutable/chunks/{CxaFoF-8.js → BkRT6ruV.js} +2 -2
  28. package/dist/web/_app/immutable/chunks/{Ce8IzajK.js → BmagG8yY.js} +1 -1
  29. package/dist/web/_app/immutable/chunks/{cb1YAIBt.js → CjyyBzjb.js} +1 -1
  30. package/dist/web/_app/immutable/chunks/{CYDWpxMD.js → CwaL6kTg.js} +1 -1
  31. package/dist/web/_app/immutable/chunks/{D8zDG0FR.js → CyBmiHLm.js} +1 -1
  32. package/dist/web/_app/immutable/chunks/{zaBAx2eq.js → D8zKd89r.js} +1 -1
  33. package/dist/web/_app/immutable/chunks/{9mf1QDBK.js → Db9eca6L.js} +1 -1
  34. package/dist/web/_app/immutable/chunks/{BktHf2wC.js → DylK7bu3.js} +1 -1
  35. package/dist/web/_app/immutable/chunks/{CsCDECl_.js → GssR8fQ3.js} +1 -1
  36. package/dist/web/_app/immutable/chunks/{C9HfyIf7.js → HSKfY6ZU.js} +1 -1
  37. package/dist/web/_app/immutable/chunks/{Dm-GGV7h.js → VCEvgZJw.js} +1 -1
  38. package/dist/web/_app/immutable/chunks/{DrjWHpea.js → xKZKU22O.js} +1 -1
  39. package/dist/web/_app/immutable/chunks/{CQm3-BKC.js → yAfzmYvy.js} +1 -1
  40. package/dist/web/_app/immutable/entry/{app.CILRf2a6.js → app.mWBFKRZ2.js} +2 -2
  41. package/dist/web/_app/immutable/entry/start.Q1XHCrNU.js +1 -0
  42. package/dist/web/_app/immutable/nodes/{0.CbKEDzDj.js → 0.BKV2H-Ug.js} +2 -2
  43. package/dist/web/_app/immutable/nodes/{1.CNNkqXbo.js → 1.9KX9N3iR.js} +1 -1
  44. package/dist/web/_app/immutable/nodes/{10.D8Mjr3wm.js → 10.CEOTZ-Ot.js} +1 -1
  45. package/dist/web/_app/immutable/nodes/{11.CDrZrGvM.js → 11.DD5U4pzY.js} +1 -1
  46. package/dist/web/_app/immutable/nodes/{12.CpJUnNZr.js → 12.DbrTQoB-.js} +1 -1
  47. package/dist/web/_app/immutable/nodes/{2.DXjczmFB.js → 2.Byr6x-5l.js} +6 -6
  48. package/dist/web/_app/immutable/nodes/{3.DqvJvLQp.js → 3.DSrTzRN9.js} +3 -3
  49. package/dist/web/_app/immutable/nodes/{4.DoIEntQh.js → 4.BQTnXHet.js} +3 -3
  50. package/dist/web/_app/immutable/nodes/{5.BVEaLM7q.js → 5.D_EgSewC.js} +1 -1
  51. package/dist/web/_app/immutable/nodes/{6.Crs4iANA.js → 6.CDdiiN7o.js} +1 -1
  52. package/dist/web/_app/immutable/nodes/{7.ChaSs0xh.js → 7.DGqsv15n.js} +1 -1
  53. package/dist/web/_app/immutable/nodes/{8.DYdiEDkq.js → 8.DGhcX90z.js} +1 -1
  54. package/dist/web/_app/immutable/nodes/{9.PxL_2CWd.js → 9.CzFXF5sO.js} +1 -1
  55. package/dist/web/_app/version.json +1 -1
  56. package/dist/web/index.html +6 -6
  57. package/package.json +1 -1
  58. package/dist/web/_app/immutable/entry/start.CvxwSfDV.js +0 -1
@@ -27,6 +27,7 @@ import { Command } from 'commander';
27
27
  import { Workspace } from '../../core/workspace.js';
28
28
  import { WorkspaceManager } from '../../core/workspace-manager.js';
29
29
  import { loadUserConfig } from '../../core/user-config.js';
30
+ import { AuthService } from '../../services/auth-service.js';
30
31
  import { startMcpServer } from '../../mcp/server.js';
31
32
  export const mcpCommand = new Command('mcp')
32
33
  .description('Start the Studiograph MCP server for Claude Desktop integration')
@@ -52,6 +53,7 @@ export const mcpCommand = new Command('mcp')
52
53
  email: 'noreply@studiograph.local',
53
54
  };
54
55
  const workspaceManager = new WorkspaceManager(workspacePath, config, gitUser);
55
- await startMcpServer(workspaceManager);
56
+ const authService = new AuthService(workspacePath);
57
+ await startMcpServer(workspaceManager, authService);
56
58
  });
57
59
  //# sourceMappingURL=mcp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/cli/commands/mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;KACzC,WAAW,CAAC,iEAAiE,CAAC;KAC9E,QAAQ,CAAC,aAAa,EAAE,mDAAmD,CAAC;KAC5E,MAAM,CAAC,KAAK,EAAE,YAAqB,EAAE,EAAE;IACtC,MAAM,aAAa,GAAG,YAAY,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,aAAa,CAAC,CAAC;IAE/C,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,gCAAgC;YAChC,gGAAgG,CACjG,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;IAE5C,kEAAkE;IAClE,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,IAAI,UAAU,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,UAAU,CAAC,OAAO,CAAC;IACrD,CAAC;IAED,2EAA2E;IAC3E,MAAM,OAAO,GAAG;QACd,EAAE,EAAK,KAAK;QACZ,IAAI,EAAG,iBAAiB;QACxB,KAAK,EAAE,2BAA2B;KACnC,CAAC;IAEF,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAC3C,aAAa,EACb,MAAM,EACN,OAAO,CACR,CAAC;IAEF,MAAM,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/cli/commands/mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;KACzC,WAAW,CAAC,iEAAiE,CAAC;KAC9E,QAAQ,CAAC,aAAa,EAAE,mDAAmD,CAAC;KAC5E,MAAM,CAAC,KAAK,EAAE,YAAqB,EAAE,EAAE;IACtC,MAAM,aAAa,GAAG,YAAY,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,aAAa,CAAC,CAAC;IAE/C,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,gCAAgC;YAChC,gGAAgG,CACjG,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;IAE5C,kEAAkE;IAClE,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,IAAI,UAAU,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,UAAU,CAAC,OAAO,CAAC;IACrD,CAAC;IAED,2EAA2E;IAC3E,MAAM,OAAO,GAAG;QACd,EAAE,EAAK,KAAK;QACZ,IAAI,EAAG,iBAAiB;QACxB,KAAK,EAAE,2BAA2B;KACnC,CAAC;IAEF,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAC3C,aAAa,EACb,MAAM,EACN,OAAO,CACR,CAAC;IAEF,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,aAAa,CAAC,CAAC;IAEnD,MAAM,cAAc,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC"}
@@ -104,16 +104,16 @@ export declare const FieldDefinitionSchema: z.ZodObject<{
104
104
  type: "string" | "number" | "boolean" | "enum" | "string[]";
105
105
  name: string;
106
106
  required: boolean;
107
+ default?: unknown;
107
108
  description?: string | undefined;
108
109
  enum_values?: string[] | undefined;
109
- default?: unknown;
110
110
  }, {
111
111
  type: "string" | "number" | "boolean" | "enum" | "string[]";
112
112
  name: string;
113
+ default?: unknown;
113
114
  required?: boolean | undefined;
114
115
  description?: string | undefined;
115
116
  enum_values?: string[] | undefined;
116
- default?: unknown;
117
117
  }>;
118
118
  export type FieldDefinition = z.infer<typeof FieldDefinitionSchema>;
119
119
  /**
@@ -133,16 +133,16 @@ export declare const SchemaExtensionSchema: z.ZodObject<{
133
133
  type: "string" | "number" | "boolean" | "enum" | "string[]";
134
134
  name: string;
135
135
  required: boolean;
136
+ default?: unknown;
136
137
  description?: string | undefined;
137
138
  enum_values?: string[] | undefined;
138
- default?: unknown;
139
139
  }, {
140
140
  type: "string" | "number" | "boolean" | "enum" | "string[]";
141
141
  name: string;
142
+ default?: unknown;
142
143
  required?: boolean | undefined;
143
144
  description?: string | undefined;
144
145
  enum_values?: string[] | undefined;
145
- default?: unknown;
146
146
  }>, "many">>;
147
147
  fields: z.ZodOptional<z.ZodArray<z.ZodObject<{
148
148
  name: z.ZodString;
@@ -155,16 +155,16 @@ export declare const SchemaExtensionSchema: z.ZodObject<{
155
155
  type: "string" | "number" | "boolean" | "enum" | "string[]";
156
156
  name: string;
157
157
  required: boolean;
158
+ default?: unknown;
158
159
  description?: string | undefined;
159
160
  enum_values?: string[] | undefined;
160
- default?: unknown;
161
161
  }, {
162
162
  type: "string" | "number" | "boolean" | "enum" | "string[]";
163
163
  name: string;
164
+ default?: unknown;
164
165
  required?: boolean | undefined;
165
166
  description?: string | undefined;
166
167
  enum_values?: string[] | undefined;
167
- default?: unknown;
168
168
  }>, "many">>;
169
169
  body_template: z.ZodOptional<z.ZodString>;
170
170
  }, "strip", z.ZodTypeAny, {
@@ -174,17 +174,17 @@ export declare const SchemaExtensionSchema: z.ZodObject<{
174
174
  type: "string" | "number" | "boolean" | "enum" | "string[]";
175
175
  name: string;
176
176
  required: boolean;
177
+ default?: unknown;
177
178
  description?: string | undefined;
178
179
  enum_values?: string[] | undefined;
179
- default?: unknown;
180
180
  }[] | undefined;
181
181
  fields?: {
182
182
  type: "string" | "number" | "boolean" | "enum" | "string[]";
183
183
  name: string;
184
184
  required: boolean;
185
+ default?: unknown;
185
186
  description?: string | undefined;
186
187
  enum_values?: string[] | undefined;
187
- default?: unknown;
188
188
  }[] | undefined;
189
189
  body_template?: string | undefined;
190
190
  }, {
@@ -193,18 +193,18 @@ export declare const SchemaExtensionSchema: z.ZodObject<{
193
193
  additional_fields?: {
194
194
  type: "string" | "number" | "boolean" | "enum" | "string[]";
195
195
  name: string;
196
+ default?: unknown;
196
197
  required?: boolean | undefined;
197
198
  description?: string | undefined;
198
199
  enum_values?: string[] | undefined;
199
- default?: unknown;
200
200
  }[] | undefined;
201
201
  fields?: {
202
202
  type: "string" | "number" | "boolean" | "enum" | "string[]";
203
203
  name: string;
204
+ default?: unknown;
204
205
  required?: boolean | undefined;
205
206
  description?: string | undefined;
206
207
  enum_values?: string[] | undefined;
207
- default?: unknown;
208
208
  }[] | undefined;
209
209
  body_template?: string | undefined;
210
210
  }>;
@@ -337,16 +337,16 @@ export declare const WorkspaceConfigSchema: z.ZodObject<{
337
337
  type: "string" | "number" | "boolean" | "enum" | "string[]";
338
338
  name: string;
339
339
  required: boolean;
340
+ default?: unknown;
340
341
  description?: string | undefined;
341
342
  enum_values?: string[] | undefined;
342
- default?: unknown;
343
343
  }, {
344
344
  type: "string" | "number" | "boolean" | "enum" | "string[]";
345
345
  name: string;
346
+ default?: unknown;
346
347
  required?: boolean | undefined;
347
348
  description?: string | undefined;
348
349
  enum_values?: string[] | undefined;
349
- default?: unknown;
350
350
  }>, "many">>;
351
351
  fields: z.ZodOptional<z.ZodArray<z.ZodObject<{
352
352
  name: z.ZodString;
@@ -359,16 +359,16 @@ export declare const WorkspaceConfigSchema: z.ZodObject<{
359
359
  type: "string" | "number" | "boolean" | "enum" | "string[]";
360
360
  name: string;
361
361
  required: boolean;
362
+ default?: unknown;
362
363
  description?: string | undefined;
363
364
  enum_values?: string[] | undefined;
364
- default?: unknown;
365
365
  }, {
366
366
  type: "string" | "number" | "boolean" | "enum" | "string[]";
367
367
  name: string;
368
+ default?: unknown;
368
369
  required?: boolean | undefined;
369
370
  description?: string | undefined;
370
371
  enum_values?: string[] | undefined;
371
- default?: unknown;
372
372
  }>, "many">>;
373
373
  body_template: z.ZodOptional<z.ZodString>;
374
374
  }, "strip", z.ZodTypeAny, {
@@ -378,17 +378,17 @@ export declare const WorkspaceConfigSchema: z.ZodObject<{
378
378
  type: "string" | "number" | "boolean" | "enum" | "string[]";
379
379
  name: string;
380
380
  required: boolean;
381
+ default?: unknown;
381
382
  description?: string | undefined;
382
383
  enum_values?: string[] | undefined;
383
- default?: unknown;
384
384
  }[] | undefined;
385
385
  fields?: {
386
386
  type: "string" | "number" | "boolean" | "enum" | "string[]";
387
387
  name: string;
388
388
  required: boolean;
389
+ default?: unknown;
389
390
  description?: string | undefined;
390
391
  enum_values?: string[] | undefined;
391
- default?: unknown;
392
392
  }[] | undefined;
393
393
  body_template?: string | undefined;
394
394
  }, {
@@ -397,18 +397,18 @@ export declare const WorkspaceConfigSchema: z.ZodObject<{
397
397
  additional_fields?: {
398
398
  type: "string" | "number" | "boolean" | "enum" | "string[]";
399
399
  name: string;
400
+ default?: unknown;
400
401
  required?: boolean | undefined;
401
402
  description?: string | undefined;
402
403
  enum_values?: string[] | undefined;
403
- default?: unknown;
404
404
  }[] | undefined;
405
405
  fields?: {
406
406
  type: "string" | "number" | "boolean" | "enum" | "string[]";
407
407
  name: string;
408
+ default?: unknown;
408
409
  required?: boolean | undefined;
409
410
  description?: string | undefined;
410
411
  enum_values?: string[] | undefined;
411
- default?: unknown;
412
412
  }[] | undefined;
413
413
  body_template?: string | undefined;
414
414
  }>>>;
@@ -515,17 +515,17 @@ export declare const WorkspaceConfigSchema: z.ZodObject<{
515
515
  type: "string" | "number" | "boolean" | "enum" | "string[]";
516
516
  name: string;
517
517
  required: boolean;
518
+ default?: unknown;
518
519
  description?: string | undefined;
519
520
  enum_values?: string[] | undefined;
520
- default?: unknown;
521
521
  }[] | undefined;
522
522
  fields?: {
523
523
  type: "string" | "number" | "boolean" | "enum" | "string[]";
524
524
  name: string;
525
525
  required: boolean;
526
+ default?: unknown;
526
527
  description?: string | undefined;
527
528
  enum_values?: string[] | undefined;
528
- default?: unknown;
529
529
  }[] | undefined;
530
530
  body_template?: string | undefined;
531
531
  }> | undefined;
@@ -582,18 +582,18 @@ export declare const WorkspaceConfigSchema: z.ZodObject<{
582
582
  additional_fields?: {
583
583
  type: "string" | "number" | "boolean" | "enum" | "string[]";
584
584
  name: string;
585
+ default?: unknown;
585
586
  required?: boolean | undefined;
586
587
  description?: string | undefined;
587
588
  enum_values?: string[] | undefined;
588
- default?: unknown;
589
589
  }[] | undefined;
590
590
  fields?: {
591
591
  type: "string" | "number" | "boolean" | "enum" | "string[]";
592
592
  name: string;
593
+ default?: unknown;
593
594
  required?: boolean | undefined;
594
595
  description?: string | undefined;
595
596
  enum_values?: string[] | undefined;
596
- default?: unknown;
597
597
  }[] | undefined;
598
598
  body_template?: string | undefined;
599
599
  }> | undefined;
@@ -1,11 +1,17 @@
1
1
  /**
2
- * Studiograph MCP server
2
+ * Studiograph MCP server (stdio transport)
3
3
  *
4
4
  * Creates a McpServer instance, registers all tools, and connects via stdio
5
5
  * transport for integration with Claude Desktop and other MCP clients.
6
6
  *
7
+ * Identity: requires STUDIOGRAPH_MCP_TOKEN to be set to a per-user API token
8
+ * (or a JWT). The token is resolved against the workspace's AuthService to
9
+ * produce the caller identity used by every tool's access control check.
10
+ * Fails closed — if the token is missing or invalid the process exits.
11
+ *
7
12
  * NOTE: All logging uses console.error() — stdout is reserved for the
8
13
  * JSON-RPC protocol messages and must not be written to directly.
9
14
  */
10
15
  import { WorkspaceManager } from '../core/workspace-manager.js';
11
- export declare function startMcpServer(workspaceManager: WorkspaceManager): Promise<void>;
16
+ import { AuthService } from '../services/auth-service.js';
17
+ export declare function startMcpServer(workspaceManager: WorkspaceManager, authService: AuthService): Promise<void>;
@@ -1,28 +1,50 @@
1
1
  /**
2
- * Studiograph MCP server
2
+ * Studiograph MCP server (stdio transport)
3
3
  *
4
4
  * Creates a McpServer instance, registers all tools, and connects via stdio
5
5
  * transport for integration with Claude Desktop and other MCP clients.
6
6
  *
7
+ * Identity: requires STUDIOGRAPH_MCP_TOKEN to be set to a per-user API token
8
+ * (or a JWT). The token is resolved against the workspace's AuthService to
9
+ * produce the caller identity used by every tool's access control check.
10
+ * Fails closed — if the token is missing or invalid the process exits.
11
+ *
7
12
  * NOTE: All logging uses console.error() — stdout is reserved for the
8
13
  * JSON-RPC protocol messages and must not be written to directly.
9
14
  */
10
15
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
11
16
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
12
17
  import { registerTools } from './tools.js';
13
- export async function startMcpServer(workspaceManager) {
18
+ export async function startMcpServer(workspaceManager, authService) {
19
+ const user = resolveStdioUser(authService);
20
+ if (!user) {
21
+ process.stderr.write('Studiograph MCP: STUDIOGRAPH_MCP_TOKEN is required.\n' +
22
+ 'Generate a token with:\n' +
23
+ ' curl -X POST http://<host>/api/auth/tokens \\\n' +
24
+ ' -H "Content-Type: application/json" \\\n' +
25
+ ' -b __sg_token=<your-jwt> \\\n' +
26
+ ' -d \'{"name":"claude-desktop"}\'\n' +
27
+ 'Then set STUDIOGRAPH_MCP_TOKEN=<token> in your Claude Desktop MCP config env.\n');
28
+ process.exit(1);
29
+ }
14
30
  const server = new McpServer({
15
31
  name: 'studiograph',
16
32
  version: '1.0.0',
17
33
  });
18
- registerTools(server, workspaceManager);
34
+ registerTools(server, workspaceManager, authService, { user });
19
35
  const transport = new StdioServerTransport();
20
36
  await server.connect(transport);
21
- console.error('Studiograph MCP server ready');
37
+ console.error(`Studiograph MCP server ready (user: ${user.email})`);
22
38
  // Keep the process alive — the transport closes when the client disconnects
23
39
  process.on('SIGINT', async () => {
24
40
  await server.close();
25
41
  process.exit(0);
26
42
  });
27
43
  }
44
+ function resolveStdioUser(authService) {
45
+ const token = process.env.STUDIOGRAPH_MCP_TOKEN?.trim();
46
+ if (!token)
47
+ return null;
48
+ return authService.verifyApiToken(token) ?? authService.verifyToken(token);
49
+ }
28
50
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,gBAAkC;IACrE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAK,aAAa;QACtB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,aAAa,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAExC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAE9C,4EAA4E;IAC5E,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAGjF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,gBAAkC,EAClC,WAAwB;IAExB,MAAM,IAAI,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC3C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uDAAuD;YACvD,0BAA0B;YAC1B,mDAAmD;YACnD,iDAAiD;YACjD,sCAAsC;YACtC,2CAA2C;YAC3C,iFAAiF,CAClF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAK,aAAa;QACtB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/D,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,CAAC,KAAK,CAAC,uCAAuC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IAEpE,4EAA4E;IAC5E,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,WAAwB;IAChD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,EAAE,CAAC;IACxD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,WAAW,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC"}
@@ -5,11 +5,20 @@
5
5
  * methods — no new business logic. Results are returned as JSON text so the
6
6
  * MCP client (Claude Desktop) can process structured data.
7
7
  *
8
+ * Every tool enforces per-user access control via `services/access-control.ts`.
9
+ * Callers (the HTTP /mcp route, the stdio MCP server) must resolve a user
10
+ * identity before registering tools — `registerTools` requires a user in its
11
+ * `McpAccessContext` argument so there is no anonymous MCP path.
12
+ *
8
13
  * Note: `inputSchema` is cast to `any` at each call site because the MCP SDK's
9
14
  * ZodRawShapeCompat type does not accept ZodObject in TypeScript's strict mode.
10
15
  * Runtime schema validation is handled correctly by the SDK regardless.
11
16
  */
12
17
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
13
18
  import { WorkspaceManager } from '../core/workspace-manager.js';
14
- import type { AuthService } from '../services/auth-service.js';
15
- export declare function registerTools(server: McpServer, wm: WorkspaceManager, authService?: AuthService | null): void;
19
+ import type { AuthService, AuthUser } from '../services/auth-service.js';
20
+ /** The resolved caller identity for an MCP session. */
21
+ export interface McpAccessContext {
22
+ user: AuthUser;
23
+ }
24
+ export declare function registerTools(server: McpServer, wm: WorkspaceManager, authService: AuthService, ctx: McpAccessContext): void;