Remote MCP server for your Gaggiuino espresso machine's shots and profiles
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Inspect callable tools, capabilities, and parameters exposed to AI agents by Gaggiuino MCP.
get_statusCurrent machine status (temperature, pressure, weight, water level)
get_latest_shot_idMost recent shot, id and headline numbers in one call
list_recent_shotsThe last few shots summarised, for trends over a session
get_shot_dataStructured shot summary with metrics
get_shot_raw_dataComplete time-series data
view_shot_graphInteractive shot graph rendered in MCP-compatible hosts (pressure, flow, weight over time with target overlays and optional shot comparison)
A Remote MCP server for integrating a Gaggiuino espresso machine with AI tools. Ask your AI assistant to check machine status, analyze shot data, and get dial-in guidance.
Shot Analysis
get_status - Current machine status (temperature, pressure, weight, water level)get_latest_shot_id - Most recent shot, id and headline numbers in one calllist_recent_shots - The last few shots summarised, for trends over a sessionget_shot_data - Structured shot summary with metricsget_shot_raw_data - Complete time-series dataview_shot_graph - Interactive shot graph rendered in MCP-compatible hosts (pressure, flow, weight over time with target overlays and optional shot comparison)Profiles and Settings
list_profiles - Profiles on the machine, merged with this server's documentationget_profile_info - Everything known about one profileget_machine_settings - Boiler, steam, and scale configuration as the machine reports itget_maintenance_status - Descale and backflush history the machine tracks itself, with shots since eachget_dial_in_guidance - Expert guidance for analyzing espresso shotsselect_profile - Switch the active profile (changes the machine; requires an authenticated server)upload_profile - Save a new brew profile to the machine (changes the machine; requires an authenticated server). Creates only β it never updates, and the machine assigns a fresh id every time, so uploading twice leaves two profilesdelete_profile - Delete a profile from the machine (destructive and irreversible; requires an authenticated server). It demands the profile's exact name back as confirmation, refuses to delete the currently selected profile, and always prompts for approval in the host β even under a stored "always allow"MCP Prompts - workflow templates your host surfaces as slash commands or menu items:
dial_in_new_bag - first shots on a coffee you have not pulled before (bean, and optionally roast level, dose, and what you want in the cup)diagnose_last_shot - read the shot you just pulled against how it tasted (what was wrong, and optionally what you changed)choose_profile - pick a profile the machine actually holds for a coffee (roast level, and optionally drink and notes)espresso_shot_analyst - the dial-in guidance as a system prompt (same content as get_dial_in_guidance)Each workflow prompt lays out the tools to call in order, so the analysis starts from the machine's own data rather than a guess.
MCP Resources - gaggiuino://profiles and gaggiuino://profiles/{id} for profile data
The server is published as a multi-arch image (linux/amd64, linux/arm64) at
ghcr.io/ljcl/gaggiuino-mcp,
so there is nothing to clone or build. It is also listed in the
MCP Registry
as io.github.ljcl/gaggiuino-mcp.
Edit .env with your Gaggiuino machine's address:
The server is available at http://<your-docker-host>:8000/mcp.
The compose file tracks latest. To pin a release, set GAGGIUINO_MCP_TAG in .env:
Upgrade with:
| Variable | Default | Description |
|---|---|---|
GAGGIUINO_URL | http://gaggiuino.local | URL of your Gaggiuino machine |
PORT | 8000 | Port for the MCP server |
HOST | 0.0.0.0 | Host to bind to |
MCP_PUBLIC_URL | (unset) | Public https origin clients reach this server on, with no path (e.g. https://box.tailnet.ts.net). Set together with MCP_OAUTH_SECRET to enable OAuth. It is advertised as the OAuth resource, so it must match the URL you enter in the client exactly. |
MCP_OAUTH_SECRET | (unset) | Signing key for self-issued OAuth tokens, at least 32 characters (openssl rand -hex 32). Keep it stable across restarts so clients stay signed in. Setting only one of these two fails at startup. |
MCP_OAUTH_PASSPHRASE_HASH | (unset) | scrypt hash of the passphrase you type on the consent page when connecting a client. Required whenever the built-in authorization server is on β without it the consent page would grant a token to anyone who reached it, so the server refuses to start. Generate with cd apps/server && bun run hash-passphrase; never store the passphrase itself. |
MCP_OAUTH_ISSUER | (unset) | Delegate token issuing to an identity provider you already run (Authentik, Keycloak, Authelia, Zitadel, Kanidm, tsidp). Set it and this server serves no OAuth endpoints of its own, verifying RS256/ES256 tokens against the issuer's JWKS instead. Requires MCP_PUBLIC_URL; refuses to start alongside MCP_OAUTH_SECRET or MCP_OAUTH_PASSPHRASE_HASH. See Using an external identity provider. |
MCP_ALLOWED_ORIGINS | (empty) | Comma-separated browser origins allowed to call /mcp. * allows any (unsafe). |
MCP_ALLOWED_HOSTS | (empty) | Comma-separated Host header values to accept. Empty disables the check. |
LOG_LEVEL | info | debug, info, warn, error, or silent. Logs are one JSON object per line on stderr. |
GET /health returns JSON:
It answers 200 whenever the process is alive, including while the machine is
unreachable β your espresso machine is off most of the day, and the container
healthcheck reads the status code. machine.state is ok, unreachable, or
unknown, observed from the requests the server already makes rather than from
a probe, so /health puts no extra load on the machine. machine.versions is
observed the same way β remembered the first time anything reads the machine's
settings (get_machine_settings), never fetched by /health itself β so null
there means "this server has not read the settings yet", not "the machine
reports no version". Only those three documented fields are published: /health
is unauthenticated, so anything a future firmware adds under versions stays
out of it until someone decides otherwise.
Logs are one JSON object per line, so you can pick out what you need:
Turn on OAuth before exposing this server beyond your LAN. Every tunnel
option below puts /mcp on the public internet, and without authentication
anyone who learns the URL gets the full tool surface against a machine in your
kitchen. The server prints a warning at startup while nothing is configured.
Three variables, all required together:
Then recreate the container β a plain restart is not enough:
Compose tracks the list of env_file paths, not their contents, so editing
.env and running docker compose up -d (or restart) can reuse the existing
container along with the environment it was created with. The new variables
never reach the process and the server comes up unauthenticated exactly as if
you had not set them β with no error, because from its point of view nothing is
configured. Check what actually arrived:
Setting only some of them fails at startup and names the missing one. That is deliberate: silently falling back to an open endpoint is how somebody exposes a tunnel believing it is protected. The corollary is worth knowing when diagnosing: a server that is running and unauthenticated has seen none of the three β if you believe you set them, the container is stale, not the config wrong.
Factual signals from GitHub, npm, and our automated checks β not a rating.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/gaggiuino-mcp)<a href="https://allmcps.com/mcp/gaggiuino-mcp"><img src="https://allmcps.com/api/badge/gaggiuino-mcp?style=directory" alt="Gaggiuino MCP on AllMCPs" /></a>