AI 에이전트 프레임워크 + MCP 통합 Nanny 레벨 튜토리얼: 외부 도구를 호출할 수 있는 에이전트를 처음부터 구축

🛒 개발자를 위한 환경 준비, MCP 서버 쓰기, LangGraph 공동 디버깅까지 원스톱 입문 튜토리얼입니다.

튜토리얼 목표

이 튜토리얼에서는 외부 도구를 호출할 수 있는 AI 에이전트를 처음부터 구축하는 방법을 안내합니다. 먼저 Python을 사용하여 MCP 표준을 준수하는 도구 서비스(MCP 서버)를 작성한 다음 LangGraph를 사용하여 이를 대화형 에이전트에 연결합니다. 학습 후에는 예제를 실행할 수 있을 뿐만 아니라 자신의 시스템의 API를 도구에 캡슐화하여 에이전트에 연결할 수도 있습니다.

준비 체크리스트

  • [ ] 인터넷 지원 개발 머신(macOS/Linux/Windows 허용), Python 3.10 이상.
  • [ ] uv 설치(권장, Python 환경 및 종속성을 관리하는 데 사용됨): curl -LsSf https://astral.sh/uv/install.sh | sh, 그 다음 source ~/.zshrc.
  • [ ] 사용 가능한 LLM API 키(OpenAI/Anthropic/국내 대형 모델이 허용됩니다. 이 튜토리얼에서는 OpenAI 호환 인터페이스를 예로 사용합니다).
  • [ ] "실제 도구" 예제 준비: 이 튜토리얼에서는 "로컬 파일 읽기"를 도구로 사용하며 이를 날씨 API 또는 데이터베이스 쿼리로 변경할 수도 있습니다.
  • [ ] (선택 사항) MCP Inspector 시각적 디버깅 도구를 설치합니다.

버전 팁: MCP SDK와 LangGraph는 빠르게 반복됩니다. 다음 명령의 버전 번호는 공식 실시간 페이지에 따릅니다. 설치에 실패하면 오류 보고서의 프롬프트에 우선순위를 부여하십시오.

1단계: 프로젝트 및 가상 환경 생성

``배쉬 mkdir mcp-agent-demo && cd mcp-agent-demo uv 초기화 --python 3.11 uv "mcp[cli]" 추가 langgraph langchain-openai python-dotenv


참고: `uv init`은 `pyproject.toml` 및 `main.py`를 생성합니다. `mcp[cli]`는 MCP 런타임 및 디버깅 명령을 제공합니다.

## 2단계: 첫 번째 MCP 서버 작성

'로컬 파일 내용 읽기' 도구를 구현하려면 'server.py'를 만듭니다.

``파이썬
mcp.server.fastmcp에서 FastMCP 가져오기

mcp = FastMCP("파일 판독기")

@mcp.tool()
def read_file(경로: str) -> str:
    """지정된 경로에 있는 텍스트 파일의 내용을 읽습니다. 외부 도구를 호출하는 에이전트를 보여주기 위해 사용됩니다."""
    시도해 보세요:
        open(path, "r", 인코딩="utf-8")을 f로 사용:
            f.read(2000)를 반환합니다.
    e와 같은 예외를 제외하고:
        return f"읽기 실패: {e}"

__name__ == "__main__"인 경우:
    mcp.run()

요점: @mcp.tool() 데코레이터는 일반 함수를 도구로 등록하고, 함수 매개변수와 문서 문자열은 모델이 볼 수 있는 도구 스키마를 자동으로 생성합니다. - 모델이 언제 호출해야 하는지 알 수 있도록 설명을 명확하게 작성해야 합니다.

3단계: MCP Inspector로 서버 확인

``배쉬 uv mcp dev server.py 실행


브라우저와 Inspector에서 `http://localhost:6274`를 엽니다.

1. `read_file` 도구를 선택합니다.
2. `{"path": "README.md"}` 매개변수를 입력합니다(먼저 프로젝트에서 README.md를 생성합니다).
3. 통화를 클릭하면 오른쪽에 파일 내용이 반환됩니다.

이 단계에서는 "도구 자체를 사용할 수 있음"을 확인하고 먼저 모델 수준에서 문제를 격리할 수 있습니다.

## 4단계: LangGraph로 에이전트 구축 및 MCP 도구에 연결

`agent.py`를 만듭니다.

``파이썬
비동기 가져오기
langchain_openai에서 ChatOpenAI 가져오기
langgraph.prebuild에서 create_react_agent 가져오기
langchain_mcp_adapters.client에서 MultiServerMCPClient 가져오기

비동기 정의 메인():
    MultiServerMCPClient와 비동기(
        {"file-reader": {"명령": "uv", "args": ["run", "server.py"], "transport": "stdio"}}
    ) 클라이언트로서:
        도구 = client.get_tools()
        모델 = ChatOpenAI(모델="gpt-4o-mini", 온도=0)
        에이전트 = create_react_agent(모델, 도구)
        result = wait Agent.ainvoke({"messages": [("user", "프로젝트의 README.md를 읽고 처음 세 줄을 요약하십시오.")]})
        print(결과["메시지"][-1].content)

__name__ == "__main__"인 경우:
    asyncio.run(메인())

실행:

``배쉬 OPENAI_API_KEY="귀하의 키" 내보내기 uv Python Agent.py 실행


예상 출력: 모델은 먼저 `read_file` 도구를 호출하여 파일을 읽은 다음 반환된 콘텐츠를 기반으로 요약을 제공합니다. 이는 완전한 "에이전트 → MCP → 실제 도구" 링크입니다.

## 5단계: 실제 비즈니스 도구에 연결(예: SQLite 쿼리)

"쿼리 데이터베이스" 도구를 사용하여 `server.py`를 확장합니다.

``파이썬
sqlite3 가져오기

@mcp.tool()
def query_sqlite(db_path: str, sql: str) -> str:
    """SQLite 데이터베이스에 대해 읽기 전용 SELECT 쿼리를 실행하고 결과를 반환합니다."""
    그렇지 않은 경우 sql.strip().lower().startswith("select"):
        "SELECT 쿼리만 허용됩니다"를 반환합니다.
    conn = sqlite3.connect(db_path)
    시도해 보세요:
        행 = conn.execute(sql).fetchmany(10)
        return "\n".join(행의 r에 대해 str(r))
    e와 같은 예외를 제외하고:
        f"쿼리 실패: {e}"를 반환합니다.
    마지막으로:
        연결.닫기()

기업에서 구현하는 경우 이 읽기 전용 쿼리를 "권한 확인을 통한 내부 API 캡슐화"로 바꾸는 것이 프로덕션 수준 도구의 최소 형태입니다.

6단계: 구성, 로그 및 일반적인 오류

  • 로그: ChatOpenAIverbose=True를 추가하고 agent.py에 에이전트를 추가하여 각 단계의 도구 호출을 관찰합니다.
  • 시간 초과: 에이전트가 멈추는 것을 방지하기 위해 MCP 도구 호출에 대한 시간 초과를 클라이언트에서 구성할 수 있습니다.
  • 일반적인 오류 보고 및 처리:
오류 현상 가능한 이유 치료
'연결이 거부되었습니다' 서버가 시작되지 않았거나 stdio 경로가 올바르지 않습니다. uv run mcp dev server.py를 사용하여 먼저 확인하세요.
모델이 도구를 호출하지 않습니다 도구 설명이 불분명하거나 모델이 너무 약함 도구 설명을 다시 작성하고 더 강력한 모델로 교체
'도구를 찾을 수 없습니다' MCP 클라이언트가 도구를 등록하지 못했습니다 get_tools() 반환 목록 확인
중국어 왜곡 문자 인코딩 문제 통합 파일 읽기 및 쓰기 encoding="utf-8"

확인 방법

  1. 도구 계층 확인: MCP Inspector는 각 도구를 개별적으로 테스트합니다.
  2. 링크 확인: 에이전트가 3가지 다른 작업을 완료하여 매번 도구가 올바르게 선택되었는지 확인하도록 합니다.
  3. 회귀 검증: 사용 사례를 스크립트로 통합하고 수정 후 다시 실행합니다.

자주 묻는 질문(FAQ)

  1. MCP는 Python을 사용해야 합니까?

    아니요. 공식 SDK는 Python과 TypeScript를 지원하며, Node 환경은 @modelcontextprotocol/sdk를 사용합니다.

  2. 로컬 GPU가 없어도 이 튜토리얼을 사용할 수 있나요?

    할 수 있는. 이 튜토리얼의 LLM은 API를 사용하고 대규모 모델 추론에만 컴퓨팅 성능이 필요하며 가벼운 도구 서비스만 로컬에서 실행됩니다.

  3. 상담원이 도구를 호출하지 않으면 어떻게 해야 합니까?

먼저 도구 설명에 "호출 시기"라는 트리거 조건이 포함되어 있는지 확인하고, 두 번째로 모델에 함수 호출 기능이 있는지 확인한 다음, 마지막으로 더 간단한 프롬프트를 사용하여 테스트합니다.

  1. 프로덕션 환경에 MCP 서버를 배포하는 방법은 무엇입니까?

    서버는 stdio 대신 스트리밍 가능한 HTTP 전송을 사용하고 통합 인증에 액세스하여 독립적인 프로세스/컨테이너로 배포될 수 있습니다.

  2. 여러 도구가 서로 간섭합니까?

    각 도구에는 독립적인 네임스페이스와 스키마가 있습니다. 설명이 명확하고 권한이 최소화되면 일반적으로 간섭이 발생하지 않습니다. 동시성이 높은 시나리오에서는 흐름을 제한하는 것이 좋습니다.

고도화 및 확장

  • 다중 에이전트 오케스트레이션: LangGraph의 상태 시스템을 사용하여 "계획-실행-검토"를 여러 역할로 분할합니다.
  • MCP 레지스트리: 버전과 권한을 통합하기 위해 내부 도구 등록 센터를 구축합니다.
  • 평가 세트: 행동 표류를 방지하기 위해 비즈니스 사용 사례를 자동화된 회귀로 촉진합니다.
  • 민영화: LLM을 로컬 배포 모델(예: Ollama)로 대체하여 전체 링크 인트라넷 운영을 달성합니다.

사용자 후기

  • 후기를 불러오는 중...