Atlas / MCP servers / dearlordylord / Huly

HulyBLOCK

mcp/dearlordylord/huly

Huly MCP and CLI: Feature-complete MCP server and CLI for Huly platform. Intabia partially compatible.

Verdict
BLOCK
Grade
D
Trust score
68 /100
Exposed tools
200 291r · 193w · 94d
Transport
stdio · streamable-http
License
MIT
Stars
58
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

[](https://www.npmjs.com/package/@firfi/huly-mcp) [](https://www.npmjs.com/package/@firfi/huly-mcp) [](https://opensource.org/licenses/MIT) [](https://modelcontextprotocol.io) [](https://www.typescriptlang.org/) [](https://glama.ai/mcp/servers/@dearlordylord/huly-mcp) [](https://github.com/dearlordylord/huly-mcp)[](https://monadical.com)

Huly MCP is a feature-complete MCP server for Huly integration. Published on npm as `@firfi/huly-mcp`.

It connects to Huly Platform deployments and should also work with the Platform Collective and TraceX forks. Intabia 0.8.33 / model 0.8.4 has been compatibility-tested; known gaps are tracked in issue #279. Fork support remains unofficial.

Huly CLI Alternative

Looking for a Huly CLI, terminal-native Huly integration, or a scripting and automation alternative to running an MCP server? Huly CLI is a feature-complete command-line interface for Huly, published as `@firfi/huly-cli`, with full Huly operation parity with Huly MCP. It exposes the same Huly operations as native, schema-aware commands with human-readable or JSON output, fi

Read from source at commit 5af1ccc36dd3OBSERVED · 2026-10-08
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code (npm)
claude mcp add huly-mcp --env HULY_PASSWORD=${HULY_PASSWORD} -- npx -y @firfi/[email protected]
03

Exposed tools (200)

291 read · 193 write · 94 destructive. Blast radius: 94 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
ApprovalreadApproval workflow
CardsreadCard space
DocsreadDrive docs
Emptyread
Engineeringread
ExperiencereadUpdated
GeneralreadDefault space
HulyreadMain project
Knowledgeread
MyTeamspaceread
Operationsread
Projectread
RenamedreadUpdated
Roadmapread
SalesreadSummary
Sharedread
TESTreadProject used by Effect AI registry tests
Testread
add_activity_replywriteAdd a Markdown reply to any activity message.
add_approval_request_commentwriteAdd a plain markdown comment to an approval Request by request _id.
add_attachmentwriteAdd an attachment to a Huly object. Provide one source: ${UPLOAD_SOURCE_SEMANTICS} Returns the attachment ID and download URL.
add_board_card_labelwriteAttach a board label to a board card. If label is a new title, creates the board-card label definition first; repeated calls are idempotent.
add_card_commentwriteAdd a markdown comment to one Huly card, resolving the card space by exact name or ID and the card by exact title or ID.
add_channel_memberswriteIdempotently add members to a non-archived Huly channel. Members accept account UUID, exact email, or exact person display name and resolve to Huly account UUIDs before replacing the full sorted member array.
add_chat_message_attachmentwriteAttach a file directly to a Huly channel message, direct-message message, or thread reply. Provide filename, contentType, and exactly one source: ${UPLOAD_SOURCE_SEMANTICS}
add_commentwriteAdd a comment to a Huly issue. Comment body supports markdown formatting.
add_document_attachmentwriteAdd an attachment to a Huly document resolved by teamspace and title/ID. Provide one source: ${UPLOAD_SOURCE_SEMANTICS}
add_document_labelwriteIdempotently attach a label to an ordinary Huly document resolved by teamspace and title or ID. label accepts a definition ID or exact title; a missing title creates the document label definition first, while duplicate exact titles return candidate IDs.
add_drive_file_commentwriteAdd a Markdown comment to a Drive file resolved by filePath or fileId. Provide only one locator. The comment is attached directly to the file.
add_drive_memberswriteIdempotently add members to an existing Drive. Members accept account UUIDs, exact emails, or exact person names and resolve to Huly account UUIDs before replacing the Drive member list.
add_hr_request_attachmentwriteAttach a file to an exact HR request. Provide filename, contentType, and exactly one of filePath, fileUrl, or base64 data.
add_hr_request_commentwriteAdd a Markdown comment directly to an exact HR request ID.
add_inventory_product_attachmentwriteAdd a file to an inventory product resolved by product ID or exact name. Provide exactly one source: ${UPLOAD_SOURCE_SEMANTICS}
add_inventory_product_commentwriteAdd a Markdown comment directly to an inventory product resolved by product ID or exact name. Pass category to disambiguate duplicate names.
add_inventory_product_photowriteAdd a photo to an inventory product using Huly
add_issue_attachmentwriteAdd an attachment to a Huly issue resolved by project and identifier. Provide one source: ${UPLOAD_SOURCE_SEMANTICS}
add_issue_labelwriteAdd a tag/label to a Huly issue. Creates the tag if it doesn
add_issue_relationwriteAdd a relation between two issues. Relation types:
add_lead_attachmentwriteUpload a local path, URL, or base64 payload and attach the native file reference to one exact lead.
add_lead_commentwriteAdd a Markdown comment to one exact lead. Current-workspace Huly links are stored as native references.
add_lead_labelwriteIdempotently attach a label relation to one exact lead. Accepts a definition ID or exact title; a missing title creates the Lead label definition.
add_object_collaboratorwriteSubscribe a workspace member to object notifications by adding a core collaborator row. Member can be an account UUID, exact employee/person name, or email. Idempotent when already subscribed.
add_organization_memberwriteLink a person as a member of an organization. The person appears under the org
add_person_attachmentwriteUpload and attach a file to one person from exactly one of filePath, fileUrl, or base64 data; ${EXACT_PERSON}
add_person_channelwriteIdempotently add a contact channel to a person. Person accepts person ID, exact email address, or exact Huly display name. Provider labels match list_contact_channel_providers. Returns added=false and the existing channel when the exact provider+value already exists.
add_person_commentwriteAdd a markdown note/comment to one person; ${EXACT_PERSON} ${HULY_NATIVE_REFERENCE_MARKDOWN_INPUT}
add_reactionwriteAdd an emoji reaction to an activity message.
add_recruiting_attachmentwriteAttach a file to a Recruiting vacancy, candidate, applicant, or opinion target. Provide filename, contentType, and exactly one source: ${UPLOAD_SOURCE_SEMANTICS}
add_recruiting_candidate_skillwriteAttach a skill to a candidate. candidate accepts person _id, email, or exact name. skill accepts title or tag ID; missing skill titles are created. Optional category/color apply only to newly created skill tags.
add_recruiting_commentwriteAdd a Markdown comment directly to a Recruiting vacancy, candidate, applicant, review, or opinion target resolved by the shared target locator.
add_recruiting_related_issuewriteIdempotently add a Huly Related Issues entry (
add_space_memberswriteIdempotently add members to an existing Huly space. Members accept account UUID, exact email, or exact person display name and resolve to Huly account UUIDs before replacing the full members array.
add_space_role_memberswriteIdempotently add members to one role on a typed Huly space while preserving all other role assignments. Role accepts a raw role _id or exact role name from the space
add_template_childwriteAdd a child (sub-task) template to an issue template. The child defines default values for sub-issues created when using create_issue_from_template. Child description supports markdown.
add_test_plan_itemwriteAdd a test case to a test plan. Resolves test case by ID or name. Optionally assign a person by email or name.
add_thread_replywriteAdd a reply to a message thread. Reply body supports markdown formatting.
add_todo_labelwriteIdempotently attach a label to a Planner ToDo resolved by raw ID or human locator. label accepts a definition ID or exact title; a missing title creates the ToDo label definition first, while duplicate exact titles return candidate IDs.
approve_approval_requestreadApprove an active approval Request as the current Huly user. The current user
archive_all_notificationsreadArchive all notifications. Returns the count of notifications archived.
archive_boardreadArchive a Huly board by board _id or exact board name. This hides the board but does not delete cards.
archive_board_cardreadArchive a board card. card accepts _id, CARD-123, bare number, or exact title scoped to the board.
archive_channelreadArchive a Huly channel by channel name or ID. This is reversible with unarchive_channel and is idempotent when the channel is already archived.
archive_funnelreadArchive a funnel without deleting it. Returns lead/comment/attachment impact so the caller can assess the hidden native content. Already archived funnels are an idempotent no-op.
archive_notificationreadArchive a notification. Archived notifications are hidden from the main inbox view. Idempotent when already archived.
archive_notification_contextreadArchive all inbox notifications in a notification context. Idempotent: returns count 0 when no active notifications remain.
archive_recruiting_vacancyreadArchive a Recruiting vacancy by raw _id, VCN-<number>, bare number, or exact name.
assign_staff_departmentreadAssign an exact employee ID/email/display name by writing only authoritative Staff.department. Use department=null to clear. Department.members hierarchy propagation is performed asynchronously by Huly
attach_tagreadAttach a generic Huly tag to one raw object collection. Prefer module tools for supported issue, document, Planner, board, and recruiting objects; this SDK fallback requires targetClass plus objectId/objectClass/space/collection and is idempotent for the same object, collection, and tag.
cancel_approval_requestreadCancel an active approval Request created by the current Huly user. This is the safe removal-from-workflow operation; hard delete is intentionally not exposed.
cancel_executionreadIdempotently cancel one Huly Process execution by execution ID. Active executions are marked cancelled; already-cancelled executions succeed with cancelled=false; completed executions fail without changing history.
cat-unnamedreadtemplates
combined_toolreadcombined tool
complete_todoreadComplete a Planner ToDo by raw todoId or human locator, including a document attachment locator, by setting doneOn. Huly may trim future work slots and run issue automation when the ToDo is attached to an issue.
create_access_linkwriteCreate a Huly workspace access link. When role is omitted, role=${DEFAULT_ACCESS_LINK_ROLE}. Supports anonymous reusable guest links by setting personalized=false with notBefore and expiration, and can restrict access to specific Huly space IDs via spaces.
create_associationwriteIdempotently create one Huly association definition between two non-system classes. Use sourceClass/targetClass with sourceRole/targetRole and cardinality; returns an existing identical association by default.
create_boardwriteCreate a Huly board. Idempotent by exact active board name; pass projectType by _id or exact name only when the default board project type is ambiguous.
create_board_cardwriteCreate a board card with safe defaults. Resolves kind/status from the board project type, increments the CARD-number sequence, and stores markdown description as inline Huly Markup.
create_board_labelwriteCreate a board label definition for board cards. Idempotent by exact title when one label matches; uses board.category.Other when no default category exists.
create_cardwriteCreate a new card in a Huly card space. Requires a master tag (card type). Content supports markdown formatting.
create_channelwriteCreate a new channel in Huly. Returns the created channel ID and name.
create_componentwriteCreate a new component in a Huly project. Components help organize issues by area/feature. Description supports markdown.
create_departmentwriteCreate a top-level or nested HR department. Parent and people use exact paths/IDs/names/emails and reject ambiguity. Names cannot contain
create_direct_messagewriteOpen a one-to-one direct-message conversation with a workspace member. The
create_documentwriteCreate a new document in a Huly teamspace. Content is markdown and supports native Mermaid diagrams (
create_drawingwriteCreate a drawing under a raw Huly parent object.
create_drivewriteIdempotently create a Huly Drive space. If an active Drive with the same exact name already exists, returns it with created=false. Initial members and owners accept account UUIDs, exact emails, or exact person names; omitted lists default to the caller.
create_drive_folderwriteIdempotently create a Drive folder path, creating missing parents like mkdir -p. Returns created=false when the full folder path already exists.
create_eventwriteCreate a new calendar event. Description supports markdown formatting.
create_group_direct_messagewriteOpen a group direct-message conversation with at least two other workspace members. The
create_hr_requestwriteCreate an employee-attached HR request using exact employee, department, and request-type resolution. Dates are inclusive calendar dates in YYYY-MM-DD form and descriptions accept Markdown with native Huly references.
create_huly_enumwriteCreate a Huly model enum with ordered option values. An exact case-insensitive name is idempotent only when its ordered values match; otherwise the call returns a conflict. ${MODEL_WRITE_GUARD}
create_huly_permissiondestructiveCreate a base Huly Permission with a clear human label and optional class/transaction constraints. Class accepts an exact class ID, tail name, or label. Exact labels are idempotent only when the full definition matches. ${SECURITY_WRITE_GUARD}
create_huly_sequencewriteCreate a zero-valued standard Sequence or prefixed CustomSequence for a class resolved by exact ID, tail name, or label. Retrying returns the matching existing definition and never resets or increments its counter; a different kind or prefix returns a conflict. ${SEQUENCE_WRITE_GUARD}
create_inventory_categorywriteCreate an inventory category. Defaults parentCategory to the Inventory root. Rejects duplicate category names under the same parent.
create_inventory_productwriteCreate an inventory product in a category resolved by ID or exact name. Rejects duplicate product names in the same category.
create_inventory_variantwriteCreate an inventory variant/SKU under a product resolved by ID or exact name. Rejects duplicate variant names or SKUs in the same product.
create_issue_from_templatewriteCreate a new issue from a template. Applies template defaults, allowing overrides for specific fields. Description override supports markdown.
create_issue_templatewriteCreate a new issue template in a Huly project. Templates define default values for new issues. Template and child descriptions support markdown.
create_labelwriteCreate a new label/tag definition in the workspace. Labels are global and can be attached to any issue. Returns existing label if one with the same title already exists (created=false). Use add_issue_label to attach a label to a specific issue.
create_milestonewriteCreate a new milestone in a Huly project. Description supports markdown.
create_office_floorwriteCreate one durable virtual-office Floor with a nonblank name. Returns the generated floorId immediately. Floor rename and deletion are intentionally unavailable.
create_office_roomwriteCreate one durable video, audio, reception, or personal office on a Floor resolved from an exact ID or unambiguous exact name. Video/audio/reception require a nonblank name; office uses Huly
create_organizationwriteCreate a new organization in Huly. Optionally add members by person ID or email. Fails if any requested member cannot be resolved. Returns the created organization ID.
create_personwriteCreate a new person in Huly. Returns the created person ID.
create_projectwriteCreate 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.
create_public_holidaywriteCreate one public holiday for an exact department ID or full path. The date is a timezone-independent Gregorian calendar day stored as Huly TzDate with UTC offset 0; duplicate department/date pairs are rejected.
create_recruiting_applicantwriteCreate an applicant linking one vacancy and candidate. Rejects duplicate vacancy/candidate pairs, increments APP sequence, resolves status from that vacancy workflow, and recruit-enables the person if needed.
create_recruiting_opinionwriteCreate a Recruiting opinion on one review. Increments the OPE sequence, attaches to the review opinions collection, and stores markdown description as Huly markup.
create_recruiting_reviewwriteCreate a Recruiting review/interview like the Huly UI: increments RVE sequence, attaches to the candidate reviews collection, stores markdown description as Huly markup, defaults dueDate to 30 minutes after date, and recruit-enables the person if needed.
create_recruiting_vacancywriteCreate a Recruiting vacancy like the Huly UI: increments the vacancy sequence, stores fullDescription as markdown-backed collaborative markup, defaults members/owners to the current account, and creates vacancy type-data mixin {}.
create_recurring_eventwriteCreate a new recurring calendar event with RFC5545 RRULE rules. Description supports markdown.
create_status_categorywriteCreate a generic Huly StatusCategory for an attribute resolved by ID or exact name. defaultStatus is resolved within the same attribute, preserving the category/default relationship. Idempotently returns an existing normalized label with created=false.
create_tagwriteCreate a generic Huly tag definition for one targetClass. Idempotent by targetClass + title. Prefer module label or skill tools when attaching to a supported object; use this raw fallback for definition administration and unsupported tag-backed domains.
create_tag_categorywriteCreate a new tag/label category. Idempotent: returns existing category if one with the same label and targetClass already exists (created=false). Defaults targetClass to tracker issues.
create_task_typewriteAdd a Huly issue/task type to a project type idempotently by normalized name. Copies required workflow configuration from an existing template task type unless templateTaskType is supplied. Returns created, IDs, affected task type IDs, and a workspace-level workflow warning.
create_teamspacewriteCreate a new Huly document teamspace. Idempotent: returns existing teamspace if one with the same name exists.
create_test_casewriteCreate a test case attached to a suite. Description supports markdown.
create_test_planwriteCreate a test plan in a project. Description supports markdown.
create_test_resultwriteCreate a test result in a run. Resolves test case by ID or name. Status defaults to
create_test_runwriteCreate a test run in a project. Description supports markdown.
create_test_suitewriteCreate a test suite in a test project. Idempotent: returns existing suite if one with the same name exists (created=false). Optional parent for nesting.
create_workspacewriteCreate a new Huly workspace. Returns the workspace UUID and URL. Optionally specify a region.
delayed_large_responsereadReturn a large response after the certification harness releases the operation.
delete_activity_replydestructiveDelete a generic activity reply.
delete_associationdestructiveIdempotently delete one Huly association definition only when no concrete relations reference it. If relations exist, delete_relation must clean them up first; deleting an already-missing association is a successful no-op.
delete_attachmentdestructivePermanently delete an attachment. This action cannot be undone.
delete_board_carddestructivePermanently delete an already archived board card using Huly removeCollection. Active cards are rejected; call archive_board_card first.
delete_board_labeldestructiveDelete one board label definition by TagElement _id or exact title. This removes the label definition, not a board card.
delete_carddestructivePermanently delete a Huly card. This action cannot be undone.
delete_card_commentdestructivePermanently delete one comment that belongs to the resolved Huly card. Resolves the card space by exact name or ID and the card by exact title or ID. This action cannot be undone.
delete_channeldestructivePermanently delete a Huly channel. This action cannot be undone. For reversible channel lifecycle changes, use archive_channel and unarchive_channel instead.
delete_channel_messagedestructivePermanently delete a channel message. This action cannot be undone.
delete_chat_message_attachmentdestructiveDelete one file attached directly to a Huly channel message, direct-message message, or thread reply. The attachmentId must belong to the resolved target.
delete_class_collaborator_metadatadestructivePermanently delete the direct core ClassCollaborators metadata record for a class resolved by ID, tail name, or label. Inherited metadata is never selected or deleted. ${SECURITY_WRITE_GUARD}
delete_commentdestructiveDelete a comment from a Huly issue. This action cannot be undone.
delete_componentdestructivePermanently delete a Huly component. This action cannot be undone.
delete_departmentdestructivePreview destructive impact by default. Execution requires execute=true plus exact previewed descendant and assigned-Staff counts; Huly then cascades descendant deletion and clears affected Staff assignments.
delete_dm_messagedestructivePermanently delete a direct-message message. The
delete_documentdestructivePermanently delete a Huly document. This action cannot be undone.
delete_drawingdestructiveDelete a drawing. This action cannot be undone.
delete_drivedestructivePermanently delete an empty Huly Drive space. The Drive must contain no files or folders; non-empty Drives fail with child count and item summaries. This is permanent deletion, not archive or trash.
delete_drive_file_commentdestructivePermanently delete a comment from a Drive file resolved by filePath or fileId. Provide only one locator. This deletes the comment, not the file.
delete_drive_itemdestructivePermanently delete a Drive item, meaning a file or folder. Files are deleted with their version records. Folders must be empty; non-empty folders fail with child count and child summaries. This is permanent deletion, not archive or trash.
delete_eventdestructivePermanently delete a calendar event. This action cannot be undone.
delete_funneldestructivePermanently delete an exact funnel only after it is archived and empty. First call get_funnel or archive_funnel, then pass the observed impact counts as expectedLeads, expectedComments, and expectedAttachments. Deletion fails if any count changed after that preflight snapshot.
delete_hr_requestdestructiveDelete one exact HR request. Its comments and attachments are Huly-owned attached collections and follow the request deletion lifecycle.
delete_hr_request_attachmentdestructiveDelete one file belonging directly to an exact HR request.
delete_hr_request_commentdestructiveDelete a comment that belongs directly to an exact HR request.
delete_huly_attributedestructivePermanently delete an unused custom Huly Attribute resolved by ID or exact name. Pass class by ID/name to disambiguate. Built-in attributes and attributes present on any owning-class document are protected. ${MODEL_WRITE_GUARD}
delete_huly_enumdestructivePermanently delete a Huly model enum resolved by exact ID or name. Refuses deletion while any attribute references it. ${MODEL_WRITE_GUARD}
delete_huly_permissiondestructivePermanently delete a custom Huly Permission resolved by exact ID or exact label. Namespaced built-ins are protected, and referenced permissions are refused loudly. ${SECURITY_WRITE_GUARD}
delete_inventory_categorydestructiveDelete an empty inventory category by ID or exact name. Refuses categories that still contain child categories or products; this action does not cascade.
delete_inventory_productdestructiveDelete an inventory product by ID or exact name. Refuses products with variants, photos, attachments, or comments; this action does not cascade.
delete_inventory_product_attachmentdestructivePermanently delete a file attached directly to an inventory product. The attachmentId must belong to the resolved product.
delete_inventory_product_commentdestructivePermanently delete a comment attached directly to an inventory product. The commentId must belong to the resolved product.
delete_inventory_product_photodestructivePermanently delete a photo attached directly to an inventory product. The photoId must belong to the resolved product.
delete_inventory_variantdestructiveDelete one inventory variant/SKU by ID, exact variant name, or exact SKU. This action does not delete its product.
delete_issuedestructivePermanently delete a Huly issue. This action cannot be undone.
delete_issue_templatedestructivePermanently delete a Huly issue template. This action cannot be undone.
delete_labeldestructivePermanently delete a label/tag definition. Accepts label ID or title. This action cannot be undone.
delete_leaddestructivePreview native lead deletion impact by default. The preview reads authoritative comment, attachment, and label relation counts. To permanently delete, pass execute=true together with the exact counts returned by the preview; deletion fails if impact changed.
delete_lead_attachmentdestructiveDelete an attachment only when it belongs to one exact lead. The native blob reference remains governed by Huly storage cleanup.
delete_lead_commentdestructiveDelete one comment only when it belongs to the exact lead target.
delete_milestonedestructivePermanently delete a Huly milestone. This action cannot be undone.
delete_notificationdestructivePermanently delete a notification. This action cannot be undone.
delete_organizationdestructivePermanently delete an organization identified by ID or exact name when that name is unique. Use with care - this cannot be undone. Useful for cleaning up duplicate organizations after merging their data elsewhere. If multiple organizations share the same name, use the organization ID.
delete_persondestructivePermanently delete a person from Huly. This action cannot be undone.
delete_person_attachmentdestructivePermanently delete an attachment only when it belongs to one resolved person; ${EXACT_PERSON}
delete_person_commentdestructivePermanently delete a note/comment only when it belongs to one resolved person; ${EXACT_PERSON}
delete_projectdestructivePermanently delete a Huly project. All issues, milestones, and components in this project will be orphaned. This action cannot be undone.
delete_public_holidaydestructivePermanently delete one public-holiday document by exact raw ID.
delete_recruiting_applicantdestructiveDelete an applicant with Huly removeCollection. applicant accepts raw _id, APP-<number>, or number; vacancy/candidate can disambiguate APP numbers.
delete_recruiting_attachmentdestructiveDelete one file attached directly to a Recruiting vacancy, candidate, applicant, or opinion. The attachmentId must belong to the resolved target.
delete_recruiting_commentdestructiveDelete one comment attached directly to a Recruiting vacancy, candidate, applicant, review, or opinion. The commentId must belong to the resolved target.
delete_recruiting_opiniondestructiveDelete a Recruiting opinion with Huly removeCollection. opinion accepts raw _id, OPE-<number>, or number; review can disambiguate.
delete_recruiting_reviewdestructiveDelete a Recruiting review with Huly removeCollection. review accepts raw _id, RVE-<number>, number, or exact title; candidate/application can disambiguate.
delete_related_issue_space_targetdestructiveDelete 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.
delete_scheduledestructiveDelete a calendar schedule by scheduleId.
delete_status_categorydestructivePermanently delete an unreferenced generic StatusCategory by ID or exact label. Refuses deletion while any Status references the category, preventing dangling relationships.
delete_tagdestructiveDelete a generic Huly tag definition by ID or exact title, resolved within targetClass. This deletes the tag definition, not only one object
delete_tag_categorydestructivePermanently delete a tag/label category. Accepts category ID or label name. Labels in this category will be orphaned (not deleted). This action cannot be undone.
delete_teamspacedestructivePermanently delete a Huly document teamspace. This action cannot be undone.
delete_test_casedestructivePermanently delete a test case. Accepts test case ID or name. This action cannot be undone.
delete_test_plandestructivePermanently delete a test plan. This does not delete associated test runs. Cannot be undone.
delete_test_resultdestructivePermanently delete a test result. Cannot be undone.
delete_test_rundestructivePermanently delete a test run. This does not delete associated test results. Cannot be undone.
delete_test_suitedestructivePermanently delete a test suite. Accepts suite ID or name. This action cannot be undone.
delete_thread_replydestructivePermanently delete a thread reply. This action cannot be undone.
delete_tododestructiveDelete a Planner ToDo by raw todoId or human locator, including a document attachment locator. This is destructive; deleting the last open issue ToDo can cause Huly classic issue status automation, while document ToDos do not change issue counters.
delete_workspacedestructivePermanently delete the current workspace. This action cannot be undone. Use with extreme caution.
describe_huly_space_type_capabilitiesreadDescribe one Huly SpaceType by id or exact name in a single read-only call. Returns descriptor metadata, base/target classes, roles, role permissions, default members, autoJoin, and the stored role-assignment shape.
detach_tagreadDetach a generic Huly tag from one raw object collection. Prefer module tools for supported issue, document, Planner, board, and recruiting objects; this SDK fallback requires targetClass and objectId/objectClass/space/collection.
devread
download_attachmentreadGet download URL for an attachment along with file metadata (name, type, size).
edit_documentwriteEdit 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.
encoded_toolreadencoded tool
fulltext_searchreadPerform a global fulltext search across all Huly content. Searches issues, documents, messages, and other indexed content. Returns matching items sorted by relevance (newest first).
generalread
get_activity_messagereadGet a single activity message by ID, including subclass metadata when available.
get_approval_requestreadRead one generic Huly approval Request document by raw request _id. Returns person refs with best-effort contact metadata plus the opaque SDK tx/rejectedTx payloads for inspection; approval mutations are intentionally not exposed by this read-only tool.
04

Trust audit

BLOCKgrade D · trust 68/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (7 observation(s))
Network
declared (13 observation(s))
Shell
declared (1 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHNetwork egress · net.metadata_ip · CWE-200, CWE-319
src/huly/url-fetch.ts:480
if (hostname === "metadata.google.internal" || hostname === "localhost") {
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/api-token-certification-adapter.ts:190
const transport = new StreamableHTTPClientTransport(new URL(`http://127.0.0.1:${port}/mcp`), {
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/integration_test_profiles.sh:68
"$HULY_PREPARED_CLI" profile create other --url http://127.0.0.1:1 --workspace wrong >/dev/null
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/issue-movement-concurrency/gateway.ts:149
state.base = `http://127.0.0.1:${address.port}`
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/smoke-http-no-config.mjs:92
const endpoint = `http://127.0.0.1:${port}/mcp`
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
test/integration-fixtures/movement-version-evidence.test.ts:40
response.end(JSON.stringify({ VERSION: "0.7.409", MODEL_VERSION: "0.7.343", token: "private-fixture-token" }))
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
test/mcp/stdio-process-lifecycle.test.ts:14
const SECRET = "subprocess-secret-token"
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
test/scripts/api-token-certification-environment.test.ts:9
const TOKEN = "certification-environment-regression-secret"
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
create_huly_permission, delete_activity_reply, delete_association, delete_attachment, delete_board_card, delete_board_label, delete_card, delete_card_comment, delete_channel, delete_channel_message, d
Why it matters. 94 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.hidden_file · CWE-1104
.gcloudignore
.gcloudignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.gitleaks.toml
.gitleaks.toml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.jscpd.json
.jscpd.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.oxlintrc.json
.oxlintrc.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.symlink · CWE-1104
AGENTS.md
AGENTS.md
Why it matters. link not followed
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
.github/workflows/package-smoke.yml:158
npm_config_ignore_scripts=true pnpm --dir packages/huly-cli pack --pack-destination ../../.package-smoke-cli
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/huly-cli/src/catalog-mutations-business-a.ts:1
import type { McpToolName } from "../../../src/mcp/tools/index.js"
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/huly-cli/src/catalog-mutations-business-b.ts:1
import type { McpToolName } from "../../../src/mcp/tools/index.js"
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/huly-cli/src/catalog-mutations-collaboration-a.ts:1
import type { McpToolName } from "../../../src/mcp/tools/index.js"
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/huly-cli/src/catalog-mutations-collaboration-b.ts:1
import type { McpToolName } from "../../../src/mcp/tools/index.js"
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
test/huly/storage.property.test.ts:292
"http://metadata.google.internal/file",
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
test/huly/storage.property.test.ts:293
"http://metadata.google.internal./file",
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
test/huly/storage.test.ts:732
expect(isBlockedUrl("http://169.254.169.254/latest/meta-data")).toBe(true)
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
test/huly/storage.test.ts:737
expect(isBlockedUrl("http://metadata.google.internal/file")).toBe(true)
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.md:235
Server listens on `http://127.0.0.1:3000/mcp` by default.
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
.ralph/package.json
effect, @effect/vitest, @types/node, tsx, typescript, vitest
Why it matters. 6 dependency range(s) float
Fix. pin exact versions or ship a lockfile

Gates applied: no_behavioural_pass.

Audited 2026-10-08 · audit v0.4.1 · source sha 5af1ccc36dd3full audit observations/trust-audit/mcp-server/dearlordylord__huly.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-085af1ccc36dd3BLOCKD68first audit
06

Questions

What is the Huly MCP server?

Huly MCP and CLI: Feature-complete MCP server and CLI for Huly platform. Intabia partially compatible.

What tools does Huly expose?

200 in total: 291 read-only, 193 that write, and 94 that can delete or overwrite (create_huly_permission, delete_activity_reply, delete_association, delete_attachment, delete_board_card). Every one is listed on this page with its risk.

Is Huly safe to connect to an agent?

No — not without reading the findings first. The audit graded it D (68/100) and found 1 critical or high issue in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 94 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does Huly need?

It reads HULY_PASSWORD from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does Huly run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as @firfi/huly-cli at 0.51.0.

How current is this page?

The grade is for one exact copy of the source (5af1ccc36dd3), read on 2026-10-08. The repository is watched and re-audited when it changes.

Advertisement