食品价格监控服务器

一个提供超市特价商品信息的MCP服务器,支持AI代理获取当前优惠并根据可用优惠推荐食谱。

  • by kyngvesson
  • JavaScript
  • 本地部署
  • 5 星标
  • 更新于
在 GitHub 查看 kyngvesson/matpriskollen-mcp

使用说明

MCP服务器

提供杂货店特价的模型上下文协议(MCP)服务器 看看食品价格。该服务器使AI代理能够访问当前交易,并根据可用报价建议食谱。

特性

  • 🏪 店铺管理:在中配置多个杂货店 config.json
  • 🔍 报价报废:使用智能缓存从matpriskollen.se获取特别优惠(1小时TTL)
  • 📊 类别式组织:自动对报价进行分类(蛋白质、蔬菜、乳制品等)
  • 🎯 灵活过滤:按商店名称、ID或类别筛选优惠
  • ⚡ 高效缓存:通过智能缓存管理最大限度地减少网络抓取

安装

  1. 安装依赖项:
npm install
  1. 构建项目:
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

  1. 访问 看看食品价格。
  2. 选择您想要的商店
  3. 对于storeId:检查 _SelectedStores 浏览器开发工具中的cookie
    • Cookie格式: "%2C711%2C3426%2C3902"
    • 提取数字ID(例如。, 711, 3426, 3902)
  4. 对于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 start

MCP检验员测试:

npm run inspector

这将打开一个web界面,您可以在其中交互式地测试MCP工具。

运作原理

  1. 存储配置:门店定义见 config.json 带有name、storeId(用于cookie)和butikId(用于匹配)
  2. Web剪贴:服务器使用以下命令抓取matpriskollen.se _SelectedStores 带有storeId的cookie
  3. 类别发现:从主页获取所有可用类别
  4. 提供提取:从所有类别页面(目前有23个类别)中删除优惠
  5. butikId匹配:每个报价都包含一个butikId,与配置匹配以获得友好的商店名称
  6. HTML解析:从报价表中提取产品名称、价格、数量和ButikId
  7. 缓存:结果将缓存1小时,以尽量减少请求
  8. 过滤:优惠可以按商店ID(cookie ID)、商店名称或类别进行筛选
  9. MCP工具:公开了AI代理可以调用以访问数据的三个工具

食谱建议

MCP服务器提供数据;你的AI代理处理食谱建议。服务器:

  • 从所有已配置的商店获取优惠
  • 包括连锁店名称,以区分同一地点的商店(例如,“Lidl Fruängen”与“Coop Fruärgen”)
  • 涵盖所有可用类别,包括蔬菜、肉类、乳制品、零食等
  • 提供当前销售价格和数量信息
  • 按类别提供的组,便于扫描

您的AI代理可以使用此数据:

  • 根据出售的可用配料推荐食谱
  • 按特定商店或连锁店筛选优惠
  • 优化以实现最大节省
  • 关注健康选择(蔬菜、蛋白质)
  • 考虑饮食限制

技术细节

  • 语言:TypeScript
  • MCP-SDK: @modelcontextprotocol/sdk
  • 依赖项:最小(仅MCP SDK+TypeScript)
  • Web剪贴:原生Node.js fetch API
  • 缓存TTL:1小时(360万毫秒)
  • 运输:stdio(标准输入/输出)

备注

⚠️ HTML解析:scraper使用基于正则表达式的HTML解析。如果matpriskollen.se更改了其HTML结构 src/scraper.ts 可能需要更新。

⚠️ 缓存行为:如果抓取失败,服务器将返回过时的缓存数据(如果可用)。检查缓存状态的日志。

⚠️ butikId要求:每个商店都必须有一个有效的 butikId 与matpriskollen.se上使用的UUID匹配。配置中没有匹配butikId的优惠将被过滤掉。使用 npm run check-stores 核实所有商店都有优惠。

许可证

麻省理工学院