huly-mcp-selfhost 3.1.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/.env.example +12 -0
  2. package/CHANGELOG.md +211 -0
  3. package/README.md +178 -327
  4. package/dist/connection.d.ts +8 -0
  5. package/dist/connection.js +13 -1
  6. package/dist/connection.js.map +1 -1
  7. package/dist/guard.d.ts +11 -0
  8. package/dist/guard.js +13 -0
  9. package/dist/guard.js.map +1 -1
  10. package/dist/guides/costs.md +48 -0
  11. package/dist/guides/features.md +49 -0
  12. package/dist/guides/onboarding.md +56 -0
  13. package/dist/guides/workflow.md +57 -0
  14. package/dist/index.js +11 -0
  15. package/dist/index.js.map +1 -1
  16. package/dist/registry.js +2 -0
  17. package/dist/registry.js.map +1 -1
  18. package/dist/resources.d.ts +7 -0
  19. package/dist/resources.js +48 -5
  20. package/dist/resources.js.map +1 -1
  21. package/dist/schemas.d.ts +23 -0
  22. package/dist/schemas.js +29 -6
  23. package/dist/schemas.js.map +1 -1
  24. package/dist/server.d.ts +14 -0
  25. package/dist/server.js +67 -3
  26. package/dist/server.js.map +1 -1
  27. package/dist/tools/agent.d.ts +35 -0
  28. package/dist/tools/agent.js +134 -11
  29. package/dist/tools/agent.js.map +1 -1
  30. package/dist/tools/documents.js +2 -1
  31. package/dist/tools/documents.js.map +1 -1
  32. package/dist/tools/issues.d.ts +3 -0
  33. package/dist/tools/issues.js +35 -20
  34. package/dist/tools/issues.js.map +1 -1
  35. package/dist/tools/organizations.js +2 -1
  36. package/dist/tools/organizations.js.map +1 -1
  37. package/dist/utils/content.d.ts +5 -0
  38. package/dist/utils/content.js +34 -2
  39. package/dist/utils/content.js.map +1 -1
  40. package/dist/utils/meeting.d.ts +13 -0
  41. package/dist/utils/meeting.js +118 -0
  42. package/dist/utils/meeting.js.map +1 -0
  43. package/dist/utils/redact.d.ts +3 -0
  44. package/dist/utils/redact.js +26 -0
  45. package/dist/utils/redact.js.map +1 -0
  46. package/dist/utils/spec.d.ts +10 -0
  47. package/dist/utils/spec.js +90 -0
  48. package/dist/utils/spec.js.map +1 -0
  49. package/dist/utils/storage.js +7 -3
  50. package/dist/utils/storage.js.map +1 -1
  51. package/package.json +17 -8
  52. package/scripts/copy-guides.js +18 -0
  53. package/scripts/setup.js +89 -33
package/README.md CHANGED
@@ -1,39 +1,97 @@
1
1
  # huly-mcp-selfhost
2
2
 
3
3
  [![npm](https://img.shields.io/npm/v/huly-mcp-selfhost?label=npm)](https://www.npmjs.com/package/huly-mcp-selfhost)
4
+ [![CI](https://github.com/JoKeks2023/huly-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/JoKeks2023/huly-mcp/actions/workflows/ci.yml)
4
5
  [![Docker Pulls](https://img.shields.io/docker/pulls/jokeks2023/huly-mcp)](https://hub.docker.com/r/jokeks2023/huly-mcp)
5
- [![Docker Image Size](https://img.shields.io/docker/image-size/jokeks2023/huly-mcp/latest)](https://hub.docker.com/r/jokeks2023/huly-mcp)
6
- [![Publish Docker image](https://github.com/JoKeks2023/huly-mcp/actions/workflows/docker-publish.yml/badge.svg)](https://github.com/JoKeks2023/huly-mcp/actions/workflows/docker-publish.yml)
7
- [![License: EPL-2.0](https://img.shields.io/badge/license-EPL--2.0-blue)](LICENSE)
6
+ [![MCP Registry](https://img.shields.io/badge/MCP_Registry-io.github.jokeks2023%2Fhuly--mcp--selfhost-blue)](https://registry.modelcontextprotocol.io)
7
+ [![License: EPL-2.0](https://img.shields.io/badge/license-EPL--2.0-blue)](https://github.com/JoKeks2023/huly-mcp/blob/main/LICENSE)
8
8
 
9
- > The most complete MCP server for [Huly](https://huly.app) — the open-source project management platform.
9
+ **The MCP server for [Huly](https://huly.io) — self-hosted or Huly Cloud.** Let Claude and other AI agents work in your Huly workspaces: issues, epics, milestones, documents, chat, inbox, planner, test management and more — 224 tools, built to spend as few tokens as possible.
10
10
 
11
- Connects **Claude Desktop** (and any [MCP](https://modelcontextprotocol.io)-compatible client) directly to your Huly workspaces — one account, as many workspaces as it can access. Manage projects, issues, milestones, components, documents, labels, chat, attachments, organizations, and more — all via natural language.
11
+ [Website](https://jokeks2023.github.io/huly-mcp/) · [Quick start](#quick-start) · [Tools](#tools-224-total-grouped-in-toolsets) · [Claude Code plugin](#claude-code-plugin) · [Changelog](https://github.com/JoKeks2023/huly-mcp/blob/main/CHANGELOG.md)
12
12
 
13
- ## About this fork
13
+ ## Highlights
14
14
 
15
- This is a fork of [varaprasadreddy9676/huly-mcp](https://github.com/varaprasadreddy9676/huly-mcp), built out for a **self-hosted** (`huly-selfhost`) deployment and extended well past the upstream tool set. Published separately as **[`huly-mcp-selfhost`](https://www.npmjs.com/package/huly-mcp-selfhost)** on npm and as a Docker image — `huly-mcp-sdk` on npm is the *original* upstream package, not this one. See [Installing this fork](#installing-this-fork) below.
15
+ - **Everything in Huly:** tracker, documents, chat, inbox, activity, planner, calendar, GitHub PRs, contacts, drive, cards, templates, test management, recruiting, CRM, HR and more — plus read access to *any* Huly class.
16
+ - **Made for agents:** one-call overviews (`my_day`, `standup`, `project_report`, `get_issue_context`), `start_work` → `finish_work`, plans → epics with sub-issues, specs and meeting notes → issues, claims for parallel agents, and `huly-mcp watch` to hand issues to Claude from Huly.
17
+ - **Few tokens:** tools come in toolsets (default ≈10k tokens, everything ≈23k), optionally loaded on demand; pin a workspace for −10 %; compact outputs; wrong parameters are rejected with the valid list instead of silently ignored.
18
+ - **Safe by default:** every change names its workspace, risky tools ask first, writes can be limited to projects, optional audit log.
19
+ - **Claude Code plugin:** `/huly:setup` asks once per repo how Huly is used there and writes the rules; skill, hooks and `/huly:*` commands. Guides and a `setup` prompt for every other MCP client too.
20
+ - **Self-hosted first:** document and description content, file uploads and internal URLs work on `huly-selfhost`; one account, all its workspaces.
16
21
 
17
- **Fixed vs. upstream:**
18
- - **Self-hosted document/description writes.** Upstream's `update_document` (and, by extension, any issue description) is hardcoded against Huly Cloud's "datalake" microservice at `dl-eu.huly.app`, which `huly-selfhost` doesn't run. This fork auto-detects self-hosted deployments via `HULY_FRONT_URL` and uploads through `front`'s own `/files` contract instead — falls back to the original Cloud behavior when `HULY_FRONT_URL` is unset. See [`src/utils/storage.ts`](src/utils/storage.ts).
19
- - **`description` on `create_issue`/`update_issue`.** Missing entirely upstream — issue descriptions are `MarkupBlobRef`s, same storage mechanism as document content, so this needed the same fix.
22
+ ## Quick start
20
23
 
21
- **Multi-workspace:** one login, all workspaces of the account — see [Workspaces](#workspaces-one-account-several-workspaces).
24
+ You need Node.js 20+ and a Huly account — [Huly Cloud](https://huly.app) or self-hosted.
22
25
 
23
- **New tool categories** (upstream had 33 tools across Projects/Issues/Comments/Time/Labels/Relations/Members/Milestones/Components/Documents/Search; this fork adds 15 more):
24
- - **Workspaces** — `list_workspaces`
25
- - **Chat** — `list_channels`, `create_channel`, `start_direct_message`, `send_message`, `list_messages`
26
- - **Attachments** — `attach_file`, `list_attachments`, `delete_attachment` (generic files on issues, any content type)
27
- - **Issue Statuses** — `list_issue_statuses`, `create_issue_status` (custom workflow states)
28
- - **Organizations** — `list_organizations`, `get_organization`, `create_organization`, `update_organization`
26
+ **Claude Code** — install the plugin, then fill in its settings when asked:
29
27
 
30
- **Beyond the tracker (3.0):** inbox, activity history, planner to-dos and time blocking, calendar events, chat threads/reactions/pins, GitHub pull requests, contact persons — plus generic read access to *every* Huly class (`list_classes`, `describe_class`, `query_documents`) and optional guarded writes (`generic_*`). Modules without a published npm type package (Recruiting, CRM, HR, Board, Drive, …) are reachable through the generic tools; dedicated tools for them follow in 3.1/3.2.
28
+ ```
29
+ /plugin marketplace add JoKeks2023/huly-mcp
30
+ /plugin install huly@huly-mcp
31
+ ```
32
+
33
+ Then run `/huly:setup` in a repository. Details: [Claude Code plugin](#claude-code-plugin).
34
+
35
+ **Claude Desktop, Cursor, VS Code, Windsurf, Zed, …** — add the server to your client's MCP config:
36
+
37
+ ```json
38
+ {
39
+ "mcpServers": {
40
+ "huly": {
41
+ "command": "npx",
42
+ "args": ["-y", "huly-mcp-selfhost"],
43
+ "env": {
44
+ "HULY_EMAIL": "you@example.com",
45
+ "HULY_PASSWORD": "your-password"
46
+ }
47
+ }
48
+ }
49
+ }
50
+ ```
51
+
52
+ - **Self-hosted Huly:** add `"HULY_ACCOUNTS_URL": "https://huly.example.com/_accounts"` and `"HULY_FRONT_URL": "https://huly.example.com"`.
53
+ - **Google/GitHub login (no password):** run `npx huly-mcp-selfhost setup` and use `HULY_TOKEN` instead — see [Authentication](#authentication).
54
+ - **One workspace?** Add `"HULY_WORKSPACE": "<slug>"` — fewer tokens.
55
+
56
+ Config file locations and examples for each client: [Compatible clients](#compatible-clients).
57
+
58
+ **Server for a team or remote clients** — run the Docker image (HTTP/SSE on port 8000): see [Docker](#docker).
31
59
 
32
- **Deliberately not built:** Love (live video office), Gmail/Telegram/Bitrix bridges (need their own service setup), analytics and UI preferences.
60
+ Then ask: *"What's on my plate today?"*, *"Plan the login redesign as an epic in WEB"*, *"Write release notes for v1.2"*. More in [Example prompts](#example-prompts).
33
61
 
34
62
  ---
35
63
 
36
- ## Tools (222 total, grouped in toolsets)
64
+ ## Claude Code plugin
65
+
66
+ The repo is also a Claude Code plugin marketplace. The plugin bundles the MCP server with a workflow skill, hooks and commands:
67
+
68
+ ```
69
+ /plugin marketplace add JoKeks2023/huly-mcp
70
+ /plugin install huly@huly-mcp
71
+ ```
72
+
73
+ > **Note:** the plugin starts the npm package at exactly its own version (e.g. `huly-mcp-selfhost@3.3.0`; the plugin directory does not accept version ranges), so a plugin update brings the matching server. To try a local checkout instead: `npm run build`, then point `plugin/.mcp.json` at `dist/index.js` and start `claude --plugin-dir ./plugin`.
74
+
75
+ Claude Code then asks for your Huly settings (e-mail + password or token, and for self-hosted Huly the accounts and front URL; passwords and tokens go to the OS keychain).
76
+
77
+ | Part | What it does |
78
+ |------|--------------|
79
+ | MCP server | `huly-mcp-selfhost` via `npx`, configured from the plugin settings (toolsets, on-demand loading, pinned workspace and writable projects included); tool annotations on (`HULY_ANNOTATIONS=1`) |
80
+ | Skill `huly` | How to use Huly while coding at the lowest token cost: the repo's `## Huly` rules first, find the project for the repo, pick up/hand back issues, status flow, duplicate check, component + milestone, epics for plans, cheapest call per question. Reference files are read only when needed: `costs.md` (measured output size per call), `onboarding.md` (bringing a project into Huly) and `features.md` (all of Huly for a software project — labels, templates, test management incl. CI import, documents, drive, custom fields, cards — with the toolsets each needs) |
81
+ | Hook on session start | Reports the GitHub repo and branch; a branch like `proj-12-login` points Claude to issue `PROJ-12`; points to the repo's `## Huly` rules or offers `/huly:setup` (no network, no credentials) |
82
+ | Hook after `gh pr create` / `gh pr merge` | Reminds Claude to link the new PR to its issue (`finish_work`) or to check the status after a merge |
83
+ | `/huly:setup [workspace]` | Set up Huly for this repo: asks how Huly is used here (role, where new issues go, initiative, how token-saving), writes the answers as a `## Huly` section to `CLAUDE.md`, `CLAUDE.local.md` (only you) or split between both, then optionally imports the project (status set, components, milestones, TODO/FIXME proposals, architecture document). The session-start hook offers it once while a repo has no such section |
84
+ | `/huly:start [PROJ-12]` | Pick up an issue (from the argument or the branch), load the context, plan |
85
+ | `/huly:finish [PROJ-12] [PR]` | Honest summary, PR link, status to review |
86
+ | `/huly:plan <goal>` | Plan → epic + sub-issues (dry run first) |
87
+ | `/huly:day`, `/huly:standup [since]`, `/huly:triage` | My day, stand-up, inbox triage — one call each (`my_day`, `standup`, `triage_inbox`) |
88
+ | `/huly:report <PROJECT> [7d]` | Project status: progress, milestones, blockers (`project_report`) |
89
+
90
+ Without the plugin, the same server works in Claude Code as a plain MCP server (see below); the MCP prompts (`setup`, `start`, `finish`, `plan`, `triage`, `standup`) and guide resources are available there too.
91
+
92
+ ---
93
+
94
+ ## Tools (224 total, grouped in toolsets)
37
95
 
38
96
  All tools except `list_workspaces` take a `workspace` argument — required for every change, optional for reads when only one workspace is available.
39
97
 
@@ -50,7 +108,7 @@ HULY_TOOLSETS=tracker,documents,planner # just these ('core' = list_workspaces i
50
108
 
51
109
  | Toolset | Default | Tools | Contents |
52
110
  |---------|:-:|--:|----------|
53
- | `agent` | ✓ | 12 | agent workflow: my day at a glance, standup, project report, release notes, issue context in one call, start/finish work, plan → issue tree, changes since, claims, repo → project — plus [resources and prompts](#agent-workflow) |
111
+ | `agent` | ✓ | 14 | agent workflow: my day at a glance, standup, project report, release notes, issue context in one call, start/finish work, plan → issue tree, spec document → issues, meeting notes → issues, changes since, claims, repo → project — plus [resources and prompts](#agent-workflow) |
54
112
  | `tracker` | ✓ | 37 | projects, issues, comments, time, labels, relations, milestones, components, statuses, attachments, search |
55
113
  | `documents` | ✓ | 8 | teamspaces and documents (tree, move, rename) |
56
114
  | `chat` | ✓ | 12 | channels, DMs, threads, edit/delete, reactions, pins |
@@ -82,12 +140,12 @@ HULY_TOOLSETS=tracker,documents,planner # just these ('core' = list_workspaces i
82
140
 
83
141
  Context cost of `tools/list` (≈3.5 chars/token):
84
142
 
85
- | | default (94 tools) | `all` (222 tools) |
143
+ | | default (96 tools) | `all` (224 tools) |
86
144
  |---|--:|--:|
87
- | several workspaces | ~38.7k chars ≈ **11k tokens** | ~88.8k chars ≈ **25.4k tokens** |
88
- | pinned with `HULY_WORKSPACE` | ~31.6k chars ≈ **9k tokens** | ~72k chars ≈ **20.6k tokens** |
145
+ | several workspaces | ~36.5k chars ≈ **10.4k tokens** | ~81.6k chars ≈ **23.3k tokens** |
146
+ | pinned with `HULY_WORKSPACE` | ~33k chars ≈ **9.4k tokens** | ~73.3k chars ≈ **20.9k tokens** |
89
147
 
90
- For comparison, 2.2.0 needed ≈12.8k tokens for 64 tools. **Using one workspace? Set `HULY_WORKSPACE`** — the `workspace` argument then disappears from every tool (−20%). **Claude Code** loads MCP tools on demand, so there even `HULY_TOOLSETS=all` costs little up front.
148
+ For comparison, 2.2.0 needed ≈12.8k tokens for 64 tools. **Using one workspace? Set `HULY_WORKSPACE`** — the `workspace` argument then disappears from every tool (−10%). **Claude Code** loads MCP tools on demand, so there even `HULY_TOOLSETS=all` costs little up front.
91
149
 
92
150
  ### Agent workflow
93
151
 
@@ -103,13 +161,15 @@ Tools, resources and prompts for AI agents working on Huly issues (toolset `agen
103
161
  | `start_work` | Status → In Progress, assign to me, optionally claim — returns the full context |
104
162
  | `finish_work` | Work summary as comment, PR (`#12`, URL or Huly id) linked as sub-issue, status → Review in progress, claim released. Validates the PR before changing anything |
105
163
  | `create_issue_tree` | Plan → epic + sub-issues with priorities, components, milestones, assignees, labels and blockers (`"#2"` = second child). Same-title issues are reused, dry run by default |
164
+ | `issues_from_document` | Spec → issues: the open checklist items of a Huly document (without a checklist: its sections) become sub-issues of an epic, checked items are skipped, the document is linked to the epic. Dry run by default; one call instead of reading the document and repeating every task |
165
+ | `issues_from_meeting` | Meeting notes → issues: open checkboxes, lines starting with `TODO:`/`Action:`/`Aufgabe:` and list items under a heading like "Action items" or "Next steps" become issues. `@Name` (or a Huly mention) becomes the assignee, a date (`2026-11-10`, `10.11.2026`, "due …"/"bis …") the due date. Unknown people are flagged and left unassigned; same-title issues are skipped; each new issue is linked to the document. Dry run by default |
106
166
  | `changes_since` | Issues/PRs changed since `24h`, `7d` or an ISO time — which fields changed, new comments, by whom |
107
167
  | `find_project_for_repo` | Workspace + project linked to a GitHub repo (`owner/name`, URL or git remote) via Huly's GitHub integration |
108
168
  | `claim_issue` / `release_issue` | Lease an issue to an agent (label `agent:working` + comment marker) so parallel agents skip it; expires after `minutes` |
109
169
 
110
- **Resources** — `huly://<workspace>/issue/<PROJ-12>` and `huly://<workspace>/document/<id>`. Your open assigned issues are listed, so in Claude Code you can `@`-mention them.
170
+ **Resources** — `huly://<workspace>/issue/<PROJ-12>` and `huly://<workspace>/document/<id>`. Your open assigned issues are listed, so in Claude Code you can `@`-mention them. Guides for agents in any client: `huly://guide/workflow` (how to work with Huly), `huly://guide/costs` (cheapest call per question) and `huly://guide/onboarding` (bringing a project into Huly) and `huly://guide/features` (which Huly feature to use for what, and which toolset it needs) — the same text as the plugin skill.
111
171
 
112
- **Prompts** — `start`, `finish`, `plan`, `triage`, `standup` (in Claude Code: `/mcp__huly__start` …).
172
+ **Prompts** — `setup` (ask how Huly is used for a project and write the rules for your project instructions), `start`, `finish`, `plan`, `triage`, `standup` (in Claude Code: `/mcp__huly__start` …).
113
173
 
114
174
  **Guard rails** (environment):
115
175
 
@@ -303,60 +363,6 @@ Options: `--run <name>`, `--parent-suite <suite>`, `--no-create` (only existing
303
363
 
304
364
  ---
305
365
 
306
- ## Requirements
307
-
308
- - Node.js >= 20
309
- - A Huly account — [huly.app](https://huly.app) (cloud) or self-hosted
310
-
311
- ---
312
-
313
- ## Installing this fork
314
-
315
- This fork is published separately as **[`huly-mcp-selfhost`](https://www.npmjs.com/package/huly-mcp-selfhost)** (`huly-mcp-sdk` is the upstream package). Three ways to run it:
316
-
317
- ### npm / npx
318
-
319
- ```json
320
- "command": "npx",
321
- "args": ["-y", "huly-mcp-selfhost"]
322
- ```
323
-
324
- Every client example below uses this form.
325
-
326
- ### Clone and build
327
-
328
- ```bash
329
- git clone https://github.com/JoKeks2023/huly-mcp.git
330
- cd huly-mcp
331
- npm install
332
- npm run build
333
- ```
334
-
335
- ```json
336
- "command": "node",
337
- "args": ["/absolute/path/to/huly-mcp/dist/index.js"]
338
- ```
339
-
340
- ### Docker (network-reachable server, not local stdio)
341
-
342
- For deployments where the MCP server needs to be reachable over the network (behind a reverse proxy, remote MCP clients, etc.) rather than launched locally per-client, a prebuilt image is published to Docker Hub and GHCR for every release, for `linux/amd64` and `linux/arm64`:
343
-
344
- ```bash
345
- docker pull jokeks2023/huly-mcp:latest # latest release; also :3, :3.1, :3.1.0
346
- # also mirrored at ghcr.io/jokeks2023/huly-mcp:latest
347
- # :edge = latest build from main
348
- ```
349
-
350
- Or with Compose — copy `.env.example` to `.env`, fill in your credentials (no workspace needed), then:
351
-
352
- ```bash
353
- docker compose up -d
354
- ```
355
-
356
- The container wraps the server with [`mcp-proxy`](https://github.com/sparfenyuk/mcp-proxy) to expose it over HTTP/SSE at `:8000/sse`, since standard MCP stdio transport can't be reached over a network directly. See [`Dockerfile`](Dockerfile) / [`docker-compose.yml`](docker-compose.yml).
357
-
358
- ---
359
-
360
366
  ## Workspaces (one account, several workspaces)
361
367
 
362
368
  A single Huly account can belong to several workspaces — e.g. a personal one and a team one. This server logs in **once** with your account credentials and discovers every workspace that account can access via the account service (`getUserWorkspaces()`). You **don't configure a workspace** in the environment.
@@ -369,9 +375,9 @@ A single Huly account can belong to several workspaces — e.g. a personal one a
369
375
  - **IDs are per workspace.** `PROJ-1`, a document id or a comment id identifies something only together with its workspace — the same id can exist in two workspaces. Pass the same `workspace` you got the id from.
370
376
  - Each workspace gets its own lazily opened, cached WebSocket connection with its own workspace token (via `selectWorkspace()`), so workspaces never share state.
371
377
 
372
- **Workspace slug:** the part of the Huly URL after the domain: `huly.app/workbench/`**`myteam`** → `myteam`. You don't need to look it up — `list_workspaces` (or `npm run setup`) prints it.
378
+ **Workspace slug:** the part of the Huly URL after the domain: `huly.app/workbench/`**`myteam`** → `myteam`. You don't need to look it up — `list_workspaces` (or `npx huly-mcp-selfhost setup`) prints it.
373
379
 
374
- **`HULY_WORKSPACE`:** pins the server to that one workspace. Tools then have no `workspace` argument at all, which saves ~20% of the tool-list tokens. Leave it unset to use all workspaces of the account.
380
+ **`HULY_WORKSPACE`:** pins the server to that one workspace. Tools then have no `workspace` argument at all, which saves ~10% of the tool-list tokens. Leave it unset to use all workspaces of the account.
375
381
 
376
382
  ---
377
383
 
@@ -380,10 +386,12 @@ A single Huly account can belong to several workspaces — e.g. a personal one a
380
386
  | Variable | Required | Purpose |
381
387
  |----------|----------|---------|
382
388
  | `HULY_EMAIL` + `HULY_PASSWORD` | one auth option | Account login (needs a password set on your Huly account) |
383
- | `HULY_TOKEN` | one auth option | Account token for SSO accounts (Google/GitHub) — get it with `npm run setup` |
389
+ | `HULY_TOKEN` | one auth option | Account token for SSO accounts (Google/GitHub) — get it with `npx huly-mcp-selfhost setup` |
384
390
  | `HULY_ACCOUNTS_URL` | self-hosted only | Account service — login and workspace discovery. Default `https://account.huly.app`. Self-hosted: your instance's accounts URL, e.g. `https://huly.example.com/_accounts` |
385
391
  | `HULY_FRONT_URL` | self-hosted (optional on Cloud) | Front service — document/description content and file uploads. Not involved in login or workspace discovery. Self-hosted: e.g. `https://huly.example.com` |
392
+ | `HULY_TRANSACTOR_URL` | no | Self-hosted, server next to Huly: connect to the transactor directly instead of the public address the account service returns, e.g. `ws://huly/_transactor` (via nginx) or `ws://transactor:3333`. Saves the detour through your uplink/tunnel. `HULY_ACCOUNTS_URL` can be internal too (`http://huly/_accounts`); an internal `HULY_FRONT_URL` also works but then invite links show the internal address |
386
393
  | `HULY_WORKSPACE` | no | Pin the server to one workspace; tools then take no `workspace` argument (fewer tokens) |
394
+ | `HULY_ANNOTATIONS` | no | `1`: every tool carries MCP annotations — a title, `readOnlyHint` for reads, `destructiveHint` for deletes/removals/bulk changes. Clients can use them to allow reads without asking. Costs ~16% more tool-list tokens, so it is off by default; the Claude Code plugin turns it on |
387
395
  | `HULY_DYNAMIC_TOOLSETS` | no | `1`: start with `HULY_TOOLSETS` and load more on demand via `enable_toolsets` (see [Toolsets](#toolsets)) |
388
396
  | `HULY_TOOLSETS` | no | Comma-separated toolsets to enable, or `all` (see [Toolsets](#toolsets)). Default: `agent,tracker,documents,chat,contacts,inbox,activity,planner,generic` |
389
397
  | `HULY_WRITE_PROJECTS` | no | Only allow changes in these projects, e.g. `TSK,WEB` (see [Agent workflow](#agent-workflow)) |
@@ -395,33 +403,46 @@ A single Huly account can belong to several workspaces — e.g. a personal one a
395
403
 
396
404
  ---
397
405
 
398
- ## Claude Code plugin
406
+ ## Authentication
399
407
 
400
- The repo is also a Claude Code plugin marketplace. The plugin bundles the MCP server with a workflow skill, hooks and commands:
408
+ Create a `.env` file in the project root (or pass via `env` in your client config). No workspace is needed in either option.
401
409
 
410
+ **Option A — Email + password (recommended):**
411
+
412
+ Works if you have a password set on your Huly account (Profile → Security → Change password).
413
+
414
+ ```bash
415
+ HULY_EMAIL=your@email.com
416
+ HULY_PASSWORD=yourpassword
402
417
  ```
403
- /plugin marketplace add JoKeks2023/huly-mcp
404
- /plugin install huly@huly-mcp
418
+
419
+ **Option B — Token (SSO accounts: Google/GitHub):**
420
+
421
+ ```bash
422
+ npx huly-mcp-selfhost setup # Huly Cloud
423
+ npx huly-mcp-selfhost setup --url https://huly.example.com # self-hosted
405
424
  ```
406
425
 
407
- > **Note:** the plugin starts `huly-mcp-selfhost@^3.0.0` from npm. To try a local checkout instead: `npm run build`, then point `plugin/.mcp.json` at `dist/index.js` and start `claude --plugin-dir ./plugin`.
426
+ The wizard asks for your Huly address (unless `--url` or `HULY_ACCOUNTS_URL` is set), sends a one-time code to your email and lists the workspaces the account can access (a discovery test). It then prints the token and the URLs to paste into your client — for the Claude Code plugin: `/plugin` → huly → configure. In a checkout of this repo, `npm run setup` does the same and saves the token as `HULY_TOKEN` in `.env`.
408
427
 
409
- Claude Code then asks for your Huly settings (e-mail + password or token, and for self-hosted Huly the accounts and front URL; passwords and tokens go to the OS keychain).
428
+ ```bash
429
+ HULY_TOKEN=your-token-here
430
+ ```
410
431
 
411
- | Part | What it does |
412
- |------|--------------|
413
- | MCP server | `huly-mcp-selfhost` via `npx`, configured from the plugin settings (toolsets and writable projects included) |
414
- | Skill `huly-workflow` | When and how to use Huly while coding: find the project for the repo, duplicate check before new issues, component + milestone, status flow, PR → issue links, epics for plans |
415
- | Hook on session start | Reports the GitHub repo and branch; a branch like `proj-12-login` points Claude to issue `PROJ-12` (no network, no credentials) |
416
- | Hook after `gh pr create` / `gh pr merge` | Reminds Claude to link the new PR to its issue (`finish_work`) or to check the status after a merge |
417
- | `/huly:start [PROJ-12]` | Pick up an issue (from the argument or the branch), load the context, plan |
418
- | `/huly:finish [PROJ-12] [PR]` | Honest summary, PR link, status to review |
419
- | `/huly:plan <goal>` | Plan → epic + sub-issues (dry run first) |
420
- | `/huly:triage`, `/huly:standup [24h]` | Inbox triage, stand-up from recent changes |
432
+ A token copied from the browser (DevTools → Application → Local Storage → `token`) also works, but may be scoped to the single workspace open in that tab. If the account service refuses to list workspaces for such a token, the server falls back to that one workspace. Use `npx huly-mcp-selfhost setup` for full multi-workspace discovery.
433
+
434
+ > Tokens expire after some time. If you get an auth error, run `npx huly-mcp-selfhost setup` again or switch to email + password.
421
435
 
422
- Without the plugin, the same server works in Claude Code as a plain MCP server (see below); the MCP prompts `start`, `finish`, `plan`, `triage`, `standup` are available there too.
436
+ **Self-hosted Huly:**
423
437
 
424
- ## Compatible Clients
438
+ ```bash
439
+ HULY_ACCOUNTS_URL=https://your-huly-instance.com/_accounts # login + workspace discovery
440
+ HULY_FRONT_URL=https://your-huly-instance.com # document content + file uploads
441
+ ```
442
+
443
+ ---
444
+
445
+ ## Compatible clients
425
446
 
426
447
  The same MCP server works across all major AI coding tools. All examples use **email + password** and the npm package via `npx`; for SSO accounts replace the two credentials with `"HULY_TOKEN": "your-token"` (see [Authentication](#authentication)). To run a local build instead, replace `npx` + args with `node` + `["/absolute/path/to/huly-mcp/dist/index.js"]`.
427
448
 
@@ -594,13 +615,51 @@ The server uses standard **stdio transport**:
594
615
  - **command:** `npx` with args `["-y", "huly-mcp-selfhost"]`, or `node` with `["/absolute/path/to/huly-mcp/dist/index.js"]`
595
616
  - **env:** `HULY_EMAIL` + `HULY_PASSWORD` (or `HULY_TOKEN`); self-hosted also `HULY_ACCOUNTS_URL` + `HULY_FRONT_URL` — see [Configuration](#configuration)
596
617
 
597
- For network access (HTTP/SSE) use the [Docker image](#docker-network-reachable-server-not-local-stdio).
618
+ For network access (HTTP/SSE) use the [Docker image](#docker).
598
619
 
599
620
  ---
600
621
 
601
622
  <img width="932" height="401" alt="image" src="https://github.com/user-attachments/assets/0f9d9a74-ca1e-4884-bd6a-918c0fb8ddbd" />
602
623
 
603
- ## Example Prompts
624
+ ---
625
+
626
+ ## Running the server
627
+
628
+ ### npx (recommended)
629
+
630
+ Every client example uses `"command": "npx", "args": ["-y", "huly-mcp-selfhost"]`. Pin a version (`huly-mcp-selfhost@3.3.0`) if you want updates only when you choose.
631
+
632
+ ### From source
633
+
634
+ ```bash
635
+ git clone https://github.com/JoKeks2023/huly-mcp.git
636
+ cd huly-mcp
637
+ npm ci && npm run build
638
+ ```
639
+
640
+ Then use `"command": "node", "args": ["/absolute/path/to/huly-mcp/dist/index.js"]`.
641
+
642
+ ### Docker
643
+
644
+ For deployments where the MCP server needs to be reachable over the network (behind a reverse proxy, remote MCP clients, etc.) rather than launched locally per-client, a prebuilt image is published to Docker Hub and GHCR for every release, for `linux/amd64` and `linux/arm64`:
645
+
646
+ ```bash
647
+ docker pull jokeks2023/huly-mcp:latest # latest release; also :3, :3.1, :3.1.0
648
+ # also mirrored at ghcr.io/jokeks2023/huly-mcp:latest
649
+ # :edge = latest build from main
650
+ ```
651
+
652
+ Or with Compose — copy `.env.example` to `.env`, fill in your credentials (no workspace needed), then:
653
+
654
+ ```bash
655
+ docker compose up -d
656
+ ```
657
+
658
+ The container wraps the server with [`mcp-proxy`](https://github.com/sparfenyuk/mcp-proxy) to expose it over HTTP/SSE at `:8000/sse`, since standard MCP stdio transport can't be reached over a network directly. **Behind a reverse proxy or on a public hostname, set `MCP_ALLOWED_HOSTS`** to the host name(s) clients use, e.g. `MCP_ALLOWED_HOSTS=huly-mcp.example.com`. Otherwise mcp-proxy only accepts `localhost` and answers `421 Invalid Host header`. See [`Dockerfile`](https://github.com/JoKeks2023/huly-mcp/blob/main/Dockerfile) / [`docker-compose.yml`](https://github.com/JoKeks2023/huly-mcp/blob/main/docker-compose.yml).
659
+
660
+ ---
661
+
662
+ ## Example prompts
604
663
 
605
664
  **Workspaces:**
606
665
  - *"Which Huly workspaces do I have?"*
@@ -658,7 +717,7 @@ For network access (HTTP/SSE) use the [Docker image](#docker-network-reachable-s
658
717
 
659
718
  ---
660
719
 
661
- ## Document Content
720
+ ## Document content
662
721
 
663
722
  ### Reading: `get_document`
664
723
 
@@ -748,44 +807,6 @@ Required column: `title`. Optional: `priority` (Urgent/High/Medium/Low), `status
748
807
 
749
808
  ---
750
809
 
751
- ## Authentication
752
-
753
- Create a `.env` file in the project root (or pass via `env` in your client config). No workspace is needed in either option.
754
-
755
- **Option A — Email + password (recommended):**
756
-
757
- Works if you have a password set on your Huly account (Profile → Security → Change password).
758
-
759
- ```bash
760
- HULY_EMAIL=your@email.com
761
- HULY_PASSWORD=yourpassword
762
- ```
763
-
764
- **Option B — Token (SSO accounts: Google/GitHub):**
765
-
766
- ```bash
767
- npm run setup
768
- ```
769
-
770
- The wizard sends a one-time code to your email, saves the resulting account token as `HULY_TOKEN` in `.env`, and lists the workspaces the account can access (a discovery test).
771
-
772
- ```bash
773
- HULY_TOKEN=your-token-here
774
- ```
775
-
776
- A token copied from the browser (DevTools → Application → Local Storage → `token`) also works, but may be scoped to the single workspace open in that tab. If the account service refuses to list workspaces for such a token, the server falls back to that one workspace. Use `npm run setup` for full multi-workspace discovery.
777
-
778
- > Tokens expire after some time. If you get an auth error, run `npm run setup` again or switch to email + password.
779
-
780
- **Self-hosted Huly:**
781
-
782
- ```bash
783
- HULY_ACCOUNTS_URL=https://your-huly-instance.com/_accounts # login + workspace discovery
784
- HULY_FRONT_URL=https://your-huly-instance.com # document content + file uploads
785
- ```
786
-
787
- ---
788
-
789
810
  ## Architecture
790
811
 
791
812
  ```text
@@ -808,7 +829,7 @@ HULY_EMAIL + HULY_PASSWORD (or HULY_TOKEN)
808
829
  - **No current workspace** — there is no global or "last used" workspace; see [Workspaces](#workspaces-one-account-several-workspaces)
809
830
  - **Stdio transport** — standard MCP transport; the Docker image adds HTTP/SSE via `mcp-proxy`
810
831
 
811
- See [`src/connection.ts`](src/connection.ts).
832
+ See [`src/connection.ts`](https://github.com/JoKeks2023/huly-mcp/blob/main/src/connection.ts).
812
833
 
813
834
  ---
814
835
 
@@ -829,13 +850,13 @@ GitHub Actions check every pull request:
829
850
  | `scheduled.yml` | nightly live smoke test against a sandbox workspace; weekly: the latest `@hcengineering/*` packages, and Huly modules that have no tools yet (see `.github/huly-modules-ignore.txt`). Failures open or update an issue |
830
851
  | `release.yml` | on a `vX.Y.Z` tag: version and changelog check, tests, personal-data check, `npm publish --provenance` (Trusted Publishing), GitHub release from the changelog section, MCP registry entry |
831
852
 
832
- Security reports: see [SECURITY.md](SECURITY.md).
853
+ Security reports: see [SECURITY.md](https://github.com/JoKeks2023/huly-mcp/blob/main/SECURITY.md).
833
854
 
834
855
  `test/repo.test.ts` keeps the docs honest: tool counts in this README, the site and `DOCKERHUB.md` must match the registry, the version must match everywhere, and the plugin must be well-formed.
835
856
 
836
857
  **Releasing:**
837
- 1. Move the `Unreleased` changelog entries under `### X.Y.Z — date`.
838
- 2. Bump the version in `package.json`, `server.json`, `plugin/.claude-plugin/plugin.json` and `src/server.ts`. The tests check that they agree.
858
+ 1. Move the `Unreleased` entries in `CHANGELOG.md` under `### X.Y.Z — date`.
859
+ 2. Bump the version in `package.json`, `server.json`, `plugin/.claude-plugin/plugin.json`, `plugin/.mcp.json` (exact npx version) and `src/server.ts`. The tests check that they agree.
839
860
  3. Merge, then tag `vX.Y.Z` on `main`. The rest runs by itself.
840
861
 
841
862
  **Environments and secrets:**
@@ -851,191 +872,21 @@ Secrets:
851
872
 
852
873
  ## Changelog
853
874
 
854
- ### Unreleased
855
-
856
- _Nothing yet._
857
-
858
- ### 3.1.0 — 2026-11-04
859
-
860
- First 3.x release on npm. 3.0.0 was only released on GitHub; everything from it is included here.
861
-
862
- **One call instead of several**
863
- - **New: `my_day`** (toolset `agent`, on by default) — "what's on today?" in one call: calendar, to-dos, my issues, reviews, unread inbox.
864
- - **New: `standup`, `triage_inbox`, `release_notes`** — one call each instead of several: yesterday/today/blockers, the inbox with what changed since last read, and release notes from a milestone.
865
- - **New: `project_report`** (toolset `agent`) — weekly report of a project: done, new, in progress, blocked, overdue, PRs, milestones, time logged.
866
-
867
- **More of Huly**
868
- - **New: test management, much more of it** — `import_test_results` and the CLI `huly-mcp junit` bring CI results (JUnit XML) into Huly as test runs; `get_test_report` shows failing, flaky, blocked and never-run cases over the latest runs; `create_issue_from_test_result` turns a failed test into a bug (steps and failure included, related to the test case); `create_test_cases` creates many cases at once; suites can be renamed, moved and deleted, runs renamed, dated and deleted, plans deleted, results assigned.
869
- - **New: `start_process` / `cancel_execution`** — run a process on a card and cancel a running one. Starting works like Huly's "Run process" menu; Huly's process service then moves the execution on. Processes whose start asks for input in the app are refused, and so is a second run where the process forbids parallel runs. Cancelling asks first.
870
- - `get_issue` names related non-issue documents (e.g. a test case) instead of showing a bare id.
871
-
872
- **Changed behaviour**
873
- - **Changed: `list_issues` lists open issues by default.** Pass `status: "all"` for every issue, or a status name. Long lists show `51–100 of 118` and page with `offset`. In a mature project this cuts the answer by ~80%.
874
- - **Changed: `list_comments` returns the newest comments** (before: the oldest), still in chronological order. Comments over 1,500 characters are shortened with a visible marker; `full: true` shows them whole. Issue descriptions are never shortened, because `update_issue` replaces them.
875
- - **Changed: Docker tags.** `latest` now means the latest *release* (before: the latest commit on `main`), and `main` builds are tagged `edge`. There are new tags `3` and `3.1` for release lines, and images are built for `linux/arm64` as well, with an SBOM and provenance.
876
- - `list_labels`: dead code for the ignored `projectIdentifier` removed. No behaviour change.
877
-
878
- **Fewer tokens**
879
- - **Fewer tokens:**
880
- - With `HULY_WORKSPACE` set, tools take no `workspace` argument (−20% tool-list size). Changes still go to exactly that workspace.
881
- - Validation limits (`minLength`, `maximum` …) are no longer sent in tool schemas. They are still enforced, with a clear error.
882
- - `list_issues` uses one line per issue and leaves out "No priority".
883
- - `list_notifications` shows notification ids only with `ids: true`. Marking read by object (`PROJ-12`) does not need them.
884
- - **New: load toolsets on demand** (`HULY_DYNAMIC_TOOLSETS=1`, opt-in): start small and let Claude load toolsets with `enable_toolsets`. With `agent,inbox` a session starts at ≈1.8k tokens. Not yet verified in Claude Desktop.
885
- - Server instructions are 41 % shorter (1,463 → 858 chars). They now point to the one-call overviews (`my_day`, `standup`, `triage_inbox` …); hints that the tool descriptions already carry were dropped.
886
- - Read tools describe `workspace` more briefly (the rule for omitting it is in the server instructions), which keeps the default set within its context budget.
887
-
888
- **Security**
889
- - **Security fixes from code scanning:**
890
- - Docker image: `mcp-proxy` 0.14.0 with `mcp` 1.30.0 (fixes 5 CVEs); npm is removed from the runtime image (23 alerts in npm's bundled packages); Debian security updates are applied at build time.
891
- - `uuid` is pinned to 11.1.1 via an npm override (a CVE in 8.3.2, pulled in by Huly's server client).
892
- - Code: entity decoding in `triage_inbox` no longer double-unescapes (`&amp;lt;` stays `&lt;`); JUnit comment removal is repeated until nothing is left; a check-then-read race in `huly-mcp-setup` is gone.
893
-
894
- **CI and releases**
895
- - **CI and automation:**
896
- - every PR is checked on three platforms, with a token report, a personal-data check, a Docker scan and CodeQL
897
- - releases publish themselves from a tag
898
- - a nightly live test runs against a sandbox workspace
899
- - weekly checks cover new Huly packages and Huly modules without tools
900
- - see [Development and CI](#development-and-ci)
901
-
902
- ### 3.0.0 — 2026-11-04
903
-
904
- One large release instead of several small ones, built in stages (see [#11](https://github.com/JoKeks2023/huly-mcp/issues/11)).
905
-
906
- Breaking:
907
- - Tools are grouped into toolsets.
908
- - `calendar`, `github`, `generic-write` and `tracker-admin` are not enabled by default.
909
- - `HULY_TOOLSETS=all` enables everything.
910
-
911
- **Toolsets and the core modules**
912
- - **New: toolsets** (`HULY_TOOLSETS`) and slimmer tool schemas. The 64 tools of 2.2.0 now cost about 36 % fewer tokens.
913
- - **New: inbox** — `list_notifications`, `mark_notifications_read`
914
- - **New: activity** — `get_activity`
915
- - **New: planner** — `list_todos`, `create_todo`, `update_todo`, `delete_todo`, `schedule_todo`
916
- - **New: calendar** — `list_events`, `create_event`, `update_event`, `delete_event`
917
- - **New: chat** — `list_thread`, `reply_to_message`, `update_message`, `delete_message`, `add_reaction`, `remove_reaction`, `pin_message`. `list_messages` now shows authors and message ids.
918
- - **New: GitHub** — `list_pull_requests`, `get_pull_request`
919
- - **New: persons** — `list_persons`, `get_person`, `create_person`, `update_person`, `add_contact_channel`, `remove_contact_channel`
920
- - **New: generic access** — `list_classes`, `describe_class` and `query_documents` (secrets redacted). `generic_create`, `generic_update` and `generic_delete` are opt-in and run as a dry run by default.
921
-
922
- **Agent workflow**
923
- - **New: agent workflow** (toolset `agent`, on by default) — `get_issue_context`, `start_work`, `finish_work`, `create_issue_tree`, `changes_since`, `claim_issue`, `release_issue`, `find_project_for_repo`
924
- - **New: MCP resources** (`huly://…/issue/…`, `huly://…/document/…`)
925
- - **New: MCP prompts** (`start`, `finish`, `plan`, `triage`, `standup`)
926
- - **New: guard rails** — `HULY_WRITE_PROJECTS` limits changes to the listed projects, and `HULY_AUDIT_LOG` records every change.
927
- - **Changed: toolset `tracker-admin`.** These tools are no longer in the default set: `create_project`, `update_project`, `create_issue_status`, `update_label`, `delete_label`, `delete_milestone`, `delete_component`, `repair_parent_links`. Enable them with `HULY_TOOLSETS=…,tracker-admin` or `all`.
928
-
929
- **Claude Code plugin**
930
- - **New: Claude Code plugin** (`/plugin marketplace add JoKeks2023/huly-mcp`, `/plugin install huly@huly-mcp`). It bundles:
931
- - the MCP server with its settings
932
- - the `huly-workflow` skill
933
- - session-start and PR hooks
934
- - the commands `/huly:start`, `/huly:finish`, `/huly:plan`, `/huly:triage`, `/huly:standup`
935
-
936
- **More of Huly**
937
- - **New: fulltext search across everything** — `search` (issues, documents, messages, cards, files, persons …)
938
- - **New: toolset `collaboration`** — followers of issues/documents, public guest links, document comments
939
- - **New: toolset `cards`** — card types and tags, cards with content, nesting and field values
940
- - **New: toolset `fields`** — custom fields on issues, project types, card types or any class, and their values
941
- - **New: toolset `drive`** — drives, folders, versioned files (upload, download, move, restore)
942
- - **New: toolset `templates`** — issue templates; new issue with sub-issues from a template
943
- - **New: toolset `testing`** — test projects, suites, cases, plans, runs and results
944
- - **New: toolset `products`** — products and versions (read-only)
945
- - **New: label categories** (`tracker-admin`)
946
- - **New: documents** — `list_documents` shows the whole tree; `update_document` renames and moves (also to another teamspace); new documents are placed after their siblings
947
- - **New: MCP argument completions** for prompts and `huly://` resources (workspaces, projects, issue ids) and **resource subscriptions** (`notifications/resources/updated` when a subscribed issue or document changes)
948
-
949
- **Business modules**
950
- - **New: toolsets `members`, `recruiting`, `crm`, `hr`, `inventory`** — invitations and roles, vacancies/candidates/applications, leads/customers, departments and time off, inventory
951
- - **New: message templates** (`templates`) and **project types with workflows** (`tracker-admin`)
952
- - **New, read-only: `meetings`** (minutes, transcripts), **`qms`** (controlled documents, trainings), **`process`**, **`surveys`**
953
- - Not included: Huly's Board module (hidden and off by default in Huly itself).
954
-
955
- **Agents**
956
- - **New: confirmation for risky tools** — deletes, bulk updates, moves, generic writes, revoking links and restoring file versions ask the user via MCP elicitation when the client supports it (`HULY_CONFIRM`). Declining changes nothing.
957
- - **New: `huly-mcp watch`** — Huly hands work to an agent: issues with a label or assigned to the agent's own account are claimed, passed to `claude -p` (or any command) and released afterwards. Runs are unattended, so they default to `HULY_CONFIRM=strict`.
958
-
959
- **Fixes**
960
- - `create_teamspace`, `create_channel`, `start_direct_message` and `create_project` stored the user's social id as member/owner; Huly 0.7 expects the account id. Spaces created with earlier versions may list you twice as member and have no proper owner.
961
- - Public links created on servers whose `FRONT_URL` is `localhost` are shown with `HULY_FRONT_URL` instead.
962
- - Empty or unresolved `HULY_*` variables (for example plugin settings left blank) now count as not set.
963
- - Nested tool errors no longer repeat the "Huly MCP:" prefix.
964
-
965
- ### 2.2.0 — planning, bulk edits, fixes for Huly 0.7
966
-
967
- - **New: filters in `list_issues`** — milestone, component, label, assignee, parent (null = without / top-level)
968
- - **New: `bulk_update_issues`, `move_issue`, `list_sub_issues`, `list_time_reports`**
969
- - **New: `update_project`, `update_comment`, `update_label`, `delete_label`, `remove_relation`, `remove_blocked_by`**
970
- - **New: `repair_parent_links`** — re-links sub-issues created by earlier versions (dry run by default)
971
- - **More detail in `get_issue`** — assignee, milestone, component, labels, parent, blocked by, related
972
- - **`list_members`** shows names
973
- - **Fix: `set_parent`** now links like Huly itself (`attachedTo`). Before, sub-issues did not appear under their parent in Huly. Existing links: `repair_parent_links` or `set_parent` again
974
- - **Fix: people lookup on Huly 0.7** — `log_time` failed ("Could not identify current user"), assigning by name (`assignee`, `lead`) never matched and comment authors showed as "Unknown". People are now resolved via the Employee mixin; names are shown as "First Last" and ambiguous names are rejected
975
- - **Fix: bold/italic text** in issue, document and organization descriptions no longer breaks into separate lines
976
- - **Fix: `update_issue`** accepts `componentLabel: null` (as documented) and rejects invalid due dates
977
-
978
- ### 2.1.0 — milestones & components, security updates
979
-
980
- - **New: `get_milestone`, `update_milestone`, `delete_milestone`** — progress overview, edit name/date/status/description, delete with issues unassigned or moved via `moveIssuesTo`
981
- - **New: `update_component`, `delete_component`** — edit name/description/lead, delete with issues unassigned or moved via `moveIssuesTo`
982
- - **Changed: `list_components`** renders Markdown/ProseMirror descriptions as text
983
- - **Security:** all open dependency advisories fixed — `@modelcontextprotocol/sdk` 1.32, `ws` 8.22, `zod` 4, `dompurify` 3.4.17 (override)
984
-
985
- ### 2.0.0 — multi-workspace
986
-
987
- Breaking: tools that change data require `workspace`; `HULY_WORKSPACE` only restricts the server to one workspace.
988
-
989
- - **New: multi-workspace support** — one account login, workspaces discovered via `getUserWorkspaces()`, one cached connection per workspace; `HULY_WORKSPACE` is no longer required (still honoured as an optional single-workspace restriction)
990
- - **New: `list_workspaces`**
991
- - **Changed: every tool takes `workspace`** — required for all tools that change data; reads may omit it only when exactly one workspace is available
992
- - **New: `huly-mcp-selfhost` bin alias** — `npx huly-mcp-selfhost` now starts the server directly
993
- - **Changed: `npm run setup`** no longer asks for a workspace; it lists the discovered workspaces instead
994
- - **Changed: `scripts/import-csv.js`, `cleanup-issues.js`, `demo.js`** need `--workspace=<slug>` (or `HULY_WORKSPACE`)
995
-
996
- ### Fork — self-hosted support, chat, attachments, statuses, organizations
997
- - **Fix: self-hosted document/description writes** — auto-detects `huly-selfhost` via `HULY_FRONT_URL` and uploads through `front`'s `/files` contract instead of Huly Cloud's datalake, which self-hosted doesn't run
998
- - **New: `description` on `create_issue`/`update_issue`** — was missing entirely upstream
999
- - **New: Chat** — `list_channels`, `create_channel`, `start_direct_message`, `send_message`, `list_messages`
1000
- - **New: Attachments** — `attach_file`, `list_attachments`, `delete_attachment`
1001
- - **New: Issue Statuses** — `list_issue_statuses`, `create_issue_status`
1002
- - **New: Organizations** — `list_organizations`, `get_organization`, `create_organization`, `update_organization`
1003
- - See [About this fork](#about-this-fork) for details and what was investigated but not built
1004
-
1005
- ### v0.5.6 — delete_document
1006
- - **New: `delete_document`** — permanently delete a document by ID
1007
-
1008
- ### v0.5.5 — create_teamspace
1009
- - **New: `create_teamspace`** — create a new document teamspace (top-level folder for organising documents by project or team)
1010
-
1011
- ### v0.5.2 — delete_comment + link_document
1012
- - **New: `delete_comment`** — delete a specific comment from an issue by ID; `list_comments` now includes comment IDs in its output
1013
- - **New: `link_document`** — link a Huly document to an issue; the document appears in the Relations panel on the issue
1014
-
1015
- ### v0.5.0 — Document Writing + Bug Fixes
1016
- - **New: `update_document`** — write Markdown to any Huly document programmatically; `\`\`\`mermaid` blocks use Huly's native node type and render as interactive diagrams
1017
- - **Fix: `IssueStatus` queries** — statuses are stored globally in Huly (`core:space:Model`), not per-project; removed incorrect space filter that caused *"no statuses found"* errors on `create_issue`, `update_issue`, and `list_issues`
1018
- - **Fix: `create_project`** — sets `members: [currentUser]` so newly created projects are immediately visible in the Huly UI
1019
-
1020
- ### v0.4.0
1021
- - `log_time`, `list_comments`, component/milestone assignment on `update_issue`
1022
-
1023
- ### v0.3.1
1024
- - `get_document`, `create_document`
1025
-
1026
- ### v0.3.0
1027
- - `create_project`, `create_milestone`, assignee support on issues
875
+ See [CHANGELOG.md](https://github.com/JoKeks2023/huly-mcp/blob/main/CHANGELOG.md).
1028
876
 
1029
877
  ---
1030
878
 
1031
- ## Links
879
+ ## Credits
1032
880
 
1033
- - This fork: https://github.com/JoKeks2023/huly-mcp
1034
- - Upstream: https://github.com/varaprasadreddy9676/huly-mcp ([npm](https://www.npmjs.com/package/huly-mcp-sdk), [MCP Registry](https://registry.modelcontextprotocol.io) — neither reflects this fork's changes)
1035
- - Missing `.d.ts` in `@hcengineering/*` 0.7.411+: https://github.com/hcengineering/platform/issues/10881
881
+ Started as a fork of [varaprasadreddy9676/huly-mcp](https://github.com/varaprasadreddy9676/huly-mcp) (npm `huly-mcp-sdk`) by SaiVaraprasad Medapati and grown from its 33 tools to 224, with self-hosted support, toolsets, agent workflow and the Claude Code plugin. Published separately as `huly-mcp-selfhost`. Not affiliated with Huly Labs.
1036
882
 
1037
- ---
883
+ ## Links
884
+
885
+ - Website: https://jokeks2023.github.io/huly-mcp/
886
+ - Source and issues: https://github.com/JoKeks2023/huly-mcp
887
+ - npm: https://www.npmjs.com/package/huly-mcp-selfhost · Docker: https://hub.docker.com/r/jokeks2023/huly-mcp · MCP Registry: `io.github.jokeks2023/huly-mcp-selfhost`
888
+ - Security: [SECURITY.md](https://github.com/JoKeks2023/huly-mcp/blob/main/SECURITY.md)
1038
889
 
1039
890
  ## License
1040
891
 
1041
- [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
892
+ [Eclipse Public License 2.0](https://github.com/JoKeks2023/huly-mcp/blob/main/LICENSE)