huly-mcp-selfhost
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| HULY_EMAIL | No | Huly account e-mail (with HULY_PASSWORD) | |
| HULY_TOKEN | No | Instead of e-mail/password: account or API token (Google/GitHub accounts: npx huly-mcp-selfhost setup) | |
| HULY_PASSWORD | No | Huly account password | |
| HULY_TOOLSETS | No | Comma-separated toolsets to load, or 'all' (default: agent, tracker, documents, chat, contacts, inbox, activity, planner, generic) | |
| HULY_FRONT_URL | No | Self-hosted: front service for documents and files, e.g. https://huly.example.com | |
| HULY_WORKSPACE | No | Pin one workspace (slug); fewer tokens | |
| HULY_ACCOUNTS_URL | No | Self-hosted: accounts service, e.g. https://huly.example.com/_accounts (empty = Huly Cloud) | |
| HULY_WRITE_PROJECTS | No | Only allow changes in these project keys, e.g. TSK,WEB |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
Huly workspaces (tracker, docs, chat, planner, …), self-hosted or cloud.
workspace: slug, name or id from list_workspaces. Required for changes — never guess; ask if unclear. Reads may omit it only if exactly one workspace exists. Ids are only valid within their workspace.
Issue id PROJ-123; dates ISO 8601; people by name (ambiguous names are rejected); null clears a field; text is Markdown.
Start with one-call overviews: my_day, standup, triage_inbox, project_report, get_issue_context.
Agent work: start_work → work → finish_work; plans → create_issue_tree (dry run first); with parallel agents claim_issue first.
Read before replacing: get_issue before update_issue description, get_document before update_document.
Risky tools may ask the user; if declined, do not retry. Login or setup problems: check_setup. A change was wrong: undo_changes (dry run first).
Missing tools may be in a disabled toolset (HULY_TOOLSETS).
Guides: resources huly://guide/workflow, huly://guide/costs, huly://guide/onboarding, huly://guide/features; prompt "setup" writes a project's Huly rules.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"subscribe": true,
"listChanged": true
} |
| completions | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_workspacesA | List accessible workspaces (name, slug, id) |
| undo_changesA | Undo your last changes made through this server: created → removed, changed → old values, deleted → restored. Dry run first |
| check_setupB | Diagnose the setup: version and updates, login, workspaces, front URL, settings (no secrets) |
| list_projectsC | List all projects in a Huly workspace |
| get_projectC | Project by key (e.g. "PROJ"): name, description, issue count, statuses |
| list_issuesC | List issues of a project; filters: status, priority, milestone, component, label, assignee, parent |
| get_issueB | Get full details of an issue by identifier (e.g. "PROJ-123") |
| create_issueC | Create a new issue in a project |
| update_issueC | Update issue fields |
| delete_issueB | Permanently delete an issue by identifier (e.g. "PROJ-123") |
| bulk_update_issuesB | Apply one change to many issues; validates all first |
| move_issueA | Move issue (incl. sub-issues, comments, files, time) to another project; gets a new id, component/milestone cleared |
| list_sub_issuesC | Sub-issue tree of an issue with progress |
| add_commentC | Add a comment to an issue |
| list_commentsC | List comments of an issue (with ids) |
| delete_commentA | Permanently delete a comment on an issue (commentId from list_comments); to edit: update_comment |
| update_commentC | Edit a comment by id |
| log_timeC | Log hours spent on an issue |
| list_time_reportsB | Logged time for an issue or project, totals per person; person/date filters |
| list_labelsB | List all labels in the workspace |
| create_labelA | Create a workspace-wide label (optional hex color); an existing title is reused. Tag an issue: add_label |
| add_labelC | Add label to issue (auto-creates label) |
| remove_labelB | Remove a label from an issue |
| add_relationB | Mark two issues as related to each other (bidirectional) |
| add_blocked_byC | Mark an issue as blocked by another issue |
| set_parentC | Set or clear the parent (epic) of an issue |
| remove_relationB | Remove the "related" link between two issues |
| remove_blocked_byC | Remove a "blocked by" link from an issue |
| list_membersC | List all members in the workspace |
| list_milestonesC | List milestones for a project |
| create_milestoneC | Create a new milestone in a project with a target date |
| get_milestoneD | Milestone with progress and open issues |
| update_milestoneC | Update a milestone (name, target date, status, description) |
| list_componentsC | List components (sub-areas) in a project |
| create_componentA | Create a component (sub-area) in a project; issues get it via componentLabel. Change it: update_component |
| update_componentC | Update a component (name, description, lead) |
| list_teamspacesB | List document teamspaces with their ids (teamspaceId for list_documents, create_document) |
| create_teamspaceC | Create a document teamspace |
| list_documentsC | List documents in a teamspace |
| get_documentC | Document metadata and content |
| create_documentA | Create an empty document in a teamspace, optionally under a parent; returns its id. Write the body with update_document |
| delete_documentA | Permanently delete a document by its ID |
| update_documentA | Replace content (Markdown), rename or move a document |
| link_documentC | Link a document to an issue (Relations panel) |
| search_issuesC | Full-text search across all issues |
| list_channelsC | List all channels in the workspace |
| create_channelD | Create a new channel |
| start_direct_messageB | Start or find a 1:1 DM with a person |
| send_messageC | Send a message to a channel or direct message |
| list_messagesC | List messages in a channel or direct message |
| attach_fileB | Attach a file to an issue (base64-encoded content) |
| list_attachmentsC | List files attached to an issue |
| delete_attachmentA | Permanently delete a file attached to an issue (attachmentId from list_attachments) |
| list_issue_statusesB | List all issue statuses (workflow states), grouped by phase |
| list_organizationsB | List all organizations (companies) in the workspace |
| get_organizationA | Organization (company) by id from list_organizations: city, linked members, description |
| create_organizationC | Create a new organization (company contact) |
| update_organizationC | Set the description of an organization from Markdown |
| list_threadC | Message with its thread replies |
| reply_to_messageC | Reply in the thread of a message or comment |
| update_messageC | Edit a message or thread reply |
| delete_messageC | Delete a message or thread reply |
| add_reactionA | Add your emoji reaction to a message or comment (no-op if already there); undo: remove_reaction |
| remove_reactionB | Remove your emoji reaction |
| pin_messageA | Pin a message or comment in its channel; pinned=false unpins |
| list_notificationsC | Your inbox notifications, grouped by issue/PR/document |
| triage_inboxB | Unread items with what changed since last read: new comments, fields, status |
| mark_notifications_readA | Mark notifications read (by object, ids or all); optionally archive |
| manage_notificationsC | Inbox for one object: pin, hide, mark unread, unarchive, follow/unfollow (and the undo of each) |
| get_activityC | Change history and comments of an issue or object |
| list_todosB | List your own planner to-dos: open by default, in planner order; filter by status or due date |
| create_todoC | Create a to-do, optionally on an issue |
| update_todoC | Update a to-do or mark it done |
| delete_todoC | Delete a to-do |
| schedule_todoC | Block time for a to-do in your calendar |
| list_personsC | Contact persons with their channels |
| get_personD | Person details, channels, organizations |
| create_personC | Create a contact person |
| update_personC | Update a contact person |
| add_contact_channelC | Add email/phone/… to a person |
| remove_contact_channelC | Remove email/phone/… from a person |
| get_issue_contextC | Issue with description, sub-issues, blockers, PRs, comments, branch name |
| start_workC | Pick up issue: In Progress, assign me, return context |
| finish_workC | Hand back: summary comment, link PR, status to review |
| create_issue_treeB | Plan → epic + sub-issues with blockers; skips duplicates; dry run first |
| my_dayB | Today at a glance: calendar, to-dos, my issues, reviews, unread inbox |
| issues_from_documentB | Spec → epic + sub-issues from a document's open checklist items (else its sections); links the doc. Dry run first |
| issues_from_meetingB | Meeting notes → issues: action items with @assignee and due date; links the doc. Dry run first |
| standupC | Standup: what I did since the last working day, today, blockers |
| release_notesB | Release notes from a milestone: features, fixes, PRs, still open |
| project_reportC | Weekly report: done, new, blocked, overdue, PRs, milestones, time |
| changes_sinceC | Issues/PRs changed since a time: fields, comments, who |
| claim_issueB | Lease an issue so parallel agents skip it |
| find_project_for_repoC | Huly workspace + project linked to a GitHub repo |
| release_issueC | Release an agent claim |
| searchA | Fulltext search across all content (issues, docs, messages, cards, files …); issues only, with status: search_issues |
| list_classesB | Huly data classes (for modules without dedicated tools) |
| describe_classC | Attributes and types of a class |
| query_documentsC | Read documents of any class (secrets redacted) |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| setup | Ask how Huly should be used for a project, write the rules for your project instructions, optionally import it |
| start | Pick up an issue, load its context and propose a plan |
| finish | Post a work summary, link the PR and move the issue to review |
| plan | Epic + sub-issues from a goal or plan, with duplicate check |
| triage | Go through unread notifications and suggest actions |
| standup | What I did since the last working day, today, blockers |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| guide-workflow | Repo rules first, pick up/hand back issues, status flow, creating without duplicates |
| guide-costs | Which call answers which question with the least output (measured sizes) |
| guide-onboarding | Status set, components, milestones, TODO scan, architecture document |
| guide-features | Labels, templates, test management, documents, drive, custom fields, cards — tools and toolsets |
TDQS
Scored across 99 tools
Most tools name a distinct resource+action, and descriptions actively cross-reference siblings (e.g. "to edit: update_comment", "issues only, with status: search_issues"), which helps a lot. However several clusters overlap: list_notifications / mark_notifications_read / manage_notifications / triage_inbox, get_issue vs get_issue_context, start_work vs claim_issue, search vs search_issues, and list_comments vs get_activity all require careful reading to choose correctly.
The dominant pattern is consistent snake_case verb_noun (create_issue, update_milestone, remove_blocked_by, list_attachments) applied across every domain. A handful of outliers break it: bare 'search', noun-phrase 'my_day', 'standup', and workflow verbs like 'finish_work' and 'triage_inbox', but these remain readable and memorable.
99 tools is far beyond a practical single-server surface; even though the server spans issues, docs, chat, CRM, planner and notifications, the sheer volume forces an agent to scan an enormous list for routine actions. Consolidation (e.g. one notification tool, merged issue-read tools, fewer per-field workflow wrappers) would clearly help.
Coverage is unusually deep: issues get full CRUD plus relations, blockers, labels, components, milestones, time logs, attachments and batch/undo operations; documents, chat threads, persons and todos each have lifecycle coverage. Gaps exist mainly on the delete/replace side for channels, milestones, components, persons, organizations and projects, but agents can work around them.