otask-mcp-server
The otask-mcp-server is a Model Context Protocol (MCP) server for the O!task API, enabling AI agents to manage O!task workspaces and tasks.
Task Management Tools:
otask_me– Retrieve current user information.otask_get_task– Fetch a specific task by workspace and task slug, returning details like name, description, due date, board/column, priority, performers, and tags.otask_update_task– Update an existing task by auto-fetching current state, merging changes, and submitting the full update. Supports modifying name, description (HTML), due date, board/column, priority, project, performers, tags, subtasks, files, and adding a comment alongside the update.otask_create_task– Create a new task with details like name, board, column, and due date.otask_move_task– Move a task between board columns.otask_archive_task– Archive a task.otask_list_tasks– List tasks with filters for performers, projects, priorities, and due dates.otask_list_projects/otask_list_project_tasks– List projects and tasks within a project.otask_list_board– List workspace boards and columns.otask_list_members/otask_list_tags– List workspace members and tags.otask_list_comments/otask_add_comment– List and add task comments.
Deployment Modes:
stdio– Local mode for clients like Claude Desktop, Cursor, and OpenCode.HTTP gateway/passthrough – For Streamable HTTP clients like n8n; supports self-hosting via Docker/Node.
Remote Cloudflare Worker – Multi-user access with OAuth login; credentials are encrypted and email is hashed for privacy.
Configuration Features:
Define default workspaces and projects via environment variables or HTTP headers.
Allow-list specific workspaces/projects to restrict agent access and ensure data security.
Allows n8n workflows to interact with O!task tasks using MCP Client Tool, providing tools to get and update tasks via the O!task API.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@otask-mcp-serverGet task with slug 'task-123' in workspace 'ws-abc'."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
otask-mcp-server
MCP-сервер для O!task API. Отдаёт операции O!task (пространства/задачи) как MCP-инструменты для агентов (Claude, Cursor, OpenCode, n8n MCP Client Tool).
Неофициально. otask-mcp — независимый open-source MCP-коннектор к API O!task. Не аффилирован с O!task, не является его частью и не поддерживается им.
Unofficial. otask-mcp is an independent open-source MCP connector for the O!task API. Not affiliated with, endorsed by, or part of the O!task product/team.
🚀 Возможности
stdio — локальный MCP для Claude Desktop / Cursor / OpenCode
HTTP gateway / passthrough — Streamable HTTP для n8n и self-host
Remote MCP (Cloudflare Worker) — OAuth-логин O!task (2-step wizard), без пароля в конфиге клиента
Allow-list пространство/project, defaults, inbox-сценарии (
otask_list_tasks)Discovery:
otask_list_workspaces(пространства без ручного slug)Open source: grigoreo-dev/otask-mcp
npm i -g @grigoreo-dev/otask-mcp
# или: npx @grigoreo-dev/otask-mcp
# HTTP: npx otask-mcp-http # bin name stays unscopedПубликация на npm: push tag vX.Y.Z (версия в tag = package.json). CI: .github/workflows/publish.yml (OIDC Trusted Publisher, без NPM_TOKEN).
Related MCP server: Freelo MCP Server
🔒 Приватность и доверие
Неофициально: otask-mcp — независимый open-source коннектор, не продукт O!task и не поддерживается им.
Касается Cloudflare Worker (remote MCP) и библиотеки @cloudflare/workers-oauth-provider:
Что | Где | Кто видит |
Пароль O!task | только memory на POST | нигде не пишется (ни KV, ни env, ни git) |
Токен O!task + scope ( | grant в Cloudflare KV ( | end-to-end encrypted: ключ шифрования — секрет access-токена MCP; из сырого KV нельзя прочитать props без валидного Bearer |
userId | KV, не зашифрован |
|
metadata | KV, не зашифрован | пусто ( |
Access token MCP | у клиента (Claude и т.д.) | клиент + тот, кто перехватит Bearer |
Пароль не хранится после логина: email+password →
POST api.otask.ru/.../login→ API-токен → вprops, пароль drop.O!task Bearer нужен для запросов к API → лежит в encrypted
props, не в открытом виде.userId = HMAC-SHA256(email, USER_ID_PEPPER): стабильный id (повторный логин заменяет старый grant), но email в KV нет и хэш не перебрать без секрета.Публичный Worker без
OTASK_*/MCP_AUTH_TOKENв env: multi-user, каждый — своя OAuth-сессия.После expiry/401 — повторный Connect (re-login).
Код open source: self-deploy и аудит. Паттерн: Remote MCP on Cloudflare.
Официальный URL:
https://otask-mcp.grigoreo.dev/mcp.
Доверие к оператору Worker: в хранилище нет ни пароля, ни email plaintext, а O!task-токен — только encrypted props. Но владелец Cloudflare-аккаунта может сменить код Worker (залогировать ctx.props / токен на своём деплое). Гарантия — открытый код: не доверяете чужому demo → self-deploy.
Не кладите OTASK_PASSWORD, OTASK_AUTH_KEY и токены в git, скриншоты и issue.
☁️ Remote MCP (Cloudflare)
Официальный публичный endpoint:
https://otask-mcp.grigoreo.dev/mcpMulti-user OAuth, OTASK_* в env Worker нет. Self-host: см. 🔧 Self-deploy Worker.
Подключение (OAuth)
Лендинг (что это за коннектор, как подключаться):
https://otask-mcp.grigoreo.dev/Откройте лендинг
https://otask-mcp.grigoreo.dev/— краткое описание Remote MCP и URL/mcp(это не 404).В MCP-клиенте добавьте remote server с URL
https://otask-mcp.grigoreo.dev/mcp(или свой self-deploy…/mcp).Запустите Connect / OAuth flow клиента.
Шаг 1: ввод email + пароль O!task.
Шаг 2: выбор пространства по умолчанию, проекта и (опционально) разрешённых пространств/проектов из выпадающих списков — вручную вводить UUID-slug больше не нужно.
Пустой список разрешённых = доступ ко всем пространствам/проектам аккаунта (без allow-list ограничения).
После успешного authorize клиент получает access token сессии MCP; вызовы
/mcpидут с этим токеном.
Явные ws_slug / project args в tools по-прежнему работают. Self-host stdio/HTTP: env OTASK_DEFAULT_*. Про UUID-slug vs #N на доске: docs/SLUGS.md.
На публичном Worker нет OTASK_* в env: multi-user, credentials только в сессии пользователя.
💻 stdio (локально)
Локальный процесс; credentials только из env сервера.
OTASK_AUTH_KEY=...
# или OTASK_EMAIL + OTASK_PASSWORD
OTASK_DEFAULT_WS=...
OTASK_DEFAULT_PROJECT=my-project
OTASK_ALLOWED_WS=...
OTASK_ALLOWED_PROJECTS=my-projectbun start
# или: npx @grigoreo-dev/otask-mcpstdio требует OTASK_* (без них падает при старте).
🐳 Docker / HTTP
bun run start:http
# Docker: образ из Dockerfile, PORT=3847MCP |
|
Health |
|
Пример self-host: https://otask-mcp.example/mcp (порт 3847 в Docker).
Gateway (credentials O!task на сервере)
OTASK_AUTH_KEY=...
MCP_AUTH_TOKEN=...
OTASK_DEFAULT_WS=...
OTASK_DEFAULT_PROJECT=...
OTASK_ALLOWED_WS=...
OTASK_ALLOWED_PROJECTS=...Клиент: Authorization: Bearer <MCP_AUTH_TOKEN> (не токен O!task). Не шлите X-Otask-* allow/default (берутся из env).
Passthrough (токен O!task у клиента)
Env сервера: без OTASK_AUTH_KEY / OTASK_EMAIL / OTASK_PASSWORD.
Клиент: Authorization: Bearer <токен api.otask.ru>. Опционально: X-Otask-Allowed-Projects, X-Otask-Allowed-Ws, X-Otask-Default-Ws, X-Otask-Default-Project.
Проверка: GET /health → authMode: "gateway" | "passthrough".
🔀 Режимы auth
Режим | Где | Команда / URL | Авторизация клиента |
stdio | локально |
| Нет HTTP; |
HTTP gateway | Node/Docker |
|
|
HTTP passthrough | Node/Docker |
|
|
remote Worker | Cloudflare |
| OAuth Connect → логин email+password на Worker; API-токен в сессии, не в env Worker |
Определение HTTP (Node): hasServerOtaskCredentials() — gateway, если задан статический ключ или email+password; иначе passthrough. HTTP gateway требует MCP_AUTH_TOKEN, если заданы OTASK_* (иначе падает при старте).
🤖 Промпты для агентов
Скопируйте блок в чат агента.
Claude web → официальный URL (https://otask-mcp.grigoreo.dev/mcp)
Подключи remote MCP сервер O!task:
- URL: https://otask-mcp.grigoreo.dev/mcp
- Лендинг: https://otask-mcp.grigoreo.dev/
- Используй OAuth / Connect flow клиента (2 шага: логин → выбор пространства/проекта)
- Default пространство/project задаются на шаге 2 wizard (или явными args tools)
- Для discovery: otask_list_workspaces, otask_list_projects
Не сохраняй мой пароль в файлы репозитория.Cursor → официальный URL
Добавь в MCP config Cursor remote server O!task:
url: https://otask-mcp.grigoreo.dev/mcp
auth: oauth
После connect проверь otask_me.Self-deploy Worker
Задеплой otask-mcp Worker из репозитория grigoreo-dev/otask-mcp:
1) bun install; bun run build (из корня)
2) wrangler login (один раз)
3) bun run deploy:worker # KV OAUTH_KV создаётся автоматически
4) Дай мне URL /mcp и пропиши в MCP клиент с OAuthDocker passthrough
Подними otask-mcp HTTP passthrough в Docker без OTASK_* в env.
Клиент шлёт Authorization: Bearer <O!task token>.
PORT 3847. Проверь GET /health.stdio local
Установи @grigoreo-dev/otask-mcp, настрой stdio MCP с OTASK_EMAIL+OTASK_PASSWORD
или OTASK_AUTH_KEY. Добавь в Claude Desktop / Cursor mcp servers.Gateway self-host
HTTP gateway: задай OTASK_* + MCP_AUTH_TOKEN.
Клиент шлёт Bearer MCP_AUTH_TOKEN, не токен O!task.🔧 Self-deploy Worker
Пакет: packages/worker (не публикуется на npm). Подробнее: packages/worker/README.md.
# из корня репозитория
bun install
bunx wrangler login # один раз (браузер, без API-токена)
# секрет для HMAC userId (email не хранится в KV в переборно-открытом виде)
bunx wrangler secret put USER_ID_PEPPER --config packages/worker/wrangler.toml
bun run deploy:worker # build + deploy; KV OAUTH_KV создаётся автоматическиПодробнее (GH Actions, Workers Builds из git, secrets): packages/worker/README.md.
Endpoint MCP:
https://otask-mcp.<ваш-subdomain>.workers.dev/mcp(или свой custom domain, как официальныйhttps://otask-mcp.grigoreo.dev/mcp)OAuth:
/authorize,/oauth/token,/oauth/registerНе задавайте
OTASK_*в[vars]для multi-user публичного деплояGitHub Actions (кнопка Deploy): нужны secrets
CLOUDFLARE_API_TOKEN+CLOUDFLARE_ACCOUNT_IDCloudflare Workers Builds (git в dashboard): токен в GitHub не нужен — CF GitHub App; build из monorepo
Rate limiting — в dashboard Cloudflare (см. worker README), не в коде v1.
Переменные окружения
Переменная | Где используется | Когда обязательна | Назначение |
| stdio, HTTP gateway | stdio или gateway (альтернатива: email/password) | Статический O!task Bearer, которым пользуется сервер |
| stdio, HTTP gateway | вместе с | Логин для получения токена |
| stdio, HTTP gateway | вместе с | Пароль для логина |
| HTTP gateway | режим gateway | Общий секрет, который должен отправлять клиент; не токен O!task |
| stdio, HTTP | опционально | Slug пространства по умолчанию (UUID; если tool не передал |
| stdio, HTTP | опционально | Project slug (UUID) или numeric id по умолчанию |
| stdio, HTTP gateway | опционально | Allow-list slug пространств через запятую |
| stdio, HTTP gateway | опционально | Allow-list project slug и/или numeric id через запятую |
| HTTP | опционально (по умолчанию | Порт прослушивания |
| HTTP | опционально (по умолчанию | Адрес привязки |
Default должен входить в allow-list, если list непустой (иначе сервер падает при старте).
Remote Worker: user credentials не через эти env (OAuth-сессия).
HTTP-заголовки
Заголовок | Режим | Назначение |
| gateway | Должен совпадать с |
| passthrough | Токен O!task API; проксируется на каждый запрос к API |
| remote Worker | Access token OAuth-сессии MCP (после Connect) |
| только passthrough | Allow-list projects; в gateway — env |
| только passthrough | Allow-list пространств |
| passthrough (override env) | Default slug пространства |
| passthrough (override env) | Default project slug/id |
Примеры для n8n
Gateway
URL:
https://otask-mcp.example/mcpTransport: HTTP Streamable
Credential / header:
Authorization: Bearer <MCP_AUTH_TOKEN>Не отправляйте
X-Otask-*allow/default headers
Passthrough
URL:
https://otask-mcp.example/mcpTransport: HTTP Streamable
Credential / header:
Authorization: Bearer <токен api.otask.ru>Опционально:
X-Otask-Allowed-*,X-Otask-Default-*
Инструменты
Регистрируются в packages/core/src/tools/registry.ts:
Инструмент | Назначение |
| Текущий пользователь (id, имя, email, timezone) |
| Список пространств (teams); без slug; при одном пространстве агент/резолвер может подставить его автоматически |
| Задачи пространства; по умолчанию |
| Получить одну задачу по пространству + slug задачи |
| Обновить существующую задачу |
| Список проектов пространства (с фильтром по allow-list) |
| Задачи проекта: по умолчанию активные задачи из UI board snapshot; |
| Доски/колонки (статусы) с |
| Участники пространства |
| Теги пространства |
| Комментарии к задаче |
| Добавить комментарий ( |
| Создать задачу ( |
| Переместить задачу в другую колонку |
| Архивировать задачу |
Про UUID-slug vs номера досок #N: docs/SLUGS.md.
Inbox (после OTASK_DEFAULT_WS):
otask_me
otask_list_tasks # mine=true
otask_list_tasks due=today
otask_list_tasks due=overdueDefaults и allow-list (пространства + projects)
Что | Env (gateway/stdio) | Header (passthrough) |
Default пространство |
|
|
Default project |
|
|
Limit пространств |
|
|
Limit projects |
|
|
Формат allow-list: значения через запятую. Projects: slug (UUID) и/или numeric id. Пространства: только slug (UUID). Пусто = без ограничения (off). Подробнее: docs/SLUGS.md.
otask_list_board по умолчанию шлёт type=status (так требует O!task API).
Снимок API-документации
bun run docs:parseПишет в docs/catalog/ (или bun run docs:parse --file path для офлайн HTML).
Разработка
Монорепо: packages/core, packages/stdio, packages/http-node, packages/worker.
bun install
bun run build # core → stdio → http-node
bun test
bun start # stdio MCP
bun run start:http # Streamable HTTP MCP
bun run dev # stdio hot reload
bun run dev:http # HTTP hot reloadДобавление инструмента
packages/core/src/services/api.ts/client.ts— метод API при необходимостиpackages/core/src/schemas/— Zod input schemapackages/core/src/tools/my-tool.ts— factory →ToolDefinitionpackages/core/src/tools/registry.ts— добавить вtoolFactories
Contributing
See CONTRIBUTING.md for setup, PR checks, and the release tag flow.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/grigoreo-dev/otask-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server