Skip to main content

weeek-mcp

CI PyPI version License: MIT

Language: English · Русский

An MCP server for Weeek: manage tasks through the public REST API and browse the knowledge base through Weeek's internal API, exposed as MCP Resources so you can search and select KB documents as content (not links) from your MCP client.

Contents

Features

Tasks and boards

Public REST API — projects, boards, board columns, and the full task lifecycle: create, update, complete, move between columns, assign and unassign members.

Knowledge base

Full CRUD. Weeek has no public KB API, so the server calls Weeek's internal JSON API (api.weeek.net/ws/{id}/kb/...) using cookies from a saved browser login. Documents are rendered to Markdown and published as MCP Resources (weeek-kb://<id>). Read/list/search/create/rename/delete go over the JSON API; in-place body editing speaks Weeek's collaborative protocol directly (Hocuspocus/Yjs), because bodies live in a shared document the REST API only serves a snapshot of. Content is converted between Markdown and Weeek's ProseMirror format automatically.

Capability-aware

Task tools appear when an API token is set; KB tools and resources appear when login credentials or a cached session are present.

Installation

Claude Desktop

  1. Download weeek-mcp.mcpb from the latest release.
  2. Open it (or drag it onto Settings → Extensions) and enter your Weeek API token: Weeek → Settings → API.

That's all for tasks. Desktop runs the server with its own uv, so you don't need Python.

For the knowledge base, sign in once from a terminal. This step needs uv:

uvx --from "weeek-mcp[kb]" playwright install chromium
uvx --from "weeek-mcp[kb]" weeek-mcp-login

A browser opens: sign in to Weeek and the session is saved. Then switch the extension off and on in Settings → Extensions.

Email and password in the extension settings are optional. With them the server signs in again by itself when the session expires. Without them, or if you use 2FA or SSO, run weeek-mcp-login again.

Other MCP clients

weeek-mcp is a plain stdio server, so it works with any MCP client that launches servers as a local subprocess: Claude Code, Cursor, Windsurf, Cline, Continue, Zed, VS Code (Copilot agent mode), Gemini CLI, Goose, LibreChat, and others, plus your own agents built on an MCP SDK. It needs Python 3.10+:

pip install "weeek-mcp[kb]"        # drop [kb] if you only need tasks
playwright install chromium         # knowledge base only
weeek-mcp-login                     # knowledge base only, one-time sign-in

If weeek-mcp-login or weeek-mcp isn't found, pip put them outside your PATH: add the scripts directory from pip show -f weeek-mcp to it, or use the absolute path in your client config.

Then register the weeek-mcp command with your client. Claude Code (-s user makes it available in every project):

claude mcp add weeek -s user -e WEEEK_API_TOKEN=... -- weeek-mcp

Cursor (~/.cursor/mcp.json, or .cursor/mcp.json in a project):

{
  "mcpServers": {
    "weeek": {
      "command": "weeek-mcp",
      "env": { "WEEEK_API_TOKEN": "..." }
    }
  }
}

VS Code (.vscode/mcp.json) uses a servers key and an explicit type:

{
  "servers": {
    "weeek": {
      "type": "stdio",
      "command": "weeek-mcp",
      "env": { "WEEEK_API_TOKEN": "..." }
    }
  }
}

On the knowledge base: task tools and weeek_kb_* are ordinary MCP tools and work almost everywhere. Pulling documents in through an attachment menu relies on MCP Resources, which fewer clients surface. Where they aren't supported, read the KB with weeek_kb_read/weeek_kb_search — the content still lands in context. MCP and resources support moves fast per client; check the client's docs before relying on it.

Configuration

Environment variables (or a .env file, see .env.example). Only WEEEK_API_TOKEN is required, and only for task tools.

Variable Purpose
WEEEK_API_TOKEN Task API token. Required for task tools.
WEEEK_EMAIL / WEEEK_PASSWORD First automated KB login. Optional (skip if 2FA/SSO — use weeek-mcp-login).
WEEEK_WORKSPACE_ID KB workspace id. Optional — auto-detected via /ws when unset.
WEEEK_STORAGE_STATE Where the browser session is cached (defaults under ~/.local/state).
WEEEK_HEADLESS false to watch the browser during login.
WEEEK_KB_CACHE_TTL Seconds to cache the KB document list (default 300).
WEEEK_DEBUG_LOG 1/true to write diagnostic timing/step logs to ~/.local/state/weeek-mcp/debug.log (some MCP hosts discard stderr). Off by default.

Tools

Tasks

Group Tools
Reading & navigation weeek_whoami, weeek_list_members, weeek_list_projects, weeek_list_boards, weeek_list_board_columns, weeek_list_tasks, weeek_get_task
Task lifecycle weeek_create_task, weeek_update_task, weeek_complete_task, weeek_uncomplete_task, weeek_delete_task, weeek_move_task
Assignees, watchers, hierarchy weeek_set_assignees, weeek_remove_assignees, weeek_set_watchers, weeek_remove_watchers, weeek_set_task_parent, weeek_add_task_to_project, weeek_remove_task_from_project
Time & attachments weeek_task_timer, weeek_manage_time_entry, weeek_upload_attachment, weeek_get_attachment
Fields & comments weeek_list_custom_fields, weeek_list_task_comments, weeek_add_task_comment, weeek_update_task_comment, weeek_delete_task_comment

Workspace admin

weeek_manage_tags, weeek_manage_projects, weeek_manage_boards, weeek_manage_board_columns, weeek_manage_portfolios, weeek_manage_custom_fields.

These take an action (create/update/delete/…) rather than one tool per operation — the CRUD is regular and the tool list stays readable. Custom fields live per board, per project or workspace-wide, so that tool takes a scope (global/project/board) plus scope_id.

Knowledge base

Group Tools
Reading weeek_kb_search, weeek_kb_list, weeek_kb_read
Writing weeek_kb_create, weeek_kb_update, weeek_kb_attach, weeek_kb_delete
Formatting weeek_kb_table_widths, weeek_kb_icons

weeek_kb_update with new content writes into the document's shared Yjs document over Weeek's collaborative websocket, because that — not REST — is where bodies are saved. No browser is involved and the document id is preserved.

Behavior

Priorities. Take either Weeek's number or its label:

Number Label
0 low (Низкий)
1 medium (Средний)
2 high (Высокий)
3 hold (Замороженный)

Custom fields. Set with custom_fields: on an existing task by field name or id ({"Ссылка на фичу": "https://…"}, null clears a field, a select takes the option name or id), on weeek_create_task by id only — weeek_list_custom_fields lists them. A field belongs to the projects it was added to, and Weeek stores nothing when you write to one it doesn't cover, so the write is verified and reported.

Descriptions. Editable on an existing task: weeek_update_task takes description as Markdown (empty string clears it). Weeek's REST API only accepts a description on create — PUT /tm/tasks/{id} has no such field — because descriptions sync through the same collaborative channel as KB document bodies, so this writes into that channel and needs the knowledge base session. weeek_create_task still takes its description as HTML, which is what that endpoint stores.

Comments. Read with weeek_list_task_comments, written with weeek_add_task_comment and rewritten in place with weeek_update_task_comment (all Markdown) — an edited comment beats posting a correction under the original. weeek_delete_task_comment removes one for good; Weeek keeps no trash for comments. Weeek's public API has no comments at all, so these go through its web API on the knowledge base session; no browser is launched, only the saved cookies.

Tables. One size to set: the pixel width of each column (minimum 90). New tables are fitted to the document's content column (~676px) instead of Weeek's 180px-per-column default, and existing widths are carried across a weeek_kb_update — a table that gains or loses a column is re-fitted. weeek_kb_table_widths sets them explicitly: widths: [300, 200, 176] for exact sizes, or fit: true to spread a table across the content column.

Attachments. weeek_kb_attach uploads local files and adds each one as a block at the end of the document: an image block for images, a file block with name and size for anything else. It leaves the rest of the body alone. Weeek keeps no attachment list beside a document, so the block is the attachment. weeek_kb_read shows it as a link on a line of its own, and weeek_kb_update keeps the block as long as that line stays in the new body; drop the line and the block goes with it.

Icons. Pass icon to weeek_kb_create/weeek_kb_update as a single emoji (🚀) or as one of Weeek's built-in icon names (weeek_kb_icons lists them); an empty icon removes it. Listings report the icon a document currently has.

Knowledge base in Claude context

Each KB document is published as an MCP Resource (weeek-kb://<id>). In Claude Desktop you add them from the attachment (+) menu of the connected server — browse the list or narrow it with weeek_kb_search — and the client pulls in the document content, not a link.

Note on Project Context: Claude Desktop surfaces MCP resources as attachments. Whether a selected resource persists inside a Project's Context panel (vs. a single conversation) depends on your Claude Desktop version. The content-not-a-link behavior works regardless.

Status & limitations

  • Task tools follow Weeek's published OpenAPI spec.
  • Knowledge base uses Weeek's internal, undocumented API (/ws/{id}/kb/...). It is not covered by any stability guarantee and may change without notice; if KB calls start failing, the endpoints in weeek_mcp/kb/client.py are the place to look. Login automation targets Weeek's two-step web form (weeek_mcp/kb/session.py); accounts with 2FA/captcha/SSO should seed the session with weeek-mcp-login instead.
  • Document content is ProseMirror/TipTap JSON, converted to/from Markdown by weeek_mcp/kb/prosemirror.py. Editing an existing body goes through Weeek's collaborative channel (there is no REST content-write): weeek_mcp/kb/collab.py speaks the Hocuspocus protocol, authenticates with a per-socket ticket, and replaces the prosemirror fragment of the document's Y.Doc. Authoring covers the common Markdown subset (headings, paragraphs, lists, bold/inline code, code blocks, quotes, rules); rich cases like nested lists and tables are simplified.
  • Table column widths live on the table_body node, as a JSON string, and are written with the body rather than after it (weeek_mcp/kb/tables.py). Cell colors and per-column colors are stored alongside the widths but are not exposed as tools yet.

Development

See CONTRIBUTING.md for setup, tests, and pull requests.

License

This project is licensed under the MIT License — see LICENSE.

Metadata

Release files for weeek-mcp 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for weeek-mcp 0.3.0
File Size Uploaded
weeek_mcp-0.3.0.tar.gz 52.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for weeek-mcp 0.3.0
File Interpreter ABI Platform
weeek_mcp-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 111.2 kB

Release files / weeek_mcp-0.3.0.tar.gz

Download URL weeek_mcp-0.3.0.tar.gz
Size 52.5 kB
Tags Source
SHA-256 checksum
How to use checksums
0cc2588043f2d2db770439038ccac5a57bad845c5b649a7524df6edfa2d75dd1
BLAKE2b-256 checksum
How to use checksums
4f81644f4a3976b7178fe058d943c32e7faf5cd1686c2518631e0b891ace633f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.9.24 {"installer":{"name":"uv","version":"0.9.24","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / weeek_mcp-0.3.0-py3-none-any.whl

Download URL weeek_mcp-0.3.0-py3-none-any.whl
Size 58.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7b5b691ce9ecb44479892859722c379195046e6d650fcc148734ae2d991554da
BLAKE2b-256 checksum
How to use checksums
81aa689876747209ad776106f346e1da19a6d153fda2555b5a7d8d81c2edc59b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.9.24 {"installer":{"name":"uv","version":"0.9.24","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

0.4.0

2 release files

This release

0.3.0 This release

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page