obsidian-tasks-engine-mcp
The real Obsidian Tasks query engine, as an MCP server
Install / Use
claude mcp add Cito -- npx -y github:Cito/obsidian-tasks-engine-mcpIf the server publishes to npm under a different name, use that package instead — check the repo README.
MCP Server
Model Context Protocol server
Quality Score
Category
AI & Machine LearningSupported Platforms
Tags
Our assessment of obsidian-tasks-engine-mcp
obsidian-tasks-engine-mcp scores 76/100 on our quality scale, 828th of 939 AI & Machine Learning skills we index.
Its MCP Server is 27 KB long, well organised into 30 sections with 21 code examples: a thorough specification that gives an agent plenty to work with.
It has 3 GitHub stars, so there is little community track record yet; judge it on its content.
Maintenance, license and trust
- The repository was last updated 2 days ago, so obsidian-tasks-engine-mcp is actively maintained.
- It is released under the MIT license, a permissive license that allows use, modification and commercial use with attribution.
- Its trust signals score 87/100, with 2 cautions from licensing, adoption, age or documentation. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
obsidian-tasks-engine-mcp compared with similar skills
All 4 of these similar skills score higher than obsidian-tasks-engine-mcp; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| obsidian-tasks-engine-mcp (this skill)by Cito | 76 | 3 | 2d ago | MCP Server |
| Agent-Reachby Panniantong | 100 | 104.8k | 2d ago | CLAUDE.md |
| claude-memby thedotmack | 100 | 103.7k | today | CLAUDE.md |
| Understand-Anythingby Egonex-AI | 100 | 88.6k | 1d ago | CLAUDE.md |
| headroomby headroomlabs-ai | 100 | 78.0k | today | CLAUDE.md |
Frequently asked questions
- How do I install obsidian-tasks-engine-mcp?
- Run
claude mcp add Cito -- npx -y github:Cito/obsidian-tasks-engine-mcp. The install tabs above show the steps for each supported agent. - Which AI agents does obsidian-tasks-engine-mcp work with?
- It is written for Claude Code and Claude Desktop, as a MCP Server file. Other agents that read the same format can often use it too.
- Is obsidian-tasks-engine-mcp safe to use?
- It is MIT-licensed and scores 87/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is obsidian-tasks-engine-mcp still maintained?
- The repository was last updated 2 days ago, so obsidian-tasks-engine-mcp is actively maintained.
Skill content
View source on GitHubObsidian Tasks Engine MCP
Your whole task list, one question away — answered by the real Obsidian Tasks query engine.
</div>An MCP server that runs the real query engine of the Obsidian Tasks plugin outside of Obsidian.
Obsidian keeps your notes as plain Markdown files in a
folder called a vault, and the
Obsidian Tasks plugin
(source) turns the
- [ ] … lines in them into real tasks, with due dates, recurrence and
dependencies between them. What makes the plugin worth building on, though, is
its [query language]: instructions such as not done, due before tomorrow, is not blocked or group by filename, written one per line,
across forty kinds of filter.
That query language is what this server hands to an AI assistant. MCP, the Model Context Protocol, is an open standard for offering an assistant tools it can call and letting it decide when to call them; here the central tool takes a Tasks query and runs it over your vault.
So the range of what you can ask for is the range of the query language
itself. "What is due today, and leave out anything that still depends on
another task" is one obvious example; equally possible are "which tasks under
Projects/ have no due date at all", "group everything open by file and sort
by urgency", "what did I finish last week", "what is scheduled for this month
and tagged #work". Anything that would work in a tasks code block inside
Obsidian works here.
Obsidian itself need not be running — nor even be installed. The server reads the Markdown files directly, so the vault can be queried with the app closed, on a headless server, over SSH, or from a script. And it only reads: nothing is ever written back.
Every other Obsidian Tasks MCP server we are aware of reimplements that query
language in code of its own, and so supports only part of it — usually
without saying which part. This one takes the opposite route: the plugin
comes in unchanged as a git submodule, and its Query class is called
directly. Every filter is therefore available — boolean combinations,
relative dates, recurrence rules — and stays available, because keeping up
with the plugin is a git submodule update rather than a reimplementation.
How that works is described below under "How it works"; why it is built this way, in docs/ARCHITECTURE.md. If you want to contribute, start at CONTRIBUTING.md.
Built and tested against obsidian-tasks 8.6.0. The submodule is pinned to an exact commit —
git submodule statusnames it — and that pin is what the test suite runs against. The version here is checked bynpm test, so it cannot quietly fall behind the submodule.
An example
You: What do I have to get done this week? Leave out anything I can't start yet or that's still waiting on something else.
The assistant turns that into a Tasks query and calls query_tasks:
not done
(due before in 7 days) OR (scheduled before in 7 days)
starts before tomorrow
is not blocked
group by filename
sort by priority
The plugin's engine runs it over the vault and the server answers with the result, fenced off as data, followed by how every line was understood (abridged):
## Matches: 6 of 11 tasks
<vault-content>
#### [[Conference talk]]
- [ ] Send abstract to the programme committee 🆔 abstract ⏫ 📅 2026-09-14
- [ ] Book train to Berlin 📅 2026-09-16
#### [[Garden shed]]
- [ ] Order timber 🆔 timber 🔼 📅 2026-09-15
#### [[Household]]
- [ ] Renew passport ⏫ 📅 2026-09-11
- [ ] Water the plants 🔁 every 3 days 📅 2026-09-13
- [ ] Call the dentist ⏳ 2026-09-12
</vault-content>
## Query as it ran
(due before in 7 days) OR (scheduled before in 7 days) =>
OR (At least one of):
due before in 7 days =>
due date is before 2026-09-19 (Saturday 19th September 2026)
scheduled before in 7 days =>
scheduled date is before 2026-09-19 (Saturday 19th September 2026)
starts before tomorrow =>
start date is before 2026-09-13 (Sunday 13th September 2026) OR no start date
is not blocked
Assistant: Six tasks. Start with the passport — it was due yesterday and is high priority. The abstract for your talk is due on Monday, the timber for the shed on Tuesday, and the train to Berlin needs booking by Wednesday. The dentist call is scheduled for today, and the plants need watering tomorrow.
The five tasks left out were not left out by the language model. One is done,
two depend (⛔) on the abstract and the timber, one does not start until the
20th, and one has no date at all — the engine decided that, exactly as it
would in a tasks block inside Obsidian.
Features
- The whole query language, run by the plugin's own
Queryclass — boolean combinations, relative dates, recurrence, dependencies, grouping and sorting. - No silently dropped filters. Every response explains the query as the engine understood it; a line it does not understand is an error, not a smaller result.
- Reads the vault the way Obsidian does: the plugin's
FileParser, your global filter, global query and custom statuses, frontmatter as real YAML — checked against real Obsidian data from the submodule. - Read-only and bounded. Nothing is written; nothing outside the configured
vault is read;
-scoperestricts the server to part of it. - Two transports: stdio, or Streamable HTTP on loopback with an optional shared secret.
- Three tools:
query_tasks,explain_queryandtasks_query_syntax, with the same names and parameters as the Go server it replaces. - A CLI for running queries and for
--check, which verifies invariants on any vault of your own, with--summaryfor output that must not quote tasks.
What it does not do
Boundaries, not omissions — the reasoning is in docs/ARCHITECTURE.md under "Non-goals":
- It never writes. No completing or adding tasks, nothing in
.obsidian/. Your vault is only ever read, so nothing here can damage it. - Tasks only — not a general Obsidian API: no Dataview, no backlinks, no full-text search across notes.
- It does not invent queries. The assistant writes the query; the server runs it and explains it, and refuses what it does not understand.
- It is not a networked service.
--httplistens on loopback and there is no--hostand no TLS; exposing a vault to a network is left to a proper reverse proxy. (An optional shared secret narrows who on the same machine may call it — that is a different, smaller thing.) - It does not talk to Obsidian. The vault on disk is the whole interface.
Those boundaries are mostly there for one reason: a vault is private. Medical
appointments, salaries, other people's names. So the server reads only below
the roots it was given — a symbolic link pointing out of the vault is skipped,
not followed, and a call may not name a directory outside them unless a person
allowed that at the command line. It returns tasks and nothing else from the
files it reads, says its problems in the vault's own terms rather than in
absolute paths, marks everything that came out of the vault as read data
rather than as instructions, never evaluates JavaScript from a query unless a
human turns it on at the command line, and never writes. -scope narrows it
to part of a vault, --summary keeps task text out of anything that gets
logged. The full risk model — what
could go wrong and which code prevents it — is in
docs/ARCHITECTURE.md under "Security is a goal of
the same rank as correctness". Found a way around it? Please report it
privately, as described in SECURITY.md.
What is open, as opposed to ruled out, is in docs/TODO.md — itself written in the Tasks format, and queryable with the server.
Setup
git clone --recurse-submodules https://github.com/Cito/obsidian-tasks-engine-mcp.git obsidian-tasks-engine-mcp
cd obsidian-tasks-engine-mcp
npm install
npm run build
If you have already cloned without it, fetch the submodule afterwards:
git submodule update --init --depth 1
--recurse-submodulesis not optional, and GitHub's "Download ZIP" does not include submodules. A ZIP, or a plaingit clone, leavesvendor/obsidian-tasksempty and the build fails immediately — the submodule is the engine. Use the clone command above.
dist/is not in the repo (see.gitignore). After a fresh clone and after everygit pull,npm install && npm run buildhas to have run, ordist/server.jswill not be there and the server will silently fail to start.
This is all that setup is, for both ways of running the server below: the
build produces dist/server.js, and how it is then reached — started by the
client over stdio, or running as a service on a port — is a matter of
configuration, not of installing anything further.
Usage
As an MCP server
It offers three tools:
| Tool | Parameters | Purpose |
|---|---|---|
| query_tasks | rootDirs?, filters, includeDetails? | Run a query |
| explain_query | rootDirs?, filters | Only check and explain a query, without reading the vault |
| tasks_query_syntax | — | Look up every available instruction, generated from the submodule's documentation |
Every response contains the explanation of the query and the vault settings in force. A line that was not understood leads to an error response — never to a silently reduced result.
There are two ways to run it, and they differ only in how the client reaches the server — the same three tools, the same answers, the same vault:
| | stdio (default) | HTTP (--http) |
|---|---|---|
| Who starts the server | the client, as a subprocess | you, before the client connects |
| Configured with | a command line | a url |
| Lifetime | as long as the client runs | long-lived; several clients can share it |
| rootDirs from a call | only the -root directories | only the -root directories |
| Opening that up | --allow-any-root | not possible |
Use stdio unless something rules it out — it needs no process management and nothing listening on a port. HTTP is for the cases where the client cannot spawn a subprocess (a container, a remote or web-based client, anything that only accepts a URL), or where several clients should share one server.
Over stdio
This is the default and needs no flag. The client starts the server itself, so there is nothing to launch or keep alive:
node dist/server.js -root /path/to/vault -root /path/to/second-vault
node dist/server.js -root /path/to/vault -scope Subfolder/
Most clients are configured with a block like this:
{
"mcpServers": {
"obsidian-tasks": {
"command": "node",
"args": ["/path/to/obsidian-tasks-engine-mcp/dist/server.js",
"-root", "/path/to/vault"]
}
}
}
Call shape, tool names
Truncated for display — read the full file on GitHub.
Related Skills
Agent-Reach
104.8kGive your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.
claude-mem
103.7kPersistent Context Across Sessions for Every Agent – Captures everything your agent does during sessions, compresses it with AI, and injects relevant context back into future sessions. Works with Claude Code, OpenClaw, Codex, Gemini, Hermes, Copilot, OpenCode + More
Understand-Anything
88.6kGraphs that teach > graphs that impress. Turn any code into an interactive knowledge graph you can explore, search, and ask questions about. Works with Claude Code, Codex, Cursor, Copilot, Gemini CLI, and more.
headroom
78.0kCompress tool outputs, logs, files, and RAG chunks before they reach the LLM. 20% fewer tokens for coding agents, 60-95% fewer tokens for JSON, same answers. Library, proxy, MCP server.
Languages
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
