Skip to main content
Glama
iit-mcp-hudu

iit-mcp-hudu

Dispatch read operation

hudu_read
Read-only

Executes read-only Hudu documentation operations by registry key to retrieve companies, articles, assets, and password records with credentials and custom fields masked.

Instructions

Execute READ operations only, by registry key (hudu_list_operations, hudu_describe_operation). input is closed: unknown fields are CONFIG_ERROR naming valid ones. Results mask credentials, custom fields. Article bodies: single-article reads are Markdown, list rows HTML; lossy reads set markdown_lossy. Text-channel tolerance: an integer, number or boolean field also accepts the exact string literal of its value ("61" for an id, "true" for a flag); any other string is refused.

Input Schema

NameRequiredDescriptionDefault
inputNoThe operation's arguments as one closed object. Never put dry_run or confirm inside it.
operationYesRegistry key from hudu_list_operations, not a tool name.

Output Schema

NameRequiredDescriptionDefault
resultYes
operationYes
simulatedYes
markdown_lossyNo
markdown_lossy_codesNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv0.11.0
    • changedInput schema / properties / operation / enum
      Previous value: -[
      -  "activity_logs.findByResource",
      -  "activity_logs.resolve",
      -  "api_info.get",
      -  "api_info.resolve",
      -  "articles.findBySlug",
      -  "articles.get",
      -  "articles.getContext",
      -  "articles.getSection",
      -  "articles.resolve",
      -  "articles.search",
      -  "asset_layouts.get",
      -  "asset_layouts.resolve",
      -  "asset_passwords.findBySlug",
      -  "asset_passwords.get",
      -  "asset_passwords.getShare",
      -  "asset_passwords.listShares",
      -  "asset_passwords.resolve",
      -  "asset_passwords.search",
      -  "assets.findBySerial",
      -  "assets.get",
      -  "assets.getContext",
      -  "assets.resolve",
      -  "assets.search",
      -  "cards.jump",
      -  "cards.lookup",
      -  "cards.resolve",
      -  "companies.findByDomain",
      -  "companies.findBySlug",
      -  "companies.get",
      -  "companies.getContext",
      -  "companies.jump",
      -  "companies.resolve",
      -  "companies.search",
      -  "expirations.findByResource",
      -  "expirations.resolve",
      -  "flag_types.get",
      -  "flag_types.resolve",
      -  "flags.findByFlagable",
      -  "flags.get",
      -  "flags.resolve",
      -  "folders.get",
      -  "folders.resolve",
      -  "groups.get",
      -  "groups.resolve",
      -  "groups.search",
      -  "ip_addresses.findByAddress",
      -  "ip_addresses.get",
      -  "ip_addresses.resolve",
      -  "label_types.get",
      -  "label_types.resolve",
      -  "labels.findByLabelable",
      -  "labels.get",
      -  "labels.resolve",
      -  "lists.findByName",
      -  "lists.get",
      -  "lists.resolve",
      -  "magic_dash.findByCompany",
      -  "magic_dash.resolve",
      -  "matchers.findBySyncId",
      -  "matchers.resolve",
      -  "networks.findByAddress",
      -  "networks.get",
      -  "networks.resolve",
      -  "operations.fetchMany",
      -  "operations.resolveAny",
      -  "operations.searchAcrossResources",
      -  "operations.searchKnowledge",
      -  "password_folders.get",
      -  "password_folders.resolve",
      -  "password_folders.search",
      -  "procedure_tasks.get",
      -  "procedure_tasks.resolve",
      -  "procedures.get",
      -  "procedures.getWithTasks",
      -  "procedures.resolve",
      -  "rack_storage_items.get",
      -  "rack_storage_items.resolve",
      -  "rack_storages.get",
      -  "rack_storages.resolve",
      -  "relations.findByEndpoints",
      -  "relations.resolve",
      -  "users.findByEmail",
      -  "users.get",
      -  "users.resolve",
      -  "users.search",
      -  "vlan_zones.get",
      -  "vlan_zones.resolve",
      -  "vlans.findByVlanId",
      -  "vlans.get",
      -  "vlans.resolve",
      -  "websites.findBySlug",
      -  "websites.get",
      -  "websites.resolve",
      -  "websites.search"
      -]New value: +[
      +  "activity_logs.findByResource",
      +  "activity_logs.resolve",
      +  "api_info.get",
      +  "api_info.resolve",
      +  "articles.findBySlug",
      +  "articles.get",
      +  "articles.getContext",
      +  "articles.getSection",
      +  "articles.resolve",
      +  "articles.search",
      +  "asset_layouts.get",
      +  "asset_layouts.resolve",
      +  "asset_passwords.findBySlug",
      +  "asset_passwords.get",
      +  "asset_passwords.getShare",
      +  "asset_passwords.listShares",
      +  "asset_passwords.resolve",
      +  "asset_passwords.search",
      +  "assets.findBySerial",
      +  "assets.get",
      +  "assets.getContext",
      +  "assets.resolve",
      +  "assets.search",
      +  "cards.jump",
      +  "cards.lookup",
      +  "cards.resolve",
      +  "companies.findByDomain",
      +  "companies.findBySlug",
      +  "companies.get",
      +  "companies.getContext",
      +  "companies.jump",
      +  "companies.resolve",
      +  "companies.search",
      +  "expirations.findByResource",
      +  "expirations.resolve",
      +  "flag_types.get",
      +  "flag_types.resolve",
      +  "flags.findByFlagable",
      +  "flags.get",
      +  "flags.resolve",
      +  "folders.get",
      +  "folders.resolve",
      +  "groups.get",
      +  "groups.resolve",
      +  "groups.search",
      +  "ip_addresses.findByAddress",
      +  "ip_addresses.get",
      +  "ip_addresses.resolve",
      +  "label_types.get",
      +  "label_types.resolve",
      +  "labels.findByLabelable",
      +  "labels.get",
      +  "labels.resolve",
      +  "lists.findByName",
      +  "lists.get",
      +  "lists.resolve",
      +  "magic_dash.findByCompany",
      +  "magic_dash.resolve",
      +  "matchers.findBySyncId",
      +  "matchers.resolve",
      +  "networks.findByAddress",
      +  "networks.get",
      +  "networks.resolve",
      +  "operations.fetchMany",
      +  "operations.probeBodySearch",
      +  "operations.resolveAny",
      +  "operations.searchAcrossResources",
      +  "operations.searchKnowledge",
      +  "password_folders.get",
      +  "password_folders.resolve",
      +  "password_folders.search",
      +  "procedure_tasks.get",
      +  "procedure_tasks.resolve",
      +  "procedures.get",
      +  "procedures.getWithTasks",
      +  "procedures.resolve",
      +  "rack_storage_items.get",
      +  "rack_storage_items.resolve",
      +  "rack_storages.get",
      +  "rack_storages.resolve",
      +  "relations.findByEndpoints",
      +  "relations.resolve",
      +  "users.findByEmail",
      +  "users.get",
      +  "users.resolve",
      +  "users.search",
      +  "vlan_zones.get",
      +  "vlan_zones.resolve",
      +  "vlans.findByVlanId",
      +  "vlans.get",
      +  "vlans.resolve",
      +  "websites.findBySlug",
      +  "websites.get",
      +  "websites.resolve",
      +  "websites.search"
      +]
  2. Changed7 schema fields changedv0.6.0
    • removedInput schema / $schema
      Removed value: -"https://json-schema.org/draft/2020-12/schema"
    • changedInput schema / properties / input / description
      Previous value: -"The operation arguments as one object; validated against the registry record before any request. The field contract is closed: an unknown top-level field is a typed CONFIG_ERROR naming the accepted fields, which hudu_describe_operation serves as input_contract."New value: +"The operation's arguments as one closed object. Never put dry_run or confirm inside it."
    • changedInput schema / properties / operation / description
      Previous value: -"Canonical operation key (see hudu_list_operations). Exact registry key, never a tool name."New value: +"Registry key from hudu_list_operations, not a tool name."
    • changedInput schema / properties / operation / enum
      Previous value: -[
      -  "activity_logs.findByResource",
      -  "activity_logs.resolve",
      -  "api_info.get",
      -  "api_info.resolve",
      -  "articles.findBySlug",
      -  "articles.get",
      -  "articles.getContext",
      -  "articles.resolve",
      -  "articles.search",
      -  "asset_layouts.get",
      -  "asset_layouts.resolve",
      -  "asset_passwords.findBySlug",
      -  "asset_passwords.get",
      -  "asset_passwords.resolve",
      -  "asset_passwords.search",
      -  "assets.findBySerial",
      -  "assets.get",
      -  "assets.getContext",
      -  "assets.resolve",
      -  "assets.search",
      -  "cards.jump",
      -  "cards.lookup",
      -  "cards.resolve",
      -  "companies.findByDomain",
      -  "companies.findBySlug",
      -  "companies.get",
      -  "companies.getContext",
      -  "companies.jump",
      -  "companies.resolve",
      -  "companies.search",
      -  "expirations.findByResource",
      -  "expirations.resolve",
      -  "flag_types.get",
      -  "flag_types.resolve",
      -  "flags.findByFlagable",
      -  "flags.get",
      -  "flags.resolve",
      -  "folders.get",
      -  "folders.resolve",
      -  "groups.get",
      -  "groups.resolve",
      -  "groups.search",
      -  "ip_addresses.findByAddress",
      -  "ip_addresses.get",
      -  "ip_addresses.resolve",
      -  "label_types.get",
      -  "label_types.resolve",
      -  "labels.findByLabelable",
      -  "labels.get",
      -  "labels.resolve",
      -  "lists.findByName",
      -  "lists.get",
      -  "lists.resolve",
      -  "magic_dash.findByCompany",
      -  "magic_dash.resolve",
      -  "matchers.findBySyncId",
      -  "matchers.resolve",
      -  "networks.findByAddress",
      -  "networks.get",
      -  "networks.resolve",
      -  "operations.fetchMany",
      -  "operations.resolveAny",
      -  "operations.searchAcrossResources",
      -  "operations.searchKnowledge",
      -  "password_folders.get",
      -  "password_folders.resolve",
      -  "password_folders.search",
      -  "procedure_tasks.get",
      -  "procedure_tasks.resolve",
      -  "procedures.get",
      -  "procedures.getWithTasks",
      -  "procedures.resolve",
      -  "rack_storage_items.get",
      -  "rack_storage_items.resolve",
      -  "rack_storages.get",
      -  "rack_storages.resolve",
      -  "relations.findByEndpoints",
      -  "relations.resolve",
      -  "users.findByEmail",
      -  "users.get",
      -  "users.resolve",
      -  "users.search",
      -  "vlan_zones.get",
      -  "vlan_zones.resolve",
      -  "vlans.findByVlanId",
      -  "vlans.get",
      -  "vlans.resolve",
      -  "websites.findBySlug",
      -  "websites.get",
      -  "websites.resolve",
      -  "websites.search"
      -]New value: +[
      +  "activity_logs.findByResource",
      +  "activity_logs.resolve",
      +  "api_info.get",
      +  "api_info.resolve",
      +  "articles.findBySlug",
      +  "articles.get",
      +  "articles.getContext",
      +  "articles.getSection",
      +  "articles.resolve",
      +  "articles.search",
      +  "asset_layouts.get",
      +  "asset_layouts.resolve",
      +  "asset_passwords.findBySlug",
      +  "asset_passwords.get",
      +  "asset_passwords.getShare",
      +  "asset_passwords.listShares",
      +  "asset_passwords.resolve",
      +  "asset_passwords.search",
      +  "assets.findBySerial",
      +  "assets.get",
      +  "assets.getContext",
      +  "assets.resolve",
      +  "assets.search",
      +  "cards.jump",
      +  "cards.lookup",
      +  "cards.resolve",
      +  "companies.findByDomain",
      +  "companies.findBySlug",
      +  "companies.get",
      +  "companies.getContext",
      +  "companies.jump",
      +  "companies.resolve",
      +  "companies.search",
      +  "expirations.findByResource",
      +  "expirations.resolve",
      +  "flag_types.get",
      +  "flag_types.resolve",
      +  "flags.findByFlagable",
      +  "flags.get",
      +  "flags.resolve",
      +  "folders.get",
      +  "folders.resolve",
      +  "groups.get",
      +  "groups.resolve",
      +  "groups.search",
      +  "ip_addresses.findByAddress",
      +  "ip_addresses.get",
      +  "ip_addresses.resolve",
      +  "label_types.get",
      +  "label_types.resolve",
      +  "labels.findByLabelable",
      +  "labels.get",
      +  "labels.resolve",
      +  "lists.findByName",
      +  "lists.get",
      +  "lists.resolve",
      +  "magic_dash.findByCompany",
      +  "magic_dash.resolve",
      +  "matchers.findBySyncId",
      +  "matchers.resolve",
      +  "networks.findByAddress",
      +  "networks.get",
      +  "networks.resolve",
      +  "operations.fetchMany",
      +  "operations.resolveAny",
      +  "operations.searchAcrossResources",
      +  "operations.searchKnowledge",
      +  "password_folders.get",
      +  "password_folders.resolve",
      +  "password_folders.search",
      +  "procedure_tasks.get",
      +  "procedure_tasks.resolve",
      +  "procedures.get",
      +  "procedures.getWithTasks",
      +  "procedures.resolve",
      +  "rack_storage_items.get",
      +  "rack_storage_items.resolve",
      +  "rack_storages.get",
      +  "rack_storages.resolve",
      +  "relations.findByEndpoints",
      +  "relations.resolve",
      +  "users.findByEmail",
      +  "users.get",
      +  "users.resolve",
      +  "users.search",
      +  "vlan_zones.get",
      +  "vlan_zones.resolve",
      +  "vlans.findByVlanId",
      +  "vlans.get",
      +  "vlans.resolve",
      +  "websites.findBySlug",
      +  "websites.get",
      +  "websites.resolve",
      +  "websites.search"
      +]
    • removedOutput schema / $schema
      Removed value: -"https://json-schema.org/draft/2020-12/schema"
    • addedOutput schema / properties / markdown_lossy
      Added value: +{
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / markdown_lossy_codes
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  3. First observedv0.2.3

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already cover the safety profile, but the description adds substantial non-obvious behavior: the closed input object with CONFIG_ERROR naming valid fields, credential and custom-field masking in results, Markdown vs HTML article bodies with a markdown_lossy flag, and the string-literal tolerance rule for numeric/boolean fields. These are exactly the traits an agent cannot infer from structured fields.

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?

Front-loaded with the core action and the registry-key mechanism, and every subsequent sentence contributes distinct information (error shape, masking, lossiness, coercion). The compression is dense to the point of terseness in the "Text-channel tolerance" sentence, but nothing is wasted.

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?

An output schema exists, so return shape need not be described, and the description covers error behavior, masking, and content-format caveats well. It is light on pagination or result-size behavior for the list/search-style operations (fetchMany, searchAcrossResources), which matters for a read dispatcher.

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 100% and the enum of registry keys is fully enumerated, so the schema already carries most of the parameter meaning. The description's closed-object rule and string-literal coercion note add real value, but the constraint about dry_run/confirm duplicates the schema text rather than extending it. Baseline 3 fits when the schema does the heavy lifting.

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 scope ("Execute READ operations only") plus the addressing mechanism ("by registry key"), and names the discovery siblings in parentheses. An agent can immediately tell this is the generic dispatcher rather than a targeted helper like hudu_search or hudu_get_company_context.

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?

Points explicitly at hudu_list_operations and hudu_describe_operation as the way to obtain a valid registry key, which is the key prerequisite. It does not explain when to prefer this dispatcher over convenience siblings such as hudu_search or hudu_resolve_any, so routing between alternative paths is left partly to inference.

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