# io.github.smeet666/mcp-ptitchef (npm · mcp-ptitchef)

Search Ptitchef recipes, read one, and rescale it to any servings. No API key.

- Trust score: 91/100 (high trust)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-21

## Components

- mcpb · `mcp-ptitchef-1.0.1.mcpb`: 54/100, [markdown](https://verifymcp.io/servers/smeet666-mcp-ptitchef/https-github-com-smeet666-mcp-ptitchef-releases-download-v1-0-1-mcp-ptitchef-1-0.md), [page](https://verifymcp.io/servers/smeet666-mcp-ptitchef/https-github-com-smeet666-mcp-ptitchef-releases-download-v1-0-1-mcp-ptitchef-1-0)
- npm · `mcp-ptitchef`: 91/100 (this document), [markdown](https://verifymcp.io/servers/smeet666-mcp-ptitchef/mcp-ptitchef.md), [page](https://verifymcp.io/servers/smeet666-mcp-ptitchef/mcp-ptitchef)

## Channel facts

- Registry: `npm`
- Package: `mcp-ptitchef`
- Version: `1.0.1`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-21.

- **Supply Chain Security**: 98/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 31 of 95 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 100/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to smeet666/mcp-ptitchef).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 22 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 69/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 1999 tokens (~285/item across 7 items; 7 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 83/100
  - Stability observed for 25 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 7 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 8 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the io.github.smeet666/mcp-ptitchef server?

io.github.smeet666/mcp-ptitchef runs locally as an npm package, launched with npx -y mcp-ptitchef. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add smeet666-mcp-ptitchef -- npx -y mcp-ptitchef
```

### Cursor

```json
{
  "mcpServers": {
    "smeet666-mcp-ptitchef": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-ptitchef"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "smeet666-mcp-ptitchef": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-ptitchef"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add smeet666-mcp-ptitchef -- npx -y mcp-ptitchef
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "smeet666-mcp-ptitchef": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "mcp-ptitchef"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add smeet666-mcp-ptitchef --command npx --arg -y --arg mcp-ptitchef
```

### Hermes

```yaml
mcp_servers:
  smeet666-mcp-ptitchef:
    command: "npx"
    args: ["-y", "mcp-ptitchef"]
```

### Netclaw

```json
{
  "McpServers": {
    "smeet666-mcp-ptitchef": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "mcp-ptitchef"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add smeet666-mcp-ptitchef -t stdio -c npx -a -y mcp-ptitchef
```

### Other

```json
{
  "mcpServers": {
    "smeet666-mcp-ptitchef": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-ptitchef"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-19 (score 91, +1)

No change was recorded against any check on this day. Stability & Change Management went from 73 to 77. That category is still filling its 30-day observation window: 22 days of observed history at the previous scan, 23 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-17 (score 90, +1)

No change was recorded against any check on this day. Stability & Change Management went from 67 to 70. That category is still filling its 30-day observation window: 20 days of observed history at the previous scan, 21 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-15 (score 89, +1)

No change was recorded against any check on this day. Stability & Change Management went from 60 to 63. That category is still filling its 30-day observation window: 18 days of observed history at the previous scan, 19 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-13 (score 88, +1)

No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-11 (score 87, +1)

No change was recorded against any check on this day. Stability & Change Management went from 47 to 50. That category is still filling its 30-day observation window: 14 days of observed history at the previous scan, 15 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-09 (score 86, +1)

No change was recorded against any check on this day. Stability & Change Management went from 40 to 43. That category is still filling its 30-day observation window: 12 days of observed history at the previous scan, 13 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-07 (score 85, +1)

No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-04 (score 84, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

## MCP tools (7)

### `list_categories` (~201 tokens)

List the categories recipes are browsed by

List the categories Ptitchef browses its recipes by. Called without arguments it returns the families of ingredients; pass a family's slug as 'family' to list the categories it holds. Read this before building an address by hand: the site writes its slugs freely, so the same vegetable appears as 'chou-kale' on one line and as 'recette-de-petits-pois' on the next, and a slug that was guessed lands on a page the site does not hold. Each entry carries the slug to pass back and the page to open.

Input parameters:

- `family` (string): The slug of a family to open, taken from a previous call. Leave it out to read the families themselves, which is where the tree starts.
- `limit` (integer): Entries to render, 20 by default and 200 at most. A level holding more than this says so, and 'categories_published' always states what the page listed.

Output parameters:

- `categories` (array)
- `categories_published` (integer): Entries the page listed, before any were rendered.
- `category_count` (integer): Entries rendered here.
- `family` (string|null): The family that was opened, or null for the root.
- `family_title` (string|null): The site's own heading for this level. Null when the page carries none.
- `notes` (array)
- `source` (string)
- `url` (string): The page these categories were read from.

### `search_recipes` (~209 tokens)

Search recipes

Search recipes on Ptitchef by dish or ingredient. The site answers in one of two ways and the answer says which: it either sends the search to a category page of its own, whose total counts what that category holds, or it answers on its own terms on a single page whose total is the number of rows served. When a category answered, 'topic_slug' names it and browse_recipes reads its further pages. Some topics come back as a guide the site wrote instead, grouped under headings of its own and carrying no total; browse_recipes on the same 'topic_slug' reads their full listing. A search the site matched nothing for comes back with no row and a total of zero, which is an absence the site stated.

Input parameters:

- `limit` (integer): Rows to render, 20 by default. 'rows_seen' states what the page served.
- `query` (string, required): A dish or an ingredient, in French, as a reader of the site would type it.

Output parameters:

- `asked` (string): What was asked for: a search, a category, or a list of ingredients. 'query' carries the same value under the name every source of recipes publishes it in.
- `folded` (integer): Rows naming a recipe already held. A guide lists one recipe under two headings where it belongs to both; such a row is counted in 'rows_seen' and rendered once.
- `kind` (string): How the listing came to be, which decides what its total counts. 'topic' means the site answered a search from a page of its own; 'free_text' means it answered on its own terms.
- `notes` (array): What qualifies this answer: what its total counts, what it left out, and where the site answered from an address other than the one asked for. Read these before quoting a figure.
- `page` (integer): The page that was read, which is the one the site served.
- `query` (string): What was asked for, under the name a search publishes it in.
- `result_count` (integer): Rows rendered here.
- `results` (array)
- `rows_seen` (integer): Rows the site served on this page, before any were set aside.
- `single_page` (boolean): True when the site serves this listing on one page and offers no further one.
- `source` (string): The site this answer was read from. Credit it when showing a row.
- `title` (string|null): The site's own heading for the listing.
- `topic_slug` (string|null): The category page this listing was served from. Pass it to browse_recipes as 'category' to read the topic's further pages, and its total where this answer carries none.
- `total_available`: Recipes the site says this listing holds. Null when it published no figure.
- `url` (string): The address the listing was read from.

### `browse_recipes` (~225 tokens)

Browse a category or a standing list

Read the recipes under one category of Ptitchef, page by page, or one of the lists the site keeps standing. Pass 'category' with a slug from list_categories or from a search's 'topic_slug', or pass 'listing' for one of: latest, top_rated, most_viewed. Never build a category slug by hand: the site writes them freely and answers an address it does not hold by serving another page. The page in the answer is the one the site served, which is the first page again when the page asked for is past the last one.

Input parameters:

- `category` (string): A category slug: one from list_categories whose 'is_family' is false, or the 'topic_slug' a search answered with. A family's slug belongs to list_categories instead.
- `limit` (integer): Rows to render, 20 by default.
- `listing` (string): One of the site's standing lists, read instead of a category.
- `page` (integer): The page of a category to read. A standing list has one page only.

Output parameters:

- `asked` (string): What was asked for: a search, a category, or a list of ingredients. 'query' carries the same value under the name every source of recipes publishes it in.
- `folded` (integer): Rows naming a recipe already held. A guide lists one recipe under two headings where it belongs to both; such a row is counted in 'rows_seen' and rendered once.
- `kind` (string): How the listing came to be, which decides what its total counts. 'topic' means the site answered a search from a page of its own; 'free_text' means it answered on its own terms.
- `notes` (array): What qualifies this answer: what its total counts, what it left out, and where the site answered from an address other than the one asked for. Read these before quoting a figure.
- `page` (integer): The page that was read, which is the one the site served.
- `query` (string): What was asked for, under the name a search publishes it in.
- `result_count` (integer): Rows rendered here.
- `results` (array)
- `rows_seen` (integer): Rows the site served on this page, before any were set aside.
- `single_page` (boolean): True when the site serves this listing on one page and offers no further one.
- `source` (string): The site this answer was read from. Credit it when showing a row.
- `title` (string|null): The site's own heading for the listing.
- `topic_slug` (string|null): The category page this listing was served from. Pass it to browse_recipes as 'category' to read the topic's further pages, and its total where this answer carries none.
- `total_available`: Recipes the site says this listing holds. Null when it published no figure.
- `url` (string): The address the listing was read from.

### `search_by_ingredients` (~138 tokens)

Find recipes from the ingredients a cook has

Find Ptitchef recipes from the ingredients a cook already has. Give one to 5 ingredients in French, as a cook would name them ("poulet", "citron"). The site counts every recipe it finds and serves one page of them, so 'total_available' can be far larger than the rows returned, and the rest cannot be reached. A longer list than the site's own form reads is refused rather than sent and silently cut.

Input parameters:

- `ingredients` (array, required): One to 5 ingredients, in French. The site reads no more than that.
- `limit` (integer): Rows to render, 20 by default.

Output parameters:

- `asked` (string): What was asked for: a search, a category, or a list of ingredients. 'query' carries the same value under the name every source of recipes publishes it in.
- `folded` (integer): Rows naming a recipe already held. A guide lists one recipe under two headings where it belongs to both; such a row is counted in 'rows_seen' and rendered once.
- `kind` (string): How the listing came to be, which decides what its total counts. 'topic' means the site answered a search from a page of its own; 'free_text' means it answered on its own terms.
- `notes` (array): What qualifies this answer: what its total counts, what it left out, and where the site answered from an address other than the one asked for. Read these before quoting a figure.
- `page` (integer): The page that was read, which is the one the site served.
- `query` (string): What was asked for, under the name a search publishes it in.
- `result_count` (integer): Rows rendered here.
- `results` (array)
- `rows_seen` (integer): Rows the site served on this page, before any were set aside.
- `single_page` (boolean): True when the site serves this listing on one page and offers no further one.
- `source` (string): The site this answer was read from. Credit it when showing a row.
- `title` (string|null): The site's own heading for the listing.
- `topic_slug` (string|null): The category page this listing was served from. Pass it to browse_recipes as 'category' to read the topic's further pages, and its total where this answer carries none.
- `total_available`: Recipes the site says this listing holds. Null when it published no figure.
- `url` (string): The address the listing was read from.

### `get_recipe` (~180 tokens)

Read one recipe

Read one Ptitchef recipe: its ingredients, method, times, rating, nutrition and the cost the site estimates for it. Pass the 'id' of a row from search_recipes, browse_recipes or search_by_ingredients. Give 'servings' to rescale the ingredients, and read each line's 'scaling' before quoting a quantity: 'scaled' is exact arithmetic, 'rounded' was moved to stay usable, and 'unscaled' carries nothing that could be multiplied. A time or a figure the site publishes none of comes back null, never zero.

Input parameters:

- `id` (string, required): The 'id' of a row from a search or a listing, which is the recipe's own page path.
- `servings` (integer): Rescale the ingredients to this many servings. Left out, the ingredients come back as published.

Output parameters:

- `attribution` (string)
- `author` (string|null)
- `author_url` (string|null)
- `category` (string|null)
- `cook_minutes`
- `cuisine` (string|null)
- `description` (string|null)
- `difficulty` (string|null): The site's own wording, such as 'facile'.
- `estimated_cost` (string|null): What the site estimates the ingredients cost, with the currency it names. Repeated as published: it is the site's figure and readers of the site dispute it.
- `faq` (array)
- `id` (string)
- `illustrated_steps` (array)
- `image_url` (string|null)
- `ingredients` (array): The lines as published where no servings were asked for, in which case 'yield.factor' is null and each line's 'scaling' describes no arithmetic. Pass 'servings' to rescale them.
- `keywords` (array)
- `modified` (string|null)
- `notes` (array): What qualifies this answer: what the arithmetic did, what it could not do, and what the site states rather than this server. Read these before quoting a quantity or a cost.
- `nutrition`: As published, per the serving size it names.
- `prep_minutes`
- `published` (string|null)
- `rating` (number|null): 1 to 5, as the site states it.
- `rating_count`
- `review_count`
- `source` (string): The site this recipe was read from. Credit it when showing it.
- `steps` (array): The method, one line per step, in the shape every source of recipes publishes it in. 'illustrated_steps' carries the same lines beside the photograph the site took of each.
- `steps_are_one_block` (boolean): True when the site published its method as one block of prose, so the single step above is that block rather than the first of several.
- `title` (string)
- `total_minutes`
- `translations` (array): The other languages this recipe was published in, which get_recipe_translations answers on its own for a caller who wants nothing else.
- `url` (string): The public page. Show this when citing the recipe.
- `yield` (object)

### `scale_ingredients` (~305 tokens)

Rescale an ingredient list

Rescale a list of ingredient lines to a different number of servings, without contacting any website. Give either 'factor' directly, or 'from_servings' and 'to_servings' and the factor is computed. Works on any French ingredient list, whatever its source, so it also serves a recipe pasted in by hand. Quantities in grams or millilitres are multiplied and rounded to readable values; a countable thing lands on a half when half of one can be poured, weighed or cut, as a boîte, a sachet, a feuille de gélatine or a cuillère can, and on a whole one when it cannot, as an oeuf, a jaune or a blanc; approximate measures such as a pinch or a handful have their count multiplied in whole units and stay in their own vocabulary. A line writing an article where a digit would go, as in 'un bouchon de rhum' or 'une pincée de sel', is read as one of that measure. Lines carrying no quantity are returned untouched and flagged. Prefer this over doing the arithmetic yourself.

Input parameters:

- `factor` (number): Multiplier to apply. Use this or the from/to pair.
- `from_servings` (number): How many servings the list is written for.
- `ingredients` (array, required): Ingredient lines, for example ['200 g de farine', '3 oeufs', 'sel'].
- `to_servings` (number): How many servings are wanted.

Output parameters:

- `factor` (number)
- `ingredients` (array)
- `notes` (array)
- `rounded_count` (integer): Lines whose value rounding moved away from the exact product, not lines that could have been rounded.
- `scaled_count` (integer)
- `unscaled_count` (integer)

### `get_recipe_translations` (~164 tokens)

Find a recipe in the other languages it was published in

List the other languages a Ptitchef recipe was published in, with the page of each. get_recipe already carries this list under 'translations', so call this one only where the rest of the recipe is not wanted. Pass the 'id' of a row from a search or a listing. The pairing is the site's own: each page names its counterparts, and this repeats those names rather than matching titles. How many there are belongs to the recipe: a recent one names more than twenty, from German to Hindi, and an older one names none. An empty list is what the site published, and the read succeeded.

Input parameters:

- `id` (string, required): The 'id' of a row from a search or a listing, which is the recipe's own page path.

Output parameters:

- `id` (string)
- `notes` (array)
- `source` (string)
- `title` (string)
- `translation_count` (integer)
- `translations` (array)
- `url` (string): The French page these counterparts were read from.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/smeet666-mcp-ptitchef/mcp-ptitchef#diagnostics

## Score history

- 2026-09-21: 91
- 2026-09-20: 91
- 2026-09-19: 91
- 2026-09-18: 90
- 2026-09-17: 90
- 2026-09-16: 89
- 2026-09-15: 89
- 2026-09-14: 88
- 2026-09-13: 88
- 2026-09-12: 87
- 2026-09-11: 87
- 2026-09-10: 86
- 2026-09-09: 86
- 2026-09-08: 85
- 2026-09-07: 85
- 2026-09-06: 84
- 2026-09-05: 84
- 2026-09-04: 84
- 2026-09-03: 83
- 2026-09-02: 83
- 2026-09-01: 82
- 2026-08-31: 82
- 2026-08-30: 81
- 2026-08-29: 66
- 2026-08-28: 69
- 2026-08-27: 54

## Common questions

### What is the io.github.smeet666/mcp-ptitchef server?

io.github.smeet666/mcp-ptitchef is listed in the public MCP registry as io.github.smeet666/mcp-ptitchef. Search Ptitchef recipes, read one, and rescale it to any servings. No API key. This page covers its npm package (mcp-ptitchef).

### Is the io.github.smeet666/mcp-ptitchef server safe to use?

io.github.smeet666/mcp-ptitchef scores 91 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 21 September 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the io.github.smeet666/mcp-ptitchef server expose?

io.github.smeet666/mcp-ptitchef exposes 7 tools: list_categories, search_recipes, browse_recipes, search_by_ingredients, get_recipe, and 2 more. Their descriptions and schemas cost roughly 1,422 tokens of context every time the server is loaded.

### Is the io.github.smeet666/mcp-ptitchef server still maintained?

io.github.smeet666/mcp-ptitchef is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the io.github.smeet666/mcp-ptitchef server under?

io.github.smeet666/mcp-ptitchef declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/mcp-ptitchef
- Socket report: https://socket.dev/npm/package/mcp-ptitchef
- Repository: https://github.com/smeet666/mcp-ptitchef
- Changelog RSS feed: https://verifymcp.io/servers/smeet666-mcp-ptitchef/mcp-ptitchef.xml
- Changelog JSON feed: https://verifymcp.io/servers/smeet666-mcp-ptitchef/mcp-ptitchef.json
- HTML version of this page: https://verifymcp.io/servers/smeet666-mcp-ptitchef/mcp-ptitchef
