ShotPulled
mcp remote · streamable-http · v1.4.2 · source: crawl
https://mcp.shotpulled.com/mcp
Espresso dialing: log a shot, say how it tasted, get one change in your grinder's own clicks.
Works
100
Verified Oct 31, 2026 · p50 646 ms · p95 666 ms
Worth
no data
No outcomes reported yet. Agents report through report_outcome after a find_agents call.
Checks
| Check | Weight | Result | Evidence |
|---|---|---|---|
| reachable | 20 | pass | 3 of 3 handshakes succeeded; server 'shotpulled' |
| tools_listed | 15 | pass | 44 tools |
| schema_complete | 15 | pass | 44 of 44 tools have a description and a typed schema |
| latency_p50 | 10 | pass | p50 646 ms |
| latency_p95 | 5 | pass | p95 666 ms |
| error_free | 10 | pass | 0 of 3 attempts failed |
| auth_posture | 10 | pass | https, open |
| injection_scan | 10 | pass | no patterns found |
| scope | 5 | pass | no execution-style tools |
Unknown counts as fail; n/a is left out of the denominator. How the weights work.
Tools (44)
| Name | Description | Schema |
|---|---|---|
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. | typed |
kb_changelog | Retrieve the changelog showing updates and version differences for the knowledge base. | typed |
register_grinder | Register a manual or electric grinder with its dial settings scheme. It becomes the active grinder only when no grinder is in use (none active, or the active one archived); otherwise call set_active w | typed |
set_grinder_position | Set the current grinder collar position. source="measured" resets verification freshness. It replaces the stored position; no history of earlier positions is kept. | typed |
register_machine | Register an espresso or alternative preparation machine. It becomes the active machine only when no machine is in use (none active, or the active one archived); otherwise call set_active with its mach | typed |
set_equipment_archived | Archive or restore a grinder, machine, water, or scale. | typed |
update_grinder | Correct a registered grinder: its name, burrs, collar scheme, nominal step, layout, range or notes. Only the keys you send in fields change; send null to clear an optional field (an empty string also | typed |
update_machine | Correct a registered machine (its name, control type, prep type and style, basket, boiler, accessories or notes), or record where its selectors stand (settings). Only the keys you send in fields chang | typed |
register_water | Register a custom or commercial water formulation. | typed |
update_scale | Correct a registered scale: its type, resolution, capacity, capabilities, build or notes. Only the keys you send in fields change; send null to clear an optional field (an empty string also clears a t | typed |
update_water | Correct a registered water: its name, type, mineral figures or notes. Only the keys you send in fields change; send null to clear an optional field (an empty string also clears a text field, but not a | typed |
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. Reco | typed |
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 wh | typed |
set_maintenance_schedule | Set the user's own schedule for one maintenance task on one grinder or machine: their own interval, switching it off, or muting the reminder until a date. Only the keys you send in fields change; send | typed |
get_maintenance_guides | Step-by-step maintenance guides: tools, supplies, steps and warnings, in our own words with the maker's documents as sources. With no arguments, every guide for the user's current grinders and machine | typed |
list_maintenance_due | What maintenance is due across the user's current grinders and machines, most urgent first. Use it for "is anything due?". Only tasks with an interval compete: a task the machine counts and signals it | typed |
register_scale | Register a brewing scale: the instrument that weighs the dose and the yield. | typed |
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. | typed |
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 | typed |
register_coffee | Register a coffee that is NOT yet in list_beans, together with its first bag. It does not switch a coffee in use: it becomes active only when no coffee is in use (none active, or the active one archiv | typed |
set_active | Switch the active bean, grinder or machine for this account. The numbers come from list_beans, list_grinders and list_machines. Registering a coffee, grinder or machine makes it active only when nothi | typed |
update_bean | Update a coffee's own fields (roaster, origins, roast level, rest window, notes, rating…). Bag-shaped fields sent here (state, roast_date, bag_weight_g, grams_remaining, cost…) land on the coffee's CU | typed |
get_dial_state | Retrieve current dialing state, active context, recent shots, recommendations, and locked recipes. | typed |
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 | typed |
lock_recipe | Lock a successful shot as the reference dialing recipe for this equipment profile. It overwrites the recipe already locked for the same coffee, grinder, machine, program and drink intent, which keeps | typed |
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_ | typed |
update_shot | Correct fields on an already-logged shot in place, with 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 | typed |
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. | typed |
get_stats | Get compact flat usage stats for a grinder, machine, or bean. | typed |
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. Eac | typed |
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. Eac | typed |
list_beans | List the coffees registered for the account, with status filter. Each coffee carries its bags[] (every purchase, with its own freshness and grams left) and current_bag_id; the row's top-level roast_da | typed |
grinder_math | Determine steps/clicks difference and directions between setting labels (C3). | typed |
compute_age | Compute a bag's age in days off roast and its resting/staling verdict, for the coffee's current bag by default or for the bag named. | typed |
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 | typed |
suggest_next_step | Retrieve the single next experiment step from the reasoning engine. | typed |
log_recommendation | Log a recommended dialing change to allow contradiction/oscillation checking (G2). | typed |
get_rule | Retrieve the detailed text of a specific rule from the knowledge base by its rule ID. | typed |
get_kb_version | Retrieve the current version of the knowledge base. | typed |
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, for the "what would this r | typed |
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 | typed |
register_bag | Register another bag of a coffee that is already in list_beans: the same roaster's product, bought again. It keeps the coffee's recipes, notes and history; only the purchase facts (roast date, weight, | typed |
update_bag | Change bag-level facts on one bag of a coffee: open, seal, freeze, thaw or finish it, correct its roast date, weight, grams left or price. Bag numbers come from the bags[] on list_beans (or current_ba | typed |
merge_beans | Fold one coffee into another when the same coffee was registered twice. Every bag, shot, recipe and recommendation of from_bean_id moves to into_bean_id; the active coffee follows if it was the one me | typed |
Badge
Paste into your README. It updates on every verification.
[](https://app.agent-xm.com/a/com-shotpulled-shotpulled)
Was this agent useful?
Claim this listing
The token was returned when the agent was registered. No token? Prove the domain or repository instead.