Koskamo

Zovo Meal Planner MCP

An MCP server that converts weekly meal plans into merged grocery lists grouped by store section. It handles unit conversions, scales recipes, removes already-owned items, and outputs printable PDFs, CSVs, and text files.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Zovo Meal Planner MCP logo, by ZovoCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-08Published by Zovo
MCP endpoint (Streamable HTTP)
https://meal-planner.zovo.one/mcp
Vendor documentation

What its tools do

2 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

2 of 2 have a description · 2 of 2 declare behavior hints · 2 of 2 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Plan weekly dinners and generate a consolidated grocery list
  • Scale recipes to specific serving sizes
  • Group ingredients by store sections like produce or dairy
  • Export meal plans as printable PDFs or CSV files

Source and maintenance

Community listingRegistry 1.0.0

Protocol and capabilities

Server
meal-planner 1.0.0
MCP protocol negotiated in check
2025-11-25
Tools
2 advertised
Resources
1 advertised
Resource templates
1 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "resources": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Zovo Meal Planner turns a week of meals that you (the assistant) propose, with ingredient lines per meal, into a merged grocery list grouped by store section and a printable PDF (week grid plus checklist), CSV and text. Propose the meals and ingredients yourself, then call generate_meal_plan once with every meal and its ingredient lines and recipe servings; use generate_grocery_list for recipes without days. It adds quantities in the same dimension only (volume with volume, weight with weight) and never converts volume to weight. It gives no nutrition, health or diet advice.

Tools

2 advertised

generate_meal_plan — Generate meal plan and grocery list
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when the user wants a weekly meal plan, a meal planner template filled in, or a grocery list from their meal plan or meal prep. First turn what the user pasted (a plan, recipe, spreadsheet or e-mail) into meals: one entry per day and slot with its name, recipe servings and ingredient lines, one meal per day for lines like "Mon-Fri lunch". Put the original text in plan only when you cannot do that. If you propose the meals, pass them the same way. The tool parses quantities and units, scales servings to the number of people, merges the same ingredient across the week (volume with volume, weight with weight, not volume to weight), groups the list by store section, removes items the user already has, and returns a PDF (week grid plus checklist), CSV and text. Does not give nutrition, calorie or diet advice and does not order groceries.

generate_meal_plan input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "plan": {
      "anyOf": [
        {
          "anyOf": [
            {
              "type": "array",
              "items": {}
            },
            {
              "type": "string"
            },
            {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {}
            }
          ]
        },
        {
          "type": "null"
        }
      ],
      "description": "Fallback when you cannot build meals: the week as the user wrote it. Easiest: a list of meals, e.g. [{\"day\":\"Monday\",\"meal\":\"Dinner\",\"name\":\"Chicken stir fry\",\"servings\":4,\"ingredients\":[\"1 lb chicken thighs\",\"2 cups rice\",\"1/2 onion, diced\",\"salt to taste\"]}]. Also accepted: a list of days each with \"meals\", an object keyed by day and meal, or pasted text (markdown with **Monday** or ### Monday headings and \"- Dinner: Tacos (1 lb beef, 8 tortillas)\" lines, a markdown or spreadsheet table, or a recipe copied from a website)."
    },
    "meals": {
      "anyOf": [
        {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "array",
              "items": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "day": {
                        "type": [
                          "string",
                          "number",
                          "null"
                        ],
                        "description": "Weekday, e.g. \"Monday\". For a line like \"Mon-Fri lunch\" send one meal per day."
                      },
                      "name": {
                        "type": [
                          "string",
                          "number",
                          "null"
                        ],
                        "description": "Meal name, e.g. \"Beef tacos\""
                      },
                      "slot": {
                        "type": [
                          "string",
                          "number",
                          "null"
                        ],
                        "description": "Meal slot, e.g. \"Breakfast\", \"Lunch\", \"Dinner\", \"Snack\""
                      },
                      "servings": {
                        "type": [
                          "string",
                          "number",
                          "null"
                        ],
                        "description": "Servings the recipe makes as written, e.g. 4"
                      },
                      "ingredients": {
                        "anyOf": [
                          {
                            "anyOf": [
                              {
                                "type": "array",
                                "items": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "number"
                                    },
                                    {
                                      "type": "null"
                                    },
                                    {
                                      "type": "object",
                                      "properties": {
                                        "name": {
                                          "type": [
                                            "string",
                                            "number",
                                            "null"
                                          ],
                                          "description": "Ingredient name, e.g. \"ground beef\""
                                        },
                                        "unit": {
                                          "type": [
                                            "string",
                                            "number",
                                            "null"
                                          ],
                                          "description": "Unit, e.g. \"lb\", \"cup\", \"g\", \"can\"; empty for a count"
                                        },
                                        "quantity": {
                                          "type": [
                                            "string",
                                            "number",
                                            "null"
                                          ],
                                          "description": "Amount, e.g. 1.5 or \"1 1/2\""
                                        }
                                      },
                                      "additionalProperties": {}
                                    }
                                  ]
                                }
                              },
                              {
                                "type": "string"
                              }
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ],
                        "description": "Ingredient lines, e.g. [\"1 lb ground beef\", \"8 corn tortillas\"] or [{\"name\":\"ground beef\",\"quantity\":1,\"unit\":\"lb\"}]"
                      }
                    },
                    "additionalProperties": {}
                  }
                ]
              }
            }
          ]
        },
        {
          "type": "null"
        }
      ],
      "description": "Preferred. The week as structured meals you build from what the user pasted: one entry per meal and day, e.g. [{\"day\":\"Monday\",\"slot\":\"Dinner\",\"name\":\"Tacos\",\"servings\":4,\"ingredients\":[\"1 lb ground beef\",\"8 corn tortillas\"]}]. Expand \"Mon-Fri\" or \"Mon & Wed\" into one meal per day."
    },
    "title": {
      "type": [
        "string",
        "null"
      ],
      "description": "Title printed on the PDF, e.g. \"Family dinners\". Default \"Weekly meal plan\" or \"Grocery list\". Longer than 80 characters is shortened."
    },
    "units": {
      "type": [
        "string",
        "null"
      ],
      "description": "How to show merged amounts: \"us\" (cups, tbsp, oz, lb), \"metric\" (ml, l, g, kg) or \"auto\" (default: the system most lines use). Volume is never converted to weight."
    },
    "people": {
      "type": [
        "number",
        "string",
        "null"
      ],
      "description": "Servings to cook for each meal, e.g. 4 or \"4 people\". Each meal with a recipe yield (servings) is scaled to this number; meals without a yield are used as written. Default: no scaling."
    },
    "week_of": {
      "type": [
        "string",
        "null"
      ],
      "description": "Optional label for the week, e.g. \"Nov 2, 2026\". Printed as given; longer than 40 characters is shortened."
    },
    "page_size": {
      "type": [
        "string",
        "null"
      ],
      "description": "PDF paper: \"letter\" (default) or \"a4\"."
    },
    "already_have": {
      "anyOf": [
        {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": [
                  "string",
                  "null"
                ]
              }
            },
            {
              "type": "string"
            }
          ]
        },
        {
          "type": "null"
        }
      ],
      "description": "Items already in the kitchen to leave off the list, as a list or comma-separated text, e.g. [\"salt\", \"olive oil\", \"rice\"]. A section name such as \"spices\" removes that whole section."
    }
  }
}
generate_meal_plan output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "title",
    "people",
    "meals_count",
    "days",
    "meals",
    "items_count",
    "sections",
    "already_have_removed",
    "unparsed_lines",
    "notes",
    "units",
    "downloads"
  ],
  "properties": {
    "days": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "meals": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "day",
          "meal",
          "name",
          "servings"
        ],
        "properties": {
          "day": {
            "type": "string"
          },
          "meal": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "servings": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "title": {
      "type": "string"
    },
    "units": {
      "type": "string"
    },
    "people": {
      "type": [
        "number",
        "null"
      ]
    },
    "sections": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "section",
          "items"
        ],
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "name",
                "quantity",
                "meals"
              ],
              "properties": {
                "name": {
                  "type": "string"
                },
                "meals": {
                  "type": "number"
                },
                "quantity": {
                  "type": "string"
                }
              },
              "additionalProperties": false
            }
          },
          "section": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    },
    "downloads": {
      "type": "object",
      "required": [
        "pdf",
        "csv",
        "txt"
      ],
      "properties": {
        "csv": {
          "type": "string"
        },
        "pdf": {
          "type": "string"
        },
        "txt": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "items_count": {
      "type": "number"
    },
    "meals_count": {
      "type": "number"
    },
    "unparsed_lines": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "already_have_removed": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "additionalProperties": false
}
generate_meal_plan annotations
{
  "title": "Generate meal plan and grocery list",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
generate_grocery_list — Generate grocery list from recipes
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when the user wants one combined grocery list or shopping list from several recipes or a pasted list of ingredients, without a weekly grid. First turn what the user pasted (a list, recipe, store order, receipt or e-mail) into items with name, quantity and unit, plus meal and servings for recipe lines; leave out prices, totals, headers and e-mail text. Put the original text in recipes only when you cannot do that. Merges the same ingredient with unit conversion inside one dimension, scales servings, groups by store section, leaves off items the user already has, and keeps unreadable lines as written. Returns a printable checklist PDF, CSV and text. Does not give nutrition or diet advice.

generate_grocery_list input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "items": {
      "anyOf": [
        {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "array",
              "items": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "meal": {
                        "type": [
                          "string",
                          "number",
                          "null"
                        ],
                        "description": "Recipe or meal it belongs to, e.g. \"Tacos\" (optional)"
                      },
                      "name": {
                        "type": [
                          "string",
                          "number",
                          "null"
                        ],
                        "description": "Ingredient or product, e.g. \"eggs\""
                      },
                      "unit": {
                        "type": [
                          "string",
                          "number",
                          "null"
                        ],
                        "description": "Unit, e.g. \"lb\", \"gallon\", \"g\"; empty for a count"
                      },
                      "quantity": {
                        "type": [
                          "string",
                          "number",
                          "null"
                        ],
                        "description": "Total amount, e.g. 24"
                      },
                      "servings": {
                        "type": [
                          "string",
                          "number",
                          "null"
                        ],
                        "description": "Servings that recipe makes, e.g. 4 (optional)"
                      }
                    },
                    "additionalProperties": {}
                  }
                ]
              }
            }
          ]
        },
        {
          "type": "null"
        }
      ],
      "description": "Preferred for a pasted list, order, receipt or e-mail: one entry per ingredient with the amount you read, e.g. [{\"name\":\"eggs\",\"quantity\":24},{\"name\":\"whole milk\",\"quantity\":1,\"unit\":\"gallon\"},{\"name\":\"ground beef\",\"quantity\":1,\"unit\":\"lb\",\"meal\":\"Tacos\",\"servings\":4}]. Leave out prices, totals, store names, headers and e-mail text."
    },
    "title": {
      "type": [
        "string",
        "null"
      ],
      "description": "Title printed on the PDF, e.g. \"Family dinners\". Default \"Weekly meal plan\" or \"Grocery list\". Longer than 80 characters is shortened."
    },
    "units": {
      "type": [
        "string",
        "null"
      ],
      "description": "How to show merged amounts: \"us\" (cups, tbsp, oz, lb), \"metric\" (ml, l, g, kg) or \"auto\" (default: the system most lines use). Volume is never converted to weight."
    },
    "people": {
      "type": [
        "number",
        "string",
        "null"
      ],
      "description": "Servings to cook for each meal, e.g. 4 or \"4 people\". Each meal with a recipe yield (servings) is scaled to this number; meals without a yield are used as written. Default: no scaling."
    },
    "recipes": {
      "anyOf": [
        {
          "anyOf": [
            {
              "type": "array",
              "items": {}
            },
            {
              "type": "string"
            },
            {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {}
            }
          ]
        },
        {
          "type": "null"
        }
      ],
      "description": "Fallback, or recipes with their servings. Recipes or ingredient lines, e.g. [{\"name\":\"Tacos\",\"servings\":4,\"ingredients\":[\"1 lb ground beef\",\"8 corn tortillas\",\"1 cup shredded cheddar\"]},{\"name\":\"Guacamole\",\"ingredients\":\"3 avocados; 1 lime; 1/4 cup cilantro\"}], or plain text: one ingredient per line, a comma list (\"milk, eggs, 2 lb ground turkey\"), a checklist, a table with Item and Qty columns, or a whole recipe page (title, Serves line, Ingredients; directions are skipped)."
    },
    "week_of": {
      "type": [
        "string",
        "null"
      ],
      "description": "Optional label for the week, e.g. \"Nov 2, 2026\". Printed as given; longer than 40 characters is shortened."
    },
    "page_size": {
      "type": [
        "string",
        "null"
      ],
      "description": "PDF paper: \"letter\" (default) or \"a4\"."
    },
    "already_have": {
      "anyOf": [
        {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": [
                  "string",
                  "null"
                ]
              }
            },
            {
              "type": "string"
            }
          ]
        },
        {
          "type": "null"
        }
      ],
      "description": "Items already in the kitchen to leave off the list, as a list or comma-separated text, e.g. [\"salt\", \"olive oil\", \"rice\"]. A section name such as \"spices\" removes that whole section."
    }
  }
}
generate_grocery_list output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "title",
    "people",
    "meals_count",
    "days",
    "meals",
    "items_count",
    "sections",
    "already_have_removed",
    "unparsed_lines",
    "notes",
    "units",
    "downloads"
  ],
  "properties": {
    "days": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "meals": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "day",
          "meal",
          "name",
          "servings"
        ],
        "properties": {
          "day": {
            "type": "string"
          },
          "meal": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "servings": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "title": {
      "type": "string"
    },
    "units": {
      "type": "string"
    },
    "people": {
      "type": [
        "number",
        "null"
      ]
    },
    "sections": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "section",
          "items"
        ],
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "name",
                "quantity",
                "meals"
              ],
              "properties": {
                "name": {
                  "type": "string"
                },
                "meals": {
                  "type": "number"
                },
                "quantity": {
                  "type": "string"
                }
              },
              "additionalProperties": false
            }
          },
          "section": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    },
    "downloads": {
      "type": "object",
      "required": [
        "pdf",
        "csv",
        "txt"
      ],
      "properties": {
        "csv": {
          "type": "string"
        },
        "pdf": {
          "type": "string"
        },
        "txt": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "items_count": {
      "type": "number"
    },
    "meals_count": {
      "type": "number"
    },
    "unparsed_lines": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "already_have_removed": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "additionalProperties": false
}
generate_grocery_list annotations
{
  "title": "Generate grocery list from recipes",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

meal-planner-widget — Zovo Meal Planner view

Advertised by the server during the last successful anonymous check.

Interactive view for Zovo Meal Planner.

meal-planner-widget URI
ui://widget/meal-planner-v1-1.0.0-e9774dbb49a9e473f8fe28833ff149bd714ac0cac7f65aae80d8240e2c422ff8.html

MIME type: text/html;profile=mcp-app

meal-planner-widget-legacy — Zovo Meal Planner view (previous versions)

Advertised by the server during the last successful anonymous check.

meal-planner-widget-legacy URI template
ui://widget/meal-planner-{version}.html

MIME type: text/html;profile=mcp-app

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
570 ms
95th percentile latency
570 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 570 ms · metadata changed · 2 tool(s), 1 resource(s), 1 resource template(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http zovo-meal-planner-mcp https://meal-planner.zovo.one/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add zovo-meal-planner-mcp --url https://meal-planner.zovo.one/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable zovo-meal-planner-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "zovo-meal-planner-mcp": {
      "url": "https://meal-planner.zovo.one/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "zovo-meal-planner-mcp": {
      "type": "streamableHttp",
      "url": "https://meal-planner.zovo.one/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start zovo-meal-planner-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "zovo-meal-planner-mcp": {
      "type": "http",
      "url": "https://meal-planner.zovo.one/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http zovo-meal-planner-mcp https://meal-planner.zovo.one/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://meal-planner.zovo.one/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "zovo-meal-planner-mcp": {
      "serverUrl": "https://meal-planner.zovo.one/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Zovo Meal Planner MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.