kinetic-mcp 1.0.1 → 1.2.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 +82 -49
- package/build/index.js +15 -0
- package/build/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,10 +1,28 @@
|
|
|
1
|
-
# Solana Trading
|
|
1
|
+
# Kinetic MCP — Solana Trading for Claude Desktop
|
|
2
2
|
|
|
3
|
-
An MCP
|
|
3
|
+
An MCP server that lets you check balances and swap tokens on Solana through natural language in Claude Desktop. Runs locally on your machine, powered by the [Kinetic](https://kinetic.xyz) trading platform.
|
|
4
|
+
|
|
5
|
+
**Prerequisites:** [Node.js 20+](https://nodejs.org)
|
|
4
6
|
|
|
5
7
|
## Quick Start
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
### Option A: Setup Wizard (Recommended)
|
|
10
|
+
|
|
11
|
+
The setup wizard walks you through keypair import and Claude Desktop configuration:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx kinetic-mcp setup
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### Option B: Manual Configuration
|
|
18
|
+
|
|
19
|
+
Add this to your Claude Desktop config file and restart Claude Desktop:
|
|
20
|
+
|
|
21
|
+
| Platform | Config file path |
|
|
22
|
+
| -------- | ----------------------------------------------------------------- |
|
|
23
|
+
| macOS | `~/Library/Application Support/Claude/claude_desktop_config.json` |
|
|
24
|
+
| Windows | `%APPDATA%\Claude\claude_desktop_config.json` |
|
|
25
|
+
| Linux | `~/.config/Claude/claude_desktop_config.json` |
|
|
8
26
|
|
|
9
27
|
```json
|
|
10
28
|
{
|
|
@@ -20,10 +38,46 @@ Add this to your Claude Desktop config file (`~/Library/Application Support/Clau
|
|
|
20
38
|
}
|
|
21
39
|
```
|
|
22
40
|
|
|
23
|
-
|
|
41
|
+
If you have a Kinetic API key, add `"API_KEY": "your_key"` to the `env` block.
|
|
42
|
+
|
|
43
|
+
Restart Claude Desktop (fully quit and reopen — not just close the window). Look for the hammer icon in the chat input.
|
|
44
|
+
|
|
45
|
+
## Creating a Keypair
|
|
46
|
+
|
|
47
|
+
You need a Solana keypair file — a JSON array of 64 integers in [Solana CLI format](https://docs.solanalabs.com/cli/wallets/file-system).
|
|
48
|
+
|
|
49
|
+
### Exporting from Phantom
|
|
50
|
+
|
|
51
|
+
Open Phantom > Settings > Manage Accounts > [your account] > Show Private Key. Copy the base58 string.
|
|
52
|
+
|
|
53
|
+
### Converting to Keypair File
|
|
54
|
+
|
|
55
|
+
Run from any directory:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
npx -y -p bs58 node --input-type=module -e "
|
|
59
|
+
import bs58 from 'bs58';
|
|
60
|
+
import { writeFileSync, mkdirSync } from 'fs';
|
|
61
|
+
import { join } from 'path';
|
|
62
|
+
import { homedir } from 'os';
|
|
63
|
+
const dir = join(homedir(), '.config', 'solana');
|
|
64
|
+
mkdirSync(dir, { recursive: true });
|
|
65
|
+
const out = join(dir, 'trading-keypair.json');
|
|
66
|
+
writeFileSync(out, JSON.stringify(Array.from(bs58.decode('YOUR_PRIVATE_KEY_HERE'))) + '\n');
|
|
67
|
+
console.log('Saved to', out);
|
|
68
|
+
"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
On macOS/Linux, lock down permissions: `chmod 600 ~/.config/solana/trading-keypair.json`
|
|
72
|
+
|
|
73
|
+
Update `SOLANA_KEYPAIR_PATH` in your Claude Desktop config to point to the keypair file, then restart Claude Desktop.
|
|
74
|
+
|
|
75
|
+
**Never share your private key, paste it into websites, or commit it to git.**
|
|
24
76
|
|
|
25
77
|
## Usage
|
|
26
78
|
|
|
79
|
+
Try these prompts in Claude Desktop:
|
|
80
|
+
|
|
27
81
|
- "What's my SOL balance?"
|
|
28
82
|
- "Show me all my token holdings"
|
|
29
83
|
- "Swap 0.01 SOL for USDC" — Claude shows a quote preview and asks for confirmation
|
|
@@ -31,13 +85,6 @@ Restart Claude Desktop (fully quit and reopen). See the [getting started guide](
|
|
|
31
85
|
|
|
32
86
|
Claude will ask for permission the first time it uses a tool. Click "Allow for This Chat" or "Allow Always".
|
|
33
87
|
|
|
34
|
-
## Safety Guardrails
|
|
35
|
-
|
|
36
|
-
- **Two-step confirmation** — swaps always show a quote preview first; you must confirm before execution
|
|
37
|
-
- **Max trade size** — `MAX_TRADE_SOL` limits swap size in SOL-equivalent (default: 10 SOL)
|
|
38
|
-
- **Slippage cap** — maximum 10% (1000 bps) enforced by input validation
|
|
39
|
-
- **No private key exposure** — keypair is loaded from a local file only, never accepted as tool input
|
|
40
|
-
|
|
41
88
|
## Available Tools
|
|
42
89
|
|
|
43
90
|
| Tool | Description | Inputs |
|
|
@@ -45,53 +92,39 @@ Claude will ask for permission the first time it uses a tool. Click "Allow for T
|
|
|
45
92
|
| `get_wallet_balance` | Get SOL balance and all token holdings | None |
|
|
46
93
|
| `swap_tokens` | Swap one token for another | `from_token`, `to_token`, `amount`, `slippage_bps` (optional), `confirm` |
|
|
47
94
|
|
|
48
|
-
##
|
|
95
|
+
## Safety Guardrails
|
|
49
96
|
|
|
50
|
-
- **
|
|
51
|
-
- **
|
|
52
|
-
- **
|
|
97
|
+
- **Two-step confirmation** — swaps always show a quote preview first; you must confirm before execution
|
|
98
|
+
- **Max trade size** — `MAX_TRADE_SOL` limits swap size in SOL-equivalent (default: 10 SOL)
|
|
99
|
+
- **Slippage cap** — maximum 10% (1000 bps) enforced by input validation
|
|
100
|
+
- **No private key exposure** — keypair is loaded from a local file only, never accepted as tool input
|
|
53
101
|
|
|
54
102
|
## Troubleshooting
|
|
55
103
|
|
|
56
|
-
| Problem | Solution
|
|
57
|
-
| --------------------------------- |
|
|
58
|
-
| No hammer icon appears | Check that
|
|
59
|
-
| "Unable to connect to MCP server" | Check Claude Desktop logs for errors. Verify
|
|
60
|
-
| Tools appear but return errors |
|
|
61
|
-
| "Cannot find module" errors | Run `npm install && npm run build
|
|
62
|
-
|
|
|
63
|
-
| Balance shows mint addresses | Token not in well-known table. Use mint address for swaps with unknown tokens. |
|
|
104
|
+
| Problem | Solution |
|
|
105
|
+
| --------------------------------- | ------------------------------------------------------------------------------------------------ |
|
|
106
|
+
| No hammer icon appears | Check that your config JSON is valid and the path is absolute. Fully restart Claude Desktop. |
|
|
107
|
+
| "Unable to connect to MCP server" | Check Claude Desktop logs for errors. Verify Node.js 20+ is installed. |
|
|
108
|
+
| Tools appear but return errors | Verify `SOLANA_KEYPAIR_PATH` points to a valid 64-byte keypair file. Test network access. |
|
|
109
|
+
| "Cannot find module" errors | Run `npm install && npm run build` (if running from source). Make sure you're using Node.js 20+. |
|
|
110
|
+
| Balance shows mint addresses | Token not in well-known table. Use the mint address directly for swaps. |
|
|
64
111
|
|
|
65
112
|
**Where to find Claude Desktop logs:**
|
|
66
113
|
|
|
67
114
|
- **macOS**: `~/Library/Logs/Claude/`
|
|
68
115
|
- **Windows**: `%APPDATA%\Claude\logs\`
|
|
116
|
+
- **Linux**: `~/.config/Claude/logs/`
|
|
69
117
|
|
|
70
|
-
##
|
|
118
|
+
## Configuration
|
|
71
119
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
120
|
+
The only required environment variable is `SOLANA_KEYPAIR_PATH`. All others have sensible defaults.
|
|
121
|
+
|
|
122
|
+
See [docs/development.md](docs/development.md#environment-variables) for the full configuration reference.
|
|
123
|
+
|
|
124
|
+
## Contributing
|
|
125
|
+
|
|
126
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines.
|
|
127
|
+
|
|
128
|
+
## License
|
|
80
129
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
| Variable | Required | Default | Description |
|
|
84
|
-
| -------------------------- | -------- | ------------------------------------- | ------------------------------------ |
|
|
85
|
-
| `SOLANA_KEYPAIR_PATH` | Yes | — | Path to Solana keypair JSON file |
|
|
86
|
-
| `API_BASE_URL` | No | `https://api.kinetic.xyz` | Kinetic API base URL |
|
|
87
|
-
| `AUTH_BASE_URL` | No | `https://auth.kinetic.xyz` | Kinetic auth base URL |
|
|
88
|
-
| `API_KEY` | No | — | Kinetic API key (higher rate limits) |
|
|
89
|
-
| `SOLANA_RPC_URL` | No | `https://api.mainnet-beta.solana.com` | Solana RPC endpoint |
|
|
90
|
-
| `MAX_TRADE_SOL` | No | `10` | Max swap size in SOL-equivalent |
|
|
91
|
-
| `PRIORITY_FEE_LAMPORTS` | No | `400000` | Priority fee for transactions |
|
|
92
|
-
| `DYNAMIC_SLIPPAGE_MIN_BPS` | No | `1` | Minimum dynamic slippage (bps) |
|
|
93
|
-
| `DYNAMIC_SLIPPAGE_MAX_BPS` | No | `300` | Maximum dynamic slippage (bps) |
|
|
94
|
-
| `JITO_ENABLED` | No | `false` | Enable Jito MEV protection |
|
|
95
|
-
| `REQUEST_TIMEOUT_MS` | No | `30000` | API request timeout (ms) |
|
|
96
|
-
| `SEND_TX_TIMEOUT_MS` | No | `120000` | sendTransaction stream timeout (ms) |
|
|
97
|
-
| `LOG_LEVEL` | No | `info` | Log level (debug, info, warn, error) |
|
|
130
|
+
MIT
|
package/build/index.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from "node:module";
|
|
3
|
+
import { execSync } from "node:child_process";
|
|
4
|
+
import { resolve, dirname } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
3
6
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
4
7
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
8
|
import { z } from "zod";
|
|
@@ -10,6 +13,18 @@ import { initApiClient } from "./utils/api-client.js";
|
|
|
10
13
|
import { initTokenResolver } from "./utils/token-resolver.js";
|
|
11
14
|
import { initSwap, swapTokens } from "./tools/swap.js";
|
|
12
15
|
import { getWalletBalance } from "./tools/balance.js";
|
|
16
|
+
// Route `kinetic-mcp setup` to the interactive setup wizard
|
|
17
|
+
if (process.argv[2] === "setup") {
|
|
18
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
19
|
+
const setupScript = resolve(__dirname, "..", "scripts", "setup.mjs");
|
|
20
|
+
try {
|
|
21
|
+
execSync(`"${process.execPath}" "${setupScript}"`, { stdio: "inherit" });
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
process.exit(0);
|
|
27
|
+
}
|
|
13
28
|
const require = createRequire(import.meta.url);
|
|
14
29
|
const { version } = require("../package.json");
|
|
15
30
|
async function main() {
|
package/build/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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"}
|