Token导航 LogoToken导航TokenDH.com
Cooking Recipes Server Example logo
数据服务stdio官方级别未说明来源级核验

Cooking Recipes Server Example

MCP Server

@modelcontextprotocol/inspector

一个基于MCP协议的食谱搜索和检索服务,使用Python和向量数据库实现,支持通过自然语言查询食谱。

工具数

2

提示词数

0

GitHub Stars

0

资源数

0
向量数据库Python自然语言处理

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

作者 / 组织

michaelgruczel

提供方

michaelgruczel

最后核验

2026/5/17 20:19

运行时

Node.js

快速接入

先看主来源和安装命令,再打开仓库或文档;下面只保留这个条目的关键接入事实。

命令预览

npx @modelcontextprotocol/inspector

详细介绍

mcp烹饪食谱服务器示例

这是一个如何实现MCP服务器的烹饪食谱搜索和 使用python和矢量数据库的配方检索端点。

MCP(模型上下文协议)是用于将AI应用程序连接到外部系统的开源标准。 MCP服务器是一个充当桥梁的程序,允许AI模型连接到外部工具和数据源并与之交互。 MCP主机是主要的应用程序,例如使用模型上下文协议(MCP)连接到MCP服务器的外部工具并与之交互的聊天机器人。 MCP主机使用LLM选择最佳匹配工具,并将响应转换为自然语言答案。

在这个例子中,我们将运行一个MCP服务器,它公开了2个端点/工具。

  • search_for_recipes-在中搜索食谱
  • get_recipe_by_id-按配方id检索配方。

我们将从MCP主机(LM Studio)连接该MCP服务器,以便在自然聊天中与MCP服务器进行交互。

flow

流程如下:

  • 1-python脚本'load_data_db.py'将读取一个包含配方的csv文件,并将其加载到向量数据库中进行搜索,加载到关系数据库中进行单个配方检索。
  • 2-python MCP服务器“MCP_torial_server.py”将向MCP主机公开其可用工具
  • 3-当我们在MCP主机聊天(LM Studio)中查询配方时,主机将决定从我们的MCP服务器调用“search_for_recipes”工具,MCP服务器将从向量数据库中返回最佳匹配配方的id。
  • 4-在我们的MCP服务器返回id后,MCP主机将决定从我们的MCP server调用“search_for_recipes”工具,MCP服务器将从关系数据库返回配方。MCP主机将在聊天中使用连接的LLM进行响应,并从中生成漂亮的文本。

你应该提前了解和准备的概念和工具

矢量数据库

传统数据库将信息组织在表中,并通过分配的值定位数据。 当您查询传统数据库时,它会返回与您的查询完全匹配的结果。 矢量数据库、矢量存储或矢量搜索引擎是一种可以将矢量与其他数据项一起存储的数据库。 向量数据库通常实现一个或多个近似最近邻算法,以便可以使用查询向量搜索数据库以检索最接近的匹配数据库记录。 向量是高维空间中数据的数学表示。 在这个空间中,每个维度对应于数据的一个特征,具有维度的数量。 令牌提取和向量计算基于语言,使用LLM。

矢量数据库使用3个概念:

  • 嵌入-图像/文本/音频中的子元素被转换为数字列表。此过程使文档可用于机器学习模型。嵌入代表了文档的本质。
  • 索引-矢量索引是指将矢量嵌入存储在数据库中,以进行高效的相似性搜索。
  • 查询-矢量数据库能够根据查询检索相似对象,基于使用近似最近邻(ANN)搜索进行索引和相似性计算的预先计算值。

对于我们的示例,我们将使用色度dbhttps://github.com/chroma-core/chroma. 我们使用默认的色度DB设置进行嵌入。 基于OnnxRuntime和MiniLM-L6-v2模型的默认ChromaDB嵌入函数。 全MiniLM-L6-v2的优点是体积小(仅22MB)、速度快、准确。

用例数据

对于这个例子,我将使用kaggle的数据https://www.kaggle.com/datasets/shuyangli94/food-com-recipes-and-user-interactions?select=RAW_recipes.csv 该数据集包括180K+食谱和700K+食谱评论,涵盖了Food.com(前身为GeniusKitchen)上18年的用户互动和上传。 在开始之前从网站下载并提取RAW_cipes.csv。

紫外线的

此示例实现使用python。 为了在不同的项目中使用多个版本的python,有一个概念 虚拟环境。意味着每个项目都有自己的虚拟环境和虚拟python版本。 此外,我们希望安装软件包并管理配置。 UV是一个Python包和项目管理器,以一种很好的方式为我们管理所有这些东西 并替换了ool等工具来替换pip、pip工具、pipx、pyenv、virtualenv。

检查https://github.com/astral-sh/uv了解更多详情。

因此,请确保您安装了UV。

LM工作室

LM Studio是一个运行本地LLM的工具,如gpt-oss、Qwen3、Gemma3, DeepSeek和更多内容可以在您的计算机上私下免费使用。

从下载并安装lmstudiohttps://lmstudio.ai/.

码头工人

Docker是一个管理程序,这意味着您可以在封装中运行完整的操作系统。 操作系统在本地所谓的容器中与单个应用程序一起运行。 在我们的例子中,我们将运行一个小型操作系统,其中一个容器中有一个postgres DB,另一个容器里有一个chromadb。 确保你安装了docker或其他可以运行docker容器的工具。

MCP检查员

MCP服务器可供多个客户端使用,例如使用LLM的聊天。 我们将使用LM Studio作为MCP主机来调用我们的MCP服务器。 但在我们检查聊天中的一切是否正常之前, 我们应该检查我们的Python实现 公开可用的MCP端点。 MCP检查器在这方面工作得很好,这样我们就可以在没有LLM开销的情况下调用MCP服务器端点。

检查https://modelcontextprotocol.io/docs/tools/inspector了解更多详细信息,并确保

npx @modelcontextprotocol/inspector

作品。您可能需要安装npx,请参阅https://docs.npmjs.com/cli/v8/commands/npx.

让我们开始吧

检查项目设置

检查UV和python是否正常工作

# install python packages
uv sync --locked

# activate you virtual env
. .venv/bin/activate

将食谱加载到数据库中

我准备了一个从RAW_cipes.csv文件加载食谱的脚本。 它连接到一个向量数据库和一个postgres数据库,并将食谱添加到展台数据库中。 矢量数据库用于搜索接近以下值的条目 请求和postgres包含真实数据。 您可以在文件“load_data_db.py”中找到它。 最重要的因素是。

连接色度并创建表格

chroma_client = chromadb.HttpClient(host='localhost', port=8000)
...
chroma_client.create_collection("recipes")
chroma_collection = chroma_client.get_collection("recipes")
...
postgres_client = psycopg2.connect(
  dbname='mcp_tutorial_data',
  user='mcp_tutorial_data_db_user', 
  host='localhost',
  password='mcp_tutorial_data_db_password'
)
postgres_cursor.execute(sql.SQL("CREATE TABLE RECIPES (id TEXT not null, name TEXT not null, minutes NUMERIC, n_steps NUMERIC, steps TEXT, ingredients TEXT, n_ingredients NUMERIC);"))

连接到postgres并创建表

postgres_client = psycopg2.connect(
  dbname='mcp_tutorial_data',
  user='mcp_tutorial_data_db_user', 
  host='localhost',
  password='mcp_tutorial_data_db_password'
)
postgres_cursor.execute(sql.SQL("CREATE TABLE RECIPES (id TEXT not null, name TEXT not null, minutes NUMERIC, n_steps NUMERIC, steps TEXT, ingredients TEXT, n_ingredients NUMERIC);"))

使用食谱从csv添加数据

with open('RAW_recipes.csv', newline='') as csv_file:
  csv_reader = csv.reader(csv_file, delimiter=',')
  line_count = 0
  for row in csv_reader:
    if line_count == 0:
      print(f'Column names are id{", ".join(row)}')
      line_count += 1
    else:
      # name,id,minutes,contributor_id,submitted,tags,nutrition,n_steps,steps,description,ingredients,n_ingredients
      # 0 name, 1 id, 2 minutes, 3 contributor_id, 4 submitted,
      # 5 tags, 6 nutrition, 7 n_steps, 8 steps,
      # 9 description, 10 ingredients, 11 n_ingredients
      
      text_to_index = str(row[0]) + str(row[8]) + str(row[9])
      chroma_collection.add(
        documents=[text_to_index],
        ids=[row[1]],
        metadatas=[{"complexity": complexity, "duration": duration}],
      )
      insert_text = "INSERT INTO RECIPES (id, name, minutes, n_steps, steps, ingredients, n_ingredients) values (" + str(row[1]) + ",'" + str(row[0]) + "'," + str(row[2]) + "," + str(row[7]) + ",'" + steps_text + "','" + ingedients_text + "'," + str(row[11]) + ");"
      postgres_cursor.execute(sql.SQL(insert_text))
      line_count += 1      

现在让我们将一些数据加载到vector和postgres数据库中。 这将花费大量时间,但您可以在mcp服务器完成之前运行它。 因此,在加载过程中,请随时进入下一步。

$ docker compose up
$ uv run load_data_db.py

Collection did not exist, that's fine
Column names are idname, id, minutes, contributor_id, submitted, tags, nutrition, n_steps, steps, description, ingredients, n_ingredients
100 processed...
200 processed...
...

运行python mcp服务器

我在文件“mcp_totorial_server.py”中准备了一个用python实现的mcp服务器。 我们使用FastMCP python库并公开2个端点:

  • “search_for_recipes”接收来自LLM的字符串,并在向量数据库中搜索匹配项,然后返回最佳匹配配方的ID。
  • 'get_recipe_by_id'获取配方的id,并从postgres数据库返回配方。
@mcp.tool()
async def search_for_recipes(search_phrase: str, ctx: Context) -> list[str]:
    """Get recipe IDs by fitting to the search phrase"""
    await asyncio.sleep(1)
    # https://docs.trychroma.com/docs/querying-collections/query-and-get
    results = chroma_collection.query(
        query_texts=[search_phrase],
        n_results=1
        # where={"metadata_field": "is_equal_to_this"}, # optional filter
        # where_document={"$contains":"search_string"}  # optional filter
    )
    await ctx.info(f"search complete: {results}")
    search_result = [str(results["ids"][0][0])]
    return search_result

@mcp.tool()
async def get_recipe_by_id(
    recipe_id: str,
    ctx: Context
) -> str:
    """Get recipe by recipe ID"""
    await asyncio.sleep(1)
    select_command = "SELECT * FROM RECIPES WHERE id = '" + recipe_id + "' limit 1"
    await ctx.info(f"execute against DB {select_command}")
    postgres_cursor.execute(sql.SQL(select_command))
    row = postgres_cursor.fetchone()
    #for index, val in enumerate(row):
    #    await ctx.info(f"column {index} value {val} of type {type(val)}")
    #id, name, minutes, n_steps, steps, ingredients, n_ingredients
    await ctx.info(f"found {str(row)}")
    response = row[1] + " takes " + str(row[2]) + " minutes, follow this steps:" + row[4] + ", you need " + row[5]
    await ctx.info(f"response {response}")
    return response

您可以运行mcp服务器。

$ mcp run mcp_tutorial_server.py
# Your server is now accessible at http://localhost:8000/mcp. 

现在再次停止,因为MCP主机和MCP检查器将根据需要启动它。 我们不必自己在后台运行它。 因此,现在使用mcp检查器检查mcp主机是否正常工作

npx @modelcontextprotocol/inspector

您应该连接到本地MCP并查看提供的工具。

使用此配置:

  • STDIO协议
  • command:您签出此repo的文件夹+“/.venv/bin/python”
  • args:您签出此仓库的文件夹+“mcp_totorial_server.py”

如果复制服务器文件不起作用,您可以通过单击复制服务器文件来仔细检查配置, 配置应该是这样的:

{
    "mcpServers": {
        "default-server": {
            "command": "/.venv/bin/python",
            "args": [
                "/mcp_tutorial_server.py"
            ],
            "env": {
                ...
            }
        }
    }
}

如果你点击列表工具,你应该会看到我们定义的2个工具,并且你应该能够直接调用它们。

mcp inspector

通过调用展台MCP工具端点来尝试并使用它。

连接到聊天室

现在我们启动LM studio,并将其连接到MCP主机以进行真正的用户交互。

下载LLM模型以使用openai/gpt-oss-20b等。 现在我们可以配置MCP主机了。 LM Studio支持本地和远程MCP服务器。 您可以通过编辑应用程序的mcp.json文件来添加mcp。 切换到右侧边栏中的“程序”选项卡,单击安装>编辑mcp.json

添加一个运行示例的配置,您已经从mcp检查器中知道了该配置,这样应该可以工作:

{
  "mcpServers": {
    "recipe-server": {
      "command": "/.venv/bin/python",
      "args": [
        "/mcp_tutorial_server.py"
      ],
      "env": {}
    }
  }
}

lmstudio config 1

lmstudio config 2

现在我们可以试试

lmstudio chat 1

lmstudio chat 2

这意味着,如果你问一个食谱:

  • LM Studio将在聊天中使用用户输入,并知道连接的MCP服务器,它将识别配方服务器是否适合请求,并为此使用LLM。
  • 它将把搜索端点称为最合适的端点。
  • 它将使用返回的id来调用第二个MCP端点。
  • 然后,它将从第二个端点获取响应,并使用LLM从中生成一个漂亮的文本。

目录标签

目录标签

向量数据库Python自然语言处理食谱搜索本地部署MCP协议AI应用

接入字段

传输方式(transport,传输协议)

stdio

鉴权方式(authType,认证方式)

none

运行时(runtime,运行环境)

Node.js

来源包(packageName,安装包名)

@modelcontextprotocol/inspector

工具数量(toolCount,工具数)

2

资源数量(resourceCount,资源数)

0

提示词数量(promptCount,提示词数)

0

权限和风险

stdionone部署方式未说明

接入前请确认传输方式、认证方式和部署位置,并根据实际工具能力限制访问范围。

安装前确认

不要直接授予不必要的文件、网络或账号权限;先核对安装命令和配置内容。

来源信息

继续浏览同类 MCP