@lazco-studio/huly-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@lazco-studio/huly-mcpfind the Huly doc titled 'Q3 roadmap' and add a comment to it"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
huly-mcp
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 installOr install the published package:
npm install -g @lazco-studio/huly-mcpThe 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 |
| yes | Base URL of your Huly instance, e.g. |
| yes | Workspace URL slug (see below) |
| one of | Auth token (recommended) |
| one of | Account email — requires |
| one of | Account password |
| no | Connection timeout in ms (default |
Finding your workspace slug
Log in to Huly and read the URL:
https://huly.example.com/workbench/my-workspace-slug
^^^^^^^^^^^^^^^^^ this partUse 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.jsonWindows:
%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.jsVerify 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 doctorIt 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 |
| Connection check — run this first |
| List teamspaces |
| List documents, filtered by space or parent |
| Read document content (markdown / html / markup) |
| Search titles, optionally including content |
| Create a document, optionally as a child |
| Update title or content |
| Delete a document (requires |
Issues
Tool | Purpose |
| List Tracker projects |
| List issues |
| Read an issue, including description and comments |
| 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 |
|
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 |
Claude Desktop MCP log:
# macOS
tail -f ~/Library/Logs/Claude/mcp-server-huly.logLines 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 doctoragainst 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 toolshuly_comment_issueComment on issueB
Add a comment to an issue.
| Name | Required | Description | Default |
|---|---|---|---|
| issueId | No | ||
| message | Yes | Comment body | |
| identifier | No | Issue identifier, e.g. PROJ-12 |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Document title | |
| content | No | Markdown content | |
| parentId | No | Parent document ID; omit to create a top-level document | |
| teamspaceId | Yes | Teamspace ID (from huly_list_teamspaces) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes | Must be explicitly true for the deletion to run | |
| documentId | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | markdown | |
| documentId | Yes | Document ID |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| issueId | No | Internal issue ID | |
| identifier | No | Issue identifier, e.g. PROJ-12 |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| parentId | No | Parent document ID; returns its direct children | |
| teamspaceId | No | Teamspace ID; omit to search across all spaces |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| projectId | No |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | Keyword (case-insensitive) | |
| teamspaceId | No | ||
| searchContent | No | Whether to search document content as well |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | New title | |
| content | No | New markdown content (replaces the whole body) | |
| documentId | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
12 tool updates
v1.0.0- First observed
huly_comment_issue - First observed
huly_create_document - First observed
huly_delete_document - First observed
huly_get_document - First observed
huly_get_issue - First observed
huly_list_documents - First observed
huly_list_issues - First observed
huly_list_projects - First observed
huly_list_teamspaces - First observed
huly_search_documents - First observed
huly_update_document - First observed
huly_whoami
TDQS
Scored across 12 tools
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.
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.
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.
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
Related MCP Connectors
An agent-first office suite Claude & ChatGPT read and write over one MCP URL.
- StorydocOAuthcom.storydoc
Generate and manage Storydoc presentations from any MCP-compatible client.
Team docs served to AI agents over MCP - search, Markdown reads, version pinning, read audit.
Agent-native notes, tasks, dev-docs, vaults, sync & handoffs. MCP + OpenAPI dual surface.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to read, search, create, and edit Quip documents through the MCP protocol.5ISC
- AlicenseNot gradedqualityDmaintenanceEnables Claude to interact with collaborative Docs instances, providing document management, content editing, access control, and AI-powered transformations via MCP.1MIT
- AlicenseNot gradedqualityCmaintenanceEnables MCP clients like Claude Desktop and Cursor to interact with Google Docs, Sheets, and Drive, providing tools for reading, writing, formatting documents, managing spreadsheets, and searching Drive files.MIT
- FlicenseCqualityDmaintenanceEnables Claude to interact with Hudu IT documentation, including searching, reading, creating, and updating articles, assets, passwords, companies, and more.100-