MCP 서버 개발 끄적

이태형·2025년 8월 10일

Growth Log

목록 보기
18/18

호스트

  • 실제 AI 애플리케이션
  • Claude Desktop 이나 Cursor IDE, 기타 AI 기반 채팅 도구가 호스트임
  • 여러 클라이언트를 생성하고 관리하며 사용자 인터페이스를 제공함
  • 보안 정책 및 권한을 제어하고 AI 모델 LLM과의 통합관리 역할

클라이언트

  • 호스트 내부에서 동작하는 연결 관리자
  • 각 MCP 서버와 1:1로 연결되어 다음 역할 수행
    • 특정 MCP 서버와의 전용 연결 유지
    • JSON-RPC 기반 메시지 송수신
    • 프로토콜 협상 및 기능 교환
    • 서버에서 받은 데이터를 호스트가 이해할 수 있는 형태로 변환

서버(개발 대상)

  • 실제 기능과 데이터를 제공하는 프로그램
    • 도구 : 실행 가능한 기능 (파일 생성, API 호출 등)
    • 리소스 : 읽기 전용 데이터(파일 내용, 데이터베이스 정보 등)
    • 프롬프트 : 재사용 가능한 템플릿
  • MCP를 지원하는 백엔드 서비스, AI 모델이 필요로 하는 외부 기능이나 데이터를 제공하는 역할
  • AI 시스템이 MCP 서버에 연결해 기능과 상호작용 방법을 쿼리, 서버는 API, 데이터베이스, CRM, 캘린더 등 다양한 외부 시스템에 안전하게 접근할 수 있는 통합된 인터페이스 제공
    • AI 모델이 호출할 수 있는 함수와 데이터를 제공
    • 실시가능로 데이터를 주고 받으며 협업 가능

Claude 사용, MCP 서버 개발

  • 호스트가 MCP 서버의 함수를 호출하는 기준은 각 함수의 이름·설명·입력 파라미터와 비교하여 질문과 일치하는 함수를 매칭해서 호출함
  • 현재 대화 맥락, 함수의 기능 설명, 인수 타입 등 메타데이터를 참고해 “어떤 도구가 적합한지”를 스스로 추론해서 호출
  • 주의할 점은 함수 로직 중 예외에 대한 처리가 제대로 되어 있지 않으면 함수 호출 실패 여부를 호스트는 알 수가 없어 무조건 성공으로 판단함

Python 환경에서 MCP 서버 개발

  • FastMCP 라이브러리 install, MCP 연결과 관련된 기능을 제공

Claude Desktop 앱 설정 추가

  • claude_desktop_config.json 파일에 개발한 MCP 서버 코드를 추가
    • MCP-FinancialPlan 프로젝트의 python은 .venv 로 개별 가상환경으로 잡아두었기 때문에 실제 프로젝트에서 사용하는 python 위치를 잡아줘야 함

      {
          "mcpServers": {
              "financial-mcp": {
                  "command": "/Users/app/PycharmProjects/MCP-FinancialPlan/.venv/bin/python",
                  "args": ["/Users/app/PycharmProjects/MCP-FinancialPlan/main.py"],
                  "name": "Financial MCP",
                  "description": "재무설계표 Excel 파일을 생성하는 MCP 서버"
              }
          }
      }

mcp.tool() 함수 추가

# 구매하고 싶은 물건을 몇년동안 몇퍼센트에 수익률로 얼마를 모아야 하는가를 나타내는 데이터
@mcp.tool(description="구매 목표, 현재 수익률, 목표 기간을 기반으로 필요 월 저축액을 저장하는 기능")
def add_financial_goal(target: str, target_amount: int, expected_annual_return: float, target_period: int,
                       monthly_saving_amount: float) -> str:
    goal = datasource.FinancialGoal(
        target=target,
        target_amount=target_amount,
        expected_annual_return=expected_annual_return,
        target_period=target_period,
        monthly_saving_amount=monthly_saving_amount
    )
    datasource.insert_financial_goal(goal)
    return f"재정 목표 '{target}'이 성공적으로 저장되었습니다."

0개의 댓글