An MCP server for semantic search, reading, and writing notes in an Obsidian vault with vector-based indexing and dialogue logging capabilities.
Server has 6 tools with basic descriptions in Japanese, but significant quality gaps. All tools have descriptions (positive), but most are vague and lack actionable guidance. Input schemas are present but minimal, parameters lack type constraints, enums, and validation rules. No output schemas documented. Error messages are generic strings without recovery guidance. Tool names are reasonable (verb_noun pattern) but descriptions don't explain WHEN to use each tool or dependencies between them. write_dialogue and save_insight are near-duplicates, violating single-responsibility. No parameter descriptions beyond brief labels. Security concern: VAULT_ROOT path is hardcoded with placeholder, and no validation of relative_path prevents directory traversal attacks.
最近更新されたメモの一覧を取得します。
指定されたパスのメモの内容を読み込みます。 内容に加えて、そこからリンクされている他のメモの一覧も表示されます。
【推奨: write_dialogue】チャットでの洞察を保存します。
ObsidianのVault内をセマンティック検索(意味ベースの検索)します。 キーワードが一致しなくても、文脈が近いメモを見つけることができます。
チャットでの重要な洞察や議論を会話形式のメモとして保存します。 ファイル名は 'YYYY-MM-DD-[provider]-[title].md' 形式で自動生成されます。
Vault内の指定されたパスに、プレーンなMarkdownファイルを保存します。 会話ログ形式(User/AI)ではなく、純粋なドキュメントの保存に使用します。
Duplicate tools: save_insight is a thin wrapper around write_dialogue with identical parameters. Violates single-responsibility principle and forces LLM to choose between two equivalent tools.
No output schemas documented. Tools return unstructured strings (e.g., 'セマンティック検索結果:...'). LLMs cannot parse results reliably or chain downstream calls. Violates response-shaper pattern.
Path traversal vulnerability: read_memo and write_memo accept relative_path without validation. Attacker can pass '../../etc/passwd' or similar. No sanitization of path components.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 41 | 2026-07-28+ | v2 |
Parameter descriptions are minimal labels, not actionable guidance. E.g., 'query' has no format constraints, length limits, or examples of what works. 'folder' has no enum of valid folder names. Violates constrained-input pattern.
Error handling returns generic strings without recovery guidance. E.g., 'エラー: インデックスが見つかりません' tells LLM nothing about what to do next. No error classification (retryable vs fatal).