MCP 개발 2026년 6월 16일 약 22분 Model Context Protocol AI 도구 호출

처음부터 MCP Server 개발:
AI 도구 호출 기능을 단계별로 구축

프로토콜 원리 · Tools / Resources / Prompts · 디버깅·배포 · 개인 지식베이스 실전

처음부터 MCP Server를 개발해 AI 도구 호출 기능 구축

Python 또는 TypeScript 기초가 있는 백엔드/AI 개발자가 자주 겪는 문제는 Claude·GPT는 똑똑하지만 자사 DB·내부 API·로컬 파일에는 직접 접근할 수 없다는 점입니다. 모델에 외부 도구를 연결하는표준화된 통로가 없기 때문입니다.Model Context Protocol(MCP)는 Anthropic이 오픈소스로 공개한 프로토콜로, AI Client(Cursor, Claude Desktop)와 직접 작성한 Server가 JSON-RPC로 대화합니다. 이 글을 끝까지 읽으면 프로덕션에 투입 가능한 MCP Server를 독립적으로 개발·배포할 수 있습니다. 프로토콜 아키텍처 → 환경 구축 → Hello World → Tools/Resources/Prompts 3대 역량 → HTTP 원격 전송 → 디버깅·테스트 → Docker 배포 → 개인 지식베이스 실전 → 2026 생태 전망까지 다룹니다.

01

서론: AI에 MCP가 필요한 이유

대규모 언어 모델이 아무리 강해도 학습 데이터에는 컷오프가 있으며, CRM 고객·어젯밤 로그·사내 API 실시간 상태를 허공에서 알 수 없습니다. 업계 진화 경로는 분명합니다: Function Calling → Plugins → MCP. 앞의 두 방식은 벤더 고유 형식이 많아 모델을 바꿀 때마다 통합층을 다시 작성해야 합니다. MCP는 「AI가 어떤 도구를 발견하고 어떻게 호출하는지」를 개방 프로토콜로 표준화해, 한 번 작성하면 여러 Client에서 재사용할 수 있습니다.

  1. 01

    과제: Claude/GPT가 DB 조회·API 호출·파일 조작을 하게 하고 싶지만 형식이 제각각입니다.

  2. 02

    시나리오: Cursor에서 Markdown 노트를 읽게 하거나, Claude Desktop에서 GitHub Issue를 조회합니다.

  3. 03

    약속: 빈 디렉터리에서 배포 가능한 Server까지, 완전한 코드와 트러블슈팅 표와 함께 안내합니다.

02

MCP란? 코드 전에 프로토콜 이해하기

2.1 탄생 배경

Anthropic은 2024년 11월 MCP를 공개해 AI와 외부 도구 통신을 표준화하고, N개 모델 × M개 도구 = N×M 맞춤 어댑터 파편화를 해소하려 했습니다. 프로토콜 관점은 사이트 MCP와 HTTP 비유 글도 참고하세요.

2.2 아키텍처 개요

MCP는 Client ↔ Server 모델입니다. Client는 AI 측(Claude Desktop, Cursor), Server는 여러분이 개발하는 역량 제공자로 JSON-RPC로 3대 핵심 역량을 노출합니다:

  • T

    Tools(도구): AI가 호출하는 함수——검색, 계산, DB 쿼리.

  • R

    Resources(리소스): AI가 읽는 데이터——파일, URL, 설정 스트림.

  • P

    Prompts(프롬프트 템플릿): 사전 정의·매개변수화 가능한 프롬프트 조각.

2.3 통신 메커니즘

JSON-RPC 2.0 기반이며, 전송 계층은 stdio(로컬 자식 프로세스, Cursor/Claude Desktop 기본)와 HTTP + SSE / Streamable HTTP(원격 서비스)를 지원합니다. 수명 주기: 초기화 핸드셰이크 → 역량 협상(initialize) → 요청/응답 → 종료.

2.4 다른 방식과 비교

관점MCPOpenAI Function CallingLangChain Tools
표준화개방 프로토콜벤더 전용프레임워크 종속
전송stdio / HTTPHTTPHTTP
크로스 모델가능불가일부
Resources / Prompts네이티브 지원미지원미지원
생태2026년 10,000+ Server성숙성숙
03

개발 환경 준비

3.1 언어 선택

Python(공식 SDK mcp, FastMCP 데코레이터가 간결)은 초보자 추천. TypeScript(@modelcontextprotocol/sdk)는 프론트엔드/풀스택에 적합합니다. 본 글은 Python 위주, TS는 대조용으로 진행합니다.

환경 구축
# Python
python -m venv .venv && source .venv/bin/activate
pip install mcp httpx pydantic

# TypeScript(대조)
npm init -y && npm install @modelcontextprotocol/sdk

3.2 프로젝트 구조

my-mcp-server/
my-mcp-server/
├── server.py            # 메인 진입점
├── tools/               # calculator.py, web_search.py
├── resources/           # file_reader.py
├── prompts/             # templates.py
├── tests/test_tools.py
├── pyproject.toml
└── README.md

3.3 디버깅 도구

  1. 1

    MCP Inspector: npx @modelcontextprotocol/inspector python server.py

  2. 2

    Claude Desktop: claude_desktop_config.json을 편집해 Server를 등록합니다.

  3. 3

    Cursor: Settings → MCP → command + args 추가.

04

첫 MCP Server: Hello World

server.py · 최소 동작 Server
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("my-first-server")

@mcp.tool()
def say_hello(name: str) -> str:
    """지정한 사람에게 인사한다"""
    return f"Hello, {name}! 이것이 첫 MCP 도구입니다."

if __name__ == "__main__":
    mcp.run()

python server.py 실행 후 Inspector 또는 Cursor 설정에 {"command":"python","args":["/path/to/server.py"]}를 입력하고 도구 목록을 새로고침하면 say_hello가 보여야 합니다.

Cursor / Claude Desktop 연결 요점

  • server.py와 가상환경 Python에 절대 경로를 사용합니다.

  • 코드 변경 후 MCP 연결 재시작 또는 Cursor 창 재오픈이 필요합니다.

  • 대화에서 도구 호출을 명시적으로 요청해 AI 컨텍스트에 등록됐는지 확인합니다.

05

Tools: AI가 호출할 수 있는 도구 개발

5.1 기본 구조

함수 시그니처가 곧 문서입니다. 매개변수 타입·반환 타입·docstring은 모델의 도구 선택에 노출됩니다. 이름은 snake_case, 동사로 시작(search_web, read_file)하는 것이 좋습니다. 오류는 예외를 그대로 던지기보다 구조화 JSON을 반환하면 모델이 자기 수정하기 쉽습니다.

5.2 복잡한 매개변수(Pydantic)

Schema가 있는 검색 도구
from pydantic import BaseModel, Field

class SearchInput(BaseModel):
    query: str = Field(description="검색 키워드")
    max_results: int = Field(default=5, description="최대 반환 건수")
    language: str = Field(default="ko", description="결과 언어")

@mcp.tool()
def web_search(input: SearchInput) -> list[dict]:
    """웹 검색을 실행하고 관련 결과 목록을 반환한다"""
    ...

5.3 실용 5종 도구 목록

도구용도주의점
계산기수식 평가ast.literal_eval 또는 안전 파서 사용, eval 금지
파일 읽기/쓰기로컬 파일 조작화이트리스트 디렉터리, 경로 정규화로 디렉터리 트래versal 방지
HTTP 요청외부 API 호출타임아웃, 재시도, 응답 크기 상한
DB 쿼리읽기 전용 SQL매개변수화 쿼리, DDL 금지
시간 도구현재 시각, 타임존 변환ISO 8601 반환으로 모델 파싱 용이

5.4 비동기 도구

async fetch_url
@mcp.tool()
async def fetch_url(url: str) -> str:
    """지정 URL의 내용을 가져온다"""
    async with httpx.AsyncClient(timeout=30.0) as client:
        response = await client.get(url)
        return response.text

5.5 오류 처리 모범 사례

  • !

    네트워크/IO 작업에 타임아웃 설정(15–30초 권장).

  • !

    민감 작업에 권한 검증(API Key, 허용 경로).

  • !

    {"error": "...", "hint": "..."} 반환으로 모델 재시도 유도.

06

Resources: AI가 동적 콘텐츠를 읽게 하기

Resource와 Tool의 차이: Resource는 데이터 제공자(주로 읽기), Tool은 액션 실행자입니다. URI로 주소 지정: file://, http://, custom://.

정적·동적 리소스
@mcp.resource("config://app-settings")
def get_app_settings() -> str:
    """앱 설정을 반환한다"""
    return json.dumps({"version": "1.0", "env": "production"})

@mcp.resource("user://{user_id}/profile")
def get_user_profile(user_id: str) -> str:
    """사용자 ID에 따라 프로필을 반환한다"""
    return json.dumps(db.query_user(user_id))

리소스 유형: 텍스트(text/plain, application/json), 바이너리(이미지, PDF), 스트리밍(실시간 시세). 실전에서는 파일시스템 Server로 디렉터리 나열, 파일 읽기, 변경 구독도 가능합니다.

07

Prompts: 재사용 가능한 프롬프트 템플릿

MCP Prompt는 사전 정의된 프롬프트 조각으로 동적 매개변수 주입을 지원해 팀 프롬프트 일관성과 유지보수성을 높입니다.

코드 리뷰 Prompt 템플릿
from mcp.types import PromptMessage, TextContent

@mcp.prompt()
def code_review_prompt(language: str, code: str) -> list[PromptMessage]:
    """코드 리뷰 프롬프트 템플릿"""
    return [PromptMessage(
        role="user",
        content=TextContent(type="text", text=f"""다음 {language} 코드를 리뷰해 주세요:
1. 품질과 가독성  2. Bug와 보안  3. 성능 최적화

```{language}
{code}
```""")
    )]

user + assistant 다중 턴 템플릿도 정의할 수 있어 면접 시뮬레이션, 디버깅 어시스턴트 등에 쓰입니다. Client는 prompts/get으로 채워진 메시지 체인을 가져옵니다.

08

심화: HTTP 전송 모드(원격 MCP Server)

특성stdioHTTP + SSE
배포로컬 프로세스원격 서버
지연매우 낮음네트워크 의존
다중 클라이언트미지원지원
시나리오IDE 로컬 도구SaaS / 팀 공유
Streamable HTTP 모드
mcp = FastMCP("remote-server", transport="streamable-http")

if __name__ == "__main__":
    mcp.run(host="0.0.0.0", port=8000)

프로덕션에는 Bearer Token / API Key 미들웨어, CORS 화이트리스트, 요청 빈도 제한을 추가하세요. 미인증 HTTP MCP를 공网에 직접 노출하지 마세요.

09

디버깅과 테스트

9.1 MCP Inspector

Inspector 실행으로 tools/list, tools/call을 그래픽으로 테스트하고 JSON-RPC 로그 확인, 오류 시나리오 시뮬레이션이 가능합니다.

9.2 단위 테스트(pytest + ClientSession)

test_calculator_tool
@pytest.mark.asyncio
async def test_calculator_tool():
    server_params = StdioServerParameters(command="python", args=["server.py"])
    async with stdio_client(server_params) as (read, write):
        async with ClientSession(read, write) as session:
            await session.initialize()
            result = await session.call_tool("calculate", {"expression": "2 + 2"})
            assert result.content[0].text == "4"

9.3 흔한 오류와 해결

오류원인해결
도구가 안 보임설정 경로 오류config.json 절대 경로 확인
JSON 직렬화 실패미지원 반환 타입str 또는 dict로 변환
타임아웃 끊김도구 실행 느림비동기 + 타임아웃 제어
권한 거부파일 경로 제한허용 디렉터리 설정 / VNC로 TCC 허용
10

프로덕션 배포

10.1 Docker 컨테이너화

Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "server.py"]

10.2 클라우드 서비스 선택

  • Railway / Render: 개인 프로젝트 원클릭 배포.

  • AWS Lambda / Cloud Run: Serverless. 콜드 스타트와 stdio 제한 주의.

  • 자체 VPS + Nginx: 리버스 프록시 + TLS + 속도 제한.

10.3 관측 가능성

구조화 요청 로그, Prometheus 도구 호출 지표, Sentry 오류 알림, /health 헬스 체크. MCP 프로토콜 버전을 선언하고 도구 업그레이드는 하위 호환을 유지합니다.

11

실전: 개인 지식베이스 MCP Server

요구사항: AI가 로컬 Markdown 노트 검색, 의미 검색, 생성/업데이트. Cursor에서 「지난주 MCP에 대해 뭐라고 메모했지?」라고 물을 수 있게 합니다.

기술 선택

컴포넌트추천
벡터 DBChromaDB / Qdrant(로컬)
임베딩 모델text-embedding-3-small
파일 감시watchfiles 증분 인덱스

핵심 Tools

  1. 1

    index_notes: 디렉터리를 스캔해 벡터 인덱스를 구축합니다.

  2. 2

    semantic_search: 의미 기반으로 관련 조각을 반환합니다.

  3. 3

    write_note: Markdown을 생성하거나추가합니다.

  4. 4

    Resource: notes://{path}로 단일 노트 직접 읽기.

효과: AI가 semantic_search로 조각을가져온한 뒤 답을 종합하므로, 노트 전체를 컨텍스트에 넣는 것보다 Token을 절약하고 정확도가 올라갑니다.

12

MCP 생태와 2026 전망

추천 오픈소스 Server

  • mcp-server-filesystem — 파일시스템 조작

  • mcp-server-github — GitHub 저장소

  • mcp-server-brave-search — 웹 검색

  • mcp-server-postgres — DB 쿼리

  • mcp-server-slack — Slack 메시지

2026년 Cursor, Claude Desktop, OpenAI, Google Gemini, Microsoft가 MCP 연동을 완료하거나 추진 중입니다. MCP Marketplace와 엔터프라이즈 보안 표준(OAuth 2.1, 감사)도 정비 중입니다. 공식 문서: modelcontextprotocol.io; Python SDK: github.com/modelcontextprotocol/python-sdk.

구현 5단계(원격 Mac 검수 포함)

  1. 1

    Host(Cursor / Claude Desktop)를 정하고 2026 버전이 MCP를 네이티브 지원하는지 확인합니다.

  2. 2

    로컬 stdio로 Server를 개발하고 Inspector로 tools/list를 검증합니다.

  3. 3

    Cursor MCP 설정에 등록하고 Hello World 도구로 스모크 테스트합니다.

  4. 4

    브라우저·키체인·화면 녹화 Server는 macOS 그래픽 세션에서 TCC 허용을 완료합니다(SSH만으로는 클릭 불가).

  5. 5

    HTTP 모드를 Docker 배포하고 인증·모니터링 추가 후 상용 투입; Agent Skill, 브라우저 MCP 글과 상호 링크.

13

FAQ

Python(mcp + FastMCP)이 가장 빠르게 시작하기 좋습니다. TypeScript(@modelcontextprotocol/sdk)는 Node 스택 팀에 적합합니다. 프로토콜 계층은 동등합니다.

IDE 로컬 개발은 stdio 우선. 다중 사용자 공유·SaaS 제공은 HTTP + SSE / Streamable HTTP를 선택하고 반드시 인증을 추가하세요.

Tools는 액션을 실행합니다(DB 쓰기, 요청 전송). Resources는 읽기 전용 데이터(설정, 파일 내용)를 URI 템플릿으로 제공합니다.

브라우저 DevTools MCP, 고권한 파일 작업, 키체인·화면 녹화는 macOS TCC 팝업을 띄웁니다. SSH만으로는 「항상 허용」을 클릭할 수 없어 VNC 그래픽 세션에서 Host와 동일 기기 검수가 필요합니다.

맺음말

MCP는 AI 도구화의 표준 프로토콜입니다. Hello World에서 프로덕션 배포까지 전 과정을 익히는 것은 2026년 AI 엔지니어의 핵심 역량 중 하나입니다. MCP로 어떤 도구를 만들 계획인가요? 실습 후 Server 설계를 돌아보면 좋습니다.

숨은 비용은 코드 작성보다 실행 환경에 있습니다. Windows 주력 + 클라우드 Mac에서 Cursor MCP를 혼합 운영하면 권한 팝업, Python 가상환경, Inspector 로그를 동일 머신의 데스크톱 세션에서 대조해야 합니다. Mac mini를 직접 구매하면 슬립, OS 업데이트, 감가상각을 떠안고, 8GB 메모리는 벡터 인덱스 + 다중 Server 동시 실행에 쉽게 포화됩니다.

시간 과금으로 MCP 도구체인을 검증하고 Cursor와 동일 기기 그래픽 UI에서 TCC·Inspector 검수를 마치려면 VNCMac 원격 Mac 임대를 이용하세요. 아래 주 버튼에서 요금 플랜으로, 플랜 비교는 을 참고하세요.