hudu-mcp
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.
hudu-mcp
MCP (Model Context Protocol) server for Hudu IT documentation platform. Provides 39 tools and 6 resources for managing companies, assets, articles, passwords, websites, and more through any MCP-compatible client.
Features
39 MCP tools covering all major Hudu resources
6 MCP resources for direct data access
Dual auth mode: classic
HUDU_API_KEYREST access, oroauth— a thin, authenticated proxy to a newer Hudu instance's own native MCP serverDual transport support: stdio (default) and HTTP Streamable
Lazy initialization - SDK client created on first tool call
Connection testing built-in
All logging to stderr to avoid polluting MCP stdio transport
Related MCP server: redmine-mcp
One-Click Deployment
Before you click: this server depends on @wyre-technology/node-hudu,
which is hosted on the GitHub Packages npm registry. GitHub Packages has no
anonymous access — even though the package is public, every npm install needs a
token. The cloud builder runs npm install for you, so you must give it one, or
the build fails with npm error 401 Unauthorized ... npm.pkg.github.com.
Create a GitHub Personal Access Token with the
read:packagesscope (classic token). Any GitHub account works — you do not need to be a member of thewyre-technologyorg to read its public packages.Add it as a build variable when prompted by the deploy flow:
DigitalOcean App Platform → set an encrypted env var named
NODE_AUTH_TOKENwith scope Build Time to your PAT (theDockerfilereads it viaARG NODE_AUTH_TOKENto authenticatenpm ci).Cloudflare Workers → set a build variable named
NODE_AUTH_TOKENto your PAT (Workers → Settings → Build → Variables and Secrets).
The DigitalOcean target builds the full Docker image and runs the complete MCP
server over HTTP — this is the recommended path for operators. This repo does not
ship awrangler.json/Workers entrypoint, so for a self-hosted server prefer
DigitalOcean or the prebuilt container image (ghcr.io/wyre-ai/hudu-mcp).
Installation
This project depends on @wyre-technology/node-hudu, published to the GitHub
Packages npm registry, which requires a token even for public packages.
Authenticate npm once before installing:
git clone https://github.com/WYRE-AI/hudu-mcp.git
cd hudu-mcp
# Authenticate npm to GitHub Packages (token needs the read:packages scope)
export NODE_AUTH_TOKEN=$(gh auth token) # or a PAT with read:packages
npm install
npm run buildThe repo's .npmrc already points the @wyre-technology scope at GitHub Packages and
reads the token from NODE_AUTH_TOKEN, so no further config is needed.
Configuration
Variable | Required | Default | Description |
| Yes | - | Your Hudu instance URL (e.g., |
| No | - | Your Hudu API key. Setting this selects api_key auth mode (see below); omitting it defaults to oauth mode. |
| No | auto-detected | Explicitly force |
| No |
| Transport type: |
| No |
|
|
| Yes for HTTP | - | Service-to-service secret. HTTP logs an error and exits non-zero when this is empty or a known placeholder ( |
| No | - | Set to exactly |
| No |
| HTTP server port (when using |
| No |
| Bind address when a real |
| No |
| Server name reported to MCP clients |
| No |
| Server version reported to MCP clients |
| No |
| Log level: |
| No |
| Log format: |
Authentication modes
This server talks to Hudu in one of two ways. HUDU_AUTH_MODE picks between
them; if it's unset, the mode is auto-detected from whether HUDU_API_KEY
is set:
api_key(auto-selected whenHUDU_API_KEYis set) — the classic mode. This server calls Hudu's REST API directly via@wyre-technology/node-huduand implements all 39 tools itself, exactly as before. This is the mode every existing deployment already uses, and it is 100% unchanged and unaffected by everything below.oauth(auto-selected whenHUDU_API_KEYis not set) — for newer Hudu instances that expose their own native MCP server (Hudu Admin -> External Apps -> MCP), protected by interactive OAuth rather than a static API key. In this modehudu-mcpdoes not reimplement any tools; it acts as a thin, authenticated proxy that forwards MCP requests straight through to{HUDU_BASE_URL}/mcpand relays the responses back, so you automatically get whatever tool surface that Hudu instance exposes.The OAuth flow (RFC 9728/8414 discovery, RFC 7591 Dynamic Client Registration, PKCE
authorization_code, no client secret — this is a public client) runs the first time a request needs a token:hudu-mcpdiscovers the instance's OAuth metadata from{HUDU_BASE_URL}/.well-known/oauth-protected-resource/mcpand{HUDU_BASE_URL}/.well-known/oauth-authorization-server.It registers itself as a public OAuth client via Dynamic Client Registration (once per Hudu instance — the issued
client_idis cached).It prints an authorization URL to stderr. Open it in a browser and approve access.
A short-lived local server on
http://127.0.0.1:<ephemeral-port>/callbackcatches the redirect and exchanges the code for tokens.Tokens are cached at
~/.hudu-mcp/credentials-<hash-of-base-url>.json(file mode0600), and transparently refreshed on later runs — you should only see the browser prompt again if the refresh token itself expires or is revoked.
Because this flow needs a browser that can reach a callback server bound to
127.0.0.1on the machine runninghudu-mcp, it works forstdio(always local to the calling MCP client) and for a self-hostedhttptransport running on the same machine you're browsing from — e.g. local testing onlocalhost:8080. It does not work for anhttptransport deployed to a remote host you don't have browser-level access to (a cloud VM, a container, etc.): your browser can't reach that machine's own loopback interface to complete the redirect, so the first-run authorization would hang. This is unrelated to gateway mode (AUTH_MODE=gateway), which is a stateless multi-tenant proxy with credentials injected per request via headers and has no single user to run a browser flow for at all — settingHUDU_AUTH_MODE=oauthtogether withAUTH_MODE=gatewayis a startup error.HTTP transport (both
api_keyandoauth) also requiresCONDUIT_S2S_SECRETorMCP_ALLOW_INSECURE_DEV=1. The dev flag binds127.0.0.1only. See HTTP authentication. The stdio transport does not useCONDUIT_S2S_SECRET.
Usage
Claude Desktop (stdio)
Add to your claude_desktop_config.json:
{
"mcpServers": {
"hudu": {
"command": "node",
"args": ["/path/to/hudu-mcp/dist/entry.js"],
"env": {
"HUDU_BASE_URL": "https://docs.example.com",
"HUDU_API_KEY": "your-api-key"
}
}
}
}For a newer Hudu instance with its own native MCP server (see
Authentication modes), omit HUDU_API_KEY and only set
HUDU_BASE_URL — hudu-mcp will print an authorization URL to the terminal the
first time it's launched:
{
"mcpServers": {
"hudu": {
"command": "node",
"args": ["/path/to/hudu-mcp/dist/entry.js"],
"env": {
"HUDU_BASE_URL": "https://docs.example.com"
}
}
}
}HTTP Transport
/health stays unauthenticated and does not read credentials.
CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" \
HUDU_BASE_URL=https://docs.example.com \
HUDU_API_KEY=your-api-key \
MCP_TRANSPORT=http \
MCP_HTTP_PORT=8080 \
npm startLocal HTTP without a service-to-service secret is development-only. It binds 127.0.0.1 and logs a warning:
MCP_TRANSPORT=http MCP_ALLOW_INSECURE_DEV=1 npm startHTTP authentication
With MCP_TRANSPORT=http and a real CONDUIT_S2S_SECRET, every /mcp request must include X-Gateway-S2S. The check is verifyS2sHeader in src/mcp/s2s-verify.ts: the header value is t=<unix seconds>,v1=<hex>, where the hex is HMAC-SHA256 of the literal string t=<unix seconds> keyed with CONDUIT_S2S_SECRET (64 lowercase hex characters). The timestamp must be within 300 seconds of the server clock. A missing or invalid header is HTTP 401, before Hudu credentials are read.
TS=$(date +%s)
SIG=$(printf 't=%s' "$TS" | openssl dgst -sha256 -hmac "$CONDUIT_S2S_SECRET" -hex | awk '{print $NF}')
curl -sS http://127.0.0.1:8080/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H "X-Gateway-S2S: t=${TS},v1=${SIG}" \
-H "X-Hudu-Base-URL: $HUDU_BASE_URL" \
-H "X-Hudu-API-Key: $HUDU_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'In AUTH_MODE=gateway, /mcp also requires X-Hudu-Base-URL and X-Hudu-API-Key. Those headers are the only credential source for that request. A missing header is HTTP 401 and does not fall back to HUDU_BASE_URL or HUDU_API_KEY in the environment.
Compose refuses to start when CONDUIT_S2S_SECRET is unset. The gateway service sets AUTH_MODE=gateway, does not inject HUDU_BASE_URL or HUDU_API_KEY, and publishes 127.0.0.1:8080:8080:
CONDUIT_S2S_SECRET=your-s2s-secret docker compose upThe image listens on 0.0.0.0 inside the container and still refuses to start without a real secret. Publish the port on loopback:
docker run \
-e CONDUIT_S2S_SECRET=your-s2s-secret \
-e AUTH_MODE=gateway \
-p 127.0.0.1:8080:8080 \
ghcr.io/wyre-ai/hudu-mcpTools (39)
Companies (8 tools)
Tool | Description |
| List companies with optional filters |
| Get a company by ID |
| Create a new company |
| Update an existing company |
| Delete a company |
| Archive a company |
| Unarchive a company |
| Test the connection to Hudu API |
Assets (6 tools)
Tool | Description |
| List assets with optional filters |
| Get an asset by ID |
| Create a new asset |
| Update an existing asset |
| Delete an asset |
| Archive an asset |
Asset Layouts (4 tools)
Tool | Description |
| List asset layouts |
| Get an asset layout by ID |
| Create a new asset layout |
| Update an existing asset layout |
Asset Passwords (5 tools)
Tool | Description |
| List asset passwords |
| Get an asset password by ID |
| Create a new asset password |
| Update an existing asset password |
| Delete an asset password |
Articles (6 tools)
Tool | Description |
| List knowledge base articles |
| Get an article by ID |
| Create a new article |
| Update an existing article |
| Delete an article |
| Archive an article |
Websites (5 tools)
Tool | Description |
| List monitored websites |
| Get a website by ID |
| Create a new website |
| Update an existing website |
| Delete a website |
Other Resources (5 tools)
Tool | Description |
| List folders |
| List procedures |
| List activity logs |
| List relations |
| List Magic Dash items |
Resources
URI | Description |
| List of all companies |
| Company details by ID |
| List of all assets |
| Asset details by ID |
| List of all articles |
| Article details by ID |
Development
# Install dependencies
npm install
# Build
npm run build
# Run in development mode
npm run dev
# Clean build output
npm run cleanLicense
This server cannot be deployed
Maintenance
Related MCP Connectors
Host any HTTP API as a standard MCP server; auto-distribute to 12+ mainstream agent platforms.
An MCP server that provides read access to your cloud storage providers, bank accounts and more.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
Related MCP Servers
- FlicenseAqualityNot gradedmaintenanceAn MCP server that enables LLMs to interact with IT Glue documentation, including organizations, configurations, passwords, and flexible assets. It provides tools for listing, creating, and updating managed service provider (MSP) data through the IT Glue API.31-
- FlicenseNot gradedqualityDmaintenanceAn MCP server providing 63 tools to interact with Redmine instances, covering issues, projects, time entries, and wiki pages. It utilizes streamable HTTP transport and supports per-client authentication for secure management of Redmine resources.4 npm-
- AlicenseBqualityAmaintenanceAn MCP server for CIPP (Community IT Professionals Platform), enabling MSPs to manage Microsoft 365 tenants, users, policies, and security settings through CIPP's API.4912Apache 2.0
- AlicenseBqualityCmaintenanceAn MCP server for IT Glue that provides 56 tools for managing organizations, configurations, passwords, documents, flexible assets, contacts, locations, users, groups, attachments, related items, and bulk operations, with built-in rate limiting, caching, and security guards.5636 npm1MIT