Skip to main content
Glama
znehraks

MCP Notepad Server

by znehraks

MCP 메모장 서버 - 학습용 예제

MCP(Model Context Protocol)의 핵심 기능을 학습하기 위한 간단한 메모장 서버입니다.

📚 학습 목표

이 예제를 통해 다음을 배울 수 있습니다:

기능

설명

파일

Tools

AI가 실행할 수 있는 액션 정의

src/tools/noteTools.ts

Resources

AI가 읽을 수 있는 데이터 제공

src/resources/noteResources.ts

Prompts

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

src/prompts/notePrompts.ts

Related MCP server: mcp-starter

🚀 빠른 시작

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

📖 다음 단계

  1. 파일 영속화: noteStore.ts를 수정하여 JSON 파일로 저장

  2. 추가 리소스: 태그별, 날짜별 필터링 추가

  3. SSE 전송: HTTP 기반 전송으로 변경해보기

📚 참고 자료

Available Tools

4 tools
create_note메모 생성C

새로운 메모를 생성합니다. 제목과 내용을 입력받고, 선택적으로 태그를 추가할 수 있습니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes메모 제목
contentYes메모 내용
tagsNo메모에 붙일 태그 목록 (선택)

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteYes
messageYes
successYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It states it creates a new note, implying a write operation, but doesn't disclose behavioral traits like permissions needed, whether creation is idempotent, rate limits, or what happens on success/failure. For a mutation tool with zero annotation coverage, this is a significant gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded with the main purpose in the first sentence. It efficiently covers the core functionality without unnecessary details, though it could be slightly more structured to separate purpose from parameter hints.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has an output schema (which handles return values), 100% schema coverage, and no annotations, the description is minimally adequate. However, as a mutation tool, it lacks context on behavioral aspects like error handling or side effects, making it incomplete for safe agent use without additional assumptions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters (title, content, tags). The description adds minimal value by mentioning optional tags, but doesn't provide additional semantics beyond what's in the schema, such as format examples or constraints. Baseline 3 is appropriate when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: '새로운 메모를 생성합니다' (creates a new note) with specific resources (title, content, optional tags). It distinguishes from siblings like delete_note, search_notes, and update_note by focusing on creation, but doesn't explicitly differentiate beyond the basic verb.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives like update_note or search_notes. The description mentions optional tags but doesn't provide context about prerequisites, constraints, or typical use cases, leaving the agent to infer usage from the tool name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_note메모 삭제C

메모를 삭제합니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes삭제할 메모의 ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYes
successYes

TDQS

C2.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It states the tool deletes a note, implying a destructive mutation, but doesn't disclose behavioral traits like whether deletion is permanent, requires specific permissions, has side effects (e.g., cascading deletions), or provides confirmation. For a destructive tool with zero annotation coverage, this is a significant gap in transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence in Korean with zero wasted words. It's appropriately sized for a simple tool and front-loaded with the core action. Every part of the sentence directly contributes to stating the tool's purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's destructive nature, lack of annotations, and presence of an output schema (which might cover return values), the description is incomplete. It doesn't address key contextual aspects like safety warnings, usage conditions, or behavioral details. For a delete operation with no annotation support, more information is needed to adequately guide an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage, with the 'id' parameter clearly documented as '삭제할 메모의 ID' (ID of the note to delete). The description adds no additional meaning beyond what the schema provides, such as format examples or constraints. With high schema coverage, the baseline score of 3 is appropriate as the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description '메모를 삭제합니다' (Deletes a note) is a tautology that restates the tool name 'delete_note' in Korean. It specifies the verb (delete) and resource (note) but doesn't differentiate from sibling tools like 'update_note' or 'create_note' beyond the obvious action. The purpose is clear but lacks any distinguishing detail beyond the name itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing an existing note ID), exclusions, or comparisons to siblings like 'update_note' for modifications. The description offers no context for usage decisions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_notes메모 검색B

키워드로 메모를 검색합니다. 제목, 내용, 태그에서 검색합니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
keywordYes검색 키워드

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
keywordYes
resultsYes
successYes

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions the search scope (title, content, tags) but doesn't describe other behavioral traits like pagination, sorting, case sensitivity, error handling, or rate limits. For a search tool with zero annotation coverage, this leaves significant gaps in understanding how the tool behaves beyond basic functionality.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is highly concise and front-loaded, consisting of two sentences that directly state the tool's purpose and search scope. Every sentence earns its place by adding value—the first defines the action, and the second clarifies the fields searched. There is no wasted verbiage or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity (single parameter, no nested objects), 100% schema coverage, and the presence of an output schema (which means return values needn't be explained in the description), the description is reasonably complete. It covers the basic purpose and search scope. However, it lacks details on behavioral aspects like pagination or error handling, which could be relevant for a search tool, preventing a score of 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds minimal semantic context beyond the input schema. It states that the keyword is used to search across title, content, and tags, which slightly elaborates on the schema's '검색 키워드' (search keyword) description. However, with 100% schema description coverage, the schema already documents the parameter adequately. The description doesn't provide additional syntax, format, or constraints, so it meets the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: '키워드로 메모를 검색합니다' (search notes by keyword), which is a specific verb+resource combination. It distinguishes from siblings like create_note, delete_note, and update_note by focusing on search rather than mutation operations. However, it doesn't explicitly differentiate from potential alternative search tools (none listed), so it's not a perfect 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context by stating '제목, 내용, 태그에서 검색합니다' (search in title, content, tags), which suggests when to use this tool—for keyword-based searches across multiple fields. However, it doesn't provide explicit guidance on when to use this vs. alternatives (no alternatives listed) or any exclusions. The usage is implied rather than explicitly stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_note메모 수정C

기존 메모를 수정합니다. 제목, 내용, 태그를 변경할 수 있습니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes수정할 메모의 ID
titleNo새로운 제목 (선택)
contentNo새로운 내용 (선택)
tagsNo새로운 태그 목록 (선택)

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
errorNo
messageNo
successYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure. It states this is a modification tool but doesn't cover important aspects: whether it requires specific permissions, if changes are reversible, what happens to unspecified fields (partial vs. full updates), error handling, or response format. '수정합니다' implies mutation, but lacks safety or operational context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that gets straight to the point. It's appropriately sized for a simple update tool, though it could be slightly more structured (e.g., separating purpose from capabilities). No wasted words or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given this is a mutation tool with no annotations but with a complete input schema (100% coverage) and an output schema (per context signals), the description is minimally adequate. It covers the basic purpose and modifiable fields, but lacks crucial behavioral context for a write operation. The output schema reduces the need to describe return values, but permission requirements, error cases, and update semantics remain undocumented.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all 4 parameters (id, title, content, tags) with descriptions and optionality. The description adds minimal value by listing the modifiable fields ('제목, 내용, 태그' - title, content, tags), but doesn't provide additional syntax, constraints, or examples beyond what's in the schema. Baseline 3 is appropriate when schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('수정합니다' - modifies/updates) and resource ('기존 메모' - existing note), making the purpose immediately understandable. It distinguishes from 'create_note' by specifying it works on existing notes, though it doesn't explicitly differentiate from 'delete_note' or 'search_notes' beyond the action verb.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like 'create_note', 'delete_note', or 'search_notes'. It doesn't mention prerequisites (e.g., needing a note ID), error conditions, or typical use cases. The agent must infer usage from the tool name and sibling names alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

B3.4/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose: create_note for creation, delete_note for deletion, search_notes for searching, and update_note for modification. There is no overlap in functionality, making it easy for an agent to select the correct tool without confusion.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern (e.g., create_note, delete_note, search_notes, update_note). The naming is uniform and predictable, with no deviations in style or convention.

Tool Count5/5

With 4 tools, this server is well-scoped for a notepad application, covering essential CRUD operations (create, read via search, update, delete). Each tool earns its place without being excessive or insufficient for the domain.

Completeness5/5

The tool set provides complete CRUD coverage for the notepad domain: create_note for creation, search_notes for reading/retrieval, update_note for updates, and delete_note for deletion. There are no obvious gaps, ensuring agents can handle full note lifecycle management.

Maintenance

ActivityInactive
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    B
    quality
    D
    maintenance
    A TypeScript-based MCP server that enables AI assistants to create, search, list, and delete notes with tags. Serves as a starter template for building custom MCP servers with tools and resources.
    1
  • F
    license
    A
    quality
    D
    maintenance
    A minimal MCP server demonstrating tools, resources, and prompts for managing notes, with a simple notes app that supports adding, listing, deleting notes and summarizing them.
    3
    1
  • A
    license
    Not graded
    quality
    C
    maintenance
    A working MCP server template for notes management (add, get, search, delete) with in-memory store, demonstrating tools, resources, and prompts for easy forking and customization.
    MIT

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/znehraks/mcp-poc'

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