zano-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +195 -0
- package/dist/clients/daemon.d.ts +6 -0
- package/dist/clients/daemon.d.ts.map +1 -0
- package/dist/clients/daemon.js +30 -0
- package/dist/clients/daemon.js.map +1 -0
- package/dist/clients/trade.d.ts +8 -0
- package/dist/clients/trade.d.ts.map +1 -0
- package/dist/clients/trade.js +33 -0
- package/dist/clients/trade.js.map +1 -0
- package/dist/clients/wallet.d.ts +8 -0
- package/dist/clients/wallet.d.ts.map +1 -0
- package/dist/clients/wallet.js +45 -0
- package/dist/clients/wallet.js.map +1 -0
- package/dist/config.d.ts +30 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +42 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +9 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +28 -0
- package/dist/logger.js.map +1 -0
- package/dist/prompts/index.d.ts +4 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +54 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/resources/index.d.ts +4 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +60 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/server.d.ts +4 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +22 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/assets/definitions.d.ts +127 -0
- package/dist/tools/assets/definitions.d.ts.map +1 -0
- package/dist/tools/assets/definitions.js +43 -0
- package/dist/tools/assets/definitions.js.map +1 -0
- package/dist/tools/assets/handlers.d.ts +21 -0
- package/dist/tools/assets/handlers.d.ts.map +1 -0
- package/dist/tools/assets/handlers.js +115 -0
- package/dist/tools/assets/handlers.js.map +1 -0
- package/dist/tools/daemon/definitions.d.ts +139 -0
- package/dist/tools/daemon/definitions.d.ts.map +1 -0
- package/dist/tools/daemon/definitions.js +55 -0
- package/dist/tools/daemon/definitions.js.map +1 -0
- package/dist/tools/daemon/handlers.d.ts +30 -0
- package/dist/tools/daemon/handlers.d.ts.map +1 -0
- package/dist/tools/daemon/handlers.js +274 -0
- package/dist/tools/daemon/handlers.js.map +1 -0
- package/dist/tools/register.d.ts +4 -0
- package/dist/tools/register.d.ts.map +1 -0
- package/dist/tools/register.js +93 -0
- package/dist/tools/register.js.map +1 -0
- package/dist/tools/swap/definitions.d.ts +103 -0
- package/dist/tools/swap/definitions.d.ts.map +1 -0
- package/dist/tools/swap/definitions.js +28 -0
- package/dist/tools/swap/definitions.js.map +1 -0
- package/dist/tools/swap/handlers.d.ts +17 -0
- package/dist/tools/swap/handlers.d.ts.map +1 -0
- package/dist/tools/swap/handlers.js +98 -0
- package/dist/tools/swap/handlers.js.map +1 -0
- package/dist/tools/trade/definitions.d.ts +137 -0
- package/dist/tools/trade/definitions.d.ts.map +1 -0
- package/dist/tools/trade/definitions.js +48 -0
- package/dist/tools/trade/definitions.js.map +1 -0
- package/dist/tools/trade/handlers.d.ts +23 -0
- package/dist/tools/trade/handlers.d.ts.map +1 -0
- package/dist/tools/trade/handlers.js +196 -0
- package/dist/tools/trade/handlers.js.map +1 -0
- package/dist/tools/wallet/definitions.d.ts +158 -0
- package/dist/tools/wallet/definitions.d.ts.map +1 -0
- package/dist/tools/wallet/definitions.js +73 -0
- package/dist/tools/wallet/definitions.js.map +1 -0
- package/dist/tools/wallet/handlers.d.ts +28 -0
- package/dist/tools/wallet/handlers.d.ts.map +1 -0
- package/dist/tools/wallet/handlers.js +214 -0
- package/dist/tools/wallet/handlers.js.map +1 -0
- package/dist/utils/constants.d.ts +25 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +19 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/formatting.d.ts +14 -0
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/utils/formatting.js +68 -0
- package/dist/utils/formatting.js.map +1 -0
- package/package.json +43 -0
- package/src/clients/daemon.ts +41 -0
- package/src/clients/trade.ts +51 -0
- package/src/clients/wallet.ts +59 -0
- package/src/config.ts +56 -0
- package/src/index.ts +20 -0
- package/src/logger.ts +33 -0
- package/src/prompts/index.ts +80 -0
- package/src/resources/index.ts +73 -0
- package/src/server.ts +26 -0
- package/src/tools/assets/definitions.ts +58 -0
- package/src/tools/assets/handlers.ts +140 -0
- package/src/tools/daemon/definitions.ts +86 -0
- package/src/tools/daemon/handlers.ts +349 -0
- package/src/tools/register.ts +194 -0
- package/src/tools/swap/definitions.ts +36 -0
- package/src/tools/swap/handlers.ts +139 -0
- package/src/tools/trade/definitions.ts +67 -0
- package/src/tools/trade/handlers.ts +264 -0
- package/src/tools/wallet/definitions.ts +92 -0
- package/src/tools/wallet/handlers.ts +268 -0
- package/src/utils/constants.ts +24 -0
- package/src/utils/formatting.ts +78 -0
- package/tsconfig.json +19 -0
package/README.md
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# zano-mcp
|
|
2
|
+
|
|
3
|
+
MCP server for the [Zano](https://zano.org) blockchain. Wraps Zano's daemon, wallet, and trade JSON-RPC APIs as MCP tools.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```json
|
|
8
|
+
{
|
|
9
|
+
"mcpServers": {
|
|
10
|
+
"zano": {
|
|
11
|
+
"command": "npx",
|
|
12
|
+
"args": ["-y", "zano-mcp"],
|
|
13
|
+
"env": {
|
|
14
|
+
"ZANO_DAEMON_URL": "http://127.0.0.1:11211/json_rpc"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Public node (zero setup):**
|
|
22
|
+
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"mcpServers": {
|
|
26
|
+
"zano": {
|
|
27
|
+
"command": "npx",
|
|
28
|
+
"args": ["-y", "zano-mcp"],
|
|
29
|
+
"env": {
|
|
30
|
+
"ZANO_DAEMON_URL": "http://37.27.100.59:10500/json_rpc"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**Full config (daemon + wallet + trade):**
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"mcpServers": {
|
|
42
|
+
"zano": {
|
|
43
|
+
"command": "npx",
|
|
44
|
+
"args": ["-y", "zano-mcp"],
|
|
45
|
+
"env": {
|
|
46
|
+
"ZANO_DAEMON_URL": "http://127.0.0.1:11211/json_rpc",
|
|
47
|
+
"ZANO_WALLET_URL": "http://127.0.0.1:11212/json_rpc",
|
|
48
|
+
"ZANO_TRADE_TOKEN": "your_trade_api_token"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Configuration
|
|
56
|
+
|
|
57
|
+
All environment variables are optional with sensible defaults.
|
|
58
|
+
|
|
59
|
+
| Variable | Default | Description |
|
|
60
|
+
|----------|---------|-------------|
|
|
61
|
+
| `ZANO_DAEMON_URL` | `http://127.0.0.1:11211/json_rpc` | Daemon RPC endpoint |
|
|
62
|
+
| `ZANO_WALLET_URL` | (none) | Wallet RPC endpoint. If unset, wallet tools are not registered |
|
|
63
|
+
| `ZANO_WALLET_AUTH` | (none) | JWT secret for wallet RPC auth |
|
|
64
|
+
| `ZANO_TRADE_URL` | `https://api.trade.zano.org` | Trade API base URL |
|
|
65
|
+
| `ZANO_TRADE_TOKEN` | (none) | Trade API auth token. If unset, only public trade tools |
|
|
66
|
+
| `ZANO_NETWORK` | `mainnet` | `mainnet` or `testnet` |
|
|
67
|
+
| `ZANO_LOG_LEVEL` | `info` | `debug`, `info`, `warn`, `error` |
|
|
68
|
+
|
|
69
|
+
CLI args override env vars: `--daemon-url`, `--wallet-url`, `--network`, etc.
|
|
70
|
+
|
|
71
|
+
## Feature Gating
|
|
72
|
+
|
|
73
|
+
Tools are conditionally registered based on what's configured:
|
|
74
|
+
|
|
75
|
+
| Config present | Tools available |
|
|
76
|
+
|---------------|----------------|
|
|
77
|
+
| Always | Daemon tools (15) + Public trade tools (2) |
|
|
78
|
+
| `ZANO_WALLET_URL` | + Wallet (12) + Asset (7) + Swap (3) tools |
|
|
79
|
+
| `ZANO_TRADE_TOKEN` | + Authenticated trade tools (7) |
|
|
80
|
+
|
|
81
|
+
## Available Tools
|
|
82
|
+
|
|
83
|
+
### Daemon Tools (15)
|
|
84
|
+
|
|
85
|
+
| Tool | Description |
|
|
86
|
+
|------|-------------|
|
|
87
|
+
| `get_network_info` | Network status (height, difficulty, hashrate, connections) |
|
|
88
|
+
| `get_height` | Current blockchain height |
|
|
89
|
+
| `get_block_by_height` | Block header at a given height |
|
|
90
|
+
| `get_block_by_hash` | Block header by hash |
|
|
91
|
+
| `get_last_block` | Latest block header |
|
|
92
|
+
| `get_block_details` | Full block with transaction list |
|
|
93
|
+
| `get_transaction` | Transaction details by hash |
|
|
94
|
+
| `get_transactions` | Batch transaction lookup |
|
|
95
|
+
| `get_pool_info` | Mempool status |
|
|
96
|
+
| `get_asset_info` | Asset metadata by ID |
|
|
97
|
+
| `get_assets_list` | All registered assets |
|
|
98
|
+
| `resolve_alias` | Address for a Zano alias |
|
|
99
|
+
| `get_alias_by_address` | Alias for an address |
|
|
100
|
+
| `search_blockchain` | Search by hash/alias |
|
|
101
|
+
| `validate_signature` | Verify a signed message |
|
|
102
|
+
|
|
103
|
+
### Wallet Tools (12) - requires `ZANO_WALLET_URL`
|
|
104
|
+
|
|
105
|
+
| Tool | Description |
|
|
106
|
+
|------|-------------|
|
|
107
|
+
| `get_balance` | Wallet balance (all assets, human-readable) |
|
|
108
|
+
| `get_address` | Wallet public address |
|
|
109
|
+
| `get_wallet_status` | Sync status, watch-only flag |
|
|
110
|
+
| `transfer` | Send ZANO or assets (human-readable amounts) |
|
|
111
|
+
| `get_recent_transactions` | Recent transaction history |
|
|
112
|
+
| `search_transactions` | Search by various criteria |
|
|
113
|
+
| `sign_message` | Sign arbitrary data |
|
|
114
|
+
| `save_wallet` | Persist wallet state |
|
|
115
|
+
| `make_integrated_address` | Create with payment ID |
|
|
116
|
+
| `split_integrated_address` | Decode integrated address |
|
|
117
|
+
| `get_mining_history` | PoS staking rewards |
|
|
118
|
+
| `sweep_below` | Consolidate small outputs |
|
|
119
|
+
|
|
120
|
+
### Asset Tools (7) - requires `ZANO_WALLET_URL`
|
|
121
|
+
|
|
122
|
+
| Tool | Description |
|
|
123
|
+
|------|-------------|
|
|
124
|
+
| `deploy_asset` | Create a new asset |
|
|
125
|
+
| `emit_asset` | Mint additional supply |
|
|
126
|
+
| `burn_asset` | Burn tokens |
|
|
127
|
+
| `update_asset` | Update metadata |
|
|
128
|
+
| `transfer_asset_ownership` | Change asset owner |
|
|
129
|
+
| `whitelist_asset` | Add to wallet whitelist |
|
|
130
|
+
| `remove_asset_from_whitelist` | Remove from whitelist |
|
|
131
|
+
|
|
132
|
+
### Swap Tools (3) - requires `ZANO_WALLET_URL`
|
|
133
|
+
|
|
134
|
+
| Tool | Description |
|
|
135
|
+
|------|-------------|
|
|
136
|
+
| `create_swap_proposal` | Create an ionic swap proposal |
|
|
137
|
+
| `get_swap_info` | View proposal details |
|
|
138
|
+
| `accept_swap` | Accept and execute a swap |
|
|
139
|
+
|
|
140
|
+
### Trade Tools (2 public + 7 authenticated)
|
|
141
|
+
|
|
142
|
+
**Public (always available):**
|
|
143
|
+
|
|
144
|
+
| Tool | Description |
|
|
145
|
+
|------|-------------|
|
|
146
|
+
| `get_trading_pair` | Pair info by ID |
|
|
147
|
+
| `get_order_book` | Order book with depth/spread |
|
|
148
|
+
|
|
149
|
+
**Authenticated (requires `ZANO_TRADE_TOKEN`):**
|
|
150
|
+
|
|
151
|
+
| Tool | Description |
|
|
152
|
+
|------|-------------|
|
|
153
|
+
| `dex_authenticate` | Authenticate with Trade API |
|
|
154
|
+
| `create_order` | Create buy/sell order |
|
|
155
|
+
| `cancel_order` | Cancel an order |
|
|
156
|
+
| `get_my_orders` | Your active orders + tips |
|
|
157
|
+
| `apply_order` | Match with another order |
|
|
158
|
+
| `confirm_trade` | Confirm a trade |
|
|
159
|
+
| `get_active_trade` | Get trade by order IDs |
|
|
160
|
+
|
|
161
|
+
## Resources
|
|
162
|
+
|
|
163
|
+
| URI | Description |
|
|
164
|
+
|-----|-------------|
|
|
165
|
+
| `zano://network/info` | Current network configuration |
|
|
166
|
+
| `zano://assets/whitelist` | Official asset whitelist |
|
|
167
|
+
|
|
168
|
+
## Prompts
|
|
169
|
+
|
|
170
|
+
| Prompt | Description |
|
|
171
|
+
|--------|-------------|
|
|
172
|
+
| `check-network` | Generate a network status report |
|
|
173
|
+
| `analyze-order-book` | Analyze order book for a pair |
|
|
174
|
+
| `explain-transaction` | Explain a transaction in plain language |
|
|
175
|
+
| `swap-calculator` | Calculate swap parameters |
|
|
176
|
+
|
|
177
|
+
## Requirements
|
|
178
|
+
|
|
179
|
+
- Node.js >= 18
|
|
180
|
+
- A running Zano daemon (local or public node)
|
|
181
|
+
- Wallet RPC running if you want wallet/asset/swap tools
|
|
182
|
+
- Trade API token if you want authenticated DEX operations
|
|
183
|
+
|
|
184
|
+
## Development
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
git clone https://github.com/PRavaga/zano-mcp.git
|
|
188
|
+
cd zano-mcp
|
|
189
|
+
npm install
|
|
190
|
+
ZANO_DAEMON_URL=http://37.27.100.59:10500/json_rpc npm run dev
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## License
|
|
194
|
+
|
|
195
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/clients/daemon.ts"],"names":[],"mappings":"AAEA,qBAAa,YAAY;IACvB,OAAO,CAAC,GAAG,CAAS;gBAER,GAAG,EAAE,MAAM;IAIjB,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CA+B1F"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { logger } from "../logger.js";
|
|
2
|
+
export class DaemonClient {
|
|
3
|
+
url;
|
|
4
|
+
constructor(url) {
|
|
5
|
+
this.url = url;
|
|
6
|
+
}
|
|
7
|
+
async call(method, params = {}) {
|
|
8
|
+
const body = JSON.stringify({
|
|
9
|
+
jsonrpc: "2.0",
|
|
10
|
+
id: 0,
|
|
11
|
+
method,
|
|
12
|
+
params,
|
|
13
|
+
});
|
|
14
|
+
logger.debug(`Daemon RPC: ${method}`, params);
|
|
15
|
+
const res = await fetch(this.url, {
|
|
16
|
+
method: "POST",
|
|
17
|
+
headers: { "Content-Type": "application/json" },
|
|
18
|
+
body,
|
|
19
|
+
});
|
|
20
|
+
if (!res.ok) {
|
|
21
|
+
throw new Error(`Daemon RPC HTTP ${res.status}: ${res.statusText}`);
|
|
22
|
+
}
|
|
23
|
+
const json = (await res.json());
|
|
24
|
+
if (json.error) {
|
|
25
|
+
throw new Error(`Daemon RPC error: ${json.error.message} (code: ${json.error.code})`);
|
|
26
|
+
}
|
|
27
|
+
return json.result;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/clients/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,OAAO,YAAY;IACf,GAAG,CAAS;IAEpB,YAAY,GAAW;QACrB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAc,MAAc,EAAE,SAAkC,EAAE;QAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;YAC1B,OAAO,EAAE,KAAK;YACd,EAAE,EAAE,CAAC;YACL,MAAM;YACN,MAAM;SACP,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,eAAe,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC;QAE9C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI;SACL,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAG7B,CAAC;QAEF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,KAAK,CAAC,OAAO,WAAW,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QACxF,CAAC;QAED,OAAO,IAAI,CAAC,MAAW,CAAC;IAC1B,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare class TradeClient {
|
|
2
|
+
private baseUrl;
|
|
3
|
+
private token?;
|
|
4
|
+
constructor(baseUrl: string, token?: string);
|
|
5
|
+
setToken(token: string): void;
|
|
6
|
+
post<T = unknown>(path: string, data?: Record<string, unknown>, requireAuth?: boolean): Promise<T>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=trade.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trade.d.ts","sourceRoot":"","sources":["../../src/clients/trade.ts"],"names":[],"mappings":"AAEA,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAC,CAAS;gBAEX,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAK3C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIvB,IAAI,CAAC,CAAC,GAAG,OAAO,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAClC,WAAW,UAAQ,GAClB,OAAO,CAAC,CAAC,CAAC;CA+Bd"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { logger } from "../logger.js";
|
|
2
|
+
export class TradeClient {
|
|
3
|
+
baseUrl;
|
|
4
|
+
token;
|
|
5
|
+
constructor(baseUrl, token) {
|
|
6
|
+
this.baseUrl = baseUrl.replace(/\/$/, "");
|
|
7
|
+
this.token = token;
|
|
8
|
+
}
|
|
9
|
+
setToken(token) {
|
|
10
|
+
this.token = token;
|
|
11
|
+
}
|
|
12
|
+
async post(path, data = {}, requireAuth = false) {
|
|
13
|
+
if (requireAuth && !this.token) {
|
|
14
|
+
throw new Error("Trade API authentication required. Set ZANO_TRADE_TOKEN or call dex_authenticate first.");
|
|
15
|
+
}
|
|
16
|
+
const payload = requireAuth ? { ...data, token: this.token } : data;
|
|
17
|
+
logger.debug(`Trade API: POST ${path}`, data);
|
|
18
|
+
const res = await fetch(`${this.baseUrl}${path}`, {
|
|
19
|
+
method: "POST",
|
|
20
|
+
headers: { "Content-Type": "application/json" },
|
|
21
|
+
body: JSON.stringify(payload),
|
|
22
|
+
});
|
|
23
|
+
if (!res.ok) {
|
|
24
|
+
throw new Error(`Trade API HTTP ${res.status}: ${res.statusText}`);
|
|
25
|
+
}
|
|
26
|
+
const json = (await res.json());
|
|
27
|
+
if (!json.success) {
|
|
28
|
+
throw new Error(`Trade API error: ${json.error || json.data || "Unknown error"}`);
|
|
29
|
+
}
|
|
30
|
+
return json.data;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=trade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trade.js","sourceRoot":"","sources":["../../src/clients/trade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,OAAO,WAAW;IACd,OAAO,CAAS;IAChB,KAAK,CAAU;IAEvB,YAAY,OAAe,EAAE,KAAc;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,IAAI,CACR,IAAY,EACZ,OAAgC,EAAE,EAClC,WAAW,GAAG,KAAK;QAEnB,IAAI,WAAW,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,yFAAyF,CAAC,CAAC;QAC7G,CAAC;QAED,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAEpE,MAAM,CAAC,KAAK,CAAC,mBAAmB,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QAE9C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;YAChD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAI7B,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,eAAe,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,OAAO,IAAI,CAAC,IAAS,CAAC;IACxB,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare class WalletClient {
|
|
2
|
+
private url;
|
|
3
|
+
private auth?;
|
|
4
|
+
constructor(url: string, auth?: string);
|
|
5
|
+
call<T = unknown>(method: string, params?: Record<string, unknown>): Promise<T>;
|
|
6
|
+
private generateAccessToken;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=wallet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/clients/wallet.ts"],"names":[],"mappings":"AAEA,qBAAa,YAAY;IACvB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,IAAI,CAAC,CAAS;gBAEV,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;IAKhC,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAwCzF,OAAO,CAAC,mBAAmB;CAO5B"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { logger } from "../logger.js";
|
|
2
|
+
export class WalletClient {
|
|
3
|
+
url;
|
|
4
|
+
auth;
|
|
5
|
+
constructor(url, auth) {
|
|
6
|
+
this.url = url;
|
|
7
|
+
this.auth = auth;
|
|
8
|
+
}
|
|
9
|
+
async call(method, params = {}) {
|
|
10
|
+
const body = JSON.stringify({
|
|
11
|
+
jsonrpc: "2.0",
|
|
12
|
+
id: 0,
|
|
13
|
+
method,
|
|
14
|
+
params,
|
|
15
|
+
});
|
|
16
|
+
logger.debug(`Wallet RPC: ${method}`, params);
|
|
17
|
+
const headers = {
|
|
18
|
+
"Content-Type": "application/json",
|
|
19
|
+
};
|
|
20
|
+
if (this.auth) {
|
|
21
|
+
headers["Zano-Access-Token"] = this.generateAccessToken(body);
|
|
22
|
+
}
|
|
23
|
+
const res = await fetch(this.url, {
|
|
24
|
+
method: "POST",
|
|
25
|
+
headers,
|
|
26
|
+
body,
|
|
27
|
+
});
|
|
28
|
+
if (!res.ok) {
|
|
29
|
+
throw new Error(`Wallet RPC HTTP ${res.status}: ${res.statusText}`);
|
|
30
|
+
}
|
|
31
|
+
const json = (await res.json());
|
|
32
|
+
if (json.error) {
|
|
33
|
+
throw new Error(`Wallet RPC error: ${json.error.message} (code: ${json.error.code})`);
|
|
34
|
+
}
|
|
35
|
+
return json.result;
|
|
36
|
+
}
|
|
37
|
+
generateAccessToken(httpBody) {
|
|
38
|
+
// JWT-based auth for wallet RPC
|
|
39
|
+
// Uses SHA-256 hash of the body as part of the token payload
|
|
40
|
+
// For now, return the auth secret directly as a simple bearer token
|
|
41
|
+
// Full JWT implementation would require a JWT library
|
|
42
|
+
return this.auth || "";
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=wallet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/clients/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,OAAO,YAAY;IACf,GAAG,CAAS;IACZ,IAAI,CAAU;IAEtB,YAAY,GAAW,EAAE,IAAa;QACpC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,IAAI,CAAc,MAAc,EAAE,SAAkC,EAAE;QAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;YAC1B,OAAO,EAAE,KAAK;YACd,EAAE,EAAE,CAAC;YACL,MAAM;YACN,MAAM;SACP,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,eAAe,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC;QAE9C,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QAEF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI;SACL,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAG7B,CAAC;QAEF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,KAAK,CAAC,OAAO,WAAW,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QACxF,CAAC;QAED,OAAO,IAAI,CAAC,MAAW,CAAC;IAC1B,CAAC;IAEO,mBAAmB,CAAC,QAAgB;QAC1C,gCAAgC;QAChC,6DAA6D;QAC7D,oEAAoE;QACpE,sDAAsD;QACtD,OAAO,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IACzB,CAAC;CACF"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const configSchema: z.ZodObject<{
|
|
3
|
+
daemonUrl: z.ZodString;
|
|
4
|
+
walletUrl: z.ZodOptional<z.ZodString>;
|
|
5
|
+
walletAuth: z.ZodOptional<z.ZodString>;
|
|
6
|
+
tradeUrl: z.ZodString;
|
|
7
|
+
tradeToken: z.ZodOptional<z.ZodString>;
|
|
8
|
+
network: z.ZodEnum<["mainnet", "testnet"]>;
|
|
9
|
+
logLevel: z.ZodEnum<["debug", "info", "warn", "error"]>;
|
|
10
|
+
}, "strip", z.ZodTypeAny, {
|
|
11
|
+
daemonUrl: string;
|
|
12
|
+
tradeUrl: string;
|
|
13
|
+
network: "mainnet" | "testnet";
|
|
14
|
+
logLevel: "debug" | "info" | "warn" | "error";
|
|
15
|
+
walletUrl?: string | undefined;
|
|
16
|
+
walletAuth?: string | undefined;
|
|
17
|
+
tradeToken?: string | undefined;
|
|
18
|
+
}, {
|
|
19
|
+
daemonUrl: string;
|
|
20
|
+
tradeUrl: string;
|
|
21
|
+
network: "mainnet" | "testnet";
|
|
22
|
+
logLevel: "debug" | "info" | "warn" | "error";
|
|
23
|
+
walletUrl?: string | undefined;
|
|
24
|
+
walletAuth?: string | undefined;
|
|
25
|
+
tradeToken?: string | undefined;
|
|
26
|
+
}>;
|
|
27
|
+
export type Config = z.infer<typeof configSchema>;
|
|
28
|
+
export declare function loadConfig(cliArgs: Record<string, string | undefined>): Config;
|
|
29
|
+
export declare function parseCliArgs(argv: string[]): Record<string, string>;
|
|
30
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;EAQvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,CA2B9E;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUnE"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { DEFAULT_PORTS, TRADE_API_URL } from "./utils/constants.js";
|
|
3
|
+
export const configSchema = z.object({
|
|
4
|
+
daemonUrl: z.string().url(),
|
|
5
|
+
walletUrl: z.string().url().optional(),
|
|
6
|
+
walletAuth: z.string().optional(),
|
|
7
|
+
tradeUrl: z.string().url(),
|
|
8
|
+
tradeToken: z.string().optional(),
|
|
9
|
+
network: z.enum(["mainnet", "testnet"]),
|
|
10
|
+
logLevel: z.enum(["debug", "info", "warn", "error"]),
|
|
11
|
+
});
|
|
12
|
+
export function loadConfig(cliArgs) {
|
|
13
|
+
const network = (cliArgs.network || process.env.ZANO_NETWORK || "mainnet");
|
|
14
|
+
const ports = DEFAULT_PORTS[network] || DEFAULT_PORTS.mainnet;
|
|
15
|
+
const defaultDaemonUrl = `http://127.0.0.1:${ports.daemon}/json_rpc`;
|
|
16
|
+
const raw = {
|
|
17
|
+
daemonUrl: cliArgs["daemon-url"] ||
|
|
18
|
+
process.env.ZANO_DAEMON_URL ||
|
|
19
|
+
defaultDaemonUrl,
|
|
20
|
+
walletUrl: cliArgs["wallet-url"] || process.env.ZANO_WALLET_URL || undefined,
|
|
21
|
+
walletAuth: cliArgs["wallet-auth"] || process.env.ZANO_WALLET_AUTH || undefined,
|
|
22
|
+
tradeUrl: cliArgs["trade-url"] || process.env.ZANO_TRADE_URL || TRADE_API_URL,
|
|
23
|
+
tradeToken: cliArgs["trade-token"] || process.env.ZANO_TRADE_TOKEN || undefined,
|
|
24
|
+
network,
|
|
25
|
+
logLevel: (cliArgs["log-level"] ||
|
|
26
|
+
process.env.ZANO_LOG_LEVEL ||
|
|
27
|
+
"info"),
|
|
28
|
+
};
|
|
29
|
+
return configSchema.parse(raw);
|
|
30
|
+
}
|
|
31
|
+
export function parseCliArgs(argv) {
|
|
32
|
+
const args = {};
|
|
33
|
+
for (let i = 0; i < argv.length; i++) {
|
|
34
|
+
const arg = argv[i];
|
|
35
|
+
if (arg.startsWith("--") && i + 1 < argv.length) {
|
|
36
|
+
const key = arg.slice(2);
|
|
37
|
+
args[key] = argv[++i];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return args;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGpE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IAC3B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACtC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IAC1B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACvC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;CACrD,CAAC,CAAC;AAIH,MAAM,UAAU,UAAU,CAAC,OAA2C;IACpE,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,SAAS,CAE5D,CAAC;IACd,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,aAAa,CAAC,OAAO,CAAC;IAC9D,MAAM,gBAAgB,GAAG,oBAAoB,KAAK,CAAC,MAAM,WAAW,CAAC;IAErE,MAAM,GAAG,GAAG;QACV,SAAS,EACP,OAAO,CAAC,YAAY,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,eAAe;YAC3B,gBAAgB;QAClB,SAAS,EACP,OAAO,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,SAAS;QACnE,UAAU,EACR,OAAO,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,SAAS;QACrE,QAAQ,EACN,OAAO,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,aAAa;QACrE,UAAU,EACR,OAAO,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,SAAS;QACrE,OAAO;QACP,QAAQ,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,cAAc;YAC1B,MAAM,CAAa;KACtB,CAAC;IAEF,OAAO,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAc;IACzC,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAChD,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { loadConfig, parseCliArgs } from "./config.js";
|
|
4
|
+
import { setLogLevel } from "./logger.js";
|
|
5
|
+
import { logger } from "./logger.js";
|
|
6
|
+
import { createServer } from "./server.js";
|
|
7
|
+
const cliArgs = parseCliArgs(process.argv.slice(2));
|
|
8
|
+
const config = loadConfig(cliArgs);
|
|
9
|
+
setLogLevel(config.logLevel);
|
|
10
|
+
logger.info("Starting Zano MCP server...");
|
|
11
|
+
const server = createServer(config);
|
|
12
|
+
const transport = new StdioServerTransport();
|
|
13
|
+
await server.connect(transport);
|
|
14
|
+
logger.info("Zano MCP server running on stdio");
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;AACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAE7B,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;AAE3C,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;AACpC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAE7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAEhC,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type LogLevel = "debug" | "info" | "warn" | "error";
|
|
2
|
+
export declare function setLogLevel(level: LogLevel): void;
|
|
3
|
+
export declare const logger: {
|
|
4
|
+
debug: (...args: unknown[]) => void;
|
|
5
|
+
info: (...args: unknown[]) => void;
|
|
6
|
+
warn: (...args: unknown[]) => void;
|
|
7
|
+
error: (...args: unknown[]) => void;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAW3D,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAEjD;AAcD,eAAO,MAAM,MAAM;qBACA,OAAO,EAAE;oBACV,OAAO,EAAE;oBACT,OAAO,EAAE;qBACR,OAAO,EAAE;CAC3B,CAAC"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const LEVELS = {
|
|
2
|
+
debug: 0,
|
|
3
|
+
info: 1,
|
|
4
|
+
warn: 2,
|
|
5
|
+
error: 3,
|
|
6
|
+
};
|
|
7
|
+
let currentLevel = "info";
|
|
8
|
+
export function setLogLevel(level) {
|
|
9
|
+
currentLevel = level;
|
|
10
|
+
}
|
|
11
|
+
function shouldLog(level) {
|
|
12
|
+
return LEVELS[level] >= LEVELS[currentLevel];
|
|
13
|
+
}
|
|
14
|
+
function log(level, ...args) {
|
|
15
|
+
if (!shouldLog(level))
|
|
16
|
+
return;
|
|
17
|
+
const ts = new Date().toISOString();
|
|
18
|
+
const prefix = `[${ts}] [${level.toUpperCase()}]`;
|
|
19
|
+
// All logging goes to stderr to avoid interfering with JSON-RPC on stdout
|
|
20
|
+
console.error(prefix, ...args);
|
|
21
|
+
}
|
|
22
|
+
export const logger = {
|
|
23
|
+
debug: (...args) => log("debug", ...args),
|
|
24
|
+
info: (...args) => log("info", ...args),
|
|
25
|
+
warn: (...args) => log("warn", ...args),
|
|
26
|
+
error: (...args) => log("error", ...args),
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,GAA6B;IACvC,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,IAAI,YAAY,GAAa,MAAM,CAAC;AAEpC,MAAM,UAAU,WAAW,CAAC,KAAe;IACzC,YAAY,GAAG,KAAK,CAAC;AACvB,CAAC;AAED,SAAS,SAAS,CAAC,KAAe;IAChC,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,GAAG,CAAC,KAAe,EAAE,GAAG,IAAe;IAC9C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAAE,OAAO;IAC9B,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC;IAClD,0EAA0E;IAC1E,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;IACpD,IAAI,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;IAClD,IAAI,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;IAClD,KAAK,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;CACrD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA0EvE"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { logger } from "../logger.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
export function registerPrompts(server, config) {
|
|
4
|
+
server.prompt("check-network", "Check Zano network status - calls get_network_info and formats a report", {}, async () => ({
|
|
5
|
+
messages: [
|
|
6
|
+
{
|
|
7
|
+
role: "user",
|
|
8
|
+
content: {
|
|
9
|
+
type: "text",
|
|
10
|
+
text: "Use the get_network_info tool to check the current Zano network status. Report the block height, sync status, difficulty, hashrate, connection count, and pool size. Flag anything unusual (low connections, sync lag, empty pool).",
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
],
|
|
14
|
+
}));
|
|
15
|
+
server.prompt("analyze-order-book", "Analyze the DEX order book for a trading pair", { pair_id: z.string().describe("Trading pair ID (e.g. 643 for FUSD)") }, async ({ pair_id }) => ({
|
|
16
|
+
messages: [
|
|
17
|
+
{
|
|
18
|
+
role: "user",
|
|
19
|
+
content: {
|
|
20
|
+
type: "text",
|
|
21
|
+
text: `Use the get_order_book tool with pairId ${pair_id} and the get_trading_pair tool with id ${pair_id}. Analyze the order book depth, bid/ask spread, instant vs non-instant orders, and top traders. Summarize liquidity and any arbitrage opportunities.`,
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
}));
|
|
26
|
+
server.prompt("explain-transaction", "Explain a Zano transaction in human-readable terms", { tx_hash: z.string().describe("Transaction hash") }, async ({ tx_hash }) => ({
|
|
27
|
+
messages: [
|
|
28
|
+
{
|
|
29
|
+
role: "user",
|
|
30
|
+
content: {
|
|
31
|
+
type: "text",
|
|
32
|
+
text: `Use the get_transaction tool with tx_hash "${tx_hash}". Explain the transaction in human-readable terms: what happened, how much was sent, the fee, confirmations, and any asset operations.`,
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
}));
|
|
37
|
+
server.prompt("swap-calculator", "Calculate what an ionic swap would look like between two assets", {
|
|
38
|
+
from_asset: z.string().describe("Source asset ticker or ID"),
|
|
39
|
+
to_asset: z.string().describe("Destination asset ticker or ID"),
|
|
40
|
+
amount: z.string().describe("Amount to swap (human-readable)"),
|
|
41
|
+
}, async ({ from_asset, to_asset, amount }) => ({
|
|
42
|
+
messages: [
|
|
43
|
+
{
|
|
44
|
+
role: "user",
|
|
45
|
+
content: {
|
|
46
|
+
type: "text",
|
|
47
|
+
text: `I want to swap ${amount} ${from_asset} for ${to_asset}. Look up both assets using get_asset_info if needed. Calculate the swap parameters and explain what the ionic swap proposal would contain, including atomic amounts, fees, and the expected outcome.`,
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
}));
|
|
52
|
+
logger.info("Prompts registered (4 prompts)");
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,MAAc;IAC/D,MAAM,CAAC,MAAM,CACX,eAAe,EACf,yEAAyE,EACzE,EAAE,EACF,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,qOAAqO;iBAC5O;aACF;SACF;KACF,CAAC,CACH,CAAC;IAEF,MAAM,CAAC,MAAM,CACX,oBAAoB,EACpB,+CAA+C,EAC/C,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC,EAAE,EACvE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACtB,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,2CAA2C,OAAO,0CAA0C,OAAO,sJAAsJ;iBAChQ;aACF;SACF;KACF,CAAC,CACH,CAAC;IAEF,MAAM,CAAC,MAAM,CACX,qBAAqB,EACrB,oDAAoD,EACpD,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,EACpD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACtB,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,8CAA8C,OAAO,yIAAyI;iBACrM;aACF;SACF;KACF,CAAC,CACH,CAAC;IAEF,MAAM,CAAC,MAAM,CACX,iBAAiB,EACjB,iEAAiE,EACjE;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QAC5D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QAC/D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;KAC/D,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3C,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,kBAAkB,MAAM,IAAI,UAAU,QAAQ,QAAQ,uMAAuM;iBACpQ;aACF;SACF;KACF,CAAC,CACH,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAmEzE"}
|