hudu-mcp
hudu-mcp is a community Model Context Protocolserver for the Hudu IT documentation REST API. It exposes thedocumented v1 API — companies, assets, knowledge base articles, credentialrecords, IPAM, racks, website monitors, relations, integrations, the audit trailand the export triggers — as 89 MCP tools, and it withholds stored passwords andTOTP secrets from every response unless an operator has explicitly turned thatoff. It is aimed at MSPs and internal IT teams who want an assistant that canread and maintain their Hudu tenant over a local stdio connection, using an APIkey they scope themselves.
Before you install this, look at Hudu's own MCP server
Hudu ships a first-party MCP server built into the product. It is served fromyour own instance at https://<your-instance>/mcp, it authenticates with HuduOAuth rather than a long-lived API key, and it is enabled fromAdmin → External Apps → Model Context Protocol. Per Hudu's documentation itcovers articles (create, read, update), activity logs (read) and assets (readonly), and it deliberately excludes passwords, asset writes and deletions.
For a large number of people that is the better choice, and you should notinstall this project reflexively.
| Hudu's MCP server | hudu-mcp (this project) |
|
|---|---|---|
| Maintained by | Hudu Technologies, Inc. | Zenix Solutions, community project |
| Where it runs | Inside your Hudu instance, at /mcp |
A local process next to your MCP client |
| Transport | Remote HTTP, reachable from hosted clients | stdio only (see compatibility) |
| Authentication | Hudu OAuth, per user | A Hudu API key you create and scope |
| Enabled by | Admin → External Apps → Model Context Protocol | Installing and configuring this package |
| Articles | Create, read, update | Create, read, update, archive, delete |
| Assets | Read only | Full CRUD, plus archive and layouts |
| Activity log | Read | Read, and purge behind two gates |
| Passwords | Excluded entirely | Metadata by default; secrets behind a gate |
| Deletions | Excluded entirely | Behind HUDU_ALLOW_DESTRUCTIVE and confirm: true |
| IPAM, racks, websites, relations, matchers, exports | Not covered | Covered |
| Support | Hudu support | GitHub issues, best effort |
Use Hudu's server if what you need is article and asset reading with somearticle authoring, if you want per-user OAuth rather than a shared API key, ifyou need a hosted client to reach it over HTTP, or if you want something you canraise a support ticket about. Its narrower surface is a design decision, not anomission: a server that cannot delete anything and cannot read a password has amuch smaller worst case than this one.
Use hudu-mcp if you need the parts of the API Hudu's server does not cover —IPAM, racks, website monitors, relations, integration matchers, expirations,users, the audit trail — or if you need asset and password writes, or if you wantcapability gates you control from the environment rather than a fixed surface.
The two can coexist. Nothing here depends on Hudu's server being off.
Quick start
Requires Node.js 20 or newer and a Hudu API key.
npx @zenixsolutions/hudu-mcp --version
Configure your MCP client to launch it over stdio. The block below is thestandard shape and works in Claude Desktop, Claude Code and any other clientthat starts a local stdio server:
{
"mcpServers": {
"hudu": {
"command": "npx",
"args": ["-y", "@zenixsolutions/hudu-mcp"],
"env": {
"HUDU_BASE_URL": "https://hudu.example.com",
"HUDU_API_KEY": "your-api-key",
"HUDU_READ_ONLY": "1"
}
}
}
}
That configuration registers 40 read tools and nothing that can change or deleteanything. Drop HUDU_READ_ONLY when you want writes; seeSecurity model before you do.
Verify a configuration without starting a session:
HUDU_BASE_URL=https://hudu.example.com HUDU_API_KEY=... npx @zenixsolutions/hudu-mcp --check
HUDU_BASE_URL=https://hudu.example.com HUDU_API_KEY=... npx @zenixsolutions/hudu-mcp --list-tools
--list-tools prints the tools that would be registered under the currentenvironment, plus the ones being withheld and why. It is the fastest way toconfirm a gate is set the way you think it is.
Longer walkthrough: docs/quickstart.md. Other installmethods: docs/installation.md.
Getting an API key
Create the key in Hudu at Admin → Basic Information → API Keys.
Hudu's own API documentation lists five scoping options on a key:
- Access to passwords, covering all REST actions on them
- Ability to perform destructive actions, meaning
DELETE - Ability to perform exports
- Whitelisted IP addresses
- Company scopes
These options can only be configured when the key is created. They cannot bechanged afterwards; a different scope means a new key. Create the key with theleast this server needs and no more:
- Leave password access off unless you intend to set
HUDU_ALLOW_PASSWORD_REVEAL=1. - Leave destructive actions off unless you intend to set
HUDU_ALLOW_DESTRUCTIVE=1. - Leave export capability off unless you intend to set
HUDU_ALLOW_EXPORTS=1. - Set the IP allowlist if the machine running this server has a stable address.
- Set a company scope if the key only ever needs one customer.
A key created without password access is a harder boundary than any setting inthis software. HUDU_ALLOW_PASSWORD_REVEAL is a decision made by the operator inan environment variable, and it is enforced by code in this repository — codethat can have bugs, and that runs in the same process as a model readingattacker-influenced text. A key that Hudu will not let read /asset_passwords atall is enforced by Hudu, on the other side of the network, where nothing in thisprocess can reach it. Prefer that boundary whenever you can live with it.
Hudu's API documentation notes that a key can be created and deleted at anytime. Deleting the key is the fastest way to revoke this server's access.
Configuration
Everything is read from the environment. Nothing is read from disk, and nocredential is accepted as a tool argument.
| Variable | Default | What it does |
|---|---|---|
HUDU_BASE_URL |
required | Your Hudu instance origin, e.g. https://hudu.example.com. A trailing slash or a trailing /api/v1 is normalised away; the client adds /api/v1 itself. |
HUDU_API_KEY |
required | The key from Admin → Basic Information → API Keys. Sent as the x-api-key header. |
HUDU_READ_ONLY |
off | Register only Read tools. Nothing can create, update, archive, delete, export or purge. 40 tools instead of 70. |
HUDU_ALLOW_DESTRUCTIVE |
off | Register the 16 delete and purge tools, including the activity-log purge. |
HUDU_ALLOW_PASSWORD_REVEAL |
off | Register hudu_reveal_password, which returns one stored secret per call. Password metadata is available without it. |
HUDU_ALLOW_EXPORTS |
off | Register the two bulk export tools. |
HUDU_RATE_LIMIT_PER_MINUTE |
120 |
Client-side request ceiling. Must be a positive integer no greater than 300, which is the limit Hudu documents. |
HUDU_MAX_CONCURRENCY |
4 |
Simultaneous in-flight requests. Maximum 32. |
HUDU_REQUEST_TIMEOUT_MS |
30000 |
Per-request timeout in milliseconds. Maximum 600000. |
HUDU_MAX_RETRIES |
3 |
Retries for transient failures (timeouts, network errors, 429, 5xx), with full-jitter backoff. 0 to 10. |
The four gates are booleans. 1, true, yes and on (any case, surroundingwhitespace ignored) enable them; anything else, including an unset variable,leaves them off.
Setting HUDU_READ_ONLY and HUDU_ALLOW_DESTRUCTIVE together is rejected atstartup with exit code 78 rather than silently resolved. Read-only would win, butthe combination almost always means someone believes a delete is available whenit is not.
Invalid configuration reports every problem at once and exits 78, so amisconfigured install is fixed in one pass rather than one variable per restart.
Security model
Read SECURITY.md for the reporting process and the full model, anddocs/security.md for the threat model and residual risks.The short version:
Nothing permissive is on by default. Out of the box the server registers 70tools: reads, creates and updates. Deletions, password reveal and exports are allabsent until an operator sets the matching variable. A gated tool is notregistered at all rather than registered-and-refusing, because a tool a modelcannot see is a tool it cannot be talked into calling.
Four gates, all environment-only. HUDU_READ_ONLY,HUDU_ALLOW_DESTRUCTIVE, HUDU_ALLOW_PASSWORD_REVEAL and HUDU_ALLOW_EXPORTSare read in src/config.ts and nowhere else. There is no tool argument thatenables, overrides or softens any of them.
Passwords are withheld because of how the Hudu API is shaped. TheAsset_Password model lists password ("The actual password string") andotp_secret ("Secret key for one-time passwords") among its requiredproperties, and GET /asset_passwords returns an array of that model(docs/reference/spec-defects.md A1). A single unfiltered list call thereforereturns every credential and every TOTP seed the key can see. This server stripsthose two fields recursively from every tool result, centrally, inexecuteTool — leaving a placeholder so a model can tell a value exists — andrenders Markdown from the stripped payload rather than the raw record, andscrubs the rendered text by value behind that. The only exception ishudu_reveal_password, which needs HUDU_ALLOW_PASSWORD_REVEAL=1, an explicitconfirm: true, and one specific record id. There is no bulk reveal.
Destructive work needs two independent keys. The operator'sHUDU_ALLOW_DESTRUCTIVE decides whether the 16 destructive tools exist at all;the model's confirm: true argument then has to be supplied per call, with theimpact stated in the tool description. These are not redundant, and they are notequal: confirm is supplied by the model, so it is a prompt-level speed bump. Theenvironment flag is the gate a confused or manipulated agent cannot open. Thesame pair guards the two Admin-class export tools.
The API key's scope sits outside all of this and is the outermost boundary.See Getting an API key.
Tool surface
89 tools with every gate open, 70 with the defaults, 40 in read-only mode.
| Resource group | Tools | Registered by default | In read-only mode |
|---|---|---|---|
| Companies | 8 | 7 | 4 |
| Assets | 7 | 6 | 3 |
| Asset layouts | 4 | 4 | 2 |
| Articles | 6 | 5 | 2 |
| Folders | 5 | 4 | 2 |
| Procedures | 3 | 3 | 2 |
| Passwords and password folders | 9 | 7 | 4 |
| Networks and IP addresses | 10 | 8 | 4 |
| Racks and rack items | 10 | 8 | 4 |
| Websites | 5 | 4 | 2 |
| Relations | 3 | 2 | 1 |
| Magic Dash | 4 | 2 | 1 |
| Matchers | 3 | 2 | 1 |
| Instance, users, audit trail, expirations | 6 | 5 | 5 |
| Files and photos | 4 | 3 | 3 |
| Exports | 2 | 0 | 0 |
| Total | 89 | 70 | 40 |
By operation class: 41 Read, 13 Create, 17 Update, 16 Destructive, 2Admin. hudu_reveal_password is classed Read because it does not modifyHudu, so it remains available in read-only mode whenHUDU_ALLOW_PASSWORD_REVEAL is also set — read-only mode restricts writes, notdisclosure.
Every tool, with its arguments and gates: docs/tool-reference.md.Task-oriented recipes: docs/user-guide.md.
Limitations
The Hudu v1 API cannot answer some questions that people reasonably expect it to,and this server reports those gaps rather than papering over them. The ones mostlikely to affect you:
- No collection endpoint returns a total count — no envelope, no
total, noX-Total-Count, noLinkheader (C1). This server therefore emits neithertotalnorhas_more. Readpage_was_fullandpagination_note, and nevertreat a full page as a complete list. - Five collections have no pagination at all — networks, IP addresses, racks,rack items and uploads (C2). They return everything matching your filters inone response, and if that response is trimmed to fit the output budget there isno next page to ask for.
- A rack's contents cannot be listed (C4). No field or filter ties a rack itemto its rack.
- Exports can be started but never retrieved (C6). There is no statusendpoint and no download URL in this API version.
- File upload is not implemented (E1). The endpoints are
multipart/form-dataand the contract documents no request body for them. - A 403 is documented nowhere (A7), so a key-scope failure is hard todistinguish from a missing record.
The full list, with the evidence behind each item:docs/limitations.md.
Documentation
| Document | Contents |
|---|---|
| docs/quickstart.md | Five minutes from nothing to a working tool call |
| docs/installation.md | npx, global install, from source, per-client configuration |
| docs/user-guide.md | MSP workflows, with the tool sequence for each |
| docs/tool-reference.md | All 89 tools: class, arguments, gates |
| docs/limitations.md | What this API cannot do, and why |
| docs/compatibility.md | Node versions, MCP protocol revisions, clients |
| docs/security.md | Threat model, controls, residual risks |
| docs/reference/spec-defects.md | Findings against the captured Hudu API contract |
| CHANGELOG.md | Release history |
Contributing
See CONTRIBUTING.md. It states plainly which steps CI enforcesand which are convention. Pre-1.0, the tool surface is not stable: a minorversion may add, rename or remove tools.
Security reporting
Report vulnerabilities privately throughGitHub Security Advisories,not as a public issue. See SECURITY.md.
Licence
MIT. See LICENSE.
Disclaimer
This project is not affiliated with, endorsed by, or supported by HuduTechnologies, Inc. "Hudu" is used nominatively, to identify the product thissoftware interoperates with. Hudu is a trademark of its respective owner. Forsupport of the Hudu platform itself, including its own MCP server, contact Hudu.