Skip to main content
Glama

mcp-server-sample — Minimaler MCP-Server zum Speichern und Durchsuchen von Notizen

Ein minimaler MCP-Server, der nur Notizen speichert und durchsucht. Er verbindet sich mit keinem externen System. Der Speicherort ist nur eine Datei notes.json im selben Ordner.

Er enthält jeweils ein Beispiel für die drei MCP-Primitive.

Primitive

Wer entscheidet

Inhalt auf diesem Server

Tools

Das Modell entscheidet

add_note (Notiz hinzufügen) / search_notes (Notizen durchsuchen)

Resources

Die KI-App ruft sie ab und übergibt sie

notes://all (Alle gespeicherten Notizen)

Prompts

Der Benutzer wählt explizit aus

weekly_review (Rückblick auf die Woche)

Voraussetzungen

  • Node.js 24 oder höher (LTS. Überprüfen mit node --version)

  • git

Related MCP server: mcp-snippetbox

Einrichtung

git clone https://github.com/utakatano/mcp-server-sample.git
cd mcp-server-sample
npm install

Wenn npm install erfolgreich war, ist die Einrichtung abgeschlossen. Zu diesem Zeitpunkt wird der Server nicht gestartet. Der MCP-Server wird von der KI-App gestartet, daher muss er nicht manuell über das Terminal ausgeführt werden.

Mit der KI-App verbinden

Claude Code

claude mcp add notes -- node /絶対パス/mcp-server-sample/index.js

Wenn claude mcp list ✔ Connected anzeigt, ist die Verbindung hergestellt.

Claude Desktop

Einstellungen → Developer → „Edit Config“ öffnet claude_desktop_config.json. Fügen Sie Folgendes hinzu:

{
  "mcpServers": {
    "notes": {
      "command": "node",
      "args": ["/絶対パス/mcp-server-sample/index.js"]
    }
  }
}

Nach dem Speichern Claude Desktop vollständig beenden und neu starten (nur das Schließen des Fensters reicht nicht).

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

Funktionstest

「来週までにネットワーク構成を確認する」とメモして
「ネットワーク」を含むメモを探して

Es wird eine notes.json erstellt, deren Inhalt nach und nach wächst.

Speicherort ändern

Durch die Umgebungsvariable NOTES_FILE mit einem absoluten Pfad kann der Speicherort geändert werden.

{
  "mcpServers": {
    "notes": {
      "command": "node",
      "args": ["/絶対パス/mcp-server-sample/index.js"],
      "env": { "NOTES_FILE": "/絶対パス/my-notes.json" }
    }
  }
}

Wenn keine Verbindung zustande kommt

Zuerst das Log prüfen. Die Ursache steht meistens dort.

tail -20 ~/Library/Logs/Claude/mcp-server-notes.log   # macOS
# Windows: %APPDATA%\Claude\logs\mcp-server-notes.log

Achten Sie darauf, ob nach Server started and connected successfully ein Fehler auftritt.

Im Log angezeigt

Ursache

Lösung

Cannot find module '/.../index.js'

Der Pfad in args ist falsch

Führen Sie pwd im Repository-Stammverzeichnis aus und fügen Sie die Ausgabe + /index.js erneut ein

spawn node ENOENT

Die KI-App findet node nicht. Tritt auf, wenn der PATH nur in der Shell-Konfiguration (z.B. nvm/volta) gesetzt ist

Geben Sie die Ausgabe von which node (absoluter Pfad) direkt in command ein

Cannot find package '@modelcontextprotocol/server'

Abhängigkeiten nicht installiert

Führen Sie im Repository-Stammverzeichnis npm ci aus

Log ist leer oder wird nicht aktualisiert

Die Konfiguration wird nicht geladen

Überprüfen Sie die JSON-Syntax (Kommas, Klammern) und beenden Sie Claude Desktop vollständig (macOS: ⌘Q) und starten Sie es neu

Zur Unterscheidung, ob der Fehler serverseitig oder seitens der KI-App liegt, ist es am schnellsten, den Server lokal direkt aufzurufen.

printf '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28"}}}\n' \
  | node /絶対パス/mcp-server-sample/index.js

Wenn ein JSON mit add_note und search_notes zurückgegeben wird, funktioniert der Server korrekt. In diesem Fall prüfen Sie die Einstellungen der KI-App (Pfad, JSON-Format, Neustart).

Maßnahmen gegen Lieferkettenangriffe

In der .npmrc sind Einstellungen enthalten, die eine Übernahme von npm-Paketen verhindern sollen. Sie wirken bei jedem npm install / npm ci.

Einstellung

Wirkung

ignore-scripts=true

Führt bei der Installation keine Lebenszyklus-Skripte von Abhängigkeiten (z.B. postinstall) aus. Versperrt den häufigsten Ausführungspfad, den übernommene Pakete zuerst nutzen. npm start / npm run funktionieren wie gewohnt (nur Pre-/Post-Skripte werden nicht ausgeführt)

save-exact=true

npm install <pkg> schreibt in package.json ohne ^, also vollständig fixiert

min-release-age=7

Installiert nur Versionen, die älter als 7 Tage sind. npm wandelt dies in before=<Datum vor 7 Tagen> um, um die Abhängigkeiten aufzulösen

Die Abhängigkeiten sind in package.json vollständig fixiert (@modelcontextprotocol/server ist 2.0.0, zod ist 4.4.3), und in package-lock.json mit integrity-Hash protokolliert. Wenn Sie die Abhängigkeiten genau wie im Lockfile installieren möchten, verwenden Sie npm ci anstelle von npm install.

Wenn Sie Abhängigkeiten aktualisieren möchten, heben Sie sie bewusst einzeln an.

npm outdated
npm install @modelcontextprotocol/server@2.1.0   # save-exact により完全固定で書かれる
npm ls --all                                      # 増えた依存を目で確認する

Lizenz

MIT

Available Tools

2 tools
add_noteメモを追加するA

メモを1件保存する。打ち合わせの決定事項や、あとで思い出したいことを記録するときに使う。

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo分類用のタグ(任意)
textYes保存する本文

TDQS

A4/5.0
Behavior3/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 '保存する' which implies mutation, but it does not disclose potential side effects, permissions, or behavior on duplicates. For a simple create operation, this is minimally adequate.

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?

Two sentences, front-loaded with the essential action. No wasted words.

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?

For a simple tool with 2 parameters, no output schema, and no annotations, the description is fairly complete. It explains the primary use case and differentiates from the sibling. It could mention the return value but is not required.

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% with both parameters described. The tool's description adds no new information about the parameters; it only restates the purpose. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the verb '保存する' (save) and resource 'メモ' (note), and it is distinct from the sibling tool 'search_notes' which is for retrieval.

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

Usage Guidelines4/5

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

It provides explicit context for when to use: '打ち合わせの決定事項や、あとで思い出したいことを記録するときに使う' (use when recording meeting decisions or things you want to remember later). It does not explicitly exclude other scenarios, but the purpose is clear.

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検索キーワード

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description must fully disclose behavioral traits. It states search targets both body text and tags, but lacks details on whether searches are case-sensitive, support partial matches, or have rate limits. It does not mention return format or pagination. The description adds modest value but is insufficient for a tool lacking annotations.

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 sentence with no wasted words. It is concise and front-loaded with the action and target, then expands on scope. Every phrase adds value.

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 is simple (1 parameter, no output schema, no nested objects), the description is minimally adequate. It covers the search target and scope. However, it omits any mention of results behavior (e.g., whether it returns full notes or summaries) and does not compensate for missing annotations, but the low complexity reduces the burden.

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

Parameters4/5

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

Schema coverage is 100% with one parameter 'keyword'. The description adds meaningful context by specifying that keyword searches both body and tags, which the schema description ('検索キーワード') does not convey. This enriches the semantic understanding beyond the schema alone.

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?

Description clearly specifies the action (検索する), the target (保存済みのメモ), and the search scope (本文とタグの両方). It distinguishes from add_note, which creates notes. However, it does not explicitly contrast the two, leaving a slight gap in sibling differentiation.

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 implies usage for keyword search but gives no guidance on when to use this vs. add_note, nor does it mention any context or prerequisites for searching. No exclusion criteria or alternative scenarios are provided.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updatesv1.0.0
    • First observedadd_note
    • First observedsearch_notes

TDQS

A3.5/5.0

Scored across 2 tools

Disambiguation5/5

The two tools have completely distinct purposes: one creates/ stores a note, the other retrieves notes via search. There is no overlap or ambiguity between writing and searching.

Naming Consistency5/5

Both tool names follow a consistent verb_noun pattern (add_note, search_notes) using lowercase with underscores. The naming is predictable and clear.

Tool Count3/5

With only 2 tools, the set feels minimal. While the tools cover basic create and read/search operations, the server's purpose (saving and retrieving notes) could reasonably include more tools (e.g., update, delete, list tags) to avoid being overly thin.

Completeness2/5

The domain is a personal note-taking system, but only add and search operations are provided. Missing critical operations like update, delete, and get all notes (without search) create significant gaps that would frustrate or block a typical agent workflow.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers