---
slug: "obsidian-obsidian-tasks-mcp"
source_type: "readme"
source_url: "https://cdn.jsdelivr.net/gh/jfim/obsidian-tasks-mcp@master/README.md"
repo: "https://github.com/jfim/obsidian-tasks-mcp"
source_file: "README.md"
branch: "master"
---
# Obsidian Tasks MCP Server

[![npm version](https://badge.fury.io/js/%40jfim%2Fobsidian-tasks-mcp.svg)](https://badge.fury.io/js/%40jfim%2Fobsidian-tasks-mcp)

A Model Context Protocol (MCP) server for extracting and querying Obsidian Tasks from markdown files. Designed to work with Claude via the MCP protocol to enable AI-assisted task management.

## Features

- Extract tasks from Obsidian markdown files with a format compatible with the Obsidian Tasks plugin
- Identify completed and pending tasks
- Access task metadata including:
  - Status (complete/incomplete)
  - Due dates
  - Scheduled dates
  - Start dates
  - Created dates
  - Tags
  - Priority
  - Recurrence rules

## Tools

This MCP server provides the following tools:

### list_all_tasks

Extracts all tasks from markdown files in a directory, recursively scanning through subfolders.

**Input Parameters:**
- `path` (string, optional): The directory to scan for markdown files. If not specified, defaults to the first allowed directory.

**Returns:**
A JSON array of task objects, each containing:
```json
{
  "id": "string",          // Unique identifier (filepath:linenumber)
  "description": "string", // Full text description of the task
  "status": "complete" | "incomplete", // Task completion status
  "filePath": "string",    // Path to the file containing the task
  "lineNumber": "number",  // Line number in the file
  "tags": ["string"],      // Array of tags found in the task
  "dueDate": "string",     // Optional - YYYY-MM-DD format 
  "scheduledDate": "string", // Optional - YYYY-MM-DD format
  "startDate": "string",   // Optional - YYYY-MM-DD format
  "createdDate": "string", // Optional - YYYY-MM-DD format
  "priority": "string",    // Optional - "high", "medium", or "low"
  "recurrence": "string"   // Optional - recurrence rule
}
```

### query_tasks

Searches for tasks based on Obsidian Tasks query syntax. Applies multiple filters to find matching tasks.

**Input Parameters:**
- `path` (string, optional): The directory to scan for markdown files. If not specified, defaults to the first allowed directory.
- `query` (string, required): The query string using Obsidian Tasks query syntax. Each line is treated as a filter.

**Returns:**
A JSON array of task objects that match the query, with the same structure as `list_all_tasks`.

**Supported Query Syntax:**

- Status filters:
  - `done` - Show completed tasks
  - `not done` - Show incomplete tasks

- Date filters (due):
  - Note on semantics: `due today` is an exact match (only tasks due exactly today). Use range operators to include earlier/later dates.
  - `due today` - Tasks due today
  - `due before today` - Tasks due before today (exclusive)
  - `due after today` - Tasks due after today (exclusive)
  - `due on or before today` - Tasks due today or earlier (inclusive)
  - `due on or after today` - Tasks due today or later (inclusive)
  - `due on YYYY-MM-DD` or `due YYYY-MM-DD` - Tasks due on a specific date
  - `due before YYYY-MM-DD` - Tasks due before a date (exclusive)
  - `due after YYYY-MM-DD` - Tasks due after a date (exclusive)
  - `due on or before YYYY-MM-DD` - Tasks due on/before a date (inclusive)
  - `due on or after YYYY-MM-DD` - Tasks due on/after a date (inclusive)
  - `no due date` - Tasks with no due date
  - `has due date` - Tasks with a due date

- Start date filters:
  - Note on semantics: `starts today` is an exact match (only tasks that start today). Use range operators to include earlier/later dates.
  - `starts today` - Tasks starting today
  - `starts on YYYY-MM-DD` or `starts YYYY-MM-DD` - Start on a specific date
  - `starts before YYYY-MM-DD` - Start before a date (exclusive)
  - `starts after YYYY-MM-DD` - Start after a date (exclusive)
  - `starts on or before YYYY-MM-DD` - Start on/before a date (inclusive)
  - `starts on or after YYYY-MM-DD` - Start on/after a date (inclusive)
  - `no start date` - Tasks with no start date
  - `has start date` - Tasks with a start date

- Tag filters:
  - `no tags` - Tasks with no tags
  - `has tags` - Tasks with at least one tag
  - `tag includes #tag` - Tasks with tags containing "tag"
  - `tag does not include #tag` - Tasks without tags containing "tag"

- Path filters:
  - `path includes string` - Tasks in files with paths containing "string"
  - `path does not include string` - Tasks in files with paths not containing "string"

- Description filters:
  - `description includes string` - Tasks with descriptions containing "string"
  - `description does not include string` - Tasks with descriptions not containing "string"

- Priority filters:
  - `priority is highest` - Tasks with highest priority
  - `priority is high` - Tasks with high priority
  - `priority is medium` - Tasks with medium priority
  - `priority is low` - Tasks with low priority
  - `priority is lowest` - Tasks with lowest priority
  - `priority is none` - Tasks with no priority

**Example Query:**
```
not done
due before 2025-05-01
tag include #work
```
This would return all incomplete tasks due before May 1, 2025, that have the #work tag.

Inclusive OR example (single line):
```
due on or before today OR starts on or before today
```

## Usage

### Installation

From npm (recommended):

```bash
# Install globally
npm install -g @jfim/obsidian-tasks-mcp

# Or use directly with npx without installing
npx @jfim/obsidian-tasks-mcp /path/to/obsidian/vault
```

From source:

```bash
git clone https://github.com/jfim/obsidian-tasks-mcp.git
cd obsidian-tasks-mcp
npm install
npm run build
```

### Running the Server

Using npm package (recommended):

```bash
# If installed globally
obsidian-tasks-mcp /path/to/obsidian/vault

# Or with npx (no installation required)
npx @jfim/obsidian-tasks-mcp /path/to/obsidian/vault
```

From source:

```bash
node dist/index.js /path/to/obsidian/vault
```

### Testing

To run the test suite:

```bash
npm test
```

See [TESTING.md](https://github.com/jfim/obsidian-tasks-mcp/blob/HEAD/TESTING.md) for detailed information about the test suite.

### Using with Claude

Add this configuration to your Claude client that supports MCP:

```json
{
  "mcpServers": {
    "obsidian-tasks": {
      "command": "npx",
      "args": [
        "@jfim/obsidian-tasks-mcp",
        "/path/to/obsidian/vault"
      ]
    }
  }
}
```

If you installed from source:

```json
{
  "mcpServers": {
    "obsidian-tasks": {
      "command": "node",
      "args": [
        "/path/to/obsidian-tasks-mcp/dist/src/index.js",
        "/path/to/obsidian/vault"
      ]
    }
  }
}
```

### Docker

Build the Docker image:

```bash
docker build -t @jfim/obsidian-tasks-mcp .
```

Run with Docker:

```bash
docker run -i --rm --mount type=bind,src=/path/to/obsidian/vault,dst=/projects/vault @jfim/obsidian-tasks-mcp /projects
```

Claude Desktop configuration:

```json
{
  "mcpServers": {
    "obsidian-tasks": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "--mount", "type=bind,src=/path/to/obsidian/vault,dst=/projects/vault",
        "@jfim/obsidian-tasks-mcp",
        "/projects"
      ]
    }
  }
}
```

## Task Format

The server supports both **Obsidian Tasks emoji format** and **Dataview format** for task metadata.


- Task syntax: `- [ ] Task description`
- Completed task: `- [x] Task description`
- Due date: 
  - `🗓️ YYYY-MM-DD`
  - `📅 YYYY-MM-DD`
- Scheduled date: `⏳ YYYY-MM-DD`
- Start date: `🛫 YYYY-MM-DD`
- Created date: `➕ YYYY-MM-DD`
- Priority: `⏫` (high), `🔼` (medium), `🔽` (low)
- Recurrence: `🔁 every day/week/month/etc.`
- Tags: `#tag1 #tag2`

Example task: `- [ ] Complete project report 🗓️ 2025-05-01 ⏳ 2025-04-25 #work #report ⏫`

## License

MIT License
