Skip to main content
Glama

huly-mcp

CI License: AGPL v3 Node

MCP server for Huly — read and write Huly documents and issues from Claude Desktop, Claude Code, or any MCP client.

Huly does not ship an official MCP server, but it does publish an official SDK, @hcengineering/api-client, installable from the public npm registry with no GitHub token required. This project is a thin Model Context Protocol layer on top of that SDK.

Works with self-hosted Huly. Huly Cloud (huly.app) uses the same API surface and should work, but has not been verified — see Verification.

  • 12 tools — full document CRUD plus issue reading and commenting

  • Zero build step — plain CommonJS, no TypeScript, no bundler

  • Actually writes document content — including the collaborative-editor workaround most naive implementations get silently wrong (see Implementation notes)


Contents


Related MCP server: Docs MCP Server

Requirements

  • Node.js 20 or newer (verified on v24.12.0)

  • A Huly instance — self-hosted, or Huly Cloud

  • A Huly account with access to the workspace you want to expose

Install

git clone https://github.com/Lazco-Corporation/huly-mcp.git
cd huly-mcp
npm install

Or install the published package:

npm install -g @lazco-studio/huly-mcp

The unscoped name huly-mcp on npm belongs to an unrelated project, so this one ships under the @lazco-studio scope.

Configuration

The server is configured entirely through environment variables.

Variable

Required

Description

HULY_URL

yes

Base URL of your Huly instance, e.g. https://huly.example.com

HULY_WORKSPACE

yes

Workspace URL slug (see below)

HULY_TOKEN

one of

Auth token (recommended)

HULY_EMAIL

one of

Account email — requires HULY_PASSWORD

HULY_PASSWORD

one of

Account password

HULY_TIMEOUT_MS

no

Connection timeout in ms (default 30000)

Finding your workspace slug

Log in to Huly and read the URL:

https://huly.example.com/workbench/my-workspace-slug
                                   ^^^^^^^^^^^^^^^^^ this part

Use the slug from the URL, not the name shown in the sidebar. They are frequently different, and this is the single most common setup mistake.

Claude Desktop

Edit your Claude Desktop config:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "huly": {
      "command": "node",
      "args": ["/absolute/path/to/huly-mcp/src/index.js"],
      "env": {
        "HULY_URL": "https://huly.example.com",
        "HULY_WORKSPACE": "my-workspace-slug",
        "HULY_TOKEN": "your-token-here"
      }
    }
  }
}

If node is not on the PATH Claude Desktop sees (common with nvm, fnm, or asdf), use the absolute path to the Node binary instead, e.g. /Users/you/.local/share/fnm/node-versions/v24.12.0/installation/bin/node.

A copy of this snippet lives in claude_desktop_config.example.json.

Claude Code

claude mcp add huly \
  --env HULY_URL=https://huly.example.com \
  --env HULY_WORKSPACE=my-workspace-slug \
  --env HULY_TOKEN=your-token-here \
  -- node /absolute/path/to/huly-mcp/src/index.js

Verify before connecting

Run the bundled diagnostic before restarting your MCP client:

HULY_URL=https://huly.example.com \
HULY_WORKSPACE=my-workspace-slug \
HULY_TOKEN=your-token-here \
npm run doctor

It checks, in order: environment variables → server config.json → login → data reads → collaborative content reads. Only restart your client once everything passes.

Authentication: password vs token

Both are supported. A token is recommended, because Huly locks accounts after repeated failed password attempts.

To get a token, log in through the browser and read it from DevTools → Application → Local Storage.

Tokens expire. Once one does, every tool reports an authentication failure — fetch a new token and restart the server.

Tools

Documents

Tool

Purpose

huly_whoami

Connection check — run this first

huly_list_teamspaces

List teamspaces

huly_list_documents

List documents, filtered by space or parent

huly_get_document

Read document content (markdown / html / markup)

huly_search_documents

Search titles, optionally including content

huly_create_document

Create a document, optionally as a child

huly_update_document

Update title or content

huly_delete_document

Delete a document (requires confirm=true)

Issues

Tool

Purpose

huly_list_projects

List Tracker projects

huly_list_issues

List issues

huly_get_issue

Read an issue, including description and comments

huly_comment_issue

Comment on an issue

Implementation notes

These are the non-obvious parts. If you are extending the server, read this section first.

Document content is not an ordinary field. Huly's Document.content is a reference to a collaborative-editing blob (MarkupBlobRef), so you cannot write a string to it with updateDoc. You must go through fetchMarkup / uploadMarkup, which talk to COLLABORATOR_URL. Creating a document with content is therefore two steps: create the document to get an id, then upload the markup and write the reference back.

Node needs an explicit WebSocket implementation. connect() runs over WebSocket and Node has no global WebSocket, so NodeWebSocketFactory must be passed in (already handled). If you front Huly with a reverse proxy, it must forward Upgrade / Connection headers.

Updating content must go through the collaborator — a trap worth knowing. api-client's uploadMarkup actually calls the collaborator's createContent, which means create a new blob. Used against a document that already has collaborative state, the server keeps its existing YDoc and silently discards the new blob — the API reports success and the content does not change. The correct call is the collaborator's updateContent (updateMarkup), which api-client does not expose, so src/huly.js builds its own collaborator client.

As a result huly_update_document branches: uploadMarkup when the document has no content yet, updateMarkup when it does. This bug is fixed and covered by end-to-end testing.

Content updates replace the whole body. The content argument to huly_update_document replaces the entire document. To append, read with huly_get_document, merge, then write back.

Markdown tables become HTML tables. Write a table and read it back and you get <table> markup rather than the original |---| syntax. The content is correct and renders correctly in the Huly UI, but the round trip is not byte-symmetrical.

CommonJS, not TypeScript. @hcengineering/api-client@0.7.423 declares types/index.d.ts in its package.json, but that directory is not actually published with the package, so a TypeScript build fails immediately. Hence plain JavaScript.

Verification

End-to-end tested against a self-hosted Huly instance — 18 checks, all passing: create / read / update / second update / child documents / listing by parentId / delete guard / refusing to delete a parent with children / search / issue reads / JSON-RPC stream integrity. All test fixtures were cleaned up afterwards.

Verified against: Huly 0.7.426, api-client 0.7.423, MCP SDK 1.30.0, Node v24.12.0.

When your Huly instance updates, and especially if api-client takes a major version bump, update this project's dependencies alongside it.

Troubleshooting

Symptom

Fix

Workspace not found

HULY_WORKSPACE is set to the display name; use the URL slug instead

Authentication failed

Expired token or wrong credentials (repeated password failures lock the account)

Connection timeout

Reverse proxy is not forwarding WebSocket upgrades

Tools not visible in the client

Fully quit and reopen Claude Desktop — closing the window is not enough

Content reads fail

Check that COLLABORATOR_URL in the server's config.json is not empty

Claude Desktop MCP log:

# macOS
tail -f ~/Library/Logs/Claude/mcp-server-huly.log

Lines like no document found, failed to apply model transaction, skipping come from the Huly server's model sync and are harmless noise — they do not indicate a failed tool call.

Contributing

Issues and pull requests are welcome. Start with CONTRIBUTING.md — it covers the development setup, how to verify a change without a test suite, and the two conventions that silently break things when violated.

Participation is governed by our Code of Conduct.

The short version:

  • Run npm run doctor against your own Huly instance before and after your change.

  • Keep the code plain CommonJS — see Implementation notes for why.

  • Never write to stdout from src/; it carries the JSON-RPC stream.

  • If you touch content read/write paths, test against a document that already has collaborative content, not just a fresh one. That is where the silent-failure trap lives.

Security

Do not report security issues in a public issue. See SECURITY.md for private reporting, and for operator notes worth reading before you deploy — in particular that this server acts with your full Huly account permissions and adds no authorisation layer of its own.

License

AGPL-3.0-or-later. See LICENSE.

Copyright (C) 2026 Lazco Corporation.

The AGPL's network clause applies: if you modify this server and let others use it over a network, you must offer them the modified source. Running it unmodified, or using it privately, carries no such obligation.

Available Tools

12 tools
huly_comment_issueComment on issueB

Add a comment to an issue.

ParametersJSON Schema
NameRequiredDescriptionDefault
issueIdNo
messageYesComment body
identifierNoIssue identifier, e.g. PROJ-12

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. The description merely states the action without detailing any side effects, permissions, reversibility, or notification behavior. For a mutation tool, this is a significant gap, as the agent cannot infer any constraints or consequences beyond the surface action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, direct sentence with no extraneous words. It is appropriately sized for a simple mutation operation and is front-loaded with the core action. There is no waste or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with three parameters, no annotations, and no output schema, the description is too minimal. It does not explain how to identify the issue (through issueId or identifier), whether one is preferred, or any context about the comment's placement. An agent would need additional inference to invoke the tool correctly, making this incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67% (only 'message' has a description in the schema). The tool description does not add any parameter semantics or clarify how to use 'issueId' vs 'identifier' or whether both are needed. It provides no compensation for the undocumented parameters, leaving the agent to guess the relationship between the two optional identifiers.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Add a comment to an issue' clearly states the verb (add), the object (comment), and the target (issue). It distinguishes the tool from all siblings, as no other sibling handles comments. While it is succinct, it leaves no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: one would use this tool when they want to comment on an issue. It does not explicitly state when to use it versus alternatives, but no sibling tool is available for commenting, so the context is clear. However, it lacks explicit guidance on when not to use it or any prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

huly_create_documentCreate documentA

Create a new document in a teamspace, with content supplied as markdown. Pass parentId to create it as a child document.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesDocument title
contentNoMarkdown content
parentIdNoParent document ID; omit to create a top-level document
teamspaceIdYesTeamspace ID (from huly_list_teamspaces)

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. It does disclose the side effect (new document), the content format (markdown), and child-document behavior via parentId. It omits the return value, permission requirements, and failure behavior, which are notable gaps for a mutation with no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler. The core purpose is front-loaded, and the optional parentId behavior is placed second without unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description plus fully documented schema is enough to make a valid create call. However, with no output schema and no annotations, missing return-value, permission, and error details leave a clear gap for an agent that needs to use the created document afterward.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents title, content, parentId, and teamspaceId. The description's parentId hint mostly restates the schema's 'Parent document ID; omit to create a top-level document' rather than adding new semantic meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Create a new document in a teamspace.' It further clarifies markdown content and optional parentId child placement, which clearly separates it from siblings like huly_update_document and huly_delete_document.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use is implied by 'create a new document' and the parentId guidance, so an agent can tell this is for new documents rather than updates or searches. However, it does not explicitly name alternatives or state when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

huly_delete_documentDelete documentA

Delete a document. This cannot be undone, so confirm the documentId is correct first.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYesMust be explicitly true for the deletion to run
documentIdYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly warns that deletion cannot be undone and instructs the agent to confirm the documentId first, which is critical for a destructive operation. However, it does not mention other behaviors like cascading effects or required permissions, leaving some gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is only two sentences, front-loaded with the action and the most important caveat (irreversibility). Every word earns its place, with no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive operation with no annotations and no output schema, the description is somewhat thin. It covers the action and the irreversibility warning, but does not specify what happens on success (e.g., return format) or any prerequisites beyond confirming the ID. A bit more context about fallback behavior or failure states would make it complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 50% (only the 'confirm' parameter is described in the schema, while 'documentId' is not). The description adds modest context by telling the agent to 'confirm the documentId is correct', which hints at the parameter's purpose but does not add detailed semantics for either parameter. It partially compensates for the schema gap but not fully.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Delete') and a specific resource ('a document'), which clearly distinguishes it from sibling tools like huly_get_document or huly_update_document. The purpose is immediately obvious and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly state when to use this tool versus alternatives. The destructive nature implies caution, but there is no guidance on prerequisites (e.g., being certain the document is the intended one) or when not to use it. Usage context is only implied by the action itself.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

huly_get_documentRead document contentA

Fetch a document title and its full content by ID (markdown by default). Content lives in a collaborative blob, so it can only be retrieved through this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNomarkdown
documentIdYesDocument ID

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must carry the burden of behavioral disclosure. It does explain that content is stored in a collaborative blob and can only be retrieved through this tool, which is a significant behavioral detail. However, it doesn't disclose the return format beyond markdown default, error conditions, or whether it's a read-only operation (though 'Fetch' implies it). The description adds valuable context but lacks completeness.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, concise and front-loaded with the core action ('Fetch a document title and its full content by ID'). The second sentence about the collaborative blob adds necessary context without fluff. Slightly verbose but efficient overall, earning a 4 rather than 5 due to minor redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 params, no output schema), the description covers the essential: what it does, the default format, and the uniqueness of content retrieval. It lacks details on error handling, authentication, or performance, but for a read tool with clear purpose, it's adequately complete. No output schema means it doesn't need to explain return values, so the description is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50%, with documentId having a basic description but format only having an enum. The description adds meaning for format by explaining markdown is default and content is markdown by default, but doesn't explain the difference between html and markup. It does not elaborate on documentId beyond schema, so it partially compensates for the coverage gap but not fully.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Fetch' and the resource 'document title and its full content by ID', which precisely defines the tool's purpose. It also distinguishes itself from siblings like huly_list_documents by noting it retrieves full content, not just metadata. The mention of markdown by default and the collaborative blob uniqueness sets it apart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when you need the full content of a specific document, contrasting with list/search tools that provide summaries. However, it doesn't explicitly state when not to use it or mention alternatives like huly_get_issue, but the context signals with siblings provide enough guidance. The statement about the collaborative blob implies this is the only way to get content, but without explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

huly_get_issueRead issueA

Fetch a full issue by internal ID or human identifier (e.g. PROJ-12), including its description and comments.

ParametersJSON Schema
NameRequiredDescriptionDefault
issueIdNoInternal issue ID
identifierNoIssue identifier, e.g. PROJ-12

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. 'Fetch' implies a read operation, but it does not explicitly state it is non-destructive, nor does it disclose error behavior (e.g., if the issue is not found) or any permissions. It does mention return content (description and comments), which adds some context, but leaves behavioral aspects largely implicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that states the core action and key details without any fluff. It efficiently conveys the tool's purpose and identification methods in minimal words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read tool with no output schema and no annotations, the description is decent but incomplete. It mentions the return includes description and comments, but does not clarify that at least one identifier parameter is required (the schema has no required fields), nor does it mention error handling or the exact response format. These are notable gaps for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for both parameters, so the baseline is 3. The description adds little beyond the schema: it restates that either internal ID or human identifier can be used, which is already present in the param descriptions. It does not clarify the constraint that exactly one of the two is needed, or what happens if both are provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool fetches a full issue, with specific identification methods (internal ID or human identifier like PROJ-12). It distinguishes from siblings like huly_list_issues (listing) and huly_comment_issue (commenting) by focusing on retrieval of a single issue with full details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it (to get a full issue) but does not explicitly mention alternatives or exclusions. It does not say 'use this when you need detailed issue info' or contrast with listing tools. The purpose is clear, but guidance on choosing among siblings is only implicit through the tool name and description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

huly_list_documentsList documentsA

List documents without their content. Filter by teamspaceId for a single space, or by parentId to get child documents. The returned ids can be passed to huly_get_document.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
parentIdNoParent document ID; returns its direct children
teamspaceIdNoTeamspace ID; omit to search across all spaces

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It discloses the read-only nature ('list'), the absence of content in results, and that ids feed a follow-up fetch. It does not mention pagination behavior, ordering, or the exact response shape beyond ids, which would increase transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler: the first states the core purpose and the second explains both filter modes and the downstream use of returned ids. Everything earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the main usage, both filter modes, and the relationship to huly_get_document. Since there is no output schema, the exact fields beyond 'ids' are not stated, and limit-based pagination is not mentioned, but for a simple listing tool the description is close to complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%; parentId and teamspaceId already have descriptive schema text, and the tool description largely paraphrases them, adding little new meaning. The limit parameter has no description, but its default/min/max constraints convey enough; the description does not address it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'List documents without their content.' It clearly scopes the tool as a metadata-only listing, and the last sentence links returned ids to huly_get_document, implicitly distinguishing it from content retrieval siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete context: filter by teamspaceId for a single space, by parentId for child documents, and it points downstream to huly_get_document. However, it does not contrast with huly_search_documents or state when listing is preferable to searching, so no exclusion guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

huly_list_issuesList issuesA

List issues, optionally filtered by projectId. Results include the status name and the human identifier (e.g. PROJ-12).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
projectIdNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the behavioral burden. It discloses that results include the status name and human identifier, but it does not explicitly state that the operation is read-only, nor does it mention pagination, ordering, or any prerequisites.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences carry all the essential information, with the verb and resource first, the optional filter second, and result details last. There is no redundant or vague wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with two optional parameters and no output schema, the description covers the core action, the filter, and notable result fields. It leaves out ordering and full result shape, but those are minor for this complexity level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains that projectId is an optional filter, but it does not describe the 'limit' parameter; the schema's default/min/max constraints partially fill that gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with the specific verb 'List' and resource 'issues', and adds an optional 'projectId' filter, making the tool's function immediately clear. It does not explicitly distinguish from sibling tools like huly_get_issue, but the resource and plural verb make the intended use evident.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'optionally filtered by projectId' implies that this tool is for retrieving issue collections, possibly scoped to a project. However, it provides no explicit guidance on when to choose this over huly_get_issue or huly_list_projects, leaving the decision to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

huly_list_projectsList projectsA

List Tracker projects (the spaces issues live in).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the transparency burden, and the verb 'List' adequately signals a read-only operation with no side effects. It does not disclose pagination, scope (all accessible projects vs. limited), or result format, but none of these are likely to be surprising for a simple zero-parameter listing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short sentence with no filler. The operation is front-loaded and the parenthetical earns its place by clarifying the domain concept.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Enough for an agent to decide to call the tool, but with no output schema and no annotations, the description does not say what fields the returned projects include or whether pagination/limiting applies. A note such as 'returns project IDs and names for all accessible projects' would close the remaining gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters, so the description cannot add parameter-level meaning beyond the schema; per baseline, zero parameters earn a 4. The 'Tracker projects' clarifier adds useful domain context, which is more than an empty schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses a clear verb and resource: 'List Tracker projects', and the parenthetical ('the spaces issues live in') grounds what a project is. It is immediately evident this is not huly_list_issues, but it does not explicitly differentiate from huly_list_teamspaces, so it stops short of a full 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The parenthetical implies usage: if you need the containers that issues live in, this is the list tool, and huly_list_issues is for the issues themselves. However, no sibling or alternative is named, and there is no explicit when-to-use or when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

huly_list_teamspacesList teamspacesA

List all teamspaces (the spaces documents live in). You need a teamspaceId from here before creating a document.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. 'List all teamspaces' unambiguously signals a read-only operation with no side effects, and the parenthetical adds semantic context about what a teamspace is. Though it doesn't describe response format or pagination, the operation is simple enough that the description is adequately transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler. The core action is stated first, followed by a brief clarifying explanation and the use case. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity of a parameterless list tool with no annotations or output schema, the description covers everything an agent needs: what it does, what a teamspace is, and why the result matters (obtaining a teamspaceId). Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is no parameter semantics to document. The description correctly avoids inventing constraints and stays focused on the operation itself. This is the appropriate baseline for a parameterless tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'List' with the resource 'teamspaces' and clarifies their role ('the spaces documents live in'), which immediately distinguishes them from sibling list tools like huly_list_projects and huly_list_documents. An agent can understand exactly what this tool returns without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states the primary use case: 'You need a teamspaceId from here before creating a document,' giving clear context for when to call this tool. It does not explicitly name alternatives or exclusions, but the purpose is specific enough that an agent can infer when this is the right choice among sibling list tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

huly_search_documentsSearch documentsB

Search document titles by keyword. Set searchContent=true to also search document bodies (slower, since each document is fetched individually).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYesKeyword (case-insensitive)
teamspaceIdNo
searchContentNoWhether to search document content as well

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It only mentions the performance impact of content search, but omits other behaviors such as case-insensitivity (though that is in the schema), default behavior without searchContent, how results are returned, or any permission requirements. The single behavioral note is insufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no fluff. The primary purpose is stated first, and the optional behavior is introduced efficiently. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 4 parameters, no output schema, and no annotations, the description is incomplete. It fails to mention the teamspaceId parameter for scoping searches, the limit parameter for pagination control, or what the return format looks like. An agent cannot fully understand the tool's capabilities without inspecting the schema further.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema describes query as case-insensitive and searchContent as a boolean, but the description adds meaningful context about searchContent's performance implication (each document fetched individually). However, it adds nothing about limit or teamspaceId, which lack schema descriptions, leaving those parameters under-documented. It partially compensates for the 50% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Search' and the resource 'document titles', and distinguishes it from sibling tools like huly_list_documents by implying a keyword-based search rather than a simple listing. It also mentions the optional body search, adding specificity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides guidance on when to use searchContent=true (to search bodies) and notes the performance tradeoff, but it does not explicitly state when to use this tool versus alternatives like huly_list_documents or huly_get_document. Usage context is partially implied but not fully clarified.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

huly_update_documentUpdate documentA

Update a document title or content. content replaces the entire body; to append, first read the document with huly_get_document, merge, then write the result back.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoNew title
contentNoNew markdown content (replaces the whole body)
documentIdYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral burden. It clearly discloses the destructive aspect: 'content replaces the entire body,' and warns against naive append attempts. It does not mention permissions or return values, but the main mutation risk is covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with no filler. The critical replacement behavior is front-loaded, and the append workaround is provided as a short, actionable follow-up.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity mutation tool, the description covers the target, mutable fields, destructive semantics, and the safe append workflow. Since there are no annotations and no output schema, a bit more detail about response or error behavior would be needed for a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%, and the description adds meaning beyond the schema by explaining the append workflow and reinforcing that content is a full replacement. The documentId role is obvious from the sentence structure, even though it lacks a schema description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Update a document title or content.' This clearly differentiates it from sibling tools like create, get, and delete, and the replacement semantics reinforce what the operation does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance for the common append case: read with huly_get_document, merge, then write back. It does not explicitly state when to prefer create/delete, but the intended update workflow is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

huly_whoamiConnection checkA

Verify the Huly connection and credentials, returning the current account and workspace. Run this first after configuring the server.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses that the tool returns account/workspace info and implies a read-only verification, but it does not explicitly state that no data is modified or describe error/authentication-failure behavior. The wording is adequate for a simple whoami tool but could be more explicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no filler. The primary purpose is front-loaded, and the usage guidance is integrated efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter connection-check tool, the description is complete: it explains what the tool verifies, what it returns, and when to invoke it. No output schema is needed because the return content is described in plain language.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is nothing for the description to clarify. The baseline of 4 applies, and the description appropriately adds no unnecessary parameter details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Verify the Huly connection and credentials') and a concrete result ('returning the current account and workspace'). It clearly distinguishes itself from sibling tools like huly_list_documents or huly_get_document by focusing on connection state rather than data operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage timing: 'Run this first after configuring the server.' It does not explicitly name alternatives or exclusions, but the instruction to run it first establishes its role as a preliminary check relative to all sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 12 tool updatesv1.0.0
    • First observedhuly_comment_issue
    • First observedhuly_create_document
    • First observedhuly_delete_document
    • First observedhuly_get_document
    • First observedhuly_get_issue
    • First observedhuly_list_documents
    • First observedhuly_list_issues
    • First observedhuly_list_projects
    • First observedhuly_list_teamspaces
    • First observedhuly_search_documents
    • First observedhuly_update_document
    • First observedhuly_whoami

TDQS

A3.7/5.0

Scored across 12 tools

Disambiguation5/5

Every tool pairs a clear verb with a distinct resource: teamspaces, documents, projects, issues, and the current user. list_documents and search_documents are differentiated by browsing vs. keyword search, and get_document vs. get_issue target completely different object types.

Naming Consistency5/5

All tools use the huly_ prefix and follow a snake_case verb_noun pattern (list_, get_, create_, update_, delete_, search_, comment_). huly_whoami is the only slight outlier but is a conventional identity-check idiom and does not disrupt the overall consistency.

Tool Count5/5

12 tools is well within the ideal scope for an integration server. The toolset covers two coherent resource families—documents and issues—with no redundant utilities or unnecessary bloat.

Completeness2/5

The document side has full lifecycle coverage (list, get, search, create, update, delete), but the issue side only supports list, get, and comment. Missing issue creation, update, deletion, and state transitions are significant gaps that prevent common issue-management workflows.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers