safehands-pharos 1.2.0 → 1.2.4

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 (175) hide show
  1. package/.env.example +26 -0
  2. package/README.md +311 -350
  3. package/contracts/RiskRegistry.json +75 -1
  4. package/contracts/RiskRegistry.sol +29 -1
  5. package/dist/cli.d.ts +6 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +91 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/demo.d.ts +2 -0
  10. package/dist/demo.d.ts.map +1 -0
  11. package/dist/demo.js +172 -0
  12. package/dist/demo.js.map +1 -0
  13. package/dist/index.js +181 -169
  14. package/dist/index.js.map +1 -1
  15. package/dist/init.d.ts +2 -0
  16. package/dist/init.d.ts.map +1 -0
  17. package/dist/init.js +66 -0
  18. package/dist/init.js.map +1 -0
  19. package/dist/lib/constants.d.ts +122 -7
  20. package/dist/lib/constants.d.ts.map +1 -1
  21. package/dist/lib/constants.js +139 -13
  22. package/dist/lib/constants.js.map +1 -1
  23. package/dist/lib/dodoApi.d.ts +14 -0
  24. package/dist/lib/dodoApi.d.ts.map +1 -1
  25. package/dist/lib/dodoApi.js +78 -22
  26. package/dist/lib/dodoApi.js.map +1 -1
  27. package/dist/lib/http.d.ts +15 -0
  28. package/dist/lib/http.d.ts.map +1 -0
  29. package/dist/lib/http.js +119 -0
  30. package/dist/lib/http.js.map +1 -0
  31. package/dist/lib/pharosClient.d.ts +4 -3
  32. package/dist/lib/pharosClient.d.ts.map +1 -1
  33. package/dist/lib/pharosClient.js +8 -5
  34. package/dist/lib/pharosClient.js.map +1 -1
  35. package/dist/lib/policy/actionPolicyEngine.d.ts +54 -0
  36. package/dist/lib/policy/actionPolicyEngine.d.ts.map +1 -0
  37. package/dist/lib/policy/actionPolicyEngine.js +213 -0
  38. package/dist/lib/policy/actionPolicyEngine.js.map +1 -0
  39. package/dist/lib/signer/index.d.ts +25 -0
  40. package/dist/lib/signer/index.d.ts.map +1 -0
  41. package/dist/lib/signer/index.js +90 -0
  42. package/dist/lib/signer/index.js.map +1 -0
  43. package/dist/lib/testDodoLive.d.ts +2 -0
  44. package/dist/lib/testDodoLive.d.ts.map +1 -0
  45. package/dist/lib/testDodoLive.js +105 -0
  46. package/dist/lib/testDodoLive.js.map +1 -0
  47. package/dist/lib/testLiveSafehands.d.ts +2 -0
  48. package/dist/lib/testLiveSafehands.d.ts.map +1 -0
  49. package/dist/lib/testLiveSafehands.js +93 -0
  50. package/dist/lib/testLiveSafehands.js.map +1 -0
  51. package/dist/lib/testRpcLive.d.ts +2 -0
  52. package/dist/lib/testRpcLive.d.ts.map +1 -0
  53. package/dist/lib/testRpcLive.js +89 -0
  54. package/dist/lib/testRpcLive.js.map +1 -0
  55. package/dist/lib/testTools.js +363 -354
  56. package/dist/lib/testTools.js.map +1 -1
  57. package/dist/lib/testX402Live.d.ts +2 -0
  58. package/dist/lib/testX402Live.d.ts.map +1 -0
  59. package/dist/lib/testX402Live.js +160 -0
  60. package/dist/lib/testX402Live.js.map +1 -0
  61. package/dist/lib/toolResponse.d.ts +26 -0
  62. package/dist/lib/toolResponse.d.ts.map +1 -0
  63. package/dist/lib/toolResponse.js +54 -0
  64. package/dist/lib/toolResponse.js.map +1 -0
  65. package/dist/lib/wallet/index.d.ts +19 -0
  66. package/dist/lib/wallet/index.d.ts.map +1 -0
  67. package/dist/lib/wallet/index.js +71 -0
  68. package/dist/lib/wallet/index.js.map +1 -0
  69. package/dist/tools/approveToken.d.ts +19 -20
  70. package/dist/tools/approveToken.d.ts.map +1 -1
  71. package/dist/tools/approveToken.js +44 -21
  72. package/dist/tools/approveToken.js.map +1 -1
  73. package/dist/tools/assessRisk.d.ts +22 -9
  74. package/dist/tools/assessRisk.d.ts.map +1 -1
  75. package/dist/tools/assessRisk.js +32 -9
  76. package/dist/tools/assessRisk.js.map +1 -1
  77. package/dist/tools/checkAllowance.d.ts +6 -6
  78. package/dist/tools/checkTokenSecurity.d.ts +9 -16
  79. package/dist/tools/checkTokenSecurity.d.ts.map +1 -1
  80. package/dist/tools/checkTokenSecurity.js +17 -22
  81. package/dist/tools/checkTokenSecurity.js.map +1 -1
  82. package/dist/tools/createAgentWallet.d.ts +27 -0
  83. package/dist/tools/createAgentWallet.d.ts.map +1 -0
  84. package/dist/tools/createAgentWallet.js +60 -0
  85. package/dist/tools/createAgentWallet.js.map +1 -0
  86. package/dist/tools/estimateGas.d.ts +31 -21
  87. package/dist/tools/estimateGas.d.ts.map +1 -1
  88. package/dist/tools/estimateGas.js +91 -95
  89. package/dist/tools/estimateGas.js.map +1 -1
  90. package/dist/tools/executeSwap.d.ts +13 -29
  91. package/dist/tools/executeSwap.d.ts.map +1 -1
  92. package/dist/tools/executeSwap.js +68 -46
  93. package/dist/tools/executeSwap.js.map +1 -1
  94. package/dist/tools/explainRisk.d.ts +30 -0
  95. package/dist/tools/explainRisk.d.ts.map +1 -0
  96. package/dist/tools/explainRisk.js +33 -0
  97. package/dist/tools/explainRisk.js.map +1 -0
  98. package/dist/tools/getAgentWallet.d.ts +22 -0
  99. package/dist/tools/getAgentWallet.d.ts.map +1 -0
  100. package/dist/tools/getAgentWallet.js +28 -0
  101. package/dist/tools/getAgentWallet.js.map +1 -0
  102. package/dist/tools/getAgentWalletBalance.d.ts +12 -0
  103. package/dist/tools/getAgentWalletBalance.d.ts.map +1 -0
  104. package/dist/tools/getAgentWalletBalance.js +71 -0
  105. package/dist/tools/getAgentWalletBalance.js.map +1 -0
  106. package/dist/tools/getExecutionHistory.d.ts +4 -4
  107. package/dist/tools/getGasPrice.d.ts +26 -8
  108. package/dist/tools/getGasPrice.d.ts.map +1 -1
  109. package/dist/tools/getGasPrice.js +43 -35
  110. package/dist/tools/getGasPrice.js.map +1 -1
  111. package/dist/tools/getPoolInfo.d.ts +47 -59
  112. package/dist/tools/getPoolInfo.d.ts.map +1 -1
  113. package/dist/tools/getPoolInfo.js +96 -57
  114. package/dist/tools/getPoolInfo.js.map +1 -1
  115. package/dist/tools/getTokenPrice.d.ts +95 -9
  116. package/dist/tools/getTokenPrice.d.ts.map +1 -1
  117. package/dist/tools/getTokenPrice.js +95 -56
  118. package/dist/tools/getTokenPrice.js.map +1 -1
  119. package/dist/tools/getWalletBalance.d.ts +40 -11
  120. package/dist/tools/getWalletBalance.d.ts.map +1 -1
  121. package/dist/tools/getWalletBalance.js +64 -47
  122. package/dist/tools/getWalletBalance.js.map +1 -1
  123. package/dist/tools/publishRiskScore.d.ts +12 -10
  124. package/dist/tools/publishRiskScore.d.ts.map +1 -1
  125. package/dist/tools/publishRiskScore.js +33 -19
  126. package/dist/tools/publishRiskScore.js.map +1 -1
  127. package/dist/tools/queryRiskRegistry.d.ts +3 -3
  128. package/dist/tools/safehandsPreflightCheck.d.ts +78 -0
  129. package/dist/tools/safehandsPreflightCheck.d.ts.map +1 -0
  130. package/dist/tools/safehandsPreflightCheck.js +48 -0
  131. package/dist/tools/safehandsPreflightCheck.js.map +1 -0
  132. package/dist/tools/safehandsRiskReport.d.ts +82 -0
  133. package/dist/tools/safehandsRiskReport.d.ts.map +1 -0
  134. package/dist/tools/safehandsRiskReport.js +29 -0
  135. package/dist/tools/safehandsRiskReport.js.map +1 -0
  136. package/dist/tools/safehandsSafeExecute.d.ts +21 -0
  137. package/dist/tools/safehandsSafeExecute.d.ts.map +1 -0
  138. package/dist/tools/safehandsSafeExecute.js +76 -0
  139. package/dist/tools/safehandsSafeExecute.js.map +1 -0
  140. package/dist/tools/safehandsWalletHealth.d.ts +15 -0
  141. package/dist/tools/safehandsWalletHealth.d.ts.map +1 -0
  142. package/dist/tools/safehandsWalletHealth.js +104 -0
  143. package/dist/tools/safehandsWalletHealth.js.map +1 -0
  144. package/dist/tools/safehandsX402Preflight.d.ts +27 -0
  145. package/dist/tools/safehandsX402Preflight.d.ts.map +1 -0
  146. package/dist/tools/safehandsX402Preflight.js +66 -0
  147. package/dist/tools/safehandsX402Preflight.js.map +1 -0
  148. package/dist/tools/sendPayment.d.ts +13 -35
  149. package/dist/tools/sendPayment.d.ts.map +1 -1
  150. package/dist/tools/sendPayment.js +53 -47
  151. package/dist/tools/sendPayment.js.map +1 -1
  152. package/dist/tools/simulateTransaction.d.ts +4 -4
  153. package/dist/tools/tokenRegistryStatus.d.ts +27 -0
  154. package/dist/tools/tokenRegistryStatus.d.ts.map +1 -0
  155. package/dist/tools/tokenRegistryStatus.js +97 -0
  156. package/dist/tools/tokenRegistryStatus.js.map +1 -0
  157. package/dist/tools/x402PayAndFetch.d.ts +40 -16
  158. package/dist/tools/x402PayAndFetch.d.ts.map +1 -1
  159. package/dist/tools/x402PayAndFetch.js +115 -47
  160. package/dist/tools/x402PayAndFetch.js.map +1 -1
  161. package/dist/x402Server.js +149 -115
  162. package/dist/x402Server.js.map +1 -1
  163. package/examples/pharos-skill-engine/SKILL.safehands.md +85 -0
  164. package/examples/pharos-skill-engine/assets/safehands/example-actions.json +49 -0
  165. package/examples/pharos-skill-engine/assets/safehands/policy-defaults.json +11 -0
  166. package/examples/pharos-skill-engine/references/safehands.md +345 -0
  167. package/examples/scenario-hack.ts +38 -0
  168. package/package.json +19 -5
  169. package/skill/SKILL.md +127 -0
  170. package/skill/assets/safehands/example-actions.json +49 -0
  171. package/skill/assets/safehands/policy-defaults.json +11 -0
  172. package/skill/references/safehands.md +345 -0
  173. package/.agents/skill/safehands/SKILL.md +0 -200
  174. package/.agents/skill/safehands/assets/networks.json +0 -24
  175. package/.agents/skill/safehands/assets/tokens.json +0 -60
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  // ─── SafeHands MCP Server ──────────────────────────────────────────────
3
- // Entry point — registers all 17 tools and starts the MCP server.
3
+ // Entry point — registers 27 tools (17 legacy/core + 3 managed wallet + 7 SafeHands guardrail tools) and starts the MCP server.
4
4
  // ────────────────────────────────────────────────────────────────────────
5
5
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
6
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
@@ -21,192 +21,204 @@ import { getGasPriceSchema, handleGetGasPrice } from "./tools/getGasPrice.js";
21
21
  import { getPoolInfoSchema, handleGetPoolInfo } from "./tools/getPoolInfo.js";
22
22
  import { checkTokenSecuritySchema, handleCheckTokenSecurity } from "./tools/checkTokenSecurity.js";
23
23
  import { x402PayAndFetchSchema, handleX402PayAndFetch } from "./tools/x402PayAndFetch.js";
24
+ import { createAgentWalletSchema, handleCreateAgentWallet } from "./tools/createAgentWallet.js";
25
+ import { safehandsPreflightCheckSchema, handleSafeHandsPreflightCheck } from "./tools/safehandsPreflightCheck.js";
26
+ import { safehandsSafeExecuteSchema, handleSafeHandsSafeExecute } from "./tools/safehandsSafeExecute.js";
27
+ import { safehandsWalletHealthSchema, handleSafeHandsWalletHealth } from "./tools/safehandsWalletHealth.js";
28
+ import { safehandsX402PreflightSchema, handleSafeHandsX402Preflight } from "./tools/safehandsX402Preflight.js";
29
+ import { safehandsRiskReportSchema, handleSafeHandsRiskReport } from "./tools/safehandsRiskReport.js";
30
+ import { explainRiskSchema, handleExplainRisk } from "./tools/explainRisk.js";
31
+ import { tokenRegistryStatusSchema, handleTokenRegistryStatus } from "./tools/tokenRegistryStatus.js";
32
+ import { getAgentWalletSchema, handleGetAgentWallet } from "./tools/getAgentWallet.js";
33
+ import { getAgentWalletBalanceSchema, handleGetAgentWalletBalance } from "./tools/getAgentWalletBalance.js";
34
+ import { fail, ok } from "./lib/toolResponse.js";
35
+ import { runSkillCli } from "./cli.js";
36
+ import { runDemo } from "./demo.js";
37
+ import { runInit } from "./init.js";
38
+ function isStructuredResponse(value) {
39
+ return (!!value &&
40
+ typeof value === "object" &&
41
+ "success" in value &&
42
+ "timestamp" in value &&
43
+ "error" in value);
44
+ }
45
+ async function invokeTool(handler, params, source) {
46
+ try {
47
+ const result = await handler(params);
48
+ if (isStructuredResponse(result))
49
+ return result;
50
+ if (result && typeof result === "object" && "error" in result && !("success" in result)) {
51
+ return fail("TOOL_RETURNED_ERROR", String(result.error), false, source);
52
+ }
53
+ return ok(result);
54
+ }
55
+ catch (err) {
56
+ return fail("TOOL_EXECUTION_FAILED", err instanceof Error ? err.message : String(err), false, source);
57
+ }
58
+ }
59
+ function mcpText(result) {
60
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
61
+ }
62
+ // ─── Pharos Skill Engine CLI Adapter ──────────────────────────────────
63
+ if (process.argv[2] === "skill") {
64
+ try {
65
+ const exitCode = await runSkillCli(process.argv.slice(3));
66
+ process.exit(exitCode);
67
+ }
68
+ catch (error) {
69
+ process.stdout.write(JSON.stringify(fail("CLI_FATAL_ERROR", error instanceof Error ? error.message : String(error), false, "safehands_cli"), null, 2) + "\n");
70
+ process.exit(1);
71
+ }
72
+ }
73
+ // ─── Interactive Setup Wizard ─────────────────────────────────────────
74
+ if (process.argv[2] === "init") {
75
+ await runInit();
76
+ process.exit(0);
77
+ }
78
+ // ─── Deterministic Demo CLI ───────────────────────────────────────────
79
+ if (process.argv.includes("--demo")) {
80
+ await runDemo();
81
+ // Brief delay allows libuv handles (express sockets) to close cleanly on Windows
82
+ setTimeout(() => process.exit(0), 100);
83
+ // Wait indefinitely so the script doesn't continue down to start the MCP server
84
+ await new Promise(() => { });
85
+ }
24
86
  // ─── CLI Help ──────────────────────────────────────────────────────────
25
87
  if (process.argv.includes("--help") || process.argv.includes("-h")) {
26
88
  process.stdout.write(`
27
- 🛡️ SafeHands — Risk-gating middleware for Pharos agents
28
- v1.0.0 | https://github.com/SZtch/safehands-pharos
89
+ 🛡️ SafeHands-PharosTransaction Safety Firewall for AI Agents
90
+ v1.2.4 | Pharos Atlantic Testnet | Chain ID 688689
29
91
 
30
92
  USAGE
31
- SafeHands runs as an MCP server — it connects to AI agents via stdio,
32
- not as an interactive CLI. Start it via your MCP client config.
33
-
34
- CONNECT TO CLAUDE DESKTOP
35
- Add to claude_desktop_config.json:
36
-
37
- {
38
- "mcpServers": {
39
- "safehands": {
40
- "command": "npx",
41
- "args": ["-y", "safehands-pharos"]
42
- }
43
- }
44
- }
45
-
46
- AVAILABLE TOOLS (17)
47
- Core Safety
48
- assess_risk 5-dimension risk score (0-100) for any swap or transfer
49
- check_token_security Check token contract security/honeypot via GoPlus API
50
- simulate_transaction Dry run via eth_call — zero gas spent
51
- estimate_gas Gas cost in PHRS and USD before execution
52
-
53
- Execution
54
- execute_swap Swap via FaroSwap with built-in risk gate
55
- send_payment Send PHRS with address and balance validation
56
- approve_token ERC-20 approval for DODO router
57
-
58
- Market Intelligence
59
- get_token_price Real-time PHRS/USDC/USDT price
60
- get_pool_info DODO pool data price ratio, impact, fees
61
- get_gas_price Current gas price with trend classification
62
-
63
- Wallet & History
64
- get_wallet_balance PHRS, USDC, USDT balances with USD estimate
65
- check_allowance ERC-20 allowance check for DODO router
66
- get_transaction_status TX lookup by hash — status, block, gas
67
- get_execution_history On-chain audit trail for any wallet
68
-
69
- On-Chain Risk Registry
70
- publish_risk_score Publish risk assessment to on-chain RiskRegistry
71
- query_risk_registry Query any wallet's risk score — no key needed
72
-
73
- x402 Payments
74
- x402_pay_and_fetch Fetch paid API resources with automatic HTTP 402 signature and payment
75
-
76
- CHAIN
77
- Pharos Atlantic Testnet (Chain ID: 688689)
78
- RPC: https://atlantic.dplabs-internal.com/
93
+ npx safehands-pharos
94
+ Start SafeHands as an MCP server over stdio.
95
+
96
+ npx safehands-pharos --help
97
+ Show this help.
98
+
99
+ npx safehands-pharos init
100
+ Launch the interactive setup wizard to configure your .env file safely.
101
+
102
+ npx safehands-pharos --demo
103
+ Run the deterministic non-destructive hackathon demo.
104
+
105
+ npx safehands-pharos skill <tool_name> --input-json '<json>'
106
+ Run a Pharos Skill Engine-compatible SafeHands CLI tool.
107
+
108
+ POSITIONING
109
+ SafeHands is a guardrail layer, not a generic Web3 toolbox.
110
+ It checks whether an AI agent action is safe before execution.
111
+
112
+ User intent
113
+ SafeHands preflight
114
+ → ALLOW / WARN / BLOCK / REQUIRE_CONFIRMATION
115
+ → Pharos Skill Engine or MCP execution only if safe
116
+ SafeHands risk report
117
+
118
+ SAFEHANDS BRANDED TOOLS
119
+ safehands_preflight_check Policy preflight for payments, approvals, swaps, x402, and custom calls
120
+ safehands_safe_execute Guarded wrapper that preflights before execution
121
+ safehands_wallet_health Wallet/signer/gas/x402 readiness report
122
+ safehands_x402_preflight URL, payment, token, and signer safety check before x402 payment
123
+ safehands_risk_report Human-readable judge/demo risk report
124
+ explain_risk Explain ALLOW/WARN/BLOCK decisions in plain English
125
+ token_registry_status Classify canonical, test, custom, unknown, or invalid token address
126
+
127
+ OTHER MCP TOOLS
128
+ Core safety: assess_risk, check_token_security, simulate_transaction, estimate_gas
129
+ Execution: execute_swap, send_payment, approve_token
130
+ Market: get_token_price, get_pool_info, get_gas_price
131
+ Wallet/history: get_wallet_balance, check_allowance, get_transaction_status, get_execution_history
132
+ Risk registry: publish_risk_score, query_risk_registry
133
+ x402: x402_pay_and_fetch
134
+ Managed testnet wallet: create_agent_wallet, get_agent_wallet, get_agent_wallet_balance
135
+
136
+ PHAROS ATLANTIC TESTNET
137
+ Environment: atlantic-testnet
138
+ Chain ID: 688689
139
+ RPC: https://atlantic.dplabs-internal.com
79
140
  Explorer: https://atlantic.pharosscan.xyz/
80
-
81
- RISK REGISTRY
82
- Contract: 0x71fc28ed3a31016b42f18764889cd911f22b67b8
83
-
84
- ENVIRONMENT
85
- SafeHands reads credentials from environment variables.
86
- The safest way is via your MCP client config (e.g. Claude Desktop):
87
-
88
- {
89
- "mcpServers": {
90
- "safehands": {
91
- "command": "npx",
92
- "args": ["-y", "safehands-pharos"],
93
- "env": {
94
- "PRIVATE_KEY": "0xYOUR_PRIVATE_KEY",
95
- "WALLET_ADDRESS": "0xYOUR_WALLET_ADDRESS"
96
- }
97
- }
98
- }
99
- }
100
-
101
- Or create a .env file in your working directory:
102
- PRIVATE_KEY=0xYOUR_PRIVATE_KEY
103
- WALLET_ADDRESS=0xYOUR_WALLET_ADDRESS
104
-
105
- ⚠️ Private keys are never stored or logged by SafeHands.
106
- They are passed per-request only.
107
-
108
- NOTE: 12 of 17 tools work without any credentials.
109
- Only these 5 tools require PRIVATE_KEY:
110
- execute_swap, send_payment, approve_token, publish_risk_score, x402_pay_and_fetch
111
-
112
- MORE
113
- npm: https://www.npmjs.com/package/safehands-pharos
114
- GitHub: https://github.com/SZtch/safehands-pharos
141
+ RiskRegistry: 0x61962a6c812ee9f57b207e1ea47c19ae70bb7141
142
+
143
+ x402 BEHAVIOR
144
+ Free endpoints, such as /supported and /health, do not require a private key.
145
+ Paid endpoints are fetched normally first. Only after HTTP 402 does SafeHands run x402 preflight and request a signer.
146
+ Signed payment payloads and payment headers are not logged or returned.
147
+
148
+ DEFAULT SAFETY
149
+ WALLET_MODE=none
150
+ WRITE_TOOLS_ENABLED=false
151
+ ALLOW_UNLIMITED_APPROVAL=false
152
+ ALLOW_LOCAL_X402_FETCH=false
153
+
154
+ No wallet is created on install, import, or startup.
155
+ Write tools are disabled by default.
156
+ Unlimited approvals are blocked by default.
157
+ Mainnet actions are blocked.
158
+ SSRF-sensitive x402 URLs are blocked by default.
159
+
160
+ EXAMPLES
161
+ npx safehands-pharos skill safehands_preflight_check --input-json '{"actionType":"send_payment","chainId":688689,"isMainnet":false,"amount":"0.001","recipient":"0x0000000000000000000000000000000000000001"}'
162
+
163
+ npx safehands-pharos skill token_registry_status --input-json '{"tokenAddress":"0xE0BE08c77f415F577A1B3A9aD7a1Df1479564ec8"}'
164
+
165
+ DOCS
166
+ README.md
167
+ SECURITY.md
168
+ EXAMPLES.md
169
+ skill/SKILL.md
115
170
  `);
116
171
  process.exit(0);
117
172
  }
118
173
  // ─── Startup Validation ────────────────────────────────────────────────
119
- const hasPrivateKey = !!process.env.PRIVATE_KEY;
120
- const hasWalletAddress = !!process.env.WALLET_ADDRESS;
121
- if (!hasPrivateKey || !hasWalletAddress) {
122
- console.error("⚠️ SafeHands Partial configuration detected:");
123
- if (!hasPrivateKey) {
124
- console.error(" PRIVATE_KEY not set write tools will be unavailable:");
125
- console.error(" execute_swap, send_payment, approve_token, publish_risk_score");
126
- }
127
- if (!hasWalletAddress) {
128
- console.error(" WALLET_ADDRESS not set — some tools may return incomplete results");
129
- }
174
+ const walletMode = process.env.WALLET_MODE || "none";
175
+ const hasManagedWalletMode = walletMode === "managed-testnet";
176
+ const hasExplicitSignerMode = walletMode === "managed-testnet" || walletMode === "env";
177
+ if (process.env.WRITE_TOOLS_ENABLED !== "true") {
178
+ console.error("⚠️ SafeHands — write tools are disabled by default.");
179
+ console.error(" Preflight, risk report, token registry, read-only, and x402 free endpoint checks remain available.");
180
+ console.error(" To execute trusted testnet actions, set WRITE_TOOLS_ENABLED=true and configure a signer via WALLET_MODE=managed-testnet or WALLET_MODE=env.");
130
181
  console.error("");
131
- console.error(" 12 read-only tools are still fully functional.");
132
- console.error(" To enable all tools, set credentials in your MCP client config:");
133
- console.error(' "env": { "PRIVATE_KEY": "0x...", "WALLET_ADDRESS": "0x..." }');
182
+ }
183
+ else if (!hasExplicitSignerMode) {
184
+ console.error("⚠️ SafeHands write tools enabled but no signer mode detected.");
185
+ console.error(" Use WALLET_MODE=managed-testnet with create_agent_wallet, or WALLET_MODE=env for testnet developer mode.");
134
186
  console.error("");
135
187
  }
136
188
  // ─── Server Setup ──────────────────────────────────────────────────────
137
189
  const server = new McpServer({
138
190
  name: "safehands",
139
- version: "1.0.0",
191
+ version: "1.2.4",
140
192
  });
141
193
  // ─── Tool Registration ─────────────────────────────────────────────────
142
- server.tool("assess_risk", "Evaluate the risk of a planned on-chain action (swap or transfer). Returns 0-100 risk score with 5-dimension breakdown.", assessRiskSchema.shape, async (params) => {
143
- const result = await handleAssessRisk(params);
144
- return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
145
- });
146
- server.tool("execute_swap", "Swap tokens via FaroSwap with built-in risk gate. Runs risk assessment first, blocks if score > 80.", executeSwapSchema.shape, async (params) => {
147
- const result = await handleExecuteSwap(params);
148
- return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
149
- });
150
- server.tool("send_payment", "Send native PHRS with pre-flight validation. Checks address, balance, and warns on high exposure.", sendPaymentSchema.shape, async (params) => {
151
- const result = await handleSendPayment(params);
152
- return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
153
- });
154
- server.tool("simulate_transaction", "Dry run a swap or transfer via eth_call no gas spent. Returns expected output and revert reasons.", simulateTransactionSchema.shape, async (params) => {
155
- const result = await handleSimulateTransaction(params);
156
- return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
157
- });
158
- server.tool("get_execution_history", "Pull on-chain transaction history for a wallet. Filters by swap, transfer, or all.", getExecutionHistorySchema.shape, async (params) => {
159
- const result = await handleGetExecutionHistory(params);
160
- return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
161
- });
162
- server.tool("get_token_price", "Fetch real-time price of PHRS, USDC, or USDT on Pharos using DODO liquidity quotes.", getTokenPriceSchema.shape, async (params) => {
163
- const result = await handleGetTokenPrice(params);
164
- return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
165
- });
166
- server.tool("get_wallet_balance", "Return PHRS, USDC, USDT balances for a wallet with total USD estimate.", getWalletBalanceSchema.shape, async (params) => {
167
- const result = await handleGetWalletBalance(params);
168
- return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
169
- });
170
- server.tool("check_allowance", "Check ERC-20 token allowance for DODO swap approval. Returns whether approval is needed.", checkAllowanceSchema.shape, async (params) => {
171
- const result = await handleCheckAllowance(params);
172
- return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
173
- });
174
- server.tool("get_transaction_status", "Check on-chain transaction status by hash. Returns status, block, gas, and explorer link.", getTransactionStatusSchema.shape, async (params) => {
175
- const result = await handleGetTransactionStatus(params);
176
- return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
177
- });
178
- server.tool("estimate_gas", "Estimate gas cost for a swap or transfer before executing. Returns cost in PHRS and USD.", estimateGasSchema.shape, async (params) => {
179
- const result = await handleEstimateGas(params);
180
- return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
181
- });
182
- server.tool("publish_risk_score", "Run risk assessment and publish result to the on-chain RiskRegistry. Other agents can query it.", publishRiskScoreSchema.shape, async (params) => {
183
- const result = await handlePublishRiskScore(params);
184
- return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
185
- });
186
- server.tool("query_risk_registry", "Query the on-chain RiskRegistry for a wallet's published risk score. Read-only, no private key needed.", queryRiskRegistrySchema.shape, async (params) => {
187
- const result = await handleQueryRiskRegistry(params);
188
- return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
189
- });
190
- server.tool("approve_token", "Approve ERC-20 token spending for FaroSwap (DODO) router. Required before swapping non-native tokens.", approveTokenSchema.shape, async (params) => {
191
- const result = await handleApproveToken(params);
192
- return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
193
- });
194
- server.tool("get_gas_price", "Get current gas price on Pharos with trend classification and cost estimates.", getGasPriceSchema.shape, async (params) => {
195
- const result = await handleGetGasPrice(params);
196
- return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
197
- });
198
- server.tool("get_pool_info", "Fetch DODO liquidity pool info for a token pair on Pharos. Returns price ratio, impact, and fees.", getPoolInfoSchema.shape, async (params) => {
199
- const result = await handleGetPoolInfo(params);
200
- return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
201
- });
202
- server.tool("check_token_security", "Check token contract security (honeypot, mintable, ownership privileges, tax) via GoPlus Security API.", checkTokenSecuritySchema.shape, async (params) => {
203
- const result = await handleCheckTokenSecurity(params);
204
- return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
205
- });
206
- server.tool("x402_pay_and_fetch", "Fetch resources from an HTTP x402 payment-gated server. Automatically handles HTTP 402 payment challenge.", x402PayAndFetchSchema.shape, async (params) => {
207
- const result = await handleX402PayAndFetch(params);
208
- return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
209
- });
194
+ server.tool("safehands_preflight_check", "Run a SafeHands policy preflight before an AI agent sends payment, approves tokens, swaps, publishes risk data, or pays x402.", safehandsPreflightCheckSchema.shape, async (params) => mcpText(await invokeTool(handleSafeHandsPreflightCheck, params, "safehands_preflight_check")));
195
+ server.tool("safehands_safe_execute", "Guarded execution wrapper: preflight first, then execute only allowed and explicitly confirmed testnet actions.", safehandsSafeExecuteSchema.shape, async (params) => mcpText(await invokeTool(handleSafeHandsSafeExecute, params, "safehands_safe_execute")));
196
+ server.tool("safehands_wallet_health", "Check whether an AI agent wallet is funded, signer-ready, and safe to use on Pharos Atlantic Testnet.", safehandsWalletHealthSchema.shape, async (params) => mcpText(await invokeTool(handleSafeHandsWalletHealth, params, "safehands_wallet_health")));
197
+ server.tool("safehands_x402_preflight", "Check an x402 paid resource for URL safety, payment amount, token, signer, and testnet policy before signing.", safehandsX402PreflightSchema.shape, async (params) => mcpText(await invokeTool(handleSafeHandsX402Preflight, params, "safehands_x402_preflight")));
198
+ server.tool("safehands_risk_report", "Generate an audit-friendly human-readable SafeHands risk report for an AI agent action.", safehandsRiskReportSchema.shape, async (params) => mcpText(await invokeTool(handleSafeHandsRiskReport, params, "safehands_risk_report")));
199
+ server.tool("explain_risk", "Explain a SafeHands risk/policy decision in human-readable language.", explainRiskSchema.shape, async (params) => mcpText(await invokeTool(handleExplainRisk, params, "explain_risk")));
200
+ server.tool("token_registry_status", "Classify exact token input as canonical testnet token, test liquidity token, custom, unknown, or invalid.", tokenRegistryStatusSchema.shape, async (params) => mcpText(await invokeTool(handleTokenRegistryStatus, params, "token_registry_status")));
201
+ server.tool("assess_risk", "Evaluate the risk of a planned on-chain action (swap or transfer). Returns 0-100 risk score with 5-dimension breakdown.", assessRiskSchema.shape, async (params) => mcpText(await invokeTool(handleAssessRisk, params, "assess_risk")));
202
+ server.tool("execute_swap", "Swap tokens via FaroSwap with built-in risk gate. Runs risk assessment first, blocks if score > 80.", executeSwapSchema.shape, async (params) => mcpText(await invokeTool(handleExecuteSwap, params, "execute_swap")));
203
+ server.tool("send_payment", "Send native PHRS with pre-flight validation. Checks address, balance, and warns on high exposure.", sendPaymentSchema.shape, async (params) => mcpText(await invokeTool(handleSendPayment, params, "send_payment")));
204
+ server.tool("simulate_transaction", "Dry run a swap or transfer via eth_call — no gas spent. Returns expected output and revert reasons.", simulateTransactionSchema.shape, async (params) => mcpText(await invokeTool(handleSimulateTransaction, params, "simulate_transaction")));
205
+ server.tool("get_execution_history", "Pull on-chain transaction history for a wallet. Filters by swap, transfer, or all.", getExecutionHistorySchema.shape, async (params) => mcpText(await invokeTool(handleGetExecutionHistory, params, "get_execution_history")));
206
+ server.tool("get_token_price", "Fetch real-time price of PHRS, USDC, or USDT on Pharos using DODO liquidity quotes.", getTokenPriceSchema.shape, async (params) => mcpText(await invokeTool(handleGetTokenPrice, params, "get_token_price")));
207
+ server.tool("get_wallet_balance", "Return PHRS, USDC, USDT balances for a wallet with total USD estimate.", getWalletBalanceSchema.shape, async (params) => mcpText(await invokeTool(handleGetWalletBalance, params, "get_wallet_balance")));
208
+ server.tool("check_allowance", "Check ERC-20 token allowance for DODO swap approval. Returns whether approval is needed.", checkAllowanceSchema.shape, async (params) => mcpText(await invokeTool(handleCheckAllowance, params, "check_allowance")));
209
+ server.tool("get_transaction_status", "Check on-chain transaction status by hash. Returns status, block, gas, and explorer link.", getTransactionStatusSchema.shape, async (params) => mcpText(await invokeTool(handleGetTransactionStatus, params, "get_transaction_status")));
210
+ server.tool("estimate_gas", "Estimate gas cost for a swap or transfer before executing. Returns cost in PHRS and USD.", estimateGasSchema.shape, async (params) => mcpText(await invokeTool(handleEstimateGas, params, "estimate_gas")));
211
+ server.tool("publish_risk_score", "Run risk assessment and publish result to the on-chain RiskRegistry. Other agents can query it.", publishRiskScoreSchema.shape, async (params) => mcpText(await invokeTool(handlePublishRiskScore, params, "publish_risk_score")));
212
+ server.tool("query_risk_registry", "Query the on-chain RiskRegistry for a wallet's published risk score. Read-only, no private key needed.", queryRiskRegistrySchema.shape, async (params) => mcpText(await invokeTool(handleQueryRiskRegistry, params, "query_risk_registry")));
213
+ server.tool("approve_token", "Approve ERC-20 token spending for FaroSwap (DODO) router. Required before swapping non-native tokens.", approveTokenSchema.shape, async (params) => mcpText(await invokeTool(handleApproveToken, params, "approve_token")));
214
+ server.tool("get_gas_price", "Get current gas price on Pharos with trend classification and cost estimates.", getGasPriceSchema.shape, async (params) => mcpText(await invokeTool(handleGetGasPrice, params, "get_gas_price")));
215
+ server.tool("get_pool_info", "Fetch DODO liquidity pool info for a token pair on Pharos. Returns price ratio, impact, and fees.", getPoolInfoSchema.shape, async (params) => mcpText(await invokeTool(handleGetPoolInfo, params, "get_pool_info")));
216
+ server.tool("check_token_security", "Check token contract security (honeypot, mintable, ownership privileges, tax) via GoPlus Security API.", checkTokenSecuritySchema.shape, async (params) => mcpText(await invokeTool(handleCheckTokenSecurity, params, "check_token_security")));
217
+ server.tool("x402_pay_and_fetch", "Fetch resources from an HTTP x402 payment-gated server. Automatically handles HTTP 402 payment challenge.", x402PayAndFetchSchema.shape, async (params) => mcpText(await invokeTool(handleX402PayAndFetch, params, "x402_pay_and_fetch")));
218
+ // ─── Managed Wallet Tools ──────────────────────────────────────────────
219
+ server.tool("create_agent_wallet", "Create a new managed testnet agent wallet. Private key is encrypted and never returned. Fund the wallet with testnet PHRS before using write tools.", createAgentWalletSchema.shape, async (params) => mcpText(await invokeTool(handleCreateAgentWallet, params, "create_agent_wallet")));
220
+ server.tool("get_agent_wallet", "Get public info (address, environment, chainId) for a managed agent wallet. Never returns private key.", getAgentWalletSchema.shape, async (params) => mcpText(await invokeTool(handleGetAgentWallet, params, "get_agent_wallet")));
221
+ server.tool("get_agent_wallet_balance", "Get PHRS, USDC, and USDT balances for a managed agent wallet on Pharos testnet.", getAgentWalletBalanceSchema.shape, async (params) => mcpText(await invokeTool(handleGetAgentWalletBalance, params, "get_agent_wallet_balance")));
210
222
  // ─── Start Server ──────────────────────────────────────────────────────
211
223
  async function main() {
212
224
  const transport = new StdioServerTransport();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/init.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare function runInit(): Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAIA,wBAAsB,OAAO,kBA2E5B"}
package/dist/init.js ADDED
@@ -0,0 +1,66 @@
1
+ import * as readline from "readline/promises";
2
+ import { writeFileSync, existsSync, readFileSync } from "fs";
3
+ import { resolve } from "path";
4
+ export async function runInit() {
5
+ console.log("\n🛡️ Welcome to SafeHands-Pharos Setup Wizard\n");
6
+ const rl = readline.createInterface({
7
+ input: process.stdin,
8
+ output: process.stdout
9
+ });
10
+ const envPath = resolve(process.cwd(), ".env");
11
+ let existingEnv = "";
12
+ if (existsSync(envPath)) {
13
+ existingEnv = readFileSync(envPath, "utf-8");
14
+ }
15
+ const ansWrite = await rl.question("1. Do you want your AI Agent to execute write operations (Swap, Transfer, Approve)? (y/N): ");
16
+ const enableWrite = ansWrite.trim().toLowerCase() === "y";
17
+ let pk = "";
18
+ if (enableWrite) {
19
+ pk = await rl.question("2. Enter your Pharos Testnet Private Key (leave blank to auto-generate a managed agent wallet instead): ");
20
+ }
21
+ const ansBackup = await rl.question("3. Do you want to enable persistent local backups for auto-generated agent wallets? (y/N): ");
22
+ const enableBackup = ansBackup.trim().toLowerCase() === "y";
23
+ const dodoKey = await rl.question("4. (Optional) Enter your DODO API Key for live testnet routing (press Enter to skip): ");
24
+ rl.close();
25
+ // Build .env content
26
+ let newEnv = "";
27
+ newEnv += `WRITE_TOOLS_ENABLED=${enableWrite ? "true" : "false"}\n`;
28
+ if (pk.trim()) {
29
+ newEnv += `WALLET_MODE=env\n`;
30
+ newEnv += `PRIVATE_KEY=${pk.trim()}\n`;
31
+ }
32
+ else if (enableWrite) {
33
+ newEnv += `WALLET_MODE=managed-testnet\n`;
34
+ }
35
+ else {
36
+ newEnv += `WALLET_MODE=none\n`;
37
+ }
38
+ if (enableBackup) {
39
+ newEnv += `WALLET_STORE_PATH=./.agents/wallets.json\n`;
40
+ }
41
+ if (dodoKey.trim()) {
42
+ newEnv += `DODO_API_KEY=${dodoKey.trim()}\n`;
43
+ }
44
+ // Preserve existing lines if they don't conflict (basic merge)
45
+ const finalEnvLines = [];
46
+ const generatedKeys = ["WRITE_TOOLS_ENABLED", "WALLET_MODE", "PRIVATE_KEY", "WALLET_STORE_PATH", "DODO_API_KEY"];
47
+ if (existingEnv) {
48
+ const lines = existingEnv.split("\n");
49
+ for (const line of lines) {
50
+ const key = line.split("=")[0];
51
+ if (key && !generatedKeys.includes(key)) {
52
+ finalEnvLines.push(line);
53
+ }
54
+ }
55
+ }
56
+ const finalContent = finalEnvLines.join("\n") + "\n" + newEnv;
57
+ writeFileSync(envPath, finalContent.trim() + "\n");
58
+ console.log("\n✅ Configuration saved to .env!");
59
+ if (!pk.trim() && enableWrite) {
60
+ console.log(" Since you enabled write tools without providing a Private Key,");
61
+ console.log(" SafeHands will use 'managed-testnet' mode.");
62
+ console.log(" Run 'npx safehands-pharos skill create_agent_wallet --input-json \"{}\"' to generate one.");
63
+ }
64
+ console.log("🚀 SafeHands is ready to protect your AI Agent!\n");
65
+ }
66
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}