@nukeguys/exkit-mcp 1.0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Seung Seung-Kyu
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.en.md ADDED
@@ -0,0 +1,531 @@
1
+ # @nukeguys/exkit-mcp
2
+
3
+ Cryptocurrency exchange APIs as MCP tools. Connect Claude, Cursor, or any MCP client to crypto exchanges.
4
+
5
+ ## Quick Start
6
+
7
+ No installation required. Run directly with `npx`:
8
+
9
+ ```bash
10
+ npx @nukeguys/exkit-mcp <exchange>
11
+ ```
12
+
13
+ Supported exchanges: `upbit`, `bithumb`, `coinone`, `korbit`, `gopax`
14
+
15
+ ## Configuration
16
+
17
+ Each exchange runs as a separate MCP server. Add the exchanges you need to your MCP client configuration.
18
+
19
+ ### Claude Desktop
20
+
21
+ Edit `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
22
+
23
+ ```json
24
+ {
25
+ "mcpServers": {
26
+ "upbit": {
27
+ "command": "npx",
28
+ "args": ["-y", "@nukeguys/exkit-mcp", "upbit"],
29
+ "env": {
30
+ "UPBIT_ACCESS_KEY": "your-access-key",
31
+ "UPBIT_SECRET_KEY": "your-secret-key"
32
+ }
33
+ },
34
+ "bithumb": {
35
+ "command": "npx",
36
+ "args": ["-y", "@nukeguys/exkit-mcp", "bithumb"],
37
+ "env": {
38
+ "BITHUMB_API_KEY": "your-api-key",
39
+ "BITHUMB_SECRET_KEY": "your-secret-key"
40
+ }
41
+ },
42
+ "coinone": {
43
+ "command": "npx",
44
+ "args": ["-y", "@nukeguys/exkit-mcp", "coinone"],
45
+ "env": {
46
+ "COINONE_ACCESS_KEY": "your-access-key",
47
+ "COINONE_SECRET_KEY": "your-secret-key"
48
+ }
49
+ },
50
+ "korbit": {
51
+ "command": "npx",
52
+ "args": ["-y", "@nukeguys/exkit-mcp", "korbit"],
53
+ "env": {
54
+ "KORBIT_API_KEY": "your-api-key",
55
+ "KORBIT_SECRET_KEY": "your-secret-key"
56
+ }
57
+ },
58
+ "gopax": {
59
+ "command": "npx",
60
+ "args": ["-y", "@nukeguys/exkit-mcp", "gopax"],
61
+ "env": {
62
+ "GOPAX_API_KEY": "your-api-key",
63
+ "GOPAX_SECRET": "your-secret"
64
+ }
65
+ }
66
+ }
67
+ }
68
+ ```
69
+
70
+ ### Claude Code
71
+
72
+ ```bash
73
+ # Upbit
74
+ claude mcp add upbit --env UPBIT_ACCESS_KEY=your-access-key --env UPBIT_SECRET_KEY=your-secret-key -- npx -y @nukeguys/exkit-mcp upbit
75
+
76
+ # Bithumb
77
+ claude mcp add bithumb --env BITHUMB_API_KEY=your-api-key --env BITHUMB_SECRET_KEY=your-secret-key -- npx -y @nukeguys/exkit-mcp bithumb
78
+
79
+ # Coinone
80
+ claude mcp add coinone --env COINONE_ACCESS_KEY=your-access-key --env COINONE_SECRET_KEY=your-secret-key -- npx -y @nukeguys/exkit-mcp coinone
81
+
82
+ # Korbit (HMAC)
83
+ claude mcp add korbit --env KORBIT_API_KEY=your-api-key --env KORBIT_SECRET_KEY=your-secret-key -- npx -y @nukeguys/exkit-mcp korbit
84
+
85
+ # Korbit (Ed25519)
86
+ claude mcp add korbit --env KORBIT_AUTH_SCHEME=ed25519 --env KORBIT_API_KEY=your-api-key --env KORBIT_PRIVATE_KEY=your-private-key -- npx -y @nukeguys/exkit-mcp korbit
87
+
88
+ # Gopax
89
+ claude mcp add gopax --env GOPAX_API_KEY=your-api-key --env GOPAX_SECRET=your-secret -- npx -y @nukeguys/exkit-mcp gopax
90
+ ```
91
+
92
+ > **Note:** Public APIs work without authentication. You can register without env variables:
93
+ >
94
+ > ```bash
95
+ > claude mcp add upbit -- npx -y @nukeguys/exkit-mcp upbit
96
+ > ```
97
+
98
+ ### VS Code / Cursor
99
+
100
+ Add to `.vscode/mcp.json` in your project:
101
+
102
+ ```json
103
+ {
104
+ "servers": {
105
+ "upbit": {
106
+ "command": "npx",
107
+ "args": ["-y", "@nukeguys/exkit-mcp", "upbit"],
108
+ "env": {
109
+ "UPBIT_ACCESS_KEY": "your-access-key",
110
+ "UPBIT_SECRET_KEY": "your-secret-key"
111
+ }
112
+ },
113
+ "bithumb": {
114
+ "command": "npx",
115
+ "args": ["-y", "@nukeguys/exkit-mcp", "bithumb"],
116
+ "env": {
117
+ "BITHUMB_API_KEY": "your-api-key",
118
+ "BITHUMB_SECRET_KEY": "your-secret-key"
119
+ }
120
+ },
121
+ "coinone": {
122
+ "command": "npx",
123
+ "args": ["-y", "@nukeguys/exkit-mcp", "coinone"],
124
+ "env": {
125
+ "COINONE_ACCESS_KEY": "your-access-key",
126
+ "COINONE_SECRET_KEY": "your-secret-key"
127
+ }
128
+ },
129
+ "korbit": {
130
+ "command": "npx",
131
+ "args": ["-y", "@nukeguys/exkit-mcp", "korbit"],
132
+ "env": {
133
+ "KORBIT_API_KEY": "your-api-key",
134
+ "KORBIT_SECRET_KEY": "your-secret-key"
135
+ }
136
+ },
137
+ "gopax": {
138
+ "command": "npx",
139
+ "args": ["-y", "@nukeguys/exkit-mcp", "gopax"],
140
+ "env": {
141
+ "GOPAX_API_KEY": "your-api-key",
142
+ "GOPAX_SECRET": "your-secret"
143
+ }
144
+ }
145
+ }
146
+ }
147
+ ```
148
+
149
+ ### Codex CLI
150
+
151
+ Add to `~/.codex/config.json`:
152
+
153
+ ```json
154
+ {
155
+ "mcpServers": {
156
+ "upbit": {
157
+ "command": "npx",
158
+ "args": ["-y", "@nukeguys/exkit-mcp", "upbit"],
159
+ "env": {
160
+ "UPBIT_ACCESS_KEY": "your-access-key",
161
+ "UPBIT_SECRET_KEY": "your-secret-key"
162
+ }
163
+ },
164
+ "bithumb": {
165
+ "command": "npx",
166
+ "args": ["-y", "@nukeguys/exkit-mcp", "bithumb"],
167
+ "env": {
168
+ "BITHUMB_API_KEY": "your-api-key",
169
+ "BITHUMB_SECRET_KEY": "your-secret-key"
170
+ }
171
+ },
172
+ "coinone": {
173
+ "command": "npx",
174
+ "args": ["-y", "@nukeguys/exkit-mcp", "coinone"],
175
+ "env": {
176
+ "COINONE_ACCESS_KEY": "your-access-key",
177
+ "COINONE_SECRET_KEY": "your-secret-key"
178
+ }
179
+ },
180
+ "korbit": {
181
+ "command": "npx",
182
+ "args": ["-y", "@nukeguys/exkit-mcp", "korbit"],
183
+ "env": {
184
+ "KORBIT_API_KEY": "your-api-key",
185
+ "KORBIT_SECRET_KEY": "your-secret-key"
186
+ }
187
+ },
188
+ "gopax": {
189
+ "command": "npx",
190
+ "args": ["-y", "@nukeguys/exkit-mcp", "gopax"],
191
+ "env": {
192
+ "GOPAX_API_KEY": "your-api-key",
193
+ "GOPAX_SECRET": "your-secret"
194
+ }
195
+ }
196
+ }
197
+ }
198
+ ```
199
+
200
+ > **Note:** API keys are only required for private APIs (account, orders, deposits/withdrawals). Public APIs (market data, tickers, orderbooks) work without authentication.
201
+
202
+ ## Environment Variables
203
+
204
+ | Exchange | Variables | Note |
205
+ | -------- | -------------------------------------------------------------------- | ------------------- |
206
+ | Upbit | `UPBIT_ACCESS_KEY`, `UPBIT_SECRET_KEY` | |
207
+ | Bithumb | `BITHUMB_API_KEY`, `BITHUMB_SECRET_KEY` | |
208
+ | Coinone | `COINONE_ACCESS_KEY`, `COINONE_SECRET_KEY` | |
209
+ | Korbit | `KORBIT_API_KEY`, `KORBIT_SECRET_KEY` | HMAC auth (default) |
210
+ | Korbit | `KORBIT_API_KEY`, `KORBIT_PRIVATE_KEY`, `KORBIT_AUTH_SCHEME=ed25519` | Ed25519 auth |
211
+ | Gopax | `GOPAX_API_KEY`, `GOPAX_SECRET` | |
212
+
213
+ ## Available Tools
214
+
215
+ ### Upbit (45 tools)
216
+
217
+ <details>
218
+ <summary>Market Data (public)</summary>
219
+
220
+ | Tool | Description |
221
+ | ---------------------------- | ---------------------------- |
222
+ | `list_trading_pairs` | List available trading pairs |
223
+ | `list_tickers` | Get current prices by pair |
224
+ | `list_quote_tickers` | Get current prices by market |
225
+ | `list_orderbooks` | Get orderbook data |
226
+ | `list_orderbook_instruments` | Get orderbook policies |
227
+ | `list_orderbook_levels` | Get orderbook level units |
228
+ | `list_candles_seconds` | Get second candles |
229
+ | `list_candles_minutes` | Get minute candles |
230
+ | `list_candles_days` | Get daily candles |
231
+ | `list_candles_weeks` | Get weekly candles |
232
+ | `list_candles_months` | Get monthly candles |
233
+ | `list_candles_years` | Get yearly candles |
234
+ | `recent_trades_history` | Get recent trade history |
235
+
236
+ </details>
237
+
238
+ <details>
239
+ <summary>Account & Orders (private)</summary>
240
+
241
+ | Tool | Description |
242
+ | ----------------------------- | ------------------------------------- |
243
+ | `get_balance` | Get account balance |
244
+ | `list_api_keys` | List API keys |
245
+ | `get_service_status` | Get deposit/withdrawal service status |
246
+ | `available_order_information` | Get order availability info by pair |
247
+ | `new_order` | Place a new order |
248
+ | `test_order` | Test order placement |
249
+ | `cancel_order` | Cancel an order |
250
+ | `cancel_and_new_order` | Cancel and replace an order |
251
+ | `batch_cancel_orders` | Batch cancel orders |
252
+ | `cancel_orders_by_ids` | Cancel orders by IDs |
253
+ | `get_order` | Get order details |
254
+ | `list_open_orders` | List open orders |
255
+ | `list_closed_orders` | List closed orders |
256
+ | `list_orders_by_ids` | List orders by IDs |
257
+
258
+ </details>
259
+
260
+ <details>
261
+ <summary>Deposits & Withdrawals (private)</summary>
262
+
263
+ | Tool | Description |
264
+ | ---------------------------------- | --------------------------------- |
265
+ | `available_deposit_information` | Get deposit availability info |
266
+ | `available_withdrawal_information` | Get withdrawal availability info |
267
+ | `get_deposit` | Get deposit details |
268
+ | `get_deposit_address` | Get deposit address |
269
+ | `list_deposits` | List deposits |
270
+ | `list_deposit_addresses` | List deposit addresses |
271
+ | `create_deposit_address` | Create deposit address |
272
+ | `deposit_krw` | Deposit KRW |
273
+ | `get_withdrawal` | Get withdrawal details |
274
+ | `list_withdrawals` | List withdrawals |
275
+ | `list_withdrawal_addresses` | List allowed withdrawal addresses |
276
+ | `withdraw` | Withdraw digital assets |
277
+ | `withdraw_krw` | Withdraw KRW |
278
+ | `withdraw_fiat` | Withdraw fiat currency |
279
+ | `cancel_withdrawal` | Cancel withdrawal |
280
+
281
+ </details>
282
+
283
+ <details>
284
+ <summary>Travel Rule (private)</summary>
285
+
286
+ | Tool | Description |
287
+ | --------------------------- | ------------------------------------ |
288
+ | `list_travelrule_vasps` | List travel rule supported exchanges |
289
+ | `verify_travelrule_by_txid` | Verify account by TxID |
290
+ | `verify_travelrule_by_uuid` | Verify account by UUID |
291
+
292
+ </details>
293
+
294
+ ### Bithumb (38 tools)
295
+
296
+ <details>
297
+ <summary>Market Data (public)</summary>
298
+
299
+ | Tool | Description |
300
+ | ---------------------------- | --------------------------- |
301
+ | `list_markets` | List market codes |
302
+ | `list_tickers` | Get current prices |
303
+ | `list_orderbooks` | Get orderbook data |
304
+ | `list_recent_trades` | Get recent trades |
305
+ | `list_day_candles` | Get daily candles |
306
+ | `list_minute_candles` | Get minute candles |
307
+ | `list_month_candles` | Get monthly candles |
308
+ | `list_week_candles` | Get weekly candles |
309
+ | `list_notices` | Get announcements |
310
+ | `list_market_warnings` | Get market warnings |
311
+ | `get_deposit_withdrawal_fee` | Get deposit/withdrawal fees |
312
+
313
+ </details>
314
+
315
+ <details>
316
+ <summary>Account & Orders (private)</summary>
317
+
318
+ | Tool | Description |
319
+ | ---------------------- | ---------------------- |
320
+ | `list_accounts` | List all accounts |
321
+ | `list_api_keys` | List API keys |
322
+ | `list_wallet_statuses` | Get wallet statuses |
323
+ | `get_order_chance` | Get order availability |
324
+ | `create_order` | Place an order |
325
+ | `create_orders` | Place multiple orders |
326
+ | `cancel_order` | Cancel an order |
327
+ | `cancel_orders` | Cancel multiple orders |
328
+ | `get_order` | Get order details |
329
+ | `list_orders` | List orders |
330
+ | `create_twap_order` | Place TWAP order |
331
+ | `cancel_twap_order` | Cancel TWAP order |
332
+ | `list_twap_orders` | List TWAP orders |
333
+
334
+ </details>
335
+
336
+ <details>
337
+ <summary>Deposits & Withdrawals (private)</summary>
338
+
339
+ | Tool | Description |
340
+ | --------------------------- | --------------------------- |
341
+ | `get_deposit` | Get deposit details |
342
+ | `get_deposit_address` | Get deposit address |
343
+ | `list_deposits` | List deposits |
344
+ | `list_deposit_addresses` | List deposit addresses |
345
+ | `create_deposit_address` | Create deposit address |
346
+ | `create_krw_deposit` | Deposit KRW |
347
+ | `list_krw_deposits` | List KRW deposits |
348
+ | `get_withdrawal` | Get withdrawal details |
349
+ | `get_withdrawal_chance` | Get withdrawal availability |
350
+ | `list_withdrawals` | List withdrawals |
351
+ | `list_withdrawal_addresses` | List withdrawal addresses |
352
+ | `create_coin_withdrawal` | Withdraw digital assets |
353
+ | `create_krw_withdrawal` | Withdraw KRW |
354
+ | `list_krw_withdrawals` | List KRW withdrawals |
355
+
356
+ </details>
357
+
358
+ ### Coinone (35 tools)
359
+
360
+ <details>
361
+ <summary>Market Data (public)</summary>
362
+
363
+ | Tool | Description |
364
+ | -------------------- | -------------------------- |
365
+ | `list_markets` | List all markets |
366
+ | `get_market` | Get market details |
367
+ | `list_currencies` | List all currencies |
368
+ | `get_currency` | Get currency details |
369
+ | `list_tickers` | Get all tickers |
370
+ | `get_ticker` | Get ticker by market |
371
+ | `list_utc_tickers` | Get all tickers (UTC) |
372
+ | `get_utc_ticker` | Get ticker by market (UTC) |
373
+ | `get_orderbook` | Get orderbook |
374
+ | `get_range_units` | Get price range units |
375
+ | `list_candles` | Get candle chart data |
376
+ | `list_recent_trades` | Get recent trades |
377
+
378
+ </details>
379
+
380
+ <details>
381
+ <summary>Account & Orders (private)</summary>
382
+
383
+ | Tool | Description |
384
+ | --------------------------------- | ------------------------------- |
385
+ | `list_balances` | Get all balances |
386
+ | `list_balances_by_currencies` | Get balances by currency |
387
+ | `get_trade_fee` | Get trade fee by market |
388
+ | `list_trade_fees` | Get all trade fees |
389
+ | `create_order` | Place an order |
390
+ | `create_limit_order` | Place a limit order |
391
+ | `cancel_order` | Cancel an order |
392
+ | `cancel_orders` | Cancel all orders by market |
393
+ | `get_order` | Get order details |
394
+ | `get_order_detail` | Get order info |
395
+ | `list_active_orders` | List active orders |
396
+ | `list_open_orders` | List all open orders |
397
+ | `list_open_orders_by_market` | List open orders by market |
398
+ | `list_completed_orders` | List all completed orders |
399
+ | `list_completed_orders_by_market` | List completed orders by market |
400
+ | `list_order_reward_programs` | Get order reward programs |
401
+ | `list_order_reward_history` | Get order reward history |
402
+
403
+ </details>
404
+
405
+ <details>
406
+ <summary>Deposits & Withdrawals (private)</summary>
407
+
408
+ | Tool | Description |
409
+ | --------------------------- | ------------------------------- |
410
+ | `get_coin_transaction` | Get deposit/withdrawal detail |
411
+ | `get_coin_withdrawal_limit` | Get withdrawal limit |
412
+ | `list_coin_transactions` | List deposit/withdrawal history |
413
+ | `list_krw_transactions` | List KRW transaction history |
414
+ | `list_withdrawal_addresses` | List withdrawal addresses |
415
+ | `create_coin_withdrawal` | Withdraw digital assets |
416
+
417
+ </details>
418
+
419
+ ### Korbit (32 tools)
420
+
421
+ <details>
422
+ <summary>Market Data (public)</summary>
423
+
424
+ | Tool | Description |
425
+ | ------------------------- | ---------------------- |
426
+ | `list_markets` | List supported markets |
427
+ | `list_currencies` | List currency info |
428
+ | `list_tickers` | Get current prices |
429
+ | `get_orderbook` | Get orderbook |
430
+ | `list_tick_size_policies` | Get tick size policies |
431
+ | `list_candles` | Get candlestick data |
432
+ | `list_recent_trades` | Get recent trades |
433
+ | `get_server_time` | Get server time |
434
+
435
+ </details>
436
+
437
+ <details>
438
+ <summary>Account & Orders (private)</summary>
439
+
440
+ | Tool | Description |
441
+ | --------------------------- | --------------------- |
442
+ | `list_balances` | Get account balances |
443
+ | `get_current_key_info` | Get API key info |
444
+ | `list_trading_fee_policies` | Get trading fee rates |
445
+ | `create_order` | Place an order |
446
+ | `cancel_order` | Cancel an order |
447
+ | `get_order` | Get order details |
448
+ | `list_orders` | List recent orders |
449
+ | `list_open_orders` | List open orders |
450
+ | `list_my_trades` | List my recent trades |
451
+
452
+ </details>
453
+
454
+ <details>
455
+ <summary>Deposits & Withdrawals (private)</summary>
456
+
457
+ | Tool | Description |
458
+ | ----------------------------- | --------------------------------- |
459
+ | `get_deposit` | Get deposit status |
460
+ | `get_deposit_address` | Get deposit address |
461
+ | `list_deposits` | List recent deposits |
462
+ | `list_deposit_addresses` | List all deposit addresses |
463
+ | `create_deposit_address` | Create deposit address |
464
+ | `create_krw_deposit` | Deposit KRW |
465
+ | `list_krw_deposits` | List KRW deposits |
466
+ | `get_withdrawal` | Get withdrawal status |
467
+ | `get_withdrawable_amount` | Get withdrawable amount |
468
+ | `list_withdrawals` | List recent withdrawals |
469
+ | `list_withdrawable_addresses` | List allowed withdrawal addresses |
470
+ | `create_withdrawal` | Withdraw digital assets |
471
+ | `create_krw_withdrawal` | Withdraw KRW |
472
+ | `list_krw_withdrawals` | List KRW withdrawals |
473
+ | `cancel_withdrawal` | Cancel withdrawal |
474
+
475
+ </details>
476
+
477
+ ### Gopax (26 tools)
478
+
479
+ <details>
480
+ <summary>Market Data (public)</summary>
481
+
482
+ | Tool | Description |
483
+ | --------------------- | ------------------------- |
484
+ | `list_trading_pairs` | List trading pairs |
485
+ | `list_assets` | List assets |
486
+ | `list_tickers` | Get all tickers |
487
+ | `get_ticker` | Get ticker by pair |
488
+ | `list_stats` | Get 24h stats (all pairs) |
489
+ | `get_stats` | Get 24h stats by pair |
490
+ | `get_orderbook` | Get orderbook |
491
+ | `get_price_tick_size` | Get price tick size |
492
+ | `list_candles` | Get chart data |
493
+ | `list_recent_trades` | Get recent trades |
494
+ | `list_notices` | Get announcements |
495
+ | `list_cautions` | Get investment warnings |
496
+ | `get_server_time` | Get server time |
497
+
498
+ </details>
499
+
500
+ <details>
501
+ <summary>Account & Orders (private)</summary>
502
+
503
+ | Tool | Description |
504
+ | --------------------------------- | ------------------------- |
505
+ | `list_balances` | Get all balances |
506
+ | `get_balance` | Get balance by asset |
507
+ | `create_order` | Place an order |
508
+ | `cancel_order` | Cancel an order |
509
+ | `cancel_order_by_client_order_id` | Cancel order by client ID |
510
+ | `get_order` | Get order details |
511
+ | `get_order_by_client_order_id` | Get order by client ID |
512
+ | `list_orders` | List orders |
513
+ | `list_trades` | List trade history |
514
+
515
+ </details>
516
+
517
+ <details>
518
+ <summary>Deposits & Withdrawals (private)</summary>
519
+
520
+ | Tool | Description |
521
+ | ---------------------------------- | ------------------------------- |
522
+ | `list_deposit_addresses` | List deposit addresses |
523
+ | `list_withdrawal_addresses` | List withdrawal addresses |
524
+ | `list_deposit_withdrawal_statuses` | List deposit/withdrawal history |
525
+ | `create_withdrawal` | Withdraw digital assets |
526
+
527
+ </details>
528
+
529
+ ## License
530
+
531
+ MIT
package/README.md ADDED
@@ -0,0 +1,533 @@
1
+ # @nukeguys/exkit-mcp
2
+
3
+ 가상자산 거래소 API를 MCP 도구로 제공합니다. Claude, Cursor 등 MCP를 지원하는 AI 클라이언트에서 거래소의 REST API를 바로 사용할 수 있습니다.
4
+
5
+ [English](./README.en.md)
6
+
7
+ ## 빠른 시작
8
+
9
+ 설치 없이 `npx`로 바로 실행할 수 있습니다:
10
+
11
+ ```bash
12
+ npx @nukeguys/exkit-mcp <거래소>
13
+ ```
14
+
15
+ 지원 거래소: `upbit`, `bithumb`, `coinone`, `korbit`, `gopax`
16
+
17
+ ## 설정
18
+
19
+ 각 거래소는 독립적인 MCP 서버로 실행됩니다. 사용하려는 거래소를 MCP 클라이언트 설정에 추가하세요.
20
+
21
+ ### Claude Desktop
22
+
23
+ `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) 또는 `%APPDATA%\Claude\claude_desktop_config.json` (Windows)을 편집합니다:
24
+
25
+ ```json
26
+ {
27
+ "mcpServers": {
28
+ "upbit": {
29
+ "command": "npx",
30
+ "args": ["-y", "@nukeguys/exkit-mcp", "upbit"],
31
+ "env": {
32
+ "UPBIT_ACCESS_KEY": "your-access-key",
33
+ "UPBIT_SECRET_KEY": "your-secret-key"
34
+ }
35
+ },
36
+ "bithumb": {
37
+ "command": "npx",
38
+ "args": ["-y", "@nukeguys/exkit-mcp", "bithumb"],
39
+ "env": {
40
+ "BITHUMB_API_KEY": "your-api-key",
41
+ "BITHUMB_SECRET_KEY": "your-secret-key"
42
+ }
43
+ },
44
+ "coinone": {
45
+ "command": "npx",
46
+ "args": ["-y", "@nukeguys/exkit-mcp", "coinone"],
47
+ "env": {
48
+ "COINONE_ACCESS_KEY": "your-access-key",
49
+ "COINONE_SECRET_KEY": "your-secret-key"
50
+ }
51
+ },
52
+ "korbit": {
53
+ "command": "npx",
54
+ "args": ["-y", "@nukeguys/exkit-mcp", "korbit"],
55
+ "env": {
56
+ "KORBIT_API_KEY": "your-api-key",
57
+ "KORBIT_SECRET_KEY": "your-secret-key"
58
+ }
59
+ },
60
+ "gopax": {
61
+ "command": "npx",
62
+ "args": ["-y", "@nukeguys/exkit-mcp", "gopax"],
63
+ "env": {
64
+ "GOPAX_API_KEY": "your-api-key",
65
+ "GOPAX_SECRET": "your-secret"
66
+ }
67
+ }
68
+ }
69
+ }
70
+ ```
71
+
72
+ ### Claude Code
73
+
74
+ ```bash
75
+ # 업비트
76
+ claude mcp add upbit --env UPBIT_ACCESS_KEY=your-access-key --env UPBIT_SECRET_KEY=your-secret-key -- npx -y @nukeguys/exkit-mcp upbit
77
+
78
+ # 빗썸
79
+ claude mcp add bithumb --env BITHUMB_API_KEY=your-api-key --env BITHUMB_SECRET_KEY=your-secret-key -- npx -y @nukeguys/exkit-mcp bithumb
80
+
81
+ # 코인원
82
+ claude mcp add coinone --env COINONE_ACCESS_KEY=your-access-key --env COINONE_SECRET_KEY=your-secret-key -- npx -y @nukeguys/exkit-mcp coinone
83
+
84
+ # 코빗 (HMAC)
85
+ claude mcp add korbit --env KORBIT_API_KEY=your-api-key --env KORBIT_SECRET_KEY=your-secret-key -- npx -y @nukeguys/exkit-mcp korbit
86
+
87
+ # 코빗 (Ed25519)
88
+ claude mcp add korbit --env KORBIT_AUTH_SCHEME=ed25519 --env KORBIT_API_KEY=your-api-key --env KORBIT_PRIVATE_KEY=your-private-key -- npx -y @nukeguys/exkit-mcp korbit
89
+
90
+ # 고팍스
91
+ claude mcp add gopax --env GOPAX_API_KEY=your-api-key --env GOPAX_SECRET=your-secret -- npx -y @nukeguys/exkit-mcp gopax
92
+ ```
93
+
94
+ > **참고:** 시세 조회 등 공개 API만 사용한다면 환경 변수 없이 등록할 수 있습니다.
95
+ >
96
+ > ```bash
97
+ > claude mcp add upbit -- npx -y @nukeguys/exkit-mcp upbit
98
+ > ```
99
+
100
+ ### VS Code / Cursor
101
+
102
+ 프로젝트의 `.vscode/mcp.json`에 추가합니다:
103
+
104
+ ```json
105
+ {
106
+ "servers": {
107
+ "upbit": {
108
+ "command": "npx",
109
+ "args": ["-y", "@nukeguys/exkit-mcp", "upbit"],
110
+ "env": {
111
+ "UPBIT_ACCESS_KEY": "your-access-key",
112
+ "UPBIT_SECRET_KEY": "your-secret-key"
113
+ }
114
+ },
115
+ "bithumb": {
116
+ "command": "npx",
117
+ "args": ["-y", "@nukeguys/exkit-mcp", "bithumb"],
118
+ "env": {
119
+ "BITHUMB_API_KEY": "your-api-key",
120
+ "BITHUMB_SECRET_KEY": "your-secret-key"
121
+ }
122
+ },
123
+ "coinone": {
124
+ "command": "npx",
125
+ "args": ["-y", "@nukeguys/exkit-mcp", "coinone"],
126
+ "env": {
127
+ "COINONE_ACCESS_KEY": "your-access-key",
128
+ "COINONE_SECRET_KEY": "your-secret-key"
129
+ }
130
+ },
131
+ "korbit": {
132
+ "command": "npx",
133
+ "args": ["-y", "@nukeguys/exkit-mcp", "korbit"],
134
+ "env": {
135
+ "KORBIT_API_KEY": "your-api-key",
136
+ "KORBIT_SECRET_KEY": "your-secret-key"
137
+ }
138
+ },
139
+ "gopax": {
140
+ "command": "npx",
141
+ "args": ["-y", "@nukeguys/exkit-mcp", "gopax"],
142
+ "env": {
143
+ "GOPAX_API_KEY": "your-api-key",
144
+ "GOPAX_SECRET": "your-secret"
145
+ }
146
+ }
147
+ }
148
+ }
149
+ ```
150
+
151
+ ### Codex CLI
152
+
153
+ `~/.codex/config.json`에 추가합니다:
154
+
155
+ ```json
156
+ {
157
+ "mcpServers": {
158
+ "upbit": {
159
+ "command": "npx",
160
+ "args": ["-y", "@nukeguys/exkit-mcp", "upbit"],
161
+ "env": {
162
+ "UPBIT_ACCESS_KEY": "your-access-key",
163
+ "UPBIT_SECRET_KEY": "your-secret-key"
164
+ }
165
+ },
166
+ "bithumb": {
167
+ "command": "npx",
168
+ "args": ["-y", "@nukeguys/exkit-mcp", "bithumb"],
169
+ "env": {
170
+ "BITHUMB_API_KEY": "your-api-key",
171
+ "BITHUMB_SECRET_KEY": "your-secret-key"
172
+ }
173
+ },
174
+ "coinone": {
175
+ "command": "npx",
176
+ "args": ["-y", "@nukeguys/exkit-mcp", "coinone"],
177
+ "env": {
178
+ "COINONE_ACCESS_KEY": "your-access-key",
179
+ "COINONE_SECRET_KEY": "your-secret-key"
180
+ }
181
+ },
182
+ "korbit": {
183
+ "command": "npx",
184
+ "args": ["-y", "@nukeguys/exkit-mcp", "korbit"],
185
+ "env": {
186
+ "KORBIT_API_KEY": "your-api-key",
187
+ "KORBIT_SECRET_KEY": "your-secret-key"
188
+ }
189
+ },
190
+ "gopax": {
191
+ "command": "npx",
192
+ "args": ["-y", "@nukeguys/exkit-mcp", "gopax"],
193
+ "env": {
194
+ "GOPAX_API_KEY": "your-api-key",
195
+ "GOPAX_SECRET": "your-secret"
196
+ }
197
+ }
198
+ }
199
+ }
200
+ ```
201
+
202
+ > **참고:** API 키는 계좌, 주문, 입출금 등 인증이 필요한 API에만 필요합니다. 시세 조회, 호가, 캔들 등 공개 API는 키 없이 사용할 수 있습니다.
203
+
204
+ ## 환경 변수
205
+
206
+ | 거래소 | 환경 변수 | 설명 |
207
+ | ------ | -------------------------------------------------------------------- | ---------------- |
208
+ | 업비트 | `UPBIT_ACCESS_KEY`, `UPBIT_SECRET_KEY` | |
209
+ | 빗썸 | `BITHUMB_API_KEY`, `BITHUMB_SECRET_KEY` | |
210
+ | 코인원 | `COINONE_ACCESS_KEY`, `COINONE_SECRET_KEY` | |
211
+ | 코빗 | `KORBIT_API_KEY`, `KORBIT_SECRET_KEY` | HMAC 인증 (기본) |
212
+ | 코빗 | `KORBIT_API_KEY`, `KORBIT_PRIVATE_KEY`, `KORBIT_AUTH_SCHEME=ed25519` | Ed25519 인증 |
213
+ | 고팍스 | `GOPAX_API_KEY`, `GOPAX_SECRET` | |
214
+
215
+ ## 지원 도구
216
+
217
+ ### 업비트 (45개)
218
+
219
+ <details>
220
+ <summary>시세 조회 (공개)</summary>
221
+
222
+ | 도구 | 설명 |
223
+ | ---------------------------- | ----------------------- |
224
+ | `list_trading_pairs` | 페어 목록 조회 |
225
+ | `list_tickers` | 페어 단위 현재가 조회 |
226
+ | `list_quote_tickers` | 마켓 단위 현재가 조회 |
227
+ | `list_orderbooks` | 호가 조회 |
228
+ | `list_orderbook_instruments` | 호가 정책 조회 |
229
+ | `list_orderbook_levels` | 호가 모아보기 단위 조회 |
230
+ | `list_candles_seconds` | 초(Second) 캔들 조회 |
231
+ | `list_candles_minutes` | 분(Minute) 캔들 조회 |
232
+ | `list_candles_days` | 일(Day) 캔들 조회 |
233
+ | `list_candles_weeks` | 주(Week) 캔들 조회 |
234
+ | `list_candles_months` | 월(Month) 캔들 조회 |
235
+ | `list_candles_years` | 연(Year) 캔들 조회 |
236
+ | `recent_trades_history` | 최근 체결 내역 조회 |
237
+
238
+ </details>
239
+
240
+ <details>
241
+ <summary>계좌 및 주문 (인증 필요)</summary>
242
+
243
+ | 도구 | 설명 |
244
+ | ----------------------------- | -------------------------- |
245
+ | `get_balance` | 계정 잔고 조회 |
246
+ | `list_api_keys` | API Key 목록 조회 |
247
+ | `get_service_status` | 입출금 서비스 상태 조회 |
248
+ | `available_order_information` | 페어별 주문 가능 정보 조회 |
249
+ | `new_order` | 주문 생성 |
250
+ | `test_order` | 주문 생성 테스트 |
251
+ | `cancel_order` | 개별 주문 취소 접수 |
252
+ | `cancel_and_new_order` | 취소 후 재주문 |
253
+ | `batch_cancel_orders` | 주문 일괄 취소 접수 |
254
+ | `cancel_orders_by_ids` | ID로 주문 목록 취소 접수 |
255
+ | `get_order` | 개별 주문 조회 |
256
+ | `list_open_orders` | 체결 대기 주문 목록 조회 |
257
+ | `list_closed_orders` | 종료 주문 목록 조회 |
258
+ | `list_orders_by_ids` | ID로 주문 목록 조회 |
259
+
260
+ </details>
261
+
262
+ <details>
263
+ <summary>입출금 (인증 필요)</summary>
264
+
265
+ | 도구 | 설명 |
266
+ | ---------------------------------- | ------------------------------- |
267
+ | `available_deposit_information` | 디지털 자산 입금 가능 정보 조회 |
268
+ | `available_withdrawal_information` | 출금 가능 정보 조회 |
269
+ | `get_deposit` | 개별 입금 조회 |
270
+ | `get_deposit_address` | 개별 입금 주소 조회 |
271
+ | `list_deposits` | 입금 목록 조회 |
272
+ | `list_deposit_addresses` | 입금 주소 목록 조회 |
273
+ | `create_deposit_address` | 입금 주소 생성 요청 |
274
+ | `deposit_krw` | 원화 입금 |
275
+ | `get_withdrawal` | 개별 출금 조회 |
276
+ | `list_withdrawals` | 출금 목록 조회 |
277
+ | `list_withdrawal_addresses` | 출금 허용 주소 목록 조회 |
278
+ | `withdraw` | 디지털 자산 출금 요청 |
279
+ | `withdraw_krw` | 원화 출금 요청 |
280
+ | `withdraw_fiat` | 원화 출금 요청 |
281
+ | `cancel_withdrawal` | 디지털 자산 출금 취소 요청 |
282
+
283
+ </details>
284
+
285
+ <details>
286
+ <summary>트래블룰 (인증 필요)</summary>
287
+
288
+ | 도구 | 설명 |
289
+ | --------------------------- | ---------------------------------------- |
290
+ | `list_travelrule_vasps` | 계정주 확인 서비스 지원 거래소 목록 조회 |
291
+ | `verify_travelrule_by_txid` | 입금 TxID로 계정주 검증 요청 |
292
+ | `verify_travelrule_by_uuid` | 입금 UUID로 계정주 검증 요청 |
293
+
294
+ </details>
295
+
296
+ ### 빗썸 (38개)
297
+
298
+ <details>
299
+ <summary>시세 조회 (공개)</summary>
300
+
301
+ | 도구 | 설명 |
302
+ | ---------------------------- | ------------------ |
303
+ | `list_markets` | 마켓 코드 조회 |
304
+ | `list_tickers` | 현재가 정보 |
305
+ | `list_orderbooks` | 호가 정보 조회 |
306
+ | `list_recent_trades` | 최근 체결 내역 |
307
+ | `list_day_candles` | 일(Day) 캔들 |
308
+ | `list_minute_candles` | 분(Minute) 캔들 |
309
+ | `list_month_candles` | 월(Month) 캔들 |
310
+ | `list_week_candles` | 주(Week) 캔들 |
311
+ | `list_notices` | 공지사항 조회 |
312
+ | `list_market_warnings` | 경보제 |
313
+ | `get_deposit_withdrawal_fee` | 입출금 수수료 조회 |
314
+
315
+ </details>
316
+
317
+ <details>
318
+ <summary>계좌 및 주문 (인증 필요)</summary>
319
+
320
+ | 도구 | 설명 |
321
+ | ---------------------- | ------------------- |
322
+ | `list_accounts` | 전체 계좌 조회 |
323
+ | `list_api_keys` | API 키 리스트 조회 |
324
+ | `list_wallet_statuses` | 입출금 현황 |
325
+ | `get_order_chance` | 주문 가능 정보 |
326
+ | `create_order` | 주문 요청 |
327
+ | `create_orders` | 다건 주문 요청 |
328
+ | `cancel_order` | 주문 취소 접수 |
329
+ | `cancel_orders` | 다건 주문 취소 접수 |
330
+ | `get_order` | 개별 주문 조회 |
331
+ | `list_orders` | 주문 리스트 조회 |
332
+ | `create_twap_order` | TWAP 주문하기 |
333
+ | `cancel_twap_order` | TWAP 주문 취소 |
334
+ | `list_twap_orders` | TWAP 주문 내역 조회 |
335
+
336
+ </details>
337
+
338
+ <details>
339
+ <summary>입출금 (인증 필요)</summary>
340
+
341
+ | 도구 | 설명 |
342
+ | --------------------------- | -------------------------- |
343
+ | `get_deposit` | 개별 입금 조회 |
344
+ | `get_deposit_address` | 개별 입금 주소 조회 |
345
+ | `list_deposits` | 코인 입금 리스트 조회 |
346
+ | `list_deposit_addresses` | 전체 입금 주소 조회 |
347
+ | `create_deposit_address` | 입금 주소 생성 요청 |
348
+ | `create_krw_deposit` | 원화 입금하기 |
349
+ | `list_krw_deposits` | 원화 입금 리스트 조회 |
350
+ | `get_withdrawal` | 개별 출금 조회 |
351
+ | `get_withdrawal_chance` | 출금 가능 정보 |
352
+ | `list_withdrawals` | 코인 출금 리스트 조회 |
353
+ | `list_withdrawal_addresses` | 출금 허용 주소 리스트 조회 |
354
+ | `create_coin_withdrawal` | 가상 자산 출금하기 |
355
+ | `create_krw_withdrawal` | 원화 출금하기 |
356
+ | `list_krw_withdrawals` | 원화 출금 리스트 조회 |
357
+
358
+ </details>
359
+
360
+ ### 코인원 (35개)
361
+
362
+ <details>
363
+ <summary>시세 조회 (공개)</summary>
364
+
365
+ | 도구 | 설명 |
366
+ | -------------------- | ------------------------- |
367
+ | `list_markets` | 전체 종목 정보 조회 |
368
+ | `get_market` | 개별 종목 정보 조회 |
369
+ | `list_currencies` | 전체 가상자산 정보 조회 |
370
+ | `get_currency` | 개별 가상자산 정보 조회 |
371
+ | `list_tickers` | 전체 티커 정보 조회 |
372
+ | `get_ticker` | 개별 티커 정보 조회 |
373
+ | `list_utc_tickers` | 전체 티커 정보 조회 (UTC) |
374
+ | `get_utc_ticker` | 개별 티커 정보 조회 (UTC) |
375
+ | `get_orderbook` | 오더북 조회 |
376
+ | `get_range_units` | 개별 호가 단위 조회 |
377
+ | `list_candles` | 캔들 차트 조회 |
378
+ | `list_recent_trades` | 최근 체결 주문 조회 |
379
+
380
+ </details>
381
+
382
+ <details>
383
+ <summary>계좌 및 주문 (인증 필요)</summary>
384
+
385
+ | 도구 | 설명 |
386
+ | --------------------------------- | -------------------------- |
387
+ | `list_balances` | 전체 잔고 조회 |
388
+ | `list_balances_by_currencies` | 특정 자산 잔고 조회 |
389
+ | `get_trade_fee` | 개별 종목 수수료 조회 |
390
+ | `list_trade_fees` | 전체 수수료 조회 |
391
+ | `create_order` | 매수/매도 주문 |
392
+ | `create_limit_order` | 지정가 매매 주문 |
393
+ | `cancel_order` | 개별 주문 취소 |
394
+ | `cancel_orders` | 종목 별 전체 주문 취소 |
395
+ | `get_order` | 특정 주문 정보 조회 |
396
+ | `get_order_detail` | 주문 정보 조회 |
397
+ | `list_active_orders` | 미체결 주문 조회 |
398
+ | `list_open_orders` | 전체 미체결 주문 조회 |
399
+ | `list_open_orders_by_market` | 종목 별 미체결 주문 조회 |
400
+ | `list_completed_orders` | 전체 체결 주문 조회 |
401
+ | `list_completed_orders_by_market` | 종목 별 체결 주문 조회 |
402
+ | `list_order_reward_programs` | 주문 리워드 종목 정보 조회 |
403
+ | `list_order_reward_history` | 주문 리워드 내역 조회 |
404
+
405
+ </details>
406
+
407
+ <details>
408
+ <summary>입출금 (인증 필요)</summary>
409
+
410
+ | 도구 | 설명 |
411
+ | --------------------------- | ------------------------------ |
412
+ | `get_coin_transaction` | 가상자산 입출금 내역 단건 조회 |
413
+ | `get_coin_withdrawal_limit` | 가상자산 출금 한도 조회 |
414
+ | `list_coin_transactions` | 가상자산 입출금 내역 조회 |
415
+ | `list_krw_transactions` | 원화 입출금 내역 조회 |
416
+ | `list_withdrawal_addresses` | 출금 주소 목록 조회 |
417
+ | `create_coin_withdrawal` | 가상자산 출금 |
418
+
419
+ </details>
420
+
421
+ ### 코빗 (32개)
422
+
423
+ <details>
424
+ <summary>시세 조회 (공개)</summary>
425
+
426
+ | 도구 | 설명 |
427
+ | ------------------------- | ------------------ |
428
+ | `list_markets` | 거래지원 목록 조회 |
429
+ | `list_currencies` | 가상자산 정보 조회 |
430
+ | `list_tickers` | 현재가 조회 |
431
+ | `get_orderbook` | 호가 조회 |
432
+ | `list_tick_size_policies` | 호가 정책 조회 |
433
+ | `list_candles` | 캔들스틱 조회 |
434
+ | `list_recent_trades` | 최근 체결 내역 |
435
+ | `get_server_time` | 서버 시각 조회 |
436
+
437
+ </details>
438
+
439
+ <details>
440
+ <summary>계좌 및 주문 (인증 필요)</summary>
441
+
442
+ | 도구 | 설명 |
443
+ | --------------------------- | ------------------- |
444
+ | `list_balances` | 자산 현황 |
445
+ | `get_current_key_info` | API 키 정보 조회 |
446
+ | `list_trading_fee_policies` | 거래수수료율 조회 |
447
+ | `create_order` | 주문하기 |
448
+ | `cancel_order` | 주문 취소하기 |
449
+ | `get_order` | 개별 주문 조회 |
450
+ | `list_orders` | 최근 주문 내역 조회 |
451
+ | `list_open_orders` | 미체결 주문 조회 |
452
+ | `list_my_trades` | 최근 체결 내역 조회 |
453
+
454
+ </details>
455
+
456
+ <details>
457
+ <summary>입출금 (인증 필요)</summary>
458
+
459
+ | 도구 | 설명 |
460
+ | ----------------------------- | ------------------------ |
461
+ | `get_deposit` | 입금 진행상황 조회 |
462
+ | `get_deposit_address` | 입금 주소 조회 |
463
+ | `list_deposits` | 최근 입금내역 조회 |
464
+ | `list_deposit_addresses` | 입금 주소 전체 조회 |
465
+ | `create_deposit_address` | 입금 주소 생성 |
466
+ | `create_krw_deposit` | 입금 요청 |
467
+ | `list_krw_deposits` | 최근 입금내역 조회 |
468
+ | `get_withdrawal` | 출금 진행상황 조회 |
469
+ | `get_withdrawable_amount` | 출금 가능 수량 조회 |
470
+ | `list_withdrawals` | 최근 출금내역 조회 |
471
+ | `list_withdrawable_addresses` | 출금 가능 주소 목록 조회 |
472
+ | `create_withdrawal` | 출금 요청 |
473
+ | `create_krw_withdrawal` | 출금 요청 |
474
+ | `list_krw_withdrawals` | 최근 출금내역 조회 |
475
+ | `cancel_withdrawal` | 출금 취소 |
476
+
477
+ </details>
478
+
479
+ ### 고팍스 (26개)
480
+
481
+ <details>
482
+ <summary>시세 조회 (공개)</summary>
483
+
484
+ | 도구 | 설명 |
485
+ | --------------------- | ----------------------------------- |
486
+ | `list_trading_pairs` | 거래쌍 목록 조회 |
487
+ | `list_assets` | 자산 목록 조회 |
488
+ | `list_tickers` | 전체 티커 조회 |
489
+ | `get_ticker` | 티커 조회 |
490
+ | `list_stats` | 최근 24시간 통계 조회 (모든 거래쌍) |
491
+ | `get_stats` | 최근 24시간 통계 조회 |
492
+ | `get_orderbook` | 오더북 조회 |
493
+ | `get_price_tick_size` | 가격 틱 사이즈 조회 |
494
+ | `list_candles` | 차트 데이터 조회 |
495
+ | `list_recent_trades` | 체결 기록 조회 |
496
+ | `list_notices` | 공지사항 조회 |
497
+ | `list_cautions` | 투자유의 정보 조회 |
498
+ | `get_server_time` | 서버 시간 조회 |
499
+
500
+ </details>
501
+
502
+ <details>
503
+ <summary>계좌 및 주문 (인증 필요)</summary>
504
+
505
+ | 도구 | 설명 |
506
+ | --------------------------------- | ------------------------------ |
507
+ | `list_balances` | 잔고 조회 |
508
+ | `get_balance` | 특정 자산 잔고 조회 |
509
+ | `create_order` | 주문 등록 |
510
+ | `cancel_order` | 주문 취소 |
511
+ | `cancel_order_by_client_order_id` | 클라이언트 주문 ID로 주문 취소 |
512
+ | `get_order` | 특정 주문 조회 |
513
+ | `get_order_by_client_order_id` | 클라이언트 주문 ID로 주문 조회 |
514
+ | `list_orders` | 주문 조회 |
515
+ | `list_trades` | 체결 기록 조회 |
516
+
517
+ </details>
518
+
519
+ <details>
520
+ <summary>입출금 (인증 필요)</summary>
521
+
522
+ | 도구 | 설명 |
523
+ | ---------------------------------- | ----------------------- |
524
+ | `list_deposit_addresses` | 가상자산 입금 주소 조회 |
525
+ | `list_withdrawal_addresses` | 가상자산 출금 주소 조회 |
526
+ | `list_deposit_withdrawal_statuses` | 입출금 기록 조회 |
527
+ | `create_withdrawal` | 가상자산 출금 |
528
+
529
+ </details>
530
+
531
+ ## 라이선스
532
+
533
+ MIT
package/dist/index.mjs ADDED
@@ -0,0 +1,169 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import * as upbitExports from "@nukeguys/exkit-upbit";
5
+ import { createUpbitRestClient } from "@nukeguys/exkit-upbit";
6
+ import * as bithumbExports from "@nukeguys/exkit-bithumb";
7
+ import { createBithumbRestClient } from "@nukeguys/exkit-bithumb";
8
+ import * as coinmarketcapExports from "@nukeguys/exkit-coinmarketcap";
9
+ import { createCoinMarketCapRestClient } from "@nukeguys/exkit-coinmarketcap";
10
+ import * as coinoneExports from "@nukeguys/exkit-coinone";
11
+ import { createCoinoneRestClient } from "@nukeguys/exkit-coinone";
12
+ import * as korbitExports from "@nukeguys/exkit-korbit";
13
+ import { createKorbitRestClient } from "@nukeguys/exkit-korbit";
14
+ import * as gopaxExports from "@nukeguys/exkit-gopax";
15
+ import { createGopaxRestClient } from "@nukeguys/exkit-gopax";
16
+ //#region package.json
17
+ var version = "1.0.0";
18
+ //#endregion
19
+ //#region src/collect-operations.ts
20
+ /**
21
+ * 거래소 패키지 exports에서 operation 객체를 자동 수집합니다.
22
+ * 규칙: `xxxOperation`으로 끝나는 export 중 `operationId`와 `requestSchema`를 가진 객체를 수집합니다.
23
+ */
24
+ function collectOperations(exports) {
25
+ const operations = {};
26
+ for (const [key, value] of Object.entries(exports)) if (key.endsWith("Operation") && typeof value === "object" && value !== null && "operationId" in value && "requestSchema" in value) {
27
+ const methodName = key.slice(0, -9);
28
+ operations[methodName] = value;
29
+ }
30
+ return operations;
31
+ }
32
+ //#endregion
33
+ //#region src/exchanges/index.ts
34
+ const exchanges = {
35
+ upbit: {
36
+ name: "upbit",
37
+ operations: collectOperations(upbitExports),
38
+ createClient(env) {
39
+ return createUpbitRestClient({
40
+ accessKey: env.UPBIT_ACCESS_KEY,
41
+ secretKey: env.UPBIT_SECRET_KEY
42
+ });
43
+ }
44
+ },
45
+ bithumb: {
46
+ name: "bithumb",
47
+ operations: collectOperations(bithumbExports),
48
+ createClient(env) {
49
+ return createBithumbRestClient({
50
+ apiKey: env.BITHUMB_API_KEY,
51
+ secretKey: env.BITHUMB_SECRET_KEY
52
+ });
53
+ }
54
+ },
55
+ coinmarketcap: {
56
+ name: "coinmarketcap",
57
+ operations: collectOperations(coinmarketcapExports),
58
+ createClient(env) {
59
+ return createCoinMarketCapRestClient({ apiKey: env.COINMARKETCAP_API_KEY ?? "" });
60
+ }
61
+ },
62
+ coinone: {
63
+ name: "coinone",
64
+ operations: collectOperations(coinoneExports),
65
+ createClient(env) {
66
+ return createCoinoneRestClient({
67
+ accessKey: env.COINONE_ACCESS_KEY,
68
+ secretKey: env.COINONE_SECRET_KEY
69
+ });
70
+ }
71
+ },
72
+ korbit: {
73
+ name: "korbit",
74
+ operations: collectOperations(korbitExports),
75
+ createClient(env) {
76
+ const authScheme = env.KORBIT_AUTH_SCHEME ?? "hmac";
77
+ let config;
78
+ if (authScheme === "ed25519" && env.KORBIT_API_KEY && env.KORBIT_PRIVATE_KEY) config = {
79
+ authScheme: "ed25519",
80
+ apiKey: env.KORBIT_API_KEY,
81
+ privateKey: env.KORBIT_PRIVATE_KEY
82
+ };
83
+ else if (env.KORBIT_API_KEY && env.KORBIT_SECRET_KEY) config = {
84
+ authScheme: "hmac",
85
+ apiKey: env.KORBIT_API_KEY,
86
+ secretKey: env.KORBIT_SECRET_KEY
87
+ };
88
+ return createKorbitRestClient(config);
89
+ }
90
+ },
91
+ gopax: {
92
+ name: "gopax",
93
+ operations: collectOperations(gopaxExports),
94
+ createClient(env) {
95
+ return createGopaxRestClient(env.GOPAX_API_KEY && env.GOPAX_SECRET ? {
96
+ apiKey: env.GOPAX_API_KEY,
97
+ secret: env.GOPAX_SECRET
98
+ } : void 0);
99
+ }
100
+ }
101
+ };
102
+ //#endregion
103
+ //#region src/register-tools.ts
104
+ /**
105
+ * Zod shape에서 파라미터 설명을 추출하여 도구 설명에 추가할 텍스트를 생성합니다.
106
+ */
107
+ function buildParameterSummary(shape) {
108
+ const lines = [];
109
+ for (const [key, schema] of Object.entries(shape)) {
110
+ const desc = schema.description;
111
+ if (desc) lines.push(`- ${key}: ${desc}`);
112
+ }
113
+ return lines.length > 0 ? `\n\nParameters:\n${lines.join("\n")}` : "";
114
+ }
115
+ /**
116
+ * operation 맵과 REST client를 기반으로 MCP tool을 일괄 등록합니다.
117
+ */
118
+ function registerExchangeTools(server, operations, client) {
119
+ for (const [methodName, operation] of Object.entries(operations)) {
120
+ const shape = operation.requestSchema.shape;
121
+ const paramSummary = buildParameterSummary(shape);
122
+ server.registerTool(operation.operationId, {
123
+ description: `${operation.summary}${paramSummary}`,
124
+ inputSchema: shape
125
+ }, async (params) => {
126
+ try {
127
+ const result = await client[methodName](params);
128
+ return { content: [{
129
+ type: "text",
130
+ text: JSON.stringify(result, null, 2)
131
+ }] };
132
+ } catch (error) {
133
+ return {
134
+ isError: true,
135
+ content: [{
136
+ type: "text",
137
+ text: error instanceof Error ? error.message : String(error)
138
+ }]
139
+ };
140
+ }
141
+ });
142
+ }
143
+ }
144
+ //#endregion
145
+ //#region src/index.ts
146
+ const exchangeName = process.argv[2];
147
+ if (!exchangeName) {
148
+ const available = Object.keys(exchanges).join(", ");
149
+ console.error(`사용법: exkit-mcp <exchange>\n지원 거래소: ${available}`);
150
+ process.exit(1);
151
+ }
152
+ const exchange = exchanges[exchangeName];
153
+ if (!exchange) {
154
+ const available = Object.keys(exchanges).join(", ");
155
+ console.error(`알 수 없는 거래소: ${exchangeName}\n지원 거래소: ${available}`);
156
+ process.exit(1);
157
+ }
158
+ const client = exchange.createClient(process.env);
159
+ const server = new McpServer({
160
+ name: `exkit-${exchange.name}`,
161
+ version
162
+ });
163
+ registerExchangeTools(server, exchange.operations, client);
164
+ const transport = new StdioServerTransport();
165
+ await server.connect(transport);
166
+ //#endregion
167
+ export {};
168
+
169
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["packageJson.version"],"sources":["../package.json","../src/collect-operations.ts","../src/exchanges/upbit.ts","../src/exchanges/bithumb.ts","../src/exchanges/coinmarketcap.ts","../src/exchanges/coinone.ts","../src/exchanges/korbit.ts","../src/exchanges/gopax.ts","../src/exchanges/index.ts","../src/register-tools.ts","../src/index.ts"],"sourcesContent":["","import type { ExchangeRestOperation } from '@nukeguys/exkit-core/rest';\n\n/**\n * 거래소 패키지 exports에서 operation 객체를 자동 수집합니다.\n * 규칙: `xxxOperation`으로 끝나는 export 중 `operationId`와 `requestSchema`를 가진 객체를 수집합니다.\n */\nexport function collectOperations(\n exports: Record<string, unknown>,\n): Record<string, ExchangeRestOperation<object, unknown>> {\n const operations: Record<string, ExchangeRestOperation<object, unknown>> = {};\n\n for (const [key, value] of Object.entries(exports)) {\n if (\n key.endsWith('Operation') &&\n typeof value === 'object' &&\n value !== null &&\n 'operationId' in value &&\n 'requestSchema' in value\n ) {\n const methodName = key.slice(0, -'Operation'.length);\n operations[methodName] = value as ExchangeRestOperation<object, unknown>;\n }\n }\n\n return operations;\n}\n","import { createUpbitRestClient } from '@nukeguys/exkit-upbit';\nimport * as upbitExports from '@nukeguys/exkit-upbit';\n\nimport { collectOperations } from '../collect-operations.js';\nimport type { ExchangeDefinition } from './types.js';\n\nexport const upbit: ExchangeDefinition = {\n name: 'upbit',\n operations: collectOperations(upbitExports),\n createClient(env) {\n return createUpbitRestClient({\n accessKey: env.UPBIT_ACCESS_KEY,\n secretKey: env.UPBIT_SECRET_KEY,\n }) as unknown as Record<string, (request: unknown) => Promise<unknown>>;\n },\n};\n","import { createBithumbRestClient } from '@nukeguys/exkit-bithumb';\nimport * as bithumbExports from '@nukeguys/exkit-bithumb';\n\nimport { collectOperations } from '../collect-operations.js';\nimport type { ExchangeDefinition } from './types.js';\n\nexport const bithumb: ExchangeDefinition = {\n name: 'bithumb',\n operations: collectOperations(bithumbExports),\n createClient(env) {\n return createBithumbRestClient({\n apiKey: env.BITHUMB_API_KEY,\n secretKey: env.BITHUMB_SECRET_KEY,\n }) as unknown as Record<string, (request: unknown) => Promise<unknown>>;\n },\n};\n","import { createCoinMarketCapRestClient } from '@nukeguys/exkit-coinmarketcap';\nimport * as coinmarketcapExports from '@nukeguys/exkit-coinmarketcap';\n\nimport { collectOperations } from '../collect-operations.js';\nimport type { ExchangeDefinition } from './types.js';\n\nexport const coinmarketcap: ExchangeDefinition = {\n name: 'coinmarketcap',\n operations: collectOperations(coinmarketcapExports),\n createClient(env) {\n return createCoinMarketCapRestClient({\n apiKey: env.COINMARKETCAP_API_KEY ?? '',\n }) as unknown as Record<string, (request: unknown) => Promise<unknown>>;\n },\n};\n","import { createCoinoneRestClient } from '@nukeguys/exkit-coinone';\nimport * as coinoneExports from '@nukeguys/exkit-coinone';\n\nimport { collectOperations } from '../collect-operations.js';\nimport type { ExchangeDefinition } from './types.js';\n\nexport const coinone: ExchangeDefinition = {\n name: 'coinone',\n operations: collectOperations(coinoneExports),\n createClient(env) {\n return createCoinoneRestClient({\n accessKey: env.COINONE_ACCESS_KEY,\n secretKey: env.COINONE_SECRET_KEY,\n }) as unknown as Record<string, (request: unknown) => Promise<unknown>>;\n },\n};\n","import { createKorbitRestClient } from '@nukeguys/exkit-korbit';\nimport * as korbitExports from '@nukeguys/exkit-korbit';\n\nimport { collectOperations } from '../collect-operations.js';\nimport type { ExchangeDefinition } from './types.js';\n\nexport const korbit: ExchangeDefinition = {\n name: 'korbit',\n operations: collectOperations(korbitExports),\n createClient(env) {\n const authScheme = env.KORBIT_AUTH_SCHEME ?? 'hmac';\n let config;\n\n if (authScheme === 'ed25519' && env.KORBIT_API_KEY && env.KORBIT_PRIVATE_KEY) {\n config = {\n authScheme: 'ed25519' as const,\n apiKey: env.KORBIT_API_KEY,\n privateKey: env.KORBIT_PRIVATE_KEY,\n };\n } else if (env.KORBIT_API_KEY && env.KORBIT_SECRET_KEY) {\n config = {\n authScheme: 'hmac' as const,\n apiKey: env.KORBIT_API_KEY,\n secretKey: env.KORBIT_SECRET_KEY,\n };\n }\n\n return createKorbitRestClient(config) as unknown as Record<\n string,\n (request: unknown) => Promise<unknown>\n >;\n },\n};\n","import { createGopaxRestClient } from '@nukeguys/exkit-gopax';\nimport * as gopaxExports from '@nukeguys/exkit-gopax';\n\nimport { collectOperations } from '../collect-operations.js';\nimport type { ExchangeDefinition } from './types.js';\n\nexport const gopax: ExchangeDefinition = {\n name: 'gopax',\n operations: collectOperations(gopaxExports),\n createClient(env) {\n return createGopaxRestClient(\n env.GOPAX_API_KEY && env.GOPAX_SECRET\n ? { apiKey: env.GOPAX_API_KEY, secret: env.GOPAX_SECRET }\n : undefined,\n ) as unknown as Record<string, (request: unknown) => Promise<unknown>>;\n },\n};\n","import type { ExchangeDefinition } from './types.js';\nimport { upbit } from './upbit.js';\nimport { bithumb } from './bithumb.js';\nimport { coinmarketcap } from './coinmarketcap.js';\nimport { coinone } from './coinone.js';\nimport { korbit } from './korbit.js';\nimport { gopax } from './gopax.js';\n\nexport type { ExchangeDefinition } from './types.js';\n\nexport const exchanges: Record<string, ExchangeDefinition> = {\n upbit,\n bithumb,\n coinmarketcap,\n coinone,\n korbit,\n gopax,\n};\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ExchangeRestOperation } from '@nukeguys/exkit-core/rest';\nimport type { z } from 'zod';\n\n/**\n * Zod shape에서 파라미터 설명을 추출하여 도구 설명에 추가할 텍스트를 생성합니다.\n */\nfunction buildParameterSummary(shape: Record<string, z.ZodTypeAny>): string {\n const lines: string[] = [];\n for (const [key, schema] of Object.entries(shape)) {\n const desc = schema.description;\n if (desc) {\n lines.push(`- ${key}: ${desc}`);\n }\n }\n return lines.length > 0 ? `\\n\\nParameters:\\n${lines.join('\\n')}` : '';\n}\n\n/**\n * operation 맵과 REST client를 기반으로 MCP tool을 일괄 등록합니다.\n */\nexport function registerExchangeTools(\n server: McpServer,\n operations: Record<string, ExchangeRestOperation<object, unknown>>,\n client: Record<string, (request: unknown) => Promise<unknown>>,\n): void {\n for (const [methodName, operation] of Object.entries(operations)) {\n const shape = (operation.requestSchema as z.ZodObject<z.ZodRawShape>).shape;\n const paramSummary = buildParameterSummary(shape);\n\n server.registerTool(\n operation.operationId,\n {\n description: `${operation.summary}${paramSummary}`,\n inputSchema: shape,\n },\n async (params: Record<string, unknown>) => {\n try {\n const result = await client[methodName]!(params);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n isError: true,\n content: [{ type: 'text' as const, text: message }],\n };\n }\n },\n );\n }\n}\n","import packageJson from '../package.json' with { type: 'json' };\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\n\nimport { exchanges } from './exchanges/index.js';\nimport { registerExchangeTools } from './register-tools.js';\n\nconst exchangeName = process.argv[2];\n\nif (!exchangeName) {\n const available = Object.keys(exchanges).join(', ');\n console.error(`사용법: exkit-mcp <exchange>\\n지원 거래소: ${available}`);\n process.exit(1);\n}\n\nconst exchange = exchanges[exchangeName];\n\nif (!exchange) {\n const available = Object.keys(exchanges).join(', ');\n console.error(`알 수 없는 거래소: ${exchangeName}\\n지원 거래소: ${available}`);\n process.exit(1);\n}\n\nconst client = exchange.createClient(process.env);\n\nconst server = new McpServer({\n name: `exkit-${exchange.name}`,\n version: packageJson.version,\n});\n\nregisterExchangeTools(server, exchange.operations, client);\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@nukeguys/exkit-mcp",
3
+ "version": "1.0.0",
4
+ "description": "가상자산 거래소 API를 MCP 서버로 제공하는 CLI",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/nukeguys/exkit.git",
9
+ "directory": "apps/exkit-mcp"
10
+ },
11
+ "homepage": "https://github.com/nukeguys/exkit/tree/main/apps/exkit-mcp#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/nukeguys/exkit/issues"
14
+ },
15
+ "keywords": [
16
+ "mcp",
17
+ "crypto",
18
+ "exchange",
19
+ "cli",
20
+ "typescript"
21
+ ],
22
+ "type": "module",
23
+ "bin": {
24
+ "exkit-mcp": "./dist/index.mjs"
25
+ },
26
+ "files": [
27
+ "dist"
28
+ ],
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
32
+ "dependencies": {
33
+ "@modelcontextprotocol/sdk": "^1.12.1",
34
+ "zod": "^3.24.2",
35
+ "@nukeguys/exkit-coinone": "1.0.0",
36
+ "@nukeguys/exkit-bithumb": "1.0.0",
37
+ "@nukeguys/exkit-gopax": "1.0.0",
38
+ "@nukeguys/exkit-core": "1.0.0",
39
+ "@nukeguys/exkit-coinmarketcap": "1.0.0",
40
+ "@nukeguys/exkit-korbit": "1.0.0",
41
+ "@nukeguys/exkit-upbit": "1.0.0"
42
+ },
43
+ "devDependencies": {
44
+ "@types/node": "^24.0.0"
45
+ },
46
+ "scripts": {
47
+ "build": "tsdown",
48
+ "typecheck": "tsc -p tsconfig.json --noEmit"
49
+ }
50
+ }