A small Model Context Protocol server for the Bring! shopping list API.
It exposes Bring! shopping lists to MCP clients such as Claude Desktop, Cursor, or any client that can launch a stdio MCP server.
get_lists— list all Bring! shopping lists and their UUIDsget_list— fetch one shopping list and show to-buy plus recently completed itemsadd_item— add or update an item on a listremove_item— remove an item from a listcomplete_item— move an item to Recently Purchased (complete it in Bring!)batch_update— apply bulk operations (ADD,COMPLETE, orREMOVE) to multiple items
bring://lists— JSON index of every shopping listbring://lists/{listUuid}— JSON contents of a single list (purchase + recently sections)
Clients such as Claude Desktop expose these in their "attach resource" picker.
meal_plan— plan a meal and stage missing ingredients on a target listweekly_groceries— draft a balanced weekly grocery list and stage it on a target list
- Python 3.11+
- A Bring! account
- Environment variables for your Bring! login
git clone https://github.com/arithmetic-zz/bring-mcp-server.git
cd bring-mcp-server
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txtSet these environment variables:
export BRING_EMAIL="your@email.com"
export BRING_PASSWORD="your-password"Or create a local .env file:
BRING_EMAIL=your@email.com
BRING_PASSWORD=your-password.env is ignored by Git. Do not commit real Bring! credentials.
python3 server.pyThe server communicates over stdio, so it is normally launched by an MCP client instead of being run interactively.
{
"mcpServers": {
"bring": {
"command": "python",
"args": ["/path/to/bring-mcp-server/server.py"],
"env": {
"BRING_EMAIL": "your@email.com",
"BRING_PASSWORD": "your-password"
}
}
}
}If you use the virtual environment from the installation steps, set command to /path/to/bring-mcp-server/.venv/bin/python.
python3 -m py_compile server.py
python3 -m unittest discover -s tests -vGitHub Actions runs the same compile and unit-test checks on Python 3.11, 3.12, and 3.13 for pushes and pull requests.
- The server keeps one authenticated Bring client per process and reuses the HTTP session.
get_listfollows the currentbring-apiresponse shape: active items are underpurchase, completed/recent items underrecently.save_item(used byadd_item) is an upsert — adding an item that already exists updates it rather than creating a duplicate.complete_itemmoves items to the "Recently Purchased" list; it does not check items off in place.- Known Bring/API/input errors are caught, logged, and translated into short user-facing messages.
MIT