@opendatalabs/personal-server-ts-core 0.2.0 → 1.0.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 (340) hide show
  1. package/dist/api/index.d.ts +160 -0
  2. package/dist/api/index.d.ts.map +1 -0
  3. package/dist/api/index.js +774 -0
  4. package/dist/api/index.js.map +1 -0
  5. package/dist/auth/index.d.ts +2 -0
  6. package/dist/auth/index.d.ts.map +1 -0
  7. package/dist/auth/index.js +2 -0
  8. package/dist/auth/index.js.map +1 -0
  9. package/dist/auth/request.d.ts +28 -0
  10. package/dist/auth/request.d.ts.map +1 -0
  11. package/dist/auth/request.js +106 -0
  12. package/dist/auth/request.js.map +1 -0
  13. package/dist/client.d.ts +233 -0
  14. package/dist/client.d.ts.map +1 -0
  15. package/dist/client.js +243 -0
  16. package/dist/client.js.map +1 -0
  17. package/dist/config/defaults.d.ts +5 -5
  18. package/dist/config/defaults.d.ts.map +1 -1
  19. package/dist/config/defaults.js +3 -5
  20. package/dist/config/defaults.js.map +1 -1
  21. package/dist/config/index.d.ts +0 -1
  22. package/dist/config/index.d.ts.map +1 -1
  23. package/dist/config/index.js +0 -1
  24. package/dist/config/index.js.map +1 -1
  25. package/dist/config/paths.d.ts.map +1 -1
  26. package/dist/config/paths.js +1 -9
  27. package/dist/config/paths.js.map +1 -1
  28. package/dist/contracts/access-logs.d.ts +8 -0
  29. package/dist/contracts/access-logs.d.ts.map +1 -0
  30. package/dist/contracts/access-logs.js +7 -0
  31. package/dist/contracts/access-logs.js.map +1 -0
  32. package/dist/contracts/auth-device.d.ts +70 -0
  33. package/dist/contracts/auth-device.d.ts.map +1 -0
  34. package/dist/contracts/auth-device.js +163 -0
  35. package/dist/contracts/auth-device.js.map +1 -0
  36. package/dist/contracts/binary.d.ts +54 -0
  37. package/dist/contracts/binary.d.ts.map +1 -0
  38. package/dist/contracts/binary.js +92 -0
  39. package/dist/contracts/binary.js.map +1 -0
  40. package/dist/contracts/config.d.ts +5 -0
  41. package/dist/contracts/config.d.ts.map +1 -0
  42. package/dist/contracts/config.js +30 -0
  43. package/dist/contracts/config.js.map +1 -0
  44. package/dist/contracts/data.d.ts +115 -0
  45. package/dist/contracts/data.d.ts.map +1 -0
  46. package/dist/contracts/data.js +237 -0
  47. package/dist/contracts/data.js.map +1 -0
  48. package/dist/contracts/grants.d.ts +45 -0
  49. package/dist/contracts/grants.d.ts.map +1 -0
  50. package/dist/contracts/grants.js +177 -0
  51. package/dist/contracts/grants.js.map +1 -0
  52. package/dist/contracts/http.d.ts +21 -0
  53. package/dist/contracts/http.d.ts.map +1 -0
  54. package/dist/contracts/http.js +49 -0
  55. package/dist/contracts/http.js.map +1 -0
  56. package/dist/contracts/index.d.ts +16 -0
  57. package/dist/contracts/index.d.ts.map +1 -0
  58. package/dist/contracts/index.js +10 -0
  59. package/dist/contracts/index.js.map +1 -0
  60. package/dist/contracts/oauth.d.ts +38 -0
  61. package/dist/contracts/oauth.d.ts.map +1 -0
  62. package/dist/contracts/oauth.js +130 -0
  63. package/dist/contracts/oauth.js.map +1 -0
  64. package/dist/contracts/sync.d.ts +10 -0
  65. package/dist/contracts/sync.d.ts.map +1 -0
  66. package/dist/contracts/sync.js +34 -0
  67. package/dist/contracts/sync.js.map +1 -0
  68. package/dist/errors/catalog.d.ts +9 -0
  69. package/dist/errors/catalog.d.ts.map +1 -1
  70. package/dist/errors/catalog.js +15 -0
  71. package/dist/errors/catalog.js.map +1 -1
  72. package/dist/grants/index.d.ts +2 -4
  73. package/dist/grants/index.d.ts.map +1 -1
  74. package/dist/grants/index.js +1 -2
  75. package/dist/grants/index.js.map +1 -1
  76. package/dist/keys/index.d.ts +1 -2
  77. package/dist/keys/index.d.ts.map +1 -1
  78. package/dist/keys/index.js +1 -2
  79. package/dist/keys/index.js.map +1 -1
  80. package/dist/keys/server-account.d.ts +5 -9
  81. package/dist/keys/server-account.d.ts.map +1 -1
  82. package/dist/keys/server-account.js +1 -47
  83. package/dist/keys/server-account.js.map +1 -1
  84. package/dist/logger/index.d.ts +6 -2
  85. package/dist/logger/index.d.ts.map +1 -1
  86. package/dist/logger/index.js +2 -6
  87. package/dist/logger/index.js.map +1 -1
  88. package/dist/logging/access-log.d.ts +0 -1
  89. package/dist/logging/access-log.d.ts.map +1 -1
  90. package/dist/logging/access-log.js +1 -24
  91. package/dist/logging/access-log.js.map +1 -1
  92. package/dist/logging/access-reader.d.ts +0 -5
  93. package/dist/logging/access-reader.d.ts.map +1 -1
  94. package/dist/logging/access-reader.js +1 -49
  95. package/dist/logging/access-reader.js.map +1 -1
  96. package/dist/mcp/activity.d.ts +68 -0
  97. package/dist/mcp/activity.d.ts.map +1 -0
  98. package/dist/mcp/activity.js +111 -0
  99. package/dist/mcp/activity.js.map +1 -0
  100. package/dist/mcp/builder-registration.d.ts +24 -0
  101. package/dist/mcp/builder-registration.d.ts.map +1 -0
  102. package/dist/mcp/builder-registration.js +89 -0
  103. package/dist/mcp/builder-registration.js.map +1 -0
  104. package/dist/mcp/connection-api.d.ts +170 -0
  105. package/dist/mcp/connection-api.d.ts.map +1 -0
  106. package/dist/mcp/connection-api.js +379 -0
  107. package/dist/mcp/connection-api.js.map +1 -0
  108. package/dist/mcp/grantee.d.ts +52 -0
  109. package/dist/mcp/grantee.d.ts.map +1 -0
  110. package/dist/mcp/grantee.js +91 -0
  111. package/dist/mcp/grantee.js.map +1 -0
  112. package/dist/mcp/index.d.ts +10 -0
  113. package/dist/mcp/index.d.ts.map +1 -0
  114. package/dist/mcp/index.js +10 -0
  115. package/dist/mcp/index.js.map +1 -0
  116. package/dist/mcp/read-client.d.ts +136 -0
  117. package/dist/mcp/read-client.d.ts.map +1 -0
  118. package/dist/mcp/read-client.js +306 -0
  119. package/dist/mcp/read-client.js.map +1 -0
  120. package/dist/mcp/resources.d.ts +37 -0
  121. package/dist/mcp/resources.d.ts.map +1 -0
  122. package/dist/mcp/resources.js +114 -0
  123. package/dist/mcp/resources.js.map +1 -0
  124. package/dist/mcp/search/index.d.ts +34 -0
  125. package/dist/mcp/search/index.d.ts.map +1 -0
  126. package/dist/mcp/search/index.js +69 -0
  127. package/dist/mcp/search/index.js.map +1 -0
  128. package/dist/mcp/server.d.ts +53 -0
  129. package/dist/mcp/server.d.ts.map +1 -0
  130. package/dist/mcp/server.js +308 -0
  131. package/dist/mcp/server.js.map +1 -0
  132. package/dist/mcp/store.d.ts +13 -0
  133. package/dist/mcp/store.d.ts.map +1 -0
  134. package/dist/mcp/store.js +98 -0
  135. package/dist/mcp/store.js.map +1 -0
  136. package/dist/mcp/tools.d.ts +60 -0
  137. package/dist/mcp/tools.d.ts.map +1 -0
  138. package/dist/mcp/tools.js +1058 -0
  139. package/dist/mcp/tools.js.map +1 -0
  140. package/dist/mcp/types.d.ts +97 -0
  141. package/dist/mcp/types.d.ts.map +1 -0
  142. package/dist/mcp/types.js +24 -0
  143. package/dist/mcp/types.js.map +1 -0
  144. package/dist/payment/index.d.ts +2 -0
  145. package/dist/payment/index.d.ts.map +1 -0
  146. package/dist/payment/index.js +2 -0
  147. package/dist/payment/index.js.map +1 -0
  148. package/dist/payment/x402.d.ts +155 -0
  149. package/dist/payment/x402.d.ts.map +1 -0
  150. package/dist/payment/x402.js +402 -0
  151. package/dist/payment/x402.js.map +1 -0
  152. package/dist/policy/data-read.d.ts +15 -0
  153. package/dist/policy/data-read.d.ts.map +1 -0
  154. package/dist/policy/data-read.js +84 -0
  155. package/dist/policy/data-read.js.map +1 -0
  156. package/dist/policy/index.d.ts +2 -0
  157. package/dist/policy/index.d.ts.map +1 -0
  158. package/dist/policy/index.js +2 -0
  159. package/dist/policy/index.js.map +1 -0
  160. package/dist/ports/index.d.ts +95 -0
  161. package/dist/ports/index.d.ts.map +1 -0
  162. package/dist/ports/index.js +7 -0
  163. package/dist/ports/index.js.map +1 -0
  164. package/dist/schemas/server-config.d.ts +12 -0
  165. package/dist/schemas/server-config.d.ts.map +1 -1
  166. package/dist/schemas/server-config.js +34 -4
  167. package/dist/schemas/server-config.js.map +1 -1
  168. package/dist/signing/index.d.ts +0 -1
  169. package/dist/signing/index.d.ts.map +1 -1
  170. package/dist/signing/index.js +0 -1
  171. package/dist/signing/index.js.map +1 -1
  172. package/dist/signing/request-signer.d.ts +8 -2
  173. package/dist/signing/request-signer.d.ts.map +1 -1
  174. package/dist/signing/request-signer.js +5 -31
  175. package/dist/signing/request-signer.js.map +1 -1
  176. package/dist/signing/signer.d.ts +20 -2
  177. package/dist/signing/signer.d.ts.map +1 -1
  178. package/dist/signing/signer.js +23 -13
  179. package/dist/signing/signer.js.map +1 -1
  180. package/dist/storage/adapters/index.d.ts +2 -1
  181. package/dist/storage/adapters/index.d.ts.map +1 -1
  182. package/dist/storage/adapters/index.js +2 -1
  183. package/dist/storage/adapters/index.js.map +1 -1
  184. package/dist/storage/adapters/interface.d.ts +10 -0
  185. package/dist/storage/adapters/interface.d.ts.map +1 -1
  186. package/dist/storage/adapters/sdk.d.ts +23 -0
  187. package/dist/storage/adapters/sdk.d.ts.map +1 -0
  188. package/dist/storage/adapters/sdk.js +73 -0
  189. package/dist/storage/adapters/sdk.js.map +1 -0
  190. package/dist/storage/adapters/vana.d.ts +7 -30
  191. package/dist/storage/adapters/vana.d.ts.map +1 -1
  192. package/dist/storage/adapters/vana.js +37 -92
  193. package/dist/storage/adapters/vana.js.map +1 -1
  194. package/dist/storage/blocks/build.d.ts +20 -0
  195. package/dist/storage/blocks/build.d.ts.map +1 -0
  196. package/dist/storage/blocks/build.js +378 -0
  197. package/dist/storage/blocks/build.js.map +1 -0
  198. package/dist/storage/blocks/cursor.d.ts +33 -0
  199. package/dist/storage/blocks/cursor.d.ts.map +1 -0
  200. package/dist/storage/blocks/cursor.js +142 -0
  201. package/dist/storage/blocks/cursor.js.map +1 -0
  202. package/dist/storage/blocks/errors.d.ts +6 -0
  203. package/dist/storage/blocks/errors.d.ts.map +1 -0
  204. package/dist/storage/blocks/errors.js +9 -0
  205. package/dist/storage/blocks/errors.js.map +1 -0
  206. package/dist/storage/blocks/index.d.ts +5 -0
  207. package/dist/storage/blocks/index.d.ts.map +1 -0
  208. package/dist/storage/blocks/index.js +4 -0
  209. package/dist/storage/blocks/index.js.map +1 -0
  210. package/dist/storage/blocks/types.d.ts +49 -0
  211. package/dist/storage/blocks/types.d.ts.map +1 -0
  212. package/dist/storage/blocks/types.js +2 -0
  213. package/dist/{grants → storage/blocks}/types.js.map +1 -1
  214. package/dist/storage/hierarchy/index.d.ts +0 -1
  215. package/dist/storage/hierarchy/index.d.ts.map +1 -1
  216. package/dist/storage/hierarchy/index.js +0 -1
  217. package/dist/storage/hierarchy/index.js.map +1 -1
  218. package/dist/storage/hierarchy/manager.d.ts +0 -14
  219. package/dist/storage/hierarchy/manager.d.ts.map +1 -1
  220. package/dist/storage/hierarchy/manager.js +1 -59
  221. package/dist/storage/hierarchy/manager.js.map +1 -1
  222. package/dist/storage/hierarchy/paths.d.ts.map +1 -1
  223. package/dist/storage/hierarchy/paths.js +11 -4
  224. package/dist/storage/hierarchy/paths.js.map +1 -1
  225. package/dist/storage/index/index.d.ts +2 -3
  226. package/dist/storage/index/index.d.ts.map +1 -1
  227. package/dist/storage/index/index.js +1 -2
  228. package/dist/storage/index/index.js.map +1 -1
  229. package/dist/storage/index/manager.d.ts +26 -6
  230. package/dist/storage/index/manager.d.ts.map +1 -1
  231. package/dist/storage/index/manager.js +1 -131
  232. package/dist/storage/index/manager.js.map +1 -1
  233. package/dist/storage/index/schema.d.ts +1 -3
  234. package/dist/storage/index/schema.d.ts.map +1 -1
  235. package/dist/storage/index/schema.js +1 -26
  236. package/dist/storage/index/schema.js.map +1 -1
  237. package/dist/storage/index/types.d.ts +16 -0
  238. package/dist/storage/index/types.d.ts.map +1 -1
  239. package/dist/storage/preview.d.ts +12 -0
  240. package/dist/storage/preview.d.ts.map +1 -0
  241. package/dist/storage/preview.js +239 -0
  242. package/dist/storage/preview.js.map +1 -0
  243. package/dist/sync/cursor.d.ts +5 -7
  244. package/dist/sync/cursor.d.ts.map +1 -1
  245. package/dist/sync/cursor.js +1 -18
  246. package/dist/sync/cursor.js.map +1 -1
  247. package/dist/sync/engine/sync-manager.d.ts +17 -0
  248. package/dist/sync/engine/sync-manager.d.ts.map +1 -1
  249. package/dist/sync/engine/sync-manager.js +104 -43
  250. package/dist/sync/engine/sync-manager.js.map +1 -1
  251. package/dist/sync/index.d.ts +4 -2
  252. package/dist/sync/index.d.ts.map +1 -1
  253. package/dist/sync/index.js +1 -1
  254. package/dist/sync/index.js.map +1 -1
  255. package/dist/sync/issues.d.ts +55 -0
  256. package/dist/sync/issues.d.ts.map +1 -0
  257. package/dist/sync/issues.js +168 -0
  258. package/dist/sync/issues.js.map +1 -0
  259. package/dist/sync/retry-memory.d.ts +33 -0
  260. package/dist/sync/retry-memory.d.ts.map +1 -0
  261. package/dist/sync/retry-memory.js +68 -0
  262. package/dist/sync/retry-memory.js.map +1 -0
  263. package/dist/sync/types.d.ts +9 -24
  264. package/dist/sync/types.d.ts.map +1 -1
  265. package/dist/sync/workers/delete.d.ts +42 -0
  266. package/dist/sync/workers/delete.d.ts.map +1 -0
  267. package/dist/sync/workers/delete.js +40 -0
  268. package/dist/sync/workers/delete.js.map +1 -0
  269. package/dist/sync/workers/download.d.ts +64 -18
  270. package/dist/sync/workers/download.d.ts.map +1 -1
  271. package/dist/sync/workers/download.js +396 -54
  272. package/dist/sync/workers/download.js.map +1 -1
  273. package/dist/sync/workers/upload.d.ts +29 -18
  274. package/dist/sync/workers/upload.d.ts.map +1 -1
  275. package/dist/sync/workers/upload.js +163 -46
  276. package/dist/sync/workers/upload.js.map +1 -1
  277. package/dist/test-utils/wallet.d.ts +1 -0
  278. package/dist/test-utils/wallet.d.ts.map +1 -1
  279. package/dist/test-utils/wallet.js +9 -31
  280. package/dist/test-utils/wallet.js.map +1 -1
  281. package/package.json +51 -27
  282. package/dist/auth/web3-signed.d.ts +0 -48
  283. package/dist/auth/web3-signed.d.ts.map +0 -1
  284. package/dist/auth/web3-signed.js +0 -110
  285. package/dist/auth/web3-signed.js.map +0 -1
  286. package/dist/config/loader.d.ts +0 -8
  287. package/dist/config/loader.d.ts.map +0 -1
  288. package/dist/config/loader.js +0 -38
  289. package/dist/config/loader.js.map +0 -1
  290. package/dist/gateway/client.d.ts +0 -98
  291. package/dist/gateway/client.d.ts.map +0 -1
  292. package/dist/gateway/client.js +0 -171
  293. package/dist/gateway/client.js.map +0 -1
  294. package/dist/grants/eip712.d.ts +0 -28
  295. package/dist/grants/eip712.d.ts.map +0 -1
  296. package/dist/grants/eip712.js +0 -30
  297. package/dist/grants/eip712.js.map +0 -1
  298. package/dist/grants/types.d.ts +0 -29
  299. package/dist/grants/types.d.ts.map +0 -1
  300. package/dist/grants/types.js +0 -6
  301. package/dist/grants/verify.d.ts +0 -24
  302. package/dist/grants/verify.d.ts.map +0 -1
  303. package/dist/grants/verify.js +0 -71
  304. package/dist/grants/verify.js.map +0 -1
  305. package/dist/keys/derive.d.ts +0 -18
  306. package/dist/keys/derive.d.ts.map +0 -1
  307. package/dist/keys/derive.js +0 -43
  308. package/dist/keys/derive.js.map +0 -1
  309. package/dist/schemas/data-file.d.ts +0 -20
  310. package/dist/schemas/data-file.d.ts.map +0 -1
  311. package/dist/schemas/data-file.js +0 -23
  312. package/dist/schemas/data-file.js.map +0 -1
  313. package/dist/scopes/index.d.ts +0 -3
  314. package/dist/scopes/index.d.ts.map +0 -1
  315. package/dist/scopes/index.js +0 -3
  316. package/dist/scopes/index.js.map +0 -1
  317. package/dist/scopes/match.d.ts +0 -13
  318. package/dist/scopes/match.d.ts.map +0 -1
  319. package/dist/scopes/match.js +0 -23
  320. package/dist/scopes/match.js.map +0 -1
  321. package/dist/scopes/parse.d.ts +0 -12
  322. package/dist/scopes/parse.d.ts.map +0 -1
  323. package/dist/scopes/parse.js +0 -29
  324. package/dist/scopes/parse.js.map +0 -1
  325. package/dist/signing/eip712.d.ts +0 -69
  326. package/dist/signing/eip712.d.ts.map +0 -1
  327. package/dist/signing/eip712.js +0 -68
  328. package/dist/signing/eip712.js.map +0 -1
  329. package/dist/storage/encryption/decrypt.d.ts +0 -10
  330. package/dist/storage/encryption/decrypt.d.ts.map +0 -1
  331. package/dist/storage/encryption/decrypt.js +0 -19
  332. package/dist/storage/encryption/decrypt.js.map +0 -1
  333. package/dist/storage/encryption/encrypt.d.ts +0 -10
  334. package/dist/storage/encryption/encrypt.d.ts.map +0 -1
  335. package/dist/storage/encryption/encrypt.js +0 -19
  336. package/dist/storage/encryption/encrypt.js.map +0 -1
  337. package/dist/storage/encryption/index.d.ts +0 -3
  338. package/dist/storage/encryption/index.d.ts.map +0 -1
  339. package/dist/storage/encryption/index.js +0 -3
  340. package/dist/storage/encryption/index.js.map +0 -1
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Owner-only MCP connection management. Implements the four endpoints listed
3
+ * in §2 of 260604-PLAN-vana-mcp-personal-server.md:
4
+ *
5
+ * POST /v1/mcp/connections
6
+ * GET /v1/mcp/connections
7
+ * POST /v1/mcp/connections/:id/approve
8
+ * DELETE /v1/mcp/connections/:id
9
+ *
10
+ * These endpoints DO NOT read user data. They only manage connection records
11
+ * — create the per-connection grantee/token, store grant ids after the user
12
+ * approves them, and mark connections revoked.
13
+ */
14
+ import type { DataPortabilityGatewayConfig, GatewayClient } from "@opendatalabs/vana-sdk/browser";
15
+ import type { ServerSigner } from "../signing/index.js";
16
+ import type { McpConnectionRecord, McpConnectionStore, McpConnectionGrant, McpOAuthAuthorizationRecord, McpOAuthAuthorizationStore } from "./types.js";
17
+ export declare function hashConnectionToken(token: string): Promise<string>;
18
+ export interface CreateMcpConnectionInput {
19
+ displayName?: string;
20
+ }
21
+ export interface CreateMcpConnectionOutput {
22
+ connectionId: string;
23
+ granteeAddress: `0x${string}`;
24
+ /** Raw token. Returned ONCE — the store keeps only the SHA-256 hash. */
25
+ connectionToken: string;
26
+ /** Convenience: the full URL Claude should call. */
27
+ mcpUrl: string;
28
+ createdAt: string;
29
+ }
30
+ export interface CreateMcpConnectionOptions {
31
+ store: McpConnectionStore;
32
+ /**
33
+ * Public origin Claude will hit. Used to build the returned `mcpUrl`. The
34
+ * caller (route handler) typically resolves this from the request's public
35
+ * URL (relay) at call time.
36
+ */
37
+ publicOrigin: string;
38
+ now?: () => Date;
39
+ }
40
+ export declare function createMcpConnection(input: CreateMcpConnectionInput, options: CreateMcpConnectionOptions): Promise<CreateMcpConnectionOutput>;
41
+ export declare function buildMcpUrl(publicOrigin: string, token: string): string;
42
+ export declare function buildStableMcpUrl(publicOrigin: string): string;
43
+ export declare function buildMcpProtectedResourceMetadataUrl(publicOrigin: string): string;
44
+ export interface ApproveMcpConnectionInput {
45
+ connectionId: string;
46
+ grants: McpConnectionGrant[];
47
+ }
48
+ export interface ApproveMcpConnectionOptions {
49
+ store: McpConnectionStore;
50
+ now?: () => Date;
51
+ }
52
+ export declare class McpConnectionNotFoundError extends Error {
53
+ connectionId: string;
54
+ constructor(connectionId: string);
55
+ }
56
+ export declare class McpConnectionStateError extends Error {
57
+ connectionId: string;
58
+ state: string;
59
+ expected: string;
60
+ constructor(connectionId: string, state: string, expected: string);
61
+ }
62
+ export declare function approveMcpConnection(input: ApproveMcpConnectionInput, options: ApproveMcpConnectionOptions): Promise<McpConnectionRecord>;
63
+ export interface RevokeMcpConnectionOptions {
64
+ store: McpConnectionStore;
65
+ now?: () => Date;
66
+ }
67
+ export declare function revokeMcpConnection(connectionId: string, options: RevokeMcpConnectionOptions): Promise<McpConnectionRecord>;
68
+ /**
69
+ * Public representation of a connection — never includes the encrypted
70
+ * private key or token hash. Safe to return to owner clients (Vana Web).
71
+ */
72
+ export interface McpConnectionView {
73
+ id: string;
74
+ displayName: string;
75
+ granteeAddress: `0x${string}`;
76
+ status: "pending" | "approved" | "revoked";
77
+ grants: McpConnectionGrant[];
78
+ createdAt: string;
79
+ approvedAt?: string;
80
+ revokedAt?: string;
81
+ lastUsedAt?: string;
82
+ }
83
+ export declare function toMcpConnectionView(record: McpConnectionRecord): McpConnectionView;
84
+ export declare function listMcpConnectionViews(store: McpConnectionStore): Promise<McpConnectionView[]>;
85
+ export interface CreateMcpOAuthAuthorizationInput {
86
+ clientId: string;
87
+ redirectUri: string;
88
+ codeChallenge: string;
89
+ codeChallengeMethod: string;
90
+ scope?: string;
91
+ state?: string;
92
+ }
93
+ export interface CreateMcpOAuthAuthorizationOptions {
94
+ connectionStore: McpConnectionStore;
95
+ authorizationStore: McpOAuthAuthorizationStore;
96
+ publicOrigin: string;
97
+ now?: () => Date;
98
+ }
99
+ export interface CreateMcpOAuthAuthorizationOutput {
100
+ authorizationId: string;
101
+ connectionId: string;
102
+ granteeAddress: `0x${string}`;
103
+ expiresAt: string;
104
+ }
105
+ export declare class McpOAuthAuthorizationError extends Error {
106
+ code: string;
107
+ status: number;
108
+ body?: unknown | undefined;
109
+ constructor(code: string, message: string, status?: number, body?: unknown | undefined);
110
+ }
111
+ export declare function createMcpOAuthAuthorization(input: CreateMcpOAuthAuthorizationInput, options: CreateMcpOAuthAuthorizationOptions): Promise<CreateMcpOAuthAuthorizationOutput>;
112
+ export interface McpOAuthAuthorizationView {
113
+ id: string;
114
+ clientId: string;
115
+ redirectUri: string;
116
+ scope?: string;
117
+ state?: string;
118
+ connectionId: string;
119
+ granteeAddress: `0x${string}`;
120
+ status: McpOAuthAuthorizationRecord["status"];
121
+ createdAt: string;
122
+ expiresAt: string;
123
+ }
124
+ export declare function toMcpOAuthAuthorizationView(record: McpOAuthAuthorizationRecord): McpOAuthAuthorizationView;
125
+ export interface ApproveMcpOAuthAuthorizationInput {
126
+ authorizationId: string;
127
+ grants: McpConnectionGrant[];
128
+ }
129
+ export interface ApproveMcpOAuthAuthorizationScopesInput {
130
+ authorizationId: string;
131
+ scopes: string[];
132
+ expiresAt?: number;
133
+ nonce?: number;
134
+ }
135
+ export interface ApproveMcpOAuthAuthorizationOptions {
136
+ connectionStore: McpConnectionStore;
137
+ authorizationStore: McpOAuthAuthorizationStore;
138
+ now?: () => Date;
139
+ }
140
+ export interface ApproveMcpOAuthAuthorizationOutput {
141
+ redirectTo: string;
142
+ authorizationCode: string;
143
+ }
144
+ export declare function approveMcpOAuthAuthorization(input: ApproveMcpOAuthAuthorizationInput, options: ApproveMcpOAuthAuthorizationOptions): Promise<ApproveMcpOAuthAuthorizationOutput>;
145
+ export interface ApproveMcpOAuthAuthorizationScopesOptions extends ApproveMcpOAuthAuthorizationOptions {
146
+ gateway: Pick<GatewayClient, "getBuilder" | "createGrant">;
147
+ gatewayConfig: DataPortabilityGatewayConfig;
148
+ gatewayUrl: string;
149
+ serverOwner?: `0x${string}`;
150
+ serverSigner?: Pick<ServerSigner, "signGrantRegistration">;
151
+ fetch?: typeof fetch;
152
+ }
153
+ export declare function approveMcpOAuthAuthorizationWithScopes(input: ApproveMcpOAuthAuthorizationScopesInput, options: ApproveMcpOAuthAuthorizationScopesOptions): Promise<ApproveMcpOAuthAuthorizationOutput>;
154
+ export interface RedeemMcpOAuthAuthorizationCodeInput {
155
+ authorizationCode: string;
156
+ codeVerifier: string;
157
+ clientId: string;
158
+ redirectUri: string;
159
+ }
160
+ export interface RedeemMcpOAuthAuthorizationCodeOptions {
161
+ authorizationStore: McpOAuthAuthorizationStore;
162
+ connectionStore: McpConnectionStore;
163
+ now?: () => Date;
164
+ }
165
+ export interface RedeemMcpOAuthAuthorizationCodeOutput {
166
+ accessToken: string;
167
+ scope?: string;
168
+ }
169
+ export declare function redeemMcpOAuthAuthorizationCode(input: RedeemMcpOAuthAuthorizationCodeInput, options: RedeemMcpOAuthAuthorizationCodeOptions): Promise<RedeemMcpOAuthAuthorizationCodeOutput>;
170
+ //# sourceMappingURL=connection-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-api.d.ts","sourceRoot":"","sources":["../../src/mcp/connection-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EACV,4BAA4B,EAC5B,aAAa,EACd,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMxD,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,2BAA2B,EAC3B,0BAA0B,EAC3B,MAAM,YAAY,CAAC;AA4BpB,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIxE;AAYD,MAAM,WAAW,wBAAwB;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,yBAAyB;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,KAAK,MAAM,EAAE,CAAC;IAC9B,wEAAwE;IACxE,eAAe,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,kBAAkB,CAAC;IAC1B;;;;OAIG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,wBAAwB,EAC/B,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,yBAAyB,CAAC,CA4BpC;AAED,wBAAgB,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKvE;AAED,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAK9D;AAED,wBAAgB,oCAAoC,CAClD,YAAY,EAAE,MAAM,GACnB,MAAM,CAKR;AAED,MAAM,WAAW,yBAAyB;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,kBAAkB,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,qBAAa,0BAA2B,SAAQ,KAAK;IAChC,YAAY,EAAE,MAAM;gBAApB,YAAY,EAAE,MAAM;CAGxC;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IAEvC,YAAY,EAAE,MAAM;IACpB,KAAK,EAAE,MAAM;IACb,QAAQ,EAAE,MAAM;gBAFhB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM;CAI1B;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,yBAAyB,EAChC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,mBAAmB,CAAC,CAuB9B;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,wBAAsB,mBAAmB,CACvC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,mBAAmB,CAAC,CAW9B;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,KAAK,MAAM,EAAE,CAAC;IAC9B,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,mBAAmB,GAC1B,iBAAiB,CAYnB;AAED,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAG9B;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kCAAkC;IACjD,eAAe,EAAE,kBAAkB,CAAC;IACpC,kBAAkB,EAAE,0BAA0B,CAAC;IAC/C,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,iCAAiC;IAChD,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,KAAK,MAAM,EAAE,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,0BAA2B,SAAQ,KAAK;IAE1C,IAAI,EAAE,MAAM;IAEZ,MAAM;IACN,IAAI,CAAC,EAAE,OAAO;gBAHd,IAAI,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACR,MAAM,SAAM,EACZ,IAAI,CAAC,EAAE,OAAO,YAAA;CAKxB;AAED,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,gCAAgC,EACvC,OAAO,EAAE,kCAAkC,GAC1C,OAAO,CAAC,iCAAiC,CAAC,CA6D5C;AAED,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,KAAK,MAAM,EAAE,CAAC;IAC9B,MAAM,EAAE,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,2BAA2B,GAClC,yBAAyB,CAa3B;AAED,MAAM,WAAW,iCAAiC;IAChD,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,uCAAuC;IACtD,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mCAAmC;IAClD,eAAe,EAAE,kBAAkB,CAAC;IACpC,kBAAkB,EAAE,0BAA0B,CAAC;IAC/C,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,kCAAkC;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,iCAAiC,EACxC,OAAO,EAAE,mCAAmC,GAC3C,OAAO,CAAC,kCAAkC,CAAC,CAsD7C;AAED,MAAM,WAAW,yCAA0C,SAAQ,mCAAmC;IACpG,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,GAAG,aAAa,CAAC,CAAC;IAC3D,aAAa,EAAE,4BAA4B,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC5B,YAAY,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,uBAAuB,CAAC,CAAC;IAC3D,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,wBAAsB,sCAAsC,CAC1D,KAAK,EAAE,uCAAuC,EAC9C,OAAO,EAAE,yCAAyC,GACjD,OAAO,CAAC,kCAAkC,CAAC,CAqF7C;AAED,MAAM,WAAW,oCAAoC;IACnD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,sCAAsC;IACrD,kBAAkB,EAAE,0BAA0B,CAAC;IAC/C,eAAe,EAAE,kBAAkB,CAAC;IACpC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,qCAAqC;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,+BAA+B,CACnD,KAAK,EAAE,oCAAoC,EAC3C,OAAO,EAAE,sCAAsC,GAC9C,OAAO,CAAC,qCAAqC,CAAC,CAwEhD"}
@@ -0,0 +1,379 @@
1
+ /**
2
+ * Owner-only MCP connection management. Implements the four endpoints listed
3
+ * in §2 of 260604-PLAN-vana-mcp-personal-server.md:
4
+ *
5
+ * POST /v1/mcp/connections
6
+ * GET /v1/mcp/connections
7
+ * POST /v1/mcp/connections/:id/approve
8
+ * DELETE /v1/mcp/connections/:id
9
+ *
10
+ * These endpoints DO NOT read user data. They only manage connection records
11
+ * — create the per-connection grantee/token, store grant ids after the user
12
+ * approves them, and mark connections revoked.
13
+ */
14
+ import { generateMcpGrantee } from "./grantee.js";
15
+ import { createGrantContract } from "../contracts/index.js";
16
+ import { appUrlFromOAuthRedirectUri, ensureMcpGranteeRegistered, McpGranteeRegistrationError, } from "./builder-registration.js";
17
+ const TOKEN_BYTES = 32;
18
+ const OAUTH_AUTHORIZATION_TTL_MS = 10 * 60 * 1000;
19
+ function nowIso(now) {
20
+ return (now ? now() : new Date()).toISOString();
21
+ }
22
+ function randomBytes(byteLength) {
23
+ const bytes = new Uint8Array(byteLength);
24
+ globalThis.crypto.getRandomValues(bytes);
25
+ return bytes;
26
+ }
27
+ function bytesToHex(bytes) {
28
+ return Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
29
+ }
30
+ function bytesToBase64Url(bytes) {
31
+ let binary = "";
32
+ for (const byte of bytes)
33
+ binary += String.fromCharCode(byte);
34
+ // `btoa` exists in modern browsers AND Node ≥18 (the engines version that
35
+ // PS Lite and personal-server-ts already target).
36
+ const base64 = btoa(binary);
37
+ return base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
38
+ }
39
+ export async function hashConnectionToken(token) {
40
+ const data = new TextEncoder().encode(token);
41
+ const digest = await globalThis.crypto.subtle.digest("SHA-256", data);
42
+ return bytesToHex(new Uint8Array(digest));
43
+ }
44
+ function randomId() {
45
+ return (globalThis.crypto?.randomUUID?.() ?? `mcp-${bytesToHex(randomBytes(8))}`);
46
+ }
47
+ function randomToken() {
48
+ return bytesToBase64Url(randomBytes(TOKEN_BYTES));
49
+ }
50
+ export async function createMcpConnection(input, options) {
51
+ const grantee = generateMcpGrantee();
52
+ const token = randomToken();
53
+ const tokenHash = await hashConnectionToken(token);
54
+ const id = randomId();
55
+ const createdAt = nowIso(options.now);
56
+ const record = {
57
+ id,
58
+ displayName: input.displayName?.trim() || "Claude",
59
+ granteeAddress: grantee.key.address,
60
+ granteePublicKey: grantee.key.publicKey,
61
+ encryptedGranteePrivateKey: grantee.key.encryptedPrivateKey,
62
+ tokenHash,
63
+ status: "pending",
64
+ grants: [],
65
+ createdAt,
66
+ };
67
+ await options.store.create(record);
68
+ return {
69
+ connectionId: id,
70
+ granteeAddress: grantee.key.address,
71
+ connectionToken: token,
72
+ mcpUrl: buildMcpUrl(options.publicOrigin, token),
73
+ createdAt,
74
+ };
75
+ }
76
+ export function buildMcpUrl(publicOrigin, token) {
77
+ const base = publicOrigin.endsWith("/")
78
+ ? publicOrigin.slice(0, -1)
79
+ : publicOrigin;
80
+ return `${base}/mcp/${encodeURIComponent(token)}`;
81
+ }
82
+ export function buildStableMcpUrl(publicOrigin) {
83
+ const base = publicOrigin.endsWith("/")
84
+ ? publicOrigin.slice(0, -1)
85
+ : publicOrigin;
86
+ return `${base}/mcp`;
87
+ }
88
+ export function buildMcpProtectedResourceMetadataUrl(publicOrigin) {
89
+ const base = publicOrigin.endsWith("/")
90
+ ? publicOrigin.slice(0, -1)
91
+ : publicOrigin;
92
+ return `${base}/.well-known/oauth-protected-resource/mcp`;
93
+ }
94
+ export class McpConnectionNotFoundError extends Error {
95
+ connectionId;
96
+ constructor(connectionId) {
97
+ super(`mcp connection ${connectionId} not found`);
98
+ this.connectionId = connectionId;
99
+ }
100
+ }
101
+ export class McpConnectionStateError extends Error {
102
+ connectionId;
103
+ state;
104
+ expected;
105
+ constructor(connectionId, state, expected) {
106
+ super(`mcp connection ${connectionId} is ${state}; expected ${expected}`);
107
+ this.connectionId = connectionId;
108
+ this.state = state;
109
+ this.expected = expected;
110
+ }
111
+ }
112
+ export async function approveMcpConnection(input, options) {
113
+ const existing = await options.store.getById(input.connectionId);
114
+ if (!existing)
115
+ throw new McpConnectionNotFoundError(input.connectionId);
116
+ if (existing.status === "revoked") {
117
+ throw new McpConnectionStateError(input.connectionId, existing.status, "pending or approved");
118
+ }
119
+ if (!input.grants.length) {
120
+ throw new Error("approveMcpConnection requires at least one grant; the consent flow must mint grants first");
121
+ }
122
+ const approvedAt = nowIso(options.now);
123
+ const updated = await options.store.update(input.connectionId, {
124
+ status: "approved",
125
+ grants: input.grants,
126
+ approvedAt,
127
+ });
128
+ if (!updated)
129
+ throw new McpConnectionNotFoundError(input.connectionId);
130
+ return updated;
131
+ }
132
+ export async function revokeMcpConnection(connectionId, options) {
133
+ const existing = await options.store.getById(connectionId);
134
+ if (!existing)
135
+ throw new McpConnectionNotFoundError(connectionId);
136
+ if (existing.status === "revoked")
137
+ return existing;
138
+ const revokedAt = nowIso(options.now);
139
+ const updated = await options.store.update(connectionId, {
140
+ status: "revoked",
141
+ revokedAt,
142
+ });
143
+ if (!updated)
144
+ throw new McpConnectionNotFoundError(connectionId);
145
+ return updated;
146
+ }
147
+ export function toMcpConnectionView(record) {
148
+ return {
149
+ id: record.id,
150
+ displayName: record.displayName,
151
+ granteeAddress: record.granteeAddress,
152
+ status: record.status,
153
+ grants: record.grants,
154
+ createdAt: record.createdAt,
155
+ approvedAt: record.approvedAt,
156
+ revokedAt: record.revokedAt,
157
+ lastUsedAt: record.lastUsedAt,
158
+ };
159
+ }
160
+ export async function listMcpConnectionViews(store) {
161
+ const records = await store.list();
162
+ return records.map(toMcpConnectionView);
163
+ }
164
+ export class McpOAuthAuthorizationError extends Error {
165
+ code;
166
+ status;
167
+ body;
168
+ constructor(code, message, status = 400, body) {
169
+ super(message);
170
+ this.code = code;
171
+ this.status = status;
172
+ this.body = body;
173
+ this.name = "McpOAuthAuthorizationError";
174
+ }
175
+ }
176
+ export async function createMcpOAuthAuthorization(input, options) {
177
+ if (!input.clientId.trim()) {
178
+ throw new McpOAuthAuthorizationError("invalid_client", "client_id is required");
179
+ }
180
+ if (!input.redirectUri.trim()) {
181
+ throw new McpOAuthAuthorizationError("invalid_request", "redirect_uri is required");
182
+ }
183
+ if (!input.codeChallenge.trim()) {
184
+ throw new McpOAuthAuthorizationError("invalid_request", "code_challenge is required");
185
+ }
186
+ if (input.codeChallengeMethod !== "S256") {
187
+ throw new McpOAuthAuthorizationError("invalid_request", "Only S256 PKCE is supported");
188
+ }
189
+ const now = options.now ? options.now() : new Date();
190
+ const expiresAt = new Date(now.getTime() + OAUTH_AUTHORIZATION_TTL_MS).toISOString();
191
+ const created = await createMcpConnection({ displayName: "Claude" }, {
192
+ store: options.connectionStore,
193
+ publicOrigin: options.publicOrigin,
194
+ now: () => now,
195
+ });
196
+ const authorizationId = randomId();
197
+ const record = {
198
+ id: authorizationId,
199
+ clientId: input.clientId,
200
+ redirectUri: input.redirectUri,
201
+ codeChallenge: input.codeChallenge,
202
+ codeChallengeMethod: "S256",
203
+ ...(input.scope ? { scope: input.scope } : {}),
204
+ ...(input.state ? { state: input.state } : {}),
205
+ connectionId: created.connectionId,
206
+ granteeAddress: created.granteeAddress,
207
+ status: "pending",
208
+ createdAt: now.toISOString(),
209
+ expiresAt,
210
+ };
211
+ await options.authorizationStore.create(record);
212
+ return {
213
+ authorizationId,
214
+ connectionId: created.connectionId,
215
+ granteeAddress: created.granteeAddress,
216
+ expiresAt,
217
+ };
218
+ }
219
+ export function toMcpOAuthAuthorizationView(record) {
220
+ return {
221
+ id: record.id,
222
+ clientId: record.clientId,
223
+ redirectUri: record.redirectUri,
224
+ ...(record.scope ? { scope: record.scope } : {}),
225
+ ...(record.state ? { state: record.state } : {}),
226
+ connectionId: record.connectionId,
227
+ granteeAddress: record.granteeAddress,
228
+ status: record.status,
229
+ createdAt: record.createdAt,
230
+ expiresAt: record.expiresAt,
231
+ };
232
+ }
233
+ export async function approveMcpOAuthAuthorization(input, options) {
234
+ const record = await options.authorizationStore.getById(input.authorizationId);
235
+ if (!record) {
236
+ throw new McpOAuthAuthorizationError("not_found", `mcp oauth authorization ${input.authorizationId} not found`);
237
+ }
238
+ if (record.status !== "pending") {
239
+ throw new McpOAuthAuthorizationError("invalid_state", `mcp oauth authorization ${input.authorizationId} is ${record.status}; expected pending`);
240
+ }
241
+ if (Date.parse(record.expiresAt) <= (options.now?.() ?? new Date()).getTime()) {
242
+ await options.authorizationStore.update(record.id, { status: "expired" });
243
+ throw new McpOAuthAuthorizationError("expired", "MCP OAuth authorization expired before approval");
244
+ }
245
+ if (input.grants.length === 0) {
246
+ throw new McpOAuthAuthorizationError("grants_required", "Approve requires at least one grant");
247
+ }
248
+ await approveMcpConnection({ connectionId: record.connectionId, grants: input.grants }, { store: options.connectionStore, now: options.now });
249
+ const authorizationCode = randomToken();
250
+ const authorizationCodeHash = await hashMcpOAuthAuthorizationCode(authorizationCode);
251
+ const approvedAt = (options.now ? options.now() : new Date()).toISOString();
252
+ await options.authorizationStore.update(record.id, {
253
+ status: "approved",
254
+ approvedAt,
255
+ authorizationCodeHash,
256
+ });
257
+ const redirectTo = new URL(record.redirectUri);
258
+ redirectTo.searchParams.set("code", authorizationCode);
259
+ if (record.state) {
260
+ redirectTo.searchParams.set("state", record.state);
261
+ }
262
+ return { redirectTo: redirectTo.toString(), authorizationCode };
263
+ }
264
+ export async function approveMcpOAuthAuthorizationWithScopes(input, options) {
265
+ const record = await options.authorizationStore.getById(input.authorizationId);
266
+ if (!record) {
267
+ throw new McpOAuthAuthorizationError("not_found", `mcp oauth authorization ${input.authorizationId} not found`, 404);
268
+ }
269
+ if (!Array.isArray(input.scopes) || input.scopes.length === 0) {
270
+ throw new McpOAuthAuthorizationError("scopes_required", "Approve requires at least one scope");
271
+ }
272
+ const connection = await options.connectionStore.getById(record.connectionId);
273
+ if (!connection) {
274
+ throw new McpOAuthAuthorizationError("connection_not_found", `mcp connection ${record.connectionId} not found`, 404);
275
+ }
276
+ try {
277
+ await ensureMcpGranteeRegistered({
278
+ connection,
279
+ gateway: options.gateway,
280
+ gatewayConfig: options.gatewayConfig,
281
+ gatewayUrl: options.gatewayUrl,
282
+ appUrl: appUrlFromOAuthRedirectUri(record.redirectUri, record.clientId),
283
+ fetch: options.fetch,
284
+ });
285
+ }
286
+ catch (err) {
287
+ if (err instanceof McpGranteeRegistrationError) {
288
+ throw new McpOAuthAuthorizationError(err.code, err.message, err.status ?? 502, err.body);
289
+ }
290
+ throw err;
291
+ }
292
+ const grantResult = await createGrantContract({
293
+ gateway: options.gateway,
294
+ serverOwner: options.serverOwner,
295
+ serverSigner: options.serverSigner,
296
+ body: {
297
+ granteeAddress: connection.granteeAddress,
298
+ scopes: input.scopes,
299
+ ...(input.expiresAt !== undefined ? { expiresAt: input.expiresAt } : {}),
300
+ ...(input.nonce !== undefined ? { nonce: input.nonce } : {}),
301
+ },
302
+ });
303
+ if (!grantResult.ok) {
304
+ throw new McpOAuthAuthorizationError("grant_creation_failed", extractGrantErrorMessage(grantResult.body), grantResult.status, grantResult.body);
305
+ }
306
+ const grantId = grantResult.body.grantId;
307
+ if (!grantId) {
308
+ throw new McpOAuthAuthorizationError("grant_creation_failed", "Personal Server did not return a grant id.", 500, grantResult.body);
309
+ }
310
+ return approveMcpOAuthAuthorization({
311
+ authorizationId: input.authorizationId,
312
+ grants: [{ grantId, scopes: input.scopes }],
313
+ }, options);
314
+ }
315
+ export async function redeemMcpOAuthAuthorizationCode(input, options) {
316
+ const codeHash = await hashMcpOAuthAuthorizationCode(input.authorizationCode);
317
+ const record = await options.authorizationStore.getByCodeHash(codeHash);
318
+ if (!record) {
319
+ throw new McpOAuthAuthorizationError("invalid_grant", "Unknown MCP authorization code");
320
+ }
321
+ if (record.status !== "approved") {
322
+ throw new McpOAuthAuthorizationError("invalid_grant", "MCP authorization code has already been used or is not approved");
323
+ }
324
+ if (record.clientId !== input.clientId) {
325
+ throw new McpOAuthAuthorizationError("invalid_grant", "client_id does not match authorization request");
326
+ }
327
+ if (record.redirectUri !== input.redirectUri) {
328
+ throw new McpOAuthAuthorizationError("invalid_grant", "redirect_uri does not match authorization request");
329
+ }
330
+ if (Date.parse(record.expiresAt) <= (options.now?.() ?? new Date()).getTime()) {
331
+ await options.authorizationStore.update(record.id, { status: "expired" });
332
+ throw new McpOAuthAuthorizationError("invalid_grant", "MCP authorization code expired");
333
+ }
334
+ if (!(await verifyPkceS256({
335
+ codeVerifier: input.codeVerifier,
336
+ expectedChallenge: record.codeChallenge,
337
+ }))) {
338
+ throw new McpOAuthAuthorizationError("invalid_grant", "PKCE verification failed");
339
+ }
340
+ const accessToken = randomToken();
341
+ const tokenHash = await hashConnectionToken(accessToken);
342
+ const updatedConnection = await options.connectionStore.update(record.connectionId, {
343
+ tokenHash,
344
+ });
345
+ if (!updatedConnection) {
346
+ throw new McpOAuthAuthorizationError("invalid_grant", "MCP connection for authorization no longer exists");
347
+ }
348
+ await options.authorizationStore.update(record.id, {
349
+ status: "redeemed",
350
+ redeemedAt: (options.now ? options.now() : new Date()).toISOString(),
351
+ });
352
+ return {
353
+ accessToken,
354
+ ...(record.scope ? { scope: record.scope } : {}),
355
+ };
356
+ }
357
+ async function hashMcpOAuthAuthorizationCode(code) {
358
+ return hashConnectionToken(`mcp-oauth-code:${code}`);
359
+ }
360
+ async function verifyPkceS256(input) {
361
+ const data = new TextEncoder().encode(input.codeVerifier);
362
+ const digest = await globalThis.crypto.subtle.digest("SHA-256", data);
363
+ return bytesToBase64Url(new Uint8Array(digest)) === input.expectedChallenge;
364
+ }
365
+ function extractGrantErrorMessage(body) {
366
+ if (body && typeof body === "object") {
367
+ const record = body;
368
+ if (typeof record.message === "string")
369
+ return record.message;
370
+ const nested = record.error;
371
+ if (nested && typeof nested === "object") {
372
+ const message = nested.message;
373
+ if (typeof message === "string")
374
+ return message;
375
+ }
376
+ }
377
+ return "Could not create MCP grant";
378
+ }
379
+ //# sourceMappingURL=connection-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-api.js","sourceRoot":"","sources":["../../src/mcp/connection-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Per-connection MCP grantee key generation + Web3Signed request signing.
3
+ *
4
+ * Each MCP connection gets a fresh secp256k1 keypair. The PS route uses this
5
+ * keypair to sign every read it performs on behalf of the connection so:
6
+ *
7
+ * 1. The data read flows through `authorizeBuilderRead` exactly like any
8
+ * external builder request.
9
+ * 2. The access log records the per-connection grantee address, not the
10
+ * owner.
11
+ * 3. Disconnecting one MCP client cannot affect another or the owner.
12
+ *
13
+ * This module does NOT do encryption-at-rest. The caller chooses the storage
14
+ * representation (`McpEncryptedPrivateKey`) — for Node the `plaintext` variant
15
+ * is fine (same trust boundary as the on-disk server key); for Web PS Lite the
16
+ * caller should wrap with the owner-derived master key.
17
+ */
18
+ import type { ServerAccount } from "../keys/server-account.js";
19
+ import type { McpEncryptedPrivateKey } from "./types.js";
20
+ export interface McpGranteeKey {
21
+ address: `0x${string}`;
22
+ publicKey: `0x${string}`;
23
+ encryptedPrivateKey: McpEncryptedPrivateKey;
24
+ }
25
+ export interface GeneratedMcpGrantee {
26
+ key: McpGranteeKey;
27
+ account: ServerAccount;
28
+ }
29
+ /**
30
+ * Generate a new MCP grantee keypair and return both the persisted
31
+ * (plaintext-wrapped) form and a ready-to-sign `ServerAccount`.
32
+ */
33
+ export declare function generateMcpGrantee(): GeneratedMcpGrantee;
34
+ /**
35
+ * Reconstruct a `ServerAccount` from a persisted MCP grantee record.
36
+ * Only `plaintext` is supported here; Web PS Lite must decrypt to plaintext
37
+ * before calling.
38
+ */
39
+ export declare function loadMcpGranteeAccount(key: McpGranteeKey): ServerAccount;
40
+ /**
41
+ * Build a Web3Signed Authorization header that authenticates the bearer as the
42
+ * MCP connection's grantee for a given grant id and request URL.
43
+ */
44
+ export declare function signMcpGranteeRequest(params: {
45
+ account: ServerAccount;
46
+ aud: string;
47
+ method: string;
48
+ uri: string;
49
+ grantId: string;
50
+ body?: Uint8Array;
51
+ }): Promise<string>;
52
+ //# sourceMappingURL=grantee.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grantee.d.ts","sourceRoot":"","sources":["../../src/mcp/grantee.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,KAAK,MAAM,EAAE,CAAC;IACzB,mBAAmB,EAAE,sBAAsB,CAAC;CAC7C;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,aAAa,CAAC;IACnB,OAAO,EAAE,aAAa,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,mBAAmB,CA8BxD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,aAAa,GAAG,aAAa,CA0BvE;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,OAAO,EAAE,aAAa,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB,GAAG,OAAO,CAAC,MAAM,CAAC,CASlB"}