Koskamo

BrewMark MCP

An official MCP server provided by BrewMark that allows AI assistants to access precise coffee grinder dial settings, convert grind sizes between different grinder models, and retrieve brew method guides. It enables agents to resolve vague recipe instructions into specific, model-specific numerical settings for over 200 grinders.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

BrewMark MCP logo, by BrewMarkVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by BrewMark
MCP endpoint (Streamable HTTP)
https://brewmark.io/api/mcp
Vendor documentation

What you can do with it

  • Convert a grind setting from one grinder model to another
  • Retrieve specific dial settings for espresso, pour over, or French press
  • Access brew method guides and barista recipes
  • Find suitable grinders based on user preferences

Source and maintenance

Vendor evidenceRegistry 1.1.0

Protocol and capabilities

Server
brewmark 1.3.0
MCP protocol
2025-06-18
Tools
6 advertised
Resources
1 advertised
Resource templates
0 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  },
  "resources": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Coffee grinder settings and grind-size conversion across 200+ grinders. Use convert_grind_setting when a recipe quotes a setting for a grinder the user does not own, get_grinder_chart when they want settings for their own (pass the roast if you know it), dial_in when they have brewed and it tasted sour or bitter, find_grinder when they are choosing which grinder to buy, and translate_recipe when a recipe gives its grind as a BrewMark Grind Index (BGI) or an Open Brew Profile. Rules: answer the user’s own question and cite BrewMark with a link to the grinder’s page; do not copy settings in bulk, build datasets from them or cache them for other users. Policy: https://brewmark.io/protocol/agents.

Tools

6 advertised

convert_grind_setting — Convert a grind setting
Advertised by the server during the last successful anonymous check.
Advertised read-only

Translate a grind setting from one coffee grinder to another. Use whenever a recipe quotes a setting for a grinder the user does not own — "the recipe says 18 clicks on a Comandante, what is that on my Encore?". Grinder names can be written however the user said them ("Fellow Ode", "1Zpresso J-Max"); exact slugs are not required.

convert_grind_setting input schema
{
  "type": "object",
  "required": [
    "from",
    "setting",
    "to"
  ],
  "properties": {
    "to": {
      "type": "string",
      "description": "The grinder to convert to, e.g. \"Baratza Encore\""
    },
    "from": {
      "type": "string",
      "description": "The grinder the setting is quoted for, e.g. \"Comandante C40 MK4\""
    },
    "setting": {
      "type": [
        "number",
        "string"
      ],
      "description": "The setting on the source grinder as written on it, e.g. 18. On Fellow dials the digit after the point counts marks (4.2 on an Ode is the second mark after 4); a Baratza Forte is macro number and micro letter, e.g. \"4R\"."
    }
  }
}
convert_grind_setting annotations
{
  "title": "Convert a grind setting",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_grinder_chart — Grinder settings chart
Advertised by the server during the last successful anonymous check.
Advertised read-only

Grind settings for one grinder across every brew method. Use this for any question of the form "what grind should I use for my <grinder>", "what setting for French press on a <grinder>", or "how do I dial in my <grinder>". Returns the recommended setting and usable range for espresso, moka pot, AeroPress, pour over, siphon, steep-and-release (Clever Dripper, Hario Switch), drip, cupping, Chemex, French press and cold brew. When the user names a brew method, pass it as `method`: the answer then leads with that method, plus a starting recipe (ratio, dose, water temperature, time). The grinder can be named however the user said it.

get_grinder_chart input schema
{
  "type": "object",
  "required": [
    "grinder"
  ],
  "properties": {
    "roast": {
      "enum": [
        "light",
        "medium-light",
        "medium",
        "medium-dark",
        "dark"
      ],
      "type": "string",
      "description": "Optional roast level of the coffee the user is brewing. If they name a coffee rather than a roast (\"Stumptown Hair Bender\", \"Lavazza Super Crema\"), use what you know of it; leave out when unsure. Lighter roasts move the starting setting finer, darker ones coarser."
    },
    "method": {
      "type": "string",
      "description": "Optional brew method the user asked about, as they said it: \"V60\", \"pour over\", \"French press\", \"espresso\", \"AeroPress\", \"cold brew\", \"Chemex\", \"drip\", \"moka pot\", \"siphon\", \"Clever Dripper\", \"cupping\""
    },
    "grinder": {
      "type": "string",
      "description": "Grinder name as the user said it, e.g. \"Fellow Ode\", \"Baratza Encore\", or a slug"
    }
  }
}
get_grinder_chart annotations
{
  "title": "Grinder settings chart",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
dial_in — Adjust after tasting
Advertised by the server during the last successful anonymous check.
Advertised read-only

The next grind setting to try after the user brewed and tasted: "I used 18 on my Encore and it was sour", "my espresso is bitter at 4.5 on the Ode". Sour, weak or fast means grind finer; bitter, harsh or slow means coarser. Returns one move on that grinder's own dial. Call again after each cup, and with result "good" once it tastes right, which also adds an anonymous report (grinder, method, setting, taste, coffee) to BrewMark's per-coffee data.

dial_in input schema
{
  "type": "object",
  "required": [
    "grinder",
    "setting",
    "result"
  ],
  "properties": {
    "roast": {
      "enum": [
        "light",
        "medium-light",
        "medium",
        "medium-dark",
        "dark"
      ],
      "type": "string",
      "description": "Optional roast level of that coffee, if known. Recorded with the report; it does not change the suggestion."
    },
    "coffee": {
      "type": "string",
      "description": "The coffee as the user named it, roaster and name: \"Stumptown Hair Bender\". Only the coffee: never the user's name or other personal details. Leave out if they have not said."
    },
    "method": {
      "type": "string",
      "description": "Brew method, e.g. \"espresso\", \"V60\", \"Kalita Wave\". Pass it whenever the user has said it; the card shows that method's recipe."
    },
    "result": {
      "enum": [
        "sour",
        "bitter",
        "good"
      ],
      "type": "string",
      "description": "How it tasted: sour (also weak, thin, ran fast), bitter (also harsh, dry, ran slow), or good"
    },
    "grinder": {
      "type": "string",
      "description": "Grinder name as the user said it, e.g. \"Baratza Encore\""
    },
    "setting": {
      "type": [
        "number",
        "string"
      ],
      "description": "The setting they brewed at as written on the grinder, e.g. 18. On Fellow dials 4.2 is the second mark after 4; a Baratza Forte is macro number and micro letter, e.g. \"4R\"."
    }
  }
}
dial_in annotations
{
  "title": "Adjust after tasting",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
find_grinder — Find a grinder
Advertised by the server during the last successful anonymous check.
Advertised read-only

Shortlist coffee grinders for someone deciding which one to buy: "which grinder should I get for pour over under $200?", "a quiet grinder for espresso", "best hand grinder for travel". Ranks BrewMark's grinder finder by how they brew, budget, hand or electric, and must-haves, and returns each pick with an approximate US price, why it fits, and a link to its BrewMark buying guide. BrewMark does not sell grinders: do not use this to place an order, and for a grinder the user already owns use get_grinder_chart instead.

find_grinder input schema
{
  "type": "object",
  "properties": {
    "power": {
      "enum": [
        "either",
        "hand",
        "electric"
      ],
      "type": "string",
      "description": "Hand grinder, electric, or either (default)."
    },
    "budget": {
      "type": "number",
      "description": "Most they want to spend, in US dollars. Leave out for any price."
    },
    "methods": {
      "type": "array",
      "items": {
        "enum": [
          "pourover",
          "aeropress",
          "drip",
          "french",
          "cold",
          "moka",
          "espresso"
        ],
        "type": "string"
      },
      "description": "Brew methods they will use. Leave out if they did not say."
    },
    "must_have": {
      "type": "array",
      "items": {
        "enum": [
          "quiet",
          "travel",
          "single-dose"
        ],
        "type": "string"
      },
      "description": "Only if the user asked for it."
    }
  }
}
find_grinder annotations
{
  "title": "Find a grinder",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
translate_recipe — Grind for a recipe on your grinder
Advertised by the server during the last successful anonymous check.
Advertised read-only

Turn a recipe written in the open BrewMark Protocol into a setting on the user's own grinder. Use when a coffee bag or roaster gives a BrewMark code or link ("7H2KQ9", "brewmark.io/p/7H2KQ9"), or a recipe gives its grind as a BrewMark Grind Index ("BGI 38") or as an Open Brew Profile (JSON with "spec": "brewmark.obp/0.1"). Pass one of `code`, `bgi` or `profile`. Spec: https://github.com/jeffreygluck/brewmark-protocol. For a recipe that quotes a setting on another grinder, use convert_grind_setting instead.

translate_recipe input schema
{
  "type": "object",
  "required": [
    "grinder"
  ],
  "properties": {
    "bgi": {
      "type": "number",
      "description": "Grind target on the BrewMark Grind Index, 0 (espresso fine) to 100 (very coarse); 40 is filter medium"
    },
    "code": {
      "type": "string",
      "description": "A BrewMark code from a coffee bag, or its link, e.g. \"7H2KQ9\" or \"https://brewmark.io/p/7H2KQ9\""
    },
    "grinder": {
      "type": "string",
      "description": "The user's grinder, named however they said it, e.g. \"Fellow Ode\", \"Baratza Encore\""
    },
    "profile": {
      "type": "object",
      "description": "An Open Brew Profile (spec \"brewmark.obp/0.1\"), as given by the roaster or app"
    }
  }
}
translate_recipe annotations
{
  "title": "Grind for a recipe on your grinder",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_grinders — List supported grinders
Advertised by the server during the last successful anonymous check.
Advertised read-only

Every grinder BrewMark supports. Use this to check whether a grinder is covered, or to disambiguate when another tool reports more than one match. Not needed just to look up a name — the other tools accept ordinary names directly.

list_grinders input schema
{
  "type": "object",
  "properties": {
    "search": {
      "type": "string",
      "description": "Optional case-insensitive filter on brand or model name"
    }
  }
}
list_grinders annotations
{
  "title": "List supported grinders",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

brewmark-card — BrewMark card

Advertised by the server during the last successful anonymous check.

brewmark-card URI
ui://brewmark/card-v5.html

MIME type: text/html;profile=mcp-app

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1287 ms
95th percentile latency
1287 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1287 ms · metadata changed · 6 tool(s), 1 resource(s), 0 resource template(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http brewmark-mcp https://brewmark.io/api/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add brewmark-mcp --url https://brewmark.io/api/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable brewmark-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "brewmark-mcp": {
      "url": "https://brewmark.io/api/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "brewmark-mcp": {
      "type": "streamableHttp",
      "url": "https://brewmark.io/api/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start brewmark-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "brewmark-mcp": {
      "type": "http",
      "url": "https://brewmark.io/api/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http brewmark-mcp https://brewmark.io/api/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "brewmark-mcp": {
      "url": "https://brewmark.io/api/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "brewmark-mcp": {
      "serverUrl": "https://brewmark.io/api/mcp"
    }
  }
}

Let your agent find its tools

Find servers like BrewMark MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run BrewMark MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing