MCP服务器
提供杂货店特价的模型上下文协议(MCP)服务器 看看食品价格。该服务器使AI代理能够访问当前交易,并根据可用报价建议食谱。
特性
- 🏪 店铺管理:在中配置多个杂货店
config.json - 🔍 报价报废:使用智能缓存从matpriskollen.se获取特别优惠(1小时TTL)
- 📊 类别式组织:自动对报价进行分类(蛋白质、蔬菜、乳制品等)
- 🎯 灵活过滤:按商店名称、ID或类别筛选优惠
- ⚡ 高效缓存:通过智能缓存管理最大限度地减少网络抓取
安装
- 安装依赖项:
npm install- 构建项目:
npm run build配置
编辑 config.json 添加或删除商店。每个商店需要三个字段:
[
{
"name": "Lidl Fruängen",
"storeId": "711",
"butikId": "e22591ff-9138-4bf1-ba2e-6bffe8b2ba29"
},
{
"name": "Hemköp Fruängen",
"storeId": "3426",
"butikId": "77626d44-4104-4c9b-8936-c99a0258146e"
}
]name:你对这家店的亲切称呼storeId:cookie中使用的ID(例如“711”)butikId:UUID用于标识页面上的优惠
查找商店ID
- 访问 看看食品价格。
- 选择您想要的商店
- 对于storeId:检查
_SelectedStores浏览器开发工具中的cookie
- Cookie格式: "%2C711%2C3426%2C3902" - 提取数字ID(例如。, 711, 3426, 3902)
- 对于butikId:查看页面源代码并搜索
butikId=在“添加到购物车”链接中
- 格式: ?butikId=e22591ff-9138-4bf1-ba2e-6bffe8b2ba29 - 提取UUID
使用Claude Desktop
将此添加到您的Claude Desktop配置文件中:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json 视窗: %APPDATA%/Claude/claude_desktop_config.json
{
"mcpServers": {
"matpriskollen": {
"command": "node",
"args": ["/absolute/path/to/matpriskollen-mcp/dist/index.js"]
}
}
}替换 /absolute/path/to/matpriskollen-mcp 与这个项目的实际路径。
MCP工具
get_offers
从已配置的商店获取当前特价。
参数:
storeNames(可选):要筛选的商店名称数组(例如,\[“Lidl”,“ICA”\])storeIds(可选):从cookie中筛选的商店ID数组(例如,\[“711”,“808”\])categories(可选):要筛选的类别名称数组
退货: 包含产品名称(包括数量)、价格、商店名称和类别的优惠列表。
例子:
// Get all offers
get_offers()
// Get offers from specific store by ID
get_offers({ storeIds: ["711"] })
// Get offers from Lidl stores
get_offers({ storeNames: ["Lidl"] })
// Get protein offers
get_offers({ categories: ["Kött"] })
// Combine filters
get_offers({ storeIds: ["711", "808"], categories: ["Grönsaker", "Frukt & bär"] })list_stores
返回所有已配置的存储及其名称和ID。
例子:
list_stores()get_categories
返回网站上所有可用的优惠类别。
例子:
get_categories()发展
查看哪些商店有优惠:
npm run check-stores开发观察模式:
npm run dev生产建设:
npm run build启动服务器:
npm startMCP检验员测试:
npm run inspector这将打开一个web界面,您可以在其中交互式地测试MCP工具。
运作原理
- 存储配置:门店定义见
config.json带有name、storeId(用于cookie)和butikId(用于匹配) - Web剪贴:服务器使用以下命令抓取matpriskollen.se
_SelectedStores带有storeId的cookie - 类别发现:从主页获取所有可用类别
- 提供提取:从所有类别页面(目前有23个类别)中删除优惠
- butikId匹配:每个报价都包含一个butikId,与配置匹配以获得友好的商店名称
- HTML解析:从报价表中提取产品名称、价格、数量和ButikId
- 缓存:结果将缓存1小时,以尽量减少请求
- 过滤:优惠可以按商店ID(cookie ID)、商店名称或类别进行筛选
- MCP工具:公开了AI代理可以调用以访问数据的三个工具
食谱建议
MCP服务器提供数据;你的AI代理处理食谱建议。服务器:
- 从所有已配置的商店获取优惠
- 包括连锁店名称,以区分同一地点的商店(例如,“Lidl Fruängen”与“Coop Fruärgen”)
- 涵盖所有可用类别,包括蔬菜、肉类、乳制品、零食等
- 提供当前销售价格和数量信息
- 按类别提供的组,便于扫描
您的AI代理可以使用此数据:
- 根据出售的可用配料推荐食谱
- 按特定商店或连锁店筛选优惠
- 优化以实现最大节省
- 关注健康选择(蔬菜、蛋白质)
- 考虑饮食限制
技术细节
- 语言:TypeScript
- MCP-SDK:
@modelcontextprotocol/sdk - 依赖项:最小(仅MCP SDK+TypeScript)
- Web剪贴:原生Node.js
fetchAPI - 缓存TTL:1小时(360万毫秒)
- 运输:stdio(标准输入/输出)
备注
⚠️ HTML解析:scraper使用基于正则表达式的HTML解析。如果matpriskollen.se更改了其HTML结构 src/scraper.ts 可能需要更新。
⚠️ 缓存行为:如果抓取失败,服务器将返回过时的缓存数据(如果可用)。检查缓存状态的日志。
⚠️ butikId要求:每个商店都必须有一个有效的 butikId 与matpriskollen.se上使用的UUID匹配。配置中没有匹配butikId的优惠将被过滤掉。使用 npm run check-stores 核实所有商店都有优惠。
许可证
麻省理工学院
