bring-mcp-catalog
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.
bring-mcp-catalog

An MCP (Model Context Protocol) server for Bring! shopping lists, in TypeScript.
This is a derivative of florianwittkamp/bring-mcp by Florian Wittkamp, MIT licensed, and it would not exist without that project. It keeps all 16 of the original tools and adds 11 more, built around one idea:
Bring! stores an item by a canonical, language-independent id (
Äpfel,Kartoffeln) and each client renders that id in the list's own language. An item saved as free text ("Apples" / "Maçãs") is stuck without an icon forever. The same item saved asÄpfelshows as "Maçãs" to a Portuguese phone, "Apples" to an English one, and carries the right icon and aisle for free.
So this fork resolves what you type against Bring's real catalog, in any of the indexed languages, and saves the canonical id when it is confident enough.
Changelog · Contributing · Security · Releases
⚠️ Status, and please read this bit
This was vibe-coded. Use it entirely at your own risk.
It was built fast, conversationally, with heavy AI assistance, by someone who is not a professional developer. It has not been audited by anyone qualified to audit it. It talks to an unofficial, reverse-engineered API and it writes to a real shopping list that other people can see.
I take no responsibility for anything it does: not for wrong items, wrong icons,
deleted entries, corrupted lists, a blocked Bring! account, or anything else.
There is no warranty of any kind, express or implied, including merchantability
and fitness for a particular purpose. Nothing here is supported, and no fix is
promised. If it breaks something you care about, that is your problem, and you
accepted that by running it. This is the standard MIT position (see LICENSE),
stated plainly so nobody is surprised by it.
In fairness, the code has been through a fair amount of adversarial review and carries 200+ tests — but "reviewed a lot" is not "safe", and none of that changes a word of the paragraph above. Try it on a list you do not care about first.
Issues and pull requests are welcome, and I read them when I can. That is not a commitment to fix, merge, or reply.
Also, as the original project says: not affiliated with Bring! Labs AG in any way. The unofficial API may change or be blocked at any time, which could stop this working without notice.
Related MCP server: mcp-bring
✨ What this adds over the original
Catalog resolution — turn a phrase in any indexed language into Bring's canonical item id, so items render correctly in every household member's language, with icons and aisles.
A deliberately conservative matcher — it refuses to guess. Ambiguous queries (
paprikais two different real catalog items) resolve to nothing rather than to a coin flip, on the principle that a wrong icon is worse than no icon, because nobody goes looking for it.Icons and sections — read, set and clear the per-item customisations that the Bring! apps show.
Rename — carrying the item's specification and its icon across the rename.
Loud failures instead of silent no-ops — the underlying API answers
204whether or not a name matched, so a typo used to look like success. Names are verified before every destructive write.Correct request encoding — the upstream
bring-shoppingpackage builds request bodies by string concatenation with no escaping, soFish & Chipswas silently stored asFish, and50% Creamnever arrived at all. Fixed here.
New tools
saveItemResolved, findCatalogItem, findCatalogSection, setItemIcon,
setItemSection, listItemCustomisations, removeItemCustomisation,
renameItem, batchUpdateItems, setListArticleLanguage, bringApiRaw
Everything from the original is still present and still works.
📦 Install
This project is not on npm. Install it from GitHub — it takes a minute:
git clone https://github.com/SpellsPT/bring-mcp-catalog.git
cd bring-mcp-catalog
npm ci
npm run build
cp .env.example .env
chmod 600 .env # it holds your Bring! passwordThen edit .env:
BRING_EMAIL=your_email@example.com
BRING_PASSWORD=your_password
BRING_MCP_CATALOG_LOCALES=de-DE,en-US # see "Configure your languages" belowThe server reads .env from its own install directory, so it works no matter
which directory your MCP client starts it from. Anything your client passes in
its own env block takes precedence over the file. To keep the file somewhere
else, point BRING_MCP_ENV_FILE at it.
Now add it to your MCP client. For Claude Desktop, in claude_desktop_config.json:
{
"mcpServers": {
"bring": {
"command": "node",
"args": ["/ABSOLUTE/PATH/TO/bring-mcp-catalog/build/src/index.js"]
}
}
}Any MCP client that can launch a stdio server works the same way: the command is
node /ABSOLUTE/PATH/TO/bring-mcp-catalog/build/src/index.js.
Updating: git pull && npm ci && npm run build, then restart your MCP client.
PW, the variable names older versions used, are still accepted.
🚀 Features
Automatic Authentication: No manual login required - authentication happens automatically on first API call
Exposes Bring! API functions as MCP tools:
🧾 Load shopping lists
🛒 Get and modify items (add, remove, move)
📦 Batch operations (save multiple items, delete multiple items)
🖼 Save/remove item images
👥 Manage list users
🎯 Get default shopping list UUID
🌐 Load translations & catalog
📨 Retrieve pending invitations
Communicates via STDIO (for use with Claude Desktop or MCP Inspector)
Every tool declares its input and output schema and read-only / destructive hints (MCP SDK v2), and returns structured results alongside a readable text summary
Supports Bring! credentials via
.envfile or injected environment variables
Available Tools
From the original project
loadLists— load all shopping listsgetItems— all items on a listgetItemsDetails— raw per-item detail recordssaveItem— add an item, with an optional specificationsaveItemBatch— add several items in one callremoveItem— remove an item (verifies the name exists first)moveToRecentList— mark an item boughtdeleteMultipleItemsFromList— remove several by name, reporting missessaveItemImage/removeItemImage— per-item photogetAllUsersFromList— who shares the listgetUserSettings— settings for the authenticated usergetDefaultList— the default list's uuidloadTranslations— Bring!'s UI translationsloadCatalog— the raw item catalog for a localegetPendingInvitations— outstanding list invitations
Added here
saveItemResolved— the main one. Resolves your phrase against the catalog and stores the canonical id when confident, otherwise stores your text verbatim and attaches the closest icon, otherwise stores your text alone. It tells you which of the three happened.findCatalogItem/findCatalogSection— search the catalog, with scores, so you can see why something matched before you write anything.setItemIcon/setItemSection— set an item's icon or aisle.listItemCustomisations— every icon/section/image override on a list, rendered in a human language rather than as German canonical ids.removeItemCustomisation— drop an item's overrides.renameItem— rename, carrying the specification and the icon across.batchUpdateItems— mixed add / mark-bought / remove in one call.setListArticleLanguage— which language the list renders in.bringApiRaw— an escape hatch onto the raw API for probing undocumented endpoints. Off unlessBRING_MCP_RAW=1, and when on it allows every verb, including DELETE — enable it only while exploring, never on an assistant.
🌍 Configure your languages first
This is the one setting that matters. Catalog resolution can only match a
language it has indexed, so out of the box it indexes de-DE and en-US:
BRING_MCP_CATALOG_LOCALES=de-DE,pt-BR,en-US # a Portuguese/English household
BRING_MCP_CATALOG_LOCALES=de-DE,fr-FR # a French onede-DE is always included whether you list it or not — Bring's canonical item
ids are the German names, so indexing German is what makes an exact id match
work. An unsupported locale throws at startup rather than being skipped, so a
typo is loud instead of quietly giving you a matcher that never recognises your
words. Supported locales are listed in src/catalog.ts.
Optionally, BRING_MCP_DESCRIBE_LOCALE sets the language
listItemCustomisations renders in; it defaults to the first indexed locale
that is not German.
🏃 Running and debugging
Start it by hand to check your credentials:
node build/src/index.jsIt prints MCP server for Bring! API v<version> is running on STDIO on stderr and
waits for a client. To poke at the tools interactively, use the MCP Inspector:
npx @modelcontextprotocol/inspector node /ABS/PATH/bring-mcp-catalog/build/src/index.js🔧 Development
Testing
Run tests with:
npm run testThis command runs formatting, linting, and Jest tests with coverage reporting.
For CI testing:
npm run test:ciBuilding
Build the project:
npm run buildKey Dependencies and Tools
@modelcontextprotocol/server(MCP SDK v2): the MCP server implementation@modelcontextprotocol/inspector: Run on demand withnpxfor testing and debugging MCP serversbring-shopping: Node.js wrapper for the Bring! APIzod: For schema definition and validationdotenv: For managing environment variables
✅ Final Notes
🔒 Avoid committing your
.envfile.🧼 Keep credentials out of version control.
🛠 MCP Inspector is invaluable for debugging.
🔄 Authentication is handled automatically - no manual login required.
📦 Use batch operations for efficiency when working with multiple items.
Happy coding with MCP and Bring! 🎉
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
This server cannot be deployed
Maintenance
Related MCP Connectors
Manage Superlist tasks and lists in plain language from any MCP-compatible AI agent.
AnyList MCP server for ChatGPT, Claude and any AI agent: list shopping lists, add list item, cross off item, read recipe, create recipe, add recipe to meal plan and add meal plan ingredients to list in your own AnyList account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to AnyList yourself; Cotlet does not store your password and you need no AnyList API key. About the official AnyList API: AnyList has no public API, developer docs or official MCP server (checked 25 Oct 2026). The official connections are voice entry with Siri and Amazon Alexa, and an iCalendar link that shows your meal plan in a calendar app. Setup and FAQ: https://cotlet.dev/integrations/anylist-api-mcp-server
Persistent shopping memory for AI assistants. The AI reasons; Kaufliste stores and executes.
Turn any shopping list into a ready-to-checkout grocery cart across 26 European supermarkets.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables interaction with Bring! shopping lists through natural language, allowing users to manage shopping items, lists, and collaborate with other users via the unofficial Bring! API.153 npm35MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to read and manage your Bring! shopping lists through natural language commands like adding items, marking purchases, and retrieving list contents.MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage a shared shopping list by adding, viewing, updating, and deleting products for different people via MCP tools.-
- AlicenseNot gradedqualityBmaintenanceEnables verified Bring! shopping-list operations such as listing items, searching the catalog, classifying products, adding/moving/checking/removing items, and managing product photos through MCP tools.229 npm1MIT