obsidian-writer-mcp
Provides tools for interacting with Obsidian vaults, including creating and appending notes, managing lists, handling tasks (create, list), and sending content to an inbox, via the obsidian-writer HTTP service.
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., "@obsidian-writer-mcpcreate a task for dentist appointment tomorrow high priority"
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.
obsidian-writer-mcp
MCP server for writing to Obsidian through the obsidian-writer HTTP service.
This project was originally created for personal use in my homelab. I later decided to publish it in case it is useful to other people building similar local-first Obsidian automation.
Related project: obsidian-writer, the HTTP service this MCP server calls to write into Obsidian vaults.
Configuration
The server reads environment variables from the process and from .env files. Existing process variables take precedence over .env values.
Load order:
.envnext toobsidian_writer_mcp.py.envin the current working directory
Create a local .env from the example:
cp .env.example .envVariables:
OBSIDIAN_WRITER_BASE_URL: base URL for the HTTP writer. Default:http://obsidian-writer:3000.OBSIDIAN_DEFAULT_VAULT: default vault used when a tool does not receivevault. Default:default.
Example:
OBSIDIAN_WRITER_BASE_URL=http://obsidian-writer:3000
OBSIDIAN_DEFAULT_VAULT=my-vaultThe .env file is ignored by Git; publish .env.example and keep local values private.
Related MCP server: Obsidian MCP Tool Server
Hermes registration
If this repository is mounted inside the Hermes container at /srv/apps/obsidian-writer-mcp, register it without hardcoded vault values; the MCP will read .env itself:
docker exec -it hermes hermes -p <profile> mcp remove obsidian-writer || true
docker exec -it hermes hermes -p <profile> mcp add obsidian-writer \
--command sh \
--args -lc 'exec uv run --with fastmcp --with httpx python /srv/apps/obsidian-writer-mcp/obsidian_writer_mcp.py'
docker exec -it hermes hermes -p <profile> mcp test obsidian-writerIf your obsidian-writer service is not reachable as http://obsidian-writer:3000 from inside Hermes, change OBSIDIAN_WRITER_BASE_URL in .env.
Tools
Inbox
obsidian_append_inbox: append one line to today's inbox file in the configured default vault.obsidian_read_inbox: read inbox items for a specific day. Thedateargument is optional; when omitted,obsidian-writeruses today's date.
Lists
obsidian_list_lists: list existing Obsidian checklist files.obsidian_list_add: add unchecked items to a named list.obsidian_list_remove: remove items from a named list.obsidian_list_update: update/rename items in a named list.
Notes
obsidian_list_notes: list existing notes.obsidian_read_note: read a note by slug.obsidian_create_note: create a new standalone Markdown note.obsidian_append_note: append Markdown content to an existing note.obsidian_create_or_append_note: create a note or append to an existing compatible note.
Tasks
Task creation keeps its existing tool name: obsidian_create_task.
Task listing is available as obsidian_list_tasks and reads structured tasks through GET /tasks.
Creation sends structured JSON to POST /tasks; it does not format Obsidian Tasks Markdown itself. The canonical formatter is the obsidian-writer service.
Supported creation fields include:
vaulttitlecontent(legacy fallback fortitle)status:todo,done,cancelleddue,scheduled,start,done,cancelled: dates asYYYY-MM-DDpriority:highest,high,medium,low,lowest,nonerecurrencetagssourcedue_text(legacy; ignored whendueis provided)depends_on(accepted by the MCP for compatibility, but not sent yet)
Dependencies are reserved for phase 2 if/when obsidian-writer supports them.
Listing supports:
status:todo(default),done,cancelled, oralllimit: optional positive integervault: optional vault override
Examples
Read today's inbox:
obsidian_read_inbox()Read a specific inbox day:
obsidian_read_inbox(date="2026-06-24")Create a task using the configured default vault:
obsidian_create_task(
title="Pay electricity bill",
due="2026-06-25",
priority="high",
tags=["home", "bills"],
source="assistant",
)List pending tasks:
obsidian_list_tasks(status="todo", limit=20)Create or append a note:
obsidian_create_or_append_note(
title="Project ideas",
content="- Try a simpler publishing flow",
)Local development
Run the server over stdio:
uv run --with fastmcp --with httpx python obsidian_writer_mcp.pyThe process will wait for MCP stdio messages; that is expected.
Available Tools
13 toolsobsidian_append_inboxA
Append one line to today's inbox file in the user's Obsidian vault. Use when the user asks to add/save/capture something to inbox.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | ||
| tags | No | ||
| timestamp | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It only states the basic append action and fails to mention whether the file is created if missing, how tags/timestamp are handled, or any side effects. This is a significant gap 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?
Two sentences, front-loaded with the action and resource. Every word is informative, with 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?
With 3 parameters, no annotations, and no parameter descriptions, the description is under-specified. It lacks details on tag/timestamp formatting, file creation behavior, and edge cases, making it insufficient for reliable 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 0% and the description adds no explanation for the 'tags' or 'timestamp' parameters; 'line' is only implied by 'append one line.' The description does not compensate for the complete lack of parameter documentation.
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 specific action ('Append one line') and resource ('today's inbox file'), making it distinct from siblings like obsidian_append_note or obsidian_create_note. The scope is explicit and unambiguous.
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?
Provides a clear usage trigger: 'Use when the user asks to add/save/capture something to inbox.' It does not explicitly mention when not to use it or alternatives, but the inbox focus differentiates it from note-related siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
obsidian_append_noteA
Append Markdown content to an existing note in the configured default vault. Use when the user asks to add content to an existing note. Before using, prefer calling obsidian_list_notes to discover the correct slug. If needed, use obsidian_read_note to understand the note before adding content.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | ||
| content | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of explaining behavior. It discloses that the tool appends (not overwrites), requires an existing note, and uses the default vault, but it doesn't discuss failure modes, authentication, or return values. This is sufficient but not rich.
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 four sentences with no fluff. It front-loads the purpose, then gives usage guidance and helpful pre-steps. Slightly longer than strictly necessary but every clause adds 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 simple two-parameter append tool, the description provides purpose, usage context, and pre-requisite discovery steps. It omits explicit error/return behavior, but the output schema likely covers that, and the description is adequate for 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?
Despite 0% schema coverage, the description indirectly defines both parameters: 'content' is Markdown to append, and 'slug' is a note identifier that should be discovered via list_notes. It gives functional meaning beyond the bare parameter names.
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 tool appends Markdown to an existing note in the default vault, which is a specific verb and resource. It distinguishes from create_note by specifying 'existing note', though it doesn't explicitly contrast with the sibling create_or_append_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 description explicitly says when to use ('when the user asks to add content to an existing note') and gives helpful pre-steps (list notes first, read note if needed). It doesn't mention alternatives or when not to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
obsidian_create_noteA
Create a new standalone Markdown note in the configured default vault. Use when the user asks to create a new note. mode=create always creates a new note; if the same slug already exists, obsidian-writer creates _2, _3, etc. Content should be well-formatted Markdown. Do not repeat the title as a heading inside content when title is already provided separately.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| content | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses key behaviors: always creates a new note, suffixes _2/_3 on slug conflicts, and provides content formatting guidance (well-formatted Markdown, don't repeat title). This is substantial but does not cover auth or return details beyond the output 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 concise, front-loaded with the primary purpose, and every sentence provides useful information. No filler or repetition of schema fields.
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 two-parameter create tool with an output schema present, the description covers purpose, usage, slug conflict behavior, and content expectations. It could explicitly mention return behavior but the output schema covers that, making it largely 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 has 0% description coverage, so the description compensates by explaining that content should be well-formatted Markdown and not repeat the title. It implies title is the note title and content is the body, adding meaning beyond the raw 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 clearly states it creates a new standalone Markdown note in the default vault, with a specific verb and resource. It also differentiates from siblings by mentioning mode=create and slug conflict handling, which distinguishes it from append/create_or_append tools.
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 explicitly says 'Use when the user asks to create a new note' and describes behavior for existing slugs, implying it is for new notes rather than appending. It does not explicitly name alternative sibling tools, but the context makes the distinction clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
obsidian_create_or_append_noteA
Create a note or append to an existing compatible note in the configured default vault. Use for ambiguous requests like "put this in note X" or "save this in a note about X". If a compatible note exists, use its slug and append. If not, let obsidian-writer create the note. Before using, prefer calling obsidian_list_notes.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | ||
| title | Yes | ||
| content | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description is the only source of behavioral disclosure. It explains the conditional append-vs-create behavior and slug reuse, which is valuable, but it omits details about failure modes, what 'compatible' means, permission requirements, or output/return behavior.
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 moderately concise and front-loaded with the main purpose; the conditional and pre-step guidance earn their place. It has some redundancy between the first sentence and the 'If compatible... If not...' restatement.
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 3-parameter mutation tool with no annotations and 0% schema coverage, the description covers purpose, usage, and a precondition but leaves key gaps such as parameter semantics, the definition of 'compatible note', and error handling. The output schema mitigates return-value uncertainty but not these 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 schema provides no property descriptions (0% coverage), and the description only implicitly references 'slug' as the identifier for an existing compatible note. It does not clarify the meaning of 'title' or 'content', nor how they interact with the slug, leaving the agent to infer 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 opens with a specific action ('Create a note or append to an existing compatible note') tied to a named resource ('configured default vault') and explicitly positions itself for ambiguous requests, distinguishing it from sibling tools like obsidian_create_note and obsidian_append_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 explicit when-to-use signals ('Use for ambiguous requests like...') and a clear prerequisite ('Before using, prefer calling obsidian_list_notes'). However, it does not explicitly state when not to use it or name alternative tools for unambiguous cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
obsidian_create_taskA
Create a structured Obsidian Tasks-compatible task in a vault. Use when the user asks for a task, todo, manual reminder, or pending action. Pass semantic fields only; obsidian-writer formats the final Markdown line. Dependencies are accepted for future compatibility but are not sent yet.
| Name | Required | Description | Default |
|---|---|---|---|
| due | No | ||
| done | No | ||
| tags | No | ||
| start | No | ||
| title | No | ||
| vault | No | ||
| source | No | hermes | |
| status | No | ||
| content | No | ||
| due_text | No | ||
| priority | No | ||
| cancelled | No | ||
| scheduled | No | ||
| depends_on | No | ||
| recurrence | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses non-obvious behaviors: semantic fields are passed to obsidian-writer for final Markdown formatting, and dependencies are accepted but not sent. This goes beyond a simple 'create task'. However, it does not describe return values, failure modes, or vault prerequisites.
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 four concise sentences with purpose first, usage guidance second, and technical caveats last. No redundant or filler 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?
With 15 parameters, no annotations, and no schema descriptions, the description is too sparse to fully guide invocation. It omits parameter meanings, date formats, vault targeting, and expected output, making it incomplete for correct usage.
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 schema has 0% description coverage and the description does not explain individual parameters. It only generalizes that semantic fields should be passed and notes depends_on is ignored, leaving 14 other parameters unspecified.
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 first sentence clearly states 'Create a structured Obsidian Tasks-compatible task in a vault', specifying the verb, resource, and format. This distinguishes it from sibling tools like obsidian_create_note and obsidian_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?
The description explicitly states when to use it: 'Use when the user asks for a task, todo, manual reminder, or pending action.' It provides clear trigger conditions, though it does not mention alternatives or exclusion cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
obsidian_list_addA
Add one or more unchecked items to an Obsidian list in the configured default vault. Use when the user asks to add items to a named list. Before using this tool, call obsidian_list_lists when there is doubt about the exact list name.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | ||
| list_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that items are added as 'unchecked' and that it operates on a 'configured default vault,' which adds some context. However, it omits important behaviors like whether the list must already exist, whether it appends to the end, and any idempotency or side-effect details. The description is not egregiously opaque but lacks depth.
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 the core purpose in the first sentence and usage guidance in the second. It is front-loaded and free of unnecessary detail, making it easy for an agent to quickly grasp the tool's function and prerequisite actions.
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 tool with 2 parameters and an output schema, the description provides adequate context: it states what the tool does, when to use it, and how to resolve ambiguity about list names. It does not detail edge cases like duplicate handling or list creation, but the output schema likely covers return values. Slight gaps remain around behavioral specifics, but overall it is sufficiently 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 0%, and the description only vaguely references the parameters: 'items' are 'unchecked items' and 'list_name' is a 'named list' in the default vault. It does not clarify the expected format of list_name (exact name vs. path) or items (e.g., markdown formatting). The little information provided is inferable from parameter names, so the description adds minimal value 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 clearly states the tool's function: adding one or more unchecked items to an Obsidian list in the default vault. It uses a specific verb ('add') and resource ('list'), and differentiates from sibling tools like obsidian_list_remove and obsidian_list_update by focusing on addition.
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?
Explicitly states when to use: 'when the user asks to add items to a named list.' It also directs users to call obsidian_list_lists when the list name is uncertain, providing a clear alternative for name resolution. However, it does not explicitly exclude related tools like obsidian_append_note, so it misses some negative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
obsidian_list_listsA
List existing Obsidian lists in the configured default vault. Use before adding/removing/updating list items when the user gives an approximate list name. Prefer an existing compatible list to avoid creating duplicates such as mercado, compras, or lista-de-compras.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 mentions the default vault scope and frames the operation as a read-only lookup ('List existing... avoid creating duplicates'), implying no side effects. It does not specify return format, but the output schema exists and the tool is simple.
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 concise sentences, with the primary purpose front-loaded in the first sentence. Each subsequent sentence adds clear usage guidance without repetition or 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?
For a zero-parameter, output-schema-provided tool, the description completely covers its purpose, when to use it, and why it matters. The mention of duplicate avoidance (e.g., mercado, compras) gives practical context for real-world usage.
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 tool has zero parameters, so the description need not explain parameter semantics. The baseline of 4 applies because there is no parameter complexity to clarify and schema coverage is 100% by virtue of having an empty 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 clearly states the tool's verb and resource: 'List existing Obsidian lists in the configured default vault.' It distinguishes itself from sibling tools like obsidian_list_tasks and obsidian_list_notes by focusing specifically on lists rather than notes or 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?
Explicitly instructs when to use the tool: 'before adding/removing/updating list items when the user gives an approximate list name.' It also provides a clear rationale—'Prefer an existing compatible list to avoid creating duplicates'—which helps the agent decide between this and mutation tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
obsidian_list_notesA
List existing notes in the configured default vault. Use before creating or updating a note when the user mentions a note by an approximate name. Prefer an existing compatible note instead of creating a duplicate.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of disclosing side effects. It implicitly indicates a read-only operation via 'List', and adds context about the default vault and duplicate avoidance. However, it does not explicitly state that it makes no modifications, which could be ambiguous given the mutation-heavy sibling set.
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: the first delivers the core purpose, the second adds actionable usage guidance. No redundant text or filler, 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 the tool's simple no-parameter interface and the presence of an output schema (so return values need no explanation), the description fully covers purpose and usage. It is complete for the level of complexity.
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 tool has zero parameters, so the baseline is 4. The description avoids cluttering with parameter details, which is appropriate since there are none to explain.
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 verb ('List') and resource ('existing notes') with a specific scope ('configured default vault'). It distinguishes itself from siblings like obsidian_read_note (reading a single note) and obsidian_create_note (creating) by explicitly framing its purpose as a preliminary step to avoid duplicates.
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?
Provides clear when-to-use guidance: before creating or updating when the user gives an approximate note name. It implies when-not-to-use (when you have an exact name, use read_note) but does not explicitly name alternatives, so it falls just short of full explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
obsidian_list_removeA
Remove one or more items from an Obsidian list in the configured default vault. Use when the user asks to remove items from a named list. Before using this tool, call obsidian_list_lists when there is doubt about the exact list name.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | ||
| list_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the burden of behavioral disclosure. It states the basic removal action but does not mention permanence, behavior when a list or item is not found, side effects, or permissions. For a mutating tool, this is insufficient transparency.
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 redundant words. The first sentence states the purpose directly, and the second adds practical usage guidance. 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?
For a simple tool with two plain string/array parameters and an output schema, the description covers the core purpose and usage, including a helpful precaution about list names. It lacks some behavioral details, but given the tool's simplicity and the existence of an output schema, it is reasonably 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 coverage is 0%, so the description must compensate. It does clarify that 'items' are removed one or more at a time and that 'list_name' refers to an exact named list. However, it does not provide details on string formatting, whether items must already exist, or any constraints, leaving some gaps.
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 ('Remove'), the resource ('Obsidian list'), and the scope ('configured default vault'). It distinguishes itself from sibling tools like obsidian_list_add and obsidian_list_update by focusing specifically on removal.
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 explicitly says to use when the user asks to remove items from a named list, and provides a conditional prerequisite to call obsidian_list_lists if the exact list name is uncertain. This gives clear usage context and points to a relevant alternative/verification step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
obsidian_list_tasksA
List structured Obsidian Tasks-compatible tasks from a vault. Use when the user asks what tasks/todos/reminders are pending, completed, cancelled, or all. By default lists pending todo tasks from the configured default vault.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| vault | No | ||
| status | No | todo |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, description carries full burden. It discloses default status (todo), default vault behavior, and scope (lists tasks, not files or notes). This conveys the read-only nature implicitly and adds useful context about how the tool behaves by default, even though it doesn't discuss edge cases like pagination or limit handling.
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 sentences pack purpose, usage, and default behavior with no fluff. The core action is front-loaded, and every sentence adds information. This is concise and well-structured.
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 the tool has an output schema (thus return format is already defined), the description is complete enough: it covers purpose, when to use, and default behavior. It mentions vault selection and task statuses, covering most relevant scenarios. It could add a mention of the limit parameter, but that's a minor gap given the output schema and straightforward functionality.
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 0%, so description must compensate. It explains status values (pending, completed, cancelled, all) and mentions vault (default vault), but does not explain the 'limit' parameter at all. Since limit is a common parameter and schema only provides the name, description partially compensates but leaves one parameter ambiguous, so score stays average.
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 it lists structured Obsidian Tasks-compatible tasks from a vault, which is a specific verb+resource (list tasks). It also differentiates from siblings by focusing on tasks rather than notes, lists, or other operations, and mentions statuses (pending, completed, cancelled, all) that align with the tool's unique role.
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?
Explicitly says 'Use when the user asks what tasks/todos/reminders are pending, completed, cancelled, or all,' providing clear context on when to invoke. It does not name alternatives or exclusions, but the guidance is specific and distinguishes this from siblings like obsidian_list_lists or obsidian_read_inbox.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
obsidian_list_updateA
Update list items in an Obsidian list in the configured default vault. Use when the user asks to rename/change existing list items. Before using this tool, call obsidian_list_lists when there is doubt about the exact list name.
| Name | Required | Description | Default |
|---|---|---|---|
| list_name | Yes | ||
| new_items | Yes | ||
| old_items | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden for behavioral disclosure. It only states the basic operation and a prerequisite, but does not disclose how old_items and new_items are mapped (e.g., replacement semantics), error handling when old_items are not found, or whether the modification is irreversible. This is a significant gap for a mutation 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?
The description is extremely concise, with the main action in the first sentence and usage guidance in the second. It is front-loaded, free of filler, and each 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?
For a relatively simple 3-parameter tool, the description covers the core purpose, when to use it, and a useful prerequisite. The output schema likely documents return values, so that omission is acceptable. However, it lacks explicit parameter semantics and edge-case behavior, making it 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?
The schema has 0% description coverage, so the description must compensate. It implies list_name is the list identifier and old_items/new_items correspond to existing and desired items, respectively. However, it does not explicitly describe each parameter or their expected format (e.g., full list vs. partial), providing only minimal clarity.
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 tool updates list items in an Obsidian list, with a specific verb ('update') and resource ('list items'). It also notes the scope ('configured default vault') and differentiates from sibling tools like obsidian_list_add and obsidian_list_remove by focusing on changing existing items.
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 explicitly says when to use this tool: 'Use when the user asks to rename/change existing list items.' It also provides a concrete instruction to call obsidian_list_lists first if there is doubt about the exact list name, which is clear guidance for selection and prerequisite usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
obsidian_read_inboxA
Read inbox items for a specific day from the configured default vault. Use when the user asks what was captured/saved in the inbox today or on a specific date. Date must be YYYY-MM-DD; when omitted, obsidian-writer uses today.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| vault | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the date default ('when omitted, obsidian-writer uses today') and mentions the configured default vault, adding useful behavior. However, it doesn't address edge cases like invalid dates or vault override behavior, making it adequate but not rich.
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, front-loaded with the core purpose, followed by usage and date format. Every sentence contributes value with no redundancy or filler, earning a 5.
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 read tool with an output schema and only optional parameters, the description covers the essential aspects: purpose, usage, date format, and default behavior. The only notable gap is the missing explanation of the vault parameter, but given the tool's simplicity and presence of an output schema, this is a minor omission.
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?
With 0% schema description coverage, the description must compensate. It explains the date parameter format and default ('Date must be YYYY-MM-DD; when omitted, uses today'), but it does not explain the vault parameter at all, leaving its semantics ambiguous. Partial compensation justifies a 3.
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 'Read inbox items for a specific day from the configured default vault,' specifying the verb (read), resource (inbox items), and scope (specific day). This distinctively separates it from siblings like obsidian_read_note (reads a note) and obsidian_append_inbox (writes to inbox), earning a 5.
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?
Explicitly provides a use case: 'Use when the user asks what was captured/saved in the inbox today or on a specific date.' This is clear context, though it doesn't mention when not to use it or name alternative tools explicitly, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
obsidian_read_noteA
Read an existing note from the configured default vault. Use before appending to a note or answering about its content. Use the slug returned by obsidian_list_notes.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It says 'Read' and 'existing note,' implying a read-only operation, and adds context about the default vault. However, it does not disclose details such as error behavior if the note is missing, or explicit confirmation that it returns the note content, though an output schema exists.
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, front-loaded with the core purpose ('Read an existing note from the configured default vault'), followed by concise usage guidance. Every sentence earns its place 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 simple read tool with an output schema, the description covers purpose, input source, and when to use it. It could add error-handling notes, but the output schema likely covers return values, and the description is sufficiently complete for an agent to select and invoke 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?
The sole parameter 'slug' has no schema description, but the description explains it is the slug returned by obsidian_list_notes, giving practical meaning and reducing ambiguity. This compensates for the lack of schema-level documentation.
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 tool's function with a specific verb and resource: 'Read an existing note from the configured default vault.' It distinguishes from sibling tools like obsidian_append_note and obsidian_list_notes by specifying the read intent and the prerequisite slug from obsidian_list_notes.
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 explicitly instructs when to use the tool: 'Use before appending to a note or answering about its content,' and provides the prerequisite of using the slug from obsidian_list_notes. While it does not explicitly mention when not to use it or alternative tools like obsidian_read_inbox, 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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
13 tool updates
v0.1.0- First observed
obsidian_append_inbox - First observed
obsidian_append_note - First observed
obsidian_create_note - First observed
obsidian_create_or_append_note - First observed
obsidian_create_task - First observed
obsidian_list_add - First observed
obsidian_list_lists - First observed
obsidian_list_notes - First observed
obsidian_list_remove - First observed
obsidian_list_tasks - First observed
obsidian_list_update - First observed
obsidian_read_inbox - First observed
obsidian_read_note
TDQS
Scored across 13 tools
Most tools target distinct resources and actions (list operations vs note operations vs tasks vs inbox). The only potential confusion is among create_note, append_note, and create_or_append_note, but descriptions clarify their intended use cases.
All tools use the obsidian_ prefix and snake_case. However, list operations use a noun-first pattern (list_add, list_remove) while others use verb-first (read_note, create_task), which is a minor structural inconsistency.
13 tools is well within the ideal range for a domain-specific server focused on notes, lists, tasks, and inbox. Each tool has a clear role and contributes to the overall functionality.
Core workflows are covered (create/read/append notes, list management, tasks, inbox). Gaps include no delete for notes, no update/complete for tasks, and no explicit list creation, but these can often be worked around.
Maintenance
Related MCP Connectors
Markdown-based note-taking with a hosted MCP server. Your notes serve you and your AI.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
MCP-native open-source Notion alternative: read & write pages, databases and kanban boards.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server to interact with Obsidian via the Local REST API community plugin.134,427MIT
- AlicenseNot gradedqualityDmaintenanceProvides an MCP server that allows AI assistants to interact with Obsidian vaults, enabling reading/writing notes, managing metadata, searching content, and working with daily notes.37MIT
- AlicenseNot gradedqualityCmaintenanceMCP server providing tools to interact with Obsidian via the Local REST API community plugin.5MIT
- AlicenseNot gradedqualityDmaintenanceMCP server that provides read and write access to an Obsidian vault by interacting directly with markdown files on disk. Supports searching, listing, reading, creating, editing, and appending notes without requiring any Obsidian plugins.3,699 npmISC