Omnifocus Sync
БесплатноНе проверенA headless MCP server that reads and writes OmniFocus data by directly communicating with the Omni Sync Server via WebDAV, enabling task management without a lo
Описание
A headless MCP server that reads and writes OmniFocus data by directly communicating with the Omni Sync Server via WebDAV, enabling task management without a local OmniFocus app.
README
A headless MCP server that reads and writes OmniFocus data by talking directly to the Omni Sync Server over WebDAV — no Mac, no running OmniFocus app. It implements OmniFocus's client-side end-to-end encryption in TypeScript, so it can run anywhere Node runs (a Linux NAS, a container, a cloud box).
Every other OmniFocus MCP server automates the local macOS app via AppleScript/JXA. This one speaks the cloud sync protocol instead, which is what lets it run headless.
⚠️ Alpha / use at your own risk. This talks to your real task database. The read and write paths have been validated end-to-end against a live Omni Sync Server account (add + delete transactions round-trip correctly), and the crypto and parsing have an offline test suite — but this hasn't been exercised across every OmniFocus version or edge case. Keep a backup (in OmniFocus: File → Back Up Database), and consider a throwaway account while evaluating. See Safety.
How it works
An OmniFocus sync store is a WebDAV collection (OmniFocus.ofocus/) containing:
- a baseline transaction and a chain of delta transactions, each a
.zipholding acontents.xmldescribing object creates/updates/deletes; .clientfiles registering each device and the transaction "tail" it has synced to;- an
encryptedplist holding the wrapped document keys.
This server:
- Resolves the shard —
sync.omnigroup.com302-redirects each account to asyncN.omnigroup.comhost; the client follows it. - Authenticates with HTTP Digest (what Omni Sync Server negotiates).
- Decrypts using the OmniFileStore format: PBKDF2 derives a wrapping key from your passphrase, RFC 3394 unwraps the document key slots, and each file is AES-128-CTR + HMAC-SHA256 in 64 KiB segments (encrypt-then-MAC).
- Replays the transaction chain into an in-memory object model.
- Writes by building a new
contents.xml, zipping, encrypting,PUT-ting it as a new transaction descending from the current head tail, and refreshing its.clientregistration so other clients treat it as a real participant.
The crypto and format were reimplemented from Omni's own open-source frameworks
(OmniGroup/OmniGroup, notably
OmniFileStore/EncryptionFormat.md and DecryptionExample.py) plus community
reverse-engineering (tomzx/ofocus-format,
rubyfocus). See CREDITS.
Install
git clone https://github.com/rosskukulinski/omnifocus-sync-mcp.git
cd omnifocus-sync-mcp
npm install
npm run build
Configure
Set credentials via environment variables (see .env.example):
| Variable | Required | Description |
|---|---|---|
OMNIFOCUS_SYNC_USERNAME |
yes | Omni Sync Server account name |
OMNIFOCUS_SYNC_PASSWORD |
yes | Omni Sync Server account password |
OMNIFOCUS_ENCRYPTION_PASSPHRASE |
no | Defaults to the sync password (OmniFocus's default) |
OMNIFOCUS_SYNC_URL |
no | Defaults to https://sync.omnigroup.com |
OMNIFOCUS_DATABASE |
no | Defaults to OmniFocus.ofocus |
OMNIFOCUS_CLIENT_NAME |
no | Display name for this client's .client file |
OMNIFOCUS_CLIENT_STATE_FILE |
no | Where the stable client id is stored |
OMNIFOCUS_READ_ONLY |
no | 1/true to refuse all writes |
Try it without an MCP client
A diagnostic CLI exercises the sync path directly:
export OMNIFOCUS_SYNC_USERNAME=... OMNIFOCUS_SYNC_PASSWORD=...
npm run probe -- sync # show database counts
npm run probe -- list flagged # list flagged tasks
npm run probe -- projects # list projects
npm run probe -- add "Buy milk" # add an inbox task
Use as an MCP server
Run over stdio. Example Claude Desktop / Claude Code config:
{
"mcpServers": {
"omnifocus": {
"command": "node",
"args": ["/absolute/path/to/omnifocus-sync-mcp/dist/index.js"],
"env": {
"OMNIFOCUS_SYNC_USERNAME": "your-account",
"OMNIFOCUS_SYNC_PASSWORD": "your-password"
}
}
}
}
Tools
| Tool | Description |
|---|---|
of_sync |
Reload the database from the server; returns counts |
of_list_tasks |
List tasks (remaining, available, flagged, inbox, due_soon, all), with project/tag/search filters |
of_get_task |
Full detail for one task by id |
of_list_projects |
List projects with folder path and status |
of_add_task |
Create a task (inbox or in a project) |
of_complete_task |
Mark a task complete |
of_edit_task |
Edit name/note/flag/due/defer; clear dates |
of_delete_task |
Delete a task by id |
Safety
- Back up first, and prefer a test account until you trust the write path.
- Start with
OMNIFOCUS_READ_ONLY=1to explore safely. - Writes are append-only transactions; a bad write forks history rather than destroying data, and OmniFocus merges forks on its next sync — but that is a safety net, not a guarantee.
- Secrets come from the environment only; nothing is written to this repo. The client
identity file (
client.json) contains no secrets.
Development
npm test # offline test suite (crypto round-trips, parse/write, digest)
npm run dev -- ... # run the CLI via tsx without building
The offline tests cover the risky parts without a network or a real account: the
OmniFileStore encrypt/decrypt round-trip at every segment boundary, MAC tamper
detection, the passphrase→PBKDF2→key-unwrap pipeline, contents.xml build/parse
round-trips, partial-update merge semantics, and the full zip→encrypt→decrypt→parse
read path.
Credits
Built by reimplementing formats documented and open-sourced by others:
- OmniGroup/OmniGroup — Omni's own frameworks;
OmniFileStore/EncryptionFormat.mdandDecryptionExample.pyare the authoritative encryption spec, andOmniFoundation/XML/OFXMLIdentifier.mthe id format. - tomzx/ofocus-format — the
.ofocustransaction/format write-up. - jyruzicka/rubyfocus, kumpelblase2/focus — prior-art parsers.
Not affiliated with or endorsed by The Omni Group. "OmniFocus" is their trademark.
License
MIT — see LICENSE.
Установить Omnifocus Sync в Claude Desktop, Claude Code, Cursor
unyly install omnifocus-sync-mcpСтавит в Claude Desktop, Claude Code, Cursor и VS Code — сам разбирается с npx, uvx и сборкой из исходников.
Впервые? Поставь CLI: curl -fsSL https://unyly.org/install | sh
Или настроить вручную
Выполни в терминале:
claude mcp add omnifocus-sync-mcp -- npx -y github:rosskukulinski/omnifocus-sync-mcpFAQ
Omnifocus Sync MCP бесплатный?
Да, Omnifocus Sync MCP бесплатный — установка в пару кликов через Unyly без оплаты.
Нужен ли API-ключ для Omnifocus Sync?
Нет, Omnifocus Sync работает без API-ключей и переменных окружения.
Omnifocus Sync — hosted или self-hosted?
Доступен hosted-вариант: Unyly запускает сервер в облаке, локальная установка не обязательна.
Как установить Omnifocus Sync в Claude Desktop, Claude Code или Cursor?
Открой Omnifocus Sync на unyly.org, выбери вкладку своего клиента (Claude Desktop, Claude Code, Cursor) и нажми Install — конфиг сгенерируется автоматически, без правки JSON.
Похожие MCP
Notion
Read and write pages in your workspace
автор: NotionLinear
Issues, cycles, triage — from Claude
автор: LinearGoogle Drive
Search and read your Drive files
автор: Googlemindsdb/mindsdb
Connect and unify data across various platforms and databases with [MindsDB as a single MCP server](https://docs.mindsdb.com/mcp/overview).
автор: mindsdbCompare Omnifocus Sync with
Не уверен что выбрать?
Найди свой стек за 60 секунд
Автор?
Embed-бейдж для README
Похожее
Все в категории productivity
