kra-mcp

kra-mcp

3.2

If you are the rightful owner of kra-mcp and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.

The KRA Racing Data Analysis MCP Server utilizes the Korea Racing Authority's public API to analyze horse racing data and provide insights.

KRA Racing Data Analysis MCP Server

ํ•œ๊ตญ ๋งˆ์‚ฌํšŒ(Korea Racing Authority) ๊ณต๊ณต API๋ฅผ ํ™œ์šฉํ•œ ๊ฒฝ๋งˆ ๋ฐ์ดํ„ฐ ๋ถ„์„ MCP ์„œ๋ฒ„

์ด ํ”„๋กœ์ ํŠธ๋Š” Model Context Protocol (MCP)์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•œ๊ตญ ๋งˆ์‚ฌํšŒ์˜ ๊ฒฝ๋งˆ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์ธ์‚ฌ์ดํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

๐Ÿ‡ ์ฃผ์š” ๊ธฐ๋Šฅ

๐Ÿ”ง ๋ถ„์„ ๋„๊ตฌ (Tools)

  • analyze-race: ๊ฒฝ์ฃผ ๋ถ„์„ (๋‚ ์งœ, ๊ฒฝ์ฃผ๋ฒˆํ˜ธ, ๊ฒฝ๋งˆ์žฅ๋ณ„)
  • analyze-horse-performance: ๋ง ์„ฑ์  ๋ถ„์„ ๋ฐ ํผ ํ‰๊ฐ€
  • get-jockey-stats: ๊ธฐ์ˆ˜ ํ†ต๊ณ„ ๋ฐ ์„ฑ๊ณผ ๋ถ„์„
  • get-jockey-info: ๊ธฐ์ˆ˜ ์ •๋ณด ์กฐํšŒ
  • analyze-odds: ๋ฐฐ๋‹น๋ฅ  ๋ถ„์„ ๋ฐ ํŒจํ„ด ์ธ์‹

๐Ÿ“ ๋ฐ์ดํ„ฐ ๋ฆฌ์†Œ์Šค (Resources)

  • schedule://{date}: ๊ฒฝ์ฃผ ์ผ์ • ์ •๋ณด (์˜ค๋Š˜/๋‚ด์ผ)
  • horses://{horseName}: ๋ง ์ƒ์„ธ ์ •๋ณด ๋ฐ ๊ธฐ๋ก
  • tracks://{trackCode}: ๊ฒฝ๋งˆ์žฅ ์ •๋ณด (์„œ์šธ/๋ถ€์‚ฐ/์ œ์ฃผ)
  • config://kra-api: KRA API ์„ค์ • ๋ฐ ๊ตฌ์„ฑ

๐Ÿ’ฌ ๋ถ„์„ ํ”„๋กฌํ”„ํŠธ (Prompts)

  • predict-race: ๊ฒฝ์ฃผ ์˜ˆ์ธก ๋ถ„์„ (๊ธฐ๋ณธ/์ƒ์„ธ/ํ†ต๊ณ„)
  • horse-performance-report: ๋ง ์„ฑ์  ์ƒ์„ธ ๋ฆฌํฌํŠธ
  • market-analysis: ๋งˆ๊ถŒ ์‹œ์žฅ ๋ถ„์„ (๋ฐฐ๋‹น๋ฅ /๊ฑฐ๋ž˜๋Ÿ‰/ํŠธ๋ Œ๋“œ)

๐ŸŽฏ ํ™œ์šฉ ๋ถ„์•ผ

  • ๊ฒฝ์ฃผ ์˜ˆ์ธก: ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ๊ฒฝ์ฃผ ๊ฒฐ๊ณผ ์˜ˆ์ธก
  • ํˆฌ์ž ๋ถ„์„: ๋งˆ๊ถŒ ํˆฌ์ž ์ „๋žต ์ˆ˜๋ฆฝ
  • ์„ฑ๊ณผ ํ‰๊ฐ€: ๋ง, ๊ธฐ์ˆ˜, ์กฐ๊ต์‚ฌ ์„ฑ๊ณผ ๋ถ„์„
  • ์‹œ์žฅ ๋ถ„์„: ๋ฐฐ๋‹น๋ฅ  ๋ฐ ๊ฑฐ๋ž˜๋Ÿ‰ ํŒจํ„ด ๋ถ„์„
  • ๋ฆฌ์Šคํฌ ๊ด€๋ฆฌ: ํˆฌ์ž ๋ฆฌ์Šคํฌ ํ‰๊ฐ€ ๋ฐ ๊ด€๋ฆฌ

๐Ÿ“ฆ ์„ค์น˜ ๋ฐ ์„ค์ •

ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ

  • Node.js 18.0.0 ์ด์ƒ
  • npm ๋˜๋Š” yarn
  • ํ•œ๊ตญ ๋งˆ์‚ฌํšŒ ๊ณต๊ณต API ์ ‘๊ทผ ๊ถŒํ•œ โœ… ์‹ค์ œ ์—ฐ๋™ ์™„๋ฃŒ

KRA API ํ‚ค ์„ค์ • (ํ•„์ˆ˜)

  1. ๊ณต๊ณต๋ฐ์ดํ„ฐํฌํ„ธ ์‹ ์ฒญ

    • ๊ณต๊ณต๋ฐ์ดํ„ฐํฌํ„ธ ์ ‘์†
    • "ํ•œ๊ตญ๋งˆ์‚ฌํšŒ ๊ฒฝ์ฃผ๊ธฐ๋ก ์ •๋ณด" API ๊ฒ€์ƒ‰ ๋ฐ ์‹ ์ฒญ
    • ์Šน์ธ ํ›„ ์„œ๋น„์Šคํ‚ค ๋ฐœ๊ธ‰๋ฐ›๊ธฐ
  2. ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •

    # Windows (PowerShell)
    $env:KRA_SERVICE_KEY="YOUR_SERVICE_KEY_HERE"
    
    # macOS/Linux
    export KRA_SERVICE_KEY="YOUR_SERVICE_KEY_HERE"
    
    # ๋˜๋Š” .env ํŒŒ์ผ ์ƒ์„ฑ
    echo "KRA_SERVICE_KEY=YOUR_SERVICE_KEY_HERE" > .env
    
  3. ์„œ๋น„์Šคํ‚ค ํ™•์ธ

    • URL ์ธ์ฝ”๋”ฉ๋œ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค
    • ํŠน์ˆ˜๋ฌธ์ž๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ ์ธ์ฝ”๋”ฉ ํ•„์š”

ํ”„๋กœ์ ํŠธ ์„ค์น˜

# ์ €์žฅ์†Œ ํด๋ก 
git clone <repository-url>
cd kra-racing-data-mcp-server

# ์˜์กด์„ฑ ์„ค์น˜
npm install

# KRA API ํ‚ค ์„ค์ • (์œ„ ์ฐธ์กฐ)
export KRA_SERVICE_KEY="your_service_key"

๐Ÿƒโ€โ™‚๏ธ ์‹คํ–‰ ๋ฐฉ๋ฒ•

๊ฐœ๋ฐœ ๋ชจ๋“œ

npm run dev

๊ฐ์‹œ ๋ชจ๋“œ (ํŒŒ์ผ ๋ณ€๊ฒฝ ์‹œ ์ž๋™ ์žฌ์‹œ์ž‘)

npm run watch

ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ๋ฐ ์‹คํ–‰

npm run build
npm start

๐Ÿ”ง MCP ํด๋ผ์ด์–ธํŠธ ๋“ฑ๋ก

Cursor IDE์—์„œ ์‚ฌ์šฉ

~/.cursor/mcp.json ํŒŒ์ผ์— ์ถ”๊ฐ€:

{
  "mcpServers": {
    "kra-racing-analysis": {
      "command": "npx",
      "args": ["tsx", "C:/Users/SONG/kra-racing-data-mcp-server/src/index.ts"]
    }
  }
}

ํ”„๋กœ๋•์…˜ ๋ฒ„์ „ ์‚ฌ์šฉ ์‹œ:

{
  "mcpServers": {
    "kra-racing-analysis": {
      "command": "node",
      "args": ["C:/Users/SONG/kra-racing-data-mcp-server/dist/index.js"]
    }
  }
}

Cursor ์žฌ์‹œ์ž‘ ํ›„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿงช ํ…Œ์ŠคํŠธ ๋ฐ ๊ฒ€์ฆ

MCP Inspector ์‚ฌ์šฉ

npx @modelcontextprotocol/inspector npx tsx src/index.ts

๋„๊ตฌ ํ…Œ์ŠคํŠธ ์˜ˆ์‹œ

# ๊ฒฝ์ฃผ ๋ถ„์„ ํ…Œ์ŠคํŠธ
analyze-race --raceDate="2024-01-15" --raceNumber="3" --trackCode="seoul"

# ๋ง ์„ฑ์  ๋ถ„์„ ํ…Œ์ŠคํŠธ
analyze-horse-performance --horseName="์šฐ์Šน๋งˆ" --period="1year"

๐Ÿ“‚ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

kra-racing-data-mcp-server/
โ”œโ”€โ”€ src/
โ”‚   โ””โ”€โ”€ index.ts              # ๋ฉ”์ธ ์„œ๋ฒ„ ํŒŒ์ผ
โ”œโ”€โ”€ dist/                     # ๋นŒ๋“œ๋œ JavaScript ํŒŒ์ผ
โ”œโ”€โ”€ package.json              # ํ”„๋กœ์ ํŠธ ์„ค์ •
โ”œโ”€โ”€ tsconfig.json             # TypeScript ์„ค์ •
โ”œโ”€โ”€ .gitignore               # Git ์ œ์™ธ ํŒŒ์ผ
โ””โ”€โ”€ README.md                # ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ

๐Ÿ” ์‚ฌ์šฉ ์˜ˆ์‹œ

1. ๊ฒฝ์ฃผ ๋ถ„์„ ์š”์ฒญ

{
  "method": "tools/call",
  "params": {
    "name": "analyze-race",
    "arguments": {
      "raceDate": "2024-01-15",
      "raceNumber": 5,
      "trackCode": "seoul"
    }
  }
}

2. ๋ง ์ •๋ณด ์กฐํšŒ

{
  "method": "resources/read",
  "params": {
    "uri": "horses://์šฐ์Šน๋งˆ"
  }
}

3. ๊ฒฝ์ฃผ ์˜ˆ์ธก ํ”„๋กฌํ”„ํŠธ

{
  "method": "prompts/get",
  "params": {
    "name": "predict-race",
    "arguments": {
      "raceDate": "2024-01-15",
      "raceNumber": "5",
      "analysisType": "detailed"
    }
  }
}

๐Ÿ› ๏ธ ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ

์ƒˆ๋กœ์šด ๋ถ„์„ ๋„๊ตฌ ์ถ”๊ฐ€

server.tool("new-analysis-tool",
  { 
    param1: z.string(),
    param2: z.number().optional()
  },
  async ({ param1, param2 }) => ({
    content: [{ 
      type: "text", 
      text: `๋ถ„์„ ๊ฒฐ๊ณผ: ${param1} ${param2 || ''}` 
    }]
  })
);

์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ๋ฆฌ์†Œ์Šค ์ถ”๊ฐ€

server.resource(
  "new-resource",
  new ResourceTemplate("resource://{id}", { list: undefined }),
  async (uri, { id }) => ({
    contents: [{
      uri: uri.href,
      text: JSON.stringify({ id, data: "..." }, null, 2)
    }]
  })
);

๐ŸŒ API ์—ฐ๋™ ํ˜„ํ™ฉ

โœ… ํ˜„์žฌ ์—ฐ๋™๋œ API:

  • ํ•œ๊ตญ ๋งˆ์‚ฌํšŒ ๊ณต๊ณต API: ๊ฒฝ์ฃผ ์ •๋ณด, ์ถœ์ „๋งˆ ๋ฐ์ดํ„ฐ, ๊ธฐ์ˆ˜ ์ •๋ณด
  • API214_1: ๊ฒฝ์ฃผ ์ƒ์„ธ ๊ฒฐ๊ณผ ๋ฐ ๋ถ„์„ ๋ฐ์ดํ„ฐ
  • API12_1: ๊ธฐ์ˆ˜ ์ •๋ณด ์กฐํšŒ
  • API299: ๊ฒฝ์ฃผ ํ†ต๊ณ„ ๋ฐ ์˜ˆ์ธก ์ •๋ณด

โณ ํ–ฅํ›„ ์—ฐ๋™ ์˜ˆ์ •:

  • ์‹ค์‹œ๊ฐ„ ๋ฐฐ๋‹น๋ฅ  API: ๋ฐฐ๋‹น๋ฅ  ๋ณ€ํ™” ์ถ”์ 
  • ๊ธฐ์ƒ ์ •๋ณด API: ์ฃผ๋กœ ์ƒํƒœ ์˜ํ–ฅ ๋ถ„์„

๐Ÿ“Š ๋ฐ์ดํ„ฐ ๋ถ„์„ ๊ธฐ๋Šฅ

์ง€์›ํ•˜๋Š” ๋ถ„์„ ์œ ํ˜•

  • ๊ธฐ์ˆ ์  ๋ถ„์„: ๊ณผ๊ฑฐ ์„ฑ์  ๊ธฐ๋ฐ˜ ํŒจํ„ด ๋ถ„์„
  • ํ†ต๊ณ„์  ๋ถ„์„: ํ™•๋ฅ  ๋ชจ๋ธ ๋ฐ ํšŒ๊ท€ ๋ถ„์„
  • ์‹œ์žฅ ๋ถ„์„: ๋ฐฐ๋‹น๋ฅ  ๋ฐ ๊ฑฐ๋ž˜๋Ÿ‰ ๋ถ„์„
  • ๋น„๊ต ๋ถ„์„: ๋ง, ๊ธฐ์ˆ˜, ์กฐ๊ต์‚ฌ ๊ฐ„ ๋น„๊ต

์˜ˆ์ธก ๋ชจ๋ธ (๊ณ„ํš)

  • ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ: ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ์˜ˆ์ธก
  • ์•™์ƒ๋ธ” ๋ชจ๋ธ: ๋‹ค์ค‘ ๋ชจ๋ธ ๊ฒฐํ•ฉ ์˜ˆ์ธก
  • ์‹ค์‹œ๊ฐ„ ๋ถ„์„: ๊ฒฝ์ฃผ ๋‹น์ผ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๋ถ„์„

๐Ÿ”’ ๋ณด์•ˆ ๋ฐ ์ค€์ˆ˜์‚ฌํ•ญ

  • ํ•œ๊ตญ ๋งˆ์‚ฌํšŒ API ์ด์šฉ์•ฝ๊ด€ ์ค€์ˆ˜
  • ๊ฐœ์ธ์ •๋ณด๋ณดํ˜ธ๋ฒ• ์ค€์ˆ˜
  • ์•ˆ์ „ํ•œ API ํ‚ค ๊ด€๋ฆฌ
  • ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ๋Ÿ‰ ์ œํ•œ ์ค€์ˆ˜

๐Ÿ“š ์ฐธ๊ณ  ์ž๋ฃŒ

๐Ÿ“„ ๋ผ์ด์„ ์Šค

MIT License


โš ๏ธ ์ค‘์š”: ์‹ค์ œ KRA ๊ณต๊ณต API์™€ ์—ฐ๋™ํ•˜์—ฌ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. API ํ‚ค ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ํŒ: Context7๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋”์šฑ ์ •ํ™•ํ•œ ๊ฒฝ๋งˆ ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ํ”„๋กฌํ”„ํŠธ์— use context7์„ ์ถ”๊ฐ€ํ•ด๋ณด์„ธ์š”.