๐Ÿ Python SDK์™€ UV๋กœ MCP ์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ ์‹ค์Šต๊ธฐ: ๋™ํ†  vs ํŠธ๋ž„๋ผ๋ ˆ์˜ค์˜ ์ „ํˆฌ๊นŒ์ง€ โš”๏ธ

๐Ÿ Python SDK์™€ UV๋กœ MCP ์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ ์‹ค์Šต๊ธฐ: ๋™ํ†  vs ํŠธ๋ž„๋ผ๋ ˆ์˜ค์˜ ์ „ํˆฌ๊นŒ์ง€ โš”๏ธ

์†Œ๊ฐœ

ํ† ์š”์ผ ์‹ค์Šต์œผ๋กœ Python SDK๋ฅผ ์ด์šฉํ•ด MCP ์„œ๋ฒ„ ๊ฐœ๋ฐœ์„ ์ง์ ‘ ๋”ฐ๋ผ ํ•ด๋ดค์–ด์š”. ์ตœ๊ทผ Python ์ƒํƒœ๊ณ„์—์„œ ํ™”์ œ๊ฐ€ ๋˜๊ณ  ์žˆ๋Š” ๋น ๋ฅธ ํ”„๋กœ์ ํŠธ ๋งค๋‹ˆ์ € uv๋ฅผ ํ™œ์šฉํ•ด ํ™˜๊ฒฝ ๊ตฌ์„ฑ๋„ ํ•ด๋ดค๊ณ ์š”. ์‹ค์Šต์€ ๋‹จ์ˆœํ•œ ์ฝ”๋“œ ๋”ฐ๋ผํ•˜๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ผ, LLM์ด ๋งŒ๋“  ๊ฐ€์ƒ์˜ ์บ๋ฆญํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ MCP ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•ด ์‹ค์ œ ํˆด์ฒ˜๋Ÿผ ์ž‘๋™์‹œํ‚ค๋Š” ๊ฒฝํ—˜๊นŒ์ง€ ์ด์–ด์กŒ์Šต๋‹ˆ๋‹ค ๐Ÿ˜Ž

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์—” Claude Desktop์—์„œ ์บ๋ฆญํ„ฐ ์ „ํˆฌ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ–ˆ๋Š”๋ฐโ€ฆ ์ œ๊ฐ€ ๋งŒ๋“  ์บ๋ฆญํ„ฐ ๋™ํ† ๊ฐ€ ํŠธ๋ž„๋ผ๋ ˆ์˜ค๋ฅผ ์ด๊ฒผ์Šต๋‹ˆ๋‹ค! ๐Ÿ˜‚

์ง„ํ–‰ ๋ฐฉ๋ฒ•

๐Ÿงฐ 1. UV ์„ค์น˜ ๋ฐ ํ™˜๊ฒฝ ๊ตฌ์„ฑ

uv๋ž€?

  • Rust ๊ธฐ๋ฐ˜ ์ดˆ๊ณ ์† Python ํ”„๋กœ์ ํŠธ ๋งค๋‹ˆ์ €

  • ruff๋ฅผ ๋งŒ๋“  Astral์—์„œ ๊ฐœ๋ฐœํ•œ ๋„๊ตฌ๋กœ, venv + ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ + ์‹คํ–‰๊นŒ์ง€ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ’จ

๐Ÿ’ป ์„ค์น˜ ๋ฐฉ๋ฒ•

  • macOS (Homebrew)

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install uv
  • Windows

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

โš™๏ธ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

uv init my-mcp-server
cd my-mcp-server
uv venv
  • ๊ฐ€์ƒํ™˜๊ฒฝ ํ™œ์„ฑํ™”:

    • macOS: source .venv/bin/activate

    • Windows: .venv\Scripts\activate

๐Ÿ“ฆ ํ•„์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

uv add fastmcp

๐Ÿ› ๏ธ 2. Windsurf๋กœ ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœํ•˜๊ธฐ

  1. Windsurf ์‹คํ–‰ ํ›„ File > Open Folder ์„ ํƒ

  2. ํ„ฐ๋ฏธ๋„ ์—ด๊ณ  ๊ฐ€์ƒํ™˜๊ฒฝ ํ™œ์„ฑํ™”

๐Ÿงช 3. MCP ์„œ๋ฒ„ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ ๊ตฌํ˜„

main.py ํŒŒ์ผ ์ž‘์„ฑ:

from fastmcp import FastMCP

mcp = FastMCP("My MCP Server")

@mcp.tool()
def echo_tool(message: str) -> str:
    return f"Tool echo: {message}"

if __name__ == "__main__":
    mcp.run(transport='stdio')

โœ… ํ…Œ์ŠคํŠธ

fastmcp dev main.py
  • ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ http://127.0.0.1:6274 ์ ‘์† โ†’ STDIO ์—ฐ๊ฒฐ โ†’ echo_tool ํ…Œ์ŠคํŠธ


๐Ÿง  4. ์บ๋ฆญํ„ฐ ๋ฐ์ดํ„ฐ ์—ฐ๋™ ๋ฐ ํˆด ์ถ”๊ฐ€

๐Ÿ“ ๋ฐ์ดํ„ฐ ํด๋” ๋ฐ CSV ์ƒ์„ฑ

  • data/char_info.csv ์ƒ์„ฑ (๋‚ด์šฉ์€ Claude์—๊ฒŒ ์ƒ์„ฑ ์š”์ฒญ)

  • ์˜ˆ์‹œ:

name,information
๋™ํ† ,"์ฐจ๊ฐ€์šด ๋ˆˆ๋ณด๋ผ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋งˆ๋ฒ•์‚ฌ"
ํŠธ๋ž„๋ผ๋ ˆ์˜ค,"๋…ธ๋ž˜๋กœ ์ ์„ ๋ฌด์žฅํ•ด์ œ์‹œํ‚ค๋Š” ์ „์‚ฌ"

๐Ÿงฌ ํˆด ํ•จ์ˆ˜ ์ถ”๊ฐ€

import csv, os

data_path = os.path.join(os.path.dirname(__file__), 'data', 'char_info.csv')

@mcp.tool()
def get_character_info(name: str) -> str:
    with open(data_path, newline='', encoding='utf-8') as f:
        reader = csv.DictReader(f)
        for row in reader:
            if row['name'] == name:
                return row['information']
    return "์บ๋ฆญํ„ฐ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."

๐Ÿ”„ ์ƒ๋Œ€๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ์ด์œ 

  • MCP Host์—์„œ ์‹คํ–‰ ์‹œ ์ ˆ๋Œ€๊ฒฝ๋กœ ์‚ฌ์šฉ ์‹œ ์—๋Ÿฌ ๋ฐœ์ƒ
    โ†’ Python ํŒŒ์ผ ๊ธฐ์ค€ ์ƒ๋Œ€๊ฒฝ๋กœ๋กœ ์ˆ˜์ •


๐Ÿ–ฅ๏ธ 5. Claude Desktop ์—ฐ๋™

MCP ์„ค์น˜ ๋ฐ ์‹คํ–‰

fastmcp install main.py
  • Claude Desktop ์žฌ์‹คํ–‰ ํ›„ ํˆด ์ธ์‹

Adobe Flash Player์˜ ํ•œ๊ตญ ๋ฒ„์ „ ์Šคํฌ๋ฆฐ ์ƒท

๐Ÿงช ํ…Œ์ŠคํŠธ ์˜ˆ์‹œ

echo_tool:

์•ˆ๋…•ํ•˜์„ธ์š” โ†’ "Tool echo: ์•ˆ๋…•ํ•˜์„ธ์š”"

get_character_info:

"๋™ํ† ", "ํŠธ๋ž„๋ผ๋ ˆ์˜ค" โ†’ ๋‘ ์บ๋ฆญํ„ฐ ์†Œ๊ฐœ + ์ „ํˆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
์Šน์ž๋Š”โ€ฆ ๋™ํ† ! ๐ŸงŠโ„๏ธ๐Ÿ’ฅ

์Šน๋ถ€์˜ˆ์ธก

dong-to๋ž‘ ํŠธ๋ž„๋ผ๋ ˆ์˜ค๋ž‘ ์‹ธ์šฐ๋ฉด ๋ˆ„๊ฐ€ ์ด๊ฒจ?

๊ฒ€์€ ์ƒ‰ ํ™”๋ฉด์— ํ•œ๊ตญ ์ด๋ชจํ‹ฐ์ฝ˜ ์Šคํฌ๋ฆฐ ์ƒท
ํ•œ๊ตญ ๋‹จ์–ด ๋ชฉ๋ก์˜ ์Šคํฌ๋ฆฐ ์ƒท
ํ•œ๊ตญ ๋ฒ„์ „์˜ ๊ฒŒ์ž„ ์Šคํฌ๋ฆฐ ์ƒท

๊ฒฐ๊ณผ์™€ ๋ฐฐ์šด ์ 

๐Ÿ‘ ์ข‹์•˜๋˜ ์ 

  • uv ๋•๋ถ„์— ํ™˜๊ฒฝ ์„ค์ •์ด ๋งค์šฐ ๋น ๋ฅด๊ณ  ๊ฐ„ํŽธํ–ˆ์Œ

  • MCP SDK๊ฐ€ ๊ตฌ์กฐ์ ์œผ๋กœ ์ž˜ ์งœ์—ฌ ์žˆ์–ด ํ™•์žฅํ•˜๊ธฐ ์‰ฌ์›€

  • Claude Desktop์—์„œ ์ง์ ‘ ํˆด ํ…Œ์ŠคํŠธ๊นŒ์ง€ ๊ฐ€๋Šฅํ•ด ๊ฐœ๋ฐœ ๋ชฐ์ž…๋„๊ฐ€ ๋†’์•˜์Œ

๐Ÿ˜ตโ€๐Ÿ’ซ ์–ด๋ ค์› ๋˜ ์ 

  • CSV ์ƒ๋Œ€๊ฒฝ๋กœ ์„ค์ •์—์„œ ์‚ฝ์งˆ (ํ•˜์ง€๋งŒ ๋•๋ถ„์— Python ๊ฒฝ๋กœ ๋‹ค๋ฃจ๋Š” ๋ฒ• ์ˆ™์ง€!)

  • LLM์ด ์ƒ์„ฑํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜๋ชป๋  ๊ฒฝ์šฐ ํˆด ๊ฒฐ๊ณผ์— ์˜ํ–ฅ โ†’ ๋ฐ์ดํ„ฐ ์‹ ๋ขฐ๋„ ์ฃผ์˜ ํ•„์š”

  • ๊ฐ€์ƒํ™˜๊ฒฝ ๊ตฌ์ถ• ๊ฒฝ๋กœ๋ฅผ ์ž˜ ๋งž์ถœ ํ•„์š”๊ฐ€ ์žˆ์Œ

๐Ÿง  ๋А๋‚€ ์ 

"์‹ค์Šต์ด์—ˆ์ง€๋งŒ ์ง„์งœ ๋‚ด ํˆด์„ ๋งŒ๋“  ๊ธฐ๋ถ„".
๋‹จ์ˆœํžˆ ๋”ฐ๋ผ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋‚ด๊ฐ€ ์ง์ ‘ ๋งŒ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์„œ๋ฒ„๋ฅผ ๋„์šฐ๊ณ  ํˆด๋กœ ๋ถˆ๋Ÿฌ์™€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜๊นŒ์ง€ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ฐœ๋ฐœ์ž ๊ฐ์„ฑ ์ œ๋Œ€๋กœ ์ถฉ์ „๋์Šต๋‹ˆ๋‹ค.
SDK + UV + Claude ์กฐํ•ฉ์€ ์ถ”์ฒœํ•˜๊ณ  ์‹ถ์–ด์š”! ๐Ÿ”ฅ

๋„์›€ ๋ฐ›์€ ๊ธ€

  • Claude ๊ด€๋ จ ์˜ˆ์‹œ ํ”„๋กฌํ”„ํŠธ ๋ฐ ์‹ค์Šต ์ž๋ฃŒ

1
4๊ฐœ์˜ ๋‹ต๊ธ€

๐Ÿ‘‰ ์ด ๊ฒŒ์‹œ๊ธ€๋„ ์ฝ์–ด๋ณด์„ธ์š”