Skip to main content
Glama
OmniFocus MCP Server

OmniFocus MCP Server

by estrenuo

OmniFocus MCP 서버

macOS의 OmniFocus와 AI 어시스턴트가 상호작용할 수 있게 해주는 MCP(Model Context Protocol) 서버입니다. JXA(JavaScript for Automation)를 사용합니다.

기능

이 MCP 서버는 OmniFocus의 다양한 기능에 접근할 수 있게 해줍니다:

작업 관리

  • 받은 편지함 작업 나열 - 받은 편지함의 작업을 필터링하여 조회합니다(다중 태그 필터링 포함)

  • 작업 생성 - 전체 속성을 지원하는 새 작업을 추가합니다(마감일, 예정일, 태그, 메모, 하위 작업, 반복)

  • 작업 업데이트 - 이름, 메모, 날짜, 플래그, 예상 시간, 반복을 변경하거나 작업을 다른 프로젝트로 이동합니다

  • 작업 완료/보류 - 작업을 개별적으로 또는 일괄로 완료 또는 보류 처리합니다

  • 작업 삭제 - 작업을 영구적으로 제거합니다

  • 작업 메모 업데이트 - 작업의 메모를 교체, 삭제 또는 추가합니다

  • 기한 작업 조회 - 특정 기간 내에 마감되는 작업을 찾습니다

  • 예정 작업 조회 - 특정 기간 내에 예정된 작업을 찾습니다

  • 플래그 작업 조회 - 플래그가 지정된 모든 항목을 나열합니다

  • 작업 태그 추가/제거 - 작업 태그를 개별적으로 또는 일괄로 관리합니다

프로젝트 관리

  • 프로젝트 나열 - 상태 필터링으로 프로젝트를 조회합니다

  • 프로젝트 작업 조회 - 특정 프로젝트에 속한 모든 작업을 나열합니다

  • 프로젝트 생성 - 폴더 배치, 상태, 날짜, 순차 모드, 검토 주기를 지원하는 새 프로젝트를 만듭니다

  • 프로젝트 업데이트 - 이름, 메모, 상태, 플래그, 날짜, 순차 모드, 검토 주기를 변경합니다

  • 프로젝트 삭제 - 프로젝트와 그 작업을 제거합니다

  • 프로젝트 메모 업데이트 - 프로젝트의 메모를 교체, 삭제 또는 추가합니다

  • 검토 대상 프로젝트 조회 - 검토가 필요한 프로젝트를 찾습니다(미완료 작업 포함 여부 선택 가능)

  • 프로젝트 검토 완료 표시 - 프로젝트의 검토 상태와 다음 검토 날짜를 업데이트합니다

  • 일괄 검토 완료 표시 - 여러 프로젝트를 한 번에 효율적으로 검토 처리합니다

조직 관리

  • 폴더 나열 - 폴더 계층 구조를 조회합니다

  • 폴더 생성/이름 변경/삭제 - 폴더 트리를 관리합니다(중첩 폴더 포함)

  • 태그 나열 - 모든 태그를 조회합니다

  • 원근법 나열 - 기본 및 사용자 정의 원근법을 조회합니다

  • 원근법 작업 조회 - 특정 원근법에 표시되는 작업을 나열합니다

검색

  • 통합 검색 - 작업, 프로젝트, 폴더, 태그를 아우르는 검색을 수행합니다

안전 속성

  • 중복 이름에 대한 무음 실패 없음. OmniFocus는 두 프로젝트(또는 작업)가 같은 이름을 공유할 수 있습니다. 이름 조회는 모든 일치 항목을 수집하고 일치 항목이 둘 이상일 경우 해당 ID와 함께 실패하므로, 이름 변경·이동·삭제가 성공으로 보고되면서 잘못된 항목에 적용되는 일이 없습니다.

  • 변경 사항 검증. JXA가 조용히 실패할 수 있는 작업(특히 프로젝트 간 작업 이동)은 동일한 스크립트 내에서 결과를 다시 읽어 확인하므로, 실패한 이동이 성공으로 보고되지 않습니다.

Related MCP server: OmniFocus MCP Server

요구 사항

  • macOS (OmniFocus는 macOS/iOS 전용이며, 이 서버는 JXA를 사용합니다)

  • OmniFocus 3+ 설치 필요

  • Node.js 18+

  • 자동화 권한 - 터미널/클라이언트 앱에 대해 활성화 필요

설치

  1. 이 저장소를 클론하거나 다운로드합니다:

    cd omnifocus-mcp-server
  2. 의존성을 설치합니다:

    npm install
  3. TypeScript를 빌드합니다:

    npm run build
  4. MCP 클라이언트가 서버를 사용하도록 구성합니다(아래 구성 참조)

구성

Claude Desktop

Claude Desktop 구성 파일(~/Library/Application Support/Claude/claude_desktop_config.json)에 다음을 추가합니다:

{
  "mcpServers": {
    "omnifocus": {
      "command": "/opt/homebrew/bin/node",
      "args": ["/path/to/omnifocus-mcp-server/dist/index.js"]
    }
  }
}

node 바이너리의 절대 경로를 사용하세요. 단순한 "node"는 GUI 세션의 PATH를 기준으로 해석되는데, 여기에는 Homebrew나 버전 관리자의 shim이 포함되지 않으므로 터미널에서는 정상 작동해도 서버가 "server unreachable" 스타일 오류로 시작에 실패합니다. 자신의 경로는 which node로 확인하세요.

기타 MCP 클라이언트

서버는 기본적으로 stdio 전송을 사용하므로, 클라이언트가 다음을 실행하도록 구성하세요:

node /path/to/omnifocus-mcp-server/dist/index.js

원격 접속(HTTP 전송)

원격 클라이언트 — 특히 claude.ai 커스텀 커넥터(Claude iOS 앱이 MCP 서버에 도달하는 방식) — 의 경우, 서버를 Streamable HTTP 엔드포인트로 실행할 수 있습니다:

MCP_TRANSPORT=http \
MCP_AUTH_TOKEN="$(openssl rand -hex 32)" \
node /path/to/omnifocus-mcp-server/dist/index.js

환경 변수:

변수

기본값

용도

MCP_TRANSPORT

stdio

http로 설정하면 HTTP 전송을 활성화합니다

MCP_HTTP_PORT

3000

수신 대기 포트

MCP_HTTP_HOST

127.0.0.1

바인드 주소(루프백 유지; 터널을 통해 노출)

MCP_AUTH_TOKEN

—

필수 공유 비밀키; 없으면 서버가 시작을 거부합니다

MCP_PUBLIC_URL

—

서버가 도달 가능한 공개 HTTPS 원본(예: https://your-tunnel-host). 이 값을 설정하면 claude.ai / Claude Desktop의 "Connectors" UI에 필요한 OAuth 계층이 활성화됩니다 — 아래 참조. 직접/프로그램 방식 클라이언트만 사용한다면 설정하지 않아도 됩니다(정적 토큰만 필요).

OMNIFOCUS_SCRIPT_TIMEOUT_MS

60000

JXA 스크립트가 멈출 경우 종료하는 시간(두 전송 방식 모두에 적용)

MCP 엔드포인트는 /mcp입니다. 인증은 Authorization: <token> 헤더 또는 경로 세그먼트(/mcp/<token>)를 통해 이루어집니다 — 사용자 정의 헤더를 보낼 수 없는 클라이언트를 위한 방식입니다. GET /health는 인증 없이 접근 가능합니다.

claude.ai / iOS 앱에서 접근하기. 커스텀 커넥터는 Anthropic의 클라우드(사용자 기기가 아님)에서 연결하므로, 엔드포인트는 HTTPS로 공개적으로 도달 가능해야 합니다. Cloudflare Tunnel 또는 Tailscale Funnel이 모두 이 용도로 작동합니다 — 어느 쪽이든 로컬 프로세스가 아웃바운드 연결을 만들므로 열린 포트가 필요 없습니다. (일반 Tailscale은 불가능합니다: 그건 자신의 tailnet에만 도달하며 Anthropic의 클라우드는 그 안에 없습니다.) 선택적으로 Cloudflare WAF 규칙에서 Anthropic의 아웃바운드 IP 범위(160.79.104.0/21)로 접근을 제한할 수 있습니다.

claude.ai 및 Claude Desktop의 "Connectors" UI는 원시 MCP 구성/직접 API 클라이언트와 달리, 원격 서버를 호출하기 전에 항상 전체 OAuth 핸드셰이크를 수행합니다 — URL에 토큰이 포함되어 있어도 정적 토큰만으로는 받아들이지 않습니다. MCP_PUBLIC_URL을 터널의 공개 원본으로 설정하면 동일한 정적 비밀키로 접근을 제어하면서 이 요구를 충족하는 자체 발급 OAuth 계층이 활성화됩니다(방법은 oauth.ts / CLAUDE.md 참조). 설정 후에는 Settings → Connectors에서 경로-토큰 URL(https://your-tunnel-host/mcp/<token>)로 커넥터를 추가하세요 — "Connect" 단계에서 OAuth 핸드셰이크가 자동으로 완료됩니다. 터널이 /를 다른 로컬 서비스로도 프록시한다면, /authorize, /token, /register, /.well-known/*가 이 서버로 매핑되는지 확인하세요. 그렇지 않으면 OAuth 요청이 이 서버에 도달하지 못합니다.

Mac은 OmniFocus가 실행된 상태로 깨어 있어야 합니다(caffeinate -s 또는 Amphetamine 사용).

세션 의미론 — 단일 클라이언트 전용. HTTP 전송은 한 번에 하나의 세션만 제공합니다: 새 initialize가 이전 세션을 대체합니다. 모든 도구 호출은 상태 비저장이며, 규격을 준수하는 클라이언트는 더 이상 존재하지 않는 세션에 대해 404를 받으면 다시 초기화합니다. 따라서 단일 클라이언트가 순차적으로 호출하는 경우 정상 작동합니다. 이 404는 서버가 세션을 전혀 보유하지 않은 경우(서버 재시작 후 모든 클라이언트에서 발생)도 포괄합니다 — 클라이언트는 이를 종료된 엔드포인트로 취급하지 않고 다시 초기화합니다.

동시에 두 클라이언트는 불가능합니다. 공개 엔드포인트에 두 개의 동시 initialize→tools/list 시퀀스를 실행하면 재현됩니다: 하나는 일관되게 404를 받습니다. 기본 MCP SDK는 공유 서버 인스턴스에 단일 전송을 바인딩하므로, 패배한 세션은 축출되고 진행 중이던 요청은 404 또는 중단(hang)됩니다. 이를 해결하려면 현재의 단일 인스턴스(singleton) 등록 패턴 대신 세션별 McpServer 인스턴스가 필요합니다; 현재 계획되어 있지 않습니다. 자세한 내용은 CLAUDE.md를 참조하세요.

"연결할 수 없음" 클라이언트 문제 해결. 클라이언트는 모든 원격 오류를 하나의 모호한 메시지로 압축하므로, 클라이언트의 문구 대신 이 서버의 로그(런치 에이전트의 StandardErrorPath)를 읽으세요 — 상태 코드가 서로 무관한 세 가지 문제 중 어떤 것인지 알려줍니다:

로그에 표시되는 내용

의미

해결 방법

↳ path token rejected: got N chars …

클라이언트 URL의 토큰이 잘못되었거나 잘렸습니다

<MCP_PUBLIC_URL>/mcp/<token> 전체를 다시 복사하세요; 직접 입력 금지

↳ authorize rejected: resource … !== …

동일한 원인을 OAuth 측에서 본 것입니다. /authorize → 302 이후 /token이 없으면 항상 이 경우입니다

위와 동일

[…] → 404 후 새 initialize

재시작 또는 세션 인계 후의 정상적인 복구입니다

조치 불필요; 클라이언트가 스스로 다시 초기화합니다

[initialize] → 200 — client: …

정상 작동 중입니다. 클라이언트 이름이 어떤 클라이언트인지 식별합니다

—

로그에 아무것도 나타나지 않는다면 요청이 이 서버에 도달하지 않은 것입니다: 이 코드가 아니라 터널의 경로 매핑을 확인하세요.

권한

최초 사용 시 macOS가 자동화 접근을 허용할지 묻는 메시지를 표시합니다:

  1. 시스템 환경설정 → 보안 및 개인정보 보호 → 개인정보 보호 → 자동화로 이동합니다

  2. 터미널 또는 Claude Desktop이 OmniFocus를 제어할 수 있도록 권한을 활성화합니다

도구 참조

총 31개의 도구가 아래에 영역별로 나열되어 있습니다.

omnifocus_list_inbox

받은 편지함의 작업을 나열하며, 태그로 선택적으로 필터링할 수 있습니다.

{
  "includeCompleted": false,
  "limit": 50,
  "tags": ["Work", "Urgent"],
  "tagMatchMode": "all"
}

tagMatchMode는 "all"(작업이 나열된 모든 태그를 가짐, 기본값), "any"(최소 하나), 또는 "none"(어느 것도 없음)입니다. tags가 주어졌을 때만 적용됩니다. 동일한 두 매개변수는 omnifocus_get_due_tasks, omnifocus_get_flagged_tasks, omnifocus_get_planned_tasks에서도 작동합니다.

omnifocus_list_projects

필터링을 지원하는 프로젝트 나열입니다.

{
  "status": "active",
  "folderName": "Work",
  "limit": 50
}

omnifocus_get_project_tasks

하나의 프로젝트에 속한 모든 작업을 가져옵니다.

{
  "projectId": "abc123",
  "includeCompleted": false,
  "limit": 100
}

omnifocus_create_project

선택적으로 폴더 내부에 프로젝트를 생성합니다.

{
  "name": "Website redesign",
  "note": "Q1 initiative",
  "folderName": "Work",
  "dueDate": "2024-03-31T17:00:00",
  "deferDate": "2024-01-15T09:00:00",
  "flagged": false,
  "sequential": false,
  "status": "active",
  "reviewIntervalDays": 7
}

status는 "active"(기본값), "on hold", "done" 또는 "dropped"입니다. sequential: false(기본값)는 병렬 프로젝트를 만듭니다.

omnifocus_update_project

프로젝트 속성을 업데이트합니다. projectId 또는 projectName으로 식별합니다(ID 우선).

{
  "projectId": "abc123",
  "name": "Website redesign v2",
  "status": "on hold",
  "flagged": true,
  "dueDate": null,
  "sequential": true,
  "reviewIntervalDays": 14
}

note, dueDate 또는 deferDate에 null을 전달하면 해당 값을 지웁니다. 프로젝트는 다른 폴더로 이동할 수 없습니다(JXA 제한).

omnifocus_delete_project

프로젝트와 해당 작업을 삭제합니다. projectId 또는 projectName으로 식별합니다(ID 우선).

{
  "projectId": "abc123"
}

omnifocus_list_folders

모든 폴더를 나열합니다.

{
  "status": "active",
  "limit": 50
}

omnifocus_create_folder

최상위 또는 중첩 폴더를 만듭니다.

{
  "name": "Clients",
  "parentFolderName": "Work"
}

omnifocus_update_folder

폴더 이름을 바꿉니다. folderId 또는 folderName으로 식별합니다(ID 우선). 폴더는 다른 폴더로 이동할 수 없습니다(JXA 제한).

{
  "folderName": "Clients",
  "name": "Key clients"
}

omnifocus_delete_folder

폴더와 그 안의 모든 것을 삭제합니다. folderId 또는 folderName으로 식별합니다(ID 우선).

{
  "folderId": "abc123"
}

omnifocus_list_tags

모든 태그를 나열합니다.

{
  "status": "active",
  "limit": 50
}

omnifocus_list_perspectives

관점(내장 및 사용자 정의)을 나열합니다.

{
  "limit": 50
}

omnifocus_get_perspective_tasks

특정 관점에 표시된 작업을 가져옵니다.

{
  "perspectiveName": "Next",
  "limit": 50
}

omnifocus_create_task

새 작업을 만듭니다.

{
  "name": "Review quarterly report",
  "note": "Check all sections",
  "projectName": "Work",
  "dueDate": "2024-12-31T17:00:00",
  "deferDate": "2024-12-01T09:00:00",
  "plannedDate": "2024-12-15T09:00:00",
  "flagged": true,
  "estimatedMinutes": 60,
  "tagNames": ["Review", "Important"],
  "parentTaskId": "xyz789",
  "recurrence": {
    "frequency": "weekly",
    "interval": 1,
    "daysOfWeek": ["Monday", "Thursday"],
    "repeatFrom": "due-date"
  }
}

계획 날짜와 마감 날짜:

  • dueDate: 작업을 완료해야 하는 시점(마감일)

  • plannedDate: 작업을 수행하려는 시점(계획)

  • 이 구분은 마감일과 예정된 작업 시간을 분리하는 데 중요합니다

반복: frequency는 "daily", "weekly", "monthly" 또는 "yearly"입니다. 주간에는 daysOfWeek, 월간에는 dayOfMonth(1-31), 연간에는 monthOfYear(1-12)를 사용합니다. repeatFrom은 "due-date"(기본값) 또는 "completion-date"입니다.

하위 작업: parentTaskId를 전달하여 기존 작업의 하위 작업으로 만듭니다.

omnifocus_update_task

기존 작업을 업데이트합니다. taskId 또는 taskName으로 식별합니다(ID 우선).

{
  "taskId": "abc123",
  "name": "Review quarterly report (final)",
  "note": null,
  "dueDate": "2024-12-20T17:00:00",
  "flagged": true,
  "estimatedMinutes": 45,
  "projectName": "Work"
}
  • note, dueDate, deferDate 또는 plannedDate에 null을 전달하면 지웁니다. estimatedMinutes: 0은 추정 시간을 지웁니다.

  • projectId / projectName은 작업을 해당 프로젝트로 이동합니다(하위 작업도 함께 이동). 이동은 이후에 검증되므로 실패는 거짓 성공이 아닌 오류로 보고됩니다.

  • recurrence는 create_task와 동일한 객체를 받습니다. recurrence: null 또는 clearRecurrence: true는 반복을 끕니다.

omnifocus_delete_task

작업을 삭제합니다. taskId 또는 taskName으로 식별합니다(ID 우선).

{
  "taskId": "abc123"
}

omnifocus_update_task_note

작업의 메모를 교체, 지우기 또는 추가합니다. taskId 또는 taskName으로 식별합니다(ID 우선).

{
  "taskId": "abc123",
  "note": "Added after the call.",
  "append": true
}

빈 note 문자열은 메모를 지웁니다.

omnifocus_complete_task

작업을 완료 또는 중단으로 표시합니다. 작업을 ID 또는 이름으로 식별할 수 있습니다.

{
  "taskId": "abc123",
  "action": "complete"
}

또는 작업 이름 사용:

{
  "taskName": "Write documentation",
  "action": "complete"
}

작업은 "complete"(기본값) 또는 "drop"일 수 있습니다. taskId와 taskName이 모두 제공되면 taskId가 우선합니다.

반복 작업을 중단하면 먼저 반복 규칙이 지워지므로 시리즈가 다음 발생으로 넘어가지 않고 실제로 중단됩니다.

omnifocus_batch_complete_task

한 번의 호출로 ID로 최대 100개의 작업을 완료 또는 중단합니다.

{
  "taskIds": ["id1", "id2", "id3"],
  "action": "complete"
}

omnifocus_add_tag_to_task

작업에 태그를 추가합니다. 작업을 ID 또는 이름으로 식별할 수 있습니다.

{
  "taskId": "abc123",
  "tagName": "Urgent"
}

또는 작업 이름 사용:

{
  "taskName": "Write report",
  "tagName": "Urgent"
}

taskId와 taskName이 모두 제공되면 taskId가 우선합니다.

omnifocus_remove_tag_from_task

작업에서 태그를 제거합니다. 작업을 ID 또는 이름으로 식별할 수 있습니다.

{
  "taskId": "abc123",
  "tagName": "Urgent"
}

또는 작업 이름 사용:

{
  "taskName": "Old task",
  "tagName": "Done"
}

taskId와 taskName이 모두 제공되면 taskId가 우선합니다.

omnifocus_batch_add_tag

ID로 최대 100개의 작업에 기존 태그 하나를 추가합니다.

{
  "taskIds": ["id1", "id2", "id3"],
  "tagName": "Urgent"
}

omnifocus_batch_remove_tag

ID로 최대 100개의 작업에서 태그 하나를 제거합니다.

{
  "taskIds": ["id1", "id2", "id3"],
  "tagName": "Urgent"
}

omnifocus_update_project_note

프로젝트의 메모를 교체, 지우기 또는 추가합니다. projectId 또는 projectName으로 식별합니다(ID 우선).

{
  "projectName": "Website redesign",
  "note": "Kickoff moved to March.",
  "append": false
}

omnifocus_search

OmniFocus 전체를 검색합니다.

{
  "query": "report",
  "searchType": "all",
  "limit": 20
}

omnifocus_get_due_tasks

특정 기간 내에 마감인 작업을 가져옵니다.

{
  "daysAhead": 7,
  "includeOverdue": true,
  "limit": 50
}

omnifocus_get_flagged_tasks

플래그가 지정된 작업을 가져옵니다.

{
  "includeCompleted": false,
  "limit": 50
}

omnifocus_get_planned_tasks

특정 기간 내에 계획된 작업을 가져옵니다.

{
  "daysAhead": 7,
  "includeOverdue": true,
  "limit": 50
}

omnifocus_get_projects_for_review

다음 검토 날짜에 따라 검토가 필요한 프로젝트를 가져옵니다. 검토 워크플로우를 따르는 GTD 실무자에게 완벽합니다.

{
  "daysAhead": 0,
  "status": "active",
  "limit": 50,
  "includeTasks": true,
  "taskLimit": 50
}

매개변수:

  • daysAhead: 며칠 앞을 볼지(0 = 기한이 지난 검토만)

  • status: 프로젝트 상태로 필터링("active", "done", "dropped", "onHold", "all")

  • limit: 반환할 최대 프로젝트 수(1-500)

  • includeTasks: 각 프로젝트의 미완료 작업을 결과에 포함(기본값 false) — 이렇게 하면 프로젝트별 후속 호출 대신 한 번의 검토 패스를 단일 호출로 처리합니다

  • taskLimit: includeTasks가 true일 때 프로젝트당 최대 작업 수(1-200, 기본값 50)

각 프로젝트는 reviewInterval과 lastReviewDate도 반환합니다.

omnifocus_mark_project_reviewed

프로젝트를 검토됨으로 표시하고 다음 검토 날짜를 업데이트합니다. 프로젝트를 ID 또는 이름으로 식별할 수 있습니다.

{
  "projectId": "abc123"
}

또는 프로젝트 이름 사용:

{
  "projectName": "Weekly Review"
}

사용자 정의 검토 간격 사용:

{
  "projectName": "Work Project",
  "reviewIntervalDays": 14
}

매개변수:

  • projectId 또는 projectName: 프로젝트를 식별합니다(ID 우선)

  • reviewIntervalDays(선택): 일 단위의 사용자 정의 검토 간격. 제공하지 않으면 프로젝트의 기존 검토 간격을 사용합니다.

omnifocus_batch_mark_reviewed

여러 프로젝트를 한 번의 효율적인 작업으로 검토됨으로 표시합니다.

{
  "projectIds": ["id1", "id2", "id3"]
}

모든 프로젝트에 사용자 정의 검토 간격 적용:

{
  "projectIds": ["id1", "id2", "id3"],
  "reviewIntervalDays": 7
}

매개변수:

  • projectIds: 검토됨으로 표시할 프로젝트 ID 배열(1-100개 프로젝트)

  • reviewIntervalDays(선택): 모든 프로젝트에 적용할 사용자 정의 검토 간격

다음을 포함한 요약을 반환합니다:

  • 성공한 검토 수

  • 실패 수

  • 성공한 검토의 전체 프로젝트 데이터

  • 실패에 대한 오류 세부 정보

날짜 형식

모든 날짜는 ISO 8601 형식을 사용합니다: YYYY-MM-DDTHH:mm:ss

예시:

  • 2024-12-31T17:00:00 - 2024년 12월 31일 오후 5:00

  • 2024-06-15T09:00:00 - 2024년 6월 15일 오전 9:00

오류 처리

서버는 일반적인 문제에 대한 명확한 오류 메시지를 제공합니다:

  • OmniFocus가 실행되지 않음: 먼저 OmniFocus를 실행하세요

  • 권한 거부: 시스템 환경설정에서 자동화 권한을 활성화하세요

  • 항목을 찾을 수 없음: 지정된 ID가 존재하지 않습니다

  • 잘못된 매개변수: 매개변수 형식과 값을 확인하세요

개발

빌드

npm run build

감시 모드

npm run dev

테스트

npm test              # All unit tests
npm run test:watch    # Watch mode
npm run test:coverage # Coverage report (thresholds enforced: 80% lines, 75% branches)

src/__tests__/integration.test.ts의 통합 테스트는 기본적으로 건너뜁니다. 실행 중인 OmniFocus가 필요하고 실제 데이터베이스를 수정하기 때문입니다.

수동 테스트

빌드 후 다음으로 테스트할 수 있습니다:

echo '{"jsonrpc":"2.0","method":"tools/list","id":1}' | node dist/index.js

실행 중인 서버에 변경 사항 적용(중요)

MCP 클라이언트는 연결 시 한 번 도구 목록을 가져와 세션 동안 캐시합니다. npm run build만으로는 이미 연결된 클라이언트를 업데이트하지 않습니다. Node는 핫 리로드를 지원하지 않으며 클라이언트는 스키마를 다시 가져오지 않습니다. 도구/스키마를 변경한 후에는 서버를 다시 시작하고 각 클라이언트가 다시 연결하도록 해야 합니다:

  1. 다시 빌드: npm run build

  2. 서버 프로세스를 다시 시작하여 새 dist/를 로드합니다:

    • LaunchAgent(HTTP 전송): launchctl kickstart -k gui/$(id -u)/com.sanderrobijns.omnifocus-mcp

    • 새 스키마를 제공하는지 확인: lsof -nP -iTCP:3000 -sTCP:LISTEN에 새로 시작된 PID가 표시되어야 합니다.

  3. 각 클라이언트를 다시 연결하여 tools/list를 다시 가져오도록 합니다:

    • Claude Code / Cowork: 새 세션을 시작합니다(실행 중인 세션은 전체 수명 동안 캐시된 스키마를 유지합니다).

    • Claude Desktop: 앱을 종료하고 다시 엽니다(또는 서버를 껐다 켭니다).

    • claude.ai / Claude iOS 사용자 정의 커넥터: 설정 → 커넥터에서 커넥터를 다시 동기화합니다(커넥터 수준에서 도구 목록을 캐시합니다).

클라이언트가 다시 연결될 때까지 서버가 이미 새 스키마를 제공하더라도 이전 스키마를 계속 표시합니다.

라이선스

MIT

크레딧

다음을 사용하여 구축:

Available Tools

31 tools
omnifocus_add_tag_to_taskAdd Tag to TaskA
Idempotent

Add a tag to a task in OmniFocus.

Use either the task ID or task name to identify the task.

Args:

  • taskId (string, optional): The task's ID. Takes priority if both taskId and taskName provided.

  • taskName (string, optional): The task's name to search for. At least one of taskId or taskName is required.

  • tagName (string): Name of the tag to add

Returns: The updated task object

Examples:

  • By ID: { taskId: "abc123", tagName: "Urgent" }

  • By name: { taskName: "Write report", tagName: "Urgent" }

NameRequiredDescriptionDefault
taskIdNoThe task ID to add the tag to. Takes priority if both taskId and taskName are provided.
tagNameYesThe name of the tag to add
taskNameNoThe task name to search for. Used if taskId is not provided.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations provide idempotentHint and destructiveHint. The description adds that the tool returns the updated task object, but does not specify behavior if the tag already exists. No contradiction with annotations.

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

Conciseness5/5

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

The description is concise with a clear structure: brief summary, args list, returns, and examples. Every sentence serves a purpose.

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

Completeness5/5

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

Despite lacking an output schema, the description mentions the return value. Examples cover key use cases. For a simple modification tool, it is complete.

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

Parameters4/5

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

Schema coverage is 100%. The description adds value by explaining the priority between taskId and taskName and providing examples, which goes beyond the schema.

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

Purpose5/5

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

The description clearly states 'Add a tag to a task in OmniFocus', specifying the verb and resource. It distinguishes from sibling tools like omnifocus_remove_tag_from_task and omnifocus_batch_add_tag.

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

Usage Guidelines4/5

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

The description explains when to use taskId vs taskName and priority rules. However, it lacks explicit guidance on when not to use this tool (e.g., batch operations) or alternatives.

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

omnifocus_batch_add_tagBatch Add Tag to TasksA
Idempotent

Add the same tag to multiple tasks in one operation.

The tag must already exist. Tasks that already have the tag are left unchanged.

Args:

  • taskIds (array): Array of task IDs to tag (1-100)

  • tagName (string): Name of the tag to add

Returns: Summary with counts and the updated tasks, plus any per-task failures

Examples:

  • Tag several tasks: { taskIds: ["id1", "id2"], tagName: "Urgent" }

NameRequiredDescriptionDefault
tagNameYesName of the tag to add (must already exist)
taskIdsYesArray of task IDs to add the tag to (1-100 tasks)

TDQS

A4.2/5.0
Behavior4/5

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

Annotations confirm idempotent and non-desctructive behavior; the description elaborates by stating unchanged tasks and summarizing the return value (counts, updated tasks, failures). Adds value beyond annotations.

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

Conciseness4/5

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

Well-structured with clear sections (Args, Returns, Examples) and a concise opening sentence. Slight redundancy with schema, but overall efficient.

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

Completeness5/5

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

For a simple batch tool with two parameters and annotations present, the description covers prerequisites, behavior, return value, and an example. No gaps.

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

Parameters3/5

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

Schema coverage is 100% with both parameters described in the schema. The description repeats this and adds an example, but does not significantly enhance understanding beyond the schema.

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

Purpose5/5

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

The description clearly states it adds the same tag to multiple tasks in one operation, distinct from siblings like omnifocus_add_tag_to_task (single task) and omnifocus_batch_remove_tag (removes tags).

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

Usage Guidelines4/5

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

Specifies that the tag must already exist and that tasks already having the tag are left unchanged, providing context for idempotent use. However, it does not explicitly mention when not to use or name alternative tools.

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

omnifocus_batch_complete_taskBatch Complete/Drop TasksA
Idempotent

Complete or drop multiple tasks in one operation.

Args:

  • taskIds (array): Array of task IDs to complete or drop (1-100)

  • action (string): 'complete' (default) or 'drop'

Returns: Summary with counts and the updated tasks, plus any per-task failures

Examples:

  • Complete several: { taskIds: ["id1", "id2", "id3"] }

  • Drop several: { taskIds: ["id1", "id2"], action: "drop" }

NameRequiredDescriptionDefault
actionNo'complete' (default) or 'drop'complete
taskIdsYesArray of task IDs to complete or drop (1-100 tasks)

TDQS

A4.3/5.0
Behavior4/5

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

Annotations indicate non-readonly and non-destructive; description confirms it performs completes/drops. It adds batch size limits (1-100) and mentions per-task failures, which are useful behavioral details beyond annotations.

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

Conciseness5/5

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

The description is concise with clear sections (Args, Returns, Examples). No fluff, every sentence is informative.

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

Completeness5/5

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

Given no output schema, the description explains return values (summary, updated tasks, failures) and constraints (batch size). It is sufficiently complete for a batched mutation tool.

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

Parameters3/5

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

Schema coverage is 100% so baseline is 3. Description provides examples and return info but adds little beyond schema for parameter meaning.

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

Purpose5/5

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

The description clearly states it 'Complete or drop multiple tasks in one operation.' This distinguishes it from single-task tools like omnifocus_complete_task and other batch tools.

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

Usage Guidelines4/5

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

The description provides context for when to use this tool (batch operations) and includes examples. It does not explicitly exclude single-task scenarios, but the presence of a sibling tool for single completes implies differentiation.

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

omnifocus_batch_mark_reviewedBatch Mark Projects ReviewedA

Mark multiple projects as reviewed in one operation.

Efficiently updates the review status for multiple projects at once.

Args:

  • projectIds (array): Array of project IDs to mark as reviewed (1-100 projects)

  • reviewIntervalDays (number, optional): Custom review interval in days (1-3650) to apply to all projects

Returns: Summary with count of successfully reviewed projects and any errors

Examples:

  • Review multiple projects: { projectIds: ["id1", "id2", "id3"] }

  • With custom interval: { projectIds: ["id1", "id2"], reviewIntervalDays: 14 }

NameRequiredDescriptionDefault
projectIdsYesArray of project IDs to mark as reviewed
reviewIntervalDaysNoOptional custom review interval in days to apply to all projects

TDQS

A4.5/5.0
Behavior4/5

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

Describes the update effect on review status and includes return value (summary with count and errors). Annotations indicate mutation (readOnlyHint=false) but no destructive hint, which aligns.

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

Conciseness5/5

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

Very concise with clear sections (Args, Returns, Examples). First sentence is direct. No redundant or unnecessary information.

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

Completeness5/5

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

Completeness is high given no output schema: return value described, parameter constraints spelled out, examples provided, and no missing context for a batch review operation.

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

Parameters4/5

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

Schema coverage is 100%, and description adds value by restating constraints (1-100 projects, reviewIntervalDays optional range 1-3650) and providing examples. This clarifies usage beyond schema.

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

Purpose5/5

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

Description explicitly states 'Mark multiple projects as reviewed', which is a specific verb+resource. It clearly distinguishes from the sibling omnifocus_mark_project_reviewed by indicating batch operation.

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

Usage Guidelines4/5

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

While not explicitly stating when not to use vs single mark, the name and description imply it's for batch operations, and the sibling tool handles single projects. Could be improved with direct alternative mention.

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

omnifocus_batch_remove_tagBatch Remove Tag from TasksA
Idempotent

Remove the same tag from multiple tasks in one operation.

Tasks that do not have the tag are left unchanged.

Args:

  • taskIds (array): Array of task IDs to untag (1-100)

  • tagName (string): Name of the tag to remove

Returns: Summary with counts and the updated tasks, plus any per-task failures

Examples:

  • Untag several tasks: { taskIds: ["id1", "id2"], tagName: "Waiting" }

NameRequiredDescriptionDefault
tagNameYesName of the tag to remove
taskIdsYesArray of task IDs to remove the tag from (1-100 tasks)

TDQS

A4.1/5.0
Behavior4/5

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

Annotations indicate idempotency and non-destructiveness, and the description adds useful context: tasks without the tag are left unchanged, and a summary with counts and failures is returned.

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

Conciseness5/5

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

The description is concise, well-structured with a clear purpose, behavior note, argument listing, return type, and example, all front-loaded for quick comprehension.

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

Completeness5/5

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

Given the annotations, full schema, and no output schema, the description sufficiently covers behavior, inputs, output format, and provides an example, making it complete for a batch modification tool.

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

Parameters3/5

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

Schema coverage is 100%, and the description reiterates parameter details without adding new meaning beyond what the schema already provides.

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

Purpose5/5

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

The description clearly states the tool removes the same tag from multiple tasks in one operation, distinguishing it from siblings like single-task removal or batch addition.

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

Usage Guidelines3/5

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

The description does not explicitly state when to use this tool versus alternatives, but the context from sibling names and the description's emphasis on batch operation imply its use case.

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

omnifocus_complete_taskComplete or Drop TaskA
Idempotent

Mark a task as complete or dropped in OmniFocus.

Use either the task ID from list/search results, or the task name for natural language interactions.

Args:

  • taskId (string, optional): The task's ID (primaryKey). Takes priority if both taskId and taskName provided.

  • taskName (string, optional): The task's name to search for. At least one of taskId or taskName is required.

  • action (string): 'complete' (default) or 'drop'

Note: Completing a recurring task advances it to the next occurrence (normal repeat behavior). Dropping a recurring task cancels the whole series - its repetition rule is removed first so it does not roll forward to a new active instance.

Returns: The updated task object

Examples:

  • Complete by ID: { taskId: "abc123" }

  • Complete by name: { taskName: "Write documentation" }

  • Drop by name: { taskName: "Old task", action: "drop" }

NameRequiredDescriptionDefault
actionNoAction to perform: 'complete' marks the task done, 'drop' marks it as dropped/cancelledcomplete
taskIdNoThe task ID (primaryKey) to update. Takes priority if both taskId and taskName are provided.
taskNameNoThe task name to search for. Used if taskId is not provided.

TDQS

A4.8/5.0
Behavior5/5

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

Adds critical behavior beyond annotations: detailed explanation of recurring task handling (complete advances, drop cancels series). No contradiction with annotations; idempotentHint true aligns with action semantics.

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

Conciseness5/5

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

Well-structured with summary, args, note, returns, and examples. Every sentence is informative and non-redundant. No wasted words.

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

Completeness5/5

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

Covers purpose, all parameters with usage guidance, behavioral nuances, return value, and examples. No output schema but return description is sufficient. Fully equips agent to invoke correctly.

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

Parameters5/5

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

Schema coverage is 100%, but description adds value: explains priority rule, requirement of at least one, default for action, and provides clear examples that illustrate parameter usage.

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

Purpose5/5

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

Clearly states 'Mark a task as complete or dropped in OmniFocus' with specific verb and resource. Distinguishes from siblings like delete_task and batch_complete_task by focusing on single task completion/dropping.

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

Usage Guidelines4/5

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

Explicitly recommends using taskId from list/search results or taskName for natural language. Provides priority rule when both provided and states required presence. Could improve by mentioning when to use batch alternatives, but context from sibling names helps.

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

omnifocus_create_folderCreate FolderA

Create a new folder in OmniFocus.

Creates a folder at the top level or nested inside an existing folder.

Args:

  • name (string): Folder name (required)

  • parentFolderName (string, optional): Parent folder to nest inside (top level if omitted)

Returns: The created folder object with id, name, and other properties

Examples:

  • Top-level folder: { name: "Work" }

  • Nested folder: { name: "Q1", parentFolderName: "Work" }

NameRequiredDescriptionDefault
nameYesFolder name (required)
parentFolderNameNoName of the parent folder to nest inside. If omitted, folder is created at the top level.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations indicate destructiveHint=false and readOnlyHint=false, consistent with creating a folder (a non-destructive mutation). The description details the behavior (top-level vs nested) and indicates a return value, adding transparency beyond annotations.

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

Conciseness5/5

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

The description is concise and well-structured with a summary, parameter list, return value, and examples. Every sentence serves a purpose with no redundancy.

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

Completeness5/5

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

Given the simplicity of the tool (2 parameters, no output schema, basic annotations), the description fully covers the purpose, parameters, return value, and usage scenarios. No gaps remain.

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

Parameters4/5

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

Since schema coverage is 100%, the baseline is 3. The description adds value with examples showing how to use name and parentFolderName, clarifying their roles beyond schema descriptions.

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

Purpose5/5

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

The description clearly states the tool creates a folder in OmniFocus, distinguishing it from sibling tools like update_folder or delete_folder. It specifies top-level or nested creation, leaving no ambiguity.

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

Usage Guidelines4/5

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

The description provides clear context for when to use the tool (creating a new folder) and includes examples for top-level and nested usage. It doesn't explicitly state when not to use, but the purpose is self-evident given the sibling tools.

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

omnifocus_create_projectCreate ProjectA

Create a new project in OmniFocus.

Creates a project at the top level or inside a specific folder. Optional properties like due date, defer date, flags, and sequential ordering can be set.

Args:

  • name (string): Project name (required)

  • note (string): Optional note/description

  • folderName (string): Folder to place the project in (top level if omitted)

  • dueDate (string): Due date in ISO 8601 format

  • deferDate (string): Defer/start date in ISO 8601 format

  • flagged (boolean): Flag the project (default: false)

  • sequential (boolean): Tasks must be done in order (default: false = parallel)

  • status (string): "active", "on hold", "done", or "dropped" (default: "active")

Returns: The created project object with id, name, and other properties

Examples:

  • Simple project: { name: "Launch website" }

  • In a folder: { name: "Q1 Planning", folderName: "Work" }

  • With details: { name: "Write book", dueDate: "2024-12-31T17:00:00", sequential: true, flagged: true }

NameRequiredDescriptionDefault
nameYesProject name (required)
noteNoOptional note/description for the project
statusNoInitial project statusactive
dueDateNoDue date in ISO 8601 format
flaggedNoWhether to flag the project
deferDateNoDefer/start date in ISO 8601 format
folderNameNoName of the folder to place the project in. If omitted, project is created at the top level.
sequentialNoIf true, tasks must be completed in order (sequential project). Default is parallel.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations indicate readOnlyHint=false and destructiveHint=false, which align with the creation behavior. The description adds value by explaining folder nesting and default status, though it doesn't detail side effects like overwriting or required permissions. No contradictions with annotations.

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

Conciseness5/5

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

The description is well-structured with sections for Args, Returns, and Examples. Every sentence serves a purpose, with no redundancy or fluff. It is concise yet comprehensive.

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

Completeness5/5

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

With 8 parameters and no output schema, the description thoroughly explains each parameter and provides example usage. The return value is summarized, sufficient for a creation tool. The context (annotations, schema coverage) is fully leveraged.

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

Parameters4/5

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

Schema coverage is 100%, but the description adds meaningful context beyond the schema, such as mentioning ISO 8601 date formats, default values for flagged/sequential/status, and providing examples. This aids the agent in correctly formatting parameters.

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

Purpose5/5

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

The description explicitly states 'Create a new project in OmniFocus' and specifies top-level or folder placement, clearly distinguishing it from sibling tools like omnifocus_create_task, omnifocus_create_folder, and omnifocus_update_project.

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

Usage Guidelines4/5

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

The description clearly indicates when to use this tool (creating a project) and outlines optional properties. However, it lacks explicit guidance on when not to use it compared to alternatives like omnifocus_update_project, but the context of sibling names and the action verb provide adequate direction.

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

omnifocus_create_taskCreate TaskA

Create a new task in OmniFocus.

Creates a task in the inbox or a specific project. Tags, due dates, planned dates and other properties can be set. Supports repeating/recurring tasks.

Args:

  • name (string): Task name/title (required)

  • note (string): Optional note/description

  • projectName (string): Project to add to (inbox if not specified)

  • parentTaskId (string): ID of a parent task to create this as a subtask of (takes priority over projectName)

  • dueDate (string): Due date in ISO 8601 format - when the task must be completed

  • deferDate (string): Defer/start date in ISO 8601 format

  • plannedDate (string): Planned date in ISO 8601 format - when you intend to work on the task

  • flagged (boolean): Flag the task (default: false)

  • estimatedMinutes (number): Time estimate in minutes

  • tagNames (array): Tag names to apply

  • recurrence (object): Optional recurrence pattern with:

    • frequency: "daily", "weekly", "monthly", or "yearly"

    • interval: Number of periods between repetitions (default: 1)

    • daysOfWeek: Array of days for weekly recurrence (e.g., ["Monday", "Friday"])

    • dayOfMonth: Day number for monthly recurrence (1-31)

    • monthOfYear: Month number for yearly recurrence (1-12)

    • repeatFrom: "due-date" or "completion-date" (default: "due-date")

Returns: The created task object with id, name, and other properties

Examples:

  • Simple task: { name: "Buy groceries" }

  • Task with details: { name: "Review report", projectName: "Work", dueDate: "2024-12-31T17:00:00", flagged: true }

  • Daily recurring: { name: "Daily standup", dueDate: "2024-01-01T09:00:00", recurrence: { frequency: "daily", interval: 1 } }

  • Weekly on Mon/Wed/Fri: { name: "Workout", dueDate: "2024-01-01T07:00:00", recurrence: { frequency: "weekly", daysOfWeek: ["Monday", "Wednesday", "Friday"] } }

  • Monthly on 1st and 15th: { name: "Pay bills", dueDate: "2024-01-01T12:00:00", recurrence: { frequency: "monthly", interval: 1, dayOfMonth: 1 } }

  • Repeat from completion: { name: "Review quarterly", recurrence: { frequency: "monthly", interval: 3, repeatFrom: "completion-date" } }

  • Task with planning: { name: "Write article", plannedDate: "2024-12-15T09:00:00", dueDate: "2024-12-31T17:00:00" }

  • Task with tags: { name: "Call John", tagNames: ["Calls", "Urgent"] }

NameRequiredDescriptionDefault
nameYesThe task name/title
noteNoOptional note/description for the task
dueDateNoDue date in ISO 8601 format (e.g., '2024-12-31T17:00:00')
flaggedNoWhether to flag the task
tagNamesNoArray of tag names to apply
deferDateNoDefer/start date in ISO 8601 format
recurrenceNoRecurrence pattern for repeating tasks
plannedDateNoPlanned date in ISO 8601 format - when you intend to work on the task
projectNameNoName of project to add task to (creates in inbox if not specified)
parentTaskIdNoID of parent task to create this as a subtask (makes this task a child of the parent)
estimatedMinutesNoEstimated time in minutes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations indicate a write operation (readOnlyHint=false) and not destructive. The description adds behavioral context: creation details, support for recurrence, return of task object, and no contradictions. It clarifies actions beyond annotations.

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

Conciseness4/5

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

The description is well-structured with headings, bulleted parameters, and examples. It is somewhat lengthy but each part adds value. Could be slightly more concise, but organization compensates.

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

Completeness4/5

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

Given 11 parameters, no output schema, the description covers all parameters comprehensively with examples. It explains the return value and common use cases. Missing only usage guidelines for more complete context.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds examples, clarifies relationships (e.g., parentTaskId overrides projectName), and explains recurrence object in detail. This significantly aids parameter usage.

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

Purpose5/5

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

The description clearly states it creates a task in OmniFocus, specifying inbox or project, and lists numerous parameters. It distinguishes from siblings like update_task, delete_task, and batch operations.

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

Usage Guidelines3/5

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

The description implies usage for creating tasks but does not explicitly state when to use or not use this tool versus alternatives like omnifocus_update_task or omnifocus_batch_complete_task. No exclusions are mentioned.

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

omnifocus_delete_folderDelete FolderA
Destructive

Permanently delete a folder from OmniFocus, including any projects and folders it contains. This cannot be undone via MCP.

Use either the folder ID from list/search results, or the folder name.

Args:

  • folderId (string, optional): The folder's ID. Takes priority if both folderId and folderName provided.

  • folderName (string, optional): The folder's name to search for. At least one of folderId or folderName is required.

Returns: Confirmation message with the deleted folder's name

Examples:

  • Delete by ID: { folderId: "abc123" }

  • Delete by name: { folderName: "Old folder" }

NameRequiredDescriptionDefault
folderIdNoThe folder ID to delete. Takes priority if both folderId and folderName are provided.
folderNameNoThe folder name to search for. At least one of folderId or folderName is required.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the destructiveHint annotation, the description warns that deletion is permanent, includes cascading deletion of contents, and cannot be undone via MCP. This adds significant behavioral context.

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

Conciseness5/5

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

The description is compact, logically structured (overview, args, returns, examples), and front-loaded with the key action. No unnecessary words.

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

Completeness5/5

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

Given full schema coverage and annotations, the description provides examples, parameter interaction rules, and return type. For a destructive delete operation, it covers all necessary context.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds priority rules (folderId takes precedence), explains the mutual requirement, and provides concrete examples, enhancing the schema descriptions.

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

Purpose5/5

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

The description uses a specific verb ('Permanently delete') and resource ('folder from OmniFocus'), and clearly states the scope ('including any projects and folders it contains'). This distinguishes it from sibling tools like omnifocus_create_folder and omnifocus_update_folder.

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

Usage Guidelines4/5

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

The description explains how to provide the folder identifier (ID or name), that at least one is required, and that ID takes priority. It also notes permanence and irreversibility. While it doesn't explicitly contrast with omnifocus_delete_project or omnifocus_delete_task, the context is clear.

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

omnifocus_delete_projectDelete ProjectA
Destructive

Permanently delete a project from OmniFocus, including its tasks. This cannot be undone via MCP.

Use either the project ID from list/search results, or the project name.

Args:

  • projectId (string, optional): The project's ID. Takes priority if both projectId and projectName provided.

  • projectName (string, optional): The project's name to search for. At least one of projectId or projectName is required.

Returns: Confirmation message with the deleted project's name

Examples:

  • Delete by ID: { projectId: "abc123" }

  • Delete by name: { projectName: "Old project" }

NameRequiredDescriptionDefault
projectIdNoThe project ID to delete. Takes priority if both projectId and projectName are provided.
projectNameNoThe project name to search for. At least one of projectId or projectName is required.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations indicate destructiveHint=true, but the description adds valuable context: the action is permanent and includes the project’s tasks. This goes beyond the annotation, though it could mention irreversible consequences for linked data.

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

Conciseness5/5

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

The description is concise, front-loaded with the core action, and includes structured Args, Returns, and Examples sections. No unnecessary words.

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

Completeness5/5

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

Given the simplicity of the tool and no output schema, the description fully covers what the tool does, how to use it, and what to expect as a return. Examples further clarify usage.

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

Parameters4/5

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

The input schema already covers both parameters with descriptions (100% coverage). The description adds priority logic (projectId takes priority) and the at-least-one requirement, which is not in the schema.

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

Purpose5/5

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

The description clearly states the tool permanently deletes a project and its tasks, distinguishing it from sibling tools like omnifocus_delete_folder or omnifocus_delete_task. The verb 'delete' matches the title, and the scope is well-defined.

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

Usage Guidelines4/5

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

The description provides clear guidance on how to specify the target (by ID or name) and that at least one parameter is required. It does not explicitly mention when to use versus alternatives, but for a delete operation this is sufficient.

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

omnifocus_delete_taskDelete TaskA
Destructive

Permanently delete a task from OmniFocus. This cannot be undone via MCP.

Use either the task ID from list/search results, or the task name.

Args:

  • taskId (string, optional): The task's ID. Takes priority if both taskId and taskName provided.

  • taskName (string, optional): The task's name to search for. At least one of taskId or taskName is required.

Returns: Confirmation message with the deleted task's name

Examples:

  • Delete by ID: { taskId: "abc123" }

  • Delete by name: { taskName: "Old draft" }

NameRequiredDescriptionDefault
taskIdNoThe task ID to delete. Takes priority if both taskId and taskName are provided.
taskNameNoThe task name to search for. At least one of taskId or taskName is required.

TDQS

A4.7/5.0
Behavior5/5

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

The description adds significant context beyond the destructiveHint annotation by stating it's permanent and cannot be undone via MCP. It also explains parameter priority, aligning with and enhancing annotation info.

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

Conciseness5/5

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

The description is front-loaded with the core action and permanence, followed by structured parameter details, return info, and examples. Every sentence adds value without redundancy.

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

Completeness5/5

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

For a delete tool with two parameters and no output schema, the description fully explains usage, parameter selection, and return value. No critical information is missing given the tool's simplicity.

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

Parameters4/5

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

The input schema already covers both parameters with descriptions (100% coverage). The description adds value by specifying priority and providing examples, making it clearer than schema alone.

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

Purpose5/5

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

The description clearly states it permanently deletes a task from OmniFocus and that it cannot be undone via MCP. This distinguishes it from sibling tools like complete_task or update_task, which are non-destructive.

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

Usage Guidelines4/5

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

Provides clear guidance on using taskId or taskName, with priority for taskId. However, it does not explicitly state when not to use it, such as when only completion is needed, though sibling tools imply alternatives.

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

omnifocus_get_due_tasksGet Due TasksA
Read-onlyIdempotent

Get tasks that are due within a specified timeframe.

Args:

  • daysAhead (number): Days to look ahead, 0-365 (default: 7)

  • includeOverdue (boolean): Include overdue tasks (default: true)

  • limit (number): Max tasks, 1-500 (default: 50)

  • tags (array, optional): Filter to tasks matching these tag names (max 20)

  • tagMatchMode (string): How to match tags - 'all', 'any', or 'none' (default 'all'). Only applied when tags is provided.

Returns: Array of due tasks sorted by due date

Examples:

  • Due this week: {}

  • Due today: { daysAhead: 0 }

  • Due in 30 days: { daysAhead: 30 }

NameRequiredDescriptionDefault
tagsNoFilter to tasks matching these tag names (combined per tagMatchMode)
limitNoMaximum tasks to return
daysAheadNoNumber of days ahead to look (0 = today only)
tagMatchModeNoHow to match tags: 'all' = task has every listed tag, 'any' = at least one, 'none' = none of them. Only applied when tags is provided.all
includeOverdueNoInclude overdue tasks

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=true, idempotentHint=true, destructiveHint=false. Description adds return format ('Array of due tasks sorted by due date'), which is useful but not significantly beyond annotations.

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

Conciseness5/5

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

Well-structured with clear Args, Returns, and Examples sections. Every sentence adds value; no redundancy. Concise but informative.

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

Completeness3/5

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

Covers input semantics well and mentions return format. However, without output schema, description of returned task structure is minimal; more detail on fields would improve completeness.

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

Parameters4/5

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

Schema coverage is 100%, but description adds value with defaults, constraints (0-365 days, 1-500 tasks), and detailed tagMatchMode explanation. Examples further clarify parameter usage.

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

Purpose5/5

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

Description clearly states 'Get tasks that are due within a specified timeframe' with specific verb and resource. Distinguishes from sibling get-tools (e.g., get_flagged_tasks) by focusing on due dates.

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

Usage Guidelines3/5

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

Includes examples for common scenarios (due this week, today, 30 days) which imply usage contexts. However, no explicit guidance on when to use this tool versus alternatives like omnifocus_search or omnifocus_get_planned_tasks.

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

omnifocus_get_flagged_tasksGet Flagged TasksA
Read-onlyIdempotent

Get all flagged tasks in OmniFocus.

Args:

  • includeCompleted (boolean): Include completed tasks (default: false)

  • limit (number): Max tasks, 1-500 (default: 50)

  • tags (array, optional): Filter to tasks matching these tag names (max 20)

  • tagMatchMode (string): How to match tags - 'all', 'any', or 'none' (default 'all'). Only applied when tags is provided.

Returns: Array of flagged tasks

Examples:

  • Active flagged: {}

  • All flagged: { includeCompleted: true }

NameRequiredDescriptionDefault
tagsNoFilter to tasks matching these tag names (combined per tagMatchMode)
limitNoMaximum tasks to return
tagMatchModeNoHow to match tags: 'all' = task has every listed tag, 'any' = at least one, 'none' = none of them. Only applied when tags is provided.all
includeCompletedNoInclude completed tasks

TDQS

A4.5/5.0
Behavior5/5

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

The description thoroughly explains behavior beyond annotations: default values, constraints (limit 1-500, tags max 20), conditional logic (tagMatchMode only applied when tags provided), and examples. Annotations confirm read-only, idempotent, non-destructive, so no contradictions.

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

Conciseness5/5

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

The description is very concise and well-structured: clear purpose, then Args, Returns, Examples. No fluff, every sentence adds value. Front-loaded with the main goal.

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

Completeness5/5

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

Given low complexity, full parameter documentation, and no output schema, the description is complete. It covers what the tool returns, all parameters with defaults, and example invocations. No missing information for an agent to use it correctly.

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

Parameters4/5

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

Schema coverage is 100% with descriptions, but the tool description adds value by organizing parameters in a clear list and providing examples that show typical usage patterns (e.g., empty object for active tasks, includeCompleted: true). This enhances understanding beyond schema alone.

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

Purpose5/5

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

The description clearly states 'Get all flagged tasks in OmniFocus' with a specific verb and resource. It distinguishes itself from sibling tools like omnifocus_get_due_tasks by focusing solely on flagged tasks.

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

Usage Guidelines3/5

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

The description implies usage when flagged tasks are needed but does not provide explicit guidance on when to use this tool over alternatives. No when-not-to-use or comparison with sibling tools.

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

omnifocus_get_perspective_tasksGet Perspective TasksA
Read-onlyIdempotent

Get tasks shown in a specific OmniFocus perspective.

Switches the front OmniFocus window to the named perspective, reads the tasks it displays, then restores the original perspective.

Args:

  • perspectiveName (string): Name of the perspective (use omnifocus_list_perspectives to find names)

  • limit (number): Maximum tasks to return, 1-500 (default: 50)

Returns: Array of task objects with: id, name, note, completed, flagged, dueDate, deferDate, projectName, tags, estimatedMinutes

Examples:

  • Get tasks from a perspective: { perspectiveName: "Next" }

  • With limit: { perspectiveName: "Forecast", limit: 10 }

NameRequiredDescriptionDefault
limitNoMaximum number of tasks to return
perspectiveNameYesThe name of the perspective to get tasks from

TDQS

A4.5/5.0
Behavior4/5

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

Annotations (readOnlyHint, destructiveHint) already indicate safety. Description adds valuable behavioral context: switching the front window and restoring the original perspective, which is not captured by annotations.

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

Conciseness5/5

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

Description is front-loaded with purpose, followed by behavioral note, then clearly structured Args, Returns, and Examples. Every sentence earns its place without redundancy.

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

Completeness5/5

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

Despite no output schema, description lists all return fields. It explains the window-switching side effect and restoration. Tool is simple but all necessary info is provided.

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

Parameters4/5

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

Schema coverage is 100%, but description adds value by suggesting how to find perspective names and providing examples with default limit, going beyond schema definitions.

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

Purpose5/5

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

Description clearly states 'Get tasks shown in a specific OmniFocus perspective' and explains the switching/restoring behavior, distinguishing it from sibling tools like get_project_tasks or list_inbox.

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

Usage Guidelines4/5

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

Provides guidance to use omnifocus_list_perspectives for finding perspective names and includes examples. While it doesn't explicitly exclude alternatives, the context makes it clear when to use this tool.

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

omnifocus_get_planned_tasksGet Planned TasksA
Read-onlyIdempotent

Get tasks that are planned within a specified timeframe.

Planned dates represent when you intend to work on a task, separate from the due date.

Args:

  • daysAhead (number): Days to look ahead, 0-365 (default: 7)

  • includeOverdue (boolean): Include overdue planned tasks (default: true)

  • limit (number): Max tasks, 1-500 (default: 50)

  • tags (array, optional): Filter to tasks matching these tag names (max 20)

  • tagMatchMode (string): How to match tags - 'all', 'any', or 'none' (default 'all'). Only applied when tags is provided.

Returns: Array of planned tasks sorted by planned date

Examples:

  • Planned this week: {}

  • Planned today: { daysAhead: 0 }

  • Planned in 30 days: { daysAhead: 30 }

NameRequiredDescriptionDefault
tagsNoFilter to tasks matching these tag names (combined per tagMatchMode)
limitNoMaximum tasks to return
daysAheadNoNumber of days ahead to look (0 = today only)
tagMatchModeNoHow to match tags: 'all' = task has every listed tag, 'any' = at least one, 'none' = none of them. Only applied when tags is provided.all
includeOverdueNoInclude overdue planned tasks

TDQS

A4.6/5.0
Behavior5/5

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

Annotations indicate readOnlyHint=true, idempotentHint=true, destructiveHint=false, which are consistent. The description adds important behavior: returns array sorted by planned date, default parameter values, and tag matching logic. No contradictions.

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

Conciseness5/5

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

The description is well-structured: purpose paragraph, parameter list, return type, and examples. Every sentence is informative and front-loaded with the core purpose. No unnecessary words.

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

Completeness4/5

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

Given no output schema, the description covers the tool's purpose, parameters, and return type adequately. It could specify the structure of returned task objects, but the examples and sort order are sufficient for an agent to use correctly.

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

Parameters4/5

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

Schema coverage is 100% with parameter descriptions. The description adds meaning beyond schema by explaining the concept of planned dates and providing examples. It does not repeat schema details but enriches understanding.

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

Purpose5/5

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

The description clearly states 'Get tasks that are planned within a specified timeframe' with a specific verb and resource, and distinguishes from sibling tools like omnifocus_get_due_tasks by emphasizing the 'planned dates' concept separate from due dates.

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

Usage Guidelines4/5

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

The description explains when to use this tool (for planned tasks) but does not explicitly state when not to use it or name alternatives. However, the parameter descriptions and examples provide clear context for usage.

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

omnifocus_get_projects_for_reviewGet Projects for ReviewA
Read-onlyIdempotent

Get projects that need review based on their next review date.

Returns projects whose next review date is on or before today (or within specified days ahead).

Args:

  • daysAhead (number): Days to look ahead, 0-365 (default: 0 = overdue only)

  • status (string): Filter by status - 'all', 'active', 'done', 'dropped', 'onHold' (default: 'active')

  • limit (number): Maximum projects to return, 1-500 (default: 50)

Returns: Array of projects needing review sorted by next review date

Examples:

  • Overdue reviews: {}

  • Reviews due within 7 days: { daysAhead: 7 }

  • All active projects due for review: { status: "active", daysAhead: 30 }

NameRequiredDescriptionDefault
limitNoMaximum projects to return
statusNoFilter by project statusactive
daysAheadNoNumber of days ahead to look (0 = overdue reviews only)

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already indicate read-only, idempotent, non-destructive. The description adds sorting by next review date and filtering details, but does not disclose return format or pagination. No contradictions with annotations.

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

Conciseness5/5

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

The description is efficiently structured: purpose sentence, then a bullet-like listing of args with defaults and constraints, examples, and return type. No wasted words, well-organized.

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

Completeness3/5

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

No output schema exists, so description should explain return structure. It only mentions 'Array of projects needing review sorted by next review date' without field details. Contextually adequate for a simple filtered list but could specify project fields.

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

Parameters3/5

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

Schema coverage is 100% (all parameters described). The description repeats schema info and adds examples, clarifying 'daysAhead' as overdue vs. due. However, it provides minimal extra meaning beyond the existing schema descriptions.

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

Purpose5/5

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

The description clearly states it gets projects needing review based on next review date, with specific criteria (overdue or within days ahead). It distinguishes from siblings like omnifocus_list_projects by focusing on review status.

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

Usage Guidelines4/5

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

The description implicitly suggests use for review filtering, with examples showing different scenarios. However, it does not explicitly state when alternatives like omnifocus_list_projects or omnifocus_get_project_tasks are better, missing explicit exclusions.

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

omnifocus_get_project_tasksGet Project TasksA
Read-onlyIdempotent

Get all tasks belonging to a specific project in OmniFocus.

Returns the tasks within a project, including subtasks. Use omnifocus_list_projects to find project IDs first.

Args:

  • projectId (string): The ID of the project

  • includeCompleted (boolean): Include completed tasks (default: false)

  • limit (number): Maximum tasks to return, 1-500 (default: 100)

Returns: Array of task objects with: id, name, note, completed, flagged, dueDate, deferDate, estimatedMinutes, tags, parentTaskId, parentTaskName, hasChildren, childTaskCount

Examples:

  • Get tasks for a project: { projectId: "abc123" }

  • Include completed: { projectId: "abc123", includeCompleted: true }

NameRequiredDescriptionDefault
limitNoMaximum number of tasks to return
projectIdYesThe ID of the project to get tasks for
includeCompletedNoInclude completed tasks

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, so the safety profile is clear. The description adds that it returns tasks including subtasks and specifies the return format, providing behavior beyond annotations.

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

Conciseness5/5

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

The description is well-structured with a purpose sentence, return description, usage prerequisite, args and returns in a clean list, and examples. Every sentence adds value and it's concise.

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

Completeness5/5

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

Despite no output schema, the description fully details the return format (fields) and provides examples. It covers all necessary context for using the tool correctly.

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

Parameters3/5

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

Schema coverage is 100% with all parameters described. The description reiterates the parameters and adds example usage, but doesn't add significant new meaning beyond the schema. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states 'Get all tasks belonging to a specific project in OmniFocus' with a specific verb and resource. It distinguishes from sibling tools like omnifocus_list_projects by mentioning that tool for finding project IDs first.

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

Usage Guidelines4/5

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

Explicitly guides to use omnifocus_list_projects first to get project IDs. Though it doesn't list when not to use or alternatives, the context is clear given sibling tools have distinct purposes.

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

omnifocus_list_foldersList FoldersA
Read-onlyIdempotent

List folders in OmniFocus.

Folders are used to organize projects hierarchically.

Args:

  • status (string): Filter by status - 'all', 'active', 'dropped' (default: 'active')

  • limit (number): Maximum folders to return, 1-200 (default: 50)

Returns: Array of folder objects with: id, name, status, projectCount, folderCount, parentName

Examples:

  • List active folders: {}

  • List all folders: { status: "all" }

NameRequiredDescriptionDefault
limitNoMaximum number of folders to return
statusNoFilter by folder statusactive

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint true and destructiveHint false. The description adds value by detailing return fields (id, name, status, projectCount, folderCount, parentName) and examples, beyond what annotations provide.

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

Conciseness5/5

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

The description is concise with three short paragraphs (overview, args, returns) plus examples. Every sentence is informative and well-structured, front-loading the core purpose.

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

Completeness5/5

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

Despite lacking an output schema, the description fully explains the return array structure with field names. It covers all necessary information for a list tool: purpose, arguments with defaults, and return format.

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

Parameters3/5

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

Input schema has 100% coverage with descriptions for both parameters. The description repeats this info and adds examples, but does not significantly extend meaning beyond the schema. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states 'List folders in OmniFocus' and explains that folders organize projects hierarchically. It distinguishes itself from sibling list tools (e.g., omnifocus_list_projects) by focusing specifically on folders.

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

Usage Guidelines3/5

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

The description provides examples and defaults but does not explicitly state when to use this tool versus alternatives like omnifocus_list_projects or omnifocus_search. Usage context is implied but lacks explicit when-not-to-use guidance.

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

omnifocus_list_inboxList Inbox TasksA
Read-onlyIdempotent

List tasks in the OmniFocus inbox.

Returns tasks that haven't been assigned to a project yet. These are typically newly captured items awaiting processing.

Args:

  • includeCompleted (boolean): Include completed tasks (default: false)

  • limit (number): Maximum tasks to return, 1-500 (default: 50)

  • tags (array, optional): Filter to tasks matching these tag names (max 20)

  • tagMatchMode (string): How to match tags - 'all' (every tag), 'any' (at least one), 'none' (none of them). Default 'all'. Only applied when tags is provided.

Returns: Array of task objects with: id, name, note, completed, flagged, dueDate, deferDate, estimatedMinutes, tags

Examples:

  • List all inbox items: {}

  • Include completed: { includeCompleted: true }

  • Only untagged-by-Work items: { tags: ["Work"], tagMatchMode: "none" }

NameRequiredDescriptionDefault
tagsNoFilter to tasks matching these tag names (combined per tagMatchMode)
limitNoMaximum number of tasks to return
tagMatchModeNoHow to match tags: 'all' = task has every listed tag, 'any' = at least one, 'none' = none of them. Only applied when tags is provided.all
includeCompletedNoInclude completed tasks in results

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint and idempotentHint. The description adds behavioral context (returns unassigned tasks) and explains tagMatchMode mechanics, which goes beyond what annotations provide.

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

Conciseness5/5

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

The description is well-structured with clear sections for purpose, arguments, returns, and examples. Every sentence adds value with no redundancy.

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

Completeness5/5

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

Despite no output schema, the description lists return fields and provides relevant examples. It fully covers what the tool does, its parameters, and usage context.

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

Parameters4/5

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

Schema coverage is 100%, so a baseline of 3 applies. The description adds value through examples and clarifications (e.g., tagMatchMode behavior), raising the score to 4.

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

Purpose5/5

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

The description clearly states 'List tasks in the OmniFocus inbox' and explains these are tasks not assigned to a project, distinguishing it from other task-listing tools like omnifocus_get_project_tasks.

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

Usage Guidelines4/5

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

The description implies usage for viewing newly captured items awaiting processing. While it does not explicitly exclude scenarios, the context is clear enough to differentiate from project-specific lists.

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

omnifocus_list_perspectivesList PerspectivesA
Read-onlyIdempotent

List perspectives in OmniFocus.

Perspectives are saved views/filters that show specific subsets of tasks. Includes both built-in and custom perspectives.

Args:

  • limit (number): Maximum perspectives to return, 1-200 (default: 50)

Returns: Array of perspective objects with: id, name

Examples:

  • List perspectives: {}

  • Limit results: { limit: 10 }

NameRequiredDescriptionDefault
limitNoMaximum number of perspectives to return

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already provide readOnlyHint, destructiveHint, idempotentHint. Description adds return format (array of perspective objects with id, name) but no additional behavioral traits like pagination or performance. Adequate but not rich.

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

Conciseness4/5

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

Well-structured with Args and Returns sections, concise with no extraneous text. Slightly verbose in the opening line but overall efficient.

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

Completeness4/5

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

Given low complexity (one optional parameter, no output schema, rich annotations), description is sufficiently complete. Explains what perspectives are and return shape. No major gaps.

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

Parameters3/5

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

Schema coverage is 100% with detailed description of limit parameter. Description restates schema info but does not add new meaning beyond formatting or examples. Baseline 3.

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

Purpose5/5

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

Clearly states the verb 'list' and resource 'perspectives', and distinguishes from sibling tools like omnifocus_list_folders and omnifocus_list_projects by specifying 'perspectives' as saved views/filters.

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

Usage Guidelines2/5

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

No explicit guidance on when to use this tool versus alternatives (e.g., omnifocus_get_perspective_tasks). Only minimal examples of usage but no context on selection criteria or exclusions.

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

omnifocus_list_projectsList ProjectsA
Read-onlyIdempotent

List projects in OmniFocus.

Returns projects with their status, dates, and folder information.

Args:

  • status (string): Filter by status - 'all', 'active', 'done', 'dropped', 'onHold' (default: 'active')

  • folderName (string): Optional folder name filter (partial match)

  • limit (number): Maximum projects to return, 1-500 (default: 50)

Returns: Array of project objects with: id, name, note, status, completed, flagged, dueDate, deferDate, folderName, taskCount, sequential

Examples:

  • List active projects: {}

  • List all projects: { status: "all" }

  • Projects in a folder: { folderName: "Work" }

NameRequiredDescriptionDefault
limitNoMaximum number of projects to return
statusNoFilter by project statusactive
folderNameNoFilter by folder name (case-insensitive partial match)

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds behavioral details beyond annotations, such as default status='active', limit default, folderName partial match, and return fields. No contradictions.

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

Conciseness5/5

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

The description is well-structured with separate sections for purpose, arguments, returns, and examples. It is concise yet comprehensive, with no wasted words.

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

Completeness5/5

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

Despite lacking an output schema, the description explicitly lists return fields and provides examples covering typical use cases. It fully equips an agent to understand the tool's behavior.

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

Parameters5/5

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

Schema coverage is 100%, but the description adds meaningful context: explains status enum values, folderName as partial match, and limit range. Examples further clarify usage. This adds value beyond the schema.

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

Purpose5/5

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

The description clearly states 'List projects in OmniFocus' and specifies the returned fields (status, dates, folder info). It distinguishes itself from sibling tools like omnifocus_list_folders or omnifocus_list_inbox by focusing on projects.

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

Usage Guidelines4/5

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

The description explains the tool's purpose and provides examples, but does not explicitly state when not to use it or compare it to alternatives like omnifocus_get_project_tasks. However, the context is clear enough for an agent to decide based on the need for listing projects.

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

omnifocus_list_tagsList TagsA
Read-onlyIdempotent

List tags in OmniFocus.

Tags (formerly contexts) are used to categorize tasks by context, person, tool, etc.

Args:

  • status (string): Filter by status - 'all', 'active', 'onHold', 'dropped' (default: 'active')

  • limit (number): Maximum tags to return, 1-200 (default: 50)

Returns: Array of tag objects with: id, name, status, taskCount, allowsNextAction, parentName

Examples:

  • List active tags: {}

  • List all tags: { status: "all" }

NameRequiredDescriptionDefault
limitNoMaximum number of tags to return
statusNoFilter by tag statusactive

TDQS

A4/5.0
Behavior4/5

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

Annotations declare readOnlyHint and idempotentHint, which the description reinforces by describing a non-destructive list operation. The description adds the return format (fields like id, name, status, etc.) and example invocations, providing behavioral context beyond the annotations.

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

Conciseness5/5

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

Description is very concise with clear sections (Args, Returns, Examples). No extraneous text. Every sentence adds value. Well-structured and front-loaded.

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

Completeness4/5

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

For a simple read-only list tool with two parameters and no output schema, the description is complete. It specifies input parameters with defaults and return fields. It could mention ordering or pagination, but not essential given tool simplicity.

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

Parameters3/5

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

Schema description coverage is 100%, so baseline is 3. The description repeats parameter details (status enum values, limit range) and provides default values, but adds minimal extra meaning beyond the schema. Examples illustrate usage but do not significantly deepen parameter understanding.

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

Purpose5/5

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

Description clearly states 'List tags in OmniFocus' with explanation that tags are used to categorize tasks. This is a specific verb+resource combination that distinguishes from sibling tools like omnifocus_add_tag_to_task or omnifocus_create_task.

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

Usage Guidelines3/5

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

No explicit guidance on when to use this tool versus alternatives. The purpose is obvious for a list operation, but the description lacks comparison to other tag-related tools or conditions for selecting this tool.

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

omnifocus_mark_project_reviewedMark Project ReviewedA

Mark a project as reviewed and update its next review date.

Use either the project ID or project name to identify the project. The next review date will be set based on the project's review interval or a custom interval if provided.

Args:

  • projectId (string, optional): The project's ID. Takes priority if both projectId and projectName provided.

  • projectName (string, optional): The project's name to search for. At least one of projectId or projectName is required.

  • reviewIntervalDays (number, optional): Custom review interval in days (1-3650). If not provided, uses the project's current review interval.

Returns: The updated project object

Examples:

  • By ID: { projectId: "abc123" }

  • By name: { projectName: "Work Project" }

  • With custom interval: { projectName: "Weekly Project", reviewIntervalDays: 7 }

NameRequiredDescriptionDefault
projectIdNoThe project ID to mark as reviewed. Takes priority if both projectId and projectName are provided.
projectNameNoThe project name to search for. Used if projectId is not provided.
reviewIntervalDaysNoNumber of days until next review (optional - uses project's current interval if not specified)

TDQS

A4.5/5.0
Behavior4/5

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

Annotations indicate mutability (readOnlyHint: false). The description adds that the next review date is set based on the project's review interval or a custom interval. No contradictions found.

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

Conciseness5/5

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

The description is concise, well-structured with Args and Examples sections. Every sentence adds value without redundancy.

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

Completeness5/5

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

Despite no output schema, the description mentions the return value (updated project object). All parameters are well-documented, and examples cover common use cases. Sufficient for an agent to use correctly.

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

Parameters4/5

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

With 100% schema coverage, the baseline is 3. The description adds value by clarifying the priority of projectId over projectName and explaining reviewIntervalDays defaults. Examples further illustrate usage.

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

Purpose5/5

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

The description clearly states 'Mark a project as reviewed and update its next review date', with a specific verb and resource. It distinguishes from sibling tools like omnifocus_batch_mark_reviewed by being single-project.

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

Usage Guidelines4/5

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

The description explains when to use projectId vs projectName and provides examples. It implicitly says to use this for single projects vs batch. However, it doesn't explicitly mention when not to use or list alternatives.

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

omnifocus_remove_tag_from_taskRemove Tag from TaskA
Idempotent

Remove a tag from a task in OmniFocus.

Use either the task ID or task name to identify the task.

Args:

  • taskId (string, optional): The task's ID. Takes priority if both taskId and taskName provided.

  • taskName (string, optional): The task's name to search for. At least one of taskId or taskName is required.

  • tagName (string): Name of the tag to remove

Returns: The updated task object

Examples:

  • By ID: { taskId: "abc123", tagName: "Urgent" }

  • By name: { taskName: "Old task", tagName: "Done" }

NameRequiredDescriptionDefault
taskIdNoThe task ID to remove the tag from. Takes priority if both taskId and taskName are provided.
tagNameYesThe name of the tag to remove
taskNameNoThe task name to search for. Used if taskId is not provided.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations indicate idempotentHint=true, destructiveHint=false. Description confirms removal and returns updated object, adding context about priority of identifiers. No contradiction.

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

Conciseness5/5

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

Concise description with structured sections (Args, Returns, Examples). No wasted words. Front-loaded with purpose.

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

Completeness4/5

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

No output schema, but description specifies return type ('updated task object'). For a simple mutation with 3 params, this covers essential context. Lacks error handling details.

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

Parameters5/5

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

Schema coverage 100%, but description adds meaning: priority rule (taskId over taskName), optionality, and example usages. This exceeds the schema's descriptions.

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

Purpose5/5

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

Clearly states 'Remove a tag from a task in OmniFocus.' Distinguishes from siblings like omnifocus_add_tag_to_task and omnifocus_batch_remove_tag by focusing on a single task.

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

Usage Guidelines4/5

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

Provides clear guidance on using taskId vs taskName with priority rules and at-least-one requirement. Gives examples. Could explicitly note that batch removal is done via a sibling tool.

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

omnifocus_update_folderUpdate FolderA

Rename an existing folder in OmniFocus.

Args:

  • folderId (string, optional): The folder's ID. Takes priority if both folderId and folderName provided.

  • folderName (string, optional): The folder's name to search for. At least one of folderId or folderName is required.

  • name (string): New folder name

Note: moving a folder into another folder is not supported by OmniFocus's JXA layer (the move operation is rejected). Recreate the folder in the target location if you need to move it.

Returns: The updated folder object

Examples:

  • Rename by ID: { folderId: "abc123", name: "Archive" }

  • Rename by name: { folderName: "Q1", name: "Q1 2027" }

NameRequiredDescriptionDefault
nameYesNew folder name
folderIdNoThe folder ID to update. Takes priority if both folderId and folderName are provided.
folderNameNoThe folder name to search for. At least one of folderId or folderName is required.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations indicate a mutation tool (readOnlyHint=false). The description confirms the rename behavior and adds transparency about the unsupported move operation. No contradiction with annotations.

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

Conciseness5/5

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

The description is well-structured with labeled sections (Args, Note, Returns, Examples), concise sentences, and no redundant information. Every sentence adds value.

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

Completeness5/5

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

For a simple rename tool, the description fully covers the action, parameter usage, unsupported operations, return value, and examples. No missing context given the lack of output schema.

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

Parameters4/5

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

Schema coverage is 100%, but the description enhances understanding by clarifying parameter priority (folderId > folderName) and providing examples that demonstrate usage patterns.

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

Purpose5/5

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

The description clearly states 'Rename an existing folder in OmniFocus,' specifying the verb 'rename' and the resource 'folder.' It effectively differentiates from sibling tools like 'create_folder' and 'delete_folder.'

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

Usage Guidelines4/5

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

The description explains the order of priority between 'folderId' and 'folderName,' and notes the unsupported move operation with a suggested workaround. It lacks explicit when-not-to-use guidance, but the context is clear.

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

omnifocus_update_projectUpdate ProjectA

Update properties of an existing project in OmniFocus.

Only the fields you provide are changed. Use null to clear a date or note field.

Args:

  • projectId (string, optional): The project's ID. Takes priority if both projectId and projectName provided.

  • projectName (string, optional): The project's name to search for. At least one of projectId or projectName is required.

  • name (string, optional): New project name

  • note (string | null, optional): New note text. Pass null to clear.

  • status (string, optional): "active", "on hold", "done", or "dropped". Setting "done" completes the project and "dropped" drops it (setting "active" reactivates a completed/dropped project).

  • flagged (boolean, optional): Set flagged state

  • dueDate (string | null, optional): New due date in ISO 8601 format. Pass null to clear.

  • deferDate (string | null, optional): New defer date in ISO 8601 format. Pass null to clear.

  • sequential (boolean, optional): Tasks must be done in order (true) or parallel (false)

  • reviewIntervalDays (number, optional): Review interval in days (1-3650)

Note: moving a project between folders is not supported by OmniFocus's JXA layer (the move operation returns "Replacement not supported"). Recreate the project in the target folder if you need to move it.

Returns: The updated project object

Examples:

  • Rename: { projectId: "abc123", name: "New name" }

  • Put on hold: { projectId: "abc123", status: "on hold" }

  • Complete the project: { projectId: "abc123", status: "done" }

  • Drop the project: { projectId: "abc123", status: "dropped" }

  • Set review interval: { projectId: "abc123", reviewIntervalDays: 14 }

  • Clear due date: { projectId: "abc123", dueDate: null }

NameRequiredDescriptionDefault
nameNoNew project name
noteNoNew note text. Pass null to clear the note.
statusNoNew project status
dueDateNoNew due date in ISO 8601 format. Pass null to clear.
flaggedNoSet flagged state
deferDateNoNew defer/start date in ISO 8601 format. Pass null to clear.
projectIdNoThe project ID to update. Takes priority if both projectId and projectName are provided.
sequentialNoIf true, tasks must be completed in order (sequential). If false, parallel.
projectNameNoThe project name to search for. At least one of projectId or projectName is required.
reviewIntervalDaysNoReview interval in days.

TDQS

A4.5/5.0
Behavior5/5

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

The description discloses important behaviors: only provided fields are changed, null clears fields, status transitions (completing with 'done' vs 'dropped', reactivation). It also transparently notes the unsupported move operation with an explanation. This goes beyond the basic annotations (which only indicate non-readOnly).

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

Conciseness4/5

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

The description is somewhat lengthy but well-structured: purpose first, then parameter details, then a note on limitation, then returns, then examples. Every sentence adds value. A minor deduction for verbosity; could be more terse for agent consumption, but still effective.

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

Completeness4/5

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

Given 10 parameters, no output schema, and no nested objects, the description covers all parameters with examples and notes limitations. It mentions return value ('The updated project object') but doesn't detail its structure. However, without an output schema, this is adequate. The description is complete enough for an agent to use correctly.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds value by explaining usage semantics: null clears fields, status effects (e.g., setting 'done' completes), and the priority between projectId/projectName. Examples further clarify parameter usage. This raises the score above baseline.

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

Purpose5/5

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

The description clearly states 'Update properties of an existing project in OmniFocus,' specifies the specific fields that can be updated, and distinguishes itself from siblings like omnifocus_update_project_note and omnifocus_create_project. It also notes a limitation (moving folders not supported) which clarifies scope.

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

Usage Guidelines4/5

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

The description explains when to use this tool: for updating any project property. It provides constraints like the priority of projectId over projectName and the requirement of at least one identifier. It also warns about the unsupported move operation. However, it does not explicitly guide the agent on when to choose this over other update tools like omnifocus_update_project_note, though the sibling names imply the distinction.

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

omnifocus_update_project_noteUpdate Project NoteA
Idempotent

Update the note/description on an existing project in OmniFocus.

Use either the project ID or project name to identify the project.

Args:

  • projectId (string, optional): The project's ID. Takes priority if both projectId and projectName provided.

  • projectName (string, optional): The project's name to search for. At least one of projectId or projectName is required.

  • note (string): The new note content. Use empty string to clear the note.

  • append (boolean): If true, append to existing note instead of replacing (default: false)

Returns: The updated project object

Examples:

  • Set note by ID: { projectId: "abc123", note: "Q1 deliverables" }

  • Set note by name: { projectName: "Work Project", note: "Started Jan 2024" }

  • Clear note: { projectId: "abc123", note: "" }

  • Append to note: { projectId: "abc123", note: "\nNew update", append: true }

NameRequiredDescriptionDefault
noteYesThe new note content for the project. Use empty string to clear the note.
appendNoIf true, append to existing note instead of replacing it
projectIdNoThe project ID to update. Takes priority if both projectId and projectName are provided.
projectNameNoThe project name to search for. Used if projectId is not provided.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations indicate idempotent, non-destructive write; the description adds behavioral details: empty string clears the note, append flag behavior, and priority of projectId over projectName. No contradiction with annotations, and it goes beyond structured fields to provide useful nuance.

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

Conciseness5/5

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

The description is well-structured with a clear header, args list, returns note, and examples. It is concise yet complete, front-loading the main purpose and providing necessary details without excess verbiage.

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

Completeness5/5

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

With 4 parameters (1 required) and no output schema, the description covers all input parameters with examples, explains the return type (updated project object), and handles edge cases like clearing and appending. No gaps observed.

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

Parameters4/5

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

Schema coverage is 100% with descriptions for all 4 parameters. The description adds value by explaining priority logic (projectId takes precedence), requiredness (at least one of projectId/projectName), and the effect of empty string on note. This goes beyond the schema's basic descriptions.

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

Purpose5/5

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

The description clearly states 'Update the note/description on an existing project in OmniFocus.' The verb 'update' and resource 'project note' are specific and unambiguous, distinguishing it from sibling tools like omnifocus_update_project (which updates other fields) and omnifocus_update_task_note (for task notes).

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

Usage Guidelines4/5

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

The description provides clear scenarios for use (set by ID, by name, clear, append) through examples and parameter explanations. It does not explicitly state when not to use it or compare to alternatives, but the context is sufficient for typical use cases.

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

omnifocus_update_taskUpdate TaskA

Update properties of an existing task in OmniFocus.

Only the fields you provide are changed. Use null to clear a date or note field.

Args:

  • taskId (string, optional): The task's ID. Takes priority if both taskId and taskName provided.

  • taskName (string, optional): The task's name to search for. At least one of taskId or taskName is required.

  • name (string, optional): New task name

  • note (string | null, optional): New note text. Pass null to clear.

  • dueDate (string | null, optional): New due date in ISO 8601 format. Pass null to clear.

  • deferDate (string | null, optional): New defer date in ISO 8601 format. Pass null to clear.

  • plannedDate (string | null, optional): New planned date in ISO 8601 format. Pass null to clear.

  • flagged (boolean, optional): Set flagged state

  • estimatedMinutes (number, optional): Time estimate in minutes. Pass 0 to clear.

  • projectId (string, optional): ID of the project to move the task to.

  • projectName (string, optional): Name of the project to move the task to. Ignored if projectId is provided.

  • recurrence (object | null, optional): Repetition pattern to make the task recurring (same shape as create_task: frequency, interval, daysOfWeek, dayOfMonth, monthOfYear, repeatFrom). Pass null to remove recurrence.

  • clearRecurrence (boolean, optional): Set true to remove the task's repetition rule (turn off recurring). Equivalent to recurrence: null.

Returns: The updated task object

Examples:

  • Rename: { taskId: "abc123", name: "New name" }

  • Set due date: { taskId: "abc123", dueDate: "2024-12-31T17:00:00" }

  • Clear due date: { taskId: "abc123", dueDate: null }

  • Make it recurring weekly: { taskId: "abc123", recurrence: { frequency: "weekly", daysOfWeek: ["Monday"] } }

  • Turn off recurring: { taskId: "abc123", clearRecurrence: true }

  • Flag and estimate: { taskId: "abc123", flagged: true, estimatedMinutes: 30 }

NameRequiredDescriptionDefault
nameNoNew task name
noteNoNew note text. Pass null to clear the note.
taskIdNoThe task ID to update. Takes priority if both taskId and taskName are provided.
dueDateNoNew due date in ISO 8601 format. Pass null to clear.
flaggedNoSet flagged state
taskNameNoThe task name to search for. At least one of taskId or taskName is required.
deferDateNoNew defer/start date in ISO 8601 format. Pass null to clear.
projectIdNoID of the project to move the task to.
recurrenceNoSet a repetition pattern to make the task recurring (same shape as create_task). Pass null to remove recurrence.
plannedDateNoNew planned date in ISO 8601 format. Pass null to clear.
projectNameNoName of the project to move the task to. Ignored if projectId is provided.
clearRecurrenceNoSet true to remove the task's repetition rule (turn off recurring). Equivalent to recurrence: null.
estimatedMinutesNoEstimated time in minutes. Pass 0 to clear.

TDQS

A4.7/5.0
Behavior5/5

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

The description adds context beyond annotations by detailing partial update behavior, null clearing, taskId/taskName priority, and return value. Annotations are consistent (write operation, not destructive, not idempotent).

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

Conciseness4/5

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

The description is long but well-structured with Args, Returns, and Examples sections. It is front-loaded with purpose. Minor redundancy (e.g., clearRecurrence explanation could be shorter) but overall efficient.

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

Completeness5/5

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

Given 13 parameters and no output schema, the description covers all parameters, return value, special behaviors (null clearing, priority), and multiple examples. It is complete for a complex update tool.

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

Parameters5/5

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

Schema coverage is 100%, and the description adds significant meaning: structured breakdown of all 13 parameters, type info, null handling, and examples. It references 'same shape as create_task' for recurrence, adding clarity.

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

Purpose5/5

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

The description clearly states 'Update properties of an existing task in OmniFocus' with a specific verb and resource. It distinguishes from siblings like create_task, complete_task, and delete_task by focusing on updating existing tasks.

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

Usage Guidelines4/5

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

The description explains partial updates ('Only the fields you provide are changed'), how to clear fields with null, and priority between taskId and taskName. It provides examples but does not explicitly contrast with alternative tools like omnifocus_update_task_note or batch tools.

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

omnifocus_update_task_noteUpdate Task NoteA
Idempotent

Update the note/description on an existing task in OmniFocus.

Use either the task ID or task name to identify the task.

Args:

  • taskId (string, optional): The task's ID. Takes priority if both taskId and taskName provided.

  • taskName (string, optional): The task's name to search for. At least one of taskId or taskName is required.

  • note (string): The new note content. Use empty string to clear the note.

  • append (boolean): If true, append to existing note instead of replacing (default: false)

Returns: The updated task object

Examples:

  • Set note by ID: { taskId: "abc123", note: "Remember to include charts" }

  • Set note by name: { taskName: "Write report", note: "Draft due Friday" }

  • Clear note: { taskId: "abc123", note: "" }

  • Append to note: { taskId: "abc123", note: "\nAdditional info here", append: true }

NameRequiredDescriptionDefault
noteYesThe new note content for the task. Use empty string to clear the note.
appendNoIf true, append to existing note instead of replacing it
taskIdNoThe task ID to update. Takes priority if both taskId and taskName are provided.
taskNameNoThe task name to search for. Used if taskId is not provided.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond annotations (idempotentHint=true, destructiveHint=false), description clarifies the append behavior, clearing note with empty string, and return value. No contradictions.

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

Conciseness5/5

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

Description is concise with clear sections (Args, Returns, Examples). Every sentence adds value; no fluff.

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

Completeness5/5

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

Despite no output schema, description specifies the return value. Covers all parameters, edge cases (clear, append), and examples. Highly complete for a simple tool.

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

Parameters4/5

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

Schema coverage is 100%. The description adds meaning: priority between taskId/taskName, examples for each usage, and append semantics. Exceeds baseline.

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

Purpose5/5

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

The description clearly states the verb 'update' and resource 'note/description' on a task, and is distinct from sibling tools like omnifocus_update_task (which updates other fields) and omnifocus_update_project_note.

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

Usage Guidelines4/5

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

The description explains when to use taskId vs taskName with priority rules, and shows examples. It doesn't explicitly exclude alternatives but the purpose is clear for note updates.

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

Tool Schema Changelog

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

  1. 31 tool updatesv1.0.0
    • First observedomnifocus_add_tag_to_task
    • First observedomnifocus_batch_add_tag
    • First observedomnifocus_batch_complete_task
    • First observedomnifocus_batch_mark_reviewed
    • First observedomnifocus_batch_remove_tag
    • First observedomnifocus_complete_task
    • First observedomnifocus_create_folder
    • First observedomnifocus_create_project
    • First observedomnifocus_create_task
    • First observedomnifocus_delete_folder
    • First observedomnifocus_delete_project
    • First observedomnifocus_delete_task
    • First observedomnifocus_get_due_tasks
    • First observedomnifocus_get_flagged_tasks
    • First observedomnifocus_get_perspective_tasks
    • First observedomnifocus_get_planned_tasks
    • First observedomnifocus_get_project_tasks
    • First observedomnifocus_get_projects_for_review
    • First observedomnifocus_list_folders
    • First observedomnifocus_list_inbox
    • First observedomnifocus_list_perspectives
    • First observedomnifocus_list_projects
    • First observedomnifocus_list_tags
    • First observedomnifocus_mark_project_reviewed
    • First observedomnifocus_remove_tag_from_task
    • First observedomnifocus_search
    • First observedomnifocus_update_folder
    • First observedomnifocus_update_project
    • First observedomnifocus_update_project_note
    • First observedomnifocus_update_task
    • First observedomnifocus_update_task_note

TDQS

A4/5.0

Scored across 31 tools

Disambiguation4/5

Most tools target distinct resource-action pairs, but there is overlap between general update tools and dedicated note update tools (e.g., omnifocus_update_task vs omnifocus_update_task_note), which could confuse an agent deciding which to use.

Naming Consistency5/5

All tools follow a consistent omnifocus_verb_noun pattern with clear verbs (list_, get_, create_, update_, delete_, etc.) and consistent prepositions (add_tag_to_task, remove_tag_from_task), making the naming predictable and easy to navigate.

Tool Count4/5

31 tools is on the higher side, but the number is justified by the comprehensive feature set of OmniFocus (tasks, projects, folders, tags, perspectives, reviews, batch operations). A small reduction by merging note update tools would improve conciseness.

Completeness3/5

The surface covers most CRUD operations for tasks, projects, and folders, including tagging and review. However, missing tag creation and a general 'list all tasks' tool are notable gaps that may cause agent failures.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers