iit-mcp-hudu
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| HUDU_API_KEY | Yes | Your Hudu API key. Required under the stdio transport and optional under http, where a request's X-Hudu-Api-Key header wins and this default fills in whatever it omits. | |
| HUDU_BASE_URL | Yes | The Hudu origin to dial, e.g. https://your.hudu.host. Required under the stdio transport and optional under http, where a request's X-Hudu-Base-Url header wins and this default fills in whatever it omits. | |
| HUDU_COOLDOWN | No | The 429 cooldown gate: on (default) arms a local deadline whose refusals answer with notSent: true; off retries a 429 per the agent profile instead. | on |
| MCP_TRANSPORT | No | Selects the transport: stdio (default) for Claude Code, Claude Desktop and VS Code, or http for remote MCP clients. | stdio |
| HUDU_READ_ONLY | No | When "true" (default) both mutation tools are omitted entirely. Set to "false" to enable mutations (requires also configuring HUDU_WRITE_POLICY). | true |
| HUDU_TIMEOUT_MS | No | The whole-call deadline in positive integer milliseconds. Always sent to the SDK explicitly so it stays above the agent profile's 20 s. | 30000 |
| HUDU_WRITE_ALLOW | No | Comma-separated canonical operation keys permitted when HUDU_WRITE_POLICY=allow_list. An empty or invalid allow-list fails startup. | |
| HUDU_CACHE_PRESET | No | Toggles the read-through cache: on (default) selects the SDK's recommended per-entity TTL preset; off disables it so repeated reads re-dial Hudu. | on |
| HUDU_SECRET_READS | No | Governs reads that return a plaintext credential (asset_passwords and password_folders resources). deny (default) refuses every such operation before any request; allow permits the credential-resource operations but never enables plaintext results. | deny |
| HUDU_WRITE_POLICY | No | Deployment-wide mutation policy: deny (default) rejects all mutations, allow_list permits only the canonical keys in HUDU_WRITE_ALLOW, and all permits the SDK's mutation surface. | deny |
| HUDU_SEARCH_RESOURCES | No | Narrows which resources the cross-resource reads (hudu_search and hudu_resolve_any, plus the same operations reached through hudu_read) may offer and query. Unset means the full set of the SDK's eight searchable resources. | |
| HUDU_ALLOWED_BASE_HOSTS | No | http only. Comma-separated list of exact hostnames or *.example.com subdomain suffixes (no scheme, port or path; internationalised names in punycode) that a caller may name in X-Hudu-Base-Url. Required unless HUDU_ALLOW_ANY_BASE_HOST=true; when unset and HUDU_BASE_URL is set, only that default origin is accepted. | |
| HUDU_ALLOW_ANY_BASE_HOST | No | http only. Set to "true" to allow any caller-named origin when HUDU_ALLOWED_BASE_HOSTS is unset; without this opt-in the server refuses to boot when both HUDU_ALLOWED_BASE_HOSTS and HUDU_BASE_URL are unset. | false |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| hudu_list_operationsA | List the operations the Hudu SDK implements, with the tool that exposes each one (when it has one), its effect, whether it needs a dry run or a confirmation flag, and the arguments it requires. The tool list on this server is a SUBSET: this is a curated core profile, and the catalog is how you discover a capability that has no tool of its own — find the row, call hudu_describe_operation for the exact schema, then hudu_read/hudu_write/hudu_delete. Rows with no "tool" are reachable only through hudu_read/hudu_write/hudu_delete. Rows with "reachable": false are deliberately not callable here and state why (an unbounded read, or a binary/download surface). Bounded: limit defaults to 40 and is hard-capped at 100, offset pages through the rest; the whole catalog is ~10k tokens, so ask for a filter or a page rather than dumping it. |
| hudu_describe_operationA | Return the full input schema, effect, flags, dry-run support, error vocabulary, related operations and preferredWhen guidance for ONE operation, so a capability can be called correctly without carrying every schema in context. Use it after hudu_list_operations named the operation and before hudu_read/hudu_write/hudu_delete. Takes the canonical operation key exactly as the catalog prints it (for example "companies.update") — never a tool name, and there is no fuzzy matching: an unknown key is a CONFIG_ERROR naming the nearest catalog keys. |
| hudu_readA | Execute only read operations by canonical registry key. input is a CLOSED per-operation contract (issues #70/#72): exactly the operation's declared fields - unknown fields are refused before any request (typed CONFIG_ERROR names the valid fields); the per-operation field table, types, vendor picklists and guidance notes are in the served input schema and in hudu_describe_operation (the same contract, zero wire cost). Runtime effect enforcement precedes SDK validation and HTTP. Reads have no dry run. Neither preview nor confirm is human consent: the host must enforce its own approval policy. Results mask credentials and asset custom fields by default. |
| hudu_searchA | Search Hudu. One tool, three modes: mode="search" (the default) runs the query; mode="help" returns how to use this tool; mode="resources" returns what is searchable and what each vendor text filter really covers. Only "search" needs query. mode="search": ranked, fuzzy search over article TITLE and BODY content, asset names, custom-field VALUES and identifiers, plus company/user/group/website names. Each hit carries resource, id, a snippet, a 0-100 score band and the fetch call for the full record. As a TOOL it defaults to tier "index" (build or await the body index), so the answer is complete rather than body-blind. Honesty: limit default 8 / max 25, snippetChars default 200 / max 400 (0 = none); a bound that bites sets meta.complete false and names itself in meta.reasons. hits=[] is a complete "nothing matched" answer ONLY when meta.complete is true and meta.degraded is null - read degraded first: it says when bodies were not searched ("body-not-indexed") or the index was cold ("vendor-only"). Not for identity lookup (hudu_find_* / hudu_get_*) or for paging (hudu_list_*). A field the mode cannot honour is a CONFIG_ERROR naming the fields it honours; a missing query is a CONFIG_ERROR naming mode:"help", never a silent help fallback. |
| hudu_resolve_anyA | Resolve an identifier against several resources and return the candidates that match. Preferred when the caller has an identifier but not the resource type; use the resource's own resolve when the type is known. Returns ResolutionCandidateHit rows for each resource that matched, with scanned/truncated counts; it does not throw RESOLUTION_AMBIGUOUS across resources. Bounded: limit defaults to 25 and is hard-capped at 100; a larger value throws CONFIG_ERROR and is never silently clamped. Do not use it when the resource type is known: call that resource's hudu_get_. |
| hudu_get_api_infoA | Return the API information document. Prefer api_info.get; this exists so every resource satisfies the same floor. Bounded: limit default 25, max 100; the client scan stops at 500 records / 4 pages (RESOLUTION_TRUNCATED, never a partial answer). Not for text discovery: call hudu_search. |
| hudu_get_company_contextA | Fetch a company together with the bounded context an agent needs about it. Preferred over four separate list calls when an agent starts work on a company. Returns CompanyContext. Bounded: every sub-list uses limit (default 25, max 100) — no sub-fetch walks the account. Not for paging: call hudu_search. Context depends on the resources available to this deployment; a refused credential answers UNAUTHORIZED (401, "Bad credentials") like every other tool, and any other failure keeps its real code — never partial results. |
| hudu_get_article_contextA | Fetch an article with its company and folder context. Preferred over three separate calls when an agent starts from an article. Returns ArticleContext. Bounded: every sub-list uses limit (default 25, max 100) — no sub-fetch walks the account. Not for paging: call hudu_search. Context depends on the resources available to this deployment; a refused credential answers UNAUTHORIZED (401, "Bad credentials") like every other tool, and any other failure keeps its real code — never partial results. |
| hudu_get_asset_contextA | Fetch an asset with the context an agent needs about it. Preferred over four separate calls when an agent starts from an asset. Returns AssetContext. Bounded: every sub-list uses limit (default 25, max 100) — no sub-fetch walks the account. Not for paging: call hudu_search. Context depends on the resources available to this deployment; a refused credential answers UNAUTHORIZED (401, "Bad credentials") like every other tool, and any other failure keeps its real code — never partial results. |
| hudu_get_asset_layoutA | Resolve an asset layout from an id, name or slug. Use when the identifier is a layout name or slug; asset_layouts.get is cheaper for a known id. Returns one record: a compact AssetLayoutSummary (icon_color, sidebar_folder_id, include_passwords, … dropped); expand: true returns the full AssetLayout. Bounded: limit default 25, max 100; the client scan stops at 500 records / 4 pages (RESOLUTION_TRUNCATED, never a partial answer). Not for text discovery: call hudu_search. |
| hudu_find_asset_passwords_by_slugA | Find one password record by its URL slug. Preferred over a full asset passwords scan for a slug lookup. Returns one record: a compact AssetPasswordSummary (passwordable_id, passwordable_type, description, … dropped); expand: true returns the full AssetPassword. Bounded: limit default 25, max 100; the client scan stops at 500 records / 4 pages (RESOLUTION_TRUNCATED, never a partial answer). Do not use it to enumerate or to page: it returns at most one exact match (call hudu_search or hudu_get_asset_password for that). Sensitive: returns credential-shaped fields; the SDK masks them in results by default and always in diagnostics. |
| hudu_find_websites_by_slugA | Find one website by its URL slug. Preferred over a full websites scan for a slug lookup. Returns one record: a compact WebsiteSummary (code, message, keyword, … dropped); expand: true returns the full Website. Bounded: limit default 25, max 100; the client scan stops at 500 records / 4 pages (RESOLUTION_TRUNCATED, never a partial answer). Do not use it to enumerate or to page: it returns at most one exact match (call hudu_search or hudu_get_website for that). |
| hudu_get_folderA | Resolve a folder from an id or name, optionally scoped to a company. Use when the identifier is a folder name; folders.get is cheaper for a known id. Returns one record: a compact FolderSummary (description, created_at, … dropped); expand: true returns the full Folder. Bounded: limit default 25, max 100; the client scan stops at 500 records / 4 pages (RESOLUTION_TRUNCATED, never a partial answer). Not for text discovery: call hudu_search. |
| hudu_get_password_folderA | Resolve a password folder from an id or name, optionally scoped to a company. Use when the identifier is a folder name; password_folders.get is cheaper for a known id. Returns one record: a compact PasswordFolderSummary (description, allowed_groups, created_at, … dropped); expand: true returns the full PasswordFolder. Bounded: limit default 25, max 100; the client scan stops at 500 records / 4 pages (RESOLUTION_TRUNCATED, never a partial answer). Not for text discovery: call hudu_search. Sensitive: returns credential-shaped fields; the SDK masks them in results by default and always in diagnostics. |
| hudu_get_groupA | Resolve a user group from an id, name or slug. Use when the identifier is a group name; groups.get is cheaper for a known id. Returns one record: a compact GroupSummary (url, created_at, members, … dropped); expand: true returns the full Group. Bounded: limit default 25, max 100; the client scan stops at 500 records / 4 pages (RESOLUTION_TRUNCATED, never a partial answer). Not for text discovery: call hudu_search. |
| hudu_list_companiesA | List ONE bounded page of companies, backed by the fixed operation companies.list. Returns at most page_size rows plus whether more exist; it never pages through the tenant. This tool takes no operation argument and cannot be redirected to a write. Prefer hudu_search or hudu_resolve_any to identify a single company, and hudu_get_company_context to read one. This is the ungated path for the companies.list read; use it rather than the approval-gated hudu_read / hudu_write / hudu_delete. |
| hudu_list_articlesA | List ONE bounded page of knowledge-base articles, backed by the fixed operation articles.list. Returns at most page_size rows plus whether more exist; it never pages through the tenant. This tool takes no operation argument and cannot be redirected to a write. Prefer hudu_search to find an article by text, and hudu_get_article_context to read one. This is the ungated path for the articles.list read; use it rather than the approval-gated hudu_read / hudu_write / hudu_delete. |
| hudu_list_assetsA | List ONE bounded page of assets across all companies, backed by the fixed operation assets.listAcrossCompanies. Returns at most page_size rows plus whether more exist; it never pages through the tenant. The operation is page-paginated by the vendor (page and page_size are sent upstream), so later pages are reachable by raising page. This tool takes no operation argument and cannot be redirected to a write. Filter by company_id, primary_serial, asset_layout_id or search. Prefer hudu_get_asset_context to read one asset in full, and hudu_search to find one by text. This is the ungated path for both assets.listAcrossCompanies and the company-scoped assets.list read (filter by company_id); use it rather than the approval-gated hudu_read / hudu_write / hudu_delete. |
| hudu_list_asset_layoutsA | List ONE bounded page of asset layouts, backed by the fixed operation asset_layouts.list. The vendor endpoint honours page but ignores page_size, so a page is the vendor’s own size and is returned whole; page N is always the vendor’s Nth page, so walking page never skips rows. has_more is conservative (true for any non-empty page); stop when a page comes back empty. This tool takes no operation argument and cannot be redirected to a write. Use the name or slug filter to find a layout; asset_layouts is not searchable, so hudu_search cannot return one. Prefer hudu_get_asset_layout to read one layout in full by name or slug. This is the ungated path for the asset_layouts.list read; use it rather than the approval-gated hudu_read / hudu_write / hudu_delete. |
| hudu_fetch_manyA | Fetch up to 20 single records across MIXED resources in ONE call — the batch form of the single-record reads (it collapses N sequential hudu_read calls into one). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 20 tools
Most tools have distinct roles, but hudu_read overlaps with hudu_list_* and hudu_fetch_many for read access, and hudu_resolve_any overlaps with the resource-specific resolver tools. The descriptions give preferredWhen guidance, so an agent can usually recover the boundary, but the set is not perfectly crisp.
All tools use the hudu_ prefix and snake_case, mostly following hudu_<verb>_<noun> (list_companies, get_asset_layout, find_websites_by_slug). A few generic or suffix forms (hudu_read, hudu_search, hudu_resolve_any, hudu_fetch_many) break the strict verb_noun pattern, but the convention remains readable and predictable.
20 tools is on the heavy side, and several are convenience wrappers around hudu_read (context fetchers, list pages, resolvers). Given Hudu's breadth and the catalog/discovery layer, the count is defensible but slightly over-scoped for a curated MCP surface.
Read, search, resolve, context, list, and batch-fetch operations are well covered. However, hudu_write and hudu_delete are referenced throughout the descriptions but are absent from the tool list, leaving mutation and deletion workflows unreachable and creating a significant lifecycle gap for a CRUD-oriented Hudu API server.