mcp-obsidian-vault
Enables git version control operations on the vault, including commit, pull, push, and automatic syncing after writes.
Allows remote syncing of the vault to GitHub repositories via git integration.
Allows remote syncing of the vault to GitLab repositories via git integration.
Provides direct filesystem access to an Obsidian vault, enabling AI agents to read, create, update, and delete notes, manage tasks, persist context, and sync with git.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-obsidian-vaultList all high priority tasks in my vault."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp-obsidian-vault
Turn your Obsidian vault into an AI command center.
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-vaultRelated 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:#fffFeatures
Vault Management
Feature | Description |
CRUD Notes | Read, create, update, delete with full YAML frontmatter support |
Wikilinks | Resolve |
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 — |
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 |
Project Management | Create projects with sub-tasks, track rollup progress |
Append Mode | Add new sub-tasks to existing projects with |
Conditional Workflows | Routing rules: branch task execution based on output (v0.3) |
Auto Dashboard |
|
Human-in-the-Loop (v0.3)
Feature | Description |
Review Gates | Tasks with |
Approve / Reject |
|
Feedback Loop | Rejected tasks enter |
Risk Levels | Tag tasks as |
Agent Management (v0.3)
Feature | Description |
Agent Registry | Register agents with capabilities, tags, and model info |
Capability Routing |
|
Timeout Detection |
|
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 |
|
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-vaultThen 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-vaultAdd 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.jsUpdating
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-cacheFrom source:
git pull origin main
npm install && npm run buildCheck 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 obsidianRemove 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-cacherm -rf obsidian-mcp-serverYour 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 blockedSave 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 priorityDaily 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 contentpath: "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 deletequery: "meeting notes"
regex: false
caseSensitive: false
folder: "Projects" # limit to subfolder
maxResults: 20path: "Projects" # defaults to vault root
recursive: true
maxDepth: 5
notesOnly: false # true to filter to .md files onlypath: "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 |
| Find the file a |
| Find all notes that link TO a given note |
| List all |
| Find all broken |
action: "sync" # full pull + commit + push
message: "update notes" # optional commit messageAction | Description |
| Working tree status |
| Stage all + commit |
| Pull from remote (rebase by default) |
| Push to remote |
| Pull + commit + push in one call |
| Recent commit history |
| Uncommitted changes |
| Initialize git repo with |
| Add a git remote |
| 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: 120status: "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 projecttask_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" # optionalBlocks if dependencies aren't met. Two agents claiming the same task → 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 → 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: trueReturns: 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_changesOn 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: 3Creates/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_concurrenttask_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 changesScans all claimed/in_progress tasks for timeout_minutes violations. For overdue tasks:
If
retry_count < max_retries: resets topendingfor retryIf retries exhausted +
escalate_toset: marks as escalatedReturns 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" # optionalReturns: 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.mdMulti-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:#fffAppend 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:#fffcreate_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
Claim a task with worktree metadata — when an agent claims a task, it records the branch and worktree path
Work in isolation — each agent works in its own directory on its own branch
Vault tracks everything —
get_contextshows which agents are on which branches,list_tasksincludes worktree infoComplete and PR — when done,
complete_tasktells you the branch is ready for a pull request
With Claude Code (Recommended)
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-apiget_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:#fffContext-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 mergedSetup
Laptop — set
GIT_AUTO_SYNC=truewith a private GitHub repoPhone (iOS) — Obsidian Git plugin or Working Copy
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 |
| 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 taskExample 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.tsA 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 |
| Find, claim, complete tasks | Spawning a coding agent |
| Plan projects, decompose work, monitor | Orchestrating multi-agent work |
| 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 |
| Absolute path to your vault |
Vault
Variable | Default | Description |
|
| Subfolder for daily notes |
|
| Move to |
|
| Max file size (10 MB) |
|
| Max search results |
|
| Search timeout |
|
| Note file extensions |
|
| Task notes subfolder |
|
| Decision records subfolder |
|
| Discovery notes subfolder |
|
| Agent profile notes subfolder |
|
| Token usage records subfolder |
Git
Variable | Default | Description |
|
| Auto commit + push after every write |
|
| Debounce interval |
|
| Auto-commit message prefix |
|
| Default remote |
|
| Default branch |
|
| Git operation timeout |
|
| Use |
Webhooks
Variable | Default | Description |
| — | Comma-separated webhook URLs for task event notifications |
| — | HMAC-SHA256 secret for signing webhook payloads |
|
| Webhook HTTP request timeout |
Security
Path traversal prevention — all paths validated against vault root, including symlink resolution
No shell injection — git commands use
execFile(notexec)Atomic writes — temp file + rename prevents partial writes on crash
Overwrite protection —
create_notefails if note exists unless explicitly overriddenTrash 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 tasks —
update_task(status: "pending")clears assignee, incrementsretry_countUnclaim stuck tasks — reclaim tasks from crashed agents
Timeout detection —
list_tasksflags tasks pasttimeout_minuteswithis_overdue: trueDependency validation — warns on nonexistent
depends_onreferencesDashboard health — all mutation responses include
dashboard_refreshedstatus
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 advisory —
scope[]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 callcheck_timeoutsperiodically.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 testsDevelopment
npm install
npm run build # TypeScript → build/
npm test # 375 integration tests
npm run dev # tsc --watchContributing
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 passDevelopment Workflow
Create a branch from
main:git checkout -b feat/your-featureMake your changes. Each tool lives in its own file under
src/tools/. The pattern is consistent — look at any existing tool for the structure.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.Build and test:
npm run build && npm testPush 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
anyunless absolutely necessary.One file per tool in
src/tools/. Exportschemaandhandler.Every handler wrapped in
safeToolHandler()(fromsrc/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.tmpfile then renames.Strip
undefined— never putundefinedvalues in frontmatter objects.serializeNotestrips them automatically, but avoid creating them upstream when possible.
Adding a New Tool
Create
src/tools/your-tool.tswith exportedschemaandhandlerRegister it in
src/index.ts(follow the existing pattern)Add integration tests in
test/run.mjsUpdate the tool count in
README.mdandpackage.jsondescription if applicable
Gotchas
macOS
/tmpis a symlink to/private/tmp— always resolve paths withrealpathSyncgray-matter crashes on
undefinedvalues in YAML —serializeNotehandles this, but be awarerouting_rules[].deactivate— omit the key entirely rather than setting toundefinedWindows path separators — use
split(/[/\\]/)notsplit("/")opencode has no
envfield in MCP config — must usesh -cwith inline env vars
Releases
Releases are automated. When a PR is merged to main with a version bump in package.json, CI automatically:
Detects the version change
Runs the full test matrix
Publishes to npm
Creates a GitHub Release
No manual publish steps needed. Just bump the version in your PR.
License
MIT
Available Tools
27 toolscheck_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.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | If true, report what would happen without making changes. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | The task ID to claim (e.g. 'task-2026-03-09-abc123'). | |
| assignee | Yes | Identifier for the agent claiming this task (e.g. 'claude-code-1', 'agent-research'). | |
| worktree_path | No | Filesystem path to the worktree directory (e.g. '/repo/.claude/worktrees/feature-auth'). | |
| worktree_branch | No | Git branch name for this agent's worktree (e.g. 'worktree-feature-auth'). Used to track parallel work across agents. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Terminal status. Usually 'completed', but use 'failed' or 'cancelled' if the task couldn't be done. | completed |
| summary | Yes | Summary of what was accomplished. Appended to the Agent Log. | |
| task_id | Yes | The task ID to complete (e.g. 'task-2026-03-09-abc123'). | |
| deliverables | No | Paths to files created/modified, or URLs to PRs, docs, etc. Added to a Deliverables section. | |
| error_reason | No | If status is 'failed', explain what went wrong. Helps future agents retry. |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path 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. | |
| content | Yes | Markdown content for the note body. | |
| overwrite | No | If true, overwrite an existing note at this path. Default is false (fails if note exists). | |
| frontmatter | No | Optional YAML frontmatter as a JSON object (e.g. { title: 'My Note', tags: ['idea', 'project'] }). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| due | No | Optional deadline for the whole project (YYYY-MM-DD). | |
| tags | No | Tags applied to the project and all sub-tasks. | |
| tasks | Yes | Array 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. | |
| title | No | Project title (e.g. 'Auth Rewrite', 'API v2 Migration'). Required for new projects. | |
| source | No | Where this project came from. | manual |
| priority | No | Default priority for the project and its tasks (individual tasks can override). | medium |
| project_id | No | Append 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. | |
| description | No | Project description with goals, context, and constraints. Required for new projects. | |
| context_notes | No | Vault notes that provide context for the entire project. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| due | No | Optional deadline in YYYY-MM-DD format. | |
| tags | No | Tags for categorization. | |
| type | No | Type of work. Helps agents decide if they can handle it. | other |
| scope | No | Advisory: file paths this task intends to modify. Not enforced — agents should respect this to avoid conflicts. | |
| title | Yes | Short, descriptive title for the task. | |
| source | No | Where this task came from (e.g. 'manual', 'github-issue-42', 'agent-spawned'). | manual |
| project | No | Project ID to attach this task to (e.g. 'proj-2026-03-09-abc123'). Task will appear in get_project_status rollups. | |
| assignee | No | Optionally pre-assign to a specific agent. | |
| priority | No | Task priority. Default: medium. | medium |
| reviewer | No | Who should review this task (optional). | |
| depends_on | No | Task IDs that must complete before this task can start. | |
| risk_level | No | Risk level. High/critical tasks auto-require review on completion. | |
| description | Yes | Detailed description of what needs to be done. Include context, constraints, and links to relevant notes. | |
| escalate_to | No | Agent ID or 'human' to escalate to after max_retries exhausted. | |
| max_retries | No | Max auto-retries on failure. 0 = no auto-retry (default). | |
| parent_task | No | ID of the parent task, if this is a sub-task. | |
| context_notes | No | Paths to vault notes that provide context for this task (e.g. 'Projects/my-api'). | |
| routing_rules | No | Conditional workflow rules. When this task completes, evaluate rules against output to selectively unblock/cancel dependents. | |
| review_required | No | If true, complete_task sends to needs_review instead of completed. Human must approve. | |
| timeout_minutes | No | Max time in minutes before an agent is considered stuck. Default: 60. | |
| acceptance_criteria | No | List of criteria that must be met for the task to be considered complete. | |
| retry_delay_minutes | No | Minutes to wait between retries. Default: 5. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date for the daily note. Accepts 'today', 'yesterday', 'tomorrow', or a date string like '2025-03-08'. Defaults to 'today'. | |
| action | Yes | 'get' to read, 'create' to create/overwrite, 'append' to add content to existing. | |
| content | No | Content for the daily note. Required for 'create' and 'append' actions. | |
| frontmatter | No | Optional frontmatter for the note (only used with 'create' action). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the note to delete, relative to vault root. | |
| permanent | No | If true, permanently delete the file instead of moving to .trash/. Default is false (moves to trash). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | How far back to look for recent activity (hours). Default: 48. | |
| project_id | No | Focus on a specific project. If omitted, shows all active work. | |
| include_completed | No | Include recently completed tasks in the briefing. Default: true. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | The project ID (e.g. 'proj-2026-03-09-abc123'). Use list_tasks(type: 'project') to find project IDs. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | No | Filter by task. | |
| to_date | No | End date (ISO or YYYY-MM-DD). | |
| agent_id | No | Filter by agent. | |
| from_date | No | Start date (ISO or YYYY-MM-DD). | |
| project_id | No | Filter by project. |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | File path for 'diff' action. If omitted, shows all changes. | |
| limit | No | Number of commits to show for 'log' action. Default: 10. | |
| action | Yes | Git action to perform. 'sync' does pull+commit+push in one operation. 'init' initializes a new git repo with a sensible .gitignore. | |
| message | No | Commit message (for 'commit' and 'sync' actions). Auto-generated if not provided. | |
| remote_url | No | Remote URL (for 'remote_add'). e.g. 'git@github.com:user/vault.git' | |
| remote_name | No | Remote name (for 'remote_add'). Defaults to 'origin'. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Filter by specialization tag (e.g. 'typescript', 'react'). | |
| status | No | Filter by agent status. Default: all. | all |
| capability | No | Filter by capability (e.g. 'code', 'research'). Only agents with this capability are returned. | |
| available_only | No | Only return agents with open task slots (current_tasks < max_concurrent). Default: false. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Filter by tags. Returns tasks that have ALL specified tags. | |
| type | No | Filter by task type. Default: all. | all |
| limit | No | Maximum number of tasks to return. Default: 50. | |
| status | No | Filter by status. Default: all. | all |
| project | No | Filter by project ID. Only show tasks belonging to this project. | |
| assignee | No | Filter by assignee. Leave empty to show all. | |
| priority | No | Filter by priority. Default: all. | all |
| unassigned_only | No | Only show tasks with no assignee (available for claiming). | |
| exclude_projects | No | Exclude project-type tasks from results (show only actionable sub-tasks). Default: false. | |
| include_completed | No | Include completed/failed/cancelled tasks. Default: false (only active + pending). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Folder path relative to vault root. Defaults to vault root. | |
| maxDepth | No | Maximum depth for recursive listing. Default: 5. | |
| notesOnly | No | If true, only show note files (markdown). Default: false (shows all files and folders). | |
| recursive | No | If true, list contents recursively. Default: false. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Tags for categorization (e.g. 'auth', 'architecture', 'performance'). | |
| title | Yes | Short title for the decision (e.g. 'Use JWT over session tokens', 'Adopt Zod for validation'). | |
| source | No | Who made this decision (e.g. 'agent', 'human', 'agent-claude-1'). | agent |
| status | No | Decision status. Default: accepted. | accepted |
| context | Yes | What is the situation? What problem are we solving? What constraints exist? | |
| project | No | Project ID this decision relates to. | |
| task_id | No | Task ID that prompted this decision. | |
| decision | Yes | What was decided? State the decision clearly and directly. | |
| supersedes | No | Path to a previous decision this one supersedes. | |
| alternatives | No | What other options were considered? Brief description of each. | |
| consequences | No | What are the consequences of this decision? Both positive and negative. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Tags for categorization (e.g. 'macos', 'yaml', 'typescript'). | |
| title | Yes | Short title for the discovery (e.g. 'macOS /tmp is a symlink to /private/tmp', 'gray-matter crashes on undefined values'). | |
| impact | No | How impactful is this discovery? Critical = breaks things if ignored. Default: medium. | medium |
| source | No | Who made this discovery (e.g. 'agent', 'human', 'agent-claude-1'). | agent |
| context | No | How was this discovered? What were you doing when you found this? | |
| project | No | Project ID this discovery relates to. | |
| task_id | No | Task ID during which this was discovered. | |
| category | No | Type of discovery. Default: gotcha. | gotcha |
| discovery | Yes | What was discovered? State the finding clearly. | |
| related_files | No | File paths related to this discovery (code files, config files, etc.). | |
| recommendation | No | What should be done about this? A concrete action or pattern to follow. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | LLM model used. | |
| notes | No | Free-text notes about this usage record. | |
| task_id | No | Task this usage is for. | |
| agent_id | Yes | Which agent is reporting usage. | |
| cost_usd | No | Estimated cost in USD. | |
| project_id | No | Project this usage is for. | |
| input_tokens | Yes | Input tokens consumed. | |
| output_tokens | Yes | Output tokens consumed. | |
| duration_seconds | No | How long the operation took in seconds. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the note, relative to vault root. | |
| tags | No | Tags to add or remove (without leading #). Required for 'add' and 'remove' actions. | |
| action | Yes | 'list' to view tags, 'add' to add tags, 'remove' to remove tags. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the note relative to vault root (e.g. 'Projects/my-note.md'). Extension .md is added automatically if missing. | |
| includeRaw | No | If true, include the raw unparsed content in the response. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Specialization tags (e.g. ['typescript', 'react', 'database']). | |
| model | No | LLM model name powering this agent (e.g. 'claude-opus-4-6', 'gpt-4o'). | |
| agent_id | Yes | Unique identifier for the agent (e.g. 'claude-code-1', 'research-agent'). | |
| description | No | Human-readable description of what this agent does. | |
| capabilities | No | Task types this agent can handle (e.g. ['code', 'research', 'writing']). | |
| max_concurrent | No | Maximum number of parallel tasks this agent can handle. Default: 3. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Review action: 'approve' to complete the task, 'reject' or 'request_changes' to send it back for revision. | |
| task_id | Yes | The task ID to review (e.g. 'task-2026-03-09-abc123'). | |
| feedback | No | Reviewer feedback. Required for 'reject' and 'request_changes' actions. | |
| reviewer | No | Who is performing the review (e.g. 'human', 'lead-dev'). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query. Plain text by default; set regex=true for regular expressions. | |
| regex | No | Treat the query as a regular expression. | |
| folder | No | Limit search to a specific folder (relative to vault root). | |
| maxResults | No | Maximum number of matching files to return. Default: 20. | |
| caseSensitive | No | Whether the search is case-sensitive. Default: false. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | The task ID to find suitable agents for (e.g. 'task-2026-03-09-abc123'). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | How to apply the content: 'replace' overwrites the body, 'append' adds to end, 'prepend' adds to beginning. Default: replace. | replace |
| path | Yes | Path to the note to update, relative to vault root. | |
| content | No | New content for the note body. Behavior depends on 'mode'. | |
| frontmatter | No | Frontmatter fields to merge into the existing frontmatter. Existing fields not specified here are preserved. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | New task type. | |
| scope | No | Update the advisory scope (file paths this task intends to modify). | |
| status | No | New status. Use claim_task for claiming and complete_task for completing/failing. | |
| task_id | Yes | The task ID to update (e.g. 'task-2026-03-09-abc123'). | |
| assignee | No | Update the assignee. Set to empty string to unassign. | |
| priority | No | New priority for the task. | |
| log_entry | No | Append a progress update to the Agent Log section. Timestamped automatically. | |
| depends_on | No | Update the dependency list. |
TDQS
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.
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.
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.
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.
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.
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.
wikilinksA
Navigate Obsidian [[wikilinks]]. Actions: 'resolve' (find file a wikilink points to), 'backlinks' (find all notes linking to a note), 'outlinks' (list all links from a note), 'unresolved' (find broken wikilinks across the vault). Supports [[note]], [[note|alias]], [[note#heading]], and [[note#^blockid]] syntax.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Note path (for 'backlinks' and 'outlinks' actions). For 'resolve', this is the wikilink target to resolve (e.g. 'My Note'). | |
| limit | No | Maximum number of results. Default: 50. | |
| action | Yes | 'resolve' — find the file a [[wikilink]] points to. 'backlinks' — find all notes linking to a given note. 'outlinks' — list all wikilinks in a note. 'unresolved' — find all wikilinks in the vault that don't point to existing notes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It does a good job by specifying the four operational modes and the exact supported wikilink syntax variants (alias, heading, blockid). It does not explicitly state that operations are read-only or describe return shape, but the navigation framing and action definitions strongly imply no side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it opens with the resource, then enumerates all actions, and closes with syntax support. Every sentence adds useful information and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-action navigation tool with no output schema, the description covers all actions, the parameter roles, and the supported link syntax comprehensively. It stops short of describing return formats or error behavior, but these are minor given how clearly the actions define what will be found or listed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful context beyond the schema by documenting the supported wikilink syntax forms. It also reinforces the dual meaning of 'path' across resolve versus backlinks/outlinks, though the schema already captures most parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly names the resource (Obsidian [[wikilinks]]) and enumerates four concrete actions with definitions: resolve, backlinks, outlinks, unresolved. This makes the tool's purpose unambiguous and distinguishes it from sibling tools like search_vault and read_note.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Each action is described with its intended use case, so an agent can pick among the actions. However, the description does not explicitly state when to prefer this tool over sibling tools like search_vault or read_note, and it offers no exclusions or prerequisites. Usage guidance is implied rather than explicit.
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.
27 tool updates
v0.4.0- First observed
check_timeouts - First observed
claim_task - First observed
complete_task - First observed
create_note - First observed
create_project - First observed
create_task - First observed
daily_note - First observed
delete_note - First observed
get_context - First observed
get_project_status - First observed
get_usage_report - First observed
git_sync - First observed
list_agents - First observed
list_tasks - First observed
list_vault - First observed
log_decision - First observed
log_discovery - First observed
log_usage - First observed
manage_tags - First observed
read_note - First observed
register_agent - First observed
review_task - First observed
search_vault - First observed
suggest_assignee - First observed
update_note - First observed
update_task - First observed
wikilinks
TDQS
Scored across 27 tools
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.
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.
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.
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
Related MCP Connectors
Connect AI assistants to your GitHub-hosted Obsidian vault to seamlessly access, search, and analy…
Search and reason over your Obsidian-style Markdown vault, right from ChatGPT.
Git-backed platform for skills, tools, and context for AI agents
Securely search and manage workspace context files for AI agents and teams.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables 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
- AlicenseNot gradedqualityDmaintenanceEnables 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 npmMIT
- AlicenseAqualityCmaintenanceEnables 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.6MIT
- AlicenseNot gradedqualityBmaintenanceEnables 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