# ShotPulled (com.shotpulled/shotpulled): tool descriptions scored

- tools/list taken: 2026-11-02 (UTC)
- From: [Official MCP Registry](https://registry.modelcontextprotocol.io/v0/servers/com.shotpulled%2Fshotpulled/versions/latest)
- Connected to: https://mcp.shotpulled.com/mcp
- Homepage: https://shotpulled.com/
- Scoring rules: v2
- Tools: 44
- Average: 58.7 / 100 (Cloudy)
- Near-identical pairs: 5

This page shows how ShotPulled (com.shotpulled/shotpulled)'s tool descriptions scored, the issues found and the names of its tools and parameters. The descriptions are the server's own: read them where the copy came from.

Forecall asked the URL this server lists in the official MCP Registry for its tools/list once, on the date above, without calling any tool. The server may have changed since.

## Across the server

- Major: 44 tools. Above 40, models choose less accurately.
- Minor: The server has no instructions. Say there, once, what the server is for and when to use it: Claude Code and Gemini CLI read the instructions before the tool descriptions.

## Tools

- `grinder_math`: 28 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Major: Arguments without a description: grinder_id, from_label, to_label.
  - Minor: String arguments with no constraint or example: from_label, to_label.
  - Minor: The description mentions none of its 3 or more arguments.
  - Minor: Required identifiers whose description does not say where the value comes from: grinder_id. Name the tool or the place that returns it, or models look it up first.
- `log_recommendation`: 35 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Major: Arguments without a description: lever, direction, rationale, confidence, cited_rules, based_on_shot.
  - Minor: String arguments with no constraint or example: rationale.
  - Minor: The description mentions none of its 3 or more arguments.
- `suggest_next_step`: 36 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Major: Arguments without a description: bean_id.
  - Minor: Required identifiers whose description does not say where the value comes from: bean_id. Name the tool or the place that returns it, or models look it up first.
- `lock_recipe`: 43 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Major: Arguments without a description: from_shot_id, drink_intent.
  - Minor: Required identifiers whose description does not say where the value comes from: from_shot_id. Name the tool or the place that returns it, or models look it up first.
- `register_water`: 44 / 100
  - Major: The description only restates the name (7 words).
  - Major: The description is too short (7 words).
  - Major: Says nothing about when to use it, or when not to.
  - Minor: String arguments with no constraint or example: notes.
  - Minor: The description mentions none of its 3 or more arguments.
- `update_water`: 45 / 100
  - Major: Arguments without a description: fields, fields.name, fields.type, fields.tds, fields.gh, fields.kh, fields.sodium, fields.calcium, fields.magnesium, fields.notes.
  - Minor: String arguments with no constraint or example: fields.name.
  - Minor: Required identifiers whose description does not say where the value comes from: water_id. Name the tool or the place that returns it, or models look it up first.
- `list_recipes`: 49 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Major: Arguments without a description: bean_id, grinder_id, machine_id.
  - Minor: No `required` list, so every argument is optional.
- `update_bag`: 49 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: fields, fields.state, fields.cost, fields.currency, fields.storage, fields.frozen_storage, fields.frozen_note, fields.bag_notes, fields.ean, fields.qr_code.
  - Minor: String arguments with no constraint or example: fields.currency, fields.storage, fields.frozen_storage, fields.frozen_note, fields.ean, fields.qr_code.
  - Minor: The description mentions none of its 3 or more arguments.
- `compute_age`: 51 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: bean_id.
  - Minor: Required identifiers whose description does not say where the value comes from: bean_id. Name the tool or the place that returns it, or models look it up first.
- `get_stats`: 51 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Required identifiers whose description does not say where the value comes from: id. Name the tool or the place that returns it, or models look it up first.
- `set_equipment_archived`: 51 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: The description mentions none of its 3 or more arguments.
  - Minor: Required identifiers whose description does not say where the value comes from: id. Name the tool or the place that returns it, or models look it up first.
- `get_maintenance_guides`: 52 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: No `required` list, so every argument is optional.
- `list_shots`: 52 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: filters.
  - Minor: No `required` list, so every argument is optional.
  - Minor: The description mentions none of its 3 or more arguments.
- `get_kb_version`: 53 / 100
  - Major: Says nothing about when to use it, or when not to.
- `get_rule`: 55 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Required identifiers whose description does not say where the value comes from: rule_id. Name the tool or the place that returns it, or models look it up first.
- `get_dial_state`: 57 / 100
  - Major: Says nothing about when to use it, or when not to.
- `kb_changelog`: 57 / 100
  - Major: Says nothing about when to use it, or when not to.
- `set_grinder_position`: 57 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: grinder_id.
  - Minor: Required identifiers whose description does not say where the value comes from: grinder_id. Name the tool or the place that returns it, or models look it up first.
- `update_bean`: 58 / 100
  - Major: Arguments without a description: bean_id, fields, fields.name, fields.roast_level, fields.process_type, fields.roaster, fields.origin, fields.variety, fields.bag_notes, fields.rest_window_days_min, fields.rest_window_days_max, fields.state, fields.storage, fields.cost, fields.currency, fields.roast_range, fields.roast_custom, fields.roasting_type, fields.aromatics, fields.cupping_points, fields.url, fields.ean, fields.qr_code, fields.co2e_kg, fields.frozen_storage, fields.frozen_note, fields.arabica_pct, fields.origins[].country, fields.origins[].region, fields.origins[].farm, fields.origins[].farmer, fields.origins[].variety, fields.origins[].processing, fields.origins[].elevation_m, fields.origins[].harvest, fields.origins[].percentage.
  - Minor: String arguments with no constraint or example: fields.name, fields.roaster, fields.origin, fields.variety, fields.storage, fields.currency, fields.roast_range, fields.roast_custom, fields.url, fields.ean, fields.qr_code, fields.frozen_storage, fields.frozen_note, fields.origins[].country, fields.origins[].region, fields.origins[].farm, fields.origins[].farmer, fields.origins[].variety, fields.origins[].processing, fields.origins[].harvest.
- `list_beans`: 60 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: No `required` list, so every argument is optional.
- `list_machines`: 60 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: No `required` list, so every argument is optional.
- `list_scales`: 60 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: No `required` list, so every argument is optional.
- `list_waters`: 60 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: No `required` list, so every argument is optional.
- `log_maintenance`: 60 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Required identifiers whose description does not say where the value comes from: equipment_id. Name the tool or the place that returns it, or models look it up first.
- `update_grinder`: 61 / 100
  - Major: Arguments without a description: fields, fields.name, fields.motor_type, fields.burr_type, fields.setting_scheme, fields.direction_convention, fields.min_value, fields.max_value, fields.microns_per_step, fields.notes, fields.photo.
  - Minor: String arguments with no constraint or example: fields.name.
  - Minor: Required identifiers whose description does not say where the value comes from: grinder_id. Name the tool or the place that returns it, or models look it up first.
- `update_machine`: 62 / 100
  - Minor: Arguments without a description: fields, fields.name, fields.control_type, fields.basket_size_grams, fields.boiler_type, fields.connected_device, fields.notes, fields.photo.
  - Minor: String arguments with no constraint or example: fields.name.
  - Minor: Required identifiers whose description does not say where the value comes from: machine_id. Name the tool or the place that returns it, or models look it up first.
- `update_scale`: 62 / 100
  - Major: Arguments without a description: fields, fields.name, fields.scale_type, fields.resolution_g, fields.capacity_g, fields.width_mm, fields.depth_mm, fields.height_mm, fields.water_resistance, fields.connectivity, fields.flow_rate_display, fields.auto_tare, fields.auto_timer, fields.power, fields.notes.
  - Minor: String arguments with no constraint or example: fields.name.
  - Minor: Required identifiers whose description does not say where the value comes from: scale_id. Name the tool or the place that returns it, or models look it up first.
- `register_program`: 64 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: machine_id, description.
  - Minor: Required identifiers whose description does not say where the value comes from: machine_id. Name the tool or the place that returns it, or models look it up first.
- `update_shot`: 64 / 100
  - Major: Arguments without a description: fields.grinder_id, fields.machine_id, fields.program_id, fields.water_id, fields.dose_g, fields.yield_g, fields.time_s, fields.sensory_tags, fields.observations, fields.finish_action, fields.drink_intent, fields.temp_taste, fields.temperature_c, fields.tds, fields.beverage_g, fields.vessel_name, fields.vessel_weight_g, fields.favourite, fields.best_brew.
  - Minor: String arguments with no constraint or example: fields.vessel_name.
  - Minor: Required identifiers whose description does not say where the value comes from: shot_id. Name the tool or the place that returns it, or models look it up first.
- `list_grinders`: 65 / 100
  - Minor: No `required` list, so every argument is optional.
- `register_scale`: 65 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: String arguments with no constraint or example: notes.
  - Minor: The description mentions none of its 3 or more arguments.
- `set_maintenance_offset`: 65 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Required identifiers whose description does not say where the value comes from: entry_id. Name the tool or the place that returns it, or models look it up first.
- `diagnose_preview`: 66 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: No `required` list, so every argument is optional.
- `register_bag`: 66 / 100
  - Minor: Arguments without a description: cost, currency, storage, ean, qr_code.
  - Minor: String arguments with no constraint or example: currency, storage, ean, qr_code.
- `diagnose_shot`: 67 / 100
  - Minor: No `required` list, so every argument is optional.
- `delete_shot`: 68 / 100
  - Minor: Required identifiers whose description does not say where the value comes from: shot_id. Name the tool or the place that returns it, or models look it up first.
- `register_machine`: 70 / 100
  - Minor: Arguments without a description: control_type, basket_size_grams, boiler_type, notes.
  - Minor: String arguments with no constraint or example: boiler_type, notes.
- `set_active`: 70 / 100
  - Minor: No `required` list, so every argument is optional.
  - Minor: The description mentions none of its 3 or more arguments.
- `merge_beans`: 71 / 100
  - Minor: Required identifiers whose description does not say where the value comes from: from_bean_id, into_bean_id. Name the tool or the place that returns it, or models look it up first.
- `list_maintenance_due`: 72 / 100
  - Minor: No `required` list, so every argument is optional.
- `log_shot`: 72 / 100
  - Minor: Arguments without a description: dose_g, yield_g, time_s, finish_action, drink_intent, flavor_notes, sensory_tags, observations, temp_taste, rating, verdict.
  - Minor: String arguments with no constraint or example: verdict, vessel_name.
- `register_grinder`: 73 / 100
  - Minor: Arguments without a description: motor_type, burr_type, direction_convention.
  - Minor: String arguments with no constraint or example: notes.
- `set_maintenance_schedule`: 75 / 100
  - Minor: Arguments without a description: fields.
  - Minor: Required identifiers whose description does not say where the value comes from: equipment_id. Name the tool or the place that returns it, or models look it up first.
- `register_coffee`: 82 / 100
  - Major: Arguments without a description: name, roast_level, process_type, roaster, origin, variety, bag_notes, rest_window_days_min, rest_window_days_max, state, storage, cost, currency, roast_range, roast_custom, roasting_type, aromatics, cupping_points, rating, url, ean, qr_code, co2e_kg, frozen_storage, frozen_note, origins[].country, origins[].region, origins[].farm, origins[].farmer, origins[].variety, origins[].processing, origins[].elevation_m, origins[].harvest, origins[].percentage.
  - Minor: String arguments with no constraint or example: name, roaster, origin, variety, storage, currency, roast_range, roast_custom, url, ean, qr_code, frozen_storage, frozen_note, origins[].country, origins[].region, origins[].farm, origins[].farmer, origins[].variety, origins[].processing, origins[].harvest.

Is your server listed here and you would rather it were not? Email support@forecall.dev, and we will take it off within 7 days.

[All scored servers](https://forecall.dev/en/servers)
