mcp-marmiton 1.8.1 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,341 @@
1
+ # Changelog
2
+
3
+ ## 2.0.1
4
+
5
+ - **Every tool is documented, with its arguments and what its answer carries.**
6
+ The README is written for a person deciding whether to install and for a
7
+ program installing on its own, and a test holds both halves to what the server
8
+ registers.
9
+ - **The privacy policy travels in the package.** It states the hosts contacted,
10
+ what a request carries, what is held and for how long.
11
+ - **The manifest names every tool the server registers**, which a host reads
12
+ before installing anything.
13
+
14
+ ## 2.0.0
15
+
16
+ - **This server now needs node 24 or later.** Node 20 reached its end of
17
+ support on 2026-04-30 and node 22 is no longer what this code is built and
18
+ typed against. That is what makes this a major version: an install on an
19
+ older node is refused rather than left to fail somewhere later.
20
+ - **Every refusal of an argument opens with `invalid_input`.** A value outside
21
+ its bounds, of the wrong type, or outside the set an argument reads used to
22
+ come back in the validator's own words, with no code to branch on.
23
+ - **A container image is published for each version**, on ghcr, for amd64 and
24
+ arm64. The readme carries the configuration that runs it.
25
+ - The published package carries its changelog, and the entry point it declares
26
+ for the package root now publishes its types.
27
+
28
+ ## 1.8.1
29
+
30
+ - The README carries the same badge row as every server here: npm, CI, the
31
+ licence, the MCP registry entry, the Glama score, and one-click installs for
32
+ Cursor and VS Code. Each install link encodes this package. npm serves the
33
+ README frozen at publish time, so a release is what puts it there.
34
+
35
+ ## 1.8.0
36
+
37
+ - A mass stated behind the thing counted is read as the size of one of them.
38
+ "1 dinde de 3 kg" names one bird and says what it weighs, and multiplying the
39
+ count answered a Christmas dinner for twelve with a bird and a half. Lines of
40
+ that shape come back as the page published them, with a note saying the figure
41
+ gives a size and that more people means a bigger bird. A container keeps
42
+ counting: "2 boîtes de 400 g de tomates" states what one boîte holds and goes
43
+ on to name what is in it, and an equivalence such as "450 g (1 livre) de
44
+ spaghetti" restates one quantity twice and is scaled on both sides.
45
+
46
+ - A search whose wording matches nothing is an absence rather than a failure.
47
+ Marmiton serves a 404 on its results page when no recipe matches, and that was
48
+ handed back as a failed read, so a caller was told Marmiton could not be
49
+ reached for a search Marmiton had answered. Such a search now returns an empty
50
+ list with the note that says so, and a recipe page that is not there is still
51
+ reported as not_found.
52
+
53
+ - A page of results carrying none of the words asked for says so. Marmiton ranks
54
+ a title on the letters it opens with, so "chameau farci" comes back with a
55
+ chapeau and three gâteaux château. When no title returned carries a word of
56
+ the query, the answer names that, and the rows read as candidates to check.
57
+
58
+ ## 1.7.0
59
+
60
+ - Read the shapes a Marmiton line actually takes. A page that restates a weight
61
+ in brackets or after a slash, offers a choice with "ou", writes a mixed number
62
+ as "3 ¼", or marks a plural it does not know with "cuillère(s)" was answered
63
+ with a number that had lost part of itself: the second branch of a choice kept
64
+ the figure the page printed, the quarter of "3 ¼" travelled into the name of
65
+ the ingredient, and "8 cuillère(s)s" was not a word. Each of these is now read,
66
+ scaled and written back the way the line offered it.
67
+
68
+ - Stop multiplying a figure that was never a count. An amount stated per person
69
+ already carries the change the factor asks for, and doubling it puts twice as
70
+ much on every plate; a number joined to a word by a hyphen gives the size of
71
+ one thing rather than how many; and a number grouped the way French never
72
+ groups one has two readings a thousand apart. All three come back as the page
73
+ published them, with a note saying which of the three it is, rather than with
74
+ the note about a line that carries no quantity, which was untrue of every one
75
+ of them.
76
+
77
+ - Read the quantity behind the word that hid it. "environ 6 citrons" and
78
+ "~1 verre d'eau" carried an amount that was answered as if the line had none;
79
+ "1 grosse pincée de sel" lost the pincée, and with it the fact that a pincée is
80
+ held to no better than the hand. Both now read through to the figure and the
81
+ measure, and put the word and the sign back where the page had them.
82
+
83
+ - Round a mass or a volume to the tenth between one and ten, where the step was
84
+ half a unit. A unit in that range can be a kilo as readily as a gram, and
85
+ halving 2,5 kg de figues gave 1,5 kg: two hundred grams more than the recipe
86
+ asked for, reported as though it were the product itself. A recipe made
87
+ smaller also never comes out asking for more than the page published, where
88
+ reducing a line by one percent could raise it by one.
89
+
90
+ - Express a share of a cuillère à soupe or of a tasse in the smaller spoon. A
91
+ quarter of a cuillère à soupe exists on no measuring set, and the answer is
92
+ three quarters of a cuillère à café.
93
+
94
+ - Put both ends of a range in one unit, chosen from the lower one, so
95
+ "450 à 1000 g" no longer comes back as "450 à 1 kg". Where both ends land on
96
+ the same amount the line states that amount once and says the range collapsed,
97
+ and `amount` now reports the lower bound with `amountMax` beside it, where it
98
+ reported the upper bound and offered no way to reach the other.
99
+
100
+ - Say more about what happened to a line. A range whose two ends moved names each
101
+ of them with its own direction; a line carrying a second quantity after the
102
+ first says that only the first was scaled; a quantity below what a kitchen
103
+ scale resolves says so; and an approximate measure names what a kitchen usually
104
+ takes one to be, instead of a sentence that named none. A factor of one now
105
+ returns the line untouched, where it rewrote "178 ml" as "180 ml".
106
+
107
+ - Take a gousse d'ail to the half and no finer, and count a baie de genévrier and
108
+ une étoile de badiane whole, as the person who cooks these recipes has them.
109
+
110
+ ## 1.6.0
111
+
112
+ - Refuse an argument the schema does not declare, rather than dropping it in
113
+ silence. The schema already announced that it accepted no others, and a caller
114
+ who misspells one was answered from the defaults as though the call had been
115
+ understood. The refusal names the argument, suggests the real one when it is
116
+ close, and lists what the tool takes.
117
+
118
+ - Rewrite the rule that decides how far a counted thing can be divided. It read
119
+ the packaging, so a tin of tomatoes was never halved although half a tin of
120
+ apricots in syrup is poured out and the rest kept. What decides is the size of
121
+ one unit against what a recipe puts in: a crevette, a moule, a grain de poivre
122
+ is already a portion, counted by the dozen, and a smaller recipe puts one fewer
123
+ in the pan; a gigot, a camembert, an ananas is asked for by the one and shared
124
+ out with a knife. An oeuf, a jaune and a blanc d'oeuf stay whole, since halving
125
+ one means beating it and weighing the result. A jus stops at the half, which is
126
+ half a fruit squeezed rather than a quarter poured and measured back.
127
+
128
+ - Read a douzaine as the twelve it stands for. Two douzaines d'escargots taken
129
+ down a quarter now asks for eighteen escargots.
130
+
131
+ - Tell a blanc d'oeuf from a blanc de volaille, which the same word names and
132
+ which divide differently.
133
+
134
+ - Agree a counted noun with the number that precedes it in more places. Words
135
+ ending in -as, -is, -us and -ous were taken for singulars, so two clous came
136
+ back as "1 clous", and an adjective following the noun stayed plural.
137
+
138
+ ## 1.5.0
139
+
140
+ - Read an approximate measure from the shape of the line as well as from the
141
+ vocabulary. A noun standing between the amount and the partitive that
142
+ introduces what is measured names a container or a gesture whose size belongs
143
+ to the cook: `un bouchon de rhum` scaled sixfold comes back as
144
+ `6 bouchons de rhum`, and so does a container no list carries, such as
145
+ `un ramequin de crème fraîche`. The line came back untouched and flagged
146
+ `unscaled` with "No quantity given" before, which was false: a bouchon is an
147
+ amount.
148
+ - Add `bouchon`, `larme`, `doigt`, `nuage`, `louche`, `lichette` and `pointe` to
149
+ the vocabulary of approximate measures.
150
+ - An article written in place of a digit is read before any measure, not only an
151
+ approximate one, so `un sachet de levure` and `un litre de lait` scale like
152
+ the lines that open on a figure. The note says which word the figure was read
153
+ from. An article before a bare countable thing, as in `un oignon`, still
154
+ leaves the line as published.
155
+ - Take the article with the amount it belongs to when a line states a share of
156
+ one thing: `2/3 d'un flacon de fleur d'oranger` scaled sixfold reads
157
+ `4 flacons de fleur d'oranger`, with the plural agreed, instead of leaving the
158
+ article stranded in front of the count.
159
+ - A counted noun in -eau or -al takes the plural French gives it, so
160
+ `1 morceau de beurre` multiplied reads `6 morceaux de beurre`.
161
+ - `scaling` reports what the arithmetic did rather than what the unit is.
162
+ `scaled` means the value is the product itself, which a count of eggs, spoons
163
+ or pinches reaches as readily as a mass in grams: one pinch multiplied by six
164
+ is six pinches, exactly. `rounded` is kept for a value that had to be moved,
165
+ whether to a whole unit or to a step a scale can show, so a measurement
166
+ rounded from 133.4 g to 135 g reports it.
167
+
168
+ ## 1.4.0
169
+
170
+ - Scale approximate French measures instead of returning them untouched. A pinch,
171
+ a handful, a drizzle, a knob, a dash, a drop or a hint is a quantity, and the
172
+ proportion of the recipe lives in how many of them a line asks for, so the
173
+ count is now multiplied in whole units: `une pincée de bicarbonate de soude`
174
+ taken from 6 servings to 25 comes back as `4 pincées de bicarbonate de soude`,
175
+ flagged `rounded`, with a note saying the measure is approximate. Previously
176
+ the line came back unchanged, flagged `unscaled`, with the note "No quantity
177
+ given; adjust to taste." That was wrong twice over: the line does carry a
178
+ quantity, and tasting cannot rescue a batter raised by a single pinch of
179
+ bicarbonate for four times the flour.
180
+ - No approximate measure is converted into grams or spoons. Published
181
+ equivalences for a pinch span a fourfold range, so any such figure would be a
182
+ number the recipe never carried; an order of magnitude belongs in a note.
183
+ - Read the article a recipe writes in place of a digit before such a measure:
184
+ `une`, `un` and `quelques`, the last read as three, with the word it came from
185
+ reported in the note. An article before a countable thing, as in `un oignon`,
186
+ still leaves the line as published.
187
+ - Add `noix` and `soupçon` to the vocabulary of approximate measures, alongside
188
+ `pincée`, `poignée`, `trait`, `filet` and `goutte`.
189
+ - `unscaled` now means one thing only: the line carries no quantity at all, as in
190
+ `sel` or `coriandre`, and that is where the note "No quantity given" remains.
191
+ - Agree a trailing adjective with the count on a counted item, so
192
+ `1 piment de Cayenne entier` multiplied reads `4 piments de Cayenne entiers`. A
193
+ trailing word outside a short list of common recipe adjectives is left as the
194
+ recipe wrote it, since a brand or a proper noun takes no plural mark.
195
+
196
+ ## 1.3.1
197
+
198
+ - Stop published text from producing a line shaped like one this server writes.
199
+ The text block ends with lines opening "Note:" and "Source:", and anyone who
200
+ publishes on the site can put those same words at the start of a line in a
201
+ title or a description, where a reader has no way to tell the two apart. Such
202
+ a line is indented in the text block. The structured output carries the text
203
+ exactly as published, as it did.
204
+
205
+ ## 1.3.0
206
+
207
+ - Ship a `.mcpb` bundle on every release, so the server can be installed by
208
+ opening a file rather than by having npm and a client configuration. The
209
+ dependencies are compiled into a single file, which makes the bundle 164 kB
210
+ and five files instead of 3 MB and two thousand: a bundle is unpacked, not
211
+ resolved, so a copy of `node_modules` would only be dead weight. The npm build
212
+ still keeps its dependencies external, and the two builds are separate
213
+ configurations for that reason.
214
+ - Declare the bundle in `server.json`, with the hash the registry requires
215
+ computed from the released file at publish time rather than committed as a
216
+ value that goes stale on every build.
217
+
218
+ ## 1.2.1
219
+
220
+ Housekeeping, with no change to what any tool returns.
221
+
222
+ - Declare the tool schemas as objects rather than as the raw shape the SDK now
223
+ deprecates. The emitted `tools/list` is byte for byte what it was.
224
+ - Add an icon and a `websiteUrl` to `server.json`, so the registry has something
225
+ to show next to the entry.
226
+ - `scale_ingredients` no longer claims an open world. It does arithmetic on the
227
+ arguments it was handed and contacts nothing, so the same list and the same
228
+ factor give the same answer whatever Marmiton publishes.
229
+
230
+ ## 1.2.0
231
+
232
+ Quantities that were arithmetically right and uncookable, which is a wrong
233
+ answer here because the caller acts on it.
234
+
235
+ - Scale both ends of a range. "2 à 3 gousses" doubled returned "4 à 3", an
236
+ inverted range, and shrunk it returned "2/3 à 3", a line still asking for
237
+ three cloves when the whole point was to ask for fewer. Ranges written with
238
+ "à", "ou" or a dash are read as one quantity and scaled together, and the
239
+ upper bound is what `amount` reports, since that is what a cook buys.
240
+ - Round a countable item back to a whole one. One egg times 0.9 answered "3/4
241
+ oeuf", and three eggs times 0.33 did the same, because a whole was not among
242
+ the values below one that a fraction could snap to. It is now, with a ceiling
243
+ that keeps a shrunk recipe from ever asking for more than the original.
244
+ - Say when a quantity was clamped. Below a quarter there is nothing a kitchen
245
+ can measure, so the amount is clamped up, and that line no longer holds its
246
+ share of the recipe: half a sachet of baking powder against three pots of
247
+ flour comes out four times too strong. The line and the response now both say
248
+ so instead of leaving the caller to discover it in the oven.
249
+ - Convert before rounding, not after. A kilo divided by a thousand rounded to
250
+ "0 kg", stating the recipe needs none of it, and a quarter of a millilitre
251
+ came back three tenths, a fifth too much. Every rounding now happens in a unit
252
+ large enough to survive it.
253
+ - Count the quantities that were actually moved. Every response claimed the same
254
+ number of roundings whatever the factor, including factors where every result
255
+ landed exact. Each ingredient carries `adjusted` for the same question.
256
+ - Carry the steps and the notes into the text block. A client rendering only
257
+ text got a recipe with no cooking steps, no warning that the numbers had been
258
+ rounded, and calorie figures with nothing to say they describe the recipe as
259
+ published rather than the amounts printed above them.
260
+ - Stop labelling every line "(non ajusté)" when no rescaling was requested. The
261
+ flag answers "why is this unchanged", which is only a question when something
262
+ was meant to change.
263
+ - Say when `factor` and the `from_servings`/`to_servings` pair are both given.
264
+ The factor won silently, so a caller asking for 4 to 12 could be served a
265
+ different multiplier without being told.
266
+ - Print the factor that was applied. `factor: 0.001` was shown as "Facteur 0",
267
+ which states that nothing was applied to quantities divided by a thousand.
268
+ - Write "25 pots" rather than "25 pot", and "d'huile" rather than "de huile".
269
+
270
+ ## 1.1.0
271
+
272
+ - Cache a response only once it has been read successfully. The cache stored
273
+ the raw response before parsing, so a page Marmiton served but this client could
274
+ not understand stayed pinned for the cache lifetime and was replayed on every
275
+ retry: the tool could not recover even after the site was healthy again. It
276
+ now holds the parsed result, which also keeps the raw payload out of memory.
277
+
278
+ ## 1.0.4
279
+
280
+ - Claim a pacing slot per request instead of per task. A task runs a whole
281
+ retry chain, so stamping only its start let the next task follow the chain's
282
+ last request with no gap, below the interval the configuration promises.
283
+ - Honour `Retry-After` when Marmiton sends one, in both its seconds and its
284
+ HTTP-date form, instead of guessing a delay. The wait is spent between
285
+ attempts rather than after the last one, where nobody would use it.
286
+ - Treat HTTP 403 as a refusal to back off from. It was reported as a plain
287
+ error, so the client kept its pace in the one situation where slowing down is
288
+ the remedy.
289
+ - Bound the pacing wait by the interval. A clock stepped backwards, by NTP or a
290
+ resumed virtual machine, made the next request wait for the size of the step,
291
+ and the queue is serial so every pending call waited behind it.
292
+ - Enforce the pacing floor and the identifying User-Agent in the client rather
293
+ than only when reading the environment. The client is published through the
294
+ `./client` export and accepts a caller-built config, so both promises were
295
+ previously optional for anyone importing the library.
296
+
297
+ ## 1.0.3
298
+
299
+ - Refresh the packaged README, which now carries one-click install links for
300
+ Cursor and VS Code and a link to the entry in the official MCP registry.
301
+ - Keep LICENSE to the plain MIT text. License detectors match the file against
302
+ the canonical template, so the trailing scope note made the package read as
303
+ unlicensed; that note lives in the README. It also described lyrics rather
304
+ than recipes.
305
+
306
+ ## 1.0.2
307
+
308
+ - Keep a scaled mass or volume at a human size. Multiplying a recipe for a
309
+ canteen returned "8335 g de sucre", which is correct and unusable; it now reads
310
+ "8,34 kg". Amounts climb to the unit above at a full unit of it, and come back
311
+ down below one, so half a litre reads "50 cl" rather than "1/2 l".
312
+ - Write mass and volume as decimals rather than fractions. Fractions belong to
313
+ things a cook counts or spoons out: "8 1/3 kg" is not how anyone weighs sugar.
314
+
315
+ Note that `amount` is expressed in `unit`, which may now differ from the unit
316
+ the recipe used. Read the two together: 200 g scaled tenfold reports an amount
317
+ of 2 with a unit of kg, so the bare number shrinks while the quantity grows.
318
+
319
+ ## 1.0.1
320
+
321
+ - Make a counted ingredient agree with its amount when scaling **up**, not only
322
+ when scaling down. Tripling a recipe returned "3 brioche" and "3 orange"
323
+ alongside a correct "30 oeufs", because the agreement helper only knew how to
324
+ remove a plural mark. Nouns that take no plural mark, and those whose singular
325
+ already ends in -s, are still left untouched.
326
+
327
+ ## 1.0.0
328
+
329
+ First stable release. The tool contracts are settled: tool names, their parameters
330
+ and the shape of their structured output will only change in a future major
331
+ version.
332
+
333
+ Every tool has been exercised end to end against the live site, including the
334
+ paths that are easy to get wrong: scaling down without ever asking for more than
335
+ the original, scaling without ever rounding an ingredient away to nothing,
336
+ recipes that state no yield, and a page that loads without structured recipe data.
337
+
338
+ ## 0.1.0
339
+
340
+ Initial release. Three read-only tools over stdio, no API key: `search_recipes`,
341
+ `get_recipe` (with optional rescaling) and `scale_ingredients` (offline).
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 smeet666
3
+ Copyright (c) 2026 Damien Bouissou
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/PRIVACY.md ADDED
@@ -0,0 +1,152 @@
1
+ # Privacy
2
+
3
+ This server collects nothing about you, and sends nothing to its author.
4
+
5
+ _[Version française](#confidentialité)_
6
+
7
+ ---
8
+
9
+ ## What this server is
10
+
11
+ `mcp-marmiton` is a read-only client for [Marmiton](https://www.marmiton.org). It runs on your
12
+ own machine, as a process your MCP host starts, and it speaks over stdio. It
13
+ listens on no port.
14
+
15
+ It needs no API key and no account, so there is no credential for it to hold and none for it to send.
16
+
17
+ ## What leaves your machine, and where it goes
18
+
19
+ **One host is contacted: `www.marmiton.org`.** Nothing else.
20
+
21
+ | Host | What is read there |
22
+ | ------------------ | ------------------ |
23
+ | `www.marmiton.org` | the site's pages |
24
+
25
+ What a request carries:
26
+
27
+ | What | Why it is there |
28
+ | ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
29
+ | The question you asked | A search term or an identifier reaches the site as you wrote it. |
30
+ | A `User-Agent` | `mcp-marmiton/<version> (+https://github.com/smeet666/mcp-marmiton)`, so the site can reach a person about the traffic it receives. |
31
+ | Your IP address | Sent by your network to any host you contact, as with any web request. |
32
+
33
+ Your requests reach Marmiton. What is done with them there is governed by that site's own privacy policy, which this project does not control.
34
+
35
+ ## What is kept, and for how long
36
+
37
+ **Answers are held in memory only, and only while the server runs.** The cache is
38
+ a table in the process: it holds what was read so that reading the same page
39
+ twice costs one request instead of two. Closing the server empties it.
40
+
41
+ **Nothing is written to disk.** The server creates no file, no database and no
42
+ log file.
43
+
44
+ ## What is never collected
45
+
46
+ - No analytics, no telemetry, no usage counter.
47
+ - Nothing is sent to the author of this project or to any third party.
48
+ - No account, no profile, no identifier is created for you.
49
+ - Your questions are not stored, forwarded, or used to train anything.
50
+
51
+ ## Logs
52
+
53
+ The server writes diagnostics to **stderr**, where your MCP host decides what
54
+ becomes of them. `MARMITON_LOG_LEVEL` governs how much is written and defaults to `error`. These lines stay on your machine.
55
+
56
+ ## The settings that change any of this
57
+
58
+ | Variable | What it changes |
59
+ | ----------------------- | ---------------------------------------------------------------------------------------------------------------- |
60
+ | `MARMITON_USER_AGENT` | Adds your own identifier in front of this project's, which stays appended so the site can always reach a person. |
61
+ | `MARMITON_CACHE_TTL_MS` | How long an answer is held in memory. `0` turns the cache off. |
62
+ | `MARMITON_LOG_LEVEL` | How much is written to stderr. |
63
+
64
+ ## Children
65
+
66
+ This server is a tool for developers and it is not directed at children.
67
+
68
+ ## Changes
69
+
70
+ A change to this policy travels in a release, and the changelog names it.
71
+
72
+ ## Contact
73
+
74
+ Open an issue on [the repository](https://github.com/smeet666/mcp-marmiton/issues). For something exploitable,
75
+ follow [SECURITY.md](./SECURITY.md) instead.
76
+
77
+ ---
78
+
79
+ # Confidentialité
80
+
81
+ Ce serveur ne collecte rien sur vous et n'envoie rien à son auteur.
82
+
83
+ ## Ce qu'est ce serveur
84
+
85
+ `mcp-marmiton` est un client en lecture seule pour [Marmiton](https://www.marmiton.org). Il
86
+ tourne sur votre machine, comme un processus que votre hôte MCP démarre, et il
87
+ parle en stdio. Il n'écoute sur aucun port.
88
+
89
+ Il ne demande ni clé d'API ni compte, donc il ne détient aucun identifiant et n'en envoie aucun.
90
+
91
+ ## Ce qui quitte votre machine, et où cela va
92
+
93
+ **Un seul hôte est joint : `www.marmiton.org`.** Rien d'autre.
94
+
95
+ | Hôte | Ce qui y est lu |
96
+ | ------------------ | ----------------- |
97
+ | `www.marmiton.org` | les pages du site |
98
+
99
+ Ce qu'une requête emporte :
100
+
101
+ | Quoi | Pourquoi |
102
+ | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
103
+ | La question posée | Un terme de recherche ou un identifiant atteint le site tel que vous l'avez écrit. |
104
+ | Un `User-Agent` | `mcp-marmiton/<version> (+https://github.com/smeet666/mcp-marmiton)`, pour que le site puisse joindre une personne au sujet du trafic qu'il reçoit. |
105
+ | Votre adresse IP | Transmise par votre réseau à tout hôte que vous joignez, comme pour n'importe quelle requête web. |
106
+
107
+ Vos requêtes atteignent Marmiton. Ce qui en est fait là-bas relève de la politique de confidentialité de ce site, que ce projet ne contrôle pas.
108
+
109
+ ## Ce qui est conservé, et combien de temps
110
+
111
+ **Les réponses sont gardées en mémoire seulement, et seulement pendant que le
112
+ serveur tourne.** Le cache est une table dans le processus : il retient ce qui a
113
+ été lu pour que lire deux fois la même page coûte une requête plutôt que deux.
114
+ Fermer le serveur le vide.
115
+
116
+ **Rien n'est écrit sur le disque.** Le serveur ne crée aucun fichier, aucune base
117
+ et aucun journal.
118
+
119
+ ## Ce qui n'est jamais collecté
120
+
121
+ - Aucune analyse d'audience, aucune télémétrie, aucun compteur d'usage.
122
+ - Rien n'est envoyé à l'auteur de ce projet ni à un tiers.
123
+ - Aucun compte, aucun profil, aucun identifiant n'est créé pour vous.
124
+ - Vos questions ne sont ni stockées, ni transmises, ni utilisées pour entraîner
125
+ quoi que ce soit.
126
+
127
+ ## Les journaux
128
+
129
+ Le serveur écrit ses diagnostics sur **stderr**, où votre hôte MCP décide de ce
130
+ qu'ils deviennent. `MARMITON_LOG_LEVEL` règle leur quantité et vaut `error` par défaut. Ces lignes restent sur votre machine.
131
+
132
+ ## Les réglages qui changent tout cela
133
+
134
+ | Variable | Ce qu'elle change |
135
+ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------ |
136
+ | `MARMITON_USER_AGENT` | Ajoute votre identifiant devant celui du projet, qui reste accolé pour que le site puisse toujours joindre une personne. |
137
+ | `MARMITON_CACHE_TTL_MS` | Combien de temps une réponse est gardée en mémoire. `0` éteint le cache. |
138
+ | `MARMITON_LOG_LEVEL` | La quantité écrite sur stderr. |
139
+
140
+ ## Les enfants
141
+
142
+ Ce serveur est un outil pour développeurs et ne s'adresse pas aux enfants.
143
+
144
+ ## Les évolutions
145
+
146
+ Une modification de cette politique voyage dans une version, et le changelog la
147
+ nomme.
148
+
149
+ ## Contact
150
+
151
+ Ouvrez une issue sur [le dépôt](https://github.com/smeet666/mcp-marmiton/issues). Pour quelque chose
152
+ d'exploitable, suivez plutôt [SECURITY.md](./SECURITY.md).