Hudu

Official registry Productivity

MCP server for Hudu IT documentation — companies, assets, articles, passwords, and procedures.

What can you do with Hudu?

  • 39 MCP tools covering all major Hudu resources
  • 6 MCP resources for direct data access
  • Dual auth mode: classic HUDU_API_KEY REST access, or oauth — a thin,
  • Dual 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

Install

Add this to your client's MCP configuration (Claude Desktop: claude_desktop_config.json; Cursor: .cursor/mcp.json; VS Code and others use the same "mcpServers" shape).

OCI package ghcr.io/wyre-ai/hudu-mcp:v1.4.4
Claude Code
claude mcp add hudu -e 'HUDU_API_KEY=<your hudu_api_key>' -e 'HUDU_BASE_URL=<HUDU_BASE_URL>' -e 'MCP_TRANSPORT=stdio' -e 'AUTH_MODE=env' -e 'LOG_LEVEL=info' -- docker run -i --rm ghcr.io/wyre-ai/hudu-mcp:v1.4.4
JSON configuration (Claude Desktop, Cursor, VS Code)
{
    "mcpServers": {
        "hudu": {
            "command": "docker",
            "args": [
                "run",
                "-i",
                "--rm",
                "ghcr.io/wyre-ai/hudu-mcp:v1.4.4"
            ],
            "env": {
                "HUDU_API_KEY": "<your hudu_api_key>",
                "HUDU_BASE_URL": "<HUDU_BASE_URL>",
                "MCP_TRANSPORT": "stdio",
                "AUTH_MODE": "env",
                "LOG_LEVEL": "info"
            }
        }
    }
}

Environment variables

  • HUDU_API_KEY required secret Hudu API key from your Hudu instance admin settings
  • HUDU_BASE_URL required Hudu instance base URL (e.g. https://yourcompany.huducloud.com)
  • MCP_TRANSPORT Transport mode for the server. Set to 'stdio' for local CLI use; the image defaults to 'http' for gateway hosting.
  • AUTH_MODE Credential source: 'env' reads vars locally, 'gateway' expects header injection from the WYRE MCP Gateway.
  • LOG_LEVEL Log verbosity: debug, info, warn, error

Documentation

From the project's README on GitHub, refreshed weekly. Links open on GitHub.

Contents
  1. hudu-mcp
  2. Features
  3. One-Click Deployment
  4. Installation
  5. Configuration
  6. Usage
  7. Tools (39)
  8. Resources
  9. Development
  10. License

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_KEY REST access, or oauth — a thin, authenticated proxy to a newer Hudu instance's own native MCP server
  • Dual 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

One-Click Deployment

[!IMPORTANT] 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.

  1. Create a GitHub Personal Access Token with the read:packages scope (classic token). Any GitHub account works — you do not need to be a member of the wyre-technology org to read its public packages.
  2. Add it as a build variable when prompted by the deploy flow:
    • DigitalOcean App Platform → set an encrypted env var named NODE_AUTH_TOKEN with scope Build Time to your PAT (the Dockerfile reads it via ARG NODE_AUTH_TOKEN to authenticate npm ci).
    • Cloudflare Workers → set a build variable named NODE_AUTH_TOKEN to your PAT (Workers → Settings → Build → Variables and Secrets).

[!NOTE] 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 a wrangler.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 build

The 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

VariableRequiredDefaultDescription
HUDU_BASE_URLYes-Your Hudu instance URL (e.g., https://docs.example.com)
HUDU_API_KEYNo-Your Hudu API key. Setting this selects api_key auth mode (see below); omitting it defaults to oauth mode.
HUDU_AUTH_MODENoauto-detectedExplicitly force api_key or oauth. Overrides the auto-detection below.
MCP_TRANSPORTNostdioTransport type: stdio or http
AUTH_MODENoenvenv reads HUDU_* from the environment. gateway requires X-Hudu-Base-URL and X-Hudu-API-Key on each /mcp request and does not fall back to those variables.
CONDUIT_S2S_SECRETYes for HTTP-Service-to-service secret. HTTP logs an error and exits non-zero when this is empty or a known placeholder (changeme, secret, replace-me, your-s2s-secret, and the other example values). Generate one with openssl rand -hex 32. Never commit a real value. The value is never logged.
MCP_ALLOW_INSECURE_DEVNo-Set to exactly 1 only for local development to start HTTP without CONDUIT_S2S_SECRET. The process logs a warning, does not enforce X-Gateway-S2S, and binds 127.0.0.1 only. A non-loopback MCP_HTTP_HOST is ignored and the override is logged. A known placeholder secret still refuses to start.
MCP_HTTP_PORTNo8080HTTP server port (when using http transport)
MCP_HTTP_HOSTNo127.0.0.1Bind address when a real CONDUIT_S2S_SECRET is set. The container image sets 0.0.0.0. Without a real secret the listener is forced to 127.0.0.1.
MCP_SERVER_NAMENohudu-mcpServer name reported to MCP clients
MCP_SERVER_VERSIONNo1.0.0Server version reported to MCP clients
LOG_LEVELNoinfoLog level: error, warn, info, debug
LOG_FORMATNosimpleLog format: json or simple
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 when HUDU_API_KEY is set) — the classic mode. This server calls Hudu's REST API directly via @wyre-technology/node-hudu and 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 when HUDU_API_KEY is 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 mode hudu-mcp does not reimplement any tools; it acts as a thin, authenticated proxy that forwards MCP requests straight through to {HUDU_BASE_URL}/mcp and 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:

    1. hudu-mcp discovers the instance's OAuth metadata from {HUDU_BASE_URL}/.well-known/oauth-protected-resource/mcp and {HUDU_BASE_URL}/.well-known/oauth-authorization-server.
    2. It registers itself as a public OAuth client via Dynamic Client Registration (once per Hudu instance — the issued client_id is cached).
    3. It prints an authorization URL to stderr. Open it in a browser and approve access.
    4. A short-lived local server on http://127.0.0.1:<ephemeral-port>/callback catches the redirect and exchanges the code for tokens.
    5. Tokens are cached at ~/.hudu-mcp/credentials-<hash-of-base-url>.json (file mode 0600), 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.1 on the machine running hudu-mcp, it works for stdio (always local to the calling MCP client) and for a self-hosted http transport running on the same machine you're browsing from — e.g. local testing on localhost:8080. It does not work for an http transport 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 — setting HUDU_AUTH_MODE=oauth together with AUTH_MODE=gateway is a startup error.

    HTTP transport (both api_key and oauth) also requires CONDUIT_S2S_SECRET or MCP_ALLOW_INSECURE_DEV=1. The dev flag binds 127.0.0.1 only. See HTTP authentication. The stdio transport does not use CONDUIT_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 start

Local 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 start
HTTP 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 up

The 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-mcp

Tools (39)

Companies (8 tools)
ToolDescription
hudu_list_companiesList companies with optional filters
hudu_get_companyGet a company by ID
hudu_create_companyCreate a new company
hudu_update_companyUpdate an existing company
hudu_delete_companyDelete a company
hudu_archive_companyArchive a company
hudu_unarchive_companyUnarchive a company
hudu_test_connectionTest the connection to Hudu API
Assets (6 tools)
ToolDescription
hudu_list_assetsList assets with optional filters
hudu_get_assetGet an asset by ID
hudu_create_assetCreate a new asset
hudu_update_assetUpdate an existing asset
hudu_delete_assetDelete an asset
hudu_archive_assetArchive an asset
Asset Layouts (4 tools)
ToolDescription
hudu_list_asset_layoutsList asset layouts
hudu_get_asset_layoutGet an asset layout by ID
hudu_create_asset_layoutCreate a new asset layout
hudu_update_asset_layoutUpdate an existing asset layout
Asset Passwords (5 tools)
ToolDescription
hudu_list_asset_passwordsList asset passwords
hudu_get_asset_passwordGet an asset password by ID
hudu_create_asset_passwordCreate a new asset password
hudu_update_asset_passwordUpdate an existing asset password
hudu_delete_asset_passwordDelete an asset password
Articles (6 tools)
ToolDescription
hudu_list_articlesList knowledge base articles
hudu_get_articleGet an article by ID
hudu_create_articleCreate a new article
hudu_update_articleUpdate an existing article
hudu_delete_articleDelete an article
hudu_archive_articleArchive an article
Websites (5 tools)
ToolDescription
hudu_list_websitesList monitored websites
hudu_get_websiteGet a website by ID
hudu_create_websiteCreate a new website
hudu_update_websiteUpdate an existing website
hudu_delete_websiteDelete a website
Other Resources (5 tools)
ToolDescription
hudu_list_foldersList folders
hudu_list_proceduresList procedures
hudu_list_activity_logsList activity logs
hudu_list_relationsList relations
hudu_list_magic_dashList Magic Dash items

Resources

URIDescription
hudu://companiesList of all companies
hudu://companies/{id}Company details by ID
hudu://assetsList of all assets
hudu://assets/{id}Asset details by ID
hudu://articlesList of all articles
hudu://articles/{id}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 clean

License

Apache-2.0

Frequently asked questions

What is Hudu?

MCP server for Hudu IT documentation — companies, assets, articles, passwords, and procedures.

How do I install Hudu?

It runs on your machine. In Claude Code: claude mcp add hudu -e 'HUDU_API_KEY=<your hudu_api_key>' -e 'HUDU_BASE_URL=<HUDU_BASE_URL>' -e 'MCP_TRANSPORT=stdio' -e 'AUTH_MODE=env' -e 'LOG_LEVEL=info' -- docker run -i --rm ghcr.io/wyre-ai/hudu-mcp:v1.4.4. For other clients, paste the JSON configuration from this page into their MCP settings.

Does Hudu need an API key?

Yes. It expects HUDU_API_KEY, HUDU_BASE_URL, which you set in its configuration.

Is Hudu open source?

Yes. Its code is on GitHub under the Apache-2.0 license.

Who maintains Hudu?

It is published by WYRE-AI. AI.tn lists it but does not maintain or endorse it.

From the official MCP Registry. Listing is not an endorsement: review a server's code and permissions before giving it access to your data.