UNPKG

maplestory-mcp-server

Version:

Official-style NEXON MapleStory MCP Server for Claude Desktop - Complete character info, union details, guild data, rankings, and game mechanics

502 lines (381 loc) โ€ข 14.4 kB
# MapleStory MCP Server ๐Ÿ NEXON ๋ฉ”์ดํ”Œ์Šคํ† ๋ฆฌ ์˜คํ”ˆ API ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ข…ํ•ฉ์ ์ธ MCP(Model Context Protocol) ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. Claude Desktop ๋ฐ ๊ธฐํƒ€ MCP ํ˜ธํ™˜ AI ์–ด์‹œ์Šคํ„ดํŠธ๋ฅผ ํ†ตํ•ด ์บ๋ฆญํ„ฐ ์ •๋ณด, ์œ ๋‹ˆ์˜จ ์„ธ๋ถ€์‚ฌํ•ญ, ๊ธธ๋“œ ๋ฐ์ดํ„ฐ, ๋žญํ‚น, ๊ฒŒ์ž„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๊ตฌ์กฐํ™”๋œ ์ ‘๊ทผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ## โœจ ๊ธฐ๋Šฅ - **์บ๋ฆญํ„ฐ ์ •๋ณด**: ์ƒ์„ธํ•œ ์บ๋ฆญํ„ฐ ์Šคํƒฏ, ์žฅ๋น„, ๊ธฐ๋ณธ ์ •๋ณด ์กฐํšŒ - **์œ ๋‹ˆ์˜จ ์‹œ์Šคํ…œ**: ์œ ๋‹ˆ์˜จ ๊ณต๊ฒฉ๋Œ€ ๊ตฌ์„ฑ ๋ฐ ๋žญํ‚น ์ ‘๊ทผ - **๊ธธ๋“œ ๊ด€๋ฆฌ**: ๊ธธ๋“œ ์ •๋ณด ๋ฐ ๋ฉค๋ฒ„ ์„ธ๋ถ€์‚ฌํ•ญ ์กฐํšŒ - **๋žญํ‚น**: ๋‹ค์–‘ํ•œ ๋ฆฌ๋”๋ณด๋“œ ๋ฐ ๊ฒฝ์Ÿ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ - **๊ฒŒ์ž„ ๋ฉ”์ปค๋‹ˆ์ฆ˜**: ํ๋ธŒ ๋ฐ ์Šคํƒ€ํฌ์Šค ๊ฐ•ํ™” ํ™•๋ฅ  ์ •๋ณด - **๊ฒŒ์ž„ ์—…๋ฐ์ดํŠธ**: ์ตœ์‹  ๊ณต์ง€์‚ฌํ•ญ ๋ฐ ๋ฐœํ‘œ - **TypeScript ์ง€์›**: ์™„์ „ํ•œ ํƒ€์ž… ์•ˆ์ „์„ฑ ๋ฐ IntelliSense ์ง€์› - **์ข…ํ•ฉ์ ์ธ ๋กœ๊น…**: ๋””๋ฒ„๊น…์„ ์œ„ํ•œ ์ƒ์„ธํ•œ ์ž‘์—… ๋กœ๊น… - **์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ**: ์ƒ์„ธํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ๊ฐ•๋ ฅํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ## ๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘ ### NPX ์‚ฌ์šฉ (๊ถŒ์žฅ) ```bash npx maplestory-mcp-server --api-key YOUR_NEXON_API_KEY ``` ### ์„ค์น˜ ```bash npm install -g maplestory-mcp-server ``` ### ๐Ÿ–ฅ๏ธ Claude Desktop๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ #### 1. NEXON API ํ‚ค ์ค€๋น„ ๋จผ์ € [NEXON ์˜คํ”ˆ API ํฌํ„ธ](https://openapi.nexon.com/)์—์„œ API ํ‚ค๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์œผ์„ธ์š”: 1. NEXON ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ 2. "๊ฐœ๋ฐœ์ž ์„ผํ„ฐ" โ†’ "์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ด€๋ฆฌ" ์ด๋™ 3. "์ƒˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ๋ก" ํด๋ฆญ 4. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ •๋ณด ์ž…๋ ฅ ํ›„ ๋“ฑ๋ก 5. ์ƒ์„ฑ๋œ API ํ‚ค ๋ณต์‚ฌ #### 2. Claude Desktop ์„ค์ • ํŒŒ์ผ ์ฐพ๊ธฐ ์šด์˜์ฒด์ œ๋ณ„ ์„ค์ • ํŒŒ์ผ ์œ„์น˜: **Windows:** ``` %APPDATA%\Claude\claude_desktop_config.json ``` **macOS:** ``` ~/Library/Application Support/Claude/claude_desktop_config.json ``` **Linux:** ``` ~/.config/Claude/claude_desktop_config.json ``` #### 3. MCP ์„œ๋ฒ„ ์„ค์ • ์ถ”๊ฐ€ ์„ค์ • ํŒŒ์ผ์— ๋‹ค์Œ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜์„ธ์š”: ```json { "mcpServers": { "maplestory-mcp-server": { "command": "npx", "args": ["-y", "maplestory-mcp-server"], "env": { "NEXON_API_KEY": "์—ฌ๊ธฐ์—_๋ฐœ๊ธ‰๋ฐ›์€_API_ํ‚ค_์ž…๋ ฅ" } } } } ``` > โš ๏ธ **์ค‘์š”**: `YOUR_NEXON_API_KEY`๋ฅผ ์‹ค์ œ ๋ฐœ๊ธ‰๋ฐ›์€ API ํ‚ค๋กœ ๊ต์ฒดํ•˜์„ธ์š”. #### 4. Claude Desktop ์žฌ์‹œ์ž‘ ์„ค์ • ํŒŒ์ผ์„ ์ˆ˜์ •ํ•œ ํ›„ Claude Desktop์„ ์™„์ „ํžˆ ์ข…๋ฃŒํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์„ธ์š”. #### 5. ์—ฐ๊ฒฐ ํ™•์ธ Claude Desktop์ด ์žฌ์‹œ์ž‘๋˜๋ฉด ์ƒˆ ๋Œ€ํ™”์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž…๋ ฅํ•ด ์—ฐ๊ฒฐ์„ ํ™•์ธํ•˜์„ธ์š”: ``` ๋ฉ”์ดํ”Œ์Šคํ† ๋ฆฌ API๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•ด์ค˜ ``` ์„ฑ๊ณต์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋ฉด Claude๊ฐ€ ๋ฉ”์ดํ”Œ์Šคํ† ๋ฆฌ ๊ด€๋ จ ์งˆ๋ฌธ์— ๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ## ๐Ÿ› ๏ธ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ MCP ๋„๊ตฌ ### ์บ๋ฆญํ„ฐ ๋„๊ตฌ - `get_character_basic_info` - ๊ธฐ๋ณธ ์บ๋ฆญํ„ฐ ์ •๋ณด ์กฐํšŒ (๋ ˆ๋ฒจ, ์ง์—…, ์›”๋“œ, ๊ธธ๋“œ) - `get_character_stats` - ์ƒ์„ธํ•œ ์บ๋ฆญํ„ฐ ์Šคํƒฏ ๋ฐ ์ „ํˆฌ ์Šคํƒฏ ์กฐํšŒ - `get_character_equipment` - ์บ๋ฆญํ„ฐ ์žฅ๋น„ ๋ฐ ์•„์ดํ…œ ์„ธ๋ถ€์‚ฌํ•ญ ์กฐํšŒ - `get_character_full_info` - ์ข…ํ•ฉ์ ์ธ ์บ๋ฆญํ„ฐ ์ •๋ณด๋ฅผ ํ•œ ๋ฒˆ์— ์กฐํšŒ ### ์œ ๋‹ˆ์˜จ ๋„๊ตฌ - `get_union_info` - ์œ ๋‹ˆ์˜จ ๋ ˆ๋ฒจ, ๋“ฑ๊ธ‰, ์•„ํ‹ฐํŒฉํŠธ ์ •๋ณด ์กฐํšŒ - `get_union_raider` - ์œ ๋‹ˆ์˜จ ๊ณต๊ฒฉ๋Œ€ ๋ณด๋“œ ๊ตฌ์„ฑ ๋ฐ ๋ธ”๋ก ์กฐํšŒ - `get_union_ranking` - ์œ ๋‹ˆ์˜จ ํŒŒ์›Œ ๋žญํ‚น ์กฐํšŒ ### ๊ธธ๋“œ ๋„๊ตฌ - `get_guild_info` - ๊ธธ๋“œ ์ •๋ณด, ๋ฉค๋ฒ„, ์Šคํ‚ฌ ์กฐํšŒ - `get_guild_ranking` - ๊ธธ๋“œ ๋ ˆ๋ฒจ ๋žญํ‚น ์กฐํšŒ ### ๋žญํ‚น ๋„๊ตฌ - `get_overall_ranking` - ํ•„ํ„ฐ๋ง ์˜ต์…˜์ด ํฌํ•จ๋œ ์ข…ํ•ฉ ๋ ˆ๋ฒจ ๋žญํ‚น ์กฐํšŒ ### ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋„๊ตฌ - `get_notice_list` - ๊ฒŒ์ž„ ๊ณต์ง€์‚ฌํ•ญ ๋ฐ ๋ฐœํ‘œ ์กฐํšŒ - `get_notice_detail` - ์ƒ์„ธํ•œ ๊ณต์ง€์‚ฌํ•ญ ์ •๋ณด ์กฐํšŒ - `get_cube_probability` - ํ๋ธŒ ๊ฐ•ํ™” ํ™•๋ฅ  ์ •๋ณด ์กฐํšŒ - `get_starforce_probability` - ์Šคํƒ€ํฌ์Šค ๊ฐ•ํ™” ํ™•๋ฅ  ์ •๋ณด ์กฐํšŒ - `health_check` - API ์—ฐ๊ฒฐ ๋ฐ ์ƒํƒœ ํ™•์ธ ## ๐Ÿ“– ์‚ฌ์šฉ ์˜ˆ์‹œ ### ๐ŸŽฏ Claude Desktop์—์„œ ์งˆ๋ฌธํ•˜๊ธฐ Claude Desktop์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž์—ฐ์–ด๋กœ ๋ฉ”์ดํ”Œ์Šคํ† ๋ฆฌ ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: #### ์บ๋ฆญํ„ฐ ์ •๋ณด ์กฐํšŒ ``` "๊น€์ฝ”์ธ"์ด๋ผ๋Š” ์บ๋ฆญํ„ฐ์˜ ๊ธฐ๋ณธ ์ •๋ณด๋ฅผ ์•Œ๋ ค์ค˜ ``` ``` "๋ฒ ๋ผ์›”๋“œ์šฉ์‚ฌ" ์บ๋ฆญํ„ฐ์˜ ์ƒ์„ธํ•œ ์Šคํƒฏ ์ •๋ณด๋ฅผ ์กฐํšŒํ•ด์ค˜ ``` ``` "๋ฆฌ๋ถ€ํŠธ์šฉ์‚ฌ" ์บ๋ฆญํ„ฐ๊ฐ€ ์ฐฉ์šฉํ•˜๊ณ  ์žˆ๋Š” ์žฅ๋น„ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค˜ ``` #### ์œ ๋‹ˆ์˜จ ๋ฐ ๊ธธ๋“œ ์ •๋ณด ``` "์Šค์นด๋‹ˆ์•„์šฉ์‚ฌ" ์บ๋ฆญํ„ฐ์˜ ์œ ๋‹ˆ์˜จ ์ •๋ณด๋ฅผ ์กฐํšŒํ•ด์ค˜ ``` ``` "์Šค์นด๋‹ˆ์•„" ์›”๋“œ์˜ "๊ธธ๋“œ๋ช…" ๊ธธ๋“œ ์ •๋ณด๋ฅผ ์•Œ๋ ค์ค˜ ``` #### ๋žญํ‚น ์กฐํšŒ ``` ์Šค์นด๋‹ˆ์•„ ์›”๋“œ์˜ ์•„ํฌ๋ฉ”์ด์ง€(๋ถˆ,๋…) ์ง์—… ๋žญํ‚น 1ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ค˜ ``` ``` ๋ฒ ๋ผ ์›”๋“œ์˜ ์œ ๋‹ˆ์˜จ ๋žญํ‚น ์ƒ์œ„ 20๋ช…์„ ์กฐํšŒํ•ด์ค˜ ``` #### ๊ฒŒ์ž„ ์ •๋ณด ``` ๋ฉ”์ดํ”Œ์Šคํ† ๋ฆฌ ์ตœ์‹  ๊ณต์ง€์‚ฌํ•ญ์„ ํ™•์ธํ•ด์ค˜ ``` ``` ๋ ˆ๋“œ ํ๋ธŒ์˜ ๊ฐ•ํ™” ํ™•๋ฅ  ์ •๋ณด๋ฅผ ์•Œ๋ ค์ค˜ ``` ### ๐Ÿ’ก ํ™œ์šฉ ํŒ #### 1. ์บ๋ฆญํ„ฐ ์ข…ํ•ฉ ๋ถ„์„ ``` "์Šค์นด๋‹ˆ์•„์šฉ์‚ฌ" ์บ๋ฆญํ„ฐ์˜ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์ข…ํ•ฉ์ ์œผ๋กœ ๋ถ„์„ํ•ด์ค˜ (๊ธฐ๋ณธ์ •๋ณด, ์Šคํƒฏ, ์žฅ๋น„, ์œ ๋‹ˆ์˜จ) ``` #### 2. ๊ธธ๋“œ ๊ด€๋ฆฌ ``` "๋ฒ ๋ผ" ์›”๋“œ์˜ "์šฐ๋ฆฌ๊ธธ๋“œ" ๊ธธ๋“œ์›๋“ค์˜ ๋ ˆ๋ฒจ๊ณผ ์ง์—…์„ ์ •๋ฆฌํ•ด์ค˜ ``` #### 3. ๋žญํ‚น ๋น„๊ต ``` "์Šค์นด๋‹ˆ์•„" ์›”๋“œ์™€ "๋ฒ ๋ผ" ์›”๋“œ์˜ ์ƒ์œ„ ๋žญ์ปค๋“ค์„ ๋น„๊ต ๋ถ„์„ํ•ด์ค˜ ``` #### 4. ์ง„ํ–‰ ์ƒํ™ฉ ์ถ”์  ``` "๋‚ด์บ๋ฆญํ„ฐ" ์บ๋ฆญํ„ฐ์˜ ์–ด์ œ์™€ ์˜ค๋Š˜ ์Šคํƒฏ ๋ณ€ํ™”๋ฅผ ๋น„๊ตํ•ด์ค˜ ``` ### ๐Ÿ”ง ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์˜ˆ์‹œ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์ง์ ‘ API ํ˜ธ์ถœ ์˜ˆ์‹œ: #### ์บ๋ฆญํ„ฐ ์ •๋ณด ์กฐํšŒ ```typescript // ๊ธฐ๋ณธ ์บ๋ฆญํ„ฐ ์ •๋ณด ์กฐํšŒ const basicInfo = await getCharacterBasicInfo({ characterName: "์Šค์นด๋‹ˆ์•„์šฉ์‚ฌ" }); // ์ƒ์„ธํ•œ ์บ๋ฆญํ„ฐ ์Šคํƒฏ ์กฐํšŒ const stats = await getCharacterStats({ characterName: "์Šค์นด๋‹ˆ์•„์šฉ์‚ฌ", date: "2024-01-15" }); // ์บ๋ฆญํ„ฐ ์žฅ๋น„ ์กฐํšŒ const equipment = await getCharacterEquipment({ characterName: "์Šค์นด๋‹ˆ์•„์šฉ์‚ฌ" }); ``` #### ์œ ๋‹ˆ์˜จ ๋ฐ ๊ธธ๋“œ ๋ฐ์ดํ„ฐ ```typescript // ์œ ๋‹ˆ์˜จ ์ •๋ณด ์กฐํšŒ const unionInfo = await getUnionInfo({ characterName: "์Šค์นด๋‹ˆ์•„์šฉ์‚ฌ" }); // ๊ธธ๋“œ ์ •๋ณด ์กฐํšŒ const guildInfo = await getGuildInfo({ guildName: "๊ธธ๋“œ๋ช…", worldName: "์Šค์นด๋‹ˆ์•„" }); ``` #### ๋žญํ‚น ๋ฐ ๋ฆฌ๋”๋ณด๋“œ ```typescript // ์ข…ํ•ฉ ๋žญํ‚น ์กฐํšŒ const rankings = await getOverallRanking({ worldName: "์Šค์นด๋‹ˆ์•„", className: "์•„ํฌ๋ฉ”์ด์ง€(๋ถˆ,๋…)", page: 1 }); // ์œ ๋‹ˆ์˜จ ๋žญํ‚น ์กฐํšŒ const unionRankings = await getUnionRanking({ worldName: "์Šค์นด๋‹ˆ์•„", page: 1 }); ``` ## ๐Ÿ”ง ์„ค์ • ### ํ™˜๊ฒฝ ๋ณ€์ˆ˜ - `NEXON_API_KEY` - NEXON ์˜คํ”ˆ API ํ‚ค (ํ•„์ˆ˜) - `LOG_LEVEL` - ๋กœ๊น… ๋ ˆ๋ฒจ (๊ธฐ๋ณธ๊ฐ’: "info") - `NODE_ENV` - ํ™˜๊ฒฝ (development/production) ### CLI ์˜ต์…˜ - `--api-key` - NEXON API ํ‚ค - `--port` - ์„œ๋ฒ„ ํฌํŠธ (๊ธฐ๋ณธ๊ฐ’: 3000) - `--debug` - ๋””๋ฒ„๊ทธ ๋กœ๊น… ํ™œ์„ฑํ™” - `--name` - ์„œ๋ฒ„ ์ด๋ฆ„ (๊ธฐ๋ณธ๊ฐ’: "mcp-maple") - `--version` - ์„œ๋ฒ„ ๋ฒ„์ „ ## ๐Ÿ”‘ NEXON API ํ‚ค ์–ป๊ธฐ ### ์ƒ์„ธ ๊ฐ€์ด๋“œ 1. **NEXON ์˜คํ”ˆ API ํฌํ„ธ ์ ‘์†** - [https://openapi.nexon.com/](https://openapi.nexon.com/) ๋ฐฉ๋ฌธ 2. **๊ณ„์ • ์ƒ์„ฑ ๋ฐ ๋กœ๊ทธ์ธ** - NEXON ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ (๊ฒŒ์ž„ ๊ณ„์ •๊ณผ ๋™์ผ) - ๊ณ„์ •์ด ์—†๋‹ค๋ฉด ํšŒ์›๊ฐ€์ž… ์ง„ํ–‰ 3. **๊ฐœ๋ฐœ์ž ์„ผํ„ฐ ์ด๋™** - ์ƒ๋‹จ ๋ฉ”๋‰ด์—์„œ "๊ฐœ๋ฐœ์ž ์„ผํ„ฐ" ํด๋ฆญ - "์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ด€๋ฆฌ" ์„ ํƒ 4. **์ƒˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ๋ก** - "์ƒˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ๋ก" ๋ฒ„ํŠผ ํด๋ฆญ - ํ•„์ˆ˜ ์ •๋ณด ์ž…๋ ฅ: - **์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฆ„**: `MCP Maple` (์˜ˆ์‹œ) - **์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค๋ช…**: `Claude Desktop MCP ์„œ๋ฒ„์šฉ` - **์„œ๋น„์Šค URL**: `http://localhost` (๊ฐœ๋ฐœ์šฉ) 5. **API ํ‚ค ๋ฐœ๊ธ‰ ๋ฐ ๋ณต์‚ฌ** - ๋“ฑ๋ก ์™„๋ฃŒ ํ›„ API ํ‚ค ํ™•์ธ - API ํ‚ค ๋ณต์‚ฌ (๋ณด์•ˆ์„ ์œ„ํ•ด ์•ˆ์ „ํ•œ ๊ณณ์— ์ €์žฅ) 6. **API ํ‚ค ์‚ฌ์šฉ** - Claude Desktop ์„ค์ •์—์„œ `NEXON_API_KEY`๋กœ ์‚ฌ์šฉ - ๋˜๋Š” CLI์—์„œ `--api-key` ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ > ๐Ÿ’ก **ํŒ**: API ํ‚ค๋Š” ์™ธ๋ถ€์— ๋…ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•˜์„ธ์š”. GitHub ๋“ฑ ๊ณต๊ฐœ ์ €์žฅ์†Œ์— ์—…๋กœ๋“œํ•˜์ง€ ๋งˆ์„ธ์š”. ## ๐ŸŽฎ ์ง€์›๋˜๋Š” ๊ฒŒ์ž„ ๋ฐ ์›”๋“œ ### ๋ฉ”์ดํ”Œ์Šคํ† ๋ฆฌ ์›”๋“œ - ์Šค์นด๋‹ˆ์•„ (Scania) - ๋ฒ ๋ผ (Bera) - ๋ฃจ๋‚˜ (Luna) - ์ œ๋‹ˆ์Šค (Zenith) - ํฌ๋กœ์•„ (Croa) - ์œ ๋‹ˆ์˜จ (Union) - ์—˜๋ฆฌ์‹œ์›€ (Elysium) - ์ด๋…ธ์‹œ์Šค (Enosis) - ๋ ˆ๋“œ (Red) - ์˜ค๋กœ๋ผ (Aurora) - ์•„์ผ€์ธ (Arcane) - ๋…ธ๋ฐ” (Nova) - ๋ฆฌ๋ถ€ํŠธ (Reboot) - ๋ฆฌ๋ถ€ํŠธ2 (Reboot2) ## ๐Ÿšฆ ์š”์ฒญ ์ œํ•œ ๋ฐ ๋ชจ๋ฒ” ์‚ฌ๋ก€ - **์š”์ฒญ ์ œํ•œ**: API ํ‚ค๋‹น ํ•˜๋ฃจ 500ํšŒ ์š”์ฒญ - **์š”์ฒญ ๋นˆ๋„**: ์ดˆ๋‹น ์ตœ๋Œ€ 1ํšŒ ์š”์ฒญ - **๋ฐ์ดํ„ฐ ๊ฐฑ์‹ **: ์บ๋ฆญํ„ฐ ๋ฐ์ดํ„ฐ๋Š” ๋งค์ผ ์—…๋ฐ์ดํŠธ - **์บ์‹œ**: ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ์œ„ํ•œ ๊ฒฐ๊ณผ ์บ์‹ฑ - **์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ**: ์ผ์‹œ์  ์‹คํŒจ์— ๋Œ€ํ•œ ์ž๋™ ์žฌ์‹œ๋„ ## ๐Ÿงช ๊ฐœ๋ฐœ ### ์ „์ œ ์กฐ๊ฑด - Node.js 18+ - TypeScript 5.4+ - NEXON API ํ‚ค ### ์„ค์ • ```bash git clone https://github.com/ljy9303/mcp-maple.git cd mcp-maple npm install npm run build ``` ### ๋นŒ๋“œ ```bash npm run build # TypeScript ๋นŒ๋“œ npm run dev # ๊ฐœ๋ฐœ ๋ชจ๋“œ (watch) ``` ## ๐Ÿ“š API ์ฐธ์กฐ ### ์บ๋ฆญํ„ฐ ์ •๋ณด ๋„๊ตฌ #### `get_character_basic_info` ๋ ˆ๋ฒจ, ์ง์—…, ์›”๋“œ, ๊ธธ๋“œ๋ฅผ ํฌํ•จํ•œ ๊ธฐ๋ณธ ์บ๋ฆญํ„ฐ ์ •๋ณด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. **๋งค๊ฐœ๋ณ€์ˆ˜:** - `characterName` (string, ํ•„์ˆ˜): ์กฐํšŒํ•  ์บ๋ฆญํ„ฐ ์ด๋ฆ„ - `date` (string, ์„ ํƒ์‚ฌํ•ญ): YYYY-MM-DD ํ˜•์‹์˜ ๋‚ ์งœ **๋ฐ˜ํ™˜๊ฐ’:** - `characterName`: ์บ๋ฆญํ„ฐ ์ด๋ฆ„ - `level`: ์บ๋ฆญํ„ฐ ๋ ˆ๋ฒจ - `job`: ์บ๋ฆญํ„ฐ ์ง์—…/ํด๋ž˜์Šค - `world`: ์›”๋“œ/์„œ๋ฒ„ ์ด๋ฆ„ - `guildName`: ๊ธธ๋“œ ์ด๋ฆ„ (์žˆ๋Š” ๊ฒฝ์šฐ) - `exp`: ํ˜„์žฌ ๊ฒฝํ—˜์น˜ - `expRate`: ๊ฒฝํ—˜์น˜ ๋น„์œจ ๋ฐฑ๋ถ„์œจ #### `get_character_stats` ๋ฐ๋ฏธ์ง€, ํฌ๋ฆฌํ‹ฐ์ปฌ ํ™•๋ฅ , ๋ชจ๋“  ์ „ํˆฌ ์Šคํƒฏ์„ ํฌํ•จํ•œ ์ƒ์„ธํ•œ ์บ๋ฆญํ„ฐ ํ†ต๊ณ„๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. **๋งค๊ฐœ๋ณ€์ˆ˜:** - `characterName` (string, ํ•„์ˆ˜): ์กฐํšŒํ•  ์บ๋ฆญํ„ฐ ์ด๋ฆ„ - `date` (string, ์„ ํƒ์‚ฌํ•ญ): YYYY-MM-DD ํ˜•์‹์˜ ๋‚ ์งœ **๋ฐ˜ํ™˜๊ฐ’:** - `basicStats`: STR, DEX, INT, LUK, HP, MP - `combatStats`: ๊ณต๊ฒฉ๋ ฅ, ๋งˆ๋ ฅ, ํฌ๋ฆฌํ‹ฐ์ปฌ ์Šคํƒฏ - `defenseStats`: ๋ฌผ๋ฆฌ/๋งˆ๋ฒ• ๋ฐฉ์–ด ์Šคํƒฏ - `allStats`: ์™„์ „ํ•œ ์Šคํƒฏ ๋ถ„์„ ### ์œ ๋‹ˆ์˜จ ๋„๊ตฌ #### `get_union_info` ์œ ๋‹ˆ์˜จ ๋ ˆ๋ฒจ, ๋“ฑ๊ธ‰, ์•„ํ‹ฐํŒฉํŠธ ์ •๋ณด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. **๋งค๊ฐœ๋ณ€์ˆ˜:** - `characterName` (string, ํ•„์ˆ˜): ์กฐํšŒํ•  ์บ๋ฆญํ„ฐ ์ด๋ฆ„ - `date` (string, ์„ ํƒ์‚ฌํ•ญ): YYYY-MM-DD ํ˜•์‹์˜ ๋‚ ์งœ **๋ฐ˜ํ™˜๊ฐ’:** - `unionLevel`: ํ˜„์žฌ ์œ ๋‹ˆ์˜จ ๋ ˆ๋ฒจ - `unionGrade`: ์œ ๋‹ˆ์˜จ ๋“ฑ๊ธ‰/๋žญํฌ - `unionArtifact`: ์•„ํ‹ฐํŒฉํŠธ ๋ ˆ๋ฒจ ๋ฐ ํฌ์ธํŠธ ### ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ชจ๋“  ๋„๊ตฌ๋Š” ์ผ๊ด€๋œ ์˜ค๋ฅ˜ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: ```typescript { success: false, error: "์˜ค๋ฅ˜ ์„ค๋ช…", metadata?: { executionTime: number, apiCalls: number } } ``` ## ๐Ÿค ๊ธฐ์—ฌํ•˜๊ธฐ ๊ธฐ์—ฌ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ์ž์„ธํ•œ ๋‚ด์šฉ์€ [๊ธฐ์—ฌ ๊ฐ€์ด๋“œ](CONTRIBUTING.md)๋ฅผ ์ฝ์–ด์ฃผ์„ธ์š”. ### ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค 1. ์ €์žฅ์†Œ๋ฅผ ํฌํฌํ•ฉ๋‹ˆ๋‹ค 2. ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค 3. ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค 4. ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค 5. ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค 6. ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค ## ๐Ÿ“„ ๋ผ์ด์„ ์Šค ์ด ํ”„๋กœ์ ํŠธ๋Š” MIT ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ๋ผ์ด์„ ์Šค๊ฐ€ ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ [LICENSE](LICENSE) ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”. ## ๐Ÿ™ ๊ฐ์‚ฌ์˜ ๋ง - ๋ฉ”์ดํ”Œ์Šคํ† ๋ฆฌ ์˜คํ”ˆ API๋ฅผ ์ œ๊ณตํ•ด ์ฃผ์‹  [NEXON](https://www.nexon.com/) - MCP ์‚ฌ์–‘์„ ์ œ๊ณตํ•ด ์ฃผ์‹  [Model Context Protocol](https://modelcontextprotocol.io/) - Claude ๋ฐ MCP ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ด ์ฃผ์‹  [Anthropic](https://www.anthropic.com/) ## ๐Ÿ”ง ๋ฌธ์ œ ํ•ด๊ฒฐ ### ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋“ค #### 1. Claude Desktop์—์„œ mcp-maple์ด ์ธ์‹๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ **์ฆ์ƒ**: Claude Desktop์—์„œ ๋ฉ”์ดํ”Œ์Šคํ† ๋ฆฌ ๊ด€๋ จ ์งˆ๋ฌธ์„ ํ•ด๋„ ์‘๋‹ตํ•˜์ง€ ๋ชปํ•จ **ํ•ด๊ฒฐ๋ฐฉ๋ฒ•**: 1. Claude Desktop์„ ์™„์ „ํžˆ ์ข…๋ฃŒ 2. ์„ค์ • ํŒŒ์ผ ๊ฒฝ๋กœ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธ: - Windows: `%APPDATA%\Claude\claude_desktop_config.json` - macOS: `~/Library/Application Support/Claude/claude_desktop_config.json` - Linux: `~/.config/Claude/claude_desktop_config.json` 3. JSON ํ˜•์‹์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธ (์‰ผํ‘œ, ๊ด„ํ˜ธ ๋“ฑ) 4. Claude Desktop ์žฌ์‹œ์ž‘ #### 2. API ํ‚ค ์˜ค๋ฅ˜ **์ฆ์ƒ**: "API key is invalid" ๋˜๋Š” "Authentication failed" ์˜ค๋ฅ˜ **ํ•ด๊ฒฐ๋ฐฉ๋ฒ•**: 1. [NEXON ์˜คํ”ˆ API ํฌํ„ธ](https://openapi.nexon.com/)์—์„œ API ํ‚ค ์ƒํƒœ ํ™•์ธ 2. API ํ‚ค๊ฐ€ ๋งŒ๋ฃŒ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธ 3. ์„ค์ • ํŒŒ์ผ์—์„œ API ํ‚ค๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž…๋ ฅ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ 4. API ํ‚ค ์•ž๋’ค ๊ณต๋ฐฑ ์ œ๊ฑฐ #### 3. ์บ๋ฆญํ„ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ **์ฆ์ƒ**: "Character not found" ์˜ค๋ฅ˜ **ํ•ด๊ฒฐ๋ฐฉ๋ฒ•**: 1. ์บ๋ฆญํ„ฐ ์ด๋ฆ„์„ ์ •ํ™•ํžˆ ์ž…๋ ฅ (๋Œ€์†Œ๋ฌธ์ž, ํŠน์ˆ˜๋ฌธ์ž ํฌํ•จ) 2. ํ•ด๋‹น ์บ๋ฆญํ„ฐ๊ฐ€ ์‹ค์ œ๋กœ ์กด์žฌํ•˜๋Š”์ง€ ๊ฒŒ์ž„์—์„œ ํ™•์ธ 3. ์บ๋ฆญํ„ฐ๊ฐ€ ์ตœ๊ทผ์— ์ƒ์„ฑ๋œ ๊ฒฝ์šฐ ํ•˜๋ฃจ ์ •๋„ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ์žฌ์‹œ๋„ #### 4. ์š”์ฒญ ์ œํ•œ ์ดˆ๊ณผ **์ฆ์ƒ**: "Rate limit exceeded" ์˜ค๋ฅ˜ **ํ•ด๊ฒฐ๋ฐฉ๋ฒ•**: 1. ์ž ์‹œ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ์žฌ์‹œ๋„ (1๋ถ„ ์ •๋„) 2. ์š”์ฒญ ๋นˆ๋„๋ฅผ ์ค„์—ฌ์„œ ์‚ฌ์šฉ 3. ํ•˜๋ฃจ 500ํšŒ ์ œํ•œ์„ ์ดˆ๊ณผํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ #### 5. ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ๋ฌธ์ œ **์ฆ์ƒ**: "Network error" ๋˜๋Š” "Timeout" ์˜ค๋ฅ˜ **ํ•ด๊ฒฐ๋ฐฉ๋ฒ•**: 1. ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ ์ƒํƒœ ํ™•์ธ 2. ๋ฐฉํ™”๋ฒฝ์ด๋‚˜ ํ”„๋ก์‹œ ์„ค์ • ํ™•์ธ 3. ์ž ์‹œ ํ›„ ์žฌ์‹œ๋„ ### ๋””๋ฒ„๊น… ๋ฐฉ๋ฒ• #### 1. ์ƒ์„ธํ•œ ๋กœ๊ทธ ํ™•์ธ ```bash npx mcp-maple --debug --api-key YOUR_API_KEY ``` #### 2. ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ Claude Desktop์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž…๋ ฅํ•˜์—ฌ ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ํ™•์ธ: ``` ๋ฉ”์ดํ”Œ์Šคํ† ๋ฆฌ API ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ด์ค˜ ``` #### 3. ์„ค์ • ํŒŒ์ผ ๊ฒ€์ฆ JSON ํ˜•์‹์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ์˜จ๋ผ์ธ JSON ๊ฒ€์ฆ๊ธฐ์—์„œ ํ™•์ธํ•˜์„ธ์š”. ### ์•Œ๋ ค์ง„ ์ œํ•œ ์‚ฌํ•ญ - **API ํ˜ธ์ถœ ์ œํ•œ**: ํ•˜๋ฃจ 500ํšŒ, ์ดˆ๋‹น 1ํšŒ - **๋ฐ์ดํ„ฐ ๊ฐฑ์‹ **: ์บ๋ฆญํ„ฐ ์ •๋ณด๋Š” ๋งค์ผ ์˜ค์ „ 8์‹œ๊ฒฝ ์—…๋ฐ์ดํŠธ - **์ง€์› ์›”๋“œ**: ์ผ๋ถ€ ํ…Œ์ŠคํŠธ ์„œ๋ฒ„๋‚˜ ํŠน์ˆ˜ ์›”๋“œ๋Š” ์ง€์›๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ ## ๐Ÿ“ž ์ง€์› - **์ด์Šˆ**: [GitHub Issues](https://github.com/ljy9303/mcp-maple/issues) - **๋ฌธ์„œ**: [API ์ฐธ์กฐ](docs/API_REFERENCE.md) - **์˜ˆ์‹œ**: [์‚ฌ์šฉ ์˜ˆ์‹œ](docs/EXAMPLES.md) ## ๐Ÿ”— ๊ด€๋ จ ํ”„๋กœ์ ํŠธ - [MCP TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk) - [Claude Desktop](https://claude.ai/desktop) - [NEXON ์˜คํ”ˆ API](https://openapi.nexon.com/) --- ๋ฉ”์ดํ”Œ์Šคํ† ๋ฆฌ ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ์œ„ํ•ด โค๏ธ๋กœ ์ œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค