MCP server for Huly integration
Valid MCP server (2 strong, 2 medium validity signals). No known CVEs in dependencies. Package registry verified. Imported from the Official MCP Registry.
4 files analyzed · 1 issue found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
Set these up before or after installing:
Environment variable: HULY_URL
Environment variable: HULY_EMAIL
Environment variable: HULY_PASSWORD
Environment variable: HULY_WORKSPACE
Environment variable: HULY_CONNECTION_TIMEOUT
Add this to your MCP configuration file:
{
"mcpServers": {
"io-github-dearlordylord-huly-mcp": {
"env": {
"HULY_URL": "your-huly-url-here",
"HULY_EMAIL": "your-huly-email-here",
"HULY_PASSWORD": "your-huly-password-here",
"HULY_WORKSPACE": "your-huly-workspace-here",
"HULY_CONNECTION_TIMEOUT": "your-huly-connection-timeout-here"
},
"args": [
"-y",
"@firfi/huly-mcp"
],
"command": "npx"
}
}
}From the project's GitHub README.
Huly MCP is a feature-complete MCP server for Huly integration. Published on npm as @firfi/huly-mcp.
The standard configuration works with most MCP clients:
{
"mcpServers": {
"huly": {
"command": "npx",
"args": ["-y", "@firfi/huly-mcp@latest"],
"env": {
"HULY_URL": "https://huly.app",
"HULY_EMAIL": "your@email.com",
"HULY_PASSWORD": "yourpassword",
"HULY_WORKSPACE": "yourworkspace"
}
}
}
}
Use Codex's MCP manager:
codex mcp add huly \
--env HULY_URL=https://huly.app \
--env HULY_EMAIL=your@email.com \
--env HULY_PASSWORD=yourpassword \
--env HULY_WORKSPACE=yourworkspace \
-- npx -y @firfi/huly-mcp@latest
Or add it directly to ~/.codex/config.toml:
[mcp_servers.huly]
command = "npx"
args = ["-y", "@firfi/huly-mcp@latest"]
[mcp_servers.huly.env]
HULY_URL = "https://huly.app"
HULY_EMAIL = "your@email.com"
HULY_PASSWORD = "yourpassword"
HULY_WORKSPACE = "yourworkspace"
claude mcp add huly \
-e HULY_URL=https://huly.app \
-e HULY_EMAIL=your@email.com \
-e HULY_PASSWORD=yourpassword \
-e HULY_WORKSPACE=yourworkspace \
-- npx -y @firfi/huly-mcp@latest
Or add to ~/.claude.json using the standard config above.
Add the standard config to your claude_desktop_config.json:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.jsonAdd with Command Palette → "MCP: Add Server", or put this in a VS Code MCP config such as .vscode/mcp.json. Do not commit workspace config files that contain real credentials.
{
"servers": {
"huly": {
"command": "npx",
"args": ["-y", "@firfi/huly-mcp@latest"],
"env": {
"HULY_URL": "https://huly.app",
"HULY_EMAIL": "your@email.com",
"HULY_PASSWORD": "yourpassword",
"HULY_WORKSPACE": "yourworkspace"
}
}
}
}
Add the standard config to ~/.cursor/mcp.json, or via Settings → Tools & Integrations → New MCP Server.
Add the standard config to your Windsurf MCP configuration file.
Open the global configuration file (~/.config/opencode/opencode.json) and merge this entry into your config:
{
"mcp": {
"huly": {
"type": "local",
"command": ["npx", "-y", "@firfi/huly-mcp@latest"],
"environment": {
"HULY_URL": "https://huly.app",
"HULY_EMAIL": "your@email.com",
"HULY_PASSWORD": "yourpassword",
"HULY_WORKSPACE": "yourworkspace"
}
}
}
}
The @latest tag asks the package runner for the newest version. Some MCP clients keep server processes or resolved installs alive, so restart or re-add the server when updating:
| Client | How to update |
|---|---|
| Codex | codex mcp remove huly then re-add with the install command above. If your password has shell-sensitive characters, edit ~/.codex/config.toml directly instead |
| Claude Code | claude mcp remove huly then re-add with the install command above |
| Claude Desktop | Restart the app (it runs npx on startup) |
| VS Code / Cursor | Restart the MCP server from the command palette/configured client or reload the window |
| OpenCode | Restart OpenCode or start a new session after config changes |
| npx (manual) | npx -y @firfi/huly-mcp@latest — the -y flag auto-confirms install prompts |
By default, the server uses stdio transport. For HTTP transport (Streamable HTTP):
HULY_URL=https://huly.app \
HULY_EMAIL=your@email.com \
HULY_PASSWORD=yourpassword \
HULY_WORKSPACE=yourworkspace \
MCP_TRANSPORT=http \
npx -y @firfi/huly-mcp@latest
Server listens on http://127.0.0.1:3000/mcp by default.
Configure with MCP_HTTP_PORT and MCP_HTTP_HOST:
MCP_TRANSPORT=http MCP_HTTP_PORT=8080 MCP_HTTP_HOST=0.0.0.0 npx -y @firfi/huly-mcp@latest
The HTTP server supports both the existing SDK initialize-compatible Streamable HTTP flow and the 2026 stateless HTTP flow at the same /mcp endpoint. Dispatch is per request:
MCP-Protocol-Version: 2026-07-28, matching _meta.io.modelcontextprotocol/protocolVersion, or server/discover use the 2026 stateless dispatcher.The 2026 path requires one JSON-RPC message per POST, Accept: application/json, text/event-stream, Mcp-Method, method-specific Mcp-Name, and per-request _meta.io.modelcontextprotocol/* client metadata. Huly credentials are still configured separately through env vars or supported x-huly-* headers.
For hosted or tunneled HTTP deployments, you can require an MCP endpoint bearer token:
MCP_TRANSPORT=http \
MCP_AUTH_TOKEN="$(openssl rand -hex 32)" \
npx -y @firfi/huly-mcp@latest
HTTP clients must then send:
Authorization: Bearer <MCP_AUTH_TOKEN>
MCP_AUTH_TOKEN protects only the MCP HTTP /mcp endpoint. It is unrelated to HULY_TOKEN, does not authenticate to Huly, and does not replace HULY_EMAIL / HULY_PASSWORD / HULY_TOKEN. Huly credentials are still required through process env vars or, for hosted URL deployments, the supported x-huly-* headers. Stdio deployments do not use MCP_AUTH_TOKEN.
For hosted URL deployments, keep the server process configured with MCP_TRANSPORT=http. A hosting layer can forward per-session Huly credentials as request headers, so one hosted server can serve different Huly workspaces without process-wide HULY_* env vars.
Supported v1 headers:
| Header | Required | Description |
|---|---|---|
x-huly-url | Yes | Huly instance URL |
x-huly-workspace | Yes | Workspace identifier |
x-huly-token | Yes | Huly API token |
x-huly-connection-timeout | No | Connection timeout in ms |
If any x-huly-* header is present, all required headers must be present. Missing values are not filled from environment variables. Email/password auth is not supported in hosted header configuration v1.
For a Smithery publish schema example, see docs/SMITHERY_URL_PUBLISH.md.
| Variable | Required | Description |
|---|---|---|
HULY_URL | Yes | Huly instance URL |
HULY_EMAIL | Auth* | Account email |
HULY_PASSWORD | Auth* | Account password |
HULY_TOKEN | Auth* | API token (alternative to email/password) |
HULY_WORKSPACE | Yes | Workspace identifier |
HULY_CONNECTION_TIMEOUT | No | Connection timeout in ms. Omit to use the package default. |
MCP_TRANSPORT | No | Transport type: stdio (default) or http |
MCP_HTTP_PORT | No | HTTP server port (falls back to PORT, then 3000) |
MCP_HTTP_HOST | No | HTTP server host. Omit to bind to the package default loopback host. |
MCP_AUTH_TOKEN | No | Optional bearer token required by HTTP clients for /mcp. This protects the MCP endpoint only; it is not a Huly API token. |
TOOLSETS | No | Comma-separated tool categories to expose. If unset, all tools are exposed. Example: issues,projects,search |
*Auth: Provide either HULY_EMAIL + HULY_PASSWORD or HULY_TOKEN.
get_version returns the current server version and latest npm version.
get_huly_context returns sanitized runtime/configuration context for the current MCP session without connecting to Huly. It reports package version, transport, auth mode, sanitized Huly URL origin/host/protocol, workspace, timeout, config sources, and toolset filtering. Tokens, passwords, email values, credential headers, URL paths, URL query strings, and URL credentials are never returned.
The server exposes read-only MCP Resources as JSON context for clients that support resources/read.
| Template | Name | Description | MIME Type |
|---|---|---|---|
huly://projects/{project} | huly-project | Read full details for a Huly tracker project by project identifier, for example huly://projects/HULY. | application/json |
huly://issues/{issue} | huly-issue | Read full details for a Huly issue by full issue identifier, for example huly://issues/HULY-123. | application/json |
huly://projects/{project}/issues/{issue} | huly-project-issue | Read full details for a Huly issue by project identifier and issue number, for example huly://projects/HULY/issues/123. | application/json |
resources/list returns concrete active project resources. Issue resources are template-based: use resources/templates/list to discover supported issue URI templates, then read a known issue URI.
The roadmap is driven by SDK parity and the project principle that this server should expose LLM-first tools: clear names, self-contained parameters, automatic identifier resolution, and single-call correctness. The audited source of truth lives in plans/huly-sdk-gap-matrix.md, with machine-checkable classifications in plans/sdk-parity-ledger.json.
Highest-value additions for coding agents:
Planned feature surfaces:
spaces tools for listing/getting spaces, listing/getting space types, reading permissions, updating common metadata, adding/removing members, and replacing owners.@hcengineering/rating SDK package (#90); support conversations, billing tier/status discovery, onboarding channels, saved filtered views, user view preferences, tabs/widgets/apps, and module preference discovery/update remain future surfaces.MCP resource roadmap:
resources/read follow-up.resources/list responses.subscribe and listChanged support after stateful sessions and a Huly change source are available.SDK upgrade revisit:
@hcengineering/* upgrades when a newer release is available after 0.7.423.package.json; do not accept lockfile-only transitive rewrites.pnpm check-all and local Huly integration tests before treating an SDK upgrade as viable.TOOLSETS categories: projects, issues, comments, milestones, documents, storage, attachments, contacts, channels, calendar, time tracking, search, associations, activity, notifications, workspace, boards, cards, collaborators, custom-fields, drive, inventory, labels, leads, templates, planner, processes, recruiting, sdk-discovery, spaces, tag-categories, tags, task-management, test-management, user-statuses, virtual-office
| Tool | Description |
|---|---|
list_project_target_preferences | List low-level per-project tracker target preference records. These Huly ProjectTargetPreference records are attached to projects and used by tracker UI/workflows to remember target-related preference props. Omit project to list recent preferences across projects, or pass a project identifier to inspect one project's preference. Props are SDK-open key/value payloads. |
upsert_project_target_preference | Create or update the low-level ProjectTargetPreference record for a project. This refreshes usedOn and merges SDK-open target preference props by key. Use for tracker SDK parity or advanced administration; ordinary project and issue workflows usually do not need this tool. |
list_projects | List all Huly projects. Returns projects sorted by name. Supports filtering by archived status. |
get_project | Get full details of a Huly project including its statuses. Returns project name, description, archived flag, default status, and all available statuses. |
list_statuses | List all issue statuses for a Huly project with workflow category and default info. Returns status name, category, and isDefault. Use this to discover valid statuses before creating or updating issues. |
create_project | Create a new Huly tracker project. Idempotent: returns existing project if one with the same identifier already exists (created=false). Identifier must be 1-5 uppercase alphanumeric chars starting with a letter. |
update_project | Update a Huly project. Only provided fields are modified. Set description to null to clear it. |
delete_project | Permanently delete a Huly project. All issues, milestones, and components in this project will be orphaned. This action cannot be undone. |
| Tool | Description |
|---|---|
preview_deletion | Preview the impact of deleting a Huly entity before actually deleting it. Shows affected sub-entities, relations, and warnings. Supports issues, projects, components, and milestones. Use this to understand cascade effects before calling a delete operation. |
list_issues | Query Huly issues with optional filters. Returns issues sorted by modification date (newest first). Supports filtering by project, exact workflow status name (status), Huly SDK task.statusCategory key (statusCategory: UnStarted, ToDo, Active, Won, Lost), assignee, component, and parentIssue (to list children of a specific issue). Supports searching by title substring (titleSearch) and description content (descriptionSearch). |
get_issue | Retrieve full details for a Huly issue including markdown description. Use this to view issue content, comments, or full metadata. |
create_issue | Create a new issue in a Huly project. Optionally set taskType by ID or display name; it is resolved within the target project's project type, and status is validated against that task type's workflow. Use list_task_types or get_project_type to discover valid task types and statuses. Optionally create as a sub-issue by specifying parentIssue. Description supports markdown formatting. Returns the created issue identifier. |
update_issue | Update fields on an existing Huly issue. Optionally set taskType by ID or display name; it is resolved within the target project's project type, and the status is preserved only when valid for the new task type. Use list_task_types or get_project_type to discover valid task types and statuses. Only provided fields are modified. Description updates support markdown. |
add_issue_label | Add a tag/label to a Huly issue. Creates the tag if it doesn't exist in the project. |
remove_issue_label | Remove a tag/label from a Huly issue. Detaches the label reference; does not delete the label definition. |
delete_issue | Permanently delete a Huly issue. This action cannot be undone. |
move_issue | Move an issue to a new parent (making it a sub-issue) or to top-level (null). Updates parent/child relationships and sub-issue counts. |
list_components | List components in a Huly project. Components organize issues by area/feature. Returns components sorted by modification date (newest first). |
get_component | Retrieve full details for a Huly component. Use this to view component content and metadata. |
create_component | Create a new component in a Huly project. Components help organize issues by area/feature. Returns the created component ID and label. |
update_component | Update fields on an existing Huly component. Only provided fields are modified. |
set_issue_component | Set or clear the component on a Huly issue. Pass null for component to clear it. |
delete_component | Permanently delete a Huly component. This action cannot be undone. |
list_issue_templates | List issue templates in a Huly project. Templates define reusable issue configurations. Returns templates sorted by modification date (newest first). |
get_issue_template | Retrieve full details for a Huly issue template including children (sub-task templates). Use this to view template content, default values, and child template IDs. |
create_issue_template | Create a new issue template in a Huly project. Templates define default values for new issues. Optionally include children (sub-task templates) that will become sub-issues when creating issues from this template. Returns the created template ID and title. |
create_issue_from_template | Create a new issue from a template. Applies template defaults, allowing overrides for specific fields. If the template has children (sub-task templates), sub-issues are created automatically unless includeChildren is set to false. Returns the created issue identifier and count of children created. |
update_issue_template | Update fields on an existing Huly issue template. Only provided fields are modified. |
delete_issue_template | Permanently delete a Huly issue template. This action cannot be undone. |
add_template_child | Add a child (sub-task) template to an issue template. The child defines default values for sub-issues created when using create_issue_from_template. Returns the child template ID. |
remove_template_child | Remove a child (sub-task) template from an issue template by its child ID. Get child IDs from get_issue_template response. |
add_issue_relation | Add a relation between two issues. Relation types: 'blocks' (source blocks target — pushes into target's blockedBy), 'is-blocked-by' (source is blocked by target — pushes into source's blockedBy), 'relates-to' (bidirectional link — updates both sides). targetIssue accepts cross-project identifiers like 'OTHER-42'. No-op if the relation already exists. |
remove_issue_relation | Remove a relation between two issues. Mirrors add_issue_relation: 'blocks' pulls from target's blockedBy, 'is-blocked-by' pulls from source's blockedBy, 'relates-to' pulls from both sides. No-op if the relation doesn't exist. |
list_issue_relations | List all relations of an issue. Returns blockedBy (issues blocking this one), blocks (issues this one blocks), relations (bidirectional issue links), and documents (linked documents with title/teamspace). |
link_document_to_issue | Link a Huly document to an issue. The link appears in the issue's Relations panel in the UI. Idempotent: no-op if the document is already linked. Use list_issue_relations to see linked documents. |
unlink_document_from_issue | Remove a document link from an issue. Idempotent: no-op if the document is not linked. |
list_related_issue_targets | List rules that choose the default destination project for related issues. A spaceRule says related issues from one space default to targetProject. A classRule says related issues for one object class default to targetProject. targetProject is a project identifier, or null for no default destination project. |
set_related_issue_target | Set the default destination project for related issues from a space or object class. For space, creates or updates a spaceRule. For objectClass, only updates an existing classRule; this tool never creates classRule targets. Pass targetProject as a project identifier, or null to clear the default destination project. |
delete_related_issue_space_target | Delete the spaceRule that chooses the default destination project for related issues from one space. This only deletes spaceRule targets; classRule deletion is intentionally unsupported because class rules may be model-provided. |
| Tool | Description |
|---|---|
list_comments | List comments on a Huly issue. Returns comments sorted by creation date (oldest first). |
add_comment | Add a comment to a Huly issue. Comment body supports markdown formatting. |
update_comment | Update an existing comment on a Huly issue. Comment body supports markdown formatting. |
delete_comment | Delete a comment from a Huly issue. This action cannot be undone. |
| Tool | Description |
|---|---|
list_milestones | List milestones in a Huly project. Returns milestones sorted by modification date (newest first). |
get_milestone | Retrieve full details for a Huly milestone. Use this to view milestone content and metadata. |
create_milestone | Create a new milestone in a Huly project. Returns the created milestone ID and label. |
update_milestone | Update fields on an existing Huly milestone. Only provided fields are modified. |
set_issue_milestone | Set or clear the milestone on a Huly issue. Pass null for milestone to clear it. |
delete_milestone | Permanently delete a Huly milestone. This action cannot be undone. |
| Tool | Description |
|---|---|
list_document_snapshots | List version-history snapshots for one Huly document. A snapshot is a saved point-in-time copy from the document's change history. Resolve the document by teamspace plus document title or ID. Returns snapshotId, documentId, teamspaceId, title, parentDocumentId, and timestamps; markdown content is intentionally omitted. Use get_document_snapshot with snapshotId when reading content. |
get_document_snapshot | Get one point-in-time Huly document history snapshot and return markdown content. Resolve the document by teamspace plus document title or ID; resolve the snapshot by snapshotId, exact snapshot title, or exact createdOn timestamp. Prefer snapshotId from list_document_snapshots when titles or dates may collide. Restore is out of scope. |
list_teamspaces | List all Huly document teamspaces. Returns teamspaces sorted by name. Supports filtering by archived status. |
get_teamspace | Get details for a Huly document teamspace including document count. Finds by name or ID, including archived teamspaces. |
create_teamspace | Create a new Huly document teamspace. Idempotent: returns existing teamspace if one with the same name exists. |
update_teamspace | Update fields on an existing Huly document teamspace. Only provided fields are modified. Set description to null to clear it. |
delete_teamspace | Permanently delete a Huly document teamspace. This action cannot be undone. |
list_documents | List documents in a Huly teamspace. Returns documents sorted by modification date (newest first). Each result includes a 'url' field pointing to the document in the Huly web app. Supports searching by title substring (titleSearch) and content (contentSearch). |
get_document | Retrieve full details for a Huly document including markdown content and a 'url' field pointing to the document in the Huly web app. Use this to view document content and metadata. |
create_document | Create a new document in a Huly teamspace. Content is markdown and supports native Mermaid diagrams (```mermaid blocks render interactively in Huly UI). Use markdown links to current-workspace Huly browse URLs for native references; Huly browse links returned in get_document content round-trip as native references. The URL identifies the object; link text is display text; plain issue keys stay text. External URLs stay normal markdown links. Optionally pass parent as a document title or ID to create a nested child document; invalid parents fail instead of silently creating a top-level document. Returns the created document id and a 'url' field pointing to the document in the Huly web app. Use link_document_to_issue only if you also want an issue-document association. |
edit_document | Edit an existing Huly document. You may rename with title and/or edit the body. Body editing has two mutually exclusive modes: (1) content replaces the entire markdown body, (2) old_text + new_text performs exact targeted search-and-replace. Use markdown links to current-workspace Huly browse URLs for native references; Huly browse links returned in get_document content round-trip as native references. The URL identifies the object; link text is display text; plain issue keys stay text. External URLs stay normal markdown links. For targeted replace, multiple matches error unless replace_all is true; empty new_text deletes matched text. Content supports native Mermaid diagrams. Returns a 'url' field pointing to the document in the Huly web app. |
list_inline_comments | List inline comment threads from a Huly document. Extracts comments embedded in document content as ProseMirror marks. Each comment includes the highlighted text and thread ID. Set includeReplies=true to also fetch thread reply messages with sender names. |
delete_document | Permanently delete a Huly document. This action cannot be undone. |
| Tool | Description |
|---|---|
upload_file | Upload a file to Huly storage. Provide ONE of: filePath (local file - preferred), fileUrl (fetch from URL), or data (base64 - for small files only). Returns blob ID and URL for referencing the file. |
| Tool | Description |
|---|---|
list_attachments | List attachments on a Huly object (issue, document, etc.). Returns attachments sorted by modification date (newest first). |
get_attachment | Retrieve full details for a Huly attachment including download URL. |
add_attachment | Add an attachment to a Huly object. Provide ONE of: filePath (local file - preferred), fileUrl (fetch from URL), or data (base64). Returns the attachment ID and download URL. |
update_attachment | Update attachment metadata (description, pinned status). |
delete_attachment | Permanently delete an attachment. This action cannot be undone. |
pin_attachment | Pin or unpin an attachment. |
download_attachment | Get download URL for an attachment along with file metadata (name, type, size). |
add_issue_attachment | Add an attachment to a Huly issue. Convenience method that finds the issue by project and identifier. Provide ONE of: filePath, fileUrl, or data. |
add_document_attachment | Add an attachment to a Huly document. Convenience method that finds the document by teamspace and title/ID. Provide ONE of: filePath, fileUrl, or data. |
save_attachment | Save/bookmark an attachment for later reference. Idempotent when already saved. |
unsave_attachment | Remove an attachment from saved/bookmarks. |
list_saved_attachments | List saved/bookmarked attachments for the current user. |
list_drawings | List drawings attached to a raw Huly parent object. |
get_drawing | Get a drawing by ID. |
create_drawing | Create a drawing under a raw Huly parent object. |
update_drawing | Update drawing content. Pass null content to clear it. |
delete_drawing | Delete a drawing. This action cannot be undone. |
Documentation truncated — see the full README on GitHub.
Be the first to review this server!
by Modelcontextprotocol · Developer Tools
Web content fetching and conversion for efficient LLM usage
by Toleno · Developer Tools
Toleno Network MCP Server — Manage your Toleno mining account with Claude AI using natural language.
by mcp-marketplace · Developer Tools
Create, build, and publish Python MCP servers to PyPI — conversationally.