mcpField
W
Weeeking

Weeeking

本地服务
github.com/OniVe生产力01 周前更新

关于 Weeeking

Weeeking 是一款用 Rust 编写的 MCP 服务,通过 Weeek 公共 API 管理工作区。它涵盖任务、项目、CRM 和时间跟踪,默认只读,并可通过操作过滤器配置权限。

主要功能

  1. 01覆盖 Weeek 公共 API
  2. 02任务、项目、CRM 和时间操作
  3. 03默认启用只读模式
  4. 04操作允许列表和拒绝列表
  5. 05MCP 资源与工作流提示词
  6. 06分页、精简响应与重试

适用场景

  1. 01搜索和更新 Weeek 任务
  2. 02查看项目和工作区上下文
  3. 03限制 Agent 可执行的操作
  4. 04使用提示词整理每日任务或每周总结

MCP 相关

将 Weeek API 操作作为 MCP 工具提供,并提供 `weeek://me`、`weeek://projects` 资源,以及每日任务和每周总结提示词。通过 stdio 运行,并可隐藏或拒绝未获授权的操作。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"onive-weeeking": {
"command": "npx",
"args": [
"-y",
"weeeking"
],
"env": {
"WEEEK_API_TOKEN": "<WEEEK_API_TOKEN>",
"WEEEK_TOKEN": "<WEEEK_TOKEN>",
"READ_ONLY": "<READ_ONLY>",
"WEEEK_LANG": "<WEEEK_LANG>",
"WEEEK_ALLOW_ACTIONS": "<WEEEK_ALLOW_ACTIONS>",
"WEEEK_DENY_ACTIONS": "<WEEEK_DENY_ACTIONS>",
"WEEEK_PROFILE": "<WEEEK_PROFILE>",
"WEEEK_BASE_URL": "<WEEEK_BASE_URL>",
"WEEEK_DISABLE_KEYCHAIN": "<WEEEK_DISABLE_KEYCHAIN>",
"WEEEK_MAX_RESPONSE_CHARS": "<WEEEK_MAX_RESPONSE_CHARS>",
"WEEEK_RPS": "<WEEEK_RPS>",
"WEEEK_RPS_BURST": "<WEEEK_RPS_BURST>",
"WEEEK_LOG": "<WEEEK_LOG>"
}
}
}
}
启动命令npx -y weeeking
需要配置的环境变量
WEEEK_API_TOKEN密钥Weeek API token (Weeek: Settings → API). Alternative: store it with `weeeking store-token`.
WEEEK_TOKEN密钥Alias for WEEEK_API_TOKEN (checked second).
READ_ONLYtrue (default) — read-only mode: write tools are hidden. Set false to allow changes.
WEEEK_LANGLanguage of user-facing texts: ru (default) or en — help, tool descriptions, prompts, errors.
WEEEK_ALLOW_ACTIONSAbsolute allow list of OpenAPI operation ids/masks (comma/space separated): anything not listed is forbidden; a set-but-empty value is a startup error. Cannot be combined with WEEEK_PROFILE.
WEEEK_DENY_ACTIONSDeny list of OpenAPI operation ids/masks (e.g. delete-*): denied operations are hidden and rejected on call; a set-but-empty value is a startup error.
WEEEK_PROFILEReady access profile: executor — reads plus task and comment creation only.
WEEEK_BASE_URLCustom API base URL (proxy or self-hosted gateway).
WEEEK_DISABLE_KEYCHAIN密钥1 — do not read the token from the system keychain (Credential Manager / Keychain / Secret Service).
WEEEK_MAX_RESPONSE_CHARSMaximum response size in characters (default 60000).
WEEEK_RPSClient-side request rate limit in requests per second (token bucket, retries included). Empty or <=0 disables it; values below 0.001 are rejected at startup.
WEEEK_RPS_BURSTBurst capacity in tokens (default: ceil(RPS), at least 1).
WEEEK_LOGdebug — verbose HTTP logs to stderr (no token).

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmweeeking0.6.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

Weeeking 🛡️

Русский · English

CI Release License: MIT

Weeek and conquer. MCP-сервер для Weeek с полным покрытием публичного API: 157 операций из официальной OpenAPI-спецификации. Один бинарник на Rust, без Node и внешних зависимостей в рантайме. Релизы — для семи платформ: Windows x64/arm64, Linux x64 (glibc/musl), Linux arm64, macOS arm64/x64.

Возможности

  • 13 админ-групп с action — weeek_project, weeek_board, weeek_board_column, weeek_custom_fields, weeek_portfolio, weeek_tags, weeek_task (таймеры, записи времени, вложения, родитель…), weeek_funnels, weeek_funnel_statuses, weeek_deals, weeek_organizations, weeek_contacts, weeek_currencies.
  • 12 curated-тулов для повседневной работы: weeek_context, weeek_search_tasks, weeek_get_task, weeek_list_comments, weeek_download_attachment + записи (weeek_create_task, weeek_update_task, weeek_move_task, weeek_complete_task, weeek_set_task_people, weeek_add_comment, weeek_delete_comment).
  • READ_ONLY по умолчанию: изменяющие действия не регистрируются, пока не выставлено READ_ONLY=false.
  • Ресурсы и промпты MCP: weeek://me и weeek://projects читаются клиентом без tool-call; промпты «Мои задачи на сегодня» и «Итоги недели» — готовые сценарии для агента.
  • Эргономика LLM: compact=true убирает null и пустые значения (включая пустые элементы массивов) из тяжёлых ответов; fetchAll=true (+maxItems) собирает страницы задач и комментариев (страница по умолчанию 100, не более 50 страниц) с флагом truncated.
  • Надёжность: ретраи 429 и 502/503/504 с Retry-After и экспоненциальным бэкоффом (429 — для любого метода, 502/503/504 и сетевые сбои — только для GET/HEAD; таймауты не повторяются); WEEEK_LOG=debug — HTTP-логи в stderr (метод, путь, статус, длительность; без токена).
  • Кодогенератор спеки: tools/update_spec.py тянет OpenAPI с developers.weeek.net и генерирует src/spec_generated.rs — статические данные (&'static str), которые компилируются в бинарник; в рантайме нет ни JSON, ни парсинга, чанк спеки в репозитории не сохраняется.

Сборка

Требуется Rust 1.88+ (MSVC toolchain на Windows).

cargo build --release
# → target/release/weeeking.exe (Windows) / target/release/weeeking (Linux, macOS)

Релизы

Готовые бинарники — в GitHub Releases: архивы weeeking-<версия>-<платформа> и сырые бинарники для npm-обёртки; рядом — файлы .sha256, хэши также перечислены в описании релиза.

ПлатформаАрхивСырой бинарник
Windows x64weeeking-<версия>-win-x64.zipweeeking-<версия>-win-x64.exe
Windows arm64weeeking-<версия>-win-arm64.zipweeeking-<версия>-win-arm64.exe
Linux x64 (glibc)weeeking-<версия>-linux-x64.tar.gzweeeking-<версия>-linux-x64
Linux x64 (musl, static)weeeking-<версия>-linux-musl-x64.tar.gzweeeking-<версия>-linux-musl-x64
Linux arm64weeeking-<версия>-linux-arm64.tar.gzweeeking-<версия>-linux-arm64
macOS arm64weeeking-<версия>-osx-arm64.tar.gzweeeking-<версия>-osx-arm64
macOS x64weeeking-<версия>-osx-x64.tar.gzweeeking-<версия>-osx-x64
# проверка контрольной суммы
certutil -hashfile weeeking-<версия>-win-x64.zip SHA256          # Windows
sha256sum -c weeeking-<версия>-linux-x64.tar.gz.sha256           # Linux

Каждый файл релиза подписан GitHub-аттестацией (Sigstore) — проверяемое происхождение сборки:

gh attestation verify weeeking-<версия>-win-x64.exe -R OniVe/weeeking
npm (npx)
npx -y weeeking     # MCP-сервер по stdio; бинарник скачается и проверится по sha256

weeeking 包是一个轻量级封装:它会从同一版本的 GitHub Releases 中获取适用于目标平台的原生二进制文件(Windows x64/arm64、Linux x64 gnu/musl、Linux arm64、macOS arm64/x64)。通过 npm trusted publishing(OIDC,并附带 provenance)发布。

该服务也已发布到官方 MCP Registry,标识为 io.github.OniVe/weeeking;GitHub MCP 目录和聚合器会从那里获取它。

在 macOS 上,通过浏览器下载的二进制文件可能会被 Gatekeeper 隔离——移除隔离标记(xattr -d com.apple.quarantine <文件>),或通过 npx/curl 安装。

环境变量

变量默认值说明
WEEEK_API_TOKEN—Weeek 中的令牌(工作区设置 → API)。没有它就无法读取数据。
READ_ONLYtruefalse/0 — 启用修改操作(创建、编辑、删除、CRM)。
WEEEK_ALLOW_ACTIONS—操作白名单(operationId 或 * 通配模式):未列出的所有操作(包括读取)均被禁止。与 WEEEK_PROFILE 不兼容。
WEEEK_DENY_ACTIONS—操作黑名单(或匹配模式,如 delete-*):这些操作不会被调用或显示。其优先级高于白名单和配置文件。
WEEEK_PROFILE—访问配置文件:executor — 允许读取,以及创建任务和评论。
WEEEK_LANGru用户可见文本的语言(ru/en):帮助、工具描述、提示词、错误信息。
WEEEK_BASE_URLhttps://api.weeek.net/public/v1如有需要,可设置自定义代理/主机。
WEEEK_TIMEOUT_MS30000请求超时时间。
WEEEK_MAX_RESPONSE_CHARS60000截断过大的响应。
WEEEK_DISABLE_KEYCHAIN—1 — 不从系统钥匙串读取令牌。
WEEEK_KEYCHAIN_ACCOUNTapi-token系统钥匙串中的条目名称(用于多个账户)。
WEEEK_MAX_ATTACHMENT_BYTES67108864(64 MiB)附件下载上限(用于防止响应过大)。
WEEEK_RETRY_MAX2遇到 429、502/503/504 和网络故障时的额外重试次数(0–5);超时不会重试。
WEEEK_RETRY_BASE_MS300指数退避的基准值(上限为 5 秒;会考虑 Retry-After,上限为 30 秒)。
WEEEK_RPS—客户端每秒请求数限制(令牌桶;包括重试)。留空或 ≤0 — 不启用;0 < RPS < 0.001 — 启动错误。
WEEEK_RPS_BURSTceil(RPS),最小值为 1突发容量(以令牌计)。
WEEEK_LOG—debug — 在 stderr 中输出详细的 HTTP 日志(方法、路径、状态、毫秒;不会记录令牌)。
令牌的获取方式
  1. 环境变量中的 WEEEK_API_TOKEN(或 WEEEK_TOKEN)——始终优先使用。
  2. 系统钥匙串中的服务条目 weeek-mcp,名称为 WEEEK_KEYCHAIN_ACCOUNT (默认值为 api-token):Windows Credential Manager(target api-token.weeek-mcp)、 macOS Keychain、Linux Secret Service(通过 D-Bus 使用 GNOME Keyring/KWallet);通过命令 weeeking store-token 保存。令牌值绝不会被记录到日志中。
  3. 如果令牌为空,服务仍会启动,但调用会返回带有提示的 isError。

系统钥匙串适用于所有平台;没有 D-Bus 的无头 Linux 上无法使用——请通过环境变量 WEEEK_API_TOKEN 或 WEEEK_TOKEN 设置令牌。

Несколько аккаунтов Weeek

Личность действий (автор комментариев, задач) определяется токеном: API всегда действует от владельца токена. Для второго пользователя нужен его собственный токен (создаётся в Настройках workspace → API; доступ к разделу есть у супер-админов и админов).

# 1) Сохранить токен второго аккаунта (ввод скрыт, в argv токен не попадает)
weeeking store-token --account api-token-anna

# 2) Запуск сервера под этим аккаунтом
$env:WEEEK_KEYCHAIN_ACCOUNT = "api-token-anna"; weeeking   # PowerShell (Windows)
WEEEK_KEYCHAIN_ACCOUNT=api-token-anna weeeking             # bash/zsh (macOS, Linux)

Пример второго инстанса в конфиге OpenCode (нативная форма V2):

"mcp": {
  "servers": {
    "weeek-anna": {
      "type": "local",
      "command": ["C:\\путь\\weeeking.exe"],
      "environment": {
        "WEEEK_KEYCHAIN_ACCOUNT": "api-token-anna",
        "READ_ONLY": "false"
      }
    }
  }
}

Агент сможет выбирать, от кого действовать: тулы weeek-anna_* пишут от Анны, weeek_* — от основного аккаунта. Удалить запись из хранилища: Windows — cmdkey /delete:api-token-anna.weeek-mcp; macOS — security delete-generic-password -s weeek-mcp -a api-token-anna; Linux — средствами вашего хранилища (GNOME Keyring / KWallet).

На headless-Linux без D-Bus системного хранилища нет: мультиаккаунт — отдельный инстанс сервера с собственным WEEEK_API_TOKEN в окружении.

CLI
weeeking                                запустить MCP-сервер (stdio)
weeeking store-token [--account <имя>]  сохранить токен в системное хранилище
weeeking --help                         справка

Ограничение операций

READ_ONLY — грубый переключатель: false открывает весь изменяющий API. Тоньше доступ настраивается фильтром операций (по operationId из OpenAPI):

  • WEEEK_DENY_ACTIONS — чёрный список: перечисленные операции (или маски: delete-*) не вызываются и не показываются в описаниях инструментов;
  • WEEEK_ALLOW_ACTIONS — абсолютный белый список: всё, что не перечислено (включая чтения), запрещено; несовместим с WEEEK_PROFILE;
  • WEEEK_PROFILE=executor — готовый узкий профиль: чтения плюс create-task и create-task-comment (создание задачи и комментария; без изменений и удалений).

Семантика: READ_ONLY=true сильнее списков и профиля (они игнорируются с предупреждением); WEEEK_DENY_ACTIONS сильнее WEEEK_ALLOW_ACTIONS и профиля. Fail-closed: пустое значение WEEEK_ALLOW_ACTIONS/WEEEK_DENY_ACTIONS и маска, не совпавшая ни с одной операцией OpenAPI, останавливают сервер с ошибкой при старте; под READ_ONLY=true такие настройки игнорируются, но о проблеме сообщается предупреждением. Списки разделяются запятыми и/или пробелами; * в маске — любая подстрока.

Запрещённые действия не рекламируются в tools/list (действие исчезает из action-enum, инструмент — из списка) и отклоняются при вызове с типизированной ошибкой. Ресурсы, промпты и серверная инструкция тоже следуют политике: если контекст (weeek_context и ресурсы weeek://me, weeek://projects) недоступен, он не рекламируется и не читается, а промпты, опирающиеся на скрытые инструменты, пропадают из prompts/list.

# Запретить все удаления, остальное оставить:
READ_ONLY=false WEEEK_DENY_ACTIONS="delete-*" weeeking

# Узкий исполнитель: чтения, создание задач и комментариев:
READ_ONLY=false WEEEK_PROFILE=executor weeeking

# Явный белый список (абсолютный — чтения тоже перечисляются):
READ_ONLY=false WEEEK_ALLOW_ACTIONS="get-tasks,get-task,get-task-comments,create-task,create-task-comment" weeeking

Соответствие curated-инструментов операциям OpenAPI:

ИнструментОперации
weeek_contextget-profile, get-workspace, get-workspace-members, get-tags, get-projects (+get-boards, get-board-columns при аргументах projectId/boardId)
weeek_search_tasksget-tasks
weeek_get_taskget-task, get-task-comments
weeek_list_commentsget-task-comments
weeek_download_attachmentget-attachment
weeek_create_taskcreate-task
weeek_update_taskupdate-task
weeek_move_taskchange-task-board, change-task-board-column
weeek_complete_taskcomplete-task, uncomplete-task
weeek_set_task_peopleadd-assignees-to-task, remove-assignees-from-task, add-watchers-to-task, remove-watchers-from-task
weeek_add_commentcreate-task-comment
weeek_delete_commentdelete-task-comment

Инструмент доступен, только если разрешены все его операции (у weeek_context дополнительные выборки get-boards/get-board-columns проверяются отдельно — при передаче projectId/boardId). Админ-группы (weeek_project, weeek_task, …) фильтруют action-список: доступные операции перечислены в описании инструмента.

Сосуществование потребителей

Weeek не публикует лимиты запросов, и они, по-видимому, общие на workspace. Когда рядом работают несколько потребителей (инстансы weeeking, сервис-синхронизатор, скрипты), бюджет можно сгладить:

  • WEEEK_RPS — клиентский лимит запросов в секунду для этого инстанса (token bucket): действует на все HTTP-запросы, включая повторные попытки; Retry-After не отменяется — пауза берётся не меньше предписанной API;
  • WEEEK_RPS_BURST — допуск всплеска в токенах: по умолчанию «секунда запаса» (ceil(RPS), минимум 1) — короткая пачка укладывается в секунду без лишнего пейсинга; если при малом RPS параллельные выборки не должны тормозить, задайте burst вручную;
  • по умолчанию throttle выключен; пустое или ≤0 значение — тоже выключен (baseline не меняется); значения меньше 0.001 отклоняются на старте (иначе один запрос ждал бы тысячи секунд).

Общий бюджет на несколько инстансов: разделите WEEEK_RPS между ними вручную или поставьте перед API общий throttle-прокси и укажите его в WEEEK_BASE_URL — тогда лимит соблюдается суммарно.

# Строгий режим для сервиса-синхронизатора: 1 запрос/с без всплеска
READ_ONLY=false WEEEK_RPS=1 WEEEK_RPS_BURST=1 weeeking

# Интерактивный инстанс: в среднем 4 запроса/с, всплеск до 8
WEEEK_RPS=4 WEEEK_RPS_BURST=8 weeeking

Подключение (OpenCode)

Нативная форма OpenCode V2 — серверы живут в mcp.servers:

"mcp": {
  "servers": {
    "weeek": {
      "type": "local",
      "command": ["C:\\путь\\weeeking.exe"],   // на любой ОС: ["npx", "-y", "weeeking"]
      "environment": { "READ_ONLY": "false" }
    }
  }
}

Добавить из CLI: opencode mcp add weeek -- npx -y weeeking (с --global — для всех проектов). Отключить сервер, не удаляя из конфига: "disabled": true (нативная V2-форма; V1-форма "mcp": { "weeek": { … } } с enabled тоже поддерживается).

Любой другой MCP-клиент: команда — путь к бинарнику (или npx -y weeeking), транспорт — stdio.

Обновление спецификации

pip install quickjs            # зависимость кодогенератора (один раз)
python tools/update_spec.py    # developers.weeek.net → src/spec_generated.rs (кодогенерация)
cargo fmt && cargo build --release

Разработка

cargo fmt
cargo clippy --all-targets
cargo test                   # unit + mock-сюита (HTTP против эмулятора) + smoke

Приёмочный smoke против живого API (перед релизом; read-only по умолчанию):

python tools/live_smoke.py
python tools/live_smoke.py --write-test <PROJECT_ID>   # + цикл мутаций в sandbox-проекте

Пересборка при работающем OpenCode (exe залочен запущенным MCP-сервером):

python tools\rebuild.py

Ограничения API Weeek (важно агенту)

  • Описание задачи задаётся только при создании — позже не изменить.
  • tags в weeek_update_task заменяет весь список — сначала прочитайте задачу.
  • Комментарии можно создать и удалить, но не отредактировать.

Участие

Проект открыт для вклада и вопросов: баг-репорты, идеи и вопросы — в issues (для типовых случаев есть шаблоны).

Мейнтейнер — @OniVe.

Безопасность

Об уязвимостях сообщайте приватно — см. SECURITY.md. Токены не попадают в логи; не прикладывайте их к issue и PR.

Лицензия

MIT — см. LICENSE.

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。