์ด๋ฒˆ ํŽธ์€ smolagents ์—์ด์ „ํŠธ์— ์™ธ๋ถ€ ๋„๊ตฌ ์„œ๋ฒ„(MCP)๋ฅผ ๋ถ™์ด๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ ํ๋ฆ„์„ ๋‹ค๋ฃฌ๋‹ค.
ํ•ต์‹ฌ ๋ชฉํ‘œ๋Š” ๋ณต์žกํ•œ ๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ, โ€œ๋„๊ตฌ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์—ฐ๊ฒฐํ•˜๊ณ  ์‹ค์ œ๋กœ ํ˜ธ์ถœ๋˜๋Š”์ง€ ํ™•์ธโ€ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  • ์ด์ „ ํŽธ: ๐Ÿค— 17. ๋ณธํŽธ 09
  • ๋‹ค์Œ ํ™•์žฅ: MCP ์ธ์ฆ/๊ถŒํ•œ ๋ถ„๋ฆฌ, ์‹คํŒจ ์žฌ์‹œ๋„ ์ •์ฑ…, ์šด์˜ ๋กœ๊ทธ ํ‘œ์ค€ํ™”

ํ•œ ์ค„ ๊ฒฐ๋ก 

์—์ด์ „ํŠธ ๋„์ž… ์ดˆ๋ฐ˜์—๋Š” ๋ชจ๋ธ ํŠœ๋‹๋ณด๋‹ค โ€œ๋„๊ตฌ ์—ฐ๊ฒฐ ๊ฒ€์ฆ(์—ฐ๊ฒฐโ†’ํ˜ธ์ถœโ†’๊ฒฐ๊ณผ)โ€œ์„ ๋จผ์ € ํ‘œ์ค€ํ™”ํ•˜๋ฉด ์‹ค๋ฌด ์‹คํŒจ๊ฐ€ ํฌ๊ฒŒ ์ค„์–ด๋“ ๋‹ค.

flowchart LR
  U[์‚ฌ์šฉ์ž ์งˆ๋ฌธ] --> A[CodeAgent]
  A --> C[ToolCollection.from_mcp]
  C --> M[MCP Server]
  M --> C
  C --> A
  A --> R[์ตœ์ข… ๋‹ต๋ณ€ + ์‚ฌ์šฉ๋„๊ตฌ ๋กœ๊ทธ]

์‹ค์Šต ๋ชฉํ‘œ

  • ToolCollection.from_mcp ๊ฐœ๋…์„ ์ดํ•ดํ•œ๋‹ค.
  • ๋กœ์ปฌ MCP ์„œ๋ฒ„(์˜ˆ: filesystem)๋ฅผ smolagents์— ์—ฐ๊ฒฐํ•œ๋‹ค.
  • ๋„๊ตฌ ํ˜ธ์ถœ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ๋กœ๊ทธ๋กœ ํ™•์ธํ•œ๋‹ค.

์ค€๋น„๋ฌผ

  • ๋„๊ตฌ: Python 3.10+, Node.js 18+, ํ„ฐ๋ฏธ๋„
  • ์ž…๋ ฅ: OpenAI ํ˜ธํ™˜ API ํ‚ค 1๊ฐœ
  • ์‹คํ–‰ ํ™˜๊ฒฝ: Linux/macOS (Windows๋Š” WSL ๊ถŒ์žฅ)
  • ์ž‘์—… ํด๋” ์˜ˆ์‹œ: ~/hf-agents-lesson18

์ดˆ๋ณด์ž ํŒ: ์ฒ˜์Œ์—๋Š” โ€œ์ฝ๊ธฐ ์ „์šฉ ๋„๊ตฌโ€๋ถ€ํ„ฐ ๋ถ™์ด์ž. ์“ฐ๊ธฐ/์‚ญ์ œ ๊ถŒํ•œ ๋„๊ตฌ๋Š” ์šด์˜ ์‚ฌ๊ณ  ์œ„ํ—˜์ด ํฌ๋‹ค.

1) ํ”„๋กœ์ ํŠธ/ํŒจํ‚ค์ง€ ์ค€๋น„

  • ๋„๊ตฌ: ํ„ฐ๋ฏธ๋„
  • ์ž…๋ ฅ: ๊ฐ€์ƒํ™˜๊ฒฝ + ํŒจํ‚ค์ง€ ์„ค์น˜
  • ์‹คํ–‰๋ช…๋ น:
mkdir -p ~/hf-agents-lesson18
cd ~/hf-agents-lesson18
python3 -m venv .venv
source .venv/bin/activate
pip install -U "smolagents[toolkit,litellm,mcp]" mcp
  • ์„ฑ๊ณตํŒ์ •:
    • (.venv) ํ”„๋กฌํ”„ํŠธ ํ‘œ์‹œ
    • pip install ์—๋Ÿฌ ์—†์ด ์ข…๋ฃŒ

2) MCP ์„œ๋ฒ„ ํ™•์ธ(ํŒŒ์ผ์‹œ์Šคํ…œ ์˜ˆ์‹œ)

  • ๋„๊ตฌ: ํ„ฐ๋ฏธ๋„
  • ์ž…๋ ฅ: MCP ์„œ๋ฒ„ ์‹คํ–‰ ๊ฐ€๋Šฅ ์—ฌ๋ถ€
  • ์‹คํ–‰๋ช…๋ น:
npx -y @modelcontextprotocol/server-filesystem --help
  • ์„ฑ๊ณตํŒ์ •:
    • help/usage ๋ฌธ๊ตฌ ์ถœ๋ ฅ
    • command not found ๋˜๋Š” npm ๊ถŒํ•œ ์˜ค๋ฅ˜๊ฐ€ ์—†์Œ

3) ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •

  • ๋„๊ตฌ: ํ„ฐ๋ฏธ๋„
  • ์ž…๋ ฅ: ๋ชจ๋ธ/API ํ‚ค
  • ์‹คํ–‰๋ช…๋ น:
export OPENAI_API_KEY="YOUR_API_KEY"
export MODEL_ID="openai/gpt-4o-mini"
  • ์„ฑ๊ณตํŒ์ •:
    • echo $MODEL_ID ๊ฐ’ ํ™•์ธ ๊ฐ€๋Šฅ
    • python -c "import os; print(bool(os.getenv('OPENAI_API_KEY')))" ๊ฒฐ๊ณผ๊ฐ€ True

4) MCP ์—ฐ๊ฒฐ ์—์ด์ „ํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

  • ๋„๊ตฌ: ์—๋””ํ„ฐ ๋˜๋Š” ํ„ฐ๋ฏธ๋„
  • ์ž…๋ ฅ: ์•„๋ž˜ ์ฝ”๋“œ
  • ์‹คํ–‰๋ช…๋ น:
cat > lesson18_mcp_agent.py <<'PY'
from __future__ import annotations
 
import os
 
from smolagents import CodeAgent, LiteLLMModel, ToolCollection
 
 
def build_agent() -> CodeAgent:
    model = LiteLLMModel(model_id=os.getenv("MODEL_ID", "openai/gpt-4o-mini"))
 
    # ๋กœ์ปฌ ํด๋”๋ฅผ ์ฝ๋Š” filesystem MCP ์„œ๋ฒ„ ์—ฐ๊ฒฐ (์ฝ๊ธฐ ์ค‘์‹ฌ ๊ถŒ์žฅ)
    tools = ToolCollection.from_mcp(
        command="npx",
        args=[
            "-y",
            "@modelcontextprotocol/server-filesystem",
            ".",
        ],
    )
 
    return CodeAgent(
        tools=tools.tools,
        model=model,
        max_steps=6,
    )
 
 
def main() -> None:
    agent = build_agent()
    question = "ํ˜„์žฌ ํด๋”์—์„œ md ํŒŒ์ผ ๋ชฉ๋ก์„ ์ฐพ์•„, ํŒŒ์ผ๋ช…๋งŒ bullet 3๊ฐœ ์ด๋‚ด๋กœ ์š”์•ฝํ•ด์ค˜."
    result = agent.run(question)
    print("\n=== AGENT RESULT ===")
    print(result)
 
 
if __name__ == "__main__":
    main()
PY
  • ์„ฑ๊ณตํŒ์ •:
    • lesson18_mcp_agent.py ํŒŒ์ผ ์ƒ์„ฑ
    • ์ฝ”๋“œ์— ToolCollection.from_mcp(...) ํฌํ•จ

5) ์‹คํ–‰ ๋ฐ ๋„๊ตฌ ํ˜ธ์ถœ ๊ฒ€์ฆ

  • ๋„๊ตฌ: Python
  • ์ž…๋ ฅ: ์งˆ๋ฌธ 1๊ฐœ(์ฝ”๋“œ ๋‚ด ๊ธฐ๋ณธ๊ฐ’)
  • ์‹คํ–‰๋ช…๋ น:
python lesson18_mcp_agent.py
  • ์„ฑ๊ณตํŒ์ •:
    • ์—์ด์ „ํŠธ ์ถœ๋ ฅ์ด ์ƒ์„ฑ๋จ
    • ๋กœ์ปฌ ํŒŒ์ผ ๊ด€๋ จ ๊ฒฐ๊ณผ๊ฐ€ ํฌํ•จ๋จ
    • ์˜ค๋ฅ˜ ์—†์ด ์ข…๋ฃŒ ์ฝ”๋“œ 0

6) ์‹คํŒจ ์‹œ ์ ๊ฒ€ ๋ฃจํ‹ด(์ดˆ๋ณด์ž์šฉ)

  • ๋„๊ตฌ: ํ„ฐ๋ฏธ๋„
  • ์ž…๋ ฅ: ์„ค์น˜/ํ™˜๊ฒฝ/์‹คํ–‰ ์ƒํƒœ ์ง„๋‹จ
  • ์‹คํ–‰๋ช…๋ น:
pip show smolagents mcp
node -v
npm -v
 
python - <<'PY'
import os
print("MODEL_ID:", os.getenv("MODEL_ID"))
print("OPENAI_API_KEY set:", bool(os.getenv("OPENAI_API_KEY")))
PY
  • ์„ฑ๊ณตํŒ์ •:
    • ํŒจํ‚ค์ง€/Node ๋ฒ„์ „/ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋ˆ„๋ฝ ์—ฌ๋ถ€ ์ฆ‰์‹œ ํ™•์ธ ๊ฐ€๋Šฅ

์‹ค๋ฌด ์ ์šฉ ํฌ์ธํŠธ

  1. MCP ์—ฐ๊ฒฐ์€ ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ด€๋ฆฌ
    ๋‚˜์ค‘์— ๋„๊ตฌ๋ฅผ ๋ฐ”๊ฟ”๋„ ์—์ด์ „ํŠธ ๊ตฌ์กฐ๋ฅผ ํฌ๊ฒŒ ๋ฐ”๊พธ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  2. ๊ถŒํ•œ ์ตœ์†Œํ™” ์›์น™ ๋จผ์ € ์ ์šฉ
    ์ดˆ๋ฐ˜์—๋Š” ์ฝ๊ธฐ ์ „์šฉ ๋„๊ตฌ๋กœ ์‹œ์ž‘ํ•ด ์šด์˜ ๋ฆฌ์Šคํฌ๋ฅผ ์ค„์ธ๋‹ค.
  3. ๋„๊ตฌ ํ˜ธ์ถœ ๋กœ๊ทธ๋ฅผ ๋ฐ˜๋“œ์‹œ ๋‚จ๊ธฐ๊ธฐ
    ์‹คํŒจ ๋ถ„์„(๊ถŒํ•œ, ๊ฒฝ๋กœ, ์‘๋‹ต ํฌ๋งท)์— ๊ฐ€์žฅ ๋น ๋ฅธ ๋‹จ์„œ๊ฐ€ ๋œ๋‹ค.
  4. ์ž‘์€ ์„ฑ๊ณต ์‹œ๋‚˜๋ฆฌ์˜ค๋ถ€ํ„ฐ ๊ณ ์ •
    โ€ํŒŒ์ผ ๋ชฉ๋ก ์กฐํšŒโ€์ฒ˜๋Ÿผ ๋‹จ์ˆœ ์ž‘์—…์ด ์•ˆ์ •ํ™”๋˜๋ฉด, ๊ทธ๋‹ค์Œ์— ์“ฐ๊ธฐ/๋ณ€ํ™˜ ์ž๋™ํ™”๋กœ ํ™•์žฅํ•œ๋‹ค.

์ž์ฃผ ๋ง‰ํžˆ๋Š” ๋ฌธ์ œ

  1. npx ์‹คํ–‰ ์‹คํŒจ
    • ํ•ด๊ฒฐ: Node/npm ๋ฒ„์ „ ์ ๊ฒ€, ์‚ฌ๋‚ด๋ง ํ”„๋ก์‹œ ์„ค์ • ํ™•์ธ
  2. ์—์ด์ „ํŠธ๊ฐ€ ๋„๊ตฌ๋ฅผ ์•ˆ ์“ฐ๊ณ  ์ถ”๋ก ๋งŒ ํ•จ
    • ํ•ด๊ฒฐ: ์งˆ๋ฌธ์— โ€œํ˜„์žฌ ํด๋”์—์„œโ€์ฒ˜๋Ÿผ ๋„๊ตฌ ํ•„์š”์„ฑ์„ ๋ช…์‹œ
  3. ๊ฒฝ๋กœ ๊ถŒํ•œ ์ด์Šˆ
    • ํ•ด๊ฒฐ: ๋„๊ตฌ ์„œ๋ฒ„ ์‹คํ–‰ ๋ฃจํŠธ ๊ฒฝ๋กœ๋ฅผ ๋ช…ํ™•ํžˆ ์ง€์ •ํ•˜๊ณ  ์ฝ๊ธฐ ๊ฐ€๋Šฅ ๊ฒฝ๋กœ์ธ์ง€ ํ™•์ธ

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ๊ฐ€์ƒํ™˜๊ฒฝ + ํŒจํ‚ค์ง€ ์„ค์น˜ ์™„๋ฃŒ
  • MCP ์„œ๋ฒ„ help ์ถœ๋ ฅ ํ™•์ธ
  • API ํ‚ค/๋ชจ๋ธ ์„ค์ • ์™„๋ฃŒ
  • ToolCollection.from_mcp ์ฝ”๋“œ ์ž‘์„ฑ ์™„๋ฃŒ
  • ์‹คํ–‰ ์‹œ ๋„๊ตฌ ๊ธฐ๋ฐ˜ ๊ฒฐ๊ณผ ํ™•์ธ

์ฐธ๊ณ  ๋งํฌ (์šฐ์„ ์ˆœ์œ„)

  1. https://github.com/huggingface/agents-course
  2. https://huggingface.co/learn/agents-course
  3. https://huggingface.co/docs/smolagents

์ƒ์„ฑํ˜• AI ํ™œ์šฉ ๊ณ ์ง€

์ด ๋ฌธ์„œ๋Š” ์ƒ์„ฑํ˜• AI๋ฅผ ํ™œ์šฉํ•ด ์ดˆ์•ˆ ๊ตฌ์กฐํ™”, ์‹ค์Šต ์ฝ”๋“œ ๊ณจ๊ฒฉ ์ž‘์„ฑ, ์ฒดํฌ๋ฆฌ์ŠคํŠธ ์ •๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์œผ๋ฉฐ, ์ตœ์ข… ๋ฐœํ–‰ ์ „ ์‚ฌ๋žŒ์ด ๋ช…๋ น/๋งํฌ/์žฌํ˜„ ๋‹จ๊ณ„๋ฅผ ๊ฒ€ํ† ํ–ˆ๋‹ค.