Skip to main content
Glama
MCP_TOOL_PATTERNS.md4.08 kB
# MCP 도구 구현 패턴 비교 이 문서는 MCP 서버에서 도구(Tools)를 구현하는 두 가지 방식을 비교합니다. ## 1. 명시적 Tool 클래스 방식 ### 특징 - FastMCP의 `Tool` 클래스를 직접 사용 - 모든 설정이 명시적으로 보임 - input_schema를 세밀하게 제어 가능 ### 코드 예시 ```python from fastmcp import FastMCP from fastmcp.tools import Tool server = FastMCP("mcp-github", "0.1.0") server.add_tool(Tool( name="getRepo", description="Get repository information from GitHub", input_schema={ "type": "object", "properties": { "owner": {"type": "string", "description": "Repository owner"}, "repo": {"type": "string", "description": "Repository name"} }, "required": ["owner", "repo"] }, handler=get_repo )) ``` ### 장점 - ✅ **명확성**: 모든 설정이 한 곳에 명시됨 - ✅ **유연성**: 스키마를 세밀하게 커스터마이징 가능 - ✅ **타입 안전성**: Pydantic 스키마와 연동 - ✅ **디버깅**: 문제 발생 시 원인 파악이 쉬움 ### 단점 - ❌ **보일러플레이트**: 코드가 길어짐 - ❌ **중복**: 여러 도구 등록 시 반복적인 코드 - ❌ **가독성**: 함수 정의와 등록이 분리됨 ## 2. 데코레이터 방식 ### 특징 - `@tool` 데코레이터를 사용 - 함수 정의와 도구 등록이 한 곳에 - 자동으로 스키마 추론 ### 코드 예시 ```python from fastmcp import FastMCP from fastmcp.tools import tool server = FastMCP("mcp-github", "0.1.0") @tool("getRepo") async def get_repo(owner: str, repo: str) -> Dict[str, Any]: """Get repository information from GitHub. Args: owner: Repository owner (username or organization) repo: Repository name """ # ... 함수 내용 # 자동으로 등록됨 ``` ### 장점 - ✅ **간결함**: 함수 위에 간단한 데코레이터만 - ✅ **가독성**: 함수 정의와 도구 등록이 한 곳에 - ✅ **DRY 원칙**: 중복 코드 최소화 - ✅ **Pythonic**: Python의 일반적인 패턴 ### 단점 - ❌ **제한적**: 스키마 커스터마이징이 어려움 - ❌ **의존성**: 특정 프레임워크 필요 - ❌ **디버깅**: 문제 발생 시 원인 파악이 어려울 수 있음 ## 3. 권장 사용법 ### 명시적 방식 사용 시기 - 복잡한 input_schema가 필요한 경우 - 커스텀 검증 로직이 필요한 경우 - 타입 안전성이 중요한 경우 - 팀 프로젝트에서 명확성을 우선하는 경우 ### 데코레이터 방식 사용 시기 - 간단한 도구 구현 - 빠른 프로토타이핑 - 코드 가독성을 우선하는 경우 - 표준적인 MCP 도구 구현 ## 4. 현재 프로젝트 상태 **mcp-github-fastmcp**는 현재 **데코레이터 방식**을 사용합니다: ```python @tool("getRepo") async def get_repo(owner: str, repo: str) -> Dict[str, Any]: """Get repository information from GitHub.""" # ... @tool("listPullRequests") async def list_pull_requests(owner: str, repo: str, state: str = "open") -> Dict[str, Any]: """List pull requests for a repository.""" # ... ``` ### 장점 - 코드가 간결하고 읽기 쉬움 - 함수 정의와 도구 등록이 통합됨 - 유지보수가 용이함 ### 제한사항 - 기본 스키마만 사용 (필요시 확장 가능) - FastMCP 프레임워크에 의존적 ## 5. 마이그레이션 가이드 ### 명시적 방식에서 데코레이터 방식으로 1. `@tool` 데코레이터 추가 2. `server.add_tool()` 호출 제거 3. 함수 docstring에 타입 힌트 추가 ### 데코레이터 방식에서 명시적 방식으로 1. `@tool` 데코레이터 제거 2. `Tool` 클래스로 명시적 등록 3. input_schema 정의 ## 6. 결론 두 방식 모두 장단점이 있으며, 프로젝트의 요구사항에 따라 선택하면 됩니다. **현재 프로젝트**에서는 **데코레이터 방식**을 선택하여: - 코드 가독성 향상 - 유지보수성 개선 - 개발 속도 향상 을 달성했습니다.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/J-nowcow/github-MCP-practice'

If you have feedback or need assistance with the MCP directory API, please join our Discord server