OmniFocus MCP Server
Provides comprehensive task and project management for OmniFocus on macOS, including creating hierarchical tasks, managing folders and projects, accessing built-in and custom perspectives, handling repeating tasks, setting planned dates, managing project reviews, batch operations, and advanced filtering with tag support.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@OmniFocus MCP Servershow me all tasks planned for today"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
of-mcp
An MCP server for OmniFocus. Originally forked from jqlts1/omnifocus-mcp-enhanced, now maintained independently with additional features.
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.CustomAPI🌳 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
Clone the repository:
git clone https://github.com/mojenmojen/of-mcp.git cd of-mcp npm install && npm run buildFaster build (skips type checking):
npm run build:fastThis uses esbuild (~14ms) instead of tsc. See Troubleshooting for details.
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/2025Why This Is Powerful:
✅ Native Integration - Uses OmniFocus
Perspective.CustomAPI 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, lastReviewDateReview 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
add_omnifocus_task - Create tasks (enhanced with subtask support)
add_project - Create projects
add_folder - Create folders (with nesting support)
remove_item - Delete tasks or projects
edit_item - Edit tasks or projects
batch_add_items - Bulk add tasks/projects (true batching - 9x faster)
batch_edit_items - Bulk edit tasks/projects (true batching - 12x faster)
batch_remove_items - Bulk remove (true batching - 9x faster)
get_task_by_id - Query task information (includes subtasks with status, flags, and nesting depth)
list_projects - List projects with folder/status filtering
🔍 Built-in Perspective Tools
get_inbox_tasks - Inbox perspective
get_flagged_tasks - Flagged perspective
get_forecast_tasks - Forecast perspective (due/deferred tasks)
get_tasks_by_tag - Tag-based filtering (single or multiple tags with any/all matching)
list_tags - List all tags with task counts and hierarchy
filter_tasks - Ultimate filtering with unlimited combinations
batch_filter_tasks - Filter multiple projects in one call (faster than multiple filter_tasks)
🌟 Custom Perspective Tools
list_custom_perspectives - List all custom perspectives with details
get_custom_perspective_tasks - Access custom perspective with hierarchical display
📊 Analytics & Tracking
get_today_completed_tasks - View today's completed tasks
📋 Project Review Tools
get_projects_for_review - Get projects due for review
batch_mark_reviewed - Mark multiple projects as reviewed
🔧 Utility Tools
get_server_version - Get server version and build information
get_project_by_id - Query project information by ID or name (includes review data)
get_folder_by_id - Query folder information by ID or name
diagnose_connection - Check OmniFocus connectivity and permissions
🆕 New Tools (v1.23.0)
search_tasks - Full-text search across task names and notes (simpler than filter_tasks)
duplicate_project - Create a copy of a project including all tasks (great for templates)
edit_tag - Edit tag properties: rename, change status, move to parent, or set allowsNextAction
🆕 New Tools (v1.27.0) - AI Assistant Optimizations
get_system_health - Get all health metrics in ONE call (inbox, projects, tasks, tags, flagged, untagged)
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": [...] }
# ... etcUse 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 |
|
|
|
|
|
|
|
|
|
|
| name equivalents |
|
|
|
|
|
|
|
| name equivalents |
|
| name equivalents |
|
| name equivalents |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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_perspectivesAnalytics & 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 buildhangs or runs out of memory, checknpx 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), sopackage.jsoncaps it at~5.6.3. An install made before the cap may still have a newer version; runnpm cito reinstall from the lockfile.npm run build:fastuses esbuild, which skips type checking but produces a working serverFor type checking, run
npx tsc --noEmitseparately 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_versionto verify the correct version is loaded after updates. The response now includes abuildobject (commit,dirty,contentHash,buildStale).buildStale: truemeans the running process predates the on-disk build — restart the server to clear it. Note thatbuildStale: falseonly proves the process matches the on-disk build; to confirm you are on the intended source, also comparebuild.commitagainstgit 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_reviewandbatch_mark_reviewedTeam 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 callsLazy 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.
Fork the repository
Create a feature branch
Make your changes
Add tests if applicable
Submit a pull request
Release Checklist
When releasing a new version:
Bump version in
package.jsonUpdate this README with any new features or tools
Commit and push changes
📄 License
MIT License - see LICENSE file for details.
🔗 Links
This Fork: https://github.com/mojenmojen/of-mcp
Original Project: https://github.com/jqlts1/omnifocus-mcp-enhanced
OmniFocus: https://www.omnigroup.com/omnifocus/
Model Context Protocol: https://modelcontextprotocol.io/
Claude Code: https://docs.anthropic.com/en/docs/claude-code
🙏 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 toolsadd_folderC
Add a new folder to OmniFocus
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The name of the folder to create | |
| parentFolderId | No | Parent folder ID (alternative to parentFolderName) | |
| parentFolderName | No | Parent 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
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The name of the task | |
| note | No | Additional notes for the task | |
| tags | No | Tags to assign to the task | |
| dueDate | No | The due date of the task in ISO format (YYYY-MM-DD or full ISO date) | |
| flagged | No | Whether the task is flagged or not | |
| deferDate | No | The defer date of the task in ISO format (YYYY-MM-DD or full ISO date) | |
| projectId | No | The ID of the project to add the task to (alternative to projectName) | |
| plannedDate | No | The planned date (when you intend to work on this) in ISO format (YYYY-MM-DD or full ISO date) | |
| projectName | No | The name of the project to add the task to (will add to inbox if not specified) | |
| parentTaskId | No | The ID of the parent task to create this task as a subtask | |
| parentTaskName | No | The name of the parent task to create this task as a subtask (alternative to parentTaskId) | |
| repetitionRule | No | Repetition rule for recurring tasks. Examples: {frequency: 'daily'}, {frequency: 'weekly', daysOfWeek: [1,3,5]}, {frequency: 'monthly', dayOfMonth: 15} | |
| estimatedMinutes | No | Estimated time to complete the task, in minutes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The name of the project | |
| note | No | Additional notes for the project | |
| tags | No | Tags to assign to the project | |
| dueDate | No | The due date of the project in ISO format (YYYY-MM-DD or full ISO date) | |
| flagged | No | Whether the project is flagged or not | |
| folderId | No | The ID of the folder to add the project to (alternative to folderName) | |
| deferDate | No | The defer date of the project in ISO format (YYYY-MM-DD or full ISO date) | |
| folderName | No | The 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. | |
| sequential | No | Whether tasks in the project should be sequential (default: false) | |
| estimatedMinutes | No | Estimated time to complete the project, in minutes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | Array of items (tasks or projects) to add |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| edits | Yes | Array of edit operations to perform |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum tasks per project (default: 100) | |
| sortBy | No | Sort results by field | |
| flagged | No | Filter by flagged status | |
| overdue | No | Show overdue tasks only | |
| dueAfter | No | Show tasks due after this date (ISO format: YYYY-MM-DD) | |
| dueToday | No | Show tasks due today | |
| dueBefore | No | Show tasks due before this date (ISO format: YYYY-MM-DD) | |
| sortOrder | No | Sort order (default: asc) | |
| deferAfter | No | Show tasks with defer date after this date (ISO format: YYYY-MM-DD) | |
| deferToday | No | Show tasks deferred to today | |
| projectIds | No | Array of project IDs to filter by | |
| taskStatus | No | Filter by task status. Can specify multiple statuses | |
| deferBefore | No | Show tasks with defer date before this date (ISO format: YYYY-MM-DD) | |
| dueThisWeek | No | Show tasks due this week | |
| dueThisMonth | No | Show tasks due this month | |
| plannedAfter | No | Show tasks with planned date after this date (ISO format: YYYY-MM-DD) | |
| plannedToday | No | Show tasks planned for today | |
| projectNames | No | Array of project names to filter by (partial match) | |
| deferThisWeek | No | Show tasks deferred to this week | |
| plannedBefore | No | Show tasks with planned date before this date (ISO format: YYYY-MM-DD) | |
| completedAfter | No | Show tasks completed after this date (ISO format: YYYY-MM-DD) | |
| completedToday | No | Show tasks completed today | |
| deferAvailable | No | Show tasks whose defer date has passed (now available) | |
| completedBefore | No | Show tasks completed before this date (ISO format: YYYY-MM-DD) | |
| plannedThisWeek | No | Show tasks planned for this week | |
| completedThisWeek | No | Show tasks completed this week | |
| completedThisMonth | No | Show tasks completed this month |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. 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.
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.
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.
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.
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.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| projectIds | No | Array of project IDs to mark as reviewed | |
| projectNames | No | Array of project names to mark as reviewed (alternative to projectIds) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | Array of items (tasks or projects) to remove |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| newName | Yes | Name for the duplicated project | |
| copyTags | No | Copy task tags | |
| folderId | No | Folder ID to place the new project in | |
| copyNotes | No | Copy task notes | |
| folderName | No | Name 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. | |
| resetDates | No | Clear all dates (defer, due) from duplicated tasks | |
| shiftDates | No | Shift all dates relative to a new start date (overrides resetDates) | |
| clearCompleted | No | Reset all tasks to incomplete status | |
| sourceProjectId | No | ID of project to duplicate | |
| sourceProjectName | No | Name of project to duplicate (if ID not provided) |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The ID of the task or project to edit | |
| name | No | The name of the task or project to edit (as fallback if ID not provided) | |
| addTags | No | Tags to add (works on both tasks and projects) | |
| newName | No | New name for the item | |
| newNote | No | New note for the item | |
| itemType | Yes | Type of item to edit ('task' or 'project') | |
| newStatus | No | New status for tasks (incomplete, completed, dropped) | |
| newDueDate | No | New due date in ISO format (YYYY-MM-DD or full ISO date); set to empty string to clear | |
| newFlagged | No | Set flagged status (set to false for no flag, true for flag) | |
| removeTags | No | Tags to remove (works on both tasks and projects) | |
| moveToInbox | No | Set to true to move task to inbox | |
| newFolderId | No | New folder to move the project to (by folder ID) | |
| replaceTags | No | Replace all existing tags (works on both tasks and projects) | |
| markReviewed | No | Mark project as reviewed (advances next review date by interval). Only applies to projects. | |
| newDeferDate | No | New defer date in ISO format (YYYY-MM-DD or full ISO date); set to empty string to clear | |
| newProjectId | No | Move task to a different project (by project ID) | |
| newFolderName | No | New 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). | |
| newSequential | No | Whether the project should be sequential | |
| dropCompletely | No | When dropping a repeating task, set to true to drop completely (stop all future occurrences). Default false drops only the current occurrence. | |
| newPlannedDate | No | New planned date (when you intend to work on this) in ISO format; set to empty string to clear | |
| newProjectName | No | Move task to a different project (by project name) | |
| newParentTaskId | No | Move task to be a subtask of another task (by task ID) | |
| newProjectStatus | No | New status for projects | |
| newNextReviewDate | No | Set next review date directly (ISO format YYYY-MM-DD). Only applies to projects. | |
| newParentTaskName | No | Move task to be a subtask of another task (by task name) | |
| newRepetitionRule | No | New 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]} | |
| newReviewInterval | No | Set new review interval in days (must be a positive integer). Only applies to projects. | |
| newEstimatedMinutes | No | New estimated minutes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden; 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tagId | No | ID of the tag to edit | |
| newName | No | New name for the tag | |
| tagName | No | Name of the tag to edit (alternative to tagId) | |
| newStatus | No | New status: 'active', 'onHold', or 'dropped' | |
| newParentTagId | No | ID of new parent tag (use empty string to make top-level) | |
| allowsNextAction | No | Whether tasks with this tag can be 'next' actions | |
| newParentTagName | No | Name of new parent tag (alternative to ID) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of tasks to return (default: 100) | |
| tagId | No | Filter by tag ID(s) (alternative to tagFilter). Can be single ID or array of IDs | |
| sortBy | No | Sort results by field | |
| flagged | No | Filter by flagged status | |
| hasNote | No | Filter tasks that have notes | |
| inInbox | No | Filter tasks in inbox | |
| overdue | No | Show overdue tasks only | |
| dueAfter | No | Show tasks due after this date (ISO format: YYYY-MM-DD) | |
| dueToday | No | Show tasks due today | |
| untagged | No | Filter for tasks with NO tags assigned. Useful after bulk tag removal to find unorganized tasks. | |
| countOnly | No | Return only the count of matching tasks, not the task data. Much faster for health checks and dashboards. | |
| dueBefore | No | Show tasks due before this date (ISO format: YYYY-MM-DD) | |
| projectId | No | Filter by project ID (alternative to projectFilter) | |
| sortOrder | No | Sort order (default: asc) | |
| tagFilter | No | Filter by tag name(s). Can be single tag or array of tags | |
| deferAfter | No | Show tasks with defer date after this date (ISO format: YYYY-MM-DD) | |
| deferToday | No | Show tasks deferred to today | |
| searchText | No | Search in task names and notes | |
| taskStatus | No | Filter by task status. Can specify multiple statuses | |
| deferBefore | No | Show tasks with defer date before this date (ISO format: YYYY-MM-DD) | |
| dueThisWeek | No | Show tasks due this week | |
| estimateMax | No | Maximum estimated minutes | |
| estimateMin | No | Minimum estimated minutes | |
| hasEstimate | No | Filter tasks that have time estimates | |
| perspective | No | Limit search to specific perspective: inbox, flagged, all tasks | |
| dueThisMonth | No | Show tasks due this month | |
| plannedAfter | No | Show tasks with planned date after this date (ISO format: YYYY-MM-DD) | |
| plannedToday | No | Show tasks planned for today | |
| deferThisWeek | No | Show tasks deferred to this week | |
| exactTagMatch | No | Set to true for exact tag name match, false for partial (default: false) | |
| plannedBefore | No | Show tasks with planned date before this date (ISO format: YYYY-MM-DD) | |
| projectFilter | No | Filter by project name (partial match) | |
| completedAfter | No | Show tasks completed after this date (ISO format: YYYY-MM-DD) | |
| completedToday | No | Show tasks completed today | |
| deferAvailable | No | Show tasks whose defer date has passed (now available) | |
| completedBefore | No | Show tasks completed before this date (ISO format: YYYY-MM-DD) | |
| plannedThisWeek | No | Show tasks planned for this week | |
| completedThisWeek | No | Show tasks completed this week | |
| completedThisMonth | No | Show tasks completed this month |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| groupBy | No | How to group the completion counts. Default: project | |
| minCount | No | Only include groups with at least this many completions. Default: 0 | |
| completedAfter | No | Start of period (ISO format: YYYY-MM-DD). Tasks completed on or after this date. | |
| completedBefore | No | End of period (ISO format: YYYY-MM-DD). Tasks completed before this date. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of tasks to return in flat view mode (default: 1000, ignored in hierarchy mode) | |
| ignoreFocus | No | When true (default), clears Focus mode to return all tasks. When false, respects current Focus and returns only focused tasks. | |
| hideCompleted | No | Whether to hide completed tasks. Set to false to show all tasks including completed ones (default: true) | |
| perspectiveId | No | ID of the custom perspective (alternative to perspectiveName). Get IDs from list_custom_perspectives. | |
| showHierarchy | No | Display tasks in hierarchical tree structure showing parent-child relationships (default: false) | |
| perspectiveName | No | Exact name of the OmniFocus custom perspective (e.g., 'Today', 'Daily Review', 'This Week'). This is NOT a tag name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, 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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | Filter flagged tasks by project ID (alternative to projectFilter) | |
| hideCompleted | No | Set to false to show completed flagged tasks (default: true) | |
| projectFilter | No | Filter flagged tasks by project name (optional) |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| folderId | No | The ID of the folder to retrieve | |
| folderName | No | The 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
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.
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.
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.
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.
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.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Number of days to look ahead for forecast (default: 7) | |
| hideCompleted | No | Set to false to show completed tasks in forecast (default: true) | |
| includeDeferredOnly | No | Set to true to show only deferred tasks becoming available (default: false) |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| hideCompleted | No | Set to false to show completed tasks in inbox (default: true) |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | The ID of the project to retrieve | |
| projectName | No | The name of the project to retrieve (alternative to projectId) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. 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.
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.
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.
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.
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.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of projects to return (default: 50) | |
| includeOnHold | No | Include on-hold projects in results (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. 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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. '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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| taskId | No | The ID of the task to retrieve | |
| taskName | No | The name of the task to retrieve (alternative to taskId) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of tasks to return (default: 500). Use to prevent timeout with many tags | |
| tagId | No | ID of tag(s) to filter tasks by (alternative to tagName). Can be a single ID or array of IDs | |
| tagName | No | Name of tag(s) to filter tasks by. Can be a single tag or array of tags (e.g., ['work', 'urgent']) | |
| exactMatch | No | Set to true for exact tag name match, false for partial (default: false) | |
| tagMatchMode | No | How to match multiple tags: 'any' returns tasks with at least one tag (default), 'all' returns tasks with every specified tag | |
| hideCompleted | No | Set to false to show completed tasks with this tag (default: true) | |
| includeDropped | No | Set to true to include dropped/inactive tags in search (default: false). Useful for finding tasks with tags that were later dropped. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the disclosure burden; '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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of tasks to return (default: 20) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. 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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Output format: simple (names only) or detailed (with identifiers) - default: simple |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It only states the 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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of projects to return (default: 100) | |
| status | No | Filter by project status (default: active) | |
| folderId | No | Filter by folder ID | |
| folderName | No | Filter 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. | |
| includeDroppedFolders | No | Include projects in dropped folders (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. '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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| includeDropped | No | Include dropped (inactive) tags in the list (default: false) | |
| showTaskCounts | No | Show task counts per tag - slower but more informative (default: false) |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The ID of the task or project to remove | |
| name | No | The name of the task or project to remove (as fallback if ID not provided) | |
| itemType | Yes | Type of item to remove ('task' or 'project') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results to return | |
| query | Yes | Search query - matches task names and notes | |
| searchIn | No | Where to search: 'all' (default), 'name' only, or 'note' only | all |
| matchMode | No | How to match: 'contains' (default), 'anyWord', 'allWords', or 'exact' | contains |
| projectId | No | Limit search to project with this ID | |
| projectName | No | Limit search to this project | |
| includeCompleted | No | Include completed tasks in results |
TDQS
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.
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.
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.
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.
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.
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.
31 tool updates
v2.1.1- First observed
add_folder - First observed
add_omnifocus_task - First observed
add_project - First observed
batch_add_items - First observed
batch_edit_items - First observed
batch_filter_tasks - First observed
batch_mark_reviewed - First observed
batch_remove_items - First observed
diagnose_connection - First observed
duplicate_project - First observed
edit_item - First observed
edit_tag - First observed
filter_tasks - First observed
get_completion_stats - First observed
get_custom_perspective_tasks - First observed
get_flagged_tasks - First observed
get_folder_by_id - First observed
get_forecast_tasks - First observed
get_inbox_tasks - First observed
get_project_by_id - First observed
get_projects_for_review - First observed
get_server_version - First observed
get_system_health - First observed
get_task_by_id - First observed
get_tasks_by_tag - First observed
get_today_completed_tasks - First observed
list_custom_perspectives - First observed
list_projects - First observed
list_tags - First observed
remove_item - First observed
search_tasks
TDQS
Scored across 31 tools
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.
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.
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.
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
Related MCP Connectors
Manage tasks, Focus Zone, notes, projects, and task history from compatible AI assistants.
- RedboothOAuthcom.redbooth
Manage Redbooth tasks, task lists, comments, tags and files from Claude and other AI assistants.
Notes and actions in one app. Let Claude or ChatGPT read and update them.
- AkiflowOAuthcom.akiflow
Official Akiflow MCP for tasks, calendars, scheduling, time slots, and meeting transcripts.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables comprehensive management of OmniFocus on macOS through 17 specialized tools for projects, tasks, and organization. Users can create, update, and filter items or navigate the interface using natural language via the Model Context Protocol.218MIT
- AlicenseAqualityBmaintenanceEnables AI assistants to read and write to OmniFocus database, allowing natural language task management, project creation, and GTD workflows.41MIT
- AlicenseAqualityBmaintenanceGives MCP-compatible AI assistants full, typed access to OmniFocus on macOS, enabling task management, project manipulation, inbox processing, and more via natural language.1006 npm2MIT
- AlicenseAqualityDmaintenanceEnables task management in OmniFocus, including reading, creating, updating, and completing tasks, with automatic detection of Pro or Standard version.77 npmMIT