The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Kwork listing page.
kwork-mcp 1.0 — production-grade stdio MCP-шлюз к Kwork для работы из Codex. Он
даёт типизированные read-результаты, проверяет фактический аккаунт, координирует
лимиты между процессами и проводит все записи через durable prepare → commit → reconcile.
Это breaking redesign. Для миграции с 0.2.x см. руководство по миграции.
structuredContent соответствует объявленному outputSchema; текстовый content
сохраняет краткое резюме и JSON-копию результата.known_data, known_empty и unknown_error; ошибки
возвращаются с isError=true и стабильным кодом.KWORK_EXPECTED_USER_ID и фактический
аккаунт. Без KWORK_ENABLE_WRITES=true запись невозможна.submission_unknown требует reconcile_write.KWORK_STATE_DIR; fingerprint общей policy не позволяет
процессу с другими лимитами ослабить координацию.kwork==0.2.0 закреплён; сигнатуры и generic routes проверяются fail-loud при
старте и contract-тестами.0700/0600,
flock, проверкой всей ancestor chain, O_NOFOLLOW/FD-anchored traversal и
atomic replace. Runtime-discovered credentials динамически редактируются в логах
и внешних данных.external_untrusted и не являются инструкциями для агента.Требуются Python 3.12–3.14 и uv.
Из исходников:
kwork-mcp использует только stdio. Все его логи идут в stderr; stdout
зарезервирован для MCP JSON-RPC. kwork-mcp-bootstrap — отдельная human CLI и не
является MCP transport.
Обычный сервер работает без login/password/token/proxy в конфигурации host. Единственный поддерживаемый production flow:
user_id своего аккаунта из настроек/профиля Kwork.CLI скрыто запросит login/password, optional phone digits и optional proxy URL,
вызовет только auth + get_me, сверит точный user_id и атомарно запишет
account-bound credential record. Если существует legacy ~/.kwork_token, CLI
предложит явный validated import: только regular file текущего владельца с mode
0600, без symlink. Legacy-файл после успешного импорта намеренно остаётся на
месте, чтобы удаление было отдельным осознанным действием.
Normal entrypoint fail-closed отклоняет KWORK_LOGIN, KWORK_PASSWORD,
KWORK_TOKEN, KWORK_PHONE_LAST и KWORK_PROXY_URL, даже если они пришли через
environment. Не помещайте эти значения в Codex/Claude MCP config: некоторые hosts
встраивают env map в собственный process argv. .env из cwd никогда не
загружается. Secret values не принимаются через argv.
После запуска вызовите account_status и сверьте user_id. Только затем включайте
KWORK_ENABLE_WRITES=true. KWORK_EXPECTED_USERNAME — дополнительная, более
хрупкая проверка: username может быть переименован, primary identity — numeric ID.
По умолчанию состояние хранится в
$XDG_STATE_HOME/kwork-mcp либо ~/.local/state/kwork-mcp. Это каталог с токенами
и coordination.sqlite3; все процессы одного аккаунта должны использовать один
локальный KWORK_STATE_DIR и одинаковые shared rate/circuit/write settings.
Несовместимый fingerprint отклоняется fail-loud. Файлы содержат чувствительные
данные и не зашифрованы самим приложением — используйте защищённую учётную запись
ОС и шифрование диска. Вся физическая ancestor chain должна принадлежать текущему
user либо root и не быть group/other-writable. Разрешён один стандартный sticky
temp boundary (например, /tmp), после которого gateway создаёт private 0700
каталог; обычный 0777 parent, чужой owner, final symlink или подмена компонента
отклоняются.
Версия 1.0 использует POSIX fcntl/flock и поддерживает Linux/macOS, но не
Windows.
Optional proxy вводится только bootstrap-команде и сохраняется рядом с token в
защищённом account record; normal server не принимает KWORK_PROXY_URL. Legacy
record без proxy означает прямое подключение. Чтобы добавить, заменить или удалить
proxy либо обновить истёкшую сессию, остановите процессы этого account/state,
повторите bootstrap и перезапустите MCP. Файл защищён правами ОС, но не шифруется
на уровне приложения.
Полный справочник: docs/configuration.md.
Сначала выполните bootstrap в обычном терминале, как показано выше. Затем добавьте
в ~/.codex/config.toml только безопасные значения:
Для локальной checkout-версии:
Codex CLI, IDE extension и desktop app используют общую MCP-конфигурацию host.
После изменения перезапустите соответствующий клиент и вызовите account_status.
Никогда не добавляйте туда token/login/password/phone/proxy — ни как env, ни как
env_vars, ни как arguments.
| Tool | Результат |
|---|---|
account_status | Фактический account ID, binding и готовность writes |
get_connects | Активные и общие коннекты |
get_user_info, search_users | Профиль/поиск пользователей |
discover_projects | favorites, all или category_ids, фильтры и opaque cursor |
get_project, get_exchange_info | Проект и полная exchange-информация |
list_my_offers, get_offer | Офферы с обязательными offer_id и project_id |
list_worker_orders, get_order_details | Заказы продавца и полные details |
list_dialogs, get_dialog | Диалоги и сообщения |
list_my_kworks, get_kwork_details | Собственные кворки |
list_categories, list_favorite_categories | Категории |
list_notifications | Полные группы уведомлений |
discover_projects не смешивает режимы:
favorites — избранные категории аккаунта;all — вся биржа;category_ids — обязательный непустой список ID.Возвращаемый PageInfo содержит next_cursor, query_fingerprint и
high_watermark. Cursor подписан и привязан к подтверждённому аккаунту и точным
фильтрам. Watermark позволяет клиенту вести локальную точку наблюдения для
будущего delta polling, но 1.0 не обещает отдельный delta endpoint.
Поддерживаемые request.action: submit_offer, delete_offer, send_message,
edit_message, delete_message, mark_dialog_read, submit_order_approval,
set_kwork_state.
prepare_write с точным request и собственным стабильным
idempotency_key.payload, payload_hash, account ID и expires_at.write_id, payload_hash и confirmation_token в
commit_write.submission_unknown, не вызывайте commit повторно. После
visibility window вызовите reconcile_write(write_id).get_write_status читает durable ledger без remote write.Пример payload для подготовки оффера:
Remote write никогда не retry автоматически. Повторный prepare_write с тем же
idempotency key и другим request возвращает idempotency_conflict; пока исходная
запись остаётся prepared, точный replay того же request возвращает ту же запись и
тот же HMAC-derived confirmation token. Это позволяет безопасно восстановиться
после потери ответа prepare, не создавая второй intent. После claim/terminal state
confirmation token больше не выдаётся; состояние читается через
get_write_status.
Каждый tool возвращает envelope версии 1.0:
Коды ошибок и retry/reconciliation semantics описаны в
docs/security.md.
Неизвестное имя tool является protocol-level JSON-RPC -32602, а не обычным
isError business-result; имя из недоверенного запроса намеренно не отражается в
сообщении.
Шлюз отвечает за MCP transport, авторизацию Kwork, account binding, корректность upstream-контракта, типизацию данных и безопасную доставку write-запроса. Он намеренно не содержит скоринг проектов, Notion, Telegram, email, CRM и другую pipeline/business logic.
MCP Tasks отключены. Стабильная спецификация считает их экспериментальными, а Codex-клиенту для коротких Kwork API-вызовов durable task lifecycle не даёт пользы. Durability write-flow реализована внутри ledger и доступна обычными tools без нестабильного protocol surface.
Подробнее: архитектура и security model.
Coverage gate — 92% branch-aware покрытия. CI дополнительно проверяет Python 3.12–3.14, зависимости, секреты, pinned MCP Registry schema, wheel install smoke и согласованность версий.