๊ธฐ์ ๋ฌธ์
>MCP
๐ ๏ธ 30๋ถ ๋ง์ ๋๋ด๋ ๋๋ง์ MCP ์๋ฒ ๊ตฌ์ถํ๊ธฐ (Python & SDK ๊ฐ์ด๋)
์๋ฃ ๊ธฐ๋ณธ์ ๋ณด
์ฃผ์ ํ๋ก๊ทธ๋จ ์คํ
- ํ์ : 10.0
- ๋ผ์ด์ ์ค: free
ํผ๋๋ฐฑ ๋ฐ ๋ค์ด๋ก๋
- ์ฌ์ฉ์ ํ์ : 10.0
- ์กฐํ: 2
์ ์กฐ์ฌ ๋ฐ ๋ฑ๋ก ์ ๋ณด
- ์ ์์ฌ: LUZENSOFT
- ๋ฑ๋ก์ผ: 2025-12-22 09:45:27
- ์ค๋ช
์๋ ํ์ธ์! ๊ฐ๋ฐ์ ์ฌ๋ฌ๋ถ. ์ต๊ทผ ์ค์ค๋กํฝ(Anthropic)์ด ๋ฐํํ **Model Context Protocol(MCP)**์ AI ๋ชจ๋ธ์ด ์ธ๋ถ ๋ฐ์ดํฐ๋ ๋๊ตฌ์ ์ํธ์์ฉํ๋ ๋ฐฉ์์ ์์ ํ ๋ฐ๊พธ๊ณ ์์ต๋๋ค. ์ด์ ๊ฐ๋ฐ์๋ ๋จ์ํ ํ๋กฌํํธ๋ฅผ ์ง๋ ๊ฒ์ ๋์ด, AI๊ฐ ์ฐ๋ฆฌ ํ์ฌ์ DB๋ฅผ ์ฝ๊ฑฐ๋ ํน์ API๋ฅผ ํธ์ถํ๊ฒ ๋ง๋๋ '์ปค๋ฅํฐ'๋ฅผ ์ง์ ์ค๊ณํด์ผ ํ๋ ์๋๊ฐ ์์ต๋๋ค. ์ค๋์ ๊ฐ์ฅ ์์ฐ์ฑ์ด ๋์ Python SDK๋ฅผ ํ์ฉํด ๋จ 30๋ถ ๋ง์ ๋๋ง์ MCP ์๋ฒ๋ฅผ ๊ตฌ์ถํ๋ ์ค์ ๊ณผ์ ์ ๊ณต์ ํ๊ฒ ์ต๋๋ค.
1. MCP ์๋ฒ๋ ๋ฌด์์ธ๊ฐ? (Architecture Overview)
MCP ์๋ฒ๋ AI ๋ชจ๋ธ(ํด๋ผ์ด์ธํธ)๊ณผ ๋ฐ์ดํฐ ์์ค ์ฌ์ด์ ์ค๊ณ์ ์ญํ ์ ํฉ๋๋ค. ํ์คํ๋ JSON-RPC ๊ธฐ๋ฐ์ ๊ท๊ฒฉ์ ์ฌ์ฉํ์ฌ, ํด๋ก๋๊ฐ "์ด ๋ฐ์ดํฐ ์ข ๊ฐ์ ธ์์ค"๋ผ๊ณ ์์ฒญํ๋ฉด ์๋ฒ๊ฐ ์ด๋ฅผ ํด์ํด ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๊ตฌ์กฐ์ ๋๋ค.
์ด ๊ตฌ์กฐ์ ํต์ฌ์ ์ํธ์ด์ฉ์ฑ์ ๋๋ค. ํ ๋ฒ ๋ง๋ MCP ์๋ฒ๋ ํด๋ก๋ ๋ฐ์คํฌํฑ๋ฟ๋ง ์๋๋ผ MCP ํ์ค์ ์ง์ํ๋ ๋ชจ๋ IDE๋ ์๋น์ค์์ ์ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
2. ๊ฐ๋ฐ ํ๊ฒฝ ์ค๋น
๋ณธ๊ฒฉ์ ์ธ ์ฝ๋ฉ์ ์์ ํ์ํ ํจํค์ง๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค. Python 3.10 ์ด์์ ํ๊ฒฝ์ ๊ถ์ฅํฉ๋๋ค.
Bash
# MCP SDK ์ค์น
pip install mcp
์ฐ๋ฆฌ๋ ์ค๋ **'ํ์ฌ ์์คํ ์ ๋ฆฌ์์ค ์ํ๋ฅผ ์๋ ค์ฃผ๋ ์๋ฒ'**๋ฅผ ์์ ๋ก ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. AI๊ฐ ๋ด ์ปดํจํฐ์ CPU์ ๋ฉ๋ชจ๋ฆฌ ์ํ๋ฅผ ์ค์๊ฐ์ผ๋ก ํ์ ํด ์ต์ ํ ์ ์์ ํ ์ ์๊ฒ ๋ง๋๋ ๊ฒ์ด ๋ชฉํ์ ๋๋ค.
3. ๋จ๊ณ๋ณ ์๋ฒ ๊ตฌํ
Step 1: ์๋ฒ ์ธ์คํด์ค ์์ฑ
๊ฐ์ฅ ๋จผ์ MCP ์๋ฒ์ ๋ณธ์ฒด๋ฅผ ์ ์ธํฉ๋๋ค.
Python
from mcp.server.fastmcp import FastMCP
# 'SystemMonitor'๋ผ๋ ์ด๋ฆ์ MCP ์๋ฒ ์์ฑ
mcp = FastMCP("SystemMonitor")
Step 2: ๋๊ตฌ(Tool) ๋ฑ๋กํ๊ธฐ
MCP์ ํต์ฌ์ AI๊ฐ ํธ์ถํ ์ ์๋ Tool์ ์ ์ํ๋ ๊ฒ์
๋๋ค. @mcp.tool() ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ด์ฌ ํจ์๊ฐ ์ฆ์ AI์ ๋๊ตฌ๊ฐ ๋ฉ๋๋ค.
Python
import psutil
@mcp.tool()
def get_system_stats() -> str:
"""ํ์ฌ ์ปดํจํฐ์ CPU์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ฐํํฉ๋๋ค."""
cpu = psutil.cpu_percent(interval=1)
memory = psutil.virtual_memory().percent
return f"ํ์ฌ CPU ์ฌ์ฉ๋ฅ ์ {cpu}%์ด๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ฅ ์ {memory}%์
๋๋ค."
Tip: ํจ์์ Docstring(์ฃผ์)์ AI๊ฐ ์ด ๋๊ตฌ๋ฅผ ์ธ์ ์ฌ์ฉํด์ผ ํ ์ง ํ๋จํ๋ ๊ทผ๊ฑฐ๊ฐ ๋๋ฏ๋ก ๋งค์ฐ ์์ธํ ์ ์ด์ผ ํฉ๋๋ค.
Step 3: ๋ฆฌ์์ค(Resource) ์ ์ํ๊ธฐ
๋๊ตฌ๊ฐ 'ํ๋'์ด๋ผ๋ฉด, ๋ฆฌ์์ค๋ '๋ฐ์ดํฐ'์ ๋๋ค. ์ ์ ์ธ ํ ์คํธ๋ ๋ก๊ทธ ํ์ผ ๋ฑ์ AI์๊ฒ ๋ ธ์ถํ ๋ ์ฌ์ฉํฉ๋๋ค.
Python
@mcp.resource("system://info")
def system_info() -> str:
return "์ด ์๋ฒ๋ MCP SDK๋ฅผ ํตํด ๊ตฌ์ถ๋ ์์คํ
๋ชจ๋ํฐ๋ง ์ ์ฉ ๋
ธ๋์
๋๋ค."
4. ์๋ฒ ์คํ ๋ฐ Claude Desktop ์ฐ๋
์ด์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์๋ฒ๋ฅผ ํด๋ก๋์๊ฒ ์ธ์์์ผ์ผ ํฉ๋๋ค.
1. ๋ก์ปฌ ๊ฒฝ๋ก ํ์ธ: ์์ฑํ ํ์ด์ฌ ํ์ผ์ ์ ๋ ๊ฒฝ๋ก๋ฅผ ๋ณต์ฌํฉ๋๋ค. (์: C:/dev/mcp_server.py)
2. ์ค์ ํ์ผ ์์ : Claude Desktop์ ์ค์ ํ์ผ(claude_desktop_config.json)์ ์ฝ๋๋ค.
JSON
{
"mcpServers": {
"my-monitor": {
"command": "python",
"args": ["C:/dev/mcp_server.py"]
}
}
}
3. ํ์ธ: ํด๋ก๋๋ฅผ ์ฌ์์ํ๊ณ "๋ด ์ปดํจํฐ ์์คํ
์ํ ์ด๋?"๋ผ๊ณ ๋ฌผ์ด๋ณด์ธ์. ํด๋ก๋๊ฐ get_system_stats ๋๊ตฌ๋ฅผ ์ค์ค๋ก ์คํํ์ฌ ๋ต๋ณ์ ๋ด๋๋๋ค๋ฉด ์ฑ๊ณต์
๋๋ค.
5. ์ค๋ฌด ์์ฉ: ๋ด๋ถ DB ๋ฐ API ์ฐ๊ฒฐ
์ ์์ ๋ฅผ ํ์ฅํ๋ฉด ๋ฌด๊ถ๋ฌด์งํ ํ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
Internal DB ์ฐ๊ฒฐ:
SQLAlchemy๋ฑ์ ํ์ฉํด ํน์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๋๊ตฌ๋ฅผ ๋ง๋ค๋ฉด, AI๊ฐ ์ฌ๋ด ์งํ๋ฅผ ์ค์๊ฐ ๋ถ์ํ ์ ์์ต๋๋ค.API ์ฐ๋: ์ฌ๋ด Jira๋ Slack API๋ฅผ ์ฐ๋ํ์ฌ "์ด์ ๋ฑ๋ก๋ ๋ฒ๊ทธ ํฐ์ผ๋ค ์์ฝํด์ ๋ณด๊ณ ํด์ค" ๊ฐ์ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
6. ๊ฐ๋ฐ์๋ค์ ์ํ ๊ฟํ
์๋ฌ ํธ๋ค๋ง: MCP ์๋ฒ ๋ด๋ถ์์ ๋ฐ์ํ๋ ์์ธ๋ ๋ฐ๋์ ํ ์คํธ๋ก ๋ํํด์ ๋ฐํํ์ธ์. AI๊ฐ ์๋ฌ ๋ฉ์์ง๋ฅผ ๋ณด๊ณ ์ค์ค๋ก ์์ ์ ์๋ํ ์ ์์ต๋๋ค.
๋ณด์: AI์๊ฒ ๋ชจ๋ ๊ถํ์ ์ฃผ๊ธฐ๋ณด๋ค, ํ์ํ ์ฝ๊ธฐ ์ ์ฉ(ReadOnly) ์ฟผ๋ฆฌ๋ง ๋ ธ์ถํ๋ ๊ฒ์ด ์์ ํฉ๋๋ค.
์ฑ๋ฅ: ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ๋ณด๋ด๊ธฐ๋ณด๋ค ํ์ํ ๋ถ๋ถ๋ง ํํฐ๋งํด์ ์ ๋ฌํ๋๋ก ๋๊ตฌ ์ธ์(Arguments)๋ฅผ ์ค๊ณํ์ธ์.
โ ๋ง๋ฌด๋ฆฌํ๋ฉฐ
MCP๋ AI์ ๋ฐ์ดํฐ ์ฌ์ด์ ๋ฒฝ์ ํ๋ฌด๋ ํ๋ช ์ ์ธ ๋๊ตฌ์ ๋๋ค. ์ด์ ๋จ์ํ ํ๋กฌํํธ ์์ง๋์ด๋ฅผ ๋์ด, AI์ ๊ฐ๊ฐ๊ธฐ๊ด๊ณผ ํ๋ค๋ฆฌ๊ฐ ๋์ด์ค MCP ์๋ฒ ์์ง๋์ด์ ์ญํ ์ด ์ค์ํด์ง ๊ฒ์ ๋๋ค. ์ค๋ ์๋ ค๋๋ฆฐ Python SDK๋ฅผ ํ์ฉํด ์ฌ๋ฌ๋ถ๋ง์ ๋ ์ฐฝ์ ์ธ AI ์์ด์ ํธ ์ํ๊ณ๋ฅผ ๊ตฌ์ถํด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค.
๋์์ด ๋์ จ๋ค๋ฉด ๊ณต๊ฐ๊ณผ ๋๊ธ ๋ถํ๋๋ฆฌ๋ฉฐ, ๊ตฌํ ์ค ๋งํ๋ ๋ถ๋ถ์ ์ธ์ ๋ ์ง๋ฌธํด ์ฃผ์ธ์!
์ฃผ์ ํค์๋ ๊ฐ๋ฐ์๋ธ๋ก๊ทธ, SDK, Python, TypeScript, ์คํ์์ค, MCP, Anthropic, AI์์ด์ ํธ, JSON-RPC, ์๋ฒ๊ตฌ์ถ