Skip to content

Commit 2417b2d

Browse files
committed
feat: mcp 서버 추가 (claude desktop / chatgpt desktop 지원)
- 9개 tool 제공 (7 카테고리 + schema + rate_limit) - stdio transport 기반 MCP 서버 (krx-mcp 바이너리) - 기존 client/validator 코드 재사용, 중복 없음 - esbuild 멀티 엔트리 빌드 (dist/cli.js + dist/mcp.js) - README에 Claude Desktop / ChatGPT Desktop 설정 가이드 추가
1 parent b824294 commit 2417b2d

9 files changed

Lines changed: 1012 additions & 7 deletions

File tree

README.md

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,80 @@ mkdir -p ~/.claude/skills && cp SKILL.md ~/.claude/skills/krx-cli.md
224224
mkdir -p ~/.cursor/skills && cp SKILL.md ~/.cursor/skills/krx-cli.md
225225
```
226226

227+
## MCP 서버 (Claude Desktop / ChatGPT Desktop)
228+
229+
CLI 외에 MCP(Model Context Protocol) 서버도 제공합니다. Claude Desktop, ChatGPT Desktop 등 MCP를 지원하는 클라이언트에서 사용할 수 있습니다.
230+
231+
### 설정 (Claude Desktop)
232+
233+
API 키는 `krx auth set <key>`로 등록한 것이 자동으로 사용됩니다.
234+
`krx-mcp``npm install -g krx-cli`로 설치하면 함께 설치됩니다.
235+
236+
### Claude Desktop
237+
238+
설정 파일 위치:
239+
240+
- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
241+
- **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
242+
243+
```json
244+
{
245+
"mcpServers": {
246+
"krx": {
247+
"command": "krx-mcp"
248+
}
249+
}
250+
}
251+
```
252+
253+
### ChatGPT Desktop
254+
255+
설정 파일 위치:
256+
257+
- **macOS**: `~/Library/Application Support/com.openai.chat/mcp.json`
258+
- **Windows**: `%LOCALAPPDATA%\OpenAI\ChatGPT\mcp.json`
259+
260+
```json
261+
{
262+
"mcpServers": {
263+
"krx": {
264+
"command": "krx-mcp"
265+
}
266+
}
267+
}
268+
```
269+
270+
설정 후 앱을 재시작하면 MCP 도구가 활성화됩니다.
271+
272+
### 제공 Tool
273+
274+
| Tool | 설명 |
275+
| ---------------- | ------------------------------------------ |
276+
| `krx_index` | 지수 일별시세 (KOSPI/KOSDAQ/KRX/채권/파생) |
277+
| `krx_stock` | 주식 일별매매정보 + 종목 기본정보 |
278+
| `krx_etp` | ETF/ETN/ELW 일별매매정보 |
279+
| `krx_bond` | 채권 일별매매정보 (국채/일반/소액) |
280+
| `krx_derivative` | 선물/옵션 일별매매정보 |
281+
| `krx_commodity` | 금/석유/배출권 일별매매정보 |
282+
| `krx_esg` | ESG 지수/채권/ETP 정보 |
283+
| `krx_schema` | 엔드포인트 응답 필드 스키마 조회 |
284+
| `krx_rate_limit` | 일일 API 호출 현황 조회 |
285+
286+
### 사용 예시
287+
288+
MCP 클라이언트에서 자연어로 요청하면 됩니다:
289+
290+
```
291+
"오늘 코스피 지수 보여줘"
292+
→ krx_index tool 호출 (endpoint: "kospi_dd_trd")
293+
294+
"삼성전자 주가 알려줘"
295+
→ krx_stock tool 호출 (endpoint: "stk_bydd_trd", fields: ["ISU_NM", "TDD_CLSPRC", "FLUC_RT"])
296+
297+
"오늘 API 몇 번 호출했어?"
298+
→ krx_rate_limit tool 호출
299+
```
300+
227301
## 개발
228302

229303
```bash

esbuild.config.js

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,28 @@
11
import { build } from "esbuild";
22
import { rmSync } from "node:fs";
33

4-
const watch = process.argv.includes("--watch");
5-
64
rmSync("dist", { recursive: true, force: true });
75

8-
const ctx = await build({
9-
entryPoints: ["src/cli/index.ts"],
6+
const commonOptions = {
107
bundle: true,
118
format: "esm",
129
platform: "node",
1310
target: "node20",
14-
outfile: "dist/cli.js",
1511
sourcemap: true,
1612
banner: {
1713
js: "#!/usr/bin/env node\nimport{createRequire}from'node:module';const require=createRequire(import.meta.url);",
1814
},
19-
});
15+
};
16+
17+
await Promise.all([
18+
build({
19+
...commonOptions,
20+
entryPoints: ["src/cli/index.ts"],
21+
outfile: "dist/cli.js",
22+
}),
23+
build({
24+
...commonOptions,
25+
entryPoints: ["src/mcp/index.ts"],
26+
outfile: "dist/mcp.js",
27+
}),
28+
]);

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
"description": "Agent-native CLI for KRX (Korea Exchange) Open API",
55
"type": "module",
66
"bin": {
7-
"krx": "./dist/cli.js"
7+
"krx": "./dist/cli.js",
8+
"krx-mcp": "./dist/mcp.js"
89
},
910
"files": [
1011
"dist",
@@ -41,6 +42,7 @@
4142
"node": ">=20"
4243
},
4344
"dependencies": {
45+
"@modelcontextprotocol/sdk": "^1.27.1",
4446
"commander": "^14.0.3",
4547
"zod": "^4.3.6"
4648
},

0 commit comments

Comments
 (0)