{"_id":"@dsudomoin/weeek-mcp","_rev":"3-524a81815c668f31bc0c39f46e8c98c1","name":"@dsudomoin/weeek-mcp","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"name":"@dsudomoin/weeek-mcp","version":"0.1.0","keywords":["mcp","modelcontextprotocol","weeek","tasks","claude","codex"],"license":"MIT","_id":"@dsudomoin/weeek-mcp@0.1.0","maintainers":[{"name":"dsudomoin","email":"sudomoin2013@gmail.com"}],"homepage":"https://github.com/dsudomoin/weeek-mcp","bugs":{"url":"https://github.com/dsudomoin/weeek-mcp/issues"},"bin":{"weeek-mcp":"dist/server.mjs"},"dist":{"shasum":"ab7efbd22cbbd9b5e660b137fe2a678c599ab966","tarball":"https://registry.npmjs.org/@dsudomoin/weeek-mcp/-/weeek-mcp-0.1.0.tgz","fileCount":5,"integrity":"sha512-W0Lt3I+XTVLXTRF0a1ofyGcIXo6UjzI9Boekt4zTcG50ljlM9CXebbK85suCwcK6j/yyMr9Ah9pk6b21i3d6/g==","signatures":[{"sig":"MEYCIQDRXBgq1rgj8Mph22aPM1XynmfMvSv2g/TciWCW3e5nwgIhAJeEovkWb7jKPeoRe1exLkarGWRSNfr8focJ8uQEYaWU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2022998},"type":"module","engines":{"node":">=22.18"},"gitHead":"311925b394d84edfec7a3b6be4159402602f3f66","scripts":{"test":"node --test 'src/**/*.test.ts'","build":"node scripts/bundle.mjs","check":"tsc --noEmit -p tsconfig.check.json","prepack":"npm run build","update:openapi":"node scripts/update-openapi.mjs"},"_npmUser":{"name":"dsudomoin","email":"sudomoin2013@gmail.com"},"repository":{"url":"git+https://github.com/dsudomoin/weeek-mcp.git","type":"git"},"_npmVersion":"11.9.0","description":"MCP server for the Weeek Public API: tasks, comments, attachments","directories":{},"_nodeVersion":"25.6.1","dependencies":{"@napi-rs/keyring":"1.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"4.4.3","marked":"18.0.11","esbuild":"0.28.2","turndown":"7.2.4","typescript":"7.0.2","@types/node":"26.4.0","@types/turndown":"5.0.6","turndown-plugin-gfm":"1.0.2","@modelcontextprotocol/sdk":"1.30.0"},"_npmOperationalInternal":{"tmp":"tmp/weeek-mcp_0.1.0_1788115895489_0.8760646680527822","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@dsudomoin/weeek-mcp","version":"0.2.0","keywords":["mcp","modelcontextprotocol","weeek","tasks","claude","codex"],"license":"MIT","_id":"@dsudomoin/weeek-mcp@0.2.0","maintainers":[{"name":"dsudomoin","email":"sudomoin2013@gmail.com"}],"homepage":"https://github.com/dsudomoin/weeek-mcp","bugs":{"url":"https://github.com/dsudomoin/weeek-mcp/issues"},"bin":{"weeek-mcp":"dist/server.mjs"},"dist":{"shasum":"732cb6fc18944da4590b696c1e0b8f03506e9c07","tarball":"https://registry.npmjs.org/@dsudomoin/weeek-mcp/-/weeek-mcp-0.2.0.tgz","fileCount":5,"integrity":"sha512-NT/mgjhS96cFS6S4iu+wAfyAsrKf9IKiD9AFm8aOkZcHnYG5opjuupBuaLmaHqbsu60VpNCnk953qkZZtAuGEA==","signatures":[{"sig":"MEYCIQCb8trmn8LkLq2Mmk0Z6/A1XzCAaju8HwJ02eBq6bs3qQIhALcwwL4ZgMEtw82+QssD9I6kr+MED7Cu9U7jHMy0tVO/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2015279},"type":"module","engines":{"node":">=22.18"},"gitHead":"06b1bef9503ae01b2d52bd740949c813132a863a","scripts":{"test":"node --test 'src/**/*.test.ts'","build":"node scripts/bundle.mjs","check":"tsc --noEmit -p tsconfig.check.json","prepack":"npm run build","update:openapi":"node scripts/update-openapi.mjs"},"_npmUser":{"name":"dsudomoin","email":"sudomoin2013@gmail.com"},"repository":{"url":"git+https://github.com/dsudomoin/weeek-mcp.git","type":"git"},"_npmVersion":"11.9.0","description":"MCP server for the Weeek Public API: tasks, comments, attachments","directories":{},"_nodeVersion":"25.6.1","dependencies":{"@napi-rs/keyring":"1.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"4.4.3","marked":"18.0.11","esbuild":"0.28.2","turndown":"7.2.4","typescript":"7.0.2","@types/node":"26.4.0","@types/turndown":"5.0.6","turndown-plugin-gfm":"1.0.2","@modelcontextprotocol/sdk":"1.30.0"},"_npmOperationalInternal":{"tmp":"tmp/weeek-mcp_0.2.0_1788181165183_0.6002227448100632","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@dsudomoin/weeek-mcp","version":"0.3.0","description":"MCP server for the Weeek Public API: tasks, comments, attachments","type":"module","license":"MIT","bin":{"weeek-mcp":"dist/server.mjs"},"engines":{"node":">=22.18"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/dsudomoin/weeek-mcp.git"},"homepage":"https://github.com/dsudomoin/weeek-mcp","bugs":{"url":"https://github.com/dsudomoin/weeek-mcp/issues"},"keywords":["mcp","modelcontextprotocol","weeek","tasks","claude","codex"],"scripts":{"build":"node scripts/bundle.mjs","check":"tsc --noEmit -p tsconfig.check.json","pretest":"npm run build","test":"node --test 'src/**/*.test.ts'","update:openapi":"node scripts/update-openapi.mjs","prepack":"npm run build"},"dependencies":{"@napi-rs/keyring":"1.3.0"},"devDependencies":{"@modelcontextprotocol/sdk":"1.30.0","@types/node":"26.4.0","@types/turndown":"5.0.6","esbuild":"0.28.2","marked":"18.0.11","turndown":"7.2.4","turndown-plugin-gfm":"1.0.2","typescript":"7.0.2","zod":"4.4.3"},"gitHead":"97e7e07df5d434fe0f69580c0a7d9b15a752dc7f","_id":"@dsudomoin/weeek-mcp@0.3.0","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-jZwcD/T/gPYCUjL7umB8m+h/XkEmUnoR0xHe9b9SQ1Mj6gcKpdbksq+k39IFTT+uTVWqtl+slH61zZSfBevgSg==","shasum":"efb35d6cd24ca0a2f941a5683e972aba06b9d3cf","tarball":"https://registry.npmjs.org/@dsudomoin/weeek-mcp/-/weeek-mcp-0.3.0.tgz","fileCount":5,"unpackedSize":2017752,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dsudomoin%2fweeek-mcp@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBydTo80vClwGABwBG9mcnhR/mVEPOz0ZkLxoJIFfp/CAiB95jqbJ4KU8BFzuB/VPPA1ESvgVk7CW+qnKq/ybXF/rg=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:310af99f-023d-4818-8147-4b1097e20bae"}},"directories":{},"maintainers":[{"name":"dsudomoin","email":"sudomoin2013@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/weeek-mcp_0.3.0_1788183426420_0.260840990487857"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-30T18:51:35.281Z","modified":"2026-08-31T13:37:07.018Z","0.1.0":"2026-08-30T18:51:35.632Z","0.2.0":"2026-08-31T12:59:25.337Z","0.3.0":"2026-08-31T13:37:06.594Z"},"bugs":{"url":"https://github.com/dsudomoin/weeek-mcp/issues"},"license":"MIT","homepage":"https://github.com/dsudomoin/weeek-mcp","keywords":["mcp","modelcontextprotocol","weeek","tasks","claude","codex"],"repository":{"type":"git","url":"git+https://github.com/dsudomoin/weeek-mcp.git"},"description":"MCP server for the Weeek Public API: tasks, comments, attachments","maintainers":[{"name":"dsudomoin","email":"sudomoin2013@gmail.com"}],"readme":"# weeek-mcp\n\nAn MCP server for [Weeek](https://weeek.net). It lets Claude Code and OpenAI Codex work with your\ntask tracker in ordinary words — \"what is on the board\", \"assign this to Anna and comment that the\nbuild is fixed\" — instead of you switching to a browser to look it up and type it in.\n\nTwelve tools cover twenty-three API operations. They are curated rather than generated one per\nendpoint, which is what keeps the tool list small enough to carry in every request.\n\nRequires **Node 22.18 or newer**.\n\n## Install\n\n### Claude Code\n\n```bash\nclaude plugin marketplace add dsudomoin/weeek-mcp\nclaude plugin install weeek@dsudomoin\n```\n\n### Codex\n\n```bash\ncodex plugin marketplace add dsudomoin/weeek-mcp\ncodex plugin add weeek@dsudomoin\n```\n\nThat is all of it. Under Codex the token comes from this machine's keychain and from nowhere else:\na Codex plugin cannot ask you for a setting, so there is no field to paste a token into and\n`weeek-mcp init` below is the way to supply one. That is how Codex works rather than something\nmissing here.\n\n### Installed once, run from disk\n\nBoth routes above fetch from npm each time the server starts. Install it instead if you work\noffline, sit behind a corporate proxy, or want the version to change only when you say so:\n\n```bash\nnpm install -g @dsudomoin/weeek-mcp\nclaude mcp add weeek --scope user -- weeek-mcp\n```\n\n## Setup\n\nCreate a token in Weeek under **Settings → API**, then run the wizard once, from your terminal:\n\n```bash\nweeek-mcp init\n```\n\nIt asks for the token without showing it, checks it against Weeek before storing anything, and puts\nit in your operating system's keychain — then tells you which store it used. Every client on the\nmachine finds it there. Run it again whenever the token should change — Enter keeps what is already\nthere. If you installed nothing, `npx -y @dsudomoin/weeek-mcp init` runs the same wizard.\n\nRestart your client afterwards. The token is read once, when the server starts.\n\n`WEEEK_API_TOKEN` in the environment always wins over the stored one, which is what makes\ncontainers and CI work. Claude Code can also hold the token in the plugin's own settings.\n\nOn Linux with no session D-Bus — a container, an SSH session, a headless box — there is no\nkeychain to put it in, so the token goes to a file that only you can read. The wizard names that\nfile when it does, which is why the line it prints is worth reading.\n\n## The tools\n\nFour that read:\n\n| Tool | |\n| --- | --- |\n| `weeek_context` | You, the workspace, its projects, members and tags. Every id starts here. |\n| `weeek_search_tasks` | Finds tasks by project, board, assignee, tag, type, priority, text, date. |\n| `weeek_get_task` | One task with its description as markdown and its comment thread. |\n| `weeek_list_comments` | The thread on its own, for paging back through a long one. |\n\nEight that change something:\n\n| Tool | |\n| --- | --- |\n| `weeek_create_task` | Creates a task. The only place a description can be set. |\n| `weeek_update_task` | Title, priority, type, start and due dates, duration, tags. |\n| `weeek_move_task` | Moves it to another board, another column, or both. |\n| `weeek_complete_task` | Completes or reopens, and says when a recurring task spawned another. |\n| `weeek_set_task_people` | Adds and removes assignees and watchers. |\n| `weeek_add_comment` | Posts a comment or a reply. Markdown survives as written. |\n| `weeek_get_attachment` | Downloads an attachment into a temporary directory and returns the path. |\n| `weeek_delete_comment` | Deletes a comment permanently. |\n\nAnswers are shaped for reading, not raw API JSON: names instead of ids, markdown instead of HTML,\nand a sentence saying how to fetch the next page.\n\n**Upgrading from 0.1.0 or 0.2.0:** `weeek_upload_attachment` is gone, and with it `WEEEK_FILE_ROOT` and\n`weeek_get_attachment`'s `saveTo` argument. Nothing here uploads a file any more, and nothing here\nwrites to a path you name — attach files in Weeek itself. Downloading is unchanged apart from\nwhere the file lands, and it now needs no configuration at all.\n\n## Three things Weeek does that will cost you work\n\nFound by experiment, and each contradicts what you would reasonably assume.\n\n- **A description can only be set when the task is created.** Weeek accepts one on an update,\n  answers success, and stores nothing. Write it at creation or not at all.\n- **Updating tags replaces the whole list.** There is no add-one endpoint. To add a tag, read the\n  task's tags first and send them all back with the new one — otherwise every other tag is gone.\n- **Comments cannot be edited.** The API offers create and delete, nothing else.\n\n## Environment variables\n\n| Variable | |\n| --- | --- |\n| `WEEEK_API_TOKEN` | Overrides the stored token. |\n| `WEEEK_BASE_URL` | Defaults to `https://api.weeek.net/public/v1`. |\n| `WEEEK_TIMEOUT_MS` | Per request, defaults to `30000`. |\n\n## Development\n\n```bash\nnpm install\nnpm test        # builds, then runs straight from the TypeScript sources\nnpm run check   # tsc --noEmit\nnpm run build   # esbuild → dist/server.mjs, the file npm publishes\n```\n\n`npm test` builds first, through a `pretest` script, and it has to: `dist/` is not committed, and\ntwo tests read what the build produces — one checks that the file `bin` points at exists, another\nthat the committed `THIRD-PARTY-NOTICES.md` still matches what the current sources bundle. The\nbuild takes about 0.2 s against a 1.6 s run, so it costs nothing to always be right.\n\nCI runs the suite on Node 22.18 — the floor `engines` declares — on the latest Node 22, and on 24,\nwhich is what releases are published from. Node 23 is the one version in that declared range that\nwill not work: type stripping stayed behind a flag until 23.6, so `node --test` cannot read a `.ts`\nfile before then. The line has been end-of-life since 2025.\n\n`src/generated/weeek-openapi.ts` is a committed snapshot of Weeek's OpenAPI spec; refresh it with\n`npm run update:openapi`, which downloads and executes code from their docs site.\n\n## Releasing\n\nReleases are cut by CI. Pushing a tag is the whole of it — nothing is published from a laptop, and\nthere is no npm token anywhere: GitHub Actions proves its identity to npm over OIDC, and npm checks\nthat against a trusted publisher pinned to this repository and to `.github/workflows/publish.yml`.\n\nThe version lives in six files that have to agree, and `npm test` is what holds them together:\n\n- `package.json`\n- `.claude-plugin/marketplace.json`\n- `plugins/weeek/.claude-plugin/plugin.json`\n- `plugins/weeek/.codex-plugin/plugin.json`\n- `plugins/weeek/.mcp.json` — the exact version each client launches through `npx`\n- `plugins/weeek/.codex-plugin/mcp.json` — the same, for Codex\n\nSo, to release `0.3.0`:\n\n```bash\n# Bump all six by hand first. `npm version` will not do it: it knows about package.json and\n# the lockfile and nothing else, and the four it misses are the ones users actually install from.\nnpm install          # refreshes package-lock.json to match\nnpm test             # builds, then refuses if any of the six disagrees\ngit add THIRD-PARTY-NOTICES.md   # the build refreshes it, and it is published\n\ngit commit -am \"chore: release 0.3.0\"\ngit tag v0.3.0       # the tag must match package.json, and CI checks that before publishing\ngit push origin main --follow-tags\n```\n\nThe tag is what starts it. CI then runs the same checks a commit gets, and publishes only if they\npass — so a release cannot skip the tests that a pull request could not. Watch it under the\nrepository's Actions tab; if it fails after the tag is pushed, fix the cause, delete and re-push\nthe tag, or re-run the failed run from the Actions UI once the fix is tagged.\n\n## Licence\n\nMIT — see [LICENSE](LICENSE). The published file is a bundle, so the licences\nof everything compiled into it travel with it in [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md).\n","readmeFilename":"README.md"}