Skip to main content
Glama
t-rhex

mcp-obsidian-vault

by t-rhex

mcp-obsidian-vault

Turn your Obsidian vault into an AI command center.

npm version CI Node License: MIT

An MCP server that gives AI agents direct filesystem access to your Obsidian vault — no Obsidian running required. Manage notes, orchestrate multi-agent task workflows, persist context across sessions, and sync everything with git.

Quick Start • Tools • Task Orchestration • Configuration


Why This Exists

Every time you start a new AI chat session, your agent forgets everything. Decisions made, bugs discovered, tasks in progress — all gone.

mcp-obsidian-vault solves this by making your Obsidian vault the single source of truth for AI development work:

  • Notes are your knowledge base — searchable, linked, tagged

  • Tasks are your work queue — agents claim, track, and complete them

  • Projects orchestrate multi-agent parallel work with dependency graphs

  • Decisions & Discoveries persist the why so future sessions don't repeat mistakes

  • Context briefings give any new session a full situation report in one call

npx mcp-obsidian-vault

Related MCP server: Obsidian MCP Server

How It Works

graph TB
    subgraph Clients["AI Clients"]
        CC[Claude Code]
        OC[opencode]
        CX[Codex CLI]
    end

    subgraph MCP["mcp-obsidian-vault"]
        direction TB
        NT["Note Tools<br/><small>read, create, update, delete<br/>search, tags, wikilinks, daily</small>"]
        TT["Task Tools<br/><small>create, claim, update, complete<br/>projects, dashboard</small>"]
        CT["Context Tools<br/><small>get_context, log_decision<br/>log_discovery</small>"]
        GS["Git Sync<br/><small>commit, pull, push<br/>auto-sync on write</small>"]
    end

    subgraph Vault["Obsidian Vault (filesystem)"]
        direction TB
        Notes["Notes/"]
        Tasks["Tasks/<br/><small>DASHBOARD.md</small>"]
        Dec["Decisions/"]
        Disc["Discoveries/"]
    end

    subgraph Remote["Remote"]
        GH["GitHub / GitLab"]
        Phone["Phone<br/><small>Obsidian Git plugin</small>"]
    end

    CC & OC & CX -->|MCP Protocol| MCP
    NT --> Notes
    TT --> Tasks
    CT --> Dec & Disc
    GS -->|auto-push| GH
    GH -->|pull| Phone

    style MCP fill:#1a1a2e,stroke:#e94560,color:#fff
    style Vault fill:#16213e,stroke:#0f3460,color:#fff
    style Clients fill:#0f3460,stroke:#533483,color:#fff
    style Remote fill:#1a1a2e,stroke:#533483,color:#fff

Features

Vault Management

Feature

Description

CRUD Notes

Read, create, update, delete with full YAML frontmatter support

Wikilinks

Resolve [[links]], find backlinks, outlinks, and broken links

Full-Text Search

Regex-capable search with folder filtering and timeout protection

Tag Management

Add, remove, list tags with automatic deduplication

Daily Notes

Get, create, append by date — today, yesterday, 2025-03-08

Vault Browsing

Recursive directory listing with depth control

Task Orchestration

Feature

Description

Agent Task Queue

Structured tasks with priority, type, scope, and deadlines

Atomic Claims

Race-condition-safe task claiming for multi-agent setups

Dependency Graphs

Tasks block/unblock automatically based on depends_on

Project Management

Create projects with sub-tasks, track rollup progress

Append Mode

Add new sub-tasks to existing projects with project_id

Conditional Workflows

Routing rules: branch task execution based on output (v0.3)

Auto Dashboard

DASHBOARD.md regenerated after every mutation

Human-in-the-Loop (v0.3)

Feature

Description

Review Gates

Tasks with review_required redirect to needs_review on completion

Approve / Reject

review_task tool for humans/agents to approve, reject, or request changes

Feedback Loop

Rejected tasks enter revision_requested → agents revise → resubmit

Risk Levels

Tag tasks as low / medium / high / critical risk

Agent Management (v0.3)

Feature

Description

Agent Registry

Register agents with capabilities, tags, and model info

Capability Routing

suggest_assignee recommends the best agent for a task

Timeout Detection

check_timeouts scans for overdue tasks with auto-retry and escalation

Usage Tracking

Record and aggregate token usage and cost per agent/task/project

Webhook Events

Fire HTTP POST notifications on task lifecycle events

Context Persistence

Feature

Description

Session Briefings

get_context returns full situation report for new sessions

Decision Records

Log architectural decisions with rationale and alternatives

Discovery Notes

Capture gotchas, TILs, and patterns for future agents

Project Filtering

Scope context briefings to a specific project

Git Sync

Feature

Description

Auto-Sync

Commit + push after every write (debounced)

Manual Control

commit, pull, push, sync, diff, log, init, remote management

Cross-Device

Laptop-to-phone sync via Obsidian Git plugin


Quick Start

1. Install

Pick your MCP client and add the config:

claude mcp add obsidian -- npx -y mcp-obsidian-vault

Then set your vault path:

claude mcp add obsidian \
  -e OBSIDIAN_VAULT_PATH=/path/to/your/vault \
  -e GIT_AUTO_SYNC=true \
  -- npx -y mcp-obsidian-vault

Add to claude_desktop_config.json:

{
  "mcpServers": {
    "obsidian": {
      "command": "npx",
      "args": ["-y", "mcp-obsidian-vault"],
      "env": {
        "OBSIDIAN_VAULT_PATH": "/path/to/your/vault"
      }
    }
  }
}

Add to ~/.config/opencode/opencode.json (opencode has no env field — use sh -c):

{
  "mcp": {
    "obsidian": {
      "type": "local",
      "command": [
        "sh", "-c",
        "OBSIDIAN_VAULT_PATH=/path/to/your/vault GIT_AUTO_SYNC=true npx -y mcp-obsidian-vault"
      ],
      "enabled": true
    }
  }
}
[mcp_servers.obsidian]
command = "npx"
args = ["-y", "mcp-obsidian-vault"]

[mcp_servers.obsidian.env]
OBSIDIAN_VAULT_PATH = "/path/to/your/vault"
GIT_AUTO_SYNC = "true"
git clone https://github.com/t-rhex/obsidian-mcp-server.git
cd obsidian-mcp-server
npm install && npm run build
OBSIDIAN_VAULT_PATH=/path/to/vault node build/index.js

Updating

npx -y mcp-obsidian-vault always fetches the latest version automatically. If you've cached a specific version, clear the npx cache:

# Force npx to fetch the latest
npx -y mcp-obsidian-vault@latest

# Or clear the npx cache entirely
npx clear-npx-cache

From source:

git pull origin main
npm install && npm run build

Check your current version:

npx -y mcp-obsidian-vault --version
# Or ask your AI agent: "What version of mcp-obsidian-vault are you running?"

Uninstalling

claude mcp remove obsidian

Remove the "obsidian" entry from mcpServers in claude_desktop_config.json.

Remove the "obsidian" entry from mcp in ~/.config/opencode/opencode.json.

Remove the [mcp_servers.obsidian] section from your Codex config.

# Remove the cached package
npx clear-npx-cache
rm -rf obsidian-mcp-server

Your vault data (notes, tasks, decisions, discoveries) is never deleted — it stays in your Obsidian vault folder. Only the MCP server tool is removed.

2. Try It

Once configured, open a chat with your AI agent and try these:

"Read my Projects/roadmap note"
"Search my vault for anything about authentication"
"Create a task to refactor the auth module, high priority"
"What's the current context? Call get_context."

That's it. The agent now has full access to your vault through 27 MCP tools. Keep reading for real-world workflows.

3. Real-World Workflows

Scaffold a new project

Tell your agent what you want to build. It handles the rest:

"I need to build a REST API for user management. Set up a project with tasks for:
  1. Design the database schema (research)
  2. Set up Express with TypeScript (code)
  3. Implement CRUD endpoints (code, depends on 1 and 2)
  4. Add JWT authentication (code, depends on 3)
  5. Write integration tests (code, depends on 4)
  6. Write API documentation (writing)"

The agent calls create_project and your vault now has:

Tasks/
├── DASHBOARD.md                                          # auto-generated summary
└── user-management-api/                                  # project subfolder
    ├── proj-2026-03-09-a1b2c3-user-management-api.md     # project note
    ├── task-2026-03-09-d4e5f6-design-database-schema.md  # pending (no deps)
    ├── task-2026-03-09-g7h8i9-set-up-express.md          # pending (no deps)
    ├── task-2026-03-09-j0k1l2-implement-crud.md          # blocked (waits on 1, 2)
    ├── task-2026-03-09-m3n4o5-add-jwt-auth.md            # blocked (waits on 3)
    ├── task-2026-03-09-p6q7r8-write-tests.md             # blocked (waits on 4)
    └── task-2026-03-09-s9t0u1-write-api-docs.md          # pending (no deps)

Each task file has structured frontmatter (status, priority, dependencies, scope) and sections for description, acceptance criteria, and an agent log. The dashboard shows what's claimable, what's blocked, and overall progress.

From here, the agent (or multiple agents) can claim tasks, work them, and mark them done. Blocked tasks auto-unblock as their dependencies complete.

"Claim the database schema task and start working on it."
"What's the project status?"
→ 1/6 complete (17%), 2 in progress, 3 blocked

Save context before ending a session

When you're wrapping up a session, tell your agent:

"Log a decision: we chose Zod over Joi for validation because of TypeScript inference."
"Log a discovery: the Stripe webhook endpoint requires idempotency keys or charges double."

These get saved as structured notes in Decisions/ and Discoveries/. The next session picks them up automatically.

Pick up where you left off

Start any new session with:

"Call get_context to see what's in progress."

The agent gets back: active projects, in-progress tasks, blockers, recent decisions, recent discoveries, and pending work. No manual briefing needed.

Grow a project mid-flight

Requirements change. Append new tasks to an existing project without recreating it:

"Add these tasks to the User Management API project:
  - Add rate limiting middleware (code)
  - Add password reset flow (code, depends on JWT auth)
  - Security audit (research, depends on rate limiting and password reset)"

New tasks slot into the existing dependency graph. The dashboard updates automatically.

Multi-session continuity

Session 1: "Create a task to fix the memory leak in the worker pool"
           → agent claims it, investigates, logs progress, runs out of context

Session 2: "Call get_context"
           → sees the in-progress task, picks up from the agent log
           → completes the fix, marks task done

Session 3: "Call get_context"
           → sees the completed task, continues to next priority

Daily notes as a work journal

"Append to today's daily note: deployed v2.1 to staging, waiting on QA"
"What did I log yesterday?"

Tools (27)

Note Tools

path: "Projects/my-note.md"     # .md added automatically if missing
includeRaw: false                # include unparsed content
path: "Projects/new-idea"
content: "# My Idea\n\nSome content here."
frontmatter: { "tags": ["idea", "project"], "status": "draft" }
overwrite: false                 # fails if note exists (default)
path: "Projects/my-note"
content: "## New Section\n\nAdded content."
mode: "append"                   # "replace" | "append" | "prepend"
frontmatter: { "status": "in-progress" }
path: "Projects/old-note"
permanent: false                 # true for hard delete
query: "meeting notes"
regex: false
caseSensitive: false
folder: "Projects"               # limit to subfolder
maxResults: 20
path: "Projects"                 # defaults to vault root
recursive: true
maxDepth: 5
notesOnly: false                 # true to filter to .md files only
path: "Projects/my-note"
action: "add"                    # "list" | "add" | "remove"
tags: ["important", "review"]
action: "append"                 # "get" | "create" | "append"
date: "today"                    # "today" | "yesterday" | "tomorrow" | "2025-03-08"
content: "- Met with team about roadmap"
action: "backlinks"              # "resolve" | "backlinks" | "outlinks" | "unresolved"
path: "Projects/my-note"

Action

Description

resolve

Find the file a [[wikilink]] points to

backlinks

Find all notes that link TO a given note

outlinks

List all [[wikilinks]] FROM a note

unresolved

Find all broken [[wikilinks]] across the vault

action: "sync"                   # full pull + commit + push
message: "update notes"          # optional commit message

Action

Description

status

Working tree status

commit

Stage all + commit

pull

Pull from remote (rebase by default)

push

Push to remote

sync

Pull + commit + push in one call

log

Recent commit history

diff

Uncommitted changes

init

Initialize git repo with .gitignore

remote_add

Add a git remote

remote_list

List configured remotes

Task Tools

title: "Implement auth module"
description: "Build JWT-based authentication for the API."
priority: "high"                 # "critical" | "high" | "medium" | "low"
type: "code"                     # "code" | "research" | "writing" | "maintenance" | "other"
depends_on: ["task-abc-123"]     # task IDs that must complete first
scope: ["src/auth.ts"]           # advisory: files this task modifies
acceptance_criteria: ["Tests pass", "Docs written"]
timeout_minutes: 120
status: "pending"                # or "all"
priority: "high"                 # or "all"
type: "code"                     # or "all"
tags: ["auth"]                   # filter by tags
assignee: "claude-code-1"
unassigned_only: true
project: "proj-..."              # filter by project
task_id: "task-2026-03-09-abc123"
assignee: "claude-code-1"
worktree_branch: "worktree-auth-api"      # optional — for parallel multi-agent work
worktree_path: "/repo/.claude/worktrees/auth-api"  # optional

Blocks if dependencies aren't met. Two agents claiming the same task &rarr; second gets TASK_ALREADY_CLAIMED. Worktree fields are optional — pass them when using git worktrees for parallel development.

task_id: "task-2026-03-09-abc123"
status: "in_progress"
log_entry: "Found root cause — null check missing in auth middleware."
task_id: "task-2026-03-09-abc123"
summary: "Auth module implemented with JWT support."
deliverables: ["src/auth.ts", "https://github.com/org/repo/pull/42"]
status: "completed"              # "completed" | "failed" | "cancelled"

Completing a task auto-unblocks dependent tasks (blocked &rarr; pending).

New project:

title: "Auth Rewrite"
description: "Rewrite authentication to use JWT tokens."
tasks: [
  { title: "Design API schema", type: "research" },
  { title: "Implement JWT", type: "code", depends_on_indices: [0] },
  { title: "Write tests", type: "code", depends_on_indices: [1] },
  { title: "Update docs", type: "writing" }
]

Append to existing project:

project_id: "proj-2026-03-09-abc123"
tasks: [
  { title: "Add rate limiting", type: "code" },
  { title: "Security audit", depends_on_existing: ["task-..."] }
]
project_id: "proj-2026-03-09-abc123"

Returns progress percentage, status breakdown, active agents, overdue tasks, and blockers.

Context Tools

project_id: "proj-..."           # optional: focus on one project
hours: 48                         # lookback window (default: 48)
include_completed: true

Returns: active projects, in-progress work, pending tasks, blockers, failures, overdue tasks, recent decisions, recent discoveries, pinned notes.

title: "Use JWT over session tokens"
context: "Need stateless auth for microservices."
decision: "JWT with RS256, 15min access tokens, refresh rotation."
alternatives: ["Session tokens with Redis", "API keys"]
consequences: ["Stateless (good)", "Revocation needs deny-list (tradeoff)"]
title: "gray-matter crashes on undefined values"
discovery: "js-yaml throws when serializing undefined. Strip before serialize."
impact: "high"
recommendation: "Filter with Object.entries().filter() first."
category: "bug"

Review & HITL Tools

task_id: "task-2026-03-09-abc123"
action: "approve"                # "approve" | "reject" | "request_changes"
reviewer: "human-alice"
feedback: "Looks good, ship it."  # required for reject/request_changes

On approve, the task moves to completed and dependents are unblocked. On reject/request_changes, the task moves to revision_requested for the assignee to revise and resubmit.

Agent Tools

agent_id: "claude-code-1"
capabilities: ["code", "research", "writing"]
tags: ["auth", "backend"]
model: "claude-sonnet-4"
max_concurrent: 3

Creates/updates an agent profile in the Agents/ folder. Agents are tracked with status (active, idle, offline) and heartbeat timestamps.

capability: "code"               # filter by capability
tag: "auth"                      # filter by tag
status: "active"                 # "active" | "idle" | "offline"
available_only: true             # only agents below max_concurrent
task_id: "task-2026-03-09-abc123"

Returns a ranked list of agents sorted by capability match, tag overlap, and current workload.

dry_run: false                   # true for preview without changes

Scans all claimed/in_progress tasks for timeout_minutes violations. For overdue tasks:

  • If retry_count < max_retries: resets to pending for retry

  • If retries exhausted + escalate_to set: marks as escalated

  • Returns list of all actions taken

Usage Tracking Tools

agent_id: "claude-code-1"
task_id: "task-abc-123"          # optional
input_tokens: 15000
output_tokens: 3000
model: "claude-sonnet-4"
cost_usd: 0.042
duration_seconds: 30
notes: "Implemented auth module"
agent_id: "claude-code-1"       # optional filter
project_id: "proj-..."          # optional filter
task_id: "task-..."             # optional filter
from_date: "2026-03-01"        # optional
to_date: "2026-03-09"          # optional

Returns: total_input_tokens, total_output_tokens, total_cost_usd, record_count, grouped by agent and model.


Task Orchestration

Single Agent Workflow

sequenceDiagram
    participant H as Human
    participant A as Agent
    participant V as Vault

    H->>V: create_task("Fix login bug")
    A->>V: list_tasks(status: "pending")
    V-->>A: [task-abc: "Fix login bug"]
    A->>V: claim_task(task_id, assignee: "agent-1")
    A->>V: update_task(status: "in_progress")
    A->>V: update_task(log: "Found null check issue")
    A->>V: complete_task(summary: "Fixed!", deliverables: [...])
    V-->>V: Auto-unblock dependents
    V-->>V: Refresh DASHBOARD.md

Multi-Agent Project Workflow

sequenceDiagram
    participant H as Human
    participant A as Agent A
    participant B as Agent B
    participant C as Agent C
    participant V as Vault

    H->>V: create_project("Auth Rewrite", tasks: [...])
    Note over V: Tasks created:<br/>1. Design API (pending)<br/>2. Implement JWT (blocked on 1)<br/>3. Write tests (blocked on 2)<br/>4. Update docs (pending)

    par Parallel Work
        A->>V: claim_task("Design API")
        B->>V: claim_task("Update docs")
    end

    A->>V: complete_task("Design API")
    Note over V: "Implement JWT" auto-unblocked

    C->>V: claim_task("Implement JWT")
    C->>V: complete_task("Implement JWT")
    Note over V: "Write tests" auto-unblocked

    H->>V: get_project_status(project_id)
    V-->>H: 3/4 complete (75%)

Task Dependency Graph

graph LR
    A["Design API<br/><small>research</small>"] --> B["Implement JWT<br/><small>code</small>"]
    B --> C["Write Tests<br/><small>code</small>"]
    D["Update Docs<br/><small>writing</small>"]

    style A fill:#2ecc71,stroke:#27ae60,color:#fff
    style B fill:#3498db,stroke:#2980b9,color:#fff
    style C fill:#e74c3c,stroke:#c0392b,color:#fff
    style D fill:#2ecc71,stroke:#27ae60,color:#fff

Append Mode — Growing Projects

When requirements evolve mid-project, append new tasks to an existing project without recreating it:

graph TB
    subgraph Original["Original Project (4 tasks)"]
        A1["Design API"] --> A2["Implement JWT"]
        A2 --> A3["Write Tests"]
        A4["Update Docs"]
    end

    subgraph Appended["Appended (3 new tasks)"]
        B1["Add Rate Limiting"]
        B1 --> B2["Security Audit"]
        A2 -.->|depends_on_existing| B3["Load Testing"]
    end

    style Original fill:#1a1a2e,stroke:#0f3460,color:#fff
    style Appended fill:#16213e,stroke:#e94560,color:#fff
create_project(
  project_id: "proj-...",              // existing project
  tasks: [
    { title: "Add Rate Limiting", type: "code" },
    { title: "Security Audit", depends_on_indices: [0] },
    { title: "Load Testing", depends_on_existing: ["task-implement-jwt-id"] }
  ]
)

Task State Machine

stateDiagram-v2
    [*] --> pending: create_task
    pending --> claimed: claim_task
    pending --> blocked: update_task
    pending --> cancelled: update_task

    claimed --> in_progress: update_task
    claimed --> pending: unclaim
    claimed --> blocked: update_task
    claimed --> cancelled: update_task

    in_progress --> completed: complete_task
    in_progress --> needs_review: complete_task (review_required)
    in_progress --> failed: complete_task
    in_progress --> blocked: update_task
    in_progress --> pending: update_task
    in_progress --> cancelled: update_task

    needs_review --> completed: review_task (approve)
    needs_review --> revision_requested: review_task (reject)

    revision_requested --> in_progress: update_task

    blocked --> pending: auto-unblock / update
    blocked --> cancelled: update_task

    completed --> pending: reopen
    failed --> pending: retry
    cancelled --> pending: reactivate

    completed --> [*]

Multi-Agent Parallel Development

Run multiple AI agents on the same codebase simultaneously, each in its own git worktree, with the vault coordinating who's working on what.

The architecture: Git worktrees provide filesystem isolation. The vault provides coordination metadata. No conflicts, no stepping on each other's work.

How It Works

  1. Claim a task with worktree metadata — when an agent claims a task, it records the branch and worktree path

  2. Work in isolation — each agent works in its own directory on its own branch

  3. Vault tracks everythingget_context shows which agents are on which branches, list_tasks includes worktree info

  4. Complete and PR — when done, complete_task tells you the branch is ready for a pull request

Claude Code v2.1.49+ has native worktree support via --worktree (-w):

# Terminal 1: Agent works on auth API
claude --worktree design-api
# → "Claim the 'Design API' task with worktree_branch 'worktree-design-api'"

# Terminal 2: Agent works on documentation
claude --worktree update-docs
# → "Claim the 'Update docs' task with worktree_branch 'worktree-update-docs'"

Claude Code creates worktrees at <repo>/.claude/worktrees/<name> with branch worktree-<name>. Each agent works in its own directory, on its own branch.

With opencode / Codex CLI

Create worktrees manually, then point the agent at the right directory:

# Create worktrees
git worktree add .worktrees/auth-api -b worktree-auth-api
git worktree add .worktrees/update-docs -b worktree-update-docs

# Start agents in their worktrees
cd .worktrees/auth-api && opencode
# → "Claim task X with worktree_branch 'worktree-auth-api' and worktree_path '$(pwd)'"

What the Vault Tracks

When you claim a task with worktree fields:

# Task frontmatter after claim
status: claimed
assignee: claude-code-1
worktree_branch: worktree-auth-api
worktree_path: /repo/.claude/worktrees/auth-api

get_context includes worktree info for all active work:

{
  "active_work": [
    {
      "id": "task-2026-03-09-abc123",
      "title": "Design API endpoints",
      "assignee": "claude-code-1",
      "worktree_branch": "worktree-design-api",
      "worktree_path": "/repo/.claude/worktrees/design-api"
    },
    {
      "id": "task-2026-03-09-def456",
      "title": "Update documentation",
      "assignee": "claude-code-2",
      "worktree_branch": "worktree-update-docs",
      "worktree_path": "/repo/.claude/worktrees/update-docs"
    }
  ]
}

When a task completes, the response tells you the branch is ready:

Task "Design API endpoints" completed. Branch `worktree-design-api` is ready for PR.

Context Persistence

The core problem: AI agents lose all context between sessions. Decisions, discoveries, and in-flight work vanish.

mcp-obsidian-vault solves this with three tools that build a persistent knowledge layer:

graph TB
    subgraph Session1["Session 1"]
        S1A["Discovers: gray-matter<br/>crashes on undefined"] --> S1B["log_discovery()"]
        S1C["Decides: use RS256<br/>for JWT signing"] --> S1D["log_decision()"]
        S1E["Completes 3 tasks,<br/>2 still in progress"]
    end

    subgraph Vault["Obsidian Vault"]
        V1["Discoveries/<br/>gray-matter-crash.md"]
        V2["Decisions/<br/>use-rs256-signing.md"]
        V3["Tasks/<br/>DASHBOARD.md"]
    end

    subgraph Session2["Session 2 (new agent, fresh context)"]
        S2A["get_context()"] --> S2B["Receives:<br/>- 2 tasks in progress<br/>- RS256 decision<br/>- gray-matter gotcha<br/>- project at 60%"]
        S2B --> S2C["Continues work<br/>without repeating<br/>mistakes"]
    end

    S1B --> V1
    S1D --> V2
    S1E --> V3
    V1 & V2 & V3 --> S2A

    style Session1 fill:#1a1a2e,stroke:#e94560,color:#fff
    style Vault fill:#16213e,stroke:#0f3460,color:#fff
    style Session2 fill:#0f3460,stroke:#533483,color:#fff

Context-First Discipline

Every new session should start with one call:

get_context() → {
  active_projects: [{ id, title, progress: "3/7 (43%)" }],
  in_progress: [{ id, title, assignee, claimed_at }],
  pending_work: { "proj-abc": [...], standalone: [...] },
  blockers: [{ id, title, waiting_on: [{ id, title }] }],
  recent_decisions: [{ title, decision, status }],
  recent_discoveries: [{ title, discovery, recommendation }],
  pinned_notes: [...]
}

Git Sync & Cross-Device Flow

sequenceDiagram
    participant L as Laptop<br/>(MCP Server)
    participant G as GitHub<br/>(Private Repo)
    participant P as Phone<br/>(Obsidian Git)

    L->>L: Agent edits note
    L->>G: Auto-sync: commit + push
    P->>G: Pull on open
    G-->>P: Latest notes
    P->>P: Edit on the go
    P->>G: Commit + push
    L->>G: Pull (next auto-sync)
    G-->>L: Phone changes merged

Setup

  1. Laptop — set GIT_AUTO_SYNC=true with a private GitHub repo

  2. Phone (iOS)Obsidian Git plugin or Working Copy

  3. Phone (Android)Obsidian Git plugin (built-in git on Android)

Obsidian Git Setting

Value

Why

Auto pull on open

Enabled

Get latest when you open the app

Auto push after commit

Enabled

Push edits immediately

Pull on interval

5-10 min

Catch changes while app is open

Commit message

mobile: {{date}}

Distinguish mobile vs MCP commits

Use a private repo. Your notes are personal.


Task Note Structure

Tasks are markdown notes with structured YAML frontmatter. Project tasks are organized in per-project subfolders, while standalone tasks live at the Tasks/ root:

Tasks/
├── DASHBOARD.md
├── auth-rewrite/                              # project subfolder
│   ├── proj-2026-03-09-abc123-auth-rewrite.md
│   ├── task-2026-03-09-def456-design-api.md
│   └── task-2026-03-09-ghi789-implement-jwt.md
├── api-migration/                             # another project
│   └── ...
└── task-2026-03-09-mno345-fix-typo.md         # standalone task

Example task note:

---
id: task-2026-03-09-abc123
title: Implement auth module
status: in_progress
priority: high
type: code
assignee: claude-code-1
created: "2026-03-09T14:00:00.000Z"
updated: "2026-03-09T15:45:00.000Z"
depends_on: []
scope:
  - src/auth.ts
tags:
  - auth
---

## Description

Build JWT-based authentication for the API.

## Acceptance Criteria

- [ ] Tests pass
- [ ] Docs written

## Agent Log

- **[2026-03-09 14:30:00]** Starting implementation. Found 3 endpoints to modify.
- **[2026-03-09 15:45:00] [COMPLETED]** Auth module done with JWT support.

## Deliverables

- src/auth.ts
- src/auth.test.ts

A DASHBOARD.md is auto-generated after every task mutation with summary counts, active work, pending queue, blockers, and recent completions.


Agent Prompts

Three built-in MCP prompts for different agent personas:

Prompt

Role

Use When

task-worker

Find, claim, complete tasks

Spawning a coding agent

project-manager

Plan projects, decompose work, monitor

Orchestrating multi-agent work

vault-assistant

Read, search, organize notes

General vault management

Request via MCP:

{
  "method": "prompts/get",
  "params": {
    "name": "task-worker",
    "arguments": { "agent_id": "claude-1", "project_id": "proj-abc" }
  }
}

Or copy from prompts/ into your agent's system prompt.


Configuration

Required

Variable

Description

OBSIDIAN_VAULT_PATH

Absolute path to your vault

Vault

Variable

Default

Description

DAILY_NOTE_FOLDER

Daily Notes

Subfolder for daily notes

TRASH_ON_DELETE

true

Move to .trash/ instead of permanent delete

MAX_FILE_SIZE_BYTES

10485760

Max file size (10 MB)

MAX_SEARCH_RESULTS

50

Max search results

SEARCH_TIMEOUT_MS

30000

Search timeout

NOTE_EXTENSIONS

.md,.markdown

Note file extensions

TASKS_FOLDER

Tasks

Task notes subfolder

DECISIONS_FOLDER

Decisions

Decision records subfolder

DISCOVERIES_FOLDER

Discoveries

Discovery notes subfolder

AGENTS_FOLDER

Agents

Agent profile notes subfolder

USAGE_FOLDER

Usage

Token usage records subfolder

Git

Variable

Default

Description

GIT_AUTO_SYNC

false

Auto commit + push after every write

GIT_AUTO_SYNC_DEBOUNCE_MS

5000

Debounce interval

GIT_COMMIT_MESSAGE_PREFIX

vault:

Auto-commit message prefix

GIT_REMOTE

origin

Default remote

GIT_BRANCH

main

Default branch

GIT_TIMEOUT_MS

30000

Git operation timeout

GIT_PULL_REBASE

true

Use --rebase on pull

Webhooks

Variable

Default

Description

WEBHOOK_URL

Comma-separated webhook URLs for task event notifications

WEBHOOK_SECRET

HMAC-SHA256 secret for signing webhook payloads

WEBHOOK_TIMEOUT_MS

5000

Webhook HTTP request timeout


Security

  • Path traversal prevention — all paths validated against vault root, including symlink resolution

  • No shell injection — git commands use execFile (not exec)

  • Atomic writes — temp file + rename prevents partial writes on crash

  • Overwrite protectioncreate_note fails if note exists unless explicitly overridden

  • Trash safety — unique filenames prevent collision in .trash/

  • File size limits — configurable cap prevents reading huge files

  • Search timeout — prevents runaway searches

  • Git mutex — prevents concurrent git commands from conflicting


Robustness

  • Retry failed tasksupdate_task(status: "pending") clears assignee, increments retry_count

  • Unclaim stuck tasks — reclaim tasks from crashed agents

  • Timeout detectionlist_tasks flags tasks past timeout_minutes with is_overdue: true

  • Dependency validation — warns on nonexistent depends_on references

  • Dashboard health — all mutation responses include dashboard_refreshed status

Known Limitations

  • No file locking — claims are atomic within a single server process (Node event loop). Multiple server processes sharing a vault need external coordination.

  • Scope is advisoryscope[] is not enforced by the server. Agents should respect it.

  • Timeouts need check_timeouts — overdue tasks are detected but not auto-released; an agent or cron must call check_timeouts periodically.

  • Webhooks are fire-and-forget — webhook delivery is best-effort with one retry. No persistent queue.


Project Structure

src/
├── index.ts              # MCP server entry, 27 tools + 3 prompts
├── config.ts             # Environment variable parsing
├── errors.ts             # Typed errors + safe handler wrapper
├── vault.ts              # Filesystem: path safety, atomic writes, list, search
├── frontmatter.ts        # YAML parse/serialize, tag extraction
├── git.ts                # Git CLI wrapper with mutex
├── events.ts             # EventBus with typed task lifecycle events
├── webhooks.ts           # WebhookEmitter with HMAC-SHA256 signing
├── agent-registry.ts     # Agent profiles, scanning, capability matching
├── task-schema.ts        # Task types, IDs, validation, state machine
├── task-dashboard.ts     # Task scanning + DASHBOARD.md generation
├── prompts.ts            # MCP prompt registration
└── tools/                # One file per tool (27 files)

prompts/                  # Agent persona prompts (ship with npm)
skills/                   # Agent skills (ship with npm, skills.sh compatible)
test/run.mjs              # 375 integration tests

Development

npm install
npm run build             # TypeScript → build/
npm test                  # 375 integration tests
npm run dev               # tsc --watch

Contributing

Contributions are welcome! Here's how to get started.

Setup

git clone https://github.com/t-rhex/obsidian-mcp-server.git
cd obsidian-mcp-server
npm install
npm run build
npm test              # All tests must pass

Development Workflow

  1. Create a branch from main:

    git checkout -b feat/your-feature
  2. Make your changes. Each tool lives in its own file under src/tools/. The pattern is consistent — look at any existing tool for the structure.

  3. Add tests. Tests are in test/run.mjs — plain Node.js assertions, no framework. Add your tests before the cleanup section at the end of the file.

  4. Build and test:

    npm run build && npm test
  5. Push and open a PR against main:

    git push -u origin feat/your-feature
    gh pr create

CI runs on Ubuntu + Windows across Node 18, 20, and 22. All 6 matrix jobs must pass.

Code Style

  • TypeScript with strict mode. No any unless absolutely necessary.

  • One file per tool in src/tools/. Export schema and handler.

  • Every handler wrapped in safeToolHandler() (from src/errors.ts) for consistent error handling.

  • Zod v4 for input validation — note that z.record() requires two args: z.record(z.string(), z.unknown()).

  • Atomic writes — use vault.writeNote() which writes to a .tmp file then renames.

  • Strip undefined — never put undefined values in frontmatter objects. serializeNote strips them automatically, but avoid creating them upstream when possible.

Adding a New Tool

  1. Create src/tools/your-tool.ts with exported schema and handler

  2. Register it in src/index.ts (follow the existing pattern)

  3. Add integration tests in test/run.mjs

  4. Update the tool count in README.md and package.json description if applicable

Gotchas

  • macOS /tmp is a symlink to /private/tmp — always resolve paths with realpathSync

  • gray-matter crashes on undefined values in YAML — serializeNote handles this, but be aware

  • routing_rules[].deactivate — omit the key entirely rather than setting to undefined

  • Windows path separators — use split(/[/\\]/) not split("/")

  • opencode has no env field in MCP config — must use sh -c with inline env vars

Releases

Releases are automated. When a PR is merged to main with a version bump in package.json, CI automatically:

  1. Detects the version change

  2. Runs the full test matrix

  3. Publishes to npm

  4. Creates a GitHub Release

No manual publish steps needed. Just bump the version in your PR.


License

MIT

Available Tools

27 tools
check_timeoutsA

Scan for overdue and failed tasks. Auto-retry failed tasks within max_retries, escalate exhausted tasks to escalate_to agent/human, release timed-out tasks. Use dry_run=true to preview actions without making changes.

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNoIf true, report what would happen without making changes.

TDQS

A4.5/5.0
Behavior5/5

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

With no annotations, the description carries full responsibility for disclosing behavior. It transparently states that the tool mutates state by auto-retrying, escalating, and releasing tasks, and it flags dry_run as a non-destructive preview mode. This is strong behavioral disclosure.

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 about 35 words, front-loaded with the core scan-and-remediate behavior, and includes the key safety note about dry_run in a second sentence. Every sentence earns its place with no fluff.

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

Completeness5/5

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

This is a simple tool with one optional parameter and no output schema. The description fully covers what the tool does, what actions it takes, and how to preview changes safely. Nothing essential for correct invocation is missing.

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 already documents dry_run with 100% coverage, so the description doesn't need to add much. It does reinforce the parameter's purpose by saying 'Use dry_run=true to preview actions without making changes,' but this is largely redundant with the schema description.

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 names a specific verb ('Scan') and resource ('overdue and failed tasks'), then spells out the concrete actions: auto-retry, escalate, release. This clearly distinguishes it from sibling task-management tools like update_task or complete_task.

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?

The description clearly establishes when to use the tool: when there are overdue, failed, exhausted, or timed-out tasks needing automated handling. It also recommends using dry_run=true to preview actions, providing a clear safety-first usage context, though it does not explicitly name alternatives or exclusion conditions.

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

claim_taskA

Atomically claim a pending task for an agent. Sets status to 'claimed' and records the assignee. Prevents race conditions — if two agents try to claim the same task, the second gets a clear error. Checks dependency completion before allowing claim.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYesThe task ID to claim (e.g. 'task-2026-03-09-abc123').
assigneeYesIdentifier for the agent claiming this task (e.g. 'claude-code-1', 'agent-research').
worktree_pathNoFilesystem path to the worktree directory (e.g. '/repo/.claude/worktrees/feature-auth').
worktree_branchNoGit branch name for this agent's worktree (e.g. 'worktree-feature-auth'). Used to track parallel work across agents.

TDQS

A4.2/5.0
Behavior5/5

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

With no annotations provided, the description carries the full disclosure burden and meets it: it reveals atomicity, the concrete mutation (status→claimed, assignee recorded), the concurrency failure mode (second claimer gets a clear error), and a precondition check (dependency completion). This is rich behavioral context well beyond a bare 'claim a task' statement.

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?

Three tightly packed sentences front-load the core action first, then side effects, then failure and precondition behavior. Every sentence earns its place; the only minor redundancy is 'atomically' versus 'prevents race conditions', which is acceptable since the latter adds the concrete error outcome.

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 moderately complex concurrency-safe mutation tool, the description covers preconditions, side effects, and error behavior thoroughly, and the schema documents all parameters. The only gap is the absence of an output schema or any statement about the success response shape, which the description does not address.

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 coverage is 100%, so the baseline is 3. The description reinforces the assignee parameter via 'records the assignee' but adds no meaning beyond what the schema already documents for task_id, worktree_path, or worktree_branch. It neither hurts nor materially enhances parameter understanding.

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?

"Atomically claim a pending task for an agent" names a specific verb (claim), a specific resource (pending task), and an actor (agent), with the side effect spelled out (sets status to 'claimed', records assignee). The claim verb clearly differentiates it from lifecycle siblings like create_task, update_task, and complete_task without needing to open their schemas.

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 — an agent claims a pending task, and the dependency-completion check indicates a precondition. However, it never explicitly names alternatives or exclusions (e.g., use create_task to make a task, complete_task to finish one), so routing among the lifecycle siblings is left to inference.

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

complete_taskA

Mark a task as completed (or failed/cancelled) with a summary and optional deliverables. Records completed_at timestamp, appends to Agent Log, links deliverable files/URLs, and automatically unblocks dependent tasks.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoTerminal status. Usually 'completed', but use 'failed' or 'cancelled' if the task couldn't be done.completed
summaryYesSummary of what was accomplished. Appended to the Agent Log.
task_idYesThe task ID to complete (e.g. 'task-2026-03-09-abc123').
deliverablesNoPaths to files created/modified, or URLs to PRs, docs, etc. Added to a Deliverables section.
error_reasonNoIf status is 'failed', explain what went wrong. Helps future agents retry.

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden. It discloses important side effects: recording completed_at, appending to the Agent Log, linking deliverables, and auto-unblocking dependent tasks. It does not clarify whether unblocking applies to failed/cancelled statuses or discuss reversibility, but the core side effects are well covered.

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, well-structured sentence that leads with the core purpose and then enumerates side effects. No filler or redundant wording; every clause adds relevant context.

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?

The description covers purpose, main parameters, and the most significant side effects in a compact form. The main gap is that 'automatically unblocks dependent tasks' is ambiguous for failed/cancelled statuses, and there is no output schema or annotation to fill in remaining behavior.

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 each parameter. The description mostly reinforces what the schema says (summary is appended to log, deliverables are linked), without materially adding new parameter-level semantics.

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 opens with a specific verb and resource: 'Mark a task as completed (or failed/cancelled)'. It clearly identifies this as the terminal-status action and mentions the key side effects, which distinguishes it from siblings like update_task or claim_task.

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 when to use the tool—when a task reaches a terminal state—but it does not explicitly contrast it with alternatives like update_task for non-terminal edits or claim_task for assignment. The context is clear, but exclusion guidance is missing.

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

create_noteA

Create a new note in the vault with optional YAML frontmatter. Parent folders are created automatically. Fails if the note already exists (unless overwrite=true).

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesPath for the new note relative to vault root (e.g. 'Projects/new-idea.md'). Extension .md is added automatically if missing. Parent folders are created as needed.
contentYesMarkdown content for the note body.
overwriteNoIf true, overwrite an existing note at this path. Default is false (fails if note exists).
frontmatterNoOptional YAML frontmatter as a JSON object (e.g. { title: 'My Note', tags: ['idea', 'project'] }).

TDQS

A4.2/5.0
Behavior4/5

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

No annotations are provided, so the description must carry the behavioral transparency burden. It discloses the key behavioral traits: automatic parent folder creation, optional frontmatter, and the overwrite/failure policy. It does not mention return values or error details, but for a create-note operation the main side effects are well covered.

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 two concise sentences with no filler. The primary action is front-loaded, and the edge cases (parent folders, failure-if-exists) are included efficiently.

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?

With 100% schema coverage and no annotations or output schema, the description covers the essential elements: what the tool does, auto-created parent folders, and the overwrite behavior. It could mention the return value, but for this simple create operation the description is adequate for an agent to invoke it correctly.

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%, and the schema already explains path, content, overwrite, and frontmatter in detail. The description adds little beyond restating frontmatter and overwrite behavior, so it does not meaningfully enhance the parameter semantics.

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 action: 'Create a new note in the vault' with optional YAML frontmatter. It also distinguishes this from siblings by emphasizing 'new' and the failure-if-exists behavior, which is different from update_note or delete_note.

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 gives clear context for when to use this tool: to create a new note, with parent folders created automatically, and it fails if the note already exists unless overwrite=true. It does not explicitly recommend update_note as an alternative for existing notes, so it falls short of fully explicit when/when-not guidance.

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

create_projectA

Create a project with multiple sub-tasks in one call. Use depends_on_indices to wire up task dependencies by array position. Independent tasks can be claimed by different agents in parallel. Returns all task IDs for immediate claiming. Append mode: pass project_id to add new sub-tasks to an existing project.

ParametersJSON Schema
NameRequiredDescriptionDefault
dueNoOptional deadline for the whole project (YYYY-MM-DD).
tagsNoTags applied to the project and all sub-tasks.
tasksYesArray of sub-tasks to create. Use depends_on_indices to wire up dependencies between them. In append mode, use depends_on_existing to reference tasks already in the project.
titleNoProject title (e.g. 'Auth Rewrite', 'API v2 Migration'). Required for new projects.
sourceNoWhere this project came from.manual
priorityNoDefault priority for the project and its tasks (individual tasks can override).medium
project_idNoAppend mode: provide an existing project ID to add new sub-tasks to it. When set, title and description are optional (inherited from existing project). New tasks are appended to the project's Sub-Tasks section.
descriptionNoProject description with goals, context, and constraints. Required for new projects.
context_notesNoVault notes that provide context for the entire project.

TDQS

A4.2/5.0
Behavior4/5

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

No annotations are provided, so the description carries the behavioral burden. It discloses useful behavioral details: independent tasks can be claimed in parallel, all task IDs are returned for immediate claiming, and append mode adds sub-tasks to an existing project. It does not discuss side effects like irreversibility or failure atomicity, but the main operational traits an agent needs are present.

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 concise: five short sentences, with the core purpose front-loaded in the first sentence. Every sentence contributes either a usage pattern, a behavioral note, or append-mode guidance. No filler 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?

The description covers the key operational aspects: bulk project creation, dependency wiring, parallel claiming, return of task IDs, and append mode. With 100% schema coverage of all parameters, the definition is nearly complete. It could have explicitly mentioned that title and description are required for new projects, but that information is already present in the schema.

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 every parameter is already documented in the schema. The description reinforces depends_on_indices and project_id but does not add meaning beyond what the schema already provides, so the baseline of 3 applies.

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 states a specific action and resource: 'Create a project with multiple sub-tasks in one call.' It distinguishes itself from the sibling create_task by emphasizing bulk creation of multiple sub-tasks, so an agent can tell them apart without opening the schema.

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?

The description gives clear usage context: use this tool for multi-sub-task projects, wire dependencies with depends_on_indices, and use append mode by passing project_id. It does not explicitly name create_task as the alternative, but the usage context is clear enough that an agent can decide when this tool is appropriate.

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

create_taskA

Create a new task in the vault's task queue with structured YAML frontmatter. Tasks are markdown notes in the Tasks/ folder. Supports priority, type, dependencies, scope isolation, context notes, and acceptance criteria. Auto-refreshes the task dashboard.

ParametersJSON Schema
NameRequiredDescriptionDefault
dueNoOptional deadline in YYYY-MM-DD format.
tagsNoTags for categorization.
typeNoType of work. Helps agents decide if they can handle it.other
scopeNoAdvisory: file paths this task intends to modify. Not enforced — agents should respect this to avoid conflicts.
titleYesShort, descriptive title for the task.
sourceNoWhere this task came from (e.g. 'manual', 'github-issue-42', 'agent-spawned').manual
projectNoProject ID to attach this task to (e.g. 'proj-2026-03-09-abc123'). Task will appear in get_project_status rollups.
assigneeNoOptionally pre-assign to a specific agent.
priorityNoTask priority. Default: medium.medium
reviewerNoWho should review this task (optional).
depends_onNoTask IDs that must complete before this task can start.
risk_levelNoRisk level. High/critical tasks auto-require review on completion.
descriptionYesDetailed description of what needs to be done. Include context, constraints, and links to relevant notes.
escalate_toNoAgent ID or 'human' to escalate to after max_retries exhausted.
max_retriesNoMax auto-retries on failure. 0 = no auto-retry (default).
parent_taskNoID of the parent task, if this is a sub-task.
context_notesNoPaths to vault notes that provide context for this task (e.g. 'Projects/my-api').
routing_rulesNoConditional workflow rules. When this task completes, evaluate rules against output to selectively unblock/cancel dependents.
review_requiredNoIf true, complete_task sends to needs_review instead of completed. Human must approve.
timeout_minutesNoMax time in minutes before an agent is considered stuck. Default: 60.
acceptance_criteriaNoList of criteria that must be met for the task to be considered complete.
retry_delay_minutesNoMinutes to wait between retries. Default: 5.

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral disclosure burden. It discloses that the tool creates a markdown note, stores it in Tasks/, uses YAML frontmatter, and auto-refreshes the task dashboard. These are meaningful side effects beyond the schema, though it could also mention what the tool returns.

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?

Three terse sentences: primary action, storage location, and key behavioral side effect. No filler or redundant restatement of the tool name.

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 22-parameter tool with no output schema, the description gives enough selection and invocation context: what it creates, where tasks live, what fields are supported, and the dashboard refresh side effect. It does not mention the returned task ID or how the agent should reference the created task, which is a minor gap given dependency-related parameters.

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 description coverage is 100%, so the baseline is 3. The description adds value by grouping key parameters (priority, type, dependencies, scope isolation, context notes, acceptance criteria) and explaining that parameters become structured YAML frontmatter, which helps agents understand the data model beyond the schema.

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?

Clearly states the verb ('Create') and resource ('new task in the vault's task queue') with the storage format ('structured YAML frontmatter'). It also distinguishes the tool from generic note creation by explaining that tasks are markdown notes in the Tasks/ folder.

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?

Usage is implied: 'Create a new task' signals this is for new tasks, and sibling tools like update_task and complete_task cover other lifecycle stages. However, the description never explicitly states when not to use this tool or names an alternative for related operations.

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

daily_noteB

Get, create, or append to a daily note. Supports 'today', 'yesterday', 'tomorrow', or any date string (YYYY-MM-DD). Daily notes are stored in a configurable folder.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoDate for the daily note. Accepts 'today', 'yesterday', 'tomorrow', or a date string like '2025-03-08'. Defaults to 'today'.
actionYes'get' to read, 'create' to create/overwrite, 'append' to add content to existing.
contentNoContent for the daily note. Required for 'create' and 'append' actions.
frontmatterNoOptional frontmatter for the note (only used with 'create' action).

TDQS

B3.1/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 full responsibility for behavioral disclosure. It mentions the three actions but does not disclose that 'create' may overwrite an existing note, how 'append' behaves when the note does not exist, or what the tool returns. For a tool that can modify or overwrite content, this is a meaningful gap.

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 compact, front-loaded with the core action, and wastes no words. The date-format note and storage-location note are both useful and directly relevant to correct invocation.

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?

The description plus the fully documented schema provide enough for basic invocation, but the absence of an output schema and annotations means the tool lacks return-value and safety-context information. For a multi-action tool with create/overwrite and append behavior, the description is adequate but not complete.

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 four parameters and their meanings. The description adds a little value by emphasizing the accepted date formats and the configurable storage folder, but it does not go beyond the schema in any substantive way.

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 identifies the tool's function with a specific verb and resource: get, create, or append to a daily note. The date support and 'daily note' concept help distinguish it from the sibling generic note tools like read_note, create_note, and update_note, though it does not explicitly name those alternatives.

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 context about supported date values and the configurable folder but gives no explicit guidance on when to use daily_note versus the generic note-reading or note-editing siblings. An agent would need to infer the intended use case from the tool name and description.

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

delete_noteA

Delete a note from the vault. By default moves to .trash/ (Obsidian convention) instead of permanent deletion. Set permanent=true for hard delete.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesPath to the note to delete, relative to vault root.
permanentNoIf true, permanently delete the file instead of moving to .trash/. Default is false (moves to trash).

TDQS

A4.5/5.0
Behavior5/5

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

With no annotations present, the description carries full responsibility for revealing behavior, and it does this well. It discloses that deletion is not permanent by default, that notes go to .trash/ following Obsidian convention, and that permanent=true causes a hard delete. This is exactly the kind of safety-relevant behavior an agent needs to know before invoking the tool.

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 deliver the core operation, the default behavior, the exception, and the exact flag to trigger it. There is no filler, and the most critical safety information is front-loaded at the beginning.

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

Completeness5/5

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

The tool has only two simple parameters, no nested objects, no output schema, and no annotations. The description covers what the tool does, what the default consequence is, and how to switch to permanent deletion. This is sufficient for an agent to call the tool correctly.

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 both path and permanent, including the default value and meaning. The description adds the term 'hard delete' and restates the trash behavior, which is mildly clarifying but does not provide significant additional meaning beyond the schema.

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 opens with a specific verb and resource: 'Delete a note from the vault.' It immediately distinguishes this tool from siblings like create_note, update_note, and read_note by saying what operation it performs, and it adds the key distinction between moving to .trash/ and permanent deletion.

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?

The description clearly establishes the context for use: deleting a note. It also explains the default behavior and the condition for hard deletion with permanent=true. However, it does not explicitly name alternatives or state when not to use this tool, so it stops short of full exclusion guidance.

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

get_contextA

Get a structured briefing of the vault's current state. Returns active projects, in-progress work, pending tasks, blockers, failures, recent decisions, recent discoveries, and pinned notes. Call this FIRST in any new session to understand what's going on.

ParametersJSON Schema
NameRequiredDescriptionDefault
hoursNoHow far back to look for recent activity (hours). Default: 48.
project_idNoFocus on a specific project. If omitted, shows all active work.
include_completedNoInclude recently completed tasks in the briefing. Default: true.

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the burden. It clearly communicates that this is a read-only aggregation via 'Get' and discloses the return content (active projects, blockers, decisions, etc.). It does not explicitly say 'does not modify state,' but the verb and return list make the behavioral profile sufficiently transparent.

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?

Three short sentences with no filler: what it returns, what content is included, and when to call it. The timing guidance is front-loaded after the purpose, and every sentence earns its place.

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

Completeness5/5

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

Given no output schema, the description still enumerates the returned briefing categories. All parameters are optional and fully explained in the schema. For an aggregation/overview tool, everything an agent needs to call it appropriately is present.

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 parameters (hours, project_id, include_completed) are fully documented in the schema. The description adds little parameter-specific meaning beyond 'recent activity,' matching the baseline for high schema coverage.

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?

States a specific verb and resource: 'Get a structured briefing of the vault's current state.' It enumerates the contents of the briefing, making it clearly distinct from narrower sibling tools like get_project_status or list_tasks.

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?

Gives explicit when-to-use guidance: 'Call this FIRST in any new session to understand what's going on.' It does not mention when to avoid it or name alternatives, but the context is clear.

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

get_project_statusA

Get rollup status of a project: progress percentage, status breakdown, active agents, overdue tasks, and blockers. Use list_tasks(type: 'project') to find project IDs.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_idYesThe project ID (e.g. 'proj-2026-03-09-abc123'). Use list_tasks(type: 'project') to find project IDs.

TDQS

A4.3/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full behavioral burden. 'Get rollup status' clearly signals a non-mutating read operation, and the description discloses the aggregated output contents. It does not cover edge behaviors like invalid project IDs, but for a simple status lookup this is 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?

The description is two sentences with no filler. The core purpose and output contents are front-loaded, and the practical ID-lookup guidance is appended without redundancy.

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

Completeness5/5

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

For a single-parameter read-only status tool with no output schema, the description is complete: it names the parameter source, documents the lookup path, and enumerates the expected return fields. Nothing an agent needs to correctly invoke and interpret this tool is missing.

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 already provides 100% coverage for the single parameter, including an example format and the note to use list_tasks(type: 'project') to find project IDs. The description repeats the list_tasks guidance but adds no new semantic meaning beyond what the schema already provides, so 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 uses a specific verb and resource: 'Get rollup status of a project', then enumerates exactly what that includes: progress percentage, status breakdown, active agents, overdue tasks, and blockers. This makes it clearly distinct from sibling tools like list_tasks, get_usage_report, and get_context.

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?

The description gives clear actionable context: use this tool when you need rollup project status, and it explicitly tells the agent how to discover project IDs via list_tasks(type: 'project'). It does not name alternatives or exclusions, but the use case is clear enough for a single-purpose read tool.

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

get_usage_reportA

Aggregate token and cost usage across tasks, agents, projects, and time ranges. Returns totals and breakdowns by agent and model.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idNoFilter by task.
to_dateNoEnd date (ISO or YYYY-MM-DD).
agent_idNoFilter by agent.
from_dateNoStart date (ISO or YYYY-MM-DD).
project_idNoFilter by project.

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations provided, the description carries the full disclosure burden. It does disclose the return behavior ('Returns totals and breakdowns by agent and model') and implies a side-effect-free read operation. It omits details like data freshness, empty-result behavior, or permission requirements, but the core behavioral profile of a simple aggregation query is conveyed.

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 with zero filler: the first front-loads the action and scope, the second states the return value. Every clause earns its place, and there is no repetition of schema content.

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?

For a tool with 5 optional parameters, no annotations, and no output schema, the description covers the core invocation semantics: what it aggregates and what it returns. Gaps remain around the default time range when dates are omitted, whether breakdowns are always by both agent and model, and the response format — but these do not block a basic correct invocation.

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 each of the 5 parameters is already documented in the schema, warranting the baseline 3. The description adds mild connective meaning by naming 'tasks, agents, projects, and time ranges' as aggregation dimensions, which maps to the task_id/agent_id/project_id/from_date/to_date filters, but it does not explain interdependencies or defaults.

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 uses a specific verb ('Aggregate') with a clear resource ('token and cost usage'), then specifies the scope ('across tasks, agents, projects, and time ranges') and the return shape ('totals and breakdowns by agent and model'). This clearly positions it as the query/report counterpart to sibling log_usage, so an agent can distinguish them without opening schemas.

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 reporting use case is implied through the aggregation language, and the contrast with sibling log_usage (which records usage) is inferable. However, the description never explicitly states when to use this tool versus alternatives, nor any conditions or exclusions.

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

git_syncA

Git version control for your vault. Actions: 'status' (show changes), 'commit' (stage all + commit), 'pull' (fetch remote changes), 'push' (push to remote), 'sync' (pull+commit+push in one operation), 'log' (commit history), 'diff' (show changes), 'init' (initialize git repo + .gitignore), 'remote_add' (add remote), 'remote_list' (list remotes).

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoFile path for 'diff' action. If omitted, shows all changes.
limitNoNumber of commits to show for 'log' action. Default: 10.
actionYesGit action to perform. 'sync' does pull+commit+push in one operation. 'init' initializes a new git repo with a sensible .gitignore.
messageNoCommit message (for 'commit' and 'sync' actions). Auto-generated if not provided.
remote_urlNoRemote URL (for 'remote_add'). e.g. 'git@github.com:user/vault.git'
remote_nameNoRemote name (for 'remote_add'). Defaults to 'origin'.

TDQS

A4.2/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 behavioral disclosure burden. It does disclose key behaviors: commit stages all changes, sync combines pull+commit+push, init adds a .gitignore, and remote_name defaults to origin. However, it omits side effects and failure modes such as what happens when pull or sync encounters conflicts, whether operations mutate the vault irreversibly, and what authentication or repository-state prerequisites exist.

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 dense, scannable sentence with no filler. Each listed action maps directly to an enum value in the schema, and the 'Git version control for your vault' purpose is front-loaded.

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 multi-action tool with no output schema and no annotations, the description covers all ten actions and their primary parameter semantics well enough to invoke the tool correctly in most cases. The main remaining gaps are return-value formats and conflict/error behavior, but the schema fills in parameter details and the action list is comprehensive.

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%, so the baseline is 3. The description adds genuine value by explaining action-specific parameter usage: path is for diff, limit for log, message for commit/sync, and remote_name/remote_url for remote_add. It also clarifies the combined behavior of 'sync' beyond what the schema alone states.

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 opens with 'Git version control for your vault' and enumerates ten distinct actions with one-line explanations. This makes it unmistakably a multi-action git tool and separates it from the note/task management siblings.

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?

No sibling tool duplicates git functionality, so alternative routing is unnecessary. Instead, the description provides concrete per-action guidance: 'sync' means pull+commit+push, 'diff' takes a path, 'log' takes a limit, and 'commit' auto-generates a message. It lacks explicit 'when not to use' exclusions, but intended usage is clear.

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

list_agentsA

List registered agents. Filter by capability, tag, status, or availability. Shows current workload and capacity for each agent.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoFilter by specialization tag (e.g. 'typescript', 'react').
statusNoFilter by agent status. Default: all.all
capabilityNoFilter by capability (e.g. 'code', 'research'). Only agents with this capability are returned.
available_onlyNoOnly return agents with open task slots (current_tasks < max_concurrent). Default: false.

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It does add useful behavior beyond the name, namely that each result shows current workload and capacity and that filtering by availability is possible. However, it does not explicitly state that this is a read-only operation, whether any registration or permission is required, or whether results are limited or paginated.

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 two short, dense sentences with the primary action front-loaded. Every clause adds information: what is listed, how to narrow the list, and what the output includes. There is no filler or repetition of schema content.

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 optional-parameter list tool, this description is largely complete: it names the resource, the filter options, and the primary output fields. Since there is no output schema, mentioning workload and capacity is valuable. A small gap is the lack of any note about default behavior or result shape beyond those two fields, but this is minor given the simplicity of the operation.

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 four parameters in detail. The description lists filter dimensions like capability, tag, status, and availability, which maps onto the schema, but it adds no additional semantic meaning beyond what the parameter descriptions already provide. 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 opens with a specific verb and resource, 'List registered agents', and immediately adds distinguishing details: the supported filters and the workload/capacity information shown. This clearly separates it from nearby sibling tools like list_tasks or list_vault, and there is no ambiguity about what object it operates on.

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 explains what filters can be applied but gives no guidance on when to choose this tool over related siblings such as suggest_assignee, get_usage_report, or register_agent. There is no mention of use cases, exclusions, or alternatives, so an agent must infer the appropriate context entirely from the tool's name and purpose.

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

list_tasksA

Query tasks by status, priority, type, or assignee. Returns a filtered, sorted list of tasks from the vault's task queue. Use to find available work or monitor progress.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoFilter by tags. Returns tasks that have ALL specified tags.
typeNoFilter by task type. Default: all.all
limitNoMaximum number of tasks to return. Default: 50.
statusNoFilter by status. Default: all.all
projectNoFilter by project ID. Only show tasks belonging to this project.
assigneeNoFilter by assignee. Leave empty to show all.
priorityNoFilter by priority. Default: all.all
unassigned_onlyNoOnly show tasks with no assignee (available for claiming).
exclude_projectsNoExclude project-type tasks from results (show only actionable sub-tasks). Default: false.
include_completedNoInclude completed/failed/cancelled tasks. Default: false (only active + pending).

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 disclosure burden. It signals read-only behavior by saying 'Query' and 'Returns a filtered, sorted list.' However, it omits notable default behaviors such as completed tasks being excluded by default, what the sort order is, and whether tags/assignee filters are exact or partial.

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 efficient sentences front-load the action and result, then provide use cases. There is no filler; every phrase contributes to selection or invocation.

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?

With 10 parameters fully documented in the schema and no output schema, the description supplies the key missing context: the task queue source, read-only intent, and usage scenarios. The main omission is out-of-scope behavioral detail like default active-only filtering and sort ordering, which would strengthen completeness.

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 every parameter having a description, enum, or default, so the baseline is 3. The description adds only high-level filter categories already reflected in the schema and does not repeat detailed parameter semantics.

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 states a specific verb ('Query') and resource ('tasks from the vault's task queue'), and names the filtering dimensions: status, priority, type, or assignee. This clearly distinguishes it from mutation siblings like create_task, update_task, and complete_task.

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?

The description gives concrete usage contexts: 'find available work or monitor progress.' It does not explicitly name alternatives or state when not to use the tool, but the read-only query intent is clear enough to guide selection among the sibling tools.

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

list_vaultA

List files and folders in the vault. Supports recursive listing with depth control. Hidden folders (.obsidian, .trash, .git) are excluded by default.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoFolder path relative to vault root. Defaults to vault root.
maxDepthNoMaximum depth for recursive listing. Default: 5.
notesOnlyNoIf true, only show note files (markdown). Default: false (shows all files and folders).
recursiveNoIf true, list contents recursively. Default: false.

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations provided, the description carries the burden of behavioral disclosure. It usefully reveals that hidden folders (.obsidian, .trash, .git) are excluded by default and that recursion/depth is supported. However, it does not disclose the return format, ordering, path formatting, or whether hidden folders can be included despite the phrase 'by default'.

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 concise sentences front-load the core purpose and then add the most decision-relevant behavior: recursion depth control and hidden-folder exclusion. No wasted words or redundant restatements of parameter names.

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 read-only listing tool, the description plus a fully documented schema cover the main usage decisions: what is listed, recursion behavior, depth limits, note-only filtering, and hidden exclusions. The absence of an output schema makes the missing return-format detail a minor gap, but the overall context is sufficient for correct invocation in most cases.

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 all four parameters are already documented with names, defaults, and descriptions. The description reinforces the recursive/depth ideas but adds no new parameter-level meaning; a baseline of 3 is appropriate since the schema does the heavy lifting.

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 opens with a specific verb and resource: 'List files and folders in the vault.' It further clarifies scope with recursive listing support and hidden-folder exclusions, making it clearly distinct from siblings like read_note (which reads content) and search_vault (which searches).

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 when to use the tool—whenever the vault's file/folder structure is needed, especially with recursion or depth control—but it does not explicitly state when to prefer alternatives such as search_vault or read_note. There are no exclusions or direct comparisons with sibling tools.

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

log_decisionA

Log an architectural or design decision as a structured record. Captures context, rationale, alternatives considered, and consequences. Future agents can find these via get_context to understand WHY things were done.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoTags for categorization (e.g. 'auth', 'architecture', 'performance').
titleYesShort title for the decision (e.g. 'Use JWT over session tokens', 'Adopt Zod for validation').
sourceNoWho made this decision (e.g. 'agent', 'human', 'agent-claude-1').agent
statusNoDecision status. Default: accepted.accepted
contextYesWhat is the situation? What problem are we solving? What constraints exist?
projectNoProject ID this decision relates to.
task_idNoTask ID that prompted this decision.
decisionYesWhat was decided? State the decision clearly and directly.
supersedesNoPath to a previous decision this one supersedes.
alternativesNoWhat other options were considered? Brief description of each.
consequencesNoWhat are the consequences of this decision? Both positive and negative.

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description carries the burden of behavioral disclosure. It does reveal that decisions become persistent structured records and that future agents can find them via get_context, which is valuable. But it does not mention return values, whether entries are append-only, overwrite semantics, or any side effects beyond logging. The core behavior is clear, yet incomplete.

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 two sentences with no redundant phrasing. It front-loads the core action and resource, then adds the key value proposition. Every sentence contributes useful information.

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?

The schema is rich and fully documents all 11 parameters, so the description does not need to repeat field details. It supplies the missing context: why the log exists, what it captures at a high level, and how future agents should retrieve it via get_context. It is sufficient for a single-purpose logging tool, though it does not specify the return value.

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 baseline is 3. The description adds only general thematic alignment—context, rationale, alternatives, consequences—which loosely maps to parameters but adds no new semantic meaning beyond what the schema already documents. It does not clarify formats, defaults, or relationships between fields.

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 a specific verb and resource: 'Log an architectural or design decision as a structured record.' It conveys the substance of the record—context, rationale, alternatives, consequences—which distinguishes it from generic note-taking. It does not explicitly name or contrast with sibling tools like log_discovery, but the focus on WHY things were done gives meaningful differentiation.

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 when to use the tool: when making an architectural or design decision that should be preserved for future context. It also hints at the consumption path via get_context. However, it does not provide explicit guidance about when NOT to use it or how it compares to alternatives such as log_discovery, create_note, or create_task.

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

log_discoveryA

Log a discovery, gotcha, or TIL (Today I Learned) as a structured note. Captures what was found, its impact, and recommendations. Prevents future agents from re-discovering the same things.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoTags for categorization (e.g. 'macos', 'yaml', 'typescript').
titleYesShort title for the discovery (e.g. 'macOS /tmp is a symlink to /private/tmp', 'gray-matter crashes on undefined values').
impactNoHow impactful is this discovery? Critical = breaks things if ignored. Default: medium.medium
sourceNoWho made this discovery (e.g. 'agent', 'human', 'agent-claude-1').agent
contextNoHow was this discovered? What were you doing when you found this?
projectNoProject ID this discovery relates to.
task_idNoTask ID during which this was discovered.
categoryNoType of discovery. Default: gotcha.gotcha
discoveryYesWhat was discovered? State the finding clearly.
related_filesNoFile paths related to this discovery (code files, config files, etc.).
recommendationNoWhat should be done about this? A concrete action or pattern to follow.

TDQS

A3.9/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 burden of explaining behavior. It states that the tool logs a structured note and implies persistence for future agents, but it does not clarify side effects such as whether an existing note is updated, duplicated, or how the note becomes searchable. This is useful but incomplete for a write operation.

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 three tight sentences with no filler. It front-loads the core purpose, then adds the captured value and the motivating benefit, making it easy for an agent to parse quickly.

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?

For an 11-parameter write tool with no annotations and no output schema, the description supplies the essential purpose and value proposition, but it omits expected return behavior, storage semantics, and how logged discoveries can later be found. The schema covers the input fields, but not these operational gaps.

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, so the description does not need to explain parameters. It does echo 'impact' and 'recommendations', which map to schema fields, but it adds no meaning beyond the schema's own detailed parameter descriptions.

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 names a specific action and resource: logging discoveries, gotchas, or TILs as structured notes. It clearly distinguishes this from generic note creation by emphasizing that it captures impact and recommendations and prevents future agents from re-discovering the same things.

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?

The description gives clear context for when to use the tool: whenever an agent or human learns something worth persisting for future work. It does not explicitly name alternatives like create_note or log_decision or state when not to use it, so it falls just short of full guidance.

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

log_usageA

Record token/cost usage for a task or agent. Stores structured usage records in the Usage/ folder. Optionally appends usage summary to the task's Agent Log.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelNoLLM model used.
notesNoFree-text notes about this usage record.
task_idNoTask this usage is for.
agent_idYesWhich agent is reporting usage.
cost_usdNoEstimated cost in USD.
project_idNoProject this usage is for.
input_tokensYesInput tokens consumed.
output_tokensYesOutput tokens consumed.
duration_secondsNoHow long the operation took in seconds.

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of disclosing behavior. It explicitly states that records are stored ('Stores structured usage records in the Usage/ folder') and that the tool may append to the Agent Log. This is meaningful transparency about persistence and side effects, though it does not cover permissions, overwrite behavior, or error cases.

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 with no filler. The main action is front-loaded ('Record token/cost usage'), followed by the storage location and optional side effect. Every clause carries useful information.

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 straightforward logging tool with 100% schema coverage, the description conveys the essential behavior: what is recorded, where it is stored, and the optional side effect. It lacks any mention of return value or failure modes, but no output schema exists and the operation is simple enough that an agent can reasonably infer behavior. Slightly more detail on prerequisites would push it to a 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?

Schema description coverage is 100%, so all nine parameters already have descriptions in the input schema. The tool description mentions 'token/cost usage' and 'task or agent', which loosely maps to input_tokens/output_tokens/cost_usd and task_id/agent_id, but it adds no detail beyond the schema. 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 opens with a specific verb and resource: 'Record token/cost usage for a task or agent.' It clearly distinguishes this logging tool from siblings like get_usage_report (reading usage) and log_decision (recording decisions) by naming the exact data captured and the storage target ('Usage/ folder').

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?

The description clearly states the context of use: whenever token/cost usage needs to be recorded for a task or agent. It also mentions an optional side effect ('appends usage summary to the task's Agent Log'), which helps an agent decide whether this tool is appropriate. However, it does not explicitly name alternatives or exclusion conditions, so it misses the top score.

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

manage_tagsA

Read, add, or remove tags on a note. Tags are managed in YAML frontmatter. Also reads inline #tags from the note content. Handles deduplication automatically.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesPath to the note, relative to vault root.
tagsNoTags to add or remove (without leading #). Required for 'add' and 'remove' actions.
actionYes'list' to view tags, 'add' to add tags, 'remove' to remove tags.

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations, the description carries the disclosure burden. It usefully discloses YAML frontmatter as the source of truth, inline tag reading, and automatic deduplication. However, it leaves ambiguous whether add/remove affects inline tags as well as frontmatter, and does not describe side effects or failure behavior for a tool that mutates notes.

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?

Three short sentences, each carrying distinct information: operation scope, storage mechanism, inline-tag behavior, and deduplication. It is front-loaded with the purpose and contains no filler.

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?

For a simple 3-parameter tool the schema covers parameters well, but with no annotations and no output schema the description omits what a caller should expect on 'list' (e.g., combined frontmatter+inline tags) and whether mutations rewrite only frontmatter. This is usable but not fully complete.

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?

All three parameters are already fully described in the schema (100% coverage), so the description adds little parameter-level detail. The YAML/inline/deduplication context enriches meaning but is not needed to interpret individual parameters.

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 opens with a specific verb set — read, add, remove — and a clear resource (tags on a note). It further pinpoints the tag storage location (YAML frontmatter) and that inline #tags are also read, which separates it from generic note read/update siblings.

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 intended use is implied by the action list, but there are no explicit statements about when to choose manage_tags over read_note/update_note, nor any exclusions such as 'for full note edits use update_note'. An agent can infer the niche but is not guided toward the right alternative.

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

read_noteA

Read a note's content, frontmatter, tags, and metadata from the vault. Returns parsed frontmatter, markdown content, tags (from frontmatter and inline), and file stats.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesPath to the note relative to vault root (e.g. 'Projects/my-note.md'). Extension .md is added automatically if missing.
includeRawNoIf true, include the raw unparsed content in the response.

TDQS

A3.9/5.0
Behavior3/5

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

There are no annotations, so the description carries the behavioral disclosure burden. It discloses that the operation is a read and lists returned data categories (parsed frontmatter, markdown content, tags, file stats), which communicates non-destructive behavior and output scope. It does not mention error conditions, permissions, or how missing paths are handled, but for a simple read operation this is a reasonable minimum.

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 short and front-loaded with the action, using two sentences. There is slight redundancy between 'content, frontmatter, tags, and metadata' and 'parsed frontmatter, markdown content, tags... and file stats,' but it remains compact and free of filler.

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 two-parameter read tool with no output schema, the description adequately covers what the agent should expect: parsed frontmatter, markdown content, tags, and file stats. It could add note-level failure behavior or clarification about path resolution, but those are either in the schema or minor for the tool's simplicity.

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 coverage is 100%, and the schema already documents both 'path' and 'includeRaw' with meaningful descriptions. The description adds no parameter-specific guidance beyond the schema; it does reinforce that the output contains parsed content and optional raw content, but this is not substantial added semantic value.

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 begins with a specific verb and resource: 'Read a note's content... from the vault.' It clearly distinguishes itself from siblings like search_vault, create_note, update_note, and delete_note by stating it retrieves an existing note's details. It also specifies what is returned, making the tool's purpose unmistakable.

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?

The description clearly implies this tool is for reading a specific note's content and metadata by path, which gives an agent clear context for when to invoke it. It does not explicitly mention alternatives or exclusions, such as 'use search_vault to find notes first,' so it stops short of full guidance, but the read vs. search vs. write distinction is inferable.

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

register_agentA

Register an agent with capabilities, tags, and capacity. Creates or updates an agent profile in the Agents/ folder. Used for capability-based task routing.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoSpecialization tags (e.g. ['typescript', 'react', 'database']).
modelNoLLM model name powering this agent (e.g. 'claude-opus-4-6', 'gpt-4o').
agent_idYesUnique identifier for the agent (e.g. 'claude-code-1', 'research-agent').
descriptionNoHuman-readable description of what this agent does.
capabilitiesNoTask types this agent can handle (e.g. ['code', 'research', 'writing']).
max_concurrentNoMaximum number of parallel tasks this agent can handle. Default: 3.

TDQS

A4/5.0
Behavior3/5

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

With no annotations available, the description carries the full burden of behavioral disclosure. It explicitly states the key side effect: 'Creates or updates an agent profile in the Agents/ folder.' However, it does not clarify whether updates merge or replace existing fields, what permissions are needed, or what the tool returns after invocation.

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?

Three short, purposeful sentences: the first states the core action, the second adds the upsert and storage location, and the third gives the intended use. No filler or redundant phrasing.

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?

The description gives enough context for a typical registration call: what the tool does, where it stores profiles, and why it exists. It could be more complete by describing overwrite semantics or return values, but the schema covers parameters well and the stated purpose is sufficient for most invocation scenarios.

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 already documents all 6 parameters with high coverage, so the baseline is 3. The description adds minimal semantic value beyond echoing the concepts of capabilities, tags, and capacity. It correctly groups the most relevant parameters but does not explain them in more depth than the schema.

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 uses a specific verb ('Register') with a clear resource ('agent profile') and names the relevant fields (capabilities, tags, capacity). It further clarifies the operation as an upsert ('Creates or updates') and distinguishes itself from siblings like list_agents or suggest_assignee by focusing on agent registration.

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?

The phrase 'Used for capability-based task routing' gives a clear functional context for when this tool is appropriate. It does not explicitly mention alternatives or when not to use it, but the context is strong enough for an agent to infer the primary use case.

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

review_taskA

Approve or reject a task in needs_review status. Used by humans to gate high-risk work. Approve sends to completed and unblocks dependents. Reject sends to revision_requested.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesReview action: 'approve' to complete the task, 'reject' or 'request_changes' to send it back for revision.
task_idYesThe task ID to review (e.g. 'task-2026-03-09-abc123').
feedbackNoReviewer feedback. Required for 'reject' and 'request_changes' actions.
reviewerNoWho is performing the review (e.g. 'human', 'lead-dev').

TDQS

A4.1/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral disclosure burden. It does disclose meaningful state transitions: approve sends to completed and unblocks dependents, reject sends to revision_requested. However, it omits the behavior of the schema's 'request_changes' action, feedback requirements, and any idempotency or reversibility notes.

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 three concise sentences with no filler. The key action and status precondition are front-loaded, and every sentence contributes either scope, usage context, or state-transition behavior.

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 no annotations and no output schema, the description covers the main invocation context and critical state outcomes. It is not fully complete: the 'request_changes' action is omitted, feedback requirements are not mentioned, and the response/return behavior is not described. Overall, it is adequate but has clear gaps.

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 description coverage is 100%, so the baseline is 3. The description adds value beyond the schema by explaining that approve unblocks dependents and reject moves the task to revision_requested, enriching the action enum semantics. Feedback and reviewer parameters remain schema-only, but this is acceptable given full schema coverage.

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 uses a specific verb and resource: 'Approve or reject a task in needs_review status.' It also adds the human-gating context, which distinguishes this tool from sibling automation-oriented tools like complete_task. The core purpose is unambiguous, even though the schema's third action 'request_changes' is not named in the description.

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?

The description clearly states the precondition ('task in needs_review status') and the intended usage context ('Used by humans to gate high-risk work'). It does not explicitly name alternatives or state when not to use this tool, so it stops short of full usage guidance.

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

search_vaultA

Full-text search across all notes in the vault. Supports plain text and regex patterns. Returns matching files with line numbers and context. Can filter by folder.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch query. Plain text by default; set regex=true for regular expressions.
regexNoTreat the query as a regular expression.
folderNoLimit search to a specific folder (relative to vault root).
maxResultsNoMaximum number of matching files to return. Default: 20.
caseSensitiveNoWhether the search is case-sensitive. Default: false.

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations provided, the description carries the burden of behavioral disclosure. It discloses the return format (matching files with line numbers and context), regex support, and folder filtering. It does not mention limitations like default result caps, case sensitivity behavior, or whether the search is read-only, though these are partially present in the schema.

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 three short sentences with no filler. The primary purpose is front-loaded, followed by useful capabilities and return format. Every sentence contributes value.

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 search tool with five parameters and no output schema, the description covers the essential behavior and return information. It does not explain result limits or case sensitivity, but those are documented in the schema. The description is sufficient for an agent to know what to expect from the tool.

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 baseline is 3. The description adds brief context for the folder and regex parameters, but it does not meaningfully expand on query semantics or the maxResults/caseSensitive parameters beyond what the schema already states.

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 a specific action (full-text search), a resource (all notes in the vault), and key capabilities (plain text, regex, filtering by folder). It distinguishes itself from sibling read/list tools by emphasizing search-plus-context, though it does not explicitly name an alternative.

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 when to use the tool: when you need to find matching notes by content, especially with regex or folder scoping. However, it gives no explicit guidance about when not to use it or how it compares to list_vault, read_note, or other discovery tools.

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

suggest_assigneeA

Given a task ID, suggest the best agents to assign based on capability match, tag overlap, availability, and success rate. Returns ranked suggestions.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYesThe task ID to find suitable agents for (e.g. 'task-2026-03-09-abc123').

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are provided, so the description must carry the disclosure burden. It clearly indicates the tool analyzes a task and returns suggestions, which implies a non-mutating behavior. However, it does not state whether this is read-only, whether agents need to be pre-registered, or how availability and success rate are determined.

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?

A single, information-dense sentence that front-loads the core behavior and criteria, then states the output. Every clause earns its place and there is no filler.

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 low-complexity single-parameter tool with no output schema, the description is reasonably complete: it states the input, the ranking criteria, and that output is ranked suggestions. It could add more detail about the suggestion result shape or failure conditions, but these are minor gaps.

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% and the task_id parameter is already documented with a type and an example. The tool description adds no new parameter-level meaning, so it stays at the baseline 3 without compounding value.

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?

States a specific verb ('suggest'), a clear resource (agents for a task ID), and explicit selection criteria ('capability match, tag overlap, availability, and success rate'). It also names the return value ('ranked suggestions'), and this clearly differentiates it from siblings like list_agents.

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 phrase 'Given a task ID' and the verb 'assign' imply the intended use case: when an agent needs to decide who should handle a task. However, there is no explicit guidance about when to prefer this over list_agents, claim_task, or update_task, and no exclusions or alternative recommendations.

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

update_noteA

Update an existing note. Supports three modes: 'replace' (overwrite body), 'append' (add to end), or 'prepend' (add to beginning). Can also merge new frontmatter fields into existing frontmatter.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoHow to apply the content: 'replace' overwrites the body, 'append' adds to end, 'prepend' adds to beginning. Default: replace.replace
pathYesPath to the note to update, relative to vault root.
contentNoNew content for the note body. Behavior depends on 'mode'.
frontmatterNoFrontmatter fields to merge into the existing frontmatter. Existing fields not specified here are preserved.

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It does explain the three modes and that frontmatter fields are merged, but it does not address edge behavior such as handling missing notes, whether replace mode preserves frontmatter when the frontmatter parameter is omitted, or what the return value indicates.

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 concise sentences with the core action and modes front-loaded, followed by the frontmatter behavior. Every sentence carries meaningful information with no filler or repetition.

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?

The combination of the description and the detailed schema gives an agent the essentials: required path, mode semantics, content behavior, and frontmatter merging. The lack of an output schema and annotations leaves some gaps around return values and error cases, but the tool is simple enough that the core calling contract is substantially complete.

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%, and the schema already documents mode behavior, path, content, and frontmatter merge semantics in detail. The description mostly restates what the schema provides, so it adds little parameter-level value beyond the structured definitions.

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 states a specific verb ('Update'), a resource ('an existing note'), and explicitly enumerates the supported modes and frontmatter merging behavior. This clearly distinguishes it from siblings like create_note, read_note, and delete_note.

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 phrase 'an existing note' implies this tool is for modifying notes that already exist, giving some usage context. However, it does not explicitly state when to prefer update_note over create_note for missing notes, or over manage_tags/search_vault for related operations, leaving alternatives to inference.

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

update_taskA

Update a task's status, priority, type, or assignee. Append progress entries to the Agent Log. Validates status transitions (e.g. cannot go from 'pending' to 'completed' — must claim first). Use this to move tasks through the workflow.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoNew task type.
scopeNoUpdate the advisory scope (file paths this task intends to modify).
statusNoNew status. Use claim_task for claiming and complete_task for completing/failing.
task_idYesThe task ID to update (e.g. 'task-2026-03-09-abc123').
assigneeNoUpdate the assignee. Set to empty string to unassign.
priorityNoNew priority for the task.
log_entryNoAppend a progress update to the Agent Log section. Timestamped automatically.
depends_onNoUpdate the dependency list.

TDQS

A4/5.0
Behavior4/5

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

With no annotations provided, the description carries the behavioral burden. It discloses important behavior: updates target specific fields, appends Agent Log entries, and validates status transitions. It does not mention error responses, reversibility, or permissions, but the disclosed validation behavior is meaningful beyond a generic update description.

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 concise, front-loaded with the core action, and uses only three sentences. Each sentence adds value: what can be updated, what side effects occur, and when to use the tool.

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 mutation tool with no annotations and no output schema, the description covers the main fields, the Agent Log side effect, and important validation constraints. It does not mention the scope or depends_on parameters, though those are fully covered in the input schema. The omission of explicit return/error behavior is a minor gap given schema richness.

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 coverage is 100%, so the schema already documents all eight parameters. The description mentions several fields but adds little semantic detail beyond what the parameter descriptions already provide; the log append behavior is already reflected in the log_entry parameter description.

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 states a specific action—'Update a task's status, priority, type, or assignee'—and identifies the resource. It also mentions log appending and workflow progression, but it does not explicitly name sibling tools like claim_task or complete_task, so the differentiation is clear but not fully explicit.

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?

The description gives clear context: 'Use this to move tasks through the workflow' and includes an example of valid vs invalid status transitions. It implies the need to claim tasks before completing them, but it does not explicitly state when to prefer claim_task or complete_task over this tool.

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. 27 tool updatesv0.4.0
    • First observedcheck_timeouts
    • First observedclaim_task
    • First observedcomplete_task
    • First observedcreate_note
    • First observedcreate_project
    • First observedcreate_task
    • First observeddaily_note
    • First observeddelete_note
    • First observedget_context
    • First observedget_project_status
    • First observedget_usage_report
    • First observedgit_sync
    • First observedlist_agents
    • First observedlist_tasks
    • First observedlist_vault
    • First observedlog_decision
    • First observedlog_discovery
    • First observedlog_usage
    • First observedmanage_tags
    • First observedread_note
    • First observedregister_agent
    • First observedreview_task
    • First observedsearch_vault
    • First observedsuggest_assignee
    • First observedupdate_note
    • First observedupdate_task
    • First observedwikilinks

TDQS

A3.6/5.0

Scored across 27 tools

Disambiguation4/5

Most tools target a distinct resource and action (notes, tasks, agents, usage, git), so boundaries are generally clear. Minor overlap exists between log_discovery/log_decision and manage_tags/update_note, but descriptions make the intended use recognizable.

Naming Consistency4/5

The overwhelming majority of tools follow a clean verb_noun pattern (create_note, list_tasks, get_usage_report, complete_task). The exceptions are daily_note, git_sync, and wikilinks, which break the pattern but are still readable and predictable.

Tool Count2/5

At 27 tools, this exceeds the 25-tool threshold and feels overloaded for a single MCP server. The server combines note management, task/project management, agent routing, usage tracking, and git operations, which would be better split into separate focused servers.

Completeness4/5

Notes have full CRUD plus search, tags, wikilinks, daily notes, and git sync, while tasks cover create, claim, update, complete, review, timeouts, and project rollups. Notable gaps include no get_task/delete_task, no update/delete_project, and no explicit agent deactivation, but agents can work around these.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to interact with Obsidian vaults through direct filesystem access, supporting note management, lightning-fast search with SQLite indexing, image analysis, tag/link management, and bulk operations.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to interact with Obsidian vaults via direct filesystem access for managing notes, folders, and metadata. It features advanced search capabilities and multi-layer caching to provide efficient, real-time access to your personal knowledge base.
    2,778 npm
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI agents to store and retrieve project context, bugs, decisions, and session logs by reading and appending markdown files in a local Obsidian vault, without requiring any cloud services.
    6
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to securely read and write to an Obsidian-compatible Markdown vault with per-agent access control, audit logging, and conflict resolution.
    Apache 2.0