ShotPulled is a remote MCP server that gives an AI agent 34 tools, among them compute_age, delete_shot, diagnose_preview. It answers at https://mcp.shotpulled.com/mcp over streamable HTTP, and it listed its tools to an anonymous client, so no sign-in was needed for that. Our probes reached it 6 of 6 times since 10 September 2026; the last check, on 19 October 2026, succeeded.
Espresso dialing: log a shot, say how it tasted, get one change in your grinder's own clicks.
Description as the publisher wrote it.
| Tool | What it does |
|---|---|
compute_age | Compute coffee age in days off roast and resting/staling verdict. Inputs: bean_id |
delete_shot | Delete a logged shot from history. Restores the bean's remaining weight (which is derived from logged doses). Hard delete — there is no undo. To fix a mistake on an otherwise-valid shot, prefer update_shot over delete-and-relog. Inputs: shot_id |
diagnose_preview | Sandbox-only diagnosis, writes nothing (no verdict, no recommendation-trail entry). Two modes: pass shot_id to dry-run a LOGGED shot (optionally overriding its sensory_tags — the "what would this read as?" preview; the shot's own bean and i Inputs: shot_id, bean_id, grinder_id, machine_id, grind_label, dose_g |
diagnose_shot | Evaluate shot metrics to provide ranked hypotheses (C6) and warn on flip-flops (G2) or fatigue (G6). Resolves the SHOT's own bean — age computed at the shot's pulled_at — never the active profile, and echoes it as bean_context, so diagnosin Inputs: shot_id |
get_dial_state | Retrieve current dialing state, active context, recent shots, recommendations, and locked recipes. |
get_kb_version | Retrieve the current version of the knowledge base. |
get_rule | Retrieve the detailed text of a specific rule from the knowledge base by its rule ID. Inputs: rule_id |
get_stats | Get compact flat usage stats for a grinder, machine, or bean. Inputs: scope, id |
grinder_math | Determine steps/clicks difference and directions between setting labels (C3). Inputs: grinder_id, from_label, to_label |
kb_changelog | Retrieve the changelog showing updates and version differences for the knowledge base. |
list_beans | List coffee beans registered for the account, with status filter. The `id` on each row is the number this account knows that record by, counting from 1 — safe to show, and what other tools expect back. Inputs: status |
list_grinders | List grinders registered for the account, with status filter. The `id` on each row is the number this account knows that record by, counting from 1 — safe to show, and what other tools expect back. Inputs: status |
list_machines | List machines registered for the account, with status filter. The `id` on each row is the number this account knows that record by, counting from 1 — safe to show, and what other tools expect back. Inputs: status |
list_recipes | List recipes (all or filtered by equipment and status). The `id` on each row is the number this account knows that record by, counting from 1 — safe to show, and what other tools expect back. Inputs: bean_id, grinder_id, machine_id, status |
list_scales | List registered scales for the account. The `id` on each row is the number this account knows that record by, counting from 1 — safe to show, and what other tools expect back. Inputs: status |
list_shots | List shot history with support for pagination and filtering. Every shot carries a derived taste_pending flag (1 = logged with no sensory tags, no rating, and no tasted flip — the tasting is still owed and can be backfilled with update_shot) Inputs: filters, limit, offset |
list_waters | List registered waters for the account. The `id` on each row is the number this account knows that record by, counting from 1 — safe to show, and what other tools expect back. Inputs: status |
lock_recipe | Lock a successful shot as the reference dialing recipe for this equipment profile. Inputs: from_shot_id, drink_intent |
log_maintenance | Log a cleaning or maintenance job against a piece of equipment. A task that takes the thing apart opens a calibration epoch, and every recipe locked before it is read through that epoch's offset — so record the offset here if you counted th Inputs: equipment_kind, equipment_id, task, performed_at, note, disturbs_zero |
log_recommendation | Log a recommended dialing change to allow contradiction/oscillation checking (G2). Inputs: lever, direction, rationale, confidence, cited_rules, based_on_shot |
log_shot | Log an espresso or alternative shot/brew attempt. Uses the active context (bean/grinder/machine/program) unless overridden via bean_id/grinder_id/machine_id/program_id — ALWAYS pass bean_id explicitly when the user names a specific coffee, Inputs: dose_g, yield_g, time_s, bean_id, grinder_id, machine_id |
register_coffee | Register a new bag of coffee beans. Inputs: name, roast_date, roast_level, process_type, roaster, origin |
register_grinder | Register a manual or electric grinder with its dial settings scheme. Inputs: name, motor_type, burr_type, setting_scheme, direction_convention, nominal_step |
register_machine | Register an espresso or alternative preparation machine. Inputs: name, control_type, basket_size_grams, boiler_type, notes, prep_type |
register_program | Register a programmed shot button on a machine. A program cuts the shot off either by weight (program_type "volumetric", set target_volume_g) or by time (program_type "timed", set target_time_s). One machine can have a mix of both. Inputs: machine_id, program_number, program_type, target_volume_g, target_time_s, volume_source |
register_scale | Register a brewing scale — the instrument that weighs the dose and the yield. Inputs: name, scale_type, resolution_g, resolution_banded, capacity_g, width_mm |
register_water | Register a custom or commercial water formulation. Inputs: name, type, tds, gh, kh, sodium |
set_active | Switch the active bean, grinder or machine for this account. The numbers come from list_beans, list_grinders and list_machines. Registering something already makes it active, so use this to switch back to something that exists, not after re Inputs: bean_id, grinder_id, machine_id, program_id |
set_equipment_archived | Archive or restore a grinder, machine, water, or scale. Inputs: kind, id, archived |
set_grinder_position | Set the current grinder collar position. source="measured" resets verification freshness. Inputs: grinder_id, setting_label, source |
set_maintenance_offset | Record how far a maintenance job moved the reference, on an entry that opened a calibration epoch. Takes an ENTRY, not a piece of equipment: the offset belongs to the event that caused it, which is what lets several of them compose for a re Inputs: entry_id, offset_value, source, evidence |
suggest_next_step | Retrieve the single next experiment step from the reasoning engine. Inputs: bean_id |
update_bean | Update coffee bag fields. Changing dial_category changes what the engine advises (G5, C10), so say why in the optional note. Inputs: bean_id, fields, reason |
update_shot | Correct fields on an already-logged shot in place — no need to delete and re-log. Use for fixing a wrong dose/yield/time or grind label, re-filing a shot onto the right bean (bean_id), backfilling rating/tasting notes, or fixing the timesta Inputs: shot_id, fields |
Every block below points at https://mcp.shotpulled.com/mcp. Pick your client and copy.
claude mcp add --transport http shotpulled https://mcp.shotpulled.com/mcp
{
"mcpServers": {
"shotpulled": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.shotpulled.com/mcp"]
}
}
}{
"mcpServers": {
"shotpulled": {
"url": "https://mcp.shotpulled.com/mcp"
}
}
}{
"servers": {
"shotpulled": {
"type": "http",
"url": "https://mcp.shotpulled.com/mcp"
}
}
}{
"context_servers": {
"shotpulled": {
"url": "https://mcp.shotpulled.com/mcp"
}
}
}{
"mcpServers": {
"shotpulled": {
"serverUrl": "https://mcp.shotpulled.com/mcp"
}
}
}{
"mcpServers": {
"shotpulled": {
"url": "https://mcp.shotpulled.com/mcp"
}
}
}name: ShotPulled
version: 0.0.1
schema: v1
mcpServers:
- name: ShotPulled
type: streamable-http
url: https://mcp.shotpulled.com/mcp{
"mcpServers": {
"shotpulled": {
"httpUrl": "https://mcp.shotpulled.com/mcp"
}
}
}{
"mcpServers": {
"shotpulled": {
"type": "http",
"url": "https://mcp.shotpulled.com/mcp"
}
}
}{
"mcpServers": {
"shotpulled": {
"url": "https://mcp.shotpulled.com/mcp"
}
}
}goose://extension?url=https%3A%2F%2Fmcp.shotpulled.com%2Fmcp&type=streamable_http&id=shotpulled&name=ShotPulled
It answered our last check on 19 October 2026 in 258 ms. Over 6 checks since 10 September 2026 it answered 6. Status here comes from Neuronto's own probes, not from the publisher.
Yes. It is published by shotpulled.com and served from mcp.shotpulled.com, the vendor's own domain: https://mcp.shotpulled.com/mcp.
34, as returned by the server's own tools/list on 11 September 2026: compute_age, delete_shot, diagnose_preview, diagnose_shot, get_dial_state, get_kb_version, get_rule, get_stats, and 26 more.
It answered our last check on 19 October 2026 in 258 ms. Over 6 checks since 10 September 2026 it answered 6.
Put the server under mcpServers in ~/.cursor/mcp.json with the URL https://mcp.shotpulled.com/mcp. The exact JSON is above, with the same setup for Claude Code, Claude Desktop, VS Code, Windsurf, Zed, Gemini CLI and the rest.
It listed its tools to an anonymous client, so reading the tool list needs no key. Individual tools can still ask for credentials in their own inputs.
Publisher: com.shotpulled. Endpoint host: mcp.shotpulled.com. ARD identifier: urn:air:com.shotpulled:mcp:shotpulled.
First indexed 10 September 2026. The tools are exactly what the server returned; nothing on this page
is inferred from its name. Ranking in Neuronto search is never for sale.