Skip to main content
Glama

of-mcp

An MCP server for OmniFocus. Originally forked from jqlts1/omnifocus-mcp-enhanced, now maintained independently with additional features.

License: MIT Node.js CI macOS

Transform OmniFocus into an AI-powered productivity powerhouse

Enhanced Model Context Protocol (MCP) server for OmniFocus featuring project review workflow, planned date support, repeating task support, native custom perspective access, hierarchical task display, AI-optimized tool selection, and comprehensive task management. Perfect integration with Claude AI for intelligent workflows.

✨ Key Features

📋 Project Review Workflow

  • 🔍 Find Due Reviews - Get projects that need review with get_projects_for_review

  • ✅ Mark Reviewed - Mark projects as reviewed individually or in batch

  • ⏰ Set Intervals - Configure review intervals in days

  • 📊 Track Progress - View next review date, last reviewed, and interval for each project

📋 Planned Date Support

  • 📅 Schedule Work - Set when you intend to work on a task (separate from due date)

  • 🔍 Filter by Planned - Find tasks planned for today, this week, or date ranges

  • 📊 Sort by Planned - Order tasks by their planned date

  • 🔄 Full CRUD - Create, read, update, and clear planned dates

🔄 Repeating Tasks

  • 📅 Flexible Frequencies - Daily, weekly, monthly, or yearly repetition

  • 🎯 Custom Intervals - Repeat every N days/weeks/months

  • 📆 Specific Days - Weekly tasks on specific days (e.g., Mon/Wed/Fri)

  • 📅 Weekday-of-Month - First Monday, last Friday, third Wednesday patterns

  • 🔁 Repeat From - Choose to repeat from due date or completion date

🌟 Native Custom Perspective Access

  • 🎯 Direct Integration - Native access to your OmniFocus custom perspectives via Perspective.Custom API

  • 🌳 Hierarchical Display - Tree-style task visualization with parent-child relationships

  • 🧠 AI-Optimized - Enhanced tool descriptions prevent AI confusion between perspectives and tags

  • ⚡ Zero Setup - Works with your existing custom perspectives instantly

🏗️ Complete Task Management

  • 🏗️ Subtask Support - Create hierarchical tasks with parent-child relationships

  • 📁 Folder Management - Create and nest folders for project organization

  • 🔍 Built-in Perspectives - Access Inbox, Flagged, Forecast, and Tag-based views

  • 🚀 Ultimate Task Filter - Advanced filtering beyond OmniFocus native capabilities

  • 🎯 Batch Operations - Add/edit/remove multiple items with true batching (9-12x faster)

  • 📊 Smart Querying - Find tasks, projects, or folders by ID or name

  • 🔗 Consistent ID Support - All tools accept both IDs and names (IDs take priority for reliability)

  • 🔄 Full CRUD Operations - Create, read, update, delete tasks, projects, and folders

  • 📅 Time Management - Due dates, defer dates, planned dates, creation dates (displayed in all task outputs), estimates, and scheduling

  • 🏷️ Advanced Tagging - Multi-tag filtering with any/all matching, exact/partial search, and auto-creation of missing tags

  • 🤖 AI Integration - Seamless Claude AI integration for intelligent workflows

Related MCP server: omnifocus-mcp

📦 Installation

  1. Clone the repository:

    git clone https://github.com/mojenmojen/of-mcp.git
    cd of-mcp
    npm install && npm run build

    Faster build (skips type checking):

    npm run build:fast

    This uses esbuild (~14ms) instead of tsc. See Troubleshooting for details.

  2. Add to Claude Code:

    claude mcp add omnifocus -- node "/path/to/of-mcp/dist/server.js"

📋 Requirements

  • macOS 10.15+ - OmniFocus is macOS-only

  • OmniFocus 3+ - The application must be installed and running

  • OmniFocus Pro - Required for custom perspectives (new features in v1.6.0)

  • Node.js 18+ - For running the MCP server

  • Claude Code - For MCP integration

🎯 Core Capabilities

1. 🏗️ Subtask Management

Create complex task hierarchies with ease:

// Create task in project (by name or ID)
{
  "name": "Analyze competitor keywords",
  "projectName": "SEO Strategy",
  "note": "Focus on top 10 competitors",
  "dueDate": "2025-01-15",
  "estimatedMinutes": 120,
  "tags": ["SEO", "Research"]
}

// Create task by project ID
{
  "name": "Write content outline",
  "projectId": "projectId123",
  "flagged": true,
  "estimatedMinutes": 60
}

// Create subtask by parent task ID
{
  "name": "Research top competitors",
  "parentTaskId": "loK2xEAY4H1",
  "estimatedMinutes": 30
}

2. 📁 Folder Management

Organize projects with nested folders:

# Create a top-level folder
add_folder {
  "name": "Work Projects"
}

# Create a nested folder (by name or ID)
add_folder {
  "name": "Q1 2025",
  "parentFolderName": "Work Projects"
}

add_folder {
  "name": "Marketing",
  "parentFolderId": "folderId123"
}

# Create a project in a folder (by name or ID)
add_project {
  "name": "New Website",
  "folderName": "Work Projects"
}

add_project {
  "name": "Mobile App",
  "folderId": "folderId123"
}

Folder Path Disambiguation

When folders share the same name at different levels (e.g., both Personal > Areas and Work > Areas), use the full path with > separators to disambiguate:

# Disambiguate folders with the same name
get_folder_by_id { "folderName": "Work > Areas" }
get_folder_by_id { "folderName": "Personal > Areas" }

# Filter projects by disambiguated folder
list_projects { "folderName": "Work > Areas" }

# A plain name shared by more than one folder is ambiguous and returns an error
# listing each candidate's full path and ID (v2.0.0+)
get_folder_by_id { "folderName": "Areas" }

Path syntax is supported everywhere a folder-name parameter (folderName, parentFolderName or newFolderName) is accepted: add_project, add_folder, edit_item, duplicate_project, batch_add_items, batch_edit_items, list_projects, and get_folder_by_id.

Duplicate folder names: if a folder name or path (folderName, newFolderName or parentFolderName) matches more than one folder, the call fails (in batch_add_items and batch_edit_items, only that item fails) with an error listing each candidate's full path and folder ID. Disambiguate with "Parent > Child" path syntax, or pass the candidate's ID (folderId, newFolderId or parentFolderId; the error names the one your tool takes). When a top-level folder shares its name with a nested one, the path selects the nested copy, so only the top-level copy needs its ID. Two folders with the same full path both need their IDs. A candidate that is dropped, or sits inside a dropped folder, is marked dropped or inside a dropped folder after its ID, because a project filed into it would be dropped too. edit_item and batch_edit_items check the folder before changing anything else. Known limitation (v2.0.0): a batch_add_items or batch_edit_items call in which every item fails shows a generic error instead of the candidate list (#146).

3. 🔍 Perspective Views

Access all major OmniFocus perspectives:

# Inbox perspective
get_inbox_tasks {"hideCompleted": true}

# Flagged tasks (filter by project name or ID)
get_flagged_tasks {"projectFilter": "SEO Project"}
get_flagged_tasks {"projectId": "abc123xyz"}

# Forecast (next 7 days)
get_forecast_tasks {"days": 7, "hideCompleted": true}

# Tasks by tag name (single or multiple)
get_tasks_by_tag {"tagName": "AI", "exactMatch": false}
get_tasks_by_tag {"tagName": ["work", "urgent", "focus"]}

# Tasks by tag ID (single or multiple)
get_tasks_by_tag {"tagId": "tagId123"}
get_tasks_by_tag {"tagId": ["tagId1", "tagId2"]}

# Tasks by multiple tags (AND - all of these tags)
get_tasks_by_tag {"tagName": ["home", "errands"], "tagMatchMode": "all"}

# Include dropped/inactive tags in search
get_tasks_by_tag {"tagId": "droppedTagId", "includeDropped": true}

# List all tags (fast - ~400ms)
list_tags {}

# List all tags with task counts (slower - ~15s)
list_tags {"showTaskCounts": true}

# Include dropped/inactive tags
list_tags {"includeDropped": true}

4. 🚀 Ultimate Task Filter

Create any perspective imaginable with advanced filtering:

# Time management view (30min tasks due this week)
filter_tasks {
  "taskStatus": ["Available", "Next"],
  "estimateMax": 30,
  "dueThisWeek": true
}

# Deep work view (60+ minute tasks with notes)
filter_tasks {
  "estimateMin": 60,
  "hasNote": true,
  "taskStatus": ["Available"]
}

# Project overdue tasks (filter by name or ID)
filter_tasks {
  "projectFilter": "Website Redesign",
  "taskStatus": ["Overdue", "DueSoon"]
}

# Find untagged tasks (useful after bulk tag cleanup)
filter_tasks {
  "untagged": true,
  "taskStatus": ["Available", "Next"]
}

# Filter by project ID and tag ID (for programmatic use)
filter_tasks {
  "projectId": "projectId123",
  "tagId": ["tagId1", "tagId2"],
  "taskStatus": ["Available"]
}

5. 🔄 Repeating Tasks

Create and manage recurring tasks with flexible repetition rules:

# Daily repeating task
add_omnifocus_task {
  "name": "Daily standup notes",
  "projectName": "Work",
  "dueDate": "2025-01-15",
  "repetitionRule": {
    "frequency": "daily"
  }
}

# Weekly task on Mon/Wed/Fri
add_omnifocus_task {
  "name": "Exercise",
  "dueDate": "2025-01-15",
  "repetitionRule": {
    "frequency": "weekly",
    "daysOfWeek": [1, 3, 5]
  }
}

# Monthly task on the 15th, repeat from completion
add_omnifocus_task {
  "name": "Pay bills",
  "dueDate": "2025-01-15",
  "repetitionRule": {
    "frequency": "monthly",
    "dayOfMonth": 15,
    "repeatFrom": "completion"
  }
}

# First Monday of every month (weekday-of-month pattern)
add_omnifocus_task {
  "name": "Prepare for monthly HOA meeting",
  "dueDate": "2026-02-02",
  "repetitionRule": {
    "frequency": "monthly",
    "weekdayOfMonth": {
      "week": 1,
      "day": 1
    },
    "repeatFrom": "due"
  }
}

# Last Friday of every month
add_omnifocus_task {
  "name": "Monthly expense report",
  "dueDate": "2026-01-31",
  "repetitionRule": {
    "frequency": "monthly",
    "weekdayOfMonth": {
      "week": -1,
      "day": 5
    }
  }
}

# Third Wednesday of every 2 months
add_omnifocus_task {
  "name": "Quarterly planning prep",
  "dueDate": "2026-01-21",
  "repetitionRule": {
    "frequency": "monthly",
    "interval": 2,
    "weekdayOfMonth": {
      "week": 3,
      "day": 3
    }
  }
}

# Edit task to add/remove repetition
edit_item {
  "id": "taskId123",
  "itemType": "task",
  "newRepetitionRule": {"frequency": "weekly", "interval": 2}
}

# Remove repetition from a task
edit_item {
  "id": "taskId123",
  "itemType": "task",
  "newRepetitionRule": null
}

# Move a task to a different project (by ID)
edit_item {
  "id": "taskId123",
  "itemType": "task",
  "newProjectId": "projectId456"
}

# Move a project to a different folder (by ID)
edit_item {
  "id": "projectId123",
  "itemType": "project",
  "newFolderId": "folderId456"
}

6. 🌟 Native Custom Perspective Access

Access your OmniFocus custom perspectives with hierarchical task display:

# List all your custom perspectives
list_custom_perspectives {"format": "detailed"}

# Get tasks from custom perspective by name
get_custom_perspective_tasks {
  "perspectiveName": "Today's Work",  # Your custom perspective name
  "showHierarchy": true,              # Enable tree display
  "hideCompleted": true,
  "ignoreFocus": true                 # Clear Focus mode to see all tasks (default: true)
}

# Get tasks from custom perspective by ID
get_custom_perspective_tasks {
  "perspectiveId": "perspectiveId123",
  "showHierarchy": true
}

# Examples with different perspectives
get_custom_perspective_tasks {
  "perspectiveName": "Today Review",
  "showHierarchy": true
}

get_custom_perspective_tasks {
  "perspectiveName": "Weekly Planning",
  "showHierarchy": false  # Flat display
}

# Example output (flat view):
# 1. **Review quarterly goals** [ID: j-Q4cm6ewVF]
#    Tags: planning
#    Due: 1/31/2025

# Example output (hierarchical view):
# ├─ **Launch Product Campaign**
# │  ID: abc123xyz
# │  Tags: Campaign, Priority
# │  Due: 2/15/2025

Why This Is Powerful:

  • ✅ Native Integration - Uses OmniFocus Perspective.Custom API directly

  • ✅ Tree Structure - Visual parent-child task relationships with ├─, └─ symbols

  • ✅ Task IDs Included - Build omnifocus:///task/{id} deep links directly from output

  • ✅ AI-Friendly - Enhanced descriptions prevent tool selection confusion

  • ✅ Professional Output - Clean, readable task hierarchies

7. 🔍 Batch Filter Tasks

Filter tasks across multiple projects in a single call (much faster than multiple filter_tasks calls):

# Get tasks from multiple projects at once
batch_filter_tasks {
  "projectNames": ["Website Redesign", "Marketing Campaign", "Q1 Planning"],
  "taskStatus": ["Available", "Next", "Blocked"],
  "limit": 50
}

# Filter by project IDs for reliability
batch_filter_tasks {
  "projectIds": ["projectId1", "projectId2", "projectId3"],
  "taskStatus": ["Available", "Overdue"],
  "flagged": true
}

# Combine with due date filters
batch_filter_tasks {
  "projectNames": ["Daily Tasks", "Weekly Review"],
  "dueThisWeek": true,
  "sortBy": "dueDate"
}

Benefits:

  • Single API call instead of N calls for N projects

  • Results grouped by project with task counts

  • Supports all common filters (status, flagged, due dates)

  • Returns project IDs for follow-up operations

8. 🎯 Batch Write Operations

Efficiently manage multiple tasks with true batching (9-12x faster than individual calls):

# Batch add multiple tasks/projects (by name or ID)
batch_add_items {
  "items": [
    {
      "type": "task",
      "name": "Website Technical SEO",
      "projectName": "SEO Project",  # or use projectId
      "note": "Optimize technical aspects"
    },
    {
      "type": "task",
      "name": "Page Speed Optimization",
      "parentTaskName": "Website Technical SEO",  # or use parentTaskId
      "estimatedMinutes": 180,
      "flagged": true
    },
    {
      "type": "project",
      "name": "New Project",
      "folderId": "folderId123"  # or use folderName
    }
  ]
}

# Batch edit multiple items
batch_edit_items {
  "edits": [
    {
      "id": "taskId1",
      "itemType": "task",
      "newStatus": "completed"
    },
    {
      "id": "taskId2",
      "itemType": "task",
      "newDueDate": "2025-02-01",
      "newFlagged": true,
      "newProjectId": "projectId123"  # Move task to another project by ID
    },
    {
      "id": "projectId1",
      "itemType": "project",
      "newNote": "Updated via batch edit",
      "newFolderName": "Work Projects"  # Move project to another folder by name
    }
  ]
}

# Batch update tags (works on both tasks AND projects, auto-creates missing tags)
batch_edit_items {
  "edits": [
    {
      "id": "taskId1",
      "itemType": "task",
      "addTags": ["urgent", "review"],
      "removeTags": ["someday"]
    },
    {
      "id": "projectId1",
      "itemType": "project",
      "addTags": ["Q1", "active"]
    },
    {
      "id": "taskId2",
      "itemType": "task",
      "replaceTags": ["priority", "work"]
    }
  ]
}

# Batch remove multiple items
batch_remove_items {
  "items": [
    {"id": "taskId1", "itemType": "task"},
    {"id": "taskId2", "itemType": "task"},
    {"name": "Old Project", "itemType": "project"}
  ]
}

9. 📋 Project Review Workflow

Automate your weekly review process:

# Get all projects due for review
get_projects_for_review {
  "includeOnHold": false,
  "limit": 50
}

# Mark a single project as reviewed
edit_item {
  "id": "projectId123",
  "itemType": "project",
  "markReviewed": true
}

# Set a project's review interval to 14 days
edit_item {
  "id": "projectId123",
  "itemType": "project",
  "newReviewInterval": 14
}

# Batch mark multiple projects as reviewed (by ID)
batch_mark_reviewed {
  "projectIds": ["projectId1", "projectId2", "projectId3"]
}

# Batch mark by project names
batch_mark_reviewed {
  "projectNames": ["Marketing Campaign", "Website Redesign"]
}

# View project review info
get_project_by_id {
  "projectName": "My Project"
}
# Returns: reviewInterval, nextReviewDate, lastReviewDate

Review Workflow Benefits:

  • Automate finding projects that need attention

  • Mark multiple projects reviewed in one operation

  • Track when each project was last reviewed

  • Set custom review intervals per project

🛠️ Complete Tool Reference

📊 Database & Task Management

  1. add_omnifocus_task - Create tasks (enhanced with subtask support)

  2. add_project - Create projects

  3. add_folder - Create folders (with nesting support)

  4. remove_item - Delete tasks or projects

  5. edit_item - Edit tasks or projects

  6. batch_add_items - Bulk add tasks/projects (true batching - 9x faster)

  7. batch_edit_items - Bulk edit tasks/projects (true batching - 12x faster)

  8. batch_remove_items - Bulk remove (true batching - 9x faster)

  9. get_task_by_id - Query task information (includes subtasks with status, flags, and nesting depth)

  10. list_projects - List projects with folder/status filtering

🔍 Built-in Perspective Tools

  1. get_inbox_tasks - Inbox perspective

  2. get_flagged_tasks - Flagged perspective

  3. get_forecast_tasks - Forecast perspective (due/deferred tasks)

  4. get_tasks_by_tag - Tag-based filtering (single or multiple tags with any/all matching)

  5. list_tags - List all tags with task counts and hierarchy

  6. filter_tasks - Ultimate filtering with unlimited combinations

  7. batch_filter_tasks - Filter multiple projects in one call (faster than multiple filter_tasks)

🌟 Custom Perspective Tools

  1. list_custom_perspectives - List all custom perspectives with details

  2. get_custom_perspective_tasks - Access custom perspective with hierarchical display

📊 Analytics & Tracking

  1. get_today_completed_tasks - View today's completed tasks

📋 Project Review Tools

  1. get_projects_for_review - Get projects due for review

  2. batch_mark_reviewed - Mark multiple projects as reviewed

🔧 Utility Tools

  1. get_server_version - Get server version and build information

  2. get_project_by_id - Query project information by ID or name (includes review data)

  3. get_folder_by_id - Query folder information by ID or name

  4. diagnose_connection - Check OmniFocus connectivity and permissions

🆕 New Tools (v1.23.0)

  1. search_tasks - Full-text search across task names and notes (simpler than filter_tasks)

  2. duplicate_project - Create a copy of a project including all tasks (great for templates)

  3. edit_tag - Edit tag properties: rename, change status, move to parent, or set allowsNextAction

🆕 New Tools (v1.27.0) - AI Assistant Optimizations

  1. get_system_health - Get all health metrics in ONE call (inbox, projects, tasks, tags, flagged, untagged)

  2. get_completion_stats - Get completion counts grouped by project/tag/folder for a date range

🚀 Quick Start Examples

Basic Task Creation

# Simple task
add_omnifocus_task {
  "name": "Review quarterly goals",
  "projectName": "Planning",
  "dueDate": "2025-01-31"
}

Advanced Task Management

# Create parent task
add_omnifocus_task {
  "name": "Launch Product Campaign",
  "projectName": "Marketing",
  "dueDate": "2025-02-15",
  "tags": ["Campaign", "Priority"]
}

# Add subtasks
add_omnifocus_task {
  "name": "Design landing page",
  "parentTaskName": "Launch Product Campaign",
  "estimatedMinutes": 240,
  "flagged": true
}

Smart Task Discovery

# Find high-priority work
filter_tasks {
  "flagged": true,
  "taskStatus": ["Available"],
  "estimateMax": 120,
  "hasEstimate": true
}

# Today's completed work
filter_tasks {
  "completedToday": true,
  "taskStatus": ["Completed"],
  "sortBy": "project"
}

Custom Perspective Usage

# List your custom perspectives
list_custom_perspectives {"format": "detailed"}

# Access a custom perspective with hierarchy
get_custom_perspective_tasks {
  "perspectiveName": "Today Review",
  "showHierarchy": true,
  "hideCompleted": true
}

# Quick flat view of weekly planning
get_custom_perspective_tasks {
  "perspectiveName": "Weekly Planning",
  "showHierarchy": false
}

🔍 Search Tasks (New in v1.23.0)

# Simple text search across names and notes
search_tasks {
  "query": "budget report"
}

# Search with match modes
search_tasks {
  "query": "meeting budget",
  "matchMode": "anyWord"  # matches either "meeting" or "budget"
}

search_tasks {
  "query": "quarterly review",
  "matchMode": "allWords",  # must contain both words
  "includeCompleted": true
}

# Search within a specific project
search_tasks {
  "query": "design",
  "projectName": "Website Redesign",
  "searchIn": "name"  # only search task names, not notes
}

📋 Duplicate Project (New in v1.23.0)

# Create a copy of a template project
duplicate_project {
  "sourceProjectName": "Sprint Template",
  "newName": "Sprint 15"
}

# Duplicate with date shifting (great for recurring workflows)
duplicate_project {
  "sourceProjectName": "Weekly Review Checklist",
  "newName": "Week 3 Review",
  "shiftDates": {
    "referenceDate": "2026-01-20",
    "basedOn": "defer"
  }
}

# Duplicate into a specific folder
duplicate_project {
  "sourceProjectId": "templateProjectId123",
  "newName": "Q1 Marketing Campaign",
  "folderName": "2026 Projects",
  "clearCompleted": true,
  "copyTags": true
}

🏷️ Edit Tag (New in v1.23.0)

# Reactivate a dropped tag
edit_tag {
  "tagName": "prep",
  "newStatus": "active"
}

# Put a tag on hold (tasks with this tag become blocked)
edit_tag {
  "tagName": "office",
  "newStatus": "onHold"
}

# Rename a tag
edit_tag {
  "tagId": "tagId123",
  "newName": "high-priority"
}

# Move tag to a different parent
edit_tag {
  "tagName": "errands",
  "newParentTagName": "personal"
}

# Make a tag top-level (remove from parent)
edit_tag {
  "tagName": "urgent",
  "newParentTagId": ""
}

🤖 AI Assistant Efficiency Guide

Use batch_filter_tasks for Multi-Project Queries

Instead of making separate filter_tasks calls for each project:

# ❌ Inefficient - 5 API calls
filter_tasks { "projectFilter": "Project A", "taskStatus": [...] }
filter_tasks { "projectFilter": "Project B", "taskStatus": [...] }
filter_tasks { "projectFilter": "Project C", "taskStatus": [...] }
# ... etc

Use a single batch call:

# ✅ Efficient - 1 API call
batch_filter_tasks {
  "projectNames": ["Project A", "Project B", "Project C", "Project D", "Project E"],
  "taskStatus": ["Available", "Next", "Blocked", "DueSoon", "Overdue"],
  "limit": 100
}

Use IDs for Reliability

All tools support both name and ID parameters. IDs are more reliable because they don't change when items are renamed.

Tool

ID Parameter

Alternative To

add_omnifocus_task

projectId

projectName

add_project

folderId

folderName

add_folder

parentFolderId

parentFolderName

duplicate_project

sourceProjectId, folderId

name equivalents

get_folder_by_id

folderId

folderName

list_projects

folderId

folderName

edit_item

newProjectId, newFolderId

name equivalents

batch_edit_items

newProjectId, newFolderId

name equivalents

batch_add_items

projectId, folderId

name equivalents

filter_tasks

projectId, tagId

projectFilter, tagFilter

get_tasks_by_tag

tagId

tagName

get_flagged_tasks

projectId

projectFilter

get_custom_perspective_tasks

perspectiveId

perspectiveName

batch_filter_tasks

projectIds

projectNames

Rule: When both ID and name are provided, ID takes priority. If a folder ID matches no folder, tools differ (#148). add_folder and duplicate_project fail. list_projects returns an empty list without consulting the name. add_project, batch_add_items, edit_item, batch_edit_items and get_folder_by_id fall back to the name, and fail if that doesn't resolve either.

Batch Operations for Writes

Use batch tools for multiple write operations:

  • batch_add_items - Add multiple tasks/projects (9x faster)

  • batch_edit_items - Edit multiple items (12x faster)

  • batch_remove_items - Remove multiple items (9x faster)

🔧 Configuration

Verify Installation

# Check MCP status
claude mcp list

# Verify server version (returns version + build provenance block)
get_server_version
# Response includes a `build` object: { commit, dirty, contentHash, buildStale }
# buildStale: true  → running process predates the on-disk build; restart the server
# To confirm you are also on the right source, compare build.commit with:
#   git rev-parse --short HEAD   (buildStale alone only proves process = disk)

# Test basic connection
get_inbox_tasks

# Test custom perspective features
list_custom_perspectives

Analytics & Health Checks (v1.27.0)

# Get all health metrics in ONE call (replaces 6+ separate calls)
get_system_health

# Get completion stats by project for last month
get_completion_stats {
  "completedAfter": "2026-01-01",
  "completedBefore": "2026-02-01",
  "groupBy": "project"
}

# Get completion stats by tag
get_completion_stats {
  "completedAfter": "2026-01-01",
  "completedBefore": "2026-02-01",
  "groupBy": "tag"
}

# Fast count-only query (no task data returned)
filter_tasks {
  "taskStatus": ["Available", "Next"],
  "countOnly": true
}

Troubleshooting

Build issues:

  • If npm run build hangs or runs out of memory, check npx tsc --version. TypeScript 5.8.3 and 5.9.3 run out of memory type-checking this project against MCP SDK 1.25.2 (#136), so package.json caps it at ~5.6.3. An install made before the cap may still have a newer version; run npm ci to reinstall from the lockfile.

  • npm run build:fast uses esbuild, which skips type checking but produces a working server

  • For type checking, run npx tsc --noEmit separately or rely on your IDE

Runtime issues:

  • Ensure OmniFocus 3+ is installed and running

  • Verify Node.js 18+ is installed

  • Check Claude Code MCP configuration

  • Enable accessibility permissions for terminal apps if needed

  • Use get_server_version to verify the correct version is loaded after updates. The response now includes a build object (commit, dirty, contentHash, buildStale). buildStale: true means the running process predates the on-disk build — restart the server to clear it. Note that buildStale: false only proves the process matches the on-disk build; to confirm you are on the intended source, also compare build.commit against git rev-parse --short HEAD.

🎯 Use Cases

  • Project Management - Create detailed project hierarchies with subtasks

  • GTD Workflow - Leverage perspectives for Getting Things Done methodology

  • Time Blocking - Filter by estimated time for schedule planning

  • Weekly Reviews - Automate project reviews with get_projects_for_review and batch_mark_reviewed

  • Team Coordination - Batch operations for team task assignment

  • AI-Powered Planning - Let Claude analyze and organize your tasks

📈 Performance

  • True Batch Operations - All batch tools execute in a single OmniFocus script call

    • batch_add_items: ~138ms per item (9x faster than individual calls)

    • batch_edit_items: ~76ms per item (12x faster than individual calls)

    • batch_remove_items: ~65ms per item (9x faster than individual calls)

  • Fast ID Lookups - Direct Task.byIdentifier() / Project.byIdentifier() API calls

  • Lazy Loading - OmniFocus collections only loaded when needed

  • Fast Filtering - Native AppleScript/OmniJS performance

  • Memory Optimized - Minimal resource usage

  • Scalable - Handles large task databases efficiently

🤝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository

  2. Create a feature branch

  3. Make your changes

  4. Add tests if applicable

  5. Submit a pull request

Release Checklist

When releasing a new version:

  1. Bump version in package.json

  2. Update this README with any new features or tools

  3. Commit and push changes

📄 License

MIT License - see LICENSE file for details.

🙏 Acknowledgments

Based on the original OmniFocus MCP server by themotionmachine. Enhanced with perspective views, advanced filtering, and complete subtask support.


⭐ Star this repo if it helps boost your productivity!

Available Tools

31 tools
add_folderC

Add a new folder to OmniFocus

NameRequiredDescriptionDefault
nameYesThe name of the folder to create
parentFolderIdNoParent folder ID (alternative to parentFolderName)
parentFolderNameNoParent folder name or "Parent > Child" path (creates nested folder). If omitted, creates at root level. If it matches more than one folder, the call fails and lists each candidate's path and ID; pass parentFolderId to choose one.

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden but says nothing beyond the mutation itself: it does not disclose whether duplicate names are allowed, whether the parent must already exist, what is returned (a folder ID is presumably needed for follow-up calls), or how failures surface. The important ambiguity-failure behavior exists only in the schema text.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler or redundancy. Its brevity is efficient, though it edges toward under-specification rather than optimal density.

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

Completeness3/5

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

For a simple three-parameter creation tool with fully documented schema fields, the description is minimally sufficient to invoke correctly. However, with no output schema and no hint about the return value or error conditions, an agent cannot anticipate what comes back after a successful add.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the property descriptions already explain parentFolderId vs parentFolderName, the root-level default, and the multi-match failure mode. The description adds nothing about parameters, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Add a new folder') plus the target system (OmniFocus), so an agent knows exactly what it creates. It does not explicitly differentiate itself from near siblings like add_project or add_omnifocus_task, leaving the folder-vs-project distinction to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool versus add_project, add_omnifocus_task, or edit_item, and no prerequisites mentioned. The only usage-adjacent guidance (root-level default, nesting behavior) lives in the schema, not the description.

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

add_omnifocus_taskA

Add a SINGLE task to OmniFocus. IMPORTANT: For adding 2+ tasks, use batch_add_items instead (9x faster, single API call).

NameRequiredDescriptionDefault
nameYesThe name of the task
noteNoAdditional notes for the task
tagsNoTags to assign to the task
dueDateNoThe due date of the task in ISO format (YYYY-MM-DD or full ISO date)
flaggedNoWhether the task is flagged or not
deferDateNoThe defer date of the task in ISO format (YYYY-MM-DD or full ISO date)
projectIdNoThe ID of the project to add the task to (alternative to projectName)
plannedDateNoThe planned date (when you intend to work on this) in ISO format (YYYY-MM-DD or full ISO date)
projectNameNoThe name of the project to add the task to (will add to inbox if not specified)
parentTaskIdNoThe ID of the parent task to create this task as a subtask
parentTaskNameNoThe name of the parent task to create this task as a subtask (alternative to parentTaskId)
repetitionRuleNoRepetition rule for recurring tasks. Examples: {frequency: 'daily'}, {frequency: 'weekly', daysOfWeek: [1,3,5]}, {frequency: 'monthly', dayOfMonth: 15}
estimatedMinutesNoEstimated time to complete the task, in minutes

TDQS

A3.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full disclosure burden, yet it only adds a performance hint about batching. It says nothing about failure modes (e.g., unknown projectName/projectId), precedence when both projectId and projectName are supplied, whether it mutates existing data, or what is returned on success.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with the core action front-loaded and the batching caveat immediately after. No filler and nothing buried.

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

Completeness3/5

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

With 13 parameters and a nested repetition object, the fully documented schema compensates for most of the description's brevity. However, for a write tool with no annotations and no output schema, the description still leaves the agent without guidance on conflict/precedence behavior and result shape.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including detailed nested docs for repetitionRule, so the schema already does the heavy lifting. The description adds no parameter-level meaning beyond what the schema provides, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Add a SINGLE task to OmniFocus') and emphasizes the single-item scope, which immediately distinguishes it from the batch siblings. An agent can tell what it does without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit routing rule: use this for one task, use batch_add_items for 2+ tasks, with a concrete justification (9x faster, single API call). This is exactly the when/when-not/alternative structure the dimension rewards.

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

add_projectA

Add a SINGLE project to OmniFocus. For adding multiple projects, use batch_add_items instead.

NameRequiredDescriptionDefault
nameYesThe name of the project
noteNoAdditional notes for the project
tagsNoTags to assign to the project
dueDateNoThe due date of the project in ISO format (YYYY-MM-DD or full ISO date)
flaggedNoWhether the project is flagged or not
folderIdNoThe ID of the folder to add the project to (alternative to folderName)
deferDateNoThe defer date of the project in ISO format (YYYY-MM-DD or full ISO date)
folderNameNoThe name or "Parent > Child" path of the folder to add the project to (will add to root if not specified). If it matches more than one folder, the call fails and lists each candidate's path and ID; pass folderId to choose one.
sequentialNoWhether tasks in the project should be sequential (default: false)
estimatedMinutesNoEstimated time to complete the project, in minutes

TDQS

A3.7/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It never states that this is a mutating write, does not describe the return value, permissions, or failure behavior — the folderName failure mode is only mentioned in the schema, not the description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero waste, and the scope constraint is front-loaded before the alternative pointer. Nothing could be removed without losing value.

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

Completeness3/5

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

With 10 parameters, full schema coverage, and no annotations or output schema, the description is just barely sufficient: the schema documents inputs but nothing tells the agent what the tool returns or how it behaves on failure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all ten parameters including folderName/folderId disambiguation are already documented. The description adds no parameter-level meaning, which is acceptable at full coverage but earns only the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Add a SINGLE project to OmniFocus') and immediately distinguishes the single-item scope from the batch sibling. An agent can pick between add_project and batch_add_items without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the alternative (batch_add_items) and the exact condition that selects it (multiple projects). No other guidance such as folder prerequisites or what happens on duplicate names, but the primary routing decision is explicit.

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

batch_add_itemsA

PREFERRED: Add multiple tasks/projects in ONE call. 9x faster than individual add_omnifocus_task calls. Always use this for 2+ items.

NameRequiredDescriptionDefault
itemsYesArray of items (tasks or projects) to add

TDQS

A3.9/5.0
Behavior2/5

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

No annotations exist, so the description carries the full behavioral burden. It adds a useful performance claim (9x faster) but says nothing about partial-failure semantics, atomicity, ordering, or what is returned — critical for a batch mutation tool. The only failure-behavior detail available lives in the schema's folderName description, not here.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with the preferred status and batch scope front-loaded. Nothing is redundant or padded.

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

Completeness3/5

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

There is no output schema or annotation coverage, so the description should at least indicate what a call returns (created IDs, per-item results) and how failures are reported. It omits both, leaving the agent to discover batch-result semantics empirically.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including the tempId/parentTempId linking mechanism and per-field guidance, so baseline 3 applies. The description adds no parameter-level meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Add multiple tasks/projects') and explicitly scopes it to batch operation in one call, which cleanly separates it from the single-item sibling add_omnifocus_task.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit decision threshold ('Always use this for 2+ items') and names the alternative (individual add_omnifocus_task calls), so an agent can choose between batch and single-item paths without inference.

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

batch_edit_itemsA

PREFERRED: Edit multiple tasks/projects in ONE call. 12x faster than individual edit_item calls. Always use this for 2+ items.

NameRequiredDescriptionDefault
editsYesArray of edit operations to perform

TDQS

A3.7/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden and delivers little: it asserts '12x faster' (an unverifiable performance claim) but says nothing about atomicity, whether a single bad edit aborts the whole batch, permission requirements, or what errors look like. For a bulk mutation tool this is a significant omission.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with the recommendation front-loaded, then the rationale, then the decision rule. No filler, nothing buried.

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

Completeness3/5

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

No annotations and no output schema mean the description should explain what a batch call returns and how partial failures surface, but it is silent on both. The rich nested schema compensates for edit-field semantics, so the gap is narrow but real for a destructive bulk tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single 'edits' array has per-field descriptions covering every edit kind, including edge cases like folder matching and empty-string date clearing. The description adds nothing about the array's structure, ordering, or size limits, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource plus scope: 'Edit multiple tasks/projects in ONE call.' The batching scope is exactly what distinguishes it from the sibling edit_item, so an agent can select it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: 'Always use this for 2+ items' and names the alternative (individual edit_item calls) as the thing it replaces. It stops short of an explicit when-not (single-item edits) and gives no guidance on large batch sizes or partial-failure handling.

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

batch_filter_tasksA

PREFERRED: Filter tasks across multiple projects in ONE call. Always use this instead of multiple filter_tasks calls when querying 2+ projects.

NameRequiredDescriptionDefault
limitNoMaximum tasks per project (default: 100)
sortByNoSort results by field
flaggedNoFilter by flagged status
overdueNoShow overdue tasks only
dueAfterNoShow tasks due after this date (ISO format: YYYY-MM-DD)
dueTodayNoShow tasks due today
dueBeforeNoShow tasks due before this date (ISO format: YYYY-MM-DD)
sortOrderNoSort order (default: asc)
deferAfterNoShow tasks with defer date after this date (ISO format: YYYY-MM-DD)
deferTodayNoShow tasks deferred to today
projectIdsNoArray of project IDs to filter by
taskStatusNoFilter by task status. Can specify multiple statuses
deferBeforeNoShow tasks with defer date before this date (ISO format: YYYY-MM-DD)
dueThisWeekNoShow tasks due this week
dueThisMonthNoShow tasks due this month
plannedAfterNoShow tasks with planned date after this date (ISO format: YYYY-MM-DD)
plannedTodayNoShow tasks planned for today
projectNamesNoArray of project names to filter by (partial match)
deferThisWeekNoShow tasks deferred to this week
plannedBeforeNoShow tasks with planned date before this date (ISO format: YYYY-MM-DD)
completedAfterNoShow tasks completed after this date (ISO format: YYYY-MM-DD)
completedTodayNoShow tasks completed today
deferAvailableNoShow tasks whose defer date has passed (now available)
completedBeforeNoShow tasks completed before this date (ISO format: YYYY-MM-DD)
plannedThisWeekNoShow tasks planned for this week
completedThisWeekNoShow tasks completed this week
completedThisMonthNoShow tasks completed this month

TDQS

A4.1/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It usefully discloses batching semantics (one call replaces N calls), but says nothing about the result shape, whether tasks are grouped by project, or how the per-project limit interacts with aggregation – all material for a 27-parameter tool with no 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste, and the PREFERRED/preferred-selection cue is front-loaded ahead of the condition. Nothing here needs to be trimmed or reordered.

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

Completeness3/5

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

For a 27-parameter, zero-required, no-output-schema read tool, the description nails routing but stops short of telling the agent what comes back – whether results are keyed by project, whether a missing project ID errors or is skipped, and how limit applies per project. Those gaps are only partly covered by the schema's per-field notes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter including limit, sortBy and the date-window flags is already documented in the schema. The description adds no parameter meaning beyond that, so the baseline of 3 applies rather than anything higher.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Filter tasks") with a clear scope ("across multiple projects in ONE call"). It explicitly names the sibling it is not (filter_tasks) and the condition that separates them, so an agent can tell them apart without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Always use this instead of multiple filter_tasks calls when querying 2+ projects" names the alternative and the triggering condition in one sentence. The only mild gap is that the single-project or single-task query case is left implicit, but the decision rule itself is unambiguous.

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

batch_mark_reviewedB

Mark multiple projects as reviewed in a single operation (advances their next review dates)

NameRequiredDescriptionDefault
projectIdsNoArray of project IDs to mark as reviewed
projectNamesNoArray of project names to mark as reviewed (alternative to projectIds)

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, and it does disclose the key side effect: next review dates are advanced. It omits the rest of the mutation profile — whether it is idempotent, what happens with unknown IDs, whether partial failures are reported, and what permissions or auth it needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with verb and object, with the behavioral consequence in a tight parenthetical. Nothing wasted and nothing buried.

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

Completeness3/5

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

For a two-parameter batch mutation with no annotations and no output schema, the description covers purpose and effect but leaves return behavior and the ID-vs-name selection rule unexplained. Adequate, but an agent still has to guess at batch semantics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds nothing about the mutual exclusivity/priority of projectIds vs projectNames, which is the one ambiguity an agent could get wrong here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ("Mark multiple projects as reviewed") and adds the consequential effect ("advances their next review dates"), which lets an agent distinguish it from generic mutators like batch_edit_items or edit_item. It does not explicitly name siblings, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use or when-not-to-use guidance. Nothing says to pair it with get_projects_for_review (the obvious read-side sibling) or explains why an agent would pick this over batch_edit_items for changing project state.

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

batch_remove_itemsA

PREFERRED: Remove multiple tasks/projects in ONE call. 9x faster than individual remove_item calls. Always use this for 2+ items.

NameRequiredDescriptionDefault
itemsYesArray of items (tasks or projects) to remove

TDQS

A3.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden for a destructive operation. It discloses performance ('9x faster') but says nothing about whether deletion is permanent, whether confirmation is required, or what happens if some items in the batch fail — critical for a removal tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with 'PREFERRED' so the routing signal lands first. Every sentence carries a distinct piece of information: preference, rationale, threshold.

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

Completeness3/5

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

Routing and scope are complete for a batch-delete tool, but with no annotations and no output schema the description should say whether deletion is irreversible and how partial failures are reported. Those gaps matter more here than for a read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the nested item fields (id, name fallback, itemType enum) are already fully documented in the schema. The description adds no meaning beyond the structured data, which is the baseline case.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Remove'), resource ('tasks/projects'), and batch scope ('multiple ... in ONE call'). It plainly distinguishes itself from the sibling remove_item by contrast, so an agent can route without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit decision rule: use this for 2+ items, with remove_item as the implied single-item alternative, plus a justification (9x faster). Both the when and the when-not are stated.

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

diagnose_connectionA

Check OmniFocus connectivity, permissions, and server status. Run this first if experiencing issues.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full disclosure burden. It implies a non-mutating preflight check but never states that it is read-only, side-effect free, or what it returns (no output schema exists). For a zero-parameter preflight call this is adequate but leaves the agent guessing about the response shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste, with the purpose first and the actionable trigger second. Every sentence earns its place.

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

Completeness3/5

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

The tool is simple, but with no annotations and no output schema the description should say roughly what a successful or failed diagnosis yields (a status report? an error?). As written the agent knows when to call it but not what to expect back.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes no parameters and the description introduces none, so there is nothing to mis-specify. Baseline for a zero-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Check') and a concrete scope: OmniFocus connectivity, permissions, and server status. An agent can distinguish it from data-retrieval siblings like list_projects, though the description never contrasts it with the adjacent get_system_health or get_server_version, leaving some overlap ambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Run this first if experiencing issues' gives an explicit triggering condition, which is exactly what a diagnostic tool needs. It stops short of naming alternatives (get_server_version, get_system_health) or saying when not to bother running it.

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

duplicate_projectB

Create a copy of a project including all its tasks. Useful for templates and recurring workflows. Supports date shifting and hierarchy preservation.

NameRequiredDescriptionDefault
newNameYesName for the duplicated project
copyTagsNoCopy task tags
folderIdNoFolder ID to place the new project in
copyNotesNoCopy task notes
folderNameNoName or "Parent > Child" path of the folder to place the new project in. If it matches more than one folder, the call fails and lists each candidate's path and ID; pass folderId to choose one.
resetDatesNoClear all dates (defer, due) from duplicated tasks
shiftDatesNoShift all dates relative to a new start date (overrides resetDates)
clearCompletedNoReset all tasks to incomplete status
sourceProjectIdNoID of project to duplicate
sourceProjectNameNoName of project to duplicate (if ID not provided)

TDQS

B3.1/5.0
Behavior2/5

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

No annotations exist, so the description carries the full burden. It never warns that the default behavior (resetDates=true, clearCompleted=true) wipes all dates and resets every task to incomplete — a materially destructive default — nor does it mention permissions, side effects, or what happens when folderName is ambiguous.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action, and no repetition of schema content. The middle sentence on templates is the weakest but still carries a use-case signal.

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

Completeness2/5

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

For a 10-parameter mutation tool with a nested object, no annotations, and no output schema, the description is thin. It omits the sourceProjectId/sourceProjectName fallback, the folderName ambiguity-failure behavior, and the date-reset defaults an agent must know before calling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the ten parameters including the nested shiftDates object are already fully documented in the schema. The description only echoes two of them ('date shifting', 'hierarchy preservation') without adding format or interaction detail such as shiftDates overriding resetDates.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence gives a specific verb and resource — 'Create a copy of a project including all its tasks' — which clearly separates it from add_project or get_project_by_id. It stops short of naming any sibling explicitly, so the differentiation is implicit rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Useful for templates and recurring workflows' hints at a scenario but never states when to prefer this over add_project or batch_add_items, and gives no preconditions such as needing a source project identifier. Usage is only implied.

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

edit_itemA

Edit a SINGLE task or project in OmniFocus. For editing 2+ items, use batch_edit_items instead (12x faster).

NameRequiredDescriptionDefault
idNoThe ID of the task or project to edit
nameNoThe name of the task or project to edit (as fallback if ID not provided)
addTagsNoTags to add (works on both tasks and projects)
newNameNoNew name for the item
newNoteNoNew note for the item
itemTypeYesType of item to edit ('task' or 'project')
newStatusNoNew status for tasks (incomplete, completed, dropped)
newDueDateNoNew due date in ISO format (YYYY-MM-DD or full ISO date); set to empty string to clear
newFlaggedNoSet flagged status (set to false for no flag, true for flag)
removeTagsNoTags to remove (works on both tasks and projects)
moveToInboxNoSet to true to move task to inbox
newFolderIdNoNew folder to move the project to (by folder ID)
replaceTagsNoReplace all existing tags (works on both tasks and projects)
markReviewedNoMark project as reviewed (advances next review date by interval). Only applies to projects.
newDeferDateNoNew defer date in ISO format (YYYY-MM-DD or full ISO date); set to empty string to clear
newProjectIdNoMove task to a different project (by project ID)
newFolderNameNoNew folder to move the project to, by name or "Parent > Child" path. If it matches more than one folder, the call fails before changing anything and lists each candidate's path and ID; pass newFolderId to choose one. A name or path that matches no folder creates a new top-level folder named with that exact text, so check spelling and the spaces around " > " (#147).
newSequentialNoWhether the project should be sequential
dropCompletelyNoWhen dropping a repeating task, set to true to drop completely (stop all future occurrences). Default false drops only the current occurrence.
newPlannedDateNoNew planned date (when you intend to work on this) in ISO format; set to empty string to clear
newProjectNameNoMove task to a different project (by project name)
newParentTaskIdNoMove task to be a subtask of another task (by task ID)
newProjectStatusNoNew status for projects
newNextReviewDateNoSet next review date directly (ISO format YYYY-MM-DD). Only applies to projects.
newParentTaskNameNoMove task to be a subtask of another task (by task name)
newRepetitionRuleNoNew repetition rule for the task. Set to null to remove repetition, or provide object to set. Examples: null (remove), {frequency: 'daily'}, {frequency: 'weekly', daysOfWeek: [1,3,5]}
newReviewIntervalNoSet new review interval in days (must be a positive integer). Only applies to projects.
newEstimatedMinutesNoNew estimated minutes

TDQS

A4.1/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden; it discloses the performance trait (12x faster in batch) which is genuine added context. However, for a 28-parameter mutation tool it says nothing about failure behavior, partial application, idempotency, or what happens when the id/name matches nothing. Key mutation semantics live only in the schema, not the description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero waste, with the scope constraint front-loaded ahead of the alternative. Nothing could be removed without losing routing information.

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

Completeness3/5

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

The exhaustive schema compensates for most gaps, and there is no output schema to explain. Still, the description never mentions that itemType is required or that the target is identified by id or name, nor what the call returns or how it fails — gaps an agent must discover from the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter including itemType, id-vs-name fallback, and the newFolderName collision behavior is already documented in the schema. The description adds no parameter guidance beyond scope, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Edit) and resource (a SINGLE task or project in OmniFocus), and explicitly bounds the scope with 'SINGLE'. It names the sibling tool it is not (batch_edit_items), so an agent can distinguish the two without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit routing rule: use this for one item, use batch_edit_items for 2+. The '12x faster' rationale makes the tradeoff concrete rather than arbitrary. No further inference is needed to pick between the two editing tools.

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

edit_tagA

Edit a tag's properties: rename, change status (active/onHold/dropped), move to different parent, or set allowsNextAction. Use to reactivate dropped tags or reorganize tag hierarchy.

NameRequiredDescriptionDefault
tagIdNoID of the tag to edit
newNameNoNew name for the tag
tagNameNoName of the tag to edit (alternative to tagId)
newStatusNoNew status: 'active', 'onHold', or 'dropped'
newParentTagIdNoID of new parent tag (use empty string to make top-level)
allowsNextActionNoWhether tasks with this tag can be 'next' actions
newParentTagNameNoName of new parent tag (alternative to ID)

TDQS

A3.5/5.0
Behavior2/5

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

No annotations exist, so the description carries the full behavioral burden, yet it discloses none of the key semantics for a mutation: whether unspecified properties are left untouched (partial update), whether renaming affects tasks carrying the tag, what happens to child tags when a parent changes, or whether edits are reversible. Listing the editable fields is scope, not behavior; nothing here warns the agent about side effects of a write.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the operation and its field scope front-loaded, then the usage motivation. No filler, no restatement of the name.

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

Completeness3/5

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

Seven parameters with zero marked required and no output schema means the agent must infer that one of tagId/tagName is mandatory and that tagId/tagName and newParentTagId/newParentTagName are alternative pairs — the description says nothing about this, nor about what a successful edit returns. It is adequate for a simple mutation but leaves the identity requirement entirely to the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including the enum values and the 'empty string makes top-level' trick, so the baseline is 3. The description mirrors the same field list without adding syntax or constraints beyond it, and notably never mentions that an identifier (tagId or tagName) must be supplied.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource ('Edit a tag's properties') and enumerates exactly which properties — rename, status, parent, allowsNextAction — so an agent knows this is a tag-only mutation, not a generic item edit. It stops short of explicitly contrasting with the very similar 'edit_item' sibling, which is the only thing separating it from a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use to reactivate dropped tags or reorganize tag hierarchy' gives concrete, actionable contexts for selection rather than a generic 'use this to edit tags'. However it never states when NOT to use it (e.g. moving tasks between tags belongs to edit_item, bulk renaming to batch tools) and names no alternative.

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

filter_tasksA

Advanced task filtering for ONE project. For filtering across 2+ projects, use batch_filter_tasks instead (single API call). Supports status, dates, tags, search, and more.

NameRequiredDescriptionDefault
limitNoMaximum number of tasks to return (default: 100)
tagIdNoFilter by tag ID(s) (alternative to tagFilter). Can be single ID or array of IDs
sortByNoSort results by field
flaggedNoFilter by flagged status
hasNoteNoFilter tasks that have notes
inInboxNoFilter tasks in inbox
overdueNoShow overdue tasks only
dueAfterNoShow tasks due after this date (ISO format: YYYY-MM-DD)
dueTodayNoShow tasks due today
untaggedNoFilter for tasks with NO tags assigned. Useful after bulk tag removal to find unorganized tasks.
countOnlyNoReturn only the count of matching tasks, not the task data. Much faster for health checks and dashboards.
dueBeforeNoShow tasks due before this date (ISO format: YYYY-MM-DD)
projectIdNoFilter by project ID (alternative to projectFilter)
sortOrderNoSort order (default: asc)
tagFilterNoFilter by tag name(s). Can be single tag or array of tags
deferAfterNoShow tasks with defer date after this date (ISO format: YYYY-MM-DD)
deferTodayNoShow tasks deferred to today
searchTextNoSearch in task names and notes
taskStatusNoFilter by task status. Can specify multiple statuses
deferBeforeNoShow tasks with defer date before this date (ISO format: YYYY-MM-DD)
dueThisWeekNoShow tasks due this week
estimateMaxNoMaximum estimated minutes
estimateMinNoMinimum estimated minutes
hasEstimateNoFilter tasks that have time estimates
perspectiveNoLimit search to specific perspective: inbox, flagged, all tasks
dueThisMonthNoShow tasks due this month
plannedAfterNoShow tasks with planned date after this date (ISO format: YYYY-MM-DD)
plannedTodayNoShow tasks planned for today
deferThisWeekNoShow tasks deferred to this week
exactTagMatchNoSet to true for exact tag name match, false for partial (default: false)
plannedBeforeNoShow tasks with planned date before this date (ISO format: YYYY-MM-DD)
projectFilterNoFilter by project name (partial match)
completedAfterNoShow tasks completed after this date (ISO format: YYYY-MM-DD)
completedTodayNoShow tasks completed today
deferAvailableNoShow tasks whose defer date has passed (now available)
completedBeforeNoShow tasks completed before this date (ISO format: YYYY-MM-DD)
plannedThisWeekNoShow tasks planned for this week
completedThisWeekNoShow tasks completed this week
completedThisMonthNoShow tasks completed this month

TDQS

A4.1/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full disclosure burden. It implies a read-only query, but says nothing about result volume, pagination/limit behavior, the default 100 cap, or the performance shortcut of countOnly — all left to the schema. It also doesn't clarify that omitting a project filter (or using perspective='all') can return tasks spanning projects despite the 'ONE project' framing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the scope constraint and the routing rule. No filler; every clause carries decision-relevant information.

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

Completeness3/5

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

For a 39-parameter tool with no annotations and no output schema, the description is thin: 'and more' hides the parameter surface, and neither the return shape nor the countOnly fast path is explained. Coverage is adequate to route between siblings but not to call confidently without reading the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and every one of the 39 parameters is described in-schema, so baseline is 3. The description only adds a generic summary ('status, dates, tags, search, and more') without surfacing high-value parameters like countOnly, untagged, exactTagMatch, or the tagId/tagFilter and projectId/projectFilter alternatives.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Advanced task filtering') and immediately bounds scope to ONE project, then names the sibling for the multi-project case. An agent can distinguish it from batch_filter_tasks and search_tasks without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the alternative ('use batch_filter_tasks instead') with the triggering condition ('2+ projects') and a rationale ('single API call'). The enumeration of supported filter families (status, dates, tags, search) also tells the agent what this tool is good for.

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

get_completion_statsA

Get task completion counts grouped by project, tag, or folder for a date range. Returns sorted list with counts and percentages. Much faster than multiple filter_tasks calls for analytics.

NameRequiredDescriptionDefault
groupByNoHow to group the completion counts. Default: project
minCountNoOnly include groups with at least this many completions. Default: 0
completedAfterNoStart of period (ISO format: YYYY-MM-DD). Tasks completed on or after this date.
completedBeforeNoEnd of period (ISO format: YYYY-MM-DD). Tasks completed before this date.

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description bears the full disclosure burden. It adds useful behavioral detail about the return output ('sorted list with counts and percentages'), but says nothing about permissions, result-size caps, or behavior when a date range is omitted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences: purpose first, then return shape, then the routing rationale. Nothing is wasted and the key information is front-loaded.

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

Completeness4/5

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

With no output schema, the description correctly sums up the return value as a sorted list with counts and percentages, and the parameters are fully self-documented in the schema. Minor gaps remain around omitted date-range defaults and any limits, but an agent has enough to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and all four parameters carry their own descriptions with defaults and format patterns. The description adds no parameter-level detail beyond what the schema already provides, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get) and resource (task completion counts) plus the exact grouping dimensions and date-range scope. It also names the sibling alternative (multiple filter_tasks calls) so an agent can tell this aggregation tool apart from the raw-listing siblings without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames the use case (analytics) and the alternative it beats (multiple filter_tasks calls), which gives clear routing context. No explicit 'when not to use' exclusions, but the situation that selects this tool is unambiguous.

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

get_custom_perspective_tasksA

Get tasks from a specific OmniFocus custom perspective by name. Use this when user refers to perspective names like 'Today', 'Daily Review', 'This Week' etc. - these are custom views created in OmniFocus, NOT tags. Supports hierarchical tree display of task relationships.

NameRequiredDescriptionDefault
limitNoMaximum number of tasks to return in flat view mode (default: 1000, ignored in hierarchy mode)
ignoreFocusNoWhen true (default), clears Focus mode to return all tasks. When false, respects current Focus and returns only focused tasks.
hideCompletedNoWhether to hide completed tasks. Set to false to show all tasks including completed ones (default: true)
perspectiveIdNoID of the custom perspective (alternative to perspectiveName). Get IDs from list_custom_perspectives.
showHierarchyNoDisplay tasks in hierarchical tree structure showing parent-child relationships (default: false)
perspectiveNameNoExact name of the OmniFocus custom perspective (e.g., 'Today', 'Daily Review', 'This Week'). This is NOT a tag name.

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden, and it omits the one non-obvious behavior: with ignoreFocus defaulting to true the call clears Focus mode, mutating application state. It does disclose that hierarchy display is supported, but says nothing about read-only nature, result volume defaults, or pagination.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with purpose, then the disambiguation, then a capability note. The 'etc.' after the examples is slightly loose but the overall size is appropriate for a 6-parameter tool with no annotations.

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

Completeness3/5

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

There is no output schema and no annotations, so the description should say more about what comes back (flat vs. hierarchical shape, whether completed tasks are included by default) and about the Focus-mode side effect. It is adequate for tool selection but thin for invocation expectations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter is already documented in the schema, including the perspectiveName-vs-tag caveat and the limit/showHierarchy interaction. The description adds only the example perspective names, which is a minor supplement rather than new semantic depth.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get tasks from a specific OmniFocus custom perspective') and explicitly disambiguates the concept from tags, which is the most likely confusion given the sibling tool get_tasks_by_tag. An agent can route correctly without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete trigger: 'Use this when user refers to perspective names like Today, Daily Review, This Week'. It clearly marks the when-to-use case and rules out tags, but never names the alternative tool (list_custom_perspectives for resolving IDs) even though the schema references it.

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

get_flagged_tasksB

Get flagged tasks from OmniFocus with optional project filtering

NameRequiredDescriptionDefault
projectIdNoFilter flagged tasks by project ID (alternative to projectFilter)
hideCompletedNoSet to false to show completed flagged tasks (default: true)
projectFilterNoFilter flagged tasks by project name (optional)

TDQS

B3.1/5.0
Behavior2/5

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

No annotations exist, so the description carries the full behavioral burden, yet it discloses almost nothing: no read-only confirmation, no note on result volume, ordering, or whether completed flagged tasks are included by default (that detail lives only in the schema). 'Get' implies a read but nothing more is characterized.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. The core purpose and the optional filtering capability both land immediately.

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

Completeness3/5

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

For a simple no-param-required read tool with full schema coverage this is minimally adequate, but it says nothing about the returned tasks' shape or the default hideCompleted behavior, and offers no navigation to the many filtering siblings that overlap with it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameters are already documented; baseline 3 applies. The description mentions optional project filtering, which loosely maps to projectId/projectFilter but doesn't clarify when to prefer one over the other.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Get flagged tasks') plus the data source (OmniFocus), which is enough to separate it from siblings like get_inbox_tasks or get_forecast_tasks. It stops short of naming those siblings or stating scope explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this versus filter_tasks, search_tasks, or get_tasks_by_tag, all of which could plausibly return flagged items. 'Optional project filtering' hints at the use case but nothing says when-not to use it.

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

get_folder_by_idB

Get information about a specific folder by ID or name

NameRequiredDescriptionDefault
folderIdNoThe ID of the folder to retrieve
folderNameNoThe name or "Parent > Child" path of the folder to retrieve (alternative to folderId). If it matches more than one folder, the call fails and lists each candidate's path and ID; pass folderId to choose one.

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. 'Get information' implies a read-only operation, but the description does not state whether a missing folder errors, what permissions are required, or what 'information' is returned. It adds little beyond a generic retrieval statement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is a single, front-loaded sentence with no filler. Every word contributes to identifying the operation.

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

Completeness3/5

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

This is a simple lookup tool with fully documented parameters, so the description is mostly adequate. However, with zero required parameters and no output schema, it should clarify that one of folderId or folderName is needed and mention the ambiguity failure mode that the schema describes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the schema itself explains both folderId and the ambiguous folderName path behavior in detail. The description's phrase 'by ID or name' adds no 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.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: retrieving information about a folder. It also names the lookup keys, ID or name. It is clear enough to distinguish from creation tools like add_folder, though it does not explicitly differentiate itself from sibling retrieval tools such as get_project_by_id or get_task_by_id.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description offers only the basic implied usage of retrieving a folder. It does not say when to use folderId versus folderName, what happens if neither is supplied, or how it relates to alternatives like list_projects. The schema carries the only real guidance about ambiguous names.

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

get_forecast_tasksA

Get tasks from OmniFocus forecast perspective (due/deferred tasks in date range)

NameRequiredDescriptionDefault
daysNoNumber of days to look ahead for forecast (default: 7)
hideCompletedNoSet to false to show completed tasks in forecast (default: true)
includeDeferredOnlyNoSet to true to show only deferred tasks becoming available (default: false)

TDQS

A3.5/5.0
Behavior3/5

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

No annotations provided, so description carries burden. It mentions due/deferred tasks and date range but omits read-only nature, permissions, or result formatting. The name 'get' implies safe operation, but more detail would improve transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single, clear sentence that conveys the essential purpose without wasted words. Information is front-loaded.

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

Completeness3/5

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

For a tool with 3 parameters and no output schema, the description covers basic purpose but lacks details on return format, ordering, or pagination. Adequate but not comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 100% description coverage for all three parameters, so baseline is 3. The description adds no extra meaning beyond schema, e.g., does not explain parameter interactions or defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves tasks from OmniFocus forecast perspective, specifying it includes due/deferred tasks in a date range. This distinguishes it from sibling tools like get_flagged_tasks or get_today_completed_tasks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus siblings. With many similar get tasks, the description should indicate scenarios for forecast perspective or mention alternatives.

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

get_inbox_tasksC

Get tasks from OmniFocus inbox perspective

NameRequiredDescriptionDefault
hideCompletedNoSet to false to show completed tasks in inbox (default: true)

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full burden. It only states the basic function and does not disclose behavioral traits like sorting, pagination, or scope of returned tasks. For a simple retrieval tool, more context would be helpful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, but it is too minimal. While concise, it could include more useful details without being verbose, striking a balance between brevity and informativeness.

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

Completeness3/5

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

Given the tool's simplicity (1 parameter, no output schema), the description is adequate but lacks elaboration on what the inbox perspective entails, which is useful for understanding its scope. Not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single parameter, which already describes its purpose and default value. The description adds no additional semantics, meeting the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool gets tasks from the OmniFocus inbox perspective, which identifies the resource and action. However, it does not differentiate from siblings like get_flagged_tasks or get_forecast_tasks, leaving some ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives, such as get_tasks_by_tag or get_custom_perspective_tasks. The agent receives no context for selection.

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

get_project_by_idB

Get information about a specific project by ID or name

NameRequiredDescriptionDefault
projectIdNoThe ID of the project to retrieve
projectNameNoThe name of the project to retrieve (alternative to projectId)

TDQS

B3.3/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It says only that the tool gets information and does not disclose behavior for missing projects, ambiguous project names, or precedence when both projectId and projectName are supplied.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no wasted words. It states the resource and lookup keys immediately.

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

Completeness3/5

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

For a simple two-parameter lookup with full schema coverage, the description is minimally adequate. However, with no output schema and no annotations, it does not say what project information is returned or how lookup ambiguity is handled.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented in the schema, including that projectName is an alternative to projectId. The description mentions ID or name but adds no precedence or conflict-resolution semantics beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a clear verb and resource: 'Get information about a specific project.' It distinguishes a single-project lookup from broader project listing by specifying ID or name, though it does not explicitly name list_projects as the alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: call this when you know a project ID or name and want that specific project. However, the description does not state when to prefer this over list_projects or get_projects_for_review, nor does it address what to do if both projectId and projectName are omitted.

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

get_projects_for_reviewB

Get projects that are due for review (next review date is in the past or today)

NameRequiredDescriptionDefault
limitNoMaximum number of projects to return (default: 50)
includeOnHoldNoInclude on-hold projects in results (default: false)

TDQS

B3.4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It usefully discloses the selection criterion based on next review date, but it does not describe return ordering, pagination behavior, or any permissions/rate-limit context beyond the schema-documented limit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single efficient sentence with the core selection criterion front-loaded. Every phrase earns its place and there is no redundant restatement of the tool name.

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

Completeness4/5

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

For a simple read/list tool with two optional, fully documented parameters and no output schema, the description gives the essential selection logic. It could mention ordering or what a returned project entry contains, but those gaps are minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both optional parameters (limit and includeOnHold) are already documented in the input schema. The description adds no parameter-level meaning beyond the schema, which is acceptable at baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a clear verb and resource: getting projects due for review, and defines 'due' as next review date in the past or today. It is specific about the resource subset, though it does not explicitly name sibling alternatives such as list_projects or get_project_by_id.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the use case by defining 'due for review,' but it gives no explicit guidance on when to choose this tool over list_projects, get_project_by_id, or batch_mark_reviewed. There are no stated prerequisites or exclusions.

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

get_server_versionA

Get OmniFocus MCP server version and build information

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden. 'Get ... version and build information' reasonably implies a read-only, side-effect-free call, but the description never says so explicitly, nor does it mention whether it contacts OmniFocus or works offline.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence that leads with the verb and names the exact payload. Nothing wasted, nothing buried.

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

Completeness4/5

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

For a zero-parameter, no-output-schema metadata getter, the description gives enough to call it correctly. It would be complete at 5 if it clarified the read-only nature or distinguished it from the other diagnostic siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline 4 applies, and the description correctly adds no noise about inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Get OmniFocus MCP server version and build information.' An agent knows exactly what comes back. It does not distinguish itself from the near-neighbor diagnostics siblings diagnose_connection and get_system_health, which keeps it off a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the resource name — an agent infers this is for checking server version/build. There is no explicit statement of when to call this versus diagnose_connection or get_system_health, which overlap in the 'is the server OK' space.

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

get_system_healthA

Get all OmniFocus health metrics in a single call. Returns counts for inbox, projects (by status), tasks (by status), tags, flagged tasks, and untagged tasks. Includes health indicators (🟢/🟡/🔴) and percentages. Much faster than multiple filter_tasks calls for dashboards.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does disclose the return shape, including the health indicator semantics (🟢/🟡/🔴) and that percentages are included. It omits cost/latency notes and aggregation window details, but for a zero-parameter read-only aggregate this is substantially informative.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the headline behavior, then the return contents, then the comparative advantage. No filler or restatement of the name.

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

Completeness5/5

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

No output schema exists, but the description compensates by enumerating the metric categories and indicator format an agent will receive. Combined with zero parameters, an agent has everything needed to decide to call it and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter semantics to explain; the baseline for a no-param tool applies. The description correctly implies no filtering or scoping input is accepted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ("Get all OmniFocus health metrics in a single call") and enumerates exactly what is returned: inbox counts, projects by status, tasks by status, tags, flagged/untagged tasks. It also differentiates itself from the many list_/filter_ siblings by framing itself as the aggregate dashboard call.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear context for use ("for dashboards") and names the alternative it replaces ("multiple filter_tasks calls"). It stops short of explicit when-not guidance — e.g. it doesn't say to prefer the specific list_* tools when only one metric is needed — but the routing signal is strong.

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

get_task_by_idC

Get information about a specific task by ID or name

NameRequiredDescriptionDefault
taskIdNoThe ID of the task to retrieve
taskNameNoThe name of the task to retrieve (alternative to taskId)

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states this is a 'Get' operation, implying it's read-only, but doesn't clarify aspects like authentication needs, error handling (e.g., what happens if the task doesn't exist), rate limits, or response format. For a tool with no annotation coverage, this is a significant gap in transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that front-loads the core purpose ('Get information about a specific task') and adds necessary detail ('by ID or name'). There is no wasted verbiage or redundancy, making it highly concise and well-structured.

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

Completeness2/5

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

Given the lack of annotations and output schema, the description is incomplete for a tool that retrieves task information. It doesn't explain what information is returned (e.g., task details, status, metadata), potential errors, or how to handle the 'ID or name' choice. For a read operation with no structured output documentation, this leaves critical gaps for the agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, with clear descriptions for both parameters ('taskId' and 'taskName'), so the schema does the heavy lifting. The description adds marginal value by noting that 'taskName' is an 'alternative to taskId', but doesn't provide additional semantics like format examples or usage constraints beyond what's in the schema. This meets the baseline for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Get information') and resource ('specific task'), making the purpose understandable. It specifies retrieval by 'ID or name', which adds useful detail. However, it doesn't distinguish this tool from potential sibling tools that might also retrieve tasks (e.g., 'get_tasks_by_tag' or 'filter_tasks'), so it doesn't reach the highest score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention sibling tools like 'get_tasks_by_tag' or 'filter_tasks', nor does it specify prerequisites or exclusions (e.g., whether it works for all tasks or only certain types). This leaves the agent with minimal context for selection.

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

get_tasks_by_tagA

Get tasks filtered by OmniFocus tags (labels like @home, @work, @urgent). Use this for tag-based filtering, NOT for custom perspective names. Tags are labels assigned to individual tasks.

NameRequiredDescriptionDefault
limitNoMaximum number of tasks to return (default: 500). Use to prevent timeout with many tags
tagIdNoID of tag(s) to filter tasks by (alternative to tagName). Can be a single ID or array of IDs
tagNameNoName of tag(s) to filter tasks by. Can be a single tag or array of tags (e.g., ['work', 'urgent'])
exactMatchNoSet to true for exact tag name match, false for partial (default: false)
tagMatchModeNoHow to match multiple tags: 'any' returns tasks with at least one tag (default), 'all' returns tasks with every specified tag
hideCompletedNoSet to false to show completed tasks with this tag (default: true)
includeDroppedNoSet to true to include dropped/inactive tags in search (default: false). Useful for finding tasks with tags that were later dropped.

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the disclosure burden; 'Get' implies a safe read, but nothing states permissions, ordering of results, or how tag matching is resolved beyond the schema's parameter defaults. It does add real semantic context by defining what a tag is and that tags attach to individual tasks, which is beyond structured fields, but return shape and behavior with large tag sets are left to the schema's 'limit' note.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short, front-loaded sentences with zero filler: purpose first, exclusion second, definition third. Nothing repeats the schema or could be cut without losing information.

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

Completeness4/5

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

For a zero-required-parameter read tool with full schema coverage and no output schema, the description covers purpose, scope, and the key disambiguation. It lacks guidance on choosing tagId vs tagName and notes on result ordering, but those are largely covered by the schema descriptions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter (tagId vs tagName, exactMatch, tagMatchMode, hideCompleted, includeDropped, limit) is already documented in the schema. The description only contributes tag examples (@home, @work, @urgent), which is marginal added value, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get tasks filtered by OmniFocus tags') and explicitly distinguishes tags from custom perspectives, which is exactly the confusion an agent could have given the sibling get_custom_perspective_tasks. The definitional sentence 'Tags are labels assigned to individual tasks' removes ambiguity about the filter target.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear when-to-use rule ('tag-based filtering') and a clear when-not rule ('NOT for custom perspective names'), which preempts a common misfire. It stops short of naming the alternative tool (get_custom_perspective_tasks) or contrasting with filter_tasks/search_tasks, so the routing 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.

get_today_completed_tasksC

Get tasks completed today - view today's accomplishments

NameRequiredDescriptionDefault
limitNoMaximum number of tasks to return (default: 20)

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It implies a read-only query but never states the timezone/day boundary that defines 'today', the ordering of results, whether recurring or completed subtasks are included, or what happens past the 20-item default cap — all material for a time-scoped completion query.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Very short and front-loaded, which is good, but the second clause 'view today's accomplishments' merely rephrases the first and earns no place. That space would have been better spent on the day-boundary or ordering behavior.

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

Completeness3/5

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

A simple one-optional-param read tool with no output schema, so the bar is modest. Still, the definition of 'today' (timezone/rollover) and result ordering are gaps an agent would want before relying on the output.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single 'limit' parameter (default 20, max 100), so the schema does the work and the description adds nothing about it. Baseline 3 is appropriate; the description neither compensates nor detracts.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and a well-scoped resource: tasks completed today. The 'today' qualifier distinguishes it from the generic filter_tasks/search_tasks siblings, though the description never names those alternatives to make the distinction explicit. An agent can still grasp the purpose without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this rather than filter_tasks, search_tasks, or get_completion_stats, which are the obvious overlapping siblings. The second clause 'view today's accomplishments' is a restatement, not usage direction, and no prerequisites or exclusions are given.

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

list_custom_perspectivesB

List all custom perspectives defined in OmniFocus

NameRequiredDescriptionDefault
formatNoOutput format: simple (names only) or detailed (with identifiers) - default: simple

TDQS

B3.3/5.0
Behavior2/5

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 listing action but does not explicitly indicate that it is a read-only operation with no side effects, nor does it mention any performance or pagination characteristics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence of 9 words, starting with a verb. It is concise and contains no extraneous information.

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

Completeness3/5

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

For a simple list tool with no output schema, the description is adequate but incomplete; it does not specify that the output is an array of perspective names or objects. The parameter hint at output format partially compensates.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%; the schema already documents the 'format' parameter with enum values and a default. The tool description adds no extra parameter information, meeting the baseline expectation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'List' and resource 'all custom perspectives' with context 'in OmniFocus', clearly distinguishing this tool from siblings like 'get_custom_perspective_tasks' (which retrieves tasks within a perspective) and 'list_tags' (which lists tags).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives, such as noting that 'get_custom_perspective_tasks' should be used to fetch tasks within a perspective. The usage context is implied but not explicitly compared to siblings.

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

list_projectsB

List projects with optional folder and status filtering - the targeted way to discover projects and their IDs

NameRequiredDescriptionDefault
limitNoMaximum number of projects to return (default: 100)
statusNoFilter by project status (default: active)
folderIdNoFilter by folder ID
folderNameNoFilter by folder name or "Parent > Child" path. If it matches more than one folder, the call fails and lists each candidate's path and ID; pass folderId instead. When folderId is given, folderName is not used for filtering.
includeDroppedFoldersNoInclude projects in dropped folders (default: false)

TDQS

B3.3/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. 'List' implies read-only, but nothing is said about default filtering to active projects, result truncation at the limit, or the failure mode of ambiguous folder names — all behaviors an agent needs to interpret the response correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with both clauses doing work: the first establishes the operation and filters, the second establishes the discovery/ID purpose. Front-loaded and zero waste.

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

Completeness3/5

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

For a five-parameter, zero-required list tool with no output schema and no annotations, the description is minimally adequate. It omits that results default to active-only and how many come back by default, which materially affects how an agent interprets an empty or partial list.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including defaults and the folderName ambiguity/failure behavior, so the schema does the heavy lifting. The description only restates that folder and status filtering exist, adding no semantics beyond the schema; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List projects') and adds the distinguishing scope ('optional folder and status filtering'), plus the purpose of ID discovery. It is clearly separable from get_project_by_id and get_projects_for_review, though it never names a sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'The targeted way to discover projects and their IDs' implies the use case (discovery/lookup) but gives no explicit when-not conditions or named alternatives. An agent must infer that get_project_by_id is for a single known project and get_projects_for_review for review workflows.

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

list_tagsB

List all tags defined in OmniFocus with task counts and hierarchy

NameRequiredDescriptionDefault
includeDroppedNoInclude dropped (inactive) tags in the list (default: false)
showTaskCountsNoShow task counts per tag - slower but more informative (default: false)

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden; 'List' implies a safe read, and it discloses that hierarchy is returned. However, saying it lists tags 'with task counts' overstates the default behavior, since showTaskCounts defaults to false and is a slower path per the schema — a minor inaccuracy that could mislead an agent about cost.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; every phrase (tags, counts, hierarchy) adds signal.

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

Completeness4/5

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

For a simple two-optional-boolean read tool with full schema coverage and no output schema, the description conveys what the list contains. The only real gap is the tension between 'with task counts' and the default-off showTaskCounts flag, which an agent should know about.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both booleans (includeDropped, showTaskCounts) are already fully documented with defaults. The description adds no parameter detail and does not clarify dropped-tag inclusion or the performance tradeoff, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

A specific verb (List) plus resource (tags) and scope (defined in OmniFocus), and it notes the payload includes task counts and hierarchy. It is distinguishable from edit_tag and get_tasks_by_tag by the word 'List' and 'defined in', but it never explicitly names a sibling it contrasts with.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no when-to-use or when-not guidance and does not mention alternatives such as get_tasks_by_tag (which returns tasks for a tag, not the tag catalog). The agent must infer that this is a discovery/lookup tool.

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

remove_itemA

Remove a SINGLE task or project from OmniFocus. For removing 2+ items, use batch_remove_items instead (9x faster).

NameRequiredDescriptionDefault
idNoThe ID of the task or project to remove
nameNoThe name of the task or project to remove (as fallback if ID not provided)
itemTypeYesType of item to remove ('task' or 'project')

TDQS

A3.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden, yet it says nothing about what removal actually does — whether the item goes to a trash/recoverable state or is permanently destroyed, whether confirmation exists, or what happens if the id/name matches nothing. It only conveys routing and speed, which are usage guidance rather than behavioral disclosure of a destructive mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste, with the cardinality constraint front-loaded and the alternative plus its rationale in the second sentence. Every clause earns its place.

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

Completeness3/5

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

For a 3-parameter destructive tool with no annotations and no output schema, the description covers routing well but omits the consequences of the operation (recoverability, failure modes, return value). An agent still lacks enough to predict what happens after a successful or unsuccessful call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so id, name fallback logic, and the task/project enum are already fully documented in the schema. The description adds no parameter-level meaning (e.g., precedence between id and name, or error behavior), so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Remove') and resource ('a SINGLE task or project') with explicit cardinality scope, and names the sibling it is not (batch_remove_items). An agent can distinguish it from the batch sibling without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use-this vs when-to-use-the-alternative rule ('For removing 2+ items, use batch_remove_items instead') and even quantifies why (9x faster). Nothing is left to inference about tool selection.

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

search_tasksA

Full-text search across task names and notes. Simpler than filter_tasks for finding tasks by text. Supports match modes: contains, anyWord, allWords, exact.

NameRequiredDescriptionDefault
limitNoMaximum results to return
queryYesSearch query - matches task names and notes
searchInNoWhere to search: 'all' (default), 'name' only, or 'note' onlyall
matchModeNoHow to match: 'contains' (default), 'anyWord', 'allWords', or 'exact'contains
projectIdNoLimit search to project with this ID
projectNameNoLimit search to this project
includeCompletedNoInclude completed tasks in results

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries behavioral burden. It usefully discloses that matching spans both names and notes and enumerates the supported match modes, but says nothing about result ordering, pagination behavior, or how the default limit of 50 interacts with large result sets. Adequate but with real gaps for a no-annotation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with zero filler, purpose front-loaded followed by sibling differentiation and supported modes. Every sentence earns its place.

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

Completeness4/5

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

For a 7-parameter search tool with no output schema, the description covers purpose, text scope, and match modes, and the schema fills in filtering and limit details. Minor gaps remain around result ordering and pagination, but an agent has enough to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all seven parameters including projectId, projectName, and includeCompleted are already documented in the schema. The description repeats the match modes verbatim rather than adding semantics like default behavior or interaction with searchIn, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Full-text search across task names and notes') with clear scope, and distinguishes itself from the sibling filter_tasks by name. An agent can immediately tell what this tool does and when it differs from the filter family.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames itself as 'Simpler than filter_tasks for finding tasks by text,' which gives clear positive guidance for choosing this tool. However, it doesn't state the inverse condition — when filter_tasks is the better choice — so the routing is only half-specified.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 31 tool updatesv2.1.1
    • First observedadd_folder
    • First observedadd_omnifocus_task
    • First observedadd_project
    • First observedbatch_add_items
    • First observedbatch_edit_items
    • First observedbatch_filter_tasks
    • First observedbatch_mark_reviewed
    • First observedbatch_remove_items
    • First observeddiagnose_connection
    • First observedduplicate_project
    • First observededit_item
    • First observededit_tag
    • First observedfilter_tasks
    • First observedget_completion_stats
    • First observedget_custom_perspective_tasks
    • First observedget_flagged_tasks
    • First observedget_folder_by_id
    • First observedget_forecast_tasks
    • First observedget_inbox_tasks
    • First observedget_project_by_id
    • First observedget_projects_for_review
    • First observedget_server_version
    • First observedget_system_health
    • First observedget_task_by_id
    • First observedget_tasks_by_tag
    • First observedget_today_completed_tasks
    • First observedlist_custom_perspectives
    • First observedlist_projects
    • First observedlist_tags
    • First observedremove_item
    • First observedsearch_tasks

TDQS

B3.3/5.0

Scored across 31 tools

Disambiguation4/5

Most tools have clearly distinct purposes, and descriptions actively steer agents between single-item and batch variants. However, the query surface (get_tasks_by_tag, filter_tasks, batch_filter_tasks, search_tasks, get_custom_perspective_tasks, get_system_health) has enough conceptual overlap that misselection is still plausible.

Naming Consistency4/5

The set is predominantly snake_case verb_noun and is generally predictable. Minor deviations like add_omnifocus_task, batch_add_items, and the mix of get_task_by_id vs get_tasks_by_tag keep it from being perfectly consistent.

Tool Count2/5

At 31 tools, the surface is heavy for a single MCP server, and much of the count comes from paired single-item and batch tools for the same operations. While OmniFocus is a broad domain, the duplication makes the set larger than necessary.

Completeness3/5

Task and project operations are well covered, including batch workflows, reviews, perspectives, search, and stats. However, folder and tag lifecycle coverage is incomplete (e.g., no clear folder edit/delete/list tools and no explicit tag creation/deletion), creating notable gaps.

Maintenance

ActivityMaintained
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers