@tokenfactory/acc-mcp-server 0.1.0-internal → 0.1.2-internal

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.
package/dist/cli.d.ts CHANGED
@@ -6,5 +6,6 @@ interface ParsedArgs {
6
6
  publicUrl: string;
7
7
  }
8
8
  export declare function parseArgs(argv: string[]): ParsedArgs;
9
+ export declare function isExecutedDirectly(): boolean;
9
10
  export {};
10
11
  //# sourceMappingURL=cli.d.ts.map
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAwBA,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA0BpD"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AA0BA,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA0BpD;AAqCD,wBAAgB,kBAAkB,IAAI,OAAO,CAQ5C"}
package/dist/cli.js CHANGED
@@ -17,6 +17,8 @@
17
17
  * the subprocess lifetime — see MCP_SERVER.md "Security notes" for the
18
18
  * v0.6 hardening plan.
19
19
  */
20
+ import { realpathSync } from "node:fs";
21
+ import { pathToFileURL } from "node:url";
20
22
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
21
23
  import { buildServer } from "./server.js";
22
24
  import { createMcpClient, resolveSupabaseConfig } from "./supabase.js";
@@ -68,9 +70,27 @@ async function main() {
68
70
  }
69
71
  // Only run when executed directly. Importers (tests) get the parse helper
70
72
  // and `main` without side effects.
71
- const isDirectRun = import.meta.url === `file://${process.argv[1]}` ||
72
- import.meta.url.endsWith(process.argv[1] ?? "");
73
- if (isDirectRun) {
73
+ //
74
+ // The naïve `import.meta.url === \`file://${process.argv[1]}\`` heuristic
75
+ // silently returns false in three real scenarios — losing every spawn:
76
+ // 1. npm bin symlink (acc-mcp-server) where argv[1] is the symlink and
77
+ // import.meta.url resolves to the install path.
78
+ // 2. `npx -y @tokenfactory/acc-mcp-server` (same symlink case).
79
+ // 3. Spaces in the install path: argv[1] is the raw path while
80
+ // import.meta.url URL-encodes the space as %20.
81
+ // realpathSync handles (1) and (2); pathToFileURL handles (3).
82
+ export function isExecutedDirectly() {
83
+ try {
84
+ if (!process.argv[1])
85
+ return false;
86
+ const realArgv1 = realpathSync(process.argv[1]);
87
+ return import.meta.url === pathToFileURL(realArgv1).href;
88
+ }
89
+ catch {
90
+ return false;
91
+ }
92
+ }
93
+ if (isExecutedDirectly()) {
74
94
  main().catch((err) => {
75
95
  process.stderr.write(`[acc-mcp-server] fatal: ${err.message ?? String(err)}\n`);
76
96
  process.exit(1);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../src/supabase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE1E,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAMD,wBAAgB,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,cAAc,CAMnE;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,CAYzE"}
1
+ {"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../src/supabase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG1E,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAcD,wBAAgB,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,cAAc,CAYnE;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,CAYzE"}
package/dist/supabase.js CHANGED
@@ -12,14 +12,29 @@
12
12
  * when spawning us.
13
13
  */
14
14
  import { createClient } from "@supabase/supabase-js";
15
+ import WebSocket from "ws";
15
16
  // The MCP server speaks the acc schema. Supabase's generic types model
16
17
  // the default schema name in their type parameters, so we cast through
17
18
  // `unknown` to land on the canonical SupabaseClient<...> type that the
18
19
  // tool impls consume.
20
+ //
21
+ // `realtime.transport` is pinned to the `ws` package because
22
+ // @supabase/supabase-js's RealtimeClient initializes eagerly at
23
+ // createClient() time and Node 20 lacks a Supabase-recognized WebSocket
24
+ // global — without an explicit transport, construction throws
25
+ // "Node.js 20 detected without native WebSocket support" and the whole
26
+ // MCP subprocess dies before stdio is wired. Same fix as
27
+ // @tokenfactory/acc-runner v0.2.2.
19
28
  export function createMcpClient(cfg) {
20
29
  return createClient(cfg.supabaseUrl, cfg.anonKey, {
21
30
  db: { schema: "acc" },
22
31
  auth: { persistSession: false, autoRefreshToken: false },
32
+ realtime: {
33
+ // any-allowed: ws's type matches Node, not the browser WebSocket
34
+ // interface Supabase's option signature is declared against.
35
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
36
+ transport: WebSocket,
37
+ },
23
38
  global: { headers: { Authorization: `Bearer ${cfg.accessToken}` } },
24
39
  });
25
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"supabase.js","sourceRoot":"","sources":["../src/supabase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,YAAY,EAAuB,MAAM,uBAAuB,CAAC;AAQ1E,uEAAuE;AACvE,uEAAuE;AACvE,uEAAuE;AACvE,sBAAsB;AACtB,MAAM,UAAU,eAAe,CAAC,GAAmB;IACjD,OAAO,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,OAAO,EAAE;QAChD,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QACrB,IAAI,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE;QACxD,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,GAAG,CAAC,WAAW,EAAE,EAAE,EAAE;KACpE,CAA8B,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,WAAmB;IACvD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC;IACnF,MAAM,OAAO,GACX,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAC7B,OAAO,CAAC,GAAG,CAAC,qBAAqB;QACjC,EAAE,CAAC;IACL,IAAI,CAAC,WAAW,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,oFAAoF,CACrF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"supabase.js","sourceRoot":"","sources":["../src/supabase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,YAAY,EAAuB,MAAM,uBAAuB,CAAC;AAC1E,OAAO,SAAS,MAAM,IAAI,CAAC;AAQ3B,uEAAuE;AACvE,uEAAuE;AACvE,uEAAuE;AACvE,sBAAsB;AACtB,EAAE;AACF,6DAA6D;AAC7D,gEAAgE;AAChE,wEAAwE;AACxE,8DAA8D;AAC9D,uEAAuE;AACvE,yDAAyD;AACzD,mCAAmC;AACnC,MAAM,UAAU,eAAe,CAAC,GAAmB;IACjD,OAAO,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,OAAO,EAAE;QAChD,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QACrB,IAAI,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE;QACxD,QAAQ,EAAE;YACR,iEAAiE;YACjE,6DAA6D;YAC7D,8DAA8D;YAC9D,SAAS,EAAE,SAAgB;SAC5B;QACD,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,GAAG,CAAC,WAAW,EAAE,EAAE,EAAE;KACpE,CAA8B,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,WAAmB;IACvD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC;IACnF,MAAM,OAAO,GACX,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAC7B,OAAO,CAAC,GAAG,CAAC,qBAAqB;QACjC,EAAE,CAAC;IACL,IAAI,CAAC,WAAW,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,oFAAoF,CACrF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AAC/C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tokenfactory/acc-mcp-server",
3
- "version": "0.1.0-internal",
3
+ "version": "0.1.2-internal",
4
4
  "description": "Agent Control Center MCP server. Stdio-transport subprocess spawned by acc-runner alongside Claude Code; exposes read-only ACC tools and telemeters every call to acc.mcp_tool_calls.",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,
@@ -24,10 +24,12 @@
24
24
  "dependencies": {
25
25
  "@modelcontextprotocol/sdk": "1.29.0",
26
26
  "@supabase/supabase-js": "^2.105.3",
27
+ "ws": "^8.20.0",
27
28
  "zod": "^3.25.28"
28
29
  },
29
30
  "devDependencies": {
30
31
  "@types/node": "^25.6.0",
32
+ "@types/ws": "^8.18.1",
31
33
  "typescript": "^5.6.3",
32
34
  "vitest": "^1.6.1"
33
35
  }