grr-gaggiuino-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@grr-gaggiuino-mcpwhat's my current machine status?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
grr-gaggiuino-mcp
An MCP (Model Context Protocol) server for Gaggiuino-modified espresso machines.
Monitor your machine, analyze shots, and manage brewing profiles from any MCP-compatible client.
Tools
Tool | Description |
| Real-time machine state: temperature, pressure, weight, water level, active profile, brewing/steaming status |
| Shot data with time-series curves (pressure, flow, temp, weight) and profile used. Defaults to latest shot. |
| List all brewing profiles with IDs and selection status |
| Activate a brewing profile by ID |
Related MCP server: meticulous-mcp
Installation
Prerequisites
Node.js 18+
A Gaggiuino-modified espresso machine on your local network
Option 1: npx (easiest)
No install needed - just configure Claude Desktop to use npx:
{
"mcpServers": {
"gaggiuino": {
"command": "npx",
"args": ["grr-gaggiuino-mcp"],
"env": {
"GAGGIUINO_BASE_URL": "http://YOUR_GAGGIUINO_IP"
}
}
}
}Option 2: Clone and Build
git clone https://github.com/sgerlach/grr-gaggiuino-mcp.git
cd grr-gaggiuino-mcp
npm install
npm run buildClaude Desktop Configuration
Add to your Claude Desktop config:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"gaggiuino": {
"command": "node",
"args": ["/path/to/grr-gaggiuino-mcp/dist/index.js"],
"env": {
"GAGGIUINO_BASE_URL": "http://YOUR_GAGGIUINO_IP"
}
}
}
}Note: If using nvm, specify the full path to Node 18+:
"command": "/Users/you/.nvm/versions/node/v20.x.x/bin/node"
Configuration
Variable | Default | Description |
|
| Your Gaggiuino's IP or hostname |
|
| API timeout in milliseconds |
Testing
# With MCP Inspector
npm run inspect
# Direct run
GAGGIUINO_BASE_URL=http://YOUR_IP npm startExample Workflows
Quick Status Check
You: "Is my machine ready to pull a shot?"
→ get_status: temp 93°C (target 93°C), pressure stable, water level 85%Dialing In a New Coffee
You: "I have a new bag of coffee - Ethiopian Yirgacheffe, light roast,
tasting notes of blueberry and citrus. It's 10 days off roast.
What profile should I start with?"
→ LLM recommends a profile based on the coffee characteristics
You: "OK I pulled the shot, analyze it"
→ get_shot returns pressure/flow/temp curves
You: "It tasted sour and watery"
→ LLM analyzes the shot data against your taste feedback:
"The pressure ramped too quickly and flow was high (4.2 ml/s).
Try grinding 2 steps finer. The 6:1 ratio in 24s suggests
under-extraction - aim for 28-32s."
You: "Pulled another shot after adjusting"
→ get_shot for the new shot
→ "Much better - pressure curve is smoother, 2.8 ml/s flow.
How did it taste?"Shot Analysis & Troubleshooting
You: "My shots have been channeling lately, look at my last few shots"
→ get_shot (latest), get_shot (id: previous)
→ LLM identifies pressure spikes/instability indicating channeling
You: "Compare this shot to yesterday's good one"
→ Side-by-side analysis of shot curvesProfile Management
You: "What profiles do I have?"
→ get_profiles lists all available profiles
You: "Switch to my low-pressure blooming profile"
→ select_profile activates it
You: "Pull a shot and tell me if this profile works for my current beans"
→ get_shot + analysis based on bean characteristics you've sharedIterative Dial-In Session
You: "Let's dial in this coffee. Medium-dark Brazilian, chocolate/nutty,
for milk drinks. 18g dose, targeting 36g out."
→ LLM suggests starting parameters and profile
[Pull shot 1]
You: "Done, check it"
→ get_shot → "23 seconds, slightly fast. Bitter finish suggests
over-extraction at the end despite short time - likely channeling.
Grind 1 step finer and improve puck prep."
[Pull shot 2]
You: "Better prep this time"
→ get_shot → "27 seconds, smooth pressure curve. How's the taste?"
You: "Really good! Balanced, nice chocolate, good body for a cortado"
→ "Great - this is your baseline. Shot data saved.
Current recipe: 18g → 36g in 27s, Profile: X"Unit Conversions
The Gaggiuino API returns values in deci-units. This server converts them to standard units:
Raw API | Converted |
deciseconds | seconds |
decibar | bar |
decidegrees | °C |
decigrams | grams |
deci-ml/s | ml/s |
API Reference
Based on the Gaggiuino REST API.
License
MIT
Available Tools
4 toolsget_profilesA
List all available brewing profiles stored on the Gaggiuino. Returns profile IDs, names, and which one is currently selected. Use this to see available profiles before selecting one.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description is the sole source of behavioral info. It states the return payload (profile IDs, names, selected) and implies a read-only operation via 'List'. This is sufficient for a simple listing tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action, no filler. Each sentence contributes: what it does and when to use it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no parameters, no output schema, and simple list behavior, the description covers what it returns and its intended use. The sibling tools provide additional context on the broader workflow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters in the schema, so the description has no parameter semantics to add. The baseline of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'List' and identifies the resource ('brewing profiles stored on the Gaggiuino'). It clearly distinguishes from siblings like select_profile by focusing on viewing rather than modifying.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The instruction 'Use this to see available profiles before selecting one' provides explicit when-to-use context by tying it to a subsequent action. It does not explicitly enumerate alternatives, but the sibling select_profile is implicitly implied as the next step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_shotA
Retrieve detailed shot data with time-series curves for analysis. Returns pressure (bar), flow rate (ml/s), temperature (C), weight (g), and target values over time. Includes the profile used and shot duration. Omit ID to get the most recent shot.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Shot ID for historical data. Omit to get the latest shot. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the specific output fields and the special behavior of omitting the ID to return the latest shot. It does not mention potential errors or read-only guarantees, but 'retrieve' implies a safe read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the primary purpose and enough detail to be immediately useful. Every sentence earns its place, with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity—one optional parameter and no output schema—the description covers the function, return data fields, and usage conditions effectively. It compensates for the lack of an output schema by listing expected return values, though it stops short of describing the exact data structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'id' parameter, describing it as a Shot ID and noting to omit for the latest shot. The description repeats this 'omit' behavior in prose but adds no new semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Retrieve detailed shot data with time-series curves for analysis,' which is a specific verb and resource. It lists the exact data fields returned, clearly distinguishing it from sibling tools like get_status or get_profiles.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool ('for analysis') and gives a specific usage condition ('Omit ID to get the most recent shot'). It does not explicitly mention alternatives, but the context is enough to infer proper use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statusA
Get real-time Gaggiuino espresso machine status including: current/target temperature (Celsius), pressure (bar), scale weight (grams), water tank level (%), whether brewing or steaming is active, and the currently selected profile name and ID.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose the specific measured values (temperature, pressure, weight, tank level, active operations, profile). However, it does not clarify whether the data is live from the machine vs cached, or whether machine connectivity is required, which are important behavioral details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the core purpose and then efficiently lists all returned data in a structured, readable way. No filler words or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must explain return values, and it does so thoroughly with units and field semantics. It does not mention error cases or the overall response envelope, but for a simple status tool the coverage is strong.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema confirms this. The description adds value by explaining the meaning of the output fields, which is the only possible semantic contribution. This matches the baseline for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and a clear resource ('real-time Gaggiuino espresso machine status'), and enumerates the data fields returned. This distinguishes it from sibling tools like get_shot (historical shot data) and get_profiles (profile list).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'real-time' clearly implies this tool is for current machine state, contrasting with historical shot retrieval (get_shot). However, it does not explicitly name alternatives or state when not to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select_profileA
Activate a brewing profile by its ID. The machine will use this profile for the next shot. Get available profile IDs using get_profiles first.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Profile ID to activate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses the main behavioral effect (activation for the next shot) and the need to call get_profiles first, but does not mention side effects like persistence, reversibility, or error behavior for invalid IDs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, focused sentences. The first states the action and effect; the second provides an actionable instruction. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no output schema, siblings are all getters), the description covers purpose, effect, and prerequisite. Slight gap is the absence of error/edge-case handling, but for a simple activation it is adequately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'id' parameter. The description adds no extra meaning beyond 'by its ID,' which is already captured in the schema, so it meets the baseline but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Activate') and resource ('brewing profile'), and clearly distinguishes the tool's action from the sibling getter tools by explaining the effect ('machine will use this profile for the next shot').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit prerequisite: 'Get available profile IDs using get_profiles first.' This conveys when to use the tool and the necessary prior step, but does not mention scenarios where this tool should not be used or alternatives beyond the prerequisite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v1.0.2- First observed
get_profiles - First observed
get_shot - First observed
get_status - First observed
select_profile
TDQS
Scored across 4 tools
Each tool has a clearly distinct purpose: live status, historical shot data, profile listing, and profile selection. There is no overlap or ambiguity between them.
All tool names follow a consistent verb_noun pattern: get_status, get_shot, get_profiles, select_profile. The naming is uniform and predictable.
Four tools is well-scoped for a focused Gaggiuino interface. Each tool serves a clear need without redundancy or bloat.
The set covers core workflows: monitoring status, retrieving shot data, browsing profiles, and selecting one. Missing profile editing and brew control are minor gaps that do not break the main use case.
Maintenance
Related MCP Connectors
An MCP server giving access to Grafana dashboards, data and more.
MCP server for progressive tool usage at any scale (see https://klavis.ai)
- SupabaseOAuthcom.supabase
MCP server for interacting with the Supabase platform
Related MCP Servers
- AlicenseBqualityDmaintenanceA lightweight server that enables AI clients to access and analyze real-time data from Gaggiuino espresso machine controllers through a simple HTTP API.39MIT
- AlicenseAqualityDmaintenanceMCP server for controlling Meticulous espresso machines via Claude and other AI clients.22109 npmMIT
- AlicenseNot gradedqualityAmaintenanceA remote MCP server for integrating Gaggiuino espresso machines with AI tools. It enables checking machine status, analyzing shot data, managing profiles, and receiving dial-in guidance.1MIT
- FlicenseNot gradedqualityBmaintenanceMCP server that archives Decent DE1 espresso shots from Visualizer.coffee into SQLite and provides analysis tools for shots, beans, and profiles via MCP.-