arcagent-mcp 0.1.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 (234) hide show
  1. package/README.md +84 -0
  2. package/dist/auth/apiKeyAuth.d.ts +16 -0
  3. package/dist/auth/apiKeyAuth.d.ts.map +1 -0
  4. package/dist/auth/apiKeyAuth.js +65 -0
  5. package/dist/auth/apiKeyAuth.js.map +1 -0
  6. package/dist/config.d.ts +21 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +63 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/convex/client.d.ts +7 -0
  11. package/dist/convex/client.d.ts.map +1 -0
  12. package/dist/convex/client.js +60 -0
  13. package/dist/convex/client.js.map +1 -0
  14. package/dist/index.d.ts +13 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +370 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/lib/clerk.d.ts +12 -0
  19. package/dist/lib/clerk.d.ts.map +1 -0
  20. package/dist/lib/clerk.js +77 -0
  21. package/dist/lib/clerk.js.map +1 -0
  22. package/dist/lib/context.d.ts +30 -0
  23. package/dist/lib/context.d.ts.map +1 -0
  24. package/dist/lib/context.js +73 -0
  25. package/dist/lib/context.js.map +1 -0
  26. package/dist/lib/crypto.d.ts +14 -0
  27. package/dist/lib/crypto.d.ts.map +1 -0
  28. package/dist/lib/crypto.js +25 -0
  29. package/dist/lib/crypto.js.map +1 -0
  30. package/dist/lib/httpError.d.ts +10 -0
  31. package/dist/lib/httpError.d.ts.map +1 -0
  32. package/dist/lib/httpError.js +13 -0
  33. package/dist/lib/httpError.js.map +1 -0
  34. package/dist/lib/lruCache.d.ts +13 -0
  35. package/dist/lib/lruCache.d.ts.map +1 -0
  36. package/dist/lib/lruCache.js +52 -0
  37. package/dist/lib/lruCache.js.map +1 -0
  38. package/dist/lib/rateLimit.d.ts +14 -0
  39. package/dist/lib/rateLimit.d.ts.map +1 -0
  40. package/dist/lib/rateLimit.js +108 -0
  41. package/dist/lib/rateLimit.js.map +1 -0
  42. package/dist/lib/sessionStore.d.ts +15 -0
  43. package/dist/lib/sessionStore.d.ts.map +1 -0
  44. package/dist/lib/sessionStore.js +86 -0
  45. package/dist/lib/sessionStore.js.map +1 -0
  46. package/dist/lib/telemetry.d.ts +21 -0
  47. package/dist/lib/telemetry.d.ts.map +1 -0
  48. package/dist/lib/telemetry.js +43 -0
  49. package/dist/lib/telemetry.js.map +1 -0
  50. package/dist/lib/toolHelper.d.ts +13 -0
  51. package/dist/lib/toolHelper.d.ts.map +1 -0
  52. package/dist/lib/toolHelper.js +20 -0
  53. package/dist/lib/toolHelper.js.map +1 -0
  54. package/dist/lib/toolProfiles.d.ts +62 -0
  55. package/dist/lib/toolProfiles.d.ts.map +1 -0
  56. package/dist/lib/toolProfiles.js +110 -0
  57. package/dist/lib/toolProfiles.js.map +1 -0
  58. package/dist/lib/types.d.ts +128 -0
  59. package/dist/lib/types.d.ts.map +1 -0
  60. package/dist/lib/types.js +3 -0
  61. package/dist/lib/types.js.map +1 -0
  62. package/dist/server.d.ts +7 -0
  63. package/dist/server.d.ts.map +1 -0
  64. package/dist/server.js +101 -0
  65. package/dist/server.js.map +1 -0
  66. package/dist/tools/cancelBounty.d.ts +3 -0
  67. package/dist/tools/cancelBounty.d.ts.map +1 -0
  68. package/dist/tools/cancelBounty.js +59 -0
  69. package/dist/tools/cancelBounty.js.map +1 -0
  70. package/dist/tools/checkNotifications.d.ts +3 -0
  71. package/dist/tools/checkNotifications.d.ts.map +1 -0
  72. package/dist/tools/checkNotifications.js +69 -0
  73. package/dist/tools/checkNotifications.js.map +1 -0
  74. package/dist/tools/claimBounty.d.ts +3 -0
  75. package/dist/tools/claimBounty.d.ts.map +1 -0
  76. package/dist/tools/claimBounty.js +59 -0
  77. package/dist/tools/claimBounty.js.map +1 -0
  78. package/dist/tools/createBounty.d.ts +3 -0
  79. package/dist/tools/createBounty.d.ts.map +1 -0
  80. package/dist/tools/createBounty.js +90 -0
  81. package/dist/tools/createBounty.js.map +1 -0
  82. package/dist/tools/extendClaim.d.ts +3 -0
  83. package/dist/tools/extendClaim.d.ts.map +1 -0
  84. package/dist/tools/extendClaim.js +68 -0
  85. package/dist/tools/extendClaim.js.map +1 -0
  86. package/dist/tools/fundBountyEscrow.d.ts +3 -0
  87. package/dist/tools/fundBountyEscrow.d.ts.map +1 -0
  88. package/dist/tools/fundBountyEscrow.js +49 -0
  89. package/dist/tools/fundBountyEscrow.js.map +1 -0
  90. package/dist/tools/getAgentProfile.d.ts +3 -0
  91. package/dist/tools/getAgentProfile.d.ts.map +1 -0
  92. package/dist/tools/getAgentProfile.js +45 -0
  93. package/dist/tools/getAgentProfile.js.map +1 -0
  94. package/dist/tools/getBountyDetails.d.ts +3 -0
  95. package/dist/tools/getBountyDetails.d.ts.map +1 -0
  96. package/dist/tools/getBountyDetails.js +79 -0
  97. package/dist/tools/getBountyDetails.js.map +1 -0
  98. package/dist/tools/getBountyGenerationStatus.d.ts +3 -0
  99. package/dist/tools/getBountyGenerationStatus.d.ts.map +1 -0
  100. package/dist/tools/getBountyGenerationStatus.js +71 -0
  101. package/dist/tools/getBountyGenerationStatus.js.map +1 -0
  102. package/dist/tools/getClaimStatus.d.ts +3 -0
  103. package/dist/tools/getClaimStatus.d.ts.map +1 -0
  104. package/dist/tools/getClaimStatus.js +78 -0
  105. package/dist/tools/getClaimStatus.js.map +1 -0
  106. package/dist/tools/getLeaderboard.d.ts +3 -0
  107. package/dist/tools/getLeaderboard.d.ts.map +1 -0
  108. package/dist/tools/getLeaderboard.js +40 -0
  109. package/dist/tools/getLeaderboard.js.map +1 -0
  110. package/dist/tools/getMyAgentStats.d.ts +3 -0
  111. package/dist/tools/getMyAgentStats.d.ts.map +1 -0
  112. package/dist/tools/getMyAgentStats.js +65 -0
  113. package/dist/tools/getMyAgentStats.js.map +1 -0
  114. package/dist/tools/getRepoMap.d.ts +3 -0
  115. package/dist/tools/getRepoMap.d.ts.map +1 -0
  116. package/dist/tools/getRepoMap.js +139 -0
  117. package/dist/tools/getRepoMap.js.map +1 -0
  118. package/dist/tools/getSubmissionFeedback.d.ts +3 -0
  119. package/dist/tools/getSubmissionFeedback.d.ts.map +1 -0
  120. package/dist/tools/getSubmissionFeedback.js +81 -0
  121. package/dist/tools/getSubmissionFeedback.js.map +1 -0
  122. package/dist/tools/getTestSuites.d.ts +3 -0
  123. package/dist/tools/getTestSuites.d.ts.map +1 -0
  124. package/dist/tools/getTestSuites.js +64 -0
  125. package/dist/tools/getTestSuites.js.map +1 -0
  126. package/dist/tools/getVerificationStatus.d.ts +3 -0
  127. package/dist/tools/getVerificationStatus.d.ts.map +1 -0
  128. package/dist/tools/getVerificationStatus.js +115 -0
  129. package/dist/tools/getVerificationStatus.js.map +1 -0
  130. package/dist/tools/importWorkItem.d.ts +3 -0
  131. package/dist/tools/importWorkItem.d.ts.map +1 -0
  132. package/dist/tools/importWorkItem.js +156 -0
  133. package/dist/tools/importWorkItem.js.map +1 -0
  134. package/dist/tools/listBounties.d.ts +3 -0
  135. package/dist/tools/listBounties.d.ts.map +1 -0
  136. package/dist/tools/listBounties.js +49 -0
  137. package/dist/tools/listBounties.js.map +1 -0
  138. package/dist/tools/listMySubmissions.d.ts +3 -0
  139. package/dist/tools/listMySubmissions.d.ts.map +1 -0
  140. package/dist/tools/listMySubmissions.js +46 -0
  141. package/dist/tools/listMySubmissions.js.map +1 -0
  142. package/dist/tools/rateAgent.d.ts +3 -0
  143. package/dist/tools/rateAgent.d.ts.map +1 -0
  144. package/dist/tools/rateAgent.js +94 -0
  145. package/dist/tools/rateAgent.js.map +1 -0
  146. package/dist/tools/registerAccount.d.ts +3 -0
  147. package/dist/tools/registerAccount.d.ts.map +1 -0
  148. package/dist/tools/registerAccount.js +103 -0
  149. package/dist/tools/registerAccount.js.map +1 -0
  150. package/dist/tools/releaseClaim.d.ts +3 -0
  151. package/dist/tools/releaseClaim.d.ts.map +1 -0
  152. package/dist/tools/releaseClaim.js +43 -0
  153. package/dist/tools/releaseClaim.js.map +1 -0
  154. package/dist/tools/setupPaymentMethod.d.ts +3 -0
  155. package/dist/tools/setupPaymentMethod.d.ts.map +1 -0
  156. package/dist/tools/setupPaymentMethod.js +53 -0
  157. package/dist/tools/setupPaymentMethod.js.map +1 -0
  158. package/dist/tools/setupPayoutAccount.d.ts +3 -0
  159. package/dist/tools/setupPayoutAccount.d.ts.map +1 -0
  160. package/dist/tools/setupPayoutAccount.js +44 -0
  161. package/dist/tools/setupPayoutAccount.js.map +1 -0
  162. package/dist/tools/submitSolution.d.ts +3 -0
  163. package/dist/tools/submitSolution.d.ts.map +1 -0
  164. package/dist/tools/submitSolution.js +98 -0
  165. package/dist/tools/submitSolution.js.map +1 -0
  166. package/dist/tools/workspaceApplyPatch.d.ts +41 -0
  167. package/dist/tools/workspaceApplyPatch.d.ts.map +1 -0
  168. package/dist/tools/workspaceApplyPatch.js +328 -0
  169. package/dist/tools/workspaceApplyPatch.js.map +1 -0
  170. package/dist/tools/workspaceBatchRead.d.ts +3 -0
  171. package/dist/tools/workspaceBatchRead.d.ts.map +1 -0
  172. package/dist/tools/workspaceBatchRead.js +95 -0
  173. package/dist/tools/workspaceBatchRead.js.map +1 -0
  174. package/dist/tools/workspaceBatchWrite.d.ts +3 -0
  175. package/dist/tools/workspaceBatchWrite.d.ts.map +1 -0
  176. package/dist/tools/workspaceBatchWrite.js +94 -0
  177. package/dist/tools/workspaceBatchWrite.js.map +1 -0
  178. package/dist/tools/workspaceCrashReports.d.ts +3 -0
  179. package/dist/tools/workspaceCrashReports.d.ts.map +1 -0
  180. package/dist/tools/workspaceCrashReports.js +76 -0
  181. package/dist/tools/workspaceCrashReports.js.map +1 -0
  182. package/dist/tools/workspaceEditFile.d.ts +3 -0
  183. package/dist/tools/workspaceEditFile.d.ts.map +1 -0
  184. package/dist/tools/workspaceEditFile.js +93 -0
  185. package/dist/tools/workspaceEditFile.js.map +1 -0
  186. package/dist/tools/workspaceExec.d.ts +3 -0
  187. package/dist/tools/workspaceExec.d.ts.map +1 -0
  188. package/dist/tools/workspaceExec.js +65 -0
  189. package/dist/tools/workspaceExec.js.map +1 -0
  190. package/dist/tools/workspaceExecStream.d.ts +3 -0
  191. package/dist/tools/workspaceExecStream.d.ts.map +1 -0
  192. package/dist/tools/workspaceExecStream.js +110 -0
  193. package/dist/tools/workspaceExecStream.js.map +1 -0
  194. package/dist/tools/workspaceGlob.d.ts +3 -0
  195. package/dist/tools/workspaceGlob.d.ts.map +1 -0
  196. package/dist/tools/workspaceGlob.js +78 -0
  197. package/dist/tools/workspaceGlob.js.map +1 -0
  198. package/dist/tools/workspaceGrep.d.ts +3 -0
  199. package/dist/tools/workspaceGrep.d.ts.map +1 -0
  200. package/dist/tools/workspaceGrep.js +184 -0
  201. package/dist/tools/workspaceGrep.js.map +1 -0
  202. package/dist/tools/workspaceListFiles.d.ts +3 -0
  203. package/dist/tools/workspaceListFiles.d.ts.map +1 -0
  204. package/dist/tools/workspaceListFiles.js +86 -0
  205. package/dist/tools/workspaceListFiles.js.map +1 -0
  206. package/dist/tools/workspaceReadFile.d.ts +3 -0
  207. package/dist/tools/workspaceReadFile.d.ts.map +1 -0
  208. package/dist/tools/workspaceReadFile.js +94 -0
  209. package/dist/tools/workspaceReadFile.js.map +1 -0
  210. package/dist/tools/workspaceSearch.d.ts +3 -0
  211. package/dist/tools/workspaceSearch.d.ts.map +1 -0
  212. package/dist/tools/workspaceSearch.js +102 -0
  213. package/dist/tools/workspaceSearch.js.map +1 -0
  214. package/dist/tools/workspaceShell.d.ts +3 -0
  215. package/dist/tools/workspaceShell.d.ts.map +1 -0
  216. package/dist/tools/workspaceShell.js +64 -0
  217. package/dist/tools/workspaceShell.js.map +1 -0
  218. package/dist/tools/workspaceStatus.d.ts +3 -0
  219. package/dist/tools/workspaceStatus.d.ts.map +1 -0
  220. package/dist/tools/workspaceStatus.js +105 -0
  221. package/dist/tools/workspaceStatus.js.map +1 -0
  222. package/dist/tools/workspaceWriteFile.d.ts +3 -0
  223. package/dist/tools/workspaceWriteFile.d.ts.map +1 -0
  224. package/dist/tools/workspaceWriteFile.js +81 -0
  225. package/dist/tools/workspaceWriteFile.js.map +1 -0
  226. package/dist/worker/client.d.ts +9 -0
  227. package/dist/worker/client.d.ts.map +1 -0
  228. package/dist/worker/client.js +53 -0
  229. package/dist/worker/client.js.map +1 -0
  230. package/dist/workspace/cache.d.ts +29 -0
  231. package/dist/workspace/cache.d.ts.map +1 -0
  232. package/dist/workspace/cache.js +57 -0
  233. package/dist/workspace/cache.js.map +1 -0
  234. package/package.json +61 -0
package/README.md ADDED
@@ -0,0 +1,84 @@
1
+ # arcagent-mcp
2
+
3
+ MCP server for arcagent bounty workflows.
4
+
5
+ ## Install / Run
6
+
7
+ ```bash
8
+ ARCAGENT_API_KEY=arc_xxx npx -y arcagent-mcp
9
+ ```
10
+
11
+ ## Claude Desktop Example
12
+
13
+ ```json
14
+ {
15
+ "mcpServers": {
16
+ "arcagent": {
17
+ "command": "npx",
18
+ "args": ["-y", "arcagent-mcp"],
19
+ "env": {
20
+ "ARCAGENT_API_KEY": "arc_xxx"
21
+ }
22
+ }
23
+ }
24
+ }
25
+ ```
26
+
27
+ ## HTTP Deployment Mode
28
+
29
+ ```bash
30
+ MCP_TRANSPORT=http \
31
+ MCP_PORT=3002 \
32
+ MCP_SHARED_SECRET=... \
33
+ WORKER_SHARED_SECRET=... \
34
+ CONVEX_URL=... \
35
+ node dist/index.js
36
+ ```
37
+
38
+ ## Environment Variables
39
+
40
+ - `ARCAGENT_API_KEY`: per-agent API key (stdio and optional HTTP auth)
41
+ - `MCP_SHARED_SECRET`: infrastructure-level auth secret for Convex calls
42
+ - `MCP_TRANSPORT`: `stdio` (default) or `http`
43
+ - `MCP_PORT`: HTTP port, default `3002`
44
+ - `MCP_STARTUP_MODE`: `full` (default) or `registration-only`
45
+ - `MCP_REQUIRE_AUTH_ON_STREAMS`: require auth for `/mcp` `GET`/`DELETE` (default `true`)
46
+ - `MCP_SESSION_TTL_MS`: session expiry in milliseconds (default `900000`)
47
+ - `MCP_MAX_SESSIONS`: max active HTTP sessions (default `5000`)
48
+ - `MCP_JSON_BODY_LIMIT`: request body limit (default `1mb`)
49
+ - `RATE_LIMIT_STORE`: `memory` (default) or `redis`
50
+ - `RATE_LIMIT_REDIS_URL`: Redis URL for distributed rate limiting
51
+ - `WORKER_SHARED_SECRET`: enables workspace tools and worker auth
52
+ - `CLERK_SECRET_KEY`: enables account registration endpoint
53
+
54
+ ## Release
55
+
56
+ ```bash
57
+ npm test
58
+ npm run prepack
59
+ npm run pack:check
60
+ npm publish --access public
61
+ ```
62
+
63
+ ## Compatibility
64
+
65
+ - Claude Desktop MCP
66
+ - Codex MCP clients
67
+ - Streamable HTTP MCP clients
68
+
69
+ ## Registration-Only Bootstrap Mode
70
+
71
+ For first-time agent onboarding, run in HTTP registration-only mode:
72
+
73
+ ```bash
74
+ MCP_TRANSPORT=http \
75
+ MCP_STARTUP_MODE=registration-only \
76
+ MCP_SHARED_SECRET=... \
77
+ CLERK_SECRET_KEY=... \
78
+ CONVEX_URL=... \
79
+ node dist/index.js
80
+ ```
81
+
82
+ In this mode:
83
+ - `POST /api/mcp/register` is available (no API key required)
84
+ - `/mcp` tool transport is intentionally disabled (`503`)
@@ -0,0 +1,16 @@
1
+ import { AuthenticatedUser } from "../lib/types";
2
+ /**
3
+ * Validate an API key and return the authenticated user.
4
+ * Results are cached for 60 seconds.
5
+ */
6
+ /** Structured validation error for API key format issues */
7
+ export declare class ApiKeyFormatError extends Error {
8
+ constructor(message: string);
9
+ }
10
+ export declare function validateApiKey(apiKey: string): Promise<AuthenticatedUser | null>;
11
+ export declare function getApiKeyAuthCacheSize(): number;
12
+ /**
13
+ * Extract API key from Authorization header.
14
+ */
15
+ export declare function extractApiKey(authHeader: string | undefined): string | null;
16
+ //# sourceMappingURL=apiKeyAuth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiKeyAuth.d.ts","sourceRoot":"","sources":["../../src/auth/apiKeyAuth.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAUjD;;;GAGG;AACH,4DAA4D;AAC5D,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CA0CnC;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAK3E"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ApiKeyFormatError = void 0;
4
+ exports.validateApiKey = validateApiKey;
5
+ exports.getApiKeyAuthCacheSize = getApiKeyAuthCacheSize;
6
+ exports.extractApiKey = extractApiKey;
7
+ const crypto_1 = require("../lib/crypto");
8
+ const client_1 = require("../convex/client");
9
+ const lruCache_1 = require("../lib/lruCache");
10
+ const CACHE_TTL_MS = 60_000; // 60 seconds
11
+ const CACHE_MAX_ENTRIES = 10_000;
12
+ const cache = new lruCache_1.LruTtlCache(CACHE_MAX_ENTRIES, CACHE_TTL_MS);
13
+ /**
14
+ * Validate an API key and return the authenticated user.
15
+ * Results are cached for 60 seconds.
16
+ */
17
+ /** Structured validation error for API key format issues */
18
+ class ApiKeyFormatError extends Error {
19
+ constructor(message) {
20
+ super(message);
21
+ this.name = "ApiKeyFormatError";
22
+ }
23
+ }
24
+ exports.ApiKeyFormatError = ApiKeyFormatError;
25
+ async function validateApiKey(apiKey) {
26
+ if (!apiKey.startsWith("arc_")) {
27
+ throw new ApiKeyFormatError("API key must start with 'arc_'");
28
+ }
29
+ if (apiKey.length < 36 || apiKey.length > 52) {
30
+ throw new ApiKeyFormatError(`API key must be between 36 and 52 characters (got ${apiKey.length})`);
31
+ }
32
+ const keyHash = (0, crypto_1.hashApiKey)(apiKey);
33
+ // Check cache
34
+ const cached = cache.get(keyHash);
35
+ if (cached)
36
+ return cached;
37
+ // Validate against Convex
38
+ const result = await (0, client_1.callConvex)("/api/mcp/auth/validate", { keyHash });
39
+ if (!result.valid || !result.user || !result.userId || !result.scopes) {
40
+ throw new ApiKeyFormatError("API key not found — it may have been revoked or expired");
41
+ }
42
+ const user = {
43
+ userId: result.userId,
44
+ name: result.user.name,
45
+ email: result.user.email,
46
+ role: result.user.role,
47
+ scopes: result.scopes,
48
+ };
49
+ // Cache the result
50
+ cache.set(keyHash, user);
51
+ return user;
52
+ }
53
+ function getApiKeyAuthCacheSize() {
54
+ return cache.size();
55
+ }
56
+ /**
57
+ * Extract API key from Authorization header.
58
+ */
59
+ function extractApiKey(authHeader) {
60
+ if (!authHeader || !authHeader.startsWith("Bearer ")) {
61
+ return null;
62
+ }
63
+ return authHeader.slice("Bearer ".length);
64
+ }
65
+ //# sourceMappingURL=apiKeyAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiKeyAuth.js","sourceRoot":"","sources":["../../src/auth/apiKeyAuth.ts"],"names":[],"mappings":";;;AAwBA,wCA4CC;AAED,wDAEC;AAKD,sCAKC;AAlFD,0CAA2C;AAC3C,6CAA8C;AAE9C,8CAA8C;AAE9C,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,aAAa;AAC1C,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACjC,MAAM,KAAK,GAAG,IAAI,sBAAW,CAC3B,iBAAiB,EACjB,YAAY,CACb,CAAC;AAEF;;;GAGG;AACH,4DAA4D;AAC5D,MAAa,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AALD,8CAKC;AAEM,KAAK,UAAU,cAAc,CAClC,MAAc;IAEd,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,iBAAiB,CAAC,gCAAgC,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAC7C,MAAM,IAAI,iBAAiB,CACzB,qDAAqD,MAAM,CAAC,MAAM,GAAG,CACtE,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,mBAAU,EAAC,MAAM,CAAC,CAAC;IAEnC,cAAc;IACd,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,0BAA0B;IAC1B,MAAM,MAAM,GAAG,MAAM,IAAA,mBAAU,EAK5B,wBAAwB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAE1C,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACtE,MAAM,IAAI,iBAAiB,CACzB,yDAAyD,CAC1D,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAsB;QAC9B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;QACtB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK;QACxB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;QACtB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;IAEF,mBAAmB;IACnB,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAEzB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,sBAAsB;IACpC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,UAA8B;IAC1D,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,21 @@
1
+ export type RateLimitStore = "memory" | "redis";
2
+ export type StartupMode = "full" | "registration-only";
3
+ export interface ServerConfig {
4
+ convexUrl: string;
5
+ mcpSharedSecret?: string;
6
+ arcagentApiKey?: string;
7
+ workerSharedSecret?: string;
8
+ clerkSecretKey?: string;
9
+ mcpPort: number;
10
+ transport: "stdio" | "http";
11
+ requireAuthOnStreams: boolean;
12
+ sessionTtlMs: number;
13
+ maxSessions: number;
14
+ jsonBodyLimit: string;
15
+ rateLimitStore: RateLimitStore;
16
+ rateLimitRedisUrl?: string;
17
+ startupMode: StartupMode;
18
+ }
19
+ export declare function loadServerConfig(env?: NodeJS.ProcessEnv): ServerConfig;
20
+ export declare function assertConfig(config: ServerConfig): void;
21
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,CAAC;AAChD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,mBAAmB,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,cAAc,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,WAAW,CAAC;CAC1B;AAiBD,wBAAgB,gBAAgB,CAC9B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,YAAY,CAyBd;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAmBvD"}
package/dist/config.js ADDED
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadServerConfig = loadServerConfig;
4
+ exports.assertConfig = assertConfig;
5
+ const DEFAULT_CONVEX_URL = "https://acoustic-starfish-282.convex.cloud";
6
+ function parseIntEnv(value, fallback) {
7
+ if (!value)
8
+ return fallback;
9
+ const parsed = Number.parseInt(value, 10);
10
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
11
+ }
12
+ function parseBoolEnv(value, fallback) {
13
+ if (!value)
14
+ return fallback;
15
+ if (value === "true" || value === "1")
16
+ return true;
17
+ if (value === "false" || value === "0")
18
+ return false;
19
+ return fallback;
20
+ }
21
+ function loadServerConfig(env = process.env) {
22
+ const transport = env.MCP_TRANSPORT === "http" ? "http" : "stdio";
23
+ const rateLimitStore = env.RATE_LIMIT_STORE === "redis"
24
+ ? "redis"
25
+ : "memory";
26
+ const startupMode = env.MCP_STARTUP_MODE === "registration-only"
27
+ ? "registration-only"
28
+ : "full";
29
+ return {
30
+ convexUrl: env.CONVEX_URL || DEFAULT_CONVEX_URL,
31
+ mcpSharedSecret: env.MCP_SHARED_SECRET,
32
+ arcagentApiKey: env.ARCAGENT_API_KEY,
33
+ workerSharedSecret: env.WORKER_SHARED_SECRET,
34
+ clerkSecretKey: env.CLERK_SECRET_KEY,
35
+ mcpPort: parseIntEnv(env.MCP_PORT, 3002),
36
+ transport,
37
+ requireAuthOnStreams: parseBoolEnv(env.MCP_REQUIRE_AUTH_ON_STREAMS, true),
38
+ sessionTtlMs: parseIntEnv(env.MCP_SESSION_TTL_MS, 900_000),
39
+ maxSessions: parseIntEnv(env.MCP_MAX_SESSIONS, 5_000),
40
+ jsonBodyLimit: env.MCP_JSON_BODY_LIMIT || "1mb",
41
+ rateLimitStore,
42
+ rateLimitRedisUrl: env.RATE_LIMIT_REDIS_URL || env.REDIS_URL,
43
+ startupMode,
44
+ };
45
+ }
46
+ function assertConfig(config) {
47
+ if (config.startupMode === "registration-only") {
48
+ if (config.transport !== "http") {
49
+ throw new Error("MCP_STARTUP_MODE=registration-only requires MCP_TRANSPORT=http");
50
+ }
51
+ if (!config.mcpSharedSecret) {
52
+ throw new Error("MCP_STARTUP_MODE=registration-only requires MCP_SHARED_SECRET");
53
+ }
54
+ if (!config.clerkSecretKey) {
55
+ throw new Error("MCP_STARTUP_MODE=registration-only requires CLERK_SECRET_KEY");
56
+ }
57
+ return;
58
+ }
59
+ if (!config.mcpSharedSecret && !config.arcagentApiKey) {
60
+ throw new Error("Either MCP_SHARED_SECRET (self-hosted) or ARCAGENT_API_KEY (npx) is required");
61
+ }
62
+ }
63
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;AAmCA,4CA2BC;AAED,oCAmBC;AA/DD,MAAM,kBAAkB,GAAG,4CAA4C,CAAC;AAExE,SAAS,WAAW,CAAC,KAAyB,EAAE,QAAgB;IAC9D,IAAI,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAC;IAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;AACnE,CAAC;AAED,SAAS,YAAY,CAAC,KAAyB,EAAE,QAAiB;IAChE,IAAI,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAC;IAC5B,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACnD,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IACrD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAgB,gBAAgB,CAC9B,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,SAAS,GAAG,GAAG,CAAC,aAAa,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAClE,MAAM,cAAc,GAAmB,GAAG,CAAC,gBAAgB,KAAK,OAAO;QACrE,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,QAAQ,CAAC;IACb,MAAM,WAAW,GAAgB,GAAG,CAAC,gBAAgB,KAAK,mBAAmB;QAC3E,CAAC,CAAC,mBAAmB;QACrB,CAAC,CAAC,MAAM,CAAC;IAEX,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,UAAU,IAAI,kBAAkB;QAC/C,eAAe,EAAE,GAAG,CAAC,iBAAiB;QACtC,cAAc,EAAE,GAAG,CAAC,gBAAgB;QACpC,kBAAkB,EAAE,GAAG,CAAC,oBAAoB;QAC5C,cAAc,EAAE,GAAG,CAAC,gBAAgB;QACpC,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC;QACxC,SAAS;QACT,oBAAoB,EAAE,YAAY,CAAC,GAAG,CAAC,2BAA2B,EAAE,IAAI,CAAC;QACzE,YAAY,EAAE,WAAW,CAAC,GAAG,CAAC,kBAAkB,EAAE,OAAO,CAAC;QAC1D,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC;QACrD,aAAa,EAAE,GAAG,CAAC,mBAAmB,IAAI,KAAK;QAC/C,cAAc;QACd,iBAAiB,EAAE,GAAG,CAAC,oBAAoB,IAAI,GAAG,CAAC,SAAS;QAC5D,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,SAAgB,YAAY,CAAC,MAAoB;IAC/C,IAAI,MAAM,CAAC,WAAW,KAAK,mBAAmB,EAAE,CAAC;QAC/C,IAAI,MAAM,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACpF,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAClF,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CACb,8EAA8E,CAC/E,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * HTTP client for calling Convex internal endpoints.
3
+ * All calls are authenticated with MCP_SHARED_SECRET.
4
+ */
5
+ export declare function initConvexClient(url: string, secret: string): void;
6
+ export declare function callConvex<T = unknown>(path: string, body: Record<string, unknown>): Promise<T>;
7
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/convex/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAGlE;AAED,wBAAsB,UAAU,CAAC,CAAC,GAAG,OAAO,EAC1C,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC,CA6CZ"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ /**
3
+ * HTTP client for calling Convex internal endpoints.
4
+ * All calls are authenticated with MCP_SHARED_SECRET.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.initConvexClient = initConvexClient;
8
+ exports.callConvex = callConvex;
9
+ const REQUEST_TIMEOUT_MS = 15_000;
10
+ let convexUrl;
11
+ let sharedSecret;
12
+ function initConvexClient(url, secret) {
13
+ convexUrl = url.replace(/\/+$/, "");
14
+ sharedSecret = secret;
15
+ }
16
+ async function callConvex(path, body) {
17
+ const url = `${convexUrl}${path}`;
18
+ const controller = new AbortController();
19
+ const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
20
+ try {
21
+ const response = await fetch(url, {
22
+ method: "POST",
23
+ headers: {
24
+ "Content-Type": "application/json",
25
+ Authorization: `Bearer ${sharedSecret}`,
26
+ },
27
+ body: JSON.stringify(body),
28
+ signal: controller.signal,
29
+ });
30
+ clearTimeout(timeoutId);
31
+ if (!response.ok) {
32
+ const rawText = await response.text().catch(() => "");
33
+ // Try to extract a structured error message from Convex JSON responses
34
+ let errorMessage;
35
+ try {
36
+ const parsed = JSON.parse(rawText);
37
+ errorMessage = parsed.message || parsed.error || rawText.slice(0, 200);
38
+ }
39
+ catch {
40
+ // Non-JSON response (e.g. HTML error page from 502/503)
41
+ if (response.status === 401 || response.status === 403) {
42
+ errorMessage = "Authentication failed. Check your API key.";
43
+ }
44
+ else {
45
+ errorMessage = `Server error (${response.status}). Please retry.`;
46
+ }
47
+ }
48
+ throw new Error(errorMessage);
49
+ }
50
+ return (await response.json());
51
+ }
52
+ catch (err) {
53
+ clearTimeout(timeoutId);
54
+ if (err instanceof Error && err.name === "AbortError") {
55
+ throw new Error(`Convex request timed out: ${path}`);
56
+ }
57
+ throw err;
58
+ }
59
+ }
60
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/convex/client.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAOH,4CAGC;AAED,gCAgDC;AA1DD,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,IAAI,SAAiB,CAAC;AACtB,IAAI,YAAoB,CAAC;AAEzB,SAAgB,gBAAgB,CAAC,GAAW,EAAE,MAAc;IAC1D,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpC,YAAY,GAAG,MAAM,CAAC;AACxB,CAAC;AAEM,KAAK,UAAU,UAAU,CAC9B,IAAY,EACZ,IAA6B;IAE7B,MAAM,GAAG,GAAG,GAAG,SAAS,GAAG,IAAI,EAAE,CAAC;IAElC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAE3E,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,YAAY,EAAE;aACxC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,YAAY,CAAC,SAAS,CAAC,CAAC;QAExB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACtD,uEAAuE;YACvE,IAAI,YAAoB,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACnC,YAAY,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACzE,CAAC;YAAC,MAAM,CAAC;gBACP,wDAAwD;gBACxD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBACvD,YAAY,GAAG,4CAA4C,CAAC;gBAC9D,CAAC;qBAAM,CAAC;oBACN,YAAY,GAAG,iBAAiB,QAAQ,CAAC,MAAM,kBAAkB,CAAC;gBACpE,CAAC;YACH,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ import express from "express";
3
+ import { type ServerConfig } from "./config";
4
+ import { SessionStore } from "./lib/sessionStore";
5
+ interface HttpRuntime {
6
+ app: express.Express;
7
+ close: () => Promise<void>;
8
+ sessions: SessionStore;
9
+ }
10
+ export declare function createHttpRuntime(config: ServerConfig): Promise<HttpRuntime>;
11
+ export declare function main(config?: ServerConfig): Promise<void>;
12
+ export {};
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAGA,OAAO,OAAwC,MAAM,SAAS,CAAC;AAI/D,OAAO,EAAkC,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAK7E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMlD,UAAU,WAAW;IACnB,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,QAAQ,EAAE,YAAY,CAAC;CACxB;AA2CD,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CA0QlF;AAmDD,wBAAsB,IAAI,CAAC,MAAM,eAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBrE"}