MCP 메모장 서버 - 학습용 예제
MCP(Model Context Protocol)의 핵심 기능을 학습하기 위한 간단한 메모장 서버입니다.
📚 학습 목표
이 예제를 통해 다음을 배울 수 있습니다:
| 기능 | 설명 | 파일 |
|---|---|---|
| Tools | AI가 실행할 수 있는 액션 정의 | src/tools/noteTools.ts |
| Resources | AI가 읽을 수 있는 데이터 제공 | src/resources/noteResources.ts |
| Prompts | 재사용 가능한 프롬프트 템플릿 | src/prompts/notePrompts.ts |
🚀 빠른 시작
1. 의존성 설치
cd mcp-notes-server
npm install
2. 빌드
npm run build
3. Claude Desktop에 등록
~/Library/Application Support/Claude/claude_desktop_config.json 파일에 추가:
{
"mcpServers": {
"mcp-notes": {
"command": "node",
"args": ["/절대경로/mcp-notes-server/dist/index.js"]
}
}
}
4. Claude Desktop 재시작
📦 제공 기능
Tools (도구)
| 도구명 | 설명 | 입력 |
|---|---|---|
create_note | 새 메모 생성 | title, content, tags? |
update_note | 메모 수정 | id, title?, content?, tags? |
delete_note | 메모 삭제 | id |
search_notes | 메모 검색 | keyword |
Resources (리소스)
| URI | 설명 |
|---|---|
notes://list | 전체 메모 목록 |
notes://note/{id} | 특정 메모 조회 |
Prompts (프롬프트)
| 이름 | 설명 | 인자 |
|---|---|---|
summarize_note | 메모 요약 | noteId, style? |
extract_tags | 태그 추출 | noteId, maxTags? |
organize_notes | 정리 제안 | - |
🗂 프로젝트 구조
mcp-notes-server/
├── src/
│ ├── index.ts # 진입점, 서버 설정
│ ├── store/
│ │ └── noteStore.ts # 인메모리 메모 저장소
│ ├── tools/
│ │ └── noteTools.ts # Tool 정의 및 핸들러
│ ├── resources/
│ │ └── noteResources.ts # Resource 정의 및 핸들러
│ └── prompts/
│ └── notePrompts.ts # Prompt 정의 및 핸들러
├── package.json
└── tsconfig.json
💡 핵심 개념 정리
1. Tool
// 정의
{
name: "create_note",
description: "새 메모 생성",
inputSchema: {
type: "object",
properties: {
title: { type: "string" },
content: { type: "string" }
},
required: ["title", "content"]
}
}
// 핸들러
server.setRequestHandler(CallToolRequestSchema, async (request) => {
// 도구 실행 로직
});
2. Resource
// 정의
{
uri: "notes://list",
name: "메모 목록",
mimeType: "application/json"
}
// 핸들러
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
// 리소스 읽기 로직
});
3. Prompt
// 정의
{
name: "summarize_note",
description: "메모 요약",
arguments: [
{ name: "noteId", required: true }
]
}
// 핸들러
server.setRequestHandler(GetPromptRequestSchema, async (request) => {
return {
messages: [
{ role: "user", content: { type: "text", text: "..." } }
]
};
});
🔧 개발 팁
디버깅
stderr로 로그 출력 (stdout은 MCP 통신에 사용):
console.error("[Debug] 메시지");
감시 모드 개발
npm run dev # tsc --watch
📖 다음 단계
- 파일 영속화:
noteStore.ts를 수정하여 JSON 파일로 저장 - 추가 리소스: 태그별, 날짜별 필터링 추가
- SSE 전송: HTTP 기반 전송으로 변경해보기
