@shroud-fi/mcp-server 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 (183) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +130 -0
  3. package/dist/cjs/auth.d.ts +41 -0
  4. package/dist/cjs/auth.d.ts.map +1 -0
  5. package/dist/cjs/auth.js +103 -0
  6. package/dist/cjs/auth.js.map +1 -0
  7. package/dist/cjs/bin/http.d.ts +7 -0
  8. package/dist/cjs/bin/http.d.ts.map +1 -0
  9. package/dist/cjs/bin/http.js +24 -0
  10. package/dist/cjs/bin/http.js.map +1 -0
  11. package/dist/cjs/bin/stdio.d.ts +9 -0
  12. package/dist/cjs/bin/stdio.d.ts.map +1 -0
  13. package/dist/cjs/bin/stdio.js +15 -0
  14. package/dist/cjs/bin/stdio.js.map +1 -0
  15. package/dist/cjs/config.d.ts +22 -0
  16. package/dist/cjs/config.d.ts.map +1 -0
  17. package/dist/cjs/config.js +180 -0
  18. package/dist/cjs/config.js.map +1 -0
  19. package/dist/cjs/constants.d.ts +29 -0
  20. package/dist/cjs/constants.d.ts.map +1 -0
  21. package/dist/cjs/constants.js +35 -0
  22. package/dist/cjs/constants.js.map +1 -0
  23. package/dist/cjs/errors.d.ts +43 -0
  24. package/dist/cjs/errors.d.ts.map +1 -0
  25. package/dist/cjs/errors.js +72 -0
  26. package/dist/cjs/errors.js.map +1 -0
  27. package/dist/cjs/http.d.ts +32 -0
  28. package/dist/cjs/http.d.ts.map +1 -0
  29. package/dist/cjs/http.js +180 -0
  30. package/dist/cjs/http.js.map +1 -0
  31. package/dist/cjs/index.d.ts +19 -0
  32. package/dist/cjs/index.d.ts.map +1 -0
  33. package/dist/cjs/index.js +40 -0
  34. package/dist/cjs/index.js.map +1 -0
  35. package/dist/cjs/package.json +1 -0
  36. package/dist/cjs/server.d.ts +14 -0
  37. package/dist/cjs/server.d.ts.map +1 -0
  38. package/dist/cjs/server.js +92 -0
  39. package/dist/cjs/server.js.map +1 -0
  40. package/dist/cjs/stdio.d.ts +9 -0
  41. package/dist/cjs/stdio.d.ts.map +1 -0
  42. package/dist/cjs/stdio.js +21 -0
  43. package/dist/cjs/stdio.js.map +1 -0
  44. package/dist/cjs/tools/balance.d.ts +9 -0
  45. package/dist/cjs/tools/balance.d.ts.map +1 -0
  46. package/dist/cjs/tools/balance.js +61 -0
  47. package/dist/cjs/tools/balance.js.map +1 -0
  48. package/dist/cjs/tools/index.d.ts +17 -0
  49. package/dist/cjs/tools/index.d.ts.map +1 -0
  50. package/dist/cjs/tools/index.js +40 -0
  51. package/dist/cjs/tools/index.js.map +1 -0
  52. package/dist/cjs/tools/receive.d.ts +13 -0
  53. package/dist/cjs/tools/receive.d.ts.map +1 -0
  54. package/dist/cjs/tools/receive.js +100 -0
  55. package/dist/cjs/tools/receive.js.map +1 -0
  56. package/dist/cjs/tools/register.d.ts +9 -0
  57. package/dist/cjs/tools/register.d.ts.map +1 -0
  58. package/dist/cjs/tools/register.js +36 -0
  59. package/dist/cjs/tools/register.js.map +1 -0
  60. package/dist/cjs/tools/schema.d.ts +18 -0
  61. package/dist/cjs/tools/schema.d.ts.map +1 -0
  62. package/dist/cjs/tools/schema.js +25 -0
  63. package/dist/cjs/tools/schema.js.map +1 -0
  64. package/dist/cjs/tools/send-to-wallet.d.ts +9 -0
  65. package/dist/cjs/tools/send-to-wallet.d.ts.map +1 -0
  66. package/dist/cjs/tools/send-to-wallet.js +60 -0
  67. package/dist/cjs/tools/send-to-wallet.js.map +1 -0
  68. package/dist/cjs/tools/send.d.ts +9 -0
  69. package/dist/cjs/tools/send.d.ts.map +1 -0
  70. package/dist/cjs/tools/send.js +68 -0
  71. package/dist/cjs/tools/send.js.map +1 -0
  72. package/dist/cjs/tools/status.d.ts +6 -0
  73. package/dist/cjs/tools/status.d.ts.map +1 -0
  74. package/dist/cjs/tools/status.js +39 -0
  75. package/dist/cjs/tools/status.js.map +1 -0
  76. package/dist/cjs/tools/sweep.d.ts +14 -0
  77. package/dist/cjs/tools/sweep.d.ts.map +1 -0
  78. package/dist/cjs/tools/sweep.js +119 -0
  79. package/dist/cjs/tools/sweep.js.map +1 -0
  80. package/dist/cjs/tools/x402-pay.d.ts +14 -0
  81. package/dist/cjs/tools/x402-pay.d.ts.map +1 -0
  82. package/dist/cjs/tools/x402-pay.js +78 -0
  83. package/dist/cjs/tools/x402-pay.js.map +1 -0
  84. package/dist/cjs/tools/x402-serve.d.ts +17 -0
  85. package/dist/cjs/tools/x402-serve.d.ts.map +1 -0
  86. package/dist/cjs/tools/x402-serve.js +133 -0
  87. package/dist/cjs/tools/x402-serve.js.map +1 -0
  88. package/dist/cjs/types.d.ts +66 -0
  89. package/dist/cjs/types.d.ts.map +1 -0
  90. package/dist/cjs/types.js +6 -0
  91. package/dist/cjs/types.js.map +1 -0
  92. package/dist/esm/auth.d.ts +41 -0
  93. package/dist/esm/auth.d.ts.map +1 -0
  94. package/dist/esm/auth.js +99 -0
  95. package/dist/esm/auth.js.map +1 -0
  96. package/dist/esm/bin/http.d.ts +7 -0
  97. package/dist/esm/bin/http.d.ts.map +1 -0
  98. package/dist/esm/bin/http.js +22 -0
  99. package/dist/esm/bin/http.js.map +1 -0
  100. package/dist/esm/bin/stdio.d.ts +9 -0
  101. package/dist/esm/bin/stdio.d.ts.map +1 -0
  102. package/dist/esm/bin/stdio.js +13 -0
  103. package/dist/esm/bin/stdio.js.map +1 -0
  104. package/dist/esm/config.d.ts +22 -0
  105. package/dist/esm/config.d.ts.map +1 -0
  106. package/dist/esm/config.js +175 -0
  107. package/dist/esm/config.js.map +1 -0
  108. package/dist/esm/constants.d.ts +29 -0
  109. package/dist/esm/constants.d.ts.map +1 -0
  110. package/dist/esm/constants.js +32 -0
  111. package/dist/esm/constants.js.map +1 -0
  112. package/dist/esm/errors.d.ts +43 -0
  113. package/dist/esm/errors.d.ts.map +1 -0
  114. package/dist/esm/errors.js +61 -0
  115. package/dist/esm/errors.js.map +1 -0
  116. package/dist/esm/http.d.ts +32 -0
  117. package/dist/esm/http.d.ts.map +1 -0
  118. package/dist/esm/http.js +177 -0
  119. package/dist/esm/http.js.map +1 -0
  120. package/dist/esm/index.d.ts +19 -0
  121. package/dist/esm/index.d.ts.map +1 -0
  122. package/dist/esm/index.js +18 -0
  123. package/dist/esm/index.js.map +1 -0
  124. package/dist/esm/server.d.ts +14 -0
  125. package/dist/esm/server.d.ts.map +1 -0
  126. package/dist/esm/server.js +89 -0
  127. package/dist/esm/server.js.map +1 -0
  128. package/dist/esm/stdio.d.ts +9 -0
  129. package/dist/esm/stdio.d.ts.map +1 -0
  130. package/dist/esm/stdio.js +18 -0
  131. package/dist/esm/stdio.js.map +1 -0
  132. package/dist/esm/tools/balance.d.ts +9 -0
  133. package/dist/esm/tools/balance.d.ts.map +1 -0
  134. package/dist/esm/tools/balance.js +58 -0
  135. package/dist/esm/tools/balance.js.map +1 -0
  136. package/dist/esm/tools/index.d.ts +17 -0
  137. package/dist/esm/tools/index.d.ts.map +1 -0
  138. package/dist/esm/tools/index.js +28 -0
  139. package/dist/esm/tools/index.js.map +1 -0
  140. package/dist/esm/tools/receive.d.ts +13 -0
  141. package/dist/esm/tools/receive.d.ts.map +1 -0
  142. package/dist/esm/tools/receive.js +97 -0
  143. package/dist/esm/tools/receive.js.map +1 -0
  144. package/dist/esm/tools/register.d.ts +9 -0
  145. package/dist/esm/tools/register.d.ts.map +1 -0
  146. package/dist/esm/tools/register.js +33 -0
  147. package/dist/esm/tools/register.js.map +1 -0
  148. package/dist/esm/tools/schema.d.ts +18 -0
  149. package/dist/esm/tools/schema.d.ts.map +1 -0
  150. package/dist/esm/tools/schema.js +21 -0
  151. package/dist/esm/tools/schema.js.map +1 -0
  152. package/dist/esm/tools/send-to-wallet.d.ts +9 -0
  153. package/dist/esm/tools/send-to-wallet.d.ts.map +1 -0
  154. package/dist/esm/tools/send-to-wallet.js +57 -0
  155. package/dist/esm/tools/send-to-wallet.js.map +1 -0
  156. package/dist/esm/tools/send.d.ts +9 -0
  157. package/dist/esm/tools/send.d.ts.map +1 -0
  158. package/dist/esm/tools/send.js +65 -0
  159. package/dist/esm/tools/send.js.map +1 -0
  160. package/dist/esm/tools/status.d.ts +6 -0
  161. package/dist/esm/tools/status.d.ts.map +1 -0
  162. package/dist/esm/tools/status.js +36 -0
  163. package/dist/esm/tools/status.js.map +1 -0
  164. package/dist/esm/tools/sweep.d.ts +14 -0
  165. package/dist/esm/tools/sweep.d.ts.map +1 -0
  166. package/dist/esm/tools/sweep.js +116 -0
  167. package/dist/esm/tools/sweep.js.map +1 -0
  168. package/dist/esm/tools/x402-pay.d.ts +14 -0
  169. package/dist/esm/tools/x402-pay.d.ts.map +1 -0
  170. package/dist/esm/tools/x402-pay.js +75 -0
  171. package/dist/esm/tools/x402-pay.js.map +1 -0
  172. package/dist/esm/tools/x402-serve.d.ts +17 -0
  173. package/dist/esm/tools/x402-serve.d.ts.map +1 -0
  174. package/dist/esm/tools/x402-serve.js +130 -0
  175. package/dist/esm/tools/x402-serve.js.map +1 -0
  176. package/dist/esm/types.d.ts +66 -0
  177. package/dist/esm/types.d.ts.map +1 -0
  178. package/dist/esm/types.js +5 -0
  179. package/dist/esm/types.js.map +1 -0
  180. package/dist/tsconfig.cjs.tsbuildinfo +1 -0
  181. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  182. package/dist/tsconfig.tsbuildinfo +1 -0
  183. package/package.json +81 -0
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ /**
3
+ * Static constants. All env reads live here per verify-privacy R5.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ENV_MASTER_SEED_FILE = exports.ENV_MASTER_SEED = exports.ENV_HTTP_ALLOWED_WALLETS = exports.ENV_HTTP_PORT = exports.ENV_START_BLOCK = exports.ENV_CHAIN = exports.ENV_RPC_URL = exports.ENV_PRIVATE_KEY_FILE = exports.ENV_PRIVATE_KEY = exports.DEFAULT_RPC_URL_BY_CHAIN = exports.EIP191_CHALLENGE_TTL_MS = exports.SHROUDFI_MCP_SERVER_VERSION = exports.SHROUDFI_MCP_SERVER_NAME = void 0;
7
+ exports.SHROUDFI_MCP_SERVER_NAME = 'shroudfi-mcp';
8
+ exports.SHROUDFI_MCP_SERVER_VERSION = '0.0.1';
9
+ /** EIP-191 challenge TTL — short window so a replayed challenge dies fast. */
10
+ exports.EIP191_CHALLENGE_TTL_MS = 5 * 60 * 1000;
11
+ /** Default RPC URLs by chain id. Operator override via SHROUDFI_RPC_URL. */
12
+ exports.DEFAULT_RPC_URL_BY_CHAIN = {
13
+ 8453: 'https://mainnet.base.org',
14
+ 84532: 'https://sepolia.base.org',
15
+ };
16
+ /** Env knobs the bootstrap surface reads. */
17
+ exports.ENV_PRIVATE_KEY = 'SHROUDFI_PRIVATE_KEY';
18
+ exports.ENV_PRIVATE_KEY_FILE = 'SHROUDFI_PRIVATE_KEY_FILE';
19
+ exports.ENV_RPC_URL = 'SHROUDFI_RPC_URL';
20
+ exports.ENV_CHAIN = 'SHROUDFI_CHAIN';
21
+ exports.ENV_START_BLOCK = 'SHROUDFI_START_BLOCK';
22
+ exports.ENV_HTTP_PORT = 'SHROUDFI_MCP_HTTP_PORT';
23
+ exports.ENV_HTTP_ALLOWED_WALLETS = 'SHROUDFI_MCP_HTTP_ALLOWED_WALLETS';
24
+ /**
25
+ * Deterministic 32-byte master seed (0x… 64 hex chars). When set, every
26
+ * boot of the MCP server, REST API, or any other surface using
27
+ * `loadBootstrapConfigFromEnv` resolves the SAME stealth meta-address for
28
+ * the same operator EOA. When unset, a fresh random seed is generated per
29
+ * process — fine for local testing, BAD for production multi-surface
30
+ * deployments (caller's main wallet ↔ stealth meta-address binding would
31
+ * desync between MCP, REST, and UI processes).
32
+ */
33
+ exports.ENV_MASTER_SEED = 'SHROUDFI_MASTER_SEED';
34
+ exports.ENV_MASTER_SEED_FILE = 'SHROUDFI_MASTER_SEED_FILE';
35
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEU,QAAA,wBAAwB,GAAG,cAAuB,CAAC;AACnD,QAAA,2BAA2B,GAAG,OAAgB,CAAC;AAE5D,8EAA8E;AACjE,QAAA,uBAAuB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAErD,4EAA4E;AAC/D,QAAA,wBAAwB,GAA2B;IAC9D,IAAI,EAAE,0BAA0B;IAChC,KAAK,EAAE,0BAA0B;CAClC,CAAC;AAEF,6CAA6C;AAChC,QAAA,eAAe,GAAG,sBAA+B,CAAC;AAClD,QAAA,oBAAoB,GAAG,2BAAoC,CAAC;AAC5D,QAAA,WAAW,GAAG,kBAA2B,CAAC;AAC1C,QAAA,SAAS,GAAG,gBAAyB,CAAC;AACtC,QAAA,eAAe,GAAG,sBAA+B,CAAC;AAClD,QAAA,aAAa,GAAG,wBAAiC,CAAC;AAClD,QAAA,wBAAwB,GAAG,mCAA4C,CAAC;AACrF;;;;;;;;GAQG;AACU,QAAA,eAAe,GAAG,sBAA+B,CAAC;AAClD,QAAA,oBAAoB,GAAG,2BAAoC,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Errors for @shroud-fi/mcp-server.
3
+ *
4
+ * Privacy invariants:
5
+ * - No private keys, signatures, or amounts in error messages.
6
+ * - No wallet addresses concatenated into `.message` strings — addresses
7
+ * are exposed on dedicated structured fields when needed.
8
+ */
9
+ export declare class McpServerError extends Error {
10
+ readonly name: string;
11
+ readonly code: string;
12
+ constructor(message: string, code: string);
13
+ }
14
+ export declare class McpConfigError extends McpServerError {
15
+ readonly name = "McpConfigError";
16
+ constructor(message: string);
17
+ }
18
+ export declare class McpUnauthorizedError extends McpServerError {
19
+ readonly name = "McpUnauthorizedError";
20
+ constructor();
21
+ }
22
+ export declare class McpToolNotFoundError extends McpServerError {
23
+ readonly name = "McpToolNotFoundError";
24
+ constructor();
25
+ }
26
+ export declare class McpInvalidArgsError extends McpServerError {
27
+ readonly name = "McpInvalidArgsError";
28
+ constructor();
29
+ }
30
+ export declare class McpExecutionError extends McpServerError {
31
+ readonly name = "McpExecutionError";
32
+ readonly cause: unknown;
33
+ constructor(cause: unknown);
34
+ }
35
+ export declare class McpEip191ChallengeExpiredError extends McpServerError {
36
+ readonly name = "McpEip191ChallengeExpiredError";
37
+ constructor();
38
+ }
39
+ export declare class McpEip191SignatureInvalidError extends McpServerError {
40
+ readonly name = "McpEip191SignatureInvalidError";
41
+ constructor();
42
+ }
43
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,qBAAa,cAAe,SAAQ,KAAK;IACvC,SAAkB,IAAI,EAAE,MAAM,CAAoB;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBACV,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAI1C;AAED,qBAAa,cAAe,SAAQ,cAAc;IAChD,SAAkB,IAAI,oBAAoB;gBAC9B,OAAO,EAAE,MAAM;CAG5B;AAED,qBAAa,oBAAqB,SAAQ,cAAc;IACtD,SAAkB,IAAI,0BAA0B;;CAIjD;AAED,qBAAa,oBAAqB,SAAQ,cAAc;IACtD,SAAkB,IAAI,0BAA0B;;CAIjD;AAED,qBAAa,mBAAoB,SAAQ,cAAc;IACrD,SAAkB,IAAI,yBAAyB;;CAIhD;AAED,qBAAa,iBAAkB,SAAQ,cAAc;IACnD,SAAkB,IAAI,uBAAuB;IAC7C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;gBACZ,KAAK,EAAE,OAAO;CAI3B;AAED,qBAAa,8BAA+B,SAAQ,cAAc;IAChE,SAAkB,IAAI,oCAAoC;;CAI3D;AAED,qBAAa,8BAA+B,SAAQ,cAAc;IAChE,SAAkB,IAAI,oCAAoC;;CAI3D"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ /**
3
+ * Errors for @shroud-fi/mcp-server.
4
+ *
5
+ * Privacy invariants:
6
+ * - No private keys, signatures, or amounts in error messages.
7
+ * - No wallet addresses concatenated into `.message` strings — addresses
8
+ * are exposed on dedicated structured fields when needed.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.McpEip191SignatureInvalidError = exports.McpEip191ChallengeExpiredError = exports.McpExecutionError = exports.McpInvalidArgsError = exports.McpToolNotFoundError = exports.McpUnauthorizedError = exports.McpConfigError = exports.McpServerError = void 0;
12
+ class McpServerError extends Error {
13
+ name = 'McpServerError';
14
+ code;
15
+ constructor(message, code) {
16
+ super(message);
17
+ this.code = code;
18
+ }
19
+ }
20
+ exports.McpServerError = McpServerError;
21
+ class McpConfigError extends McpServerError {
22
+ name = 'McpConfigError';
23
+ constructor(message) {
24
+ super(message, 'config_invalid');
25
+ }
26
+ }
27
+ exports.McpConfigError = McpConfigError;
28
+ class McpUnauthorizedError extends McpServerError {
29
+ name = 'McpUnauthorizedError';
30
+ constructor() {
31
+ super('Unauthorized', 'unauthorized');
32
+ }
33
+ }
34
+ exports.McpUnauthorizedError = McpUnauthorizedError;
35
+ class McpToolNotFoundError extends McpServerError {
36
+ name = 'McpToolNotFoundError';
37
+ constructor() {
38
+ super('Tool not found', 'tool_not_found');
39
+ }
40
+ }
41
+ exports.McpToolNotFoundError = McpToolNotFoundError;
42
+ class McpInvalidArgsError extends McpServerError {
43
+ name = 'McpInvalidArgsError';
44
+ constructor() {
45
+ super('Invalid tool arguments', 'invalid_args');
46
+ }
47
+ }
48
+ exports.McpInvalidArgsError = McpInvalidArgsError;
49
+ class McpExecutionError extends McpServerError {
50
+ name = 'McpExecutionError';
51
+ cause;
52
+ constructor(cause) {
53
+ super('Tool execution failed', 'execution_failed');
54
+ this.cause = cause;
55
+ }
56
+ }
57
+ exports.McpExecutionError = McpExecutionError;
58
+ class McpEip191ChallengeExpiredError extends McpServerError {
59
+ name = 'McpEip191ChallengeExpiredError';
60
+ constructor() {
61
+ super('EIP-191 challenge expired', 'auth_challenge_expired');
62
+ }
63
+ }
64
+ exports.McpEip191ChallengeExpiredError = McpEip191ChallengeExpiredError;
65
+ class McpEip191SignatureInvalidError extends McpServerError {
66
+ name = 'McpEip191SignatureInvalidError';
67
+ constructor() {
68
+ super('EIP-191 signature invalid', 'auth_signature_invalid');
69
+ }
70
+ }
71
+ exports.McpEip191SignatureInvalidError = McpEip191SignatureInvalidError;
72
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAEH,MAAa,cAAe,SAAQ,KAAK;IACrB,IAAI,GAAW,gBAAgB,CAAC;IACzC,IAAI,CAAS;IACtB,YAAY,OAAe,EAAE,IAAY;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAPD,wCAOC;AAED,MAAa,cAAe,SAAQ,cAAc;IAC9B,IAAI,GAAG,gBAAgB,CAAC;IAC1C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IACnC,CAAC;CACF;AALD,wCAKC;AAED,MAAa,oBAAqB,SAAQ,cAAc;IACpC,IAAI,GAAG,sBAAsB,CAAC;IAChD;QACE,KAAK,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IACxC,CAAC;CACF;AALD,oDAKC;AAED,MAAa,oBAAqB,SAAQ,cAAc;IACpC,IAAI,GAAG,sBAAsB,CAAC;IAChD;QACE,KAAK,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;IAC5C,CAAC;CACF;AALD,oDAKC;AAED,MAAa,mBAAoB,SAAQ,cAAc;IACnC,IAAI,GAAG,qBAAqB,CAAC;IAC/C;QACE,KAAK,CAAC,wBAAwB,EAAE,cAAc,CAAC,CAAC;IAClD,CAAC;CACF;AALD,kDAKC;AAED,MAAa,iBAAkB,SAAQ,cAAc;IACjC,IAAI,GAAG,mBAAmB,CAAC;IACpC,KAAK,CAAU;IACxB,YAAY,KAAc;QACxB,KAAK,CAAC,uBAAuB,EAAE,kBAAkB,CAAC,CAAC;QACnD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAPD,8CAOC;AAED,MAAa,8BAA+B,SAAQ,cAAc;IAC9C,IAAI,GAAG,gCAAgC,CAAC;IAC1D;QACE,KAAK,CAAC,2BAA2B,EAAE,wBAAwB,CAAC,CAAC;IAC/D,CAAC;CACF;AALD,wEAKC;AAED,MAAa,8BAA+B,SAAQ,cAAc;IAC9C,IAAI,GAAG,gCAAgC,CAAC;IAC1D;QACE,KAAK,CAAC,2BAA2B,EAAE,wBAAwB,CAAC,CAAC;IAC/D,CAAC;CACF;AALD,wEAKC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * HTTP transport for the MCP server.
3
+ *
4
+ * Uses node:http to stay zero-dep. Exposes three endpoints:
5
+ * POST /auth/challenge → mint EIP-191 challenge
6
+ * POST /mcp → JSON-RPC framed MCP body (auth-gated)
7
+ * GET /healthz → public liveness ping
8
+ *
9
+ * Auth rules:
10
+ * - /auth/challenge public (clients need a way to get a challenge)
11
+ * - /mcp requires X-Shroudfi-Wallet + X-Shroudfi-Nonce +
12
+ * X-Shroudfi-Signature headers. Signature is verified,
13
+ * consumed (single-use), allow-list checked.
14
+ * - /healthz public
15
+ *
16
+ * Privacy invariants:
17
+ * - Signatures never logged or echoed.
18
+ * - Errors are short tag strings; no body bytes, no key bytes.
19
+ * - Allow-list is enforced when SHROUDFI_MCP_HTTP_ALLOWED_WALLETS is set;
20
+ * when empty, ANY EIP-191 wallet may authenticate. Operators MUST set
21
+ * the allow-list in production.
22
+ */
23
+ import type { McpServerBootstrapConfig } from './types.js';
24
+ interface RunHttpServerOptions {
25
+ readonly port: number;
26
+ readonly bootstrap?: McpServerBootstrapConfig;
27
+ }
28
+ export declare function runHttpServer(opts: RunHttpServerOptions): Promise<{
29
+ readonly close: () => Promise<void>;
30
+ }>;
31
+ export {};
32
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AASH,OAAO,KAAK,EAAE,wBAAwB,EAAoB,MAAM,YAAY,CAAC;AAS7E,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,wBAAwB,CAAC;CAC/C;AAoGD,wBAAsB,aAAa,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC;IACvE,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC,CAAC,CA0BD"}
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ /**
3
+ * HTTP transport for the MCP server.
4
+ *
5
+ * Uses node:http to stay zero-dep. Exposes three endpoints:
6
+ * POST /auth/challenge → mint EIP-191 challenge
7
+ * POST /mcp → JSON-RPC framed MCP body (auth-gated)
8
+ * GET /healthz → public liveness ping
9
+ *
10
+ * Auth rules:
11
+ * - /auth/challenge public (clients need a way to get a challenge)
12
+ * - /mcp requires X-Shroudfi-Wallet + X-Shroudfi-Nonce +
13
+ * X-Shroudfi-Signature headers. Signature is verified,
14
+ * consumed (single-use), allow-list checked.
15
+ * - /healthz public
16
+ *
17
+ * Privacy invariants:
18
+ * - Signatures never logged or echoed.
19
+ * - Errors are short tag strings; no body bytes, no key bytes.
20
+ * - Allow-list is enforced when SHROUDFI_MCP_HTTP_ALLOWED_WALLETS is set;
21
+ * when empty, ANY EIP-191 wallet may authenticate. Operators MUST set
22
+ * the allow-list in production.
23
+ */
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.runHttpServer = runHttpServer;
26
+ const node_http_1 = require("node:http");
27
+ const viem_1 = require("viem");
28
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
29
+ const index_js_1 = require("./tools/index.js");
30
+ const auth_js_1 = require("./auth.js");
31
+ const config_js_1 = require("./config.js");
32
+ const errors_js_1 = require("./errors.js");
33
+ const HEADER_WALLET = 'x-shroudfi-wallet';
34
+ const HEADER_NONCE = 'x-shroudfi-nonce';
35
+ const HEADER_SIGNATURE = 'x-shroudfi-signature';
36
+ const JSON_HEADERS = { 'content-type': 'application/json' };
37
+ async function readJsonBody(req) {
38
+ const chunks = [];
39
+ for await (const chunk of req) {
40
+ chunks.push(chunk);
41
+ if (Buffer.concat(chunks).length > 1_048_576) {
42
+ throw new errors_js_1.McpInvalidArgsError();
43
+ }
44
+ }
45
+ const raw = Buffer.concat(chunks).toString('utf-8');
46
+ if (raw.length === 0)
47
+ return {};
48
+ try {
49
+ return JSON.parse(raw);
50
+ }
51
+ catch {
52
+ throw new errors_js_1.McpInvalidArgsError();
53
+ }
54
+ }
55
+ function send(res, status, body) {
56
+ res.writeHead(status, JSON_HEADERS);
57
+ res.end(JSON.stringify(body));
58
+ }
59
+ async function authenticate(req, authCache, allowList) {
60
+ const wallet = req.headers[HEADER_WALLET];
61
+ const nonce = req.headers[HEADER_NONCE];
62
+ const sig = req.headers[HEADER_SIGNATURE];
63
+ if (typeof wallet !== 'string' ||
64
+ typeof nonce !== 'string' ||
65
+ typeof sig !== 'string') {
66
+ throw new errors_js_1.McpUnauthorizedError();
67
+ }
68
+ if (!(0, viem_1.isHex)(wallet) || wallet.length !== 42)
69
+ throw new errors_js_1.McpUnauthorizedError();
70
+ if (!(0, viem_1.isHex)(nonce))
71
+ throw new errors_js_1.McpUnauthorizedError();
72
+ if (!(0, viem_1.isHex)(sig))
73
+ throw new errors_js_1.McpUnauthorizedError();
74
+ const walletLc = wallet.toLowerCase();
75
+ if (allowList.size > 0 && !allowList.has(walletLc)) {
76
+ throw new errors_js_1.McpUnauthorizedError();
77
+ }
78
+ await authCache.verifyAndConsume({
79
+ wallet: walletLc,
80
+ nonce: nonce,
81
+ signature: sig,
82
+ });
83
+ return walletLc;
84
+ }
85
+ /**
86
+ * Direct JSON-RPC-ish dispatch — we expose the same RPC envelope MCP uses but
87
+ * over a synchronous request/response cycle (no SSE in v1). Clients send:
88
+ * { method: 'tools/list', params: {} }
89
+ * { method: 'tools/call', params: { name, arguments } }
90
+ */
91
+ async function dispatch(ctx, body) {
92
+ if (typeof body !== 'object' ||
93
+ body === null ||
94
+ !('method' in body) ||
95
+ typeof body.method !== 'string') {
96
+ throw new errors_js_1.McpInvalidArgsError();
97
+ }
98
+ const method = body.method;
99
+ const params = (body.params ?? {});
100
+ if (method === 'tools/list') {
101
+ types_js_1.ListToolsRequestSchema.parse({ method, params });
102
+ return {
103
+ tools: index_js_1.ALL_TOOLS.map((t) => ({
104
+ name: t.name,
105
+ description: t.description,
106
+ inputSchema: t.inputSchema,
107
+ })),
108
+ };
109
+ }
110
+ if (method === 'tools/call') {
111
+ const parsed = types_js_1.CallToolRequestSchema.parse({ method, params });
112
+ const tool = (0, index_js_1.findTool)(parsed.params.name);
113
+ if (tool === undefined) {
114
+ throw new errors_js_1.McpInvalidArgsError();
115
+ }
116
+ const args = parsed.params.arguments ?? {};
117
+ const result = await tool.handler(ctx, args);
118
+ return {
119
+ content: [{ type: 'text', text: JSON.stringify(result) }],
120
+ };
121
+ }
122
+ throw new errors_js_1.McpInvalidArgsError();
123
+ }
124
+ async function runHttpServer(opts) {
125
+ const bootstrap = opts.bootstrap ?? (0, config_js_1.loadBootstrapConfigFromEnv)();
126
+ const ctx = (0, config_js_1.buildContextFromConfig)(bootstrap);
127
+ const authCache = (0, auth_js_1.createAuthCache)();
128
+ const allowList = bootstrap.httpAllowedWallets;
129
+ const server = (0, node_http_1.createServer)((req, res) => {
130
+ void handleRequest(req, res, ctx, authCache, allowList).catch((err) => {
131
+ if (err instanceof errors_js_1.McpServerError) {
132
+ send(res, 400, { ok: false, code: err.code });
133
+ return;
134
+ }
135
+ send(res, 500, { ok: false, code: 'internal_error' });
136
+ });
137
+ });
138
+ await new Promise((resolve) => {
139
+ server.listen(opts.port, () => resolve());
140
+ });
141
+ return {
142
+ close: () => new Promise((resolve, reject) => {
143
+ server.close((err) => (err ? reject(err) : resolve()));
144
+ }),
145
+ };
146
+ }
147
+ async function handleRequest(req, res, ctx, authCache, allowList) {
148
+ const url = req.url ?? '/';
149
+ const method = req.method ?? 'GET';
150
+ if (url === '/healthz' && method === 'GET') {
151
+ send(res, 200, { ok: true });
152
+ return;
153
+ }
154
+ if (url === '/auth/challenge' && method === 'POST') {
155
+ const body = (await readJsonBody(req));
156
+ if (typeof body.wallet !== 'string' ||
157
+ !(0, viem_1.isHex)(body.wallet) ||
158
+ body.wallet.length !== 42) {
159
+ throw new errors_js_1.McpInvalidArgsError();
160
+ }
161
+ const challenge = authCache.issue(body.wallet.toLowerCase());
162
+ send(res, 200, {
163
+ ok: true,
164
+ wallet: challenge.wallet,
165
+ nonce: challenge.nonce,
166
+ message: challenge.message,
167
+ expiresAtMs: challenge.expiresAtMs,
168
+ });
169
+ return;
170
+ }
171
+ if (url === '/mcp' && method === 'POST') {
172
+ await authenticate(req, authCache, allowList);
173
+ const body = await readJsonBody(req);
174
+ const result = await dispatch(ctx, body);
175
+ send(res, 200, { ok: true, result });
176
+ return;
177
+ }
178
+ send(res, 404, { ok: false, code: 'not_found' });
179
+ }
180
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Public barrel — @shroud-fi/mcp-server.
3
+ *
4
+ * Two consumption paths:
5
+ * - `import { runStdioServer } from '@shroud-fi/mcp-server'` for stdio bin.
6
+ * - `import { runHttpServer } from '@shroud-fi/mcp-server/http'` for HTTP.
7
+ * - `import { ALL_TOOLS } from '@shroud-fi/mcp-server/tools'` to embed the
8
+ * tool registry into a host MCP server you already own.
9
+ */
10
+ export { runStdioServer } from './stdio.js';
11
+ export { runHttpServer } from './http.js';
12
+ export { buildMcpServer } from './server.js';
13
+ export { buildContextFromConfig, loadBootstrapConfigFromEnv, readHttpPortFromEnv, } from './config.js';
14
+ export { createAuthCache } from './auth.js';
15
+ export { ALL_TOOLS, findTool } from './tools/index.js';
16
+ export type { McpTool, McpToolResult, McpServerContext, McpServerBootstrapConfig, Eip191Challenge, } from './types.js';
17
+ export { McpServerError, McpConfigError, McpUnauthorizedError, McpToolNotFoundError, McpInvalidArgsError, McpExecutionError, McpEip191ChallengeExpiredError, McpEip191SignatureInvalidError, } from './errors.js';
18
+ export { SHROUDFI_MCP_SERVER_NAME, SHROUDFI_MCP_SERVER_VERSION, } from './constants.js';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EACL,sBAAsB,EACtB,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,YAAY,EACV,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,wBAAwB,EACxB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,8BAA8B,EAC9B,8BAA8B,GAC/B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ /**
3
+ * Public barrel — @shroud-fi/mcp-server.
4
+ *
5
+ * Two consumption paths:
6
+ * - `import { runStdioServer } from '@shroud-fi/mcp-server'` for stdio bin.
7
+ * - `import { runHttpServer } from '@shroud-fi/mcp-server/http'` for HTTP.
8
+ * - `import { ALL_TOOLS } from '@shroud-fi/mcp-server/tools'` to embed the
9
+ * tool registry into a host MCP server you already own.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.SHROUDFI_MCP_SERVER_VERSION = exports.SHROUDFI_MCP_SERVER_NAME = exports.McpEip191SignatureInvalidError = exports.McpEip191ChallengeExpiredError = exports.McpExecutionError = exports.McpInvalidArgsError = exports.McpToolNotFoundError = exports.McpUnauthorizedError = exports.McpConfigError = exports.McpServerError = exports.findTool = exports.ALL_TOOLS = exports.createAuthCache = exports.readHttpPortFromEnv = exports.loadBootstrapConfigFromEnv = exports.buildContextFromConfig = exports.buildMcpServer = exports.runHttpServer = exports.runStdioServer = void 0;
13
+ var stdio_js_1 = require("./stdio.js");
14
+ Object.defineProperty(exports, "runStdioServer", { enumerable: true, get: function () { return stdio_js_1.runStdioServer; } });
15
+ var http_js_1 = require("./http.js");
16
+ Object.defineProperty(exports, "runHttpServer", { enumerable: true, get: function () { return http_js_1.runHttpServer; } });
17
+ var server_js_1 = require("./server.js");
18
+ Object.defineProperty(exports, "buildMcpServer", { enumerable: true, get: function () { return server_js_1.buildMcpServer; } });
19
+ var config_js_1 = require("./config.js");
20
+ Object.defineProperty(exports, "buildContextFromConfig", { enumerable: true, get: function () { return config_js_1.buildContextFromConfig; } });
21
+ Object.defineProperty(exports, "loadBootstrapConfigFromEnv", { enumerable: true, get: function () { return config_js_1.loadBootstrapConfigFromEnv; } });
22
+ Object.defineProperty(exports, "readHttpPortFromEnv", { enumerable: true, get: function () { return config_js_1.readHttpPortFromEnv; } });
23
+ var auth_js_1 = require("./auth.js");
24
+ Object.defineProperty(exports, "createAuthCache", { enumerable: true, get: function () { return auth_js_1.createAuthCache; } });
25
+ var index_js_1 = require("./tools/index.js");
26
+ Object.defineProperty(exports, "ALL_TOOLS", { enumerable: true, get: function () { return index_js_1.ALL_TOOLS; } });
27
+ Object.defineProperty(exports, "findTool", { enumerable: true, get: function () { return index_js_1.findTool; } });
28
+ var errors_js_1 = require("./errors.js");
29
+ Object.defineProperty(exports, "McpServerError", { enumerable: true, get: function () { return errors_js_1.McpServerError; } });
30
+ Object.defineProperty(exports, "McpConfigError", { enumerable: true, get: function () { return errors_js_1.McpConfigError; } });
31
+ Object.defineProperty(exports, "McpUnauthorizedError", { enumerable: true, get: function () { return errors_js_1.McpUnauthorizedError; } });
32
+ Object.defineProperty(exports, "McpToolNotFoundError", { enumerable: true, get: function () { return errors_js_1.McpToolNotFoundError; } });
33
+ Object.defineProperty(exports, "McpInvalidArgsError", { enumerable: true, get: function () { return errors_js_1.McpInvalidArgsError; } });
34
+ Object.defineProperty(exports, "McpExecutionError", { enumerable: true, get: function () { return errors_js_1.McpExecutionError; } });
35
+ Object.defineProperty(exports, "McpEip191ChallengeExpiredError", { enumerable: true, get: function () { return errors_js_1.McpEip191ChallengeExpiredError; } });
36
+ Object.defineProperty(exports, "McpEip191SignatureInvalidError", { enumerable: true, get: function () { return errors_js_1.McpEip191SignatureInvalidError; } });
37
+ var constants_js_1 = require("./constants.js");
38
+ Object.defineProperty(exports, "SHROUDFI_MCP_SERVER_NAME", { enumerable: true, get: function () { return constants_js_1.SHROUDFI_MCP_SERVER_NAME; } });
39
+ Object.defineProperty(exports, "SHROUDFI_MCP_SERVER_VERSION", { enumerable: true, get: function () { return constants_js_1.SHROUDFI_MCP_SERVER_VERSION; } });
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,uCAA4C;AAAnC,0GAAA,cAAc,OAAA;AACvB,qCAA0C;AAAjC,wGAAA,aAAa,OAAA;AACtB,yCAA6C;AAApC,2GAAA,cAAc,OAAA;AACvB,yCAIqB;AAHnB,mHAAA,sBAAsB,OAAA;AACtB,uHAAA,0BAA0B,OAAA;AAC1B,gHAAA,mBAAmB,OAAA;AAErB,qCAA4C;AAAnC,0GAAA,eAAe,OAAA;AACxB,6CAAuD;AAA9C,qGAAA,SAAS,OAAA;AAAE,oGAAA,QAAQ,OAAA;AAQ5B,yCASqB;AARnB,2GAAA,cAAc,OAAA;AACd,2GAAA,cAAc,OAAA;AACd,iHAAA,oBAAoB,OAAA;AACpB,iHAAA,oBAAoB,OAAA;AACpB,gHAAA,mBAAmB,OAAA;AACnB,8GAAA,iBAAiB,OAAA;AACjB,2HAAA,8BAA8B,OAAA;AAC9B,2HAAA,8BAA8B,OAAA;AAEhC,+CAGwB;AAFtB,wHAAA,wBAAwB,OAAA;AACxB,2HAAA,2BAA2B,OAAA"}
@@ -0,0 +1 @@
1
+ {"type":"commonjs"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * MCP server core — wires our tool registry into the official MCP SDK.
3
+ *
4
+ * Transport-agnostic: this function builds the configured Server instance.
5
+ * stdio.ts and http.ts each connect it to their respective transport.
6
+ */
7
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
8
+ import type { McpServerContext } from './types.js';
9
+ /**
10
+ * Build a configured MCP Server. The caller plugs in a transport via
11
+ * `server.connect(transport)` once this returns.
12
+ */
13
+ export declare function buildMcpServer(ctx: McpServerContext): Server;
14
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAYnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,CA6E5D"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ /**
3
+ * MCP server core — wires our tool registry into the official MCP SDK.
4
+ *
5
+ * Transport-agnostic: this function builds the configured Server instance.
6
+ * stdio.ts and http.ts each connect it to their respective transport.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.buildMcpServer = buildMcpServer;
10
+ const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
11
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
12
+ const index_js_2 = require("./tools/index.js");
13
+ const constants_js_1 = require("./constants.js");
14
+ const errors_js_1 = require("./errors.js");
15
+ /**
16
+ * Build a configured MCP Server. The caller plugs in a transport via
17
+ * `server.connect(transport)` once this returns.
18
+ */
19
+ function buildMcpServer(ctx) {
20
+ const server = new index_js_1.Server({
21
+ name: constants_js_1.SHROUDFI_MCP_SERVER_NAME,
22
+ version: constants_js_1.SHROUDFI_MCP_SERVER_VERSION,
23
+ }, {
24
+ capabilities: {
25
+ tools: {},
26
+ },
27
+ });
28
+ server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
29
+ const tools = index_js_2.ALL_TOOLS.map((t) => ({
30
+ name: t.name,
31
+ description: t.description,
32
+ inputSchema: t.inputSchema,
33
+ }));
34
+ return { tools };
35
+ });
36
+ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (req) => {
37
+ const name = req.params.name;
38
+ const tool = (0, index_js_2.findTool)(name);
39
+ if (tool === undefined) {
40
+ throw new errors_js_1.McpToolNotFoundError();
41
+ }
42
+ try {
43
+ const args = (req.params.arguments ?? {});
44
+ const result = await tool.handler(ctx, args);
45
+ return {
46
+ content: [
47
+ {
48
+ type: 'text',
49
+ text: JSON.stringify(result),
50
+ },
51
+ ],
52
+ };
53
+ }
54
+ catch (err) {
55
+ if (err instanceof errors_js_1.McpInvalidArgsError || err instanceof errors_js_1.McpToolNotFoundError) {
56
+ return {
57
+ isError: true,
58
+ content: [
59
+ {
60
+ type: 'text',
61
+ text: JSON.stringify({ ok: false, code: err.code, message: err.message }),
62
+ },
63
+ ],
64
+ };
65
+ }
66
+ if (err instanceof errors_js_1.McpServerError) {
67
+ return {
68
+ isError: true,
69
+ content: [
70
+ {
71
+ type: 'text',
72
+ text: JSON.stringify({ ok: false, code: err.code, message: err.message }),
73
+ },
74
+ ],
75
+ };
76
+ }
77
+ // Wrap unexpected error — short tag only, never the raw .message.
78
+ const code = err?.name ?? 'execution_failed';
79
+ return {
80
+ isError: true,
81
+ content: [
82
+ {
83
+ type: 'text',
84
+ text: JSON.stringify({ ok: false, code, message: 'Tool execution failed' }),
85
+ },
86
+ ],
87
+ };
88
+ }
89
+ });
90
+ return server;
91
+ }
92
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Stdio transport entry point.
3
+ *
4
+ * Reads operator config from env, builds the agent context, attaches the
5
+ * MCP server to stdin/stdout. Used by `.mcp.json` config in Claude Code,
6
+ * Cursor, Windsurf, Zed AI, etc.
7
+ */
8
+ export declare function runStdioServer(): Promise<void>;
9
+ //# sourceMappingURL=stdio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../src/stdio.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAMpD"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ /**
3
+ * Stdio transport entry point.
4
+ *
5
+ * Reads operator config from env, builds the agent context, attaches the
6
+ * MCP server to stdin/stdout. Used by `.mcp.json` config in Claude Code,
7
+ * Cursor, Windsurf, Zed AI, etc.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.runStdioServer = runStdioServer;
11
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
12
+ const config_js_1 = require("./config.js");
13
+ const server_js_1 = require("./server.js");
14
+ async function runStdioServer() {
15
+ const bootstrap = (0, config_js_1.loadBootstrapConfigFromEnv)();
16
+ const ctx = (0, config_js_1.buildContextFromConfig)(bootstrap);
17
+ const server = (0, server_js_1.buildMcpServer)(ctx);
18
+ const transport = new stdio_js_1.StdioServerTransport();
19
+ await server.connect(transport);
20
+ }
21
+ //# sourceMappingURL=stdio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/stdio.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAMH,wCAMC;AAVD,wEAAiF;AACjF,2CAAiF;AACjF,2CAA6C;AAEtC,KAAK,UAAU,cAAc;IAClC,MAAM,SAAS,GAAG,IAAA,sCAA0B,GAAE,CAAC;IAC/C,MAAM,GAAG,GAAG,IAAA,kCAAsB,EAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,IAAA,0BAAc,EAAC,GAAG,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * shroud_balance — read ETH and (optionally) ERC-20 balance for a wallet.
3
+ *
4
+ * Defaults to the agent's operator wallet. Pass `address` to query a different
5
+ * one (e.g. a stealth address whose private key was just recovered).
6
+ */
7
+ import type { McpTool } from '../types.js';
8
+ export declare const shroudBalanceTool: McpTool;
9
+ //# sourceMappingURL=balance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balance.d.ts","sourceRoot":"","sources":["../../../src/tools/balance.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAiB,MAAM,aAAa,CAAC;AAW1D,eAAO,MAAM,iBAAiB,EAAE,OA6C/B,CAAC"}