-
Notifications
You must be signed in to change notification settings - Fork 0
Installation Guide
mcp-hugo-server-go runs in two transport modes, built from the same binary. They serve different purposes — pick based on who you are, not which one sounds more advanced.
| Remote HTTP + OAuth | Local stdio | |
|---|---|---|
| Who it's for | Multi-user / shared instance (this project's own mcp.arleo.eu) |
One person editing their own Hugo site |
| Auth | OAuth 2.1, read/write/admin scopes (see OAuth Clients and Scopes) |
None — stdio's whole premise is a trusted local single-user process |
| Setup cost | Reverse proxy, TLS cert, OAuth client registration | Download a binary (or npx), point it at your site |
| Install methods | Self-hosted only |
npx, npm global install, or a .mcpb desktop extension (download from GitHub Releases; Directory listing submitted, pending review) |
Both modes are documented in the main repository README's ## Installation and ## Privacy policy sections — this page goes one level deeper operationally, and covers the same two production configs referenced elsewhere in this wiki (Live Deployment Runbook, OAuth Clients and Scopes).
This is what backs https://mcp.arleo.eu/mcp — see Live Deployment Runbook for the full deploy pipeline and OAuth Clients and Scopes for client registration. Summary for a fresh self-hosted instance:
- Build or download the
linux/amd64binary. - Write a
config.yamlwithtransport: http,oauth.enabled: true,site_rootpointed at your Hugo build output (not your project root —site_rootmust be thepublic/directory Hugo builds into, nothugo_rootitself; see Pitfall Anonymous vs Authenticated Server for a related scope-boundary pitfall and the operator guide'ssite_rootfield description for why this specific mistake silently ingests raw theme templates as content). - Put a TLS-terminating reverse proxy in front of it (production uses OpenResty — see
docs/examples/agent-ready/openresty-mcp.arleo.eu.conffor a reference vhost). - Register OAuth clients per OAuth Clients and Scopes —
readis self-serve DCR,writerequires a registered client with a secret. - Point MCP clients (Claude.ai, Claude Desktop, ChatGPT, Le Chat) at
https://your-host/mcpper Client Compatibility.
This mode is unaffected by anything in the stdio/npx section below — the two transports share only the underlying tool implementations, not any runtime state or code path (server.New vs server.NewStdio, see the repository's internal/server/server.go).
No OAuth, no reverse proxy, no TLS. The client (Claude Desktop, or any MCP host that can launch a local subprocess) spawns the binary directly and talks JSON-RPC over stdin/stdout. Write access is granted unconditionally over this transport — that is deliberate, not an oversight: stdio's entire premise is a trusted local single-user process, and a read-only bundle couldn't do what this distribution channel exists for (create/update/publish content on your own site).
npx @jmrgrav/mcp-hugo-server-go
# or install globally:
npm install -g @jmrgrav/mcp-hugo-server-goThis is a thin wrapper (esbuild/ripgrep pattern, npm/ in the repository) — npm install downloads the real Go binary matching the package's version from GitHub Releases and verifies its SHA-256 checksum against the release's checksums.txt. No Go toolchain needed on the machine running it.
Configuration, since there's no config.yaml in an npx context, is via environment variables:
MCP_HUGO_SITE_ROOT=/path/to/your/hugo-site/public \
MCP_HUGO_HUGO_ROOT=/path/to/your/hugo-site \
MCP_HUGO_CONTENT_ROOT=/path/to/your/hugo-site/content \
MCP_HUGO_SITE_URL=https://your-site.example.com \
npx @jmrgrav/mcp-hugo-server-goA config.yaml file, if you have one, takes precedence — env vars only fill in fields the file (or its absence) leaves empty.
Download the release asset matching your OS/arch from GitHub Releases (mcp-hugo-server-go_<os>_<arch>, e.g. mcp-hugo-server-go_darwin_arm64, mcp-hugo-server-go_windows_amd64.exe), then run it with either MCP_HUGO_SERVER_CONFIG=/path/to/config.yaml pointing at a file with transport: stdio, or the same MCP_HUGO_* env vars as above.
- Download the
.mcpbfile attached to the latest release (built and attached automatically as part of the release pipeline, using.mcpbignoreat the repo root to keep it scoped to just the manifest, icon, and the two platform binaries — not the whole repo). - Double-click it, or in Claude Desktop: Settings → Extensions → drag the file in.
- Claude Desktop prompts for the same
user_configfields as the env-var path above (site_root/hugo_root/content_root/site_url/site_name).
It's unsigned — mcpb sign --self-signed is currently broken in the upstream CLI (confirmed by direct testing: reports success but writes nothing to the file), so Claude Desktop will show an "unverified publisher" warning during install. That's expected, not a sign of a broken bundle. Submitted to the Claude Connectors Directory for review (Phase 5); not yet listed there, but fully installable manually via the steps above in the meantime.
A minimal end-to-end check (real initialize → tools/list → tools/call, no client UI needed) is what the repository's own cmd/mcp-hugo-server-go/stdio_integration_test.go does in CI. If you're debugging a local install, the same shape of check — spawn the binary/npx command as a subprocess, send an initialize request, then tools/list — will tell you whether the process is even reachable over stdio before troubleshooting anything site-specific.
- Editing your own site from your own machine, one person: stdio via npx. Lowest setup cost, matches most people's actual use case.
- Running a shared instance multiple people/agents connect to remotely, or you specifically want OAuth-scoped access control: HTTP + OAuth, self-hosted per the steps above.
- Not sure: start with stdio/npx. Moving to HTTP+OAuth later doesn't require re-architecting anything — it's the same binary, same tool implementations, just a different launch mode and config.