Hudu

io.github.wyre-technologyPublished by GitHub account wyre-technologyv1.3.7Updated Nov 3, 2026

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

Overview

AI-generated overview

MCP server for Hudu IT documentation that lets an assistant list, read, create, update, archive and delete companies, assets, articles, passwords and websites.

What you can do
  • List, read, create, update, delete and archive companies, including a connection test
  • List, read, create, update, delete and archive assets, and manage asset layouts
  • List, read, create, update and delete asset passwords
  • List, read, create, update, delete and archive knowledge base articles
  • List, read, create, update and delete monitored websites
  • List folders, procedures, activity logs, relations and Magic Dash items, plus read-only resources for companies, assets and articles
When to use it
Useful when an assistant should work with an MSP or IT team's Hudu documentation: looking up client companies and their assets, drafting or updating knowledge base articles, or reviewing procedures and activity logs without leaving the chat.
Requirements
Runs locally over stdio (or HTTP Streamable) as a container image or from source with Node.js. Needs HUDU_BASE_URL and, for the classic REST mode, HUDU_API_KEY; without the key it uses an interactive OAuth browser flow against the instance's own MCP server. HTTP transport also needs CONDUIT_S2S_SECRET. Building from source needs a GitHub token with read:packages for the private npm registry.
Before you install
The API key grants access to Hudu documentation, including stored asset passwords, which the tools can read and modify. Create, update, delete and archive tools change real records. OAuth mode caches tokens in a credentials file under the home directory. HTTP mode requires CONDUIT_S2S_SECRET and should not be exposed publicly; the insecure dev flag is for local use only.

Installation

In SourceWeft

  1. Open Hudu in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

hudu-mcp

[CI] [License: Apache-2.0] [Node.js]

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).

[Deploy to DO]

[Deploy to Cloudflare Workers]

[!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:

bash
git clone https://github.com/WYRE-AI/hudu-mcp.gitcd 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 installnpm 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:

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:

json
{  "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.

bash
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:

bash
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.

bash
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:

bash
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:

bash
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

bash
# Install dependenciesnpm install
# Buildnpm run build
# Run in development modenpm run dev
# Clean build outputnpm run clean

License

Apache-2.0

Source: README.md at commit 5143738

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v1.3.7LatestSep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts