Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
TANDOOR_URLNoBase URL of the Tandoor instance (e.g., https://tandoor.example.com).
TANDOOR_HOSTNoHost interface for the HTTP transport.
TANDOOR_PATHNoURL path prefix for the HTTP transport (e.g., /tandoor/mcp).
TANDOOR_PORTNoPort for the HTTP transport.
TANDOOR_TOKENNoAPI token for authenticating with Tandoor (Settings → API → Access Tokens).
TANDOOR_TRANSPORTNoTransport protocol: stdio for local clients, http to expose over network.stdio
TANDOOR_AUTH_TOKENNoBearer token required for HTTP transport when not using TANDOOR_ALLOW_UNAUTHENTICATED.
TANDOOR_ALLOW_UNAUTHENTICATEDNoSet to 'true' to waive the auth token requirement for HTTP transport.

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
search_recipesA

Search recipes. Returns compact hits (id, name, description, keywords).

Use get_recipe with an id from the result to read steps and ingredients.

get_recipeA

Read one recipe in full: steps, ingredients, and all entity ids.

Always call this before update_recipe. The ids in the result are what you pass back to keep existing steps, ingredients, foods and units intact.

create_recipeA

Create a new recipe with all its steps and ingredients in one call.

Every food, unit and keyword must be referenced by id and name, looked up with search_foods / search_units / search_keywords beforehand. Reduce each written ingredient line to a singular base noun for the search and put adjectives and preparation into the ingredient's note: '100 g geriebener Parmesan' becomes food 'Parmesan', unit 'g', amount 100, note 'gerieben'.

STEP TEMPLATING Instructions are Jinja templates. Placeholders are replaced when the recipe is viewed, and amounts inside them rescale automatically when the user changes the serving count. Literal numbers you type do not rescale.

{{ ingredients[0] }} amount + unit + food, plural-aware ("2 Chilischoten", "30 Gramm Ingwerwurzel", "2 Zehen Knoblauch") {{ ingredients[0].food }} just the food name, plural-aware {{ ingredients[0].amount }} just the number, scaling {{ ingredients[0].unit }} just the unit {{ ingredients[0].note }} the note; notes are NOT part of {{ ingredients[0] }} {{ scale(200) }} any other number that should scale with servings

The index is ZERO-BASED and refers to the ingredient list of the SAME step, in the order you supply it. Indexes are not shared across steps.

CRITICAL: an out-of-range index renders as an empty string, silently — the sentence simply loses a word and nothing reports an error. Count the step's own ingredients before writing an index. This server rejects out-of-range indexes, so a rejection means your index was wrong, not that the syntax was.

Convention worth following: annotate each reference with a Jinja comment so the template stays readable, e.g. {{ ingredients[1] }}{# Ingwerwurzel #} schälen und grob würfeln. Comments render to nothing.

Write prose and put a placeholder wherever an amount or an ingredient name occurs, instead of repeating the numbers literally.

update_recipeA

Update an existing recipe. Only the fields you set are changed; the rest of the recipe is read and written back unchanged.

Passing 'steps' replaces the entire step list. Call get_recipe first and pass back every step you want to keep, including its id — a step without an id is created as new, and an omitted step is deleted. The same holds for the ingredients inside a step.

STEP TEMPLATING Instructions are Jinja templates. Placeholders are replaced when the recipe is viewed, and amounts inside them rescale automatically when the user changes the serving count. Literal numbers you type do not rescale.

{{ ingredients[0] }} amount + unit + food, plural-aware ("2 Chilischoten", "30 Gramm Ingwerwurzel", "2 Zehen Knoblauch") {{ ingredients[0].food }} just the food name, plural-aware {{ ingredients[0].amount }} just the number, scaling {{ ingredients[0].unit }} just the unit {{ ingredients[0].note }} the note; notes are NOT part of {{ ingredients[0] }} {{ scale(200) }} any other number that should scale with servings

The index is ZERO-BASED and refers to the ingredient list of the SAME step, in the order you supply it. Indexes are not shared across steps.

CRITICAL: an out-of-range index renders as an empty string, silently — the sentence simply loses a word and nothing reports an error. Count the step's own ingredients before writing an index. This server rejects out-of-range indexes, so a rejection means your index was wrong, not that the syntax was.

Convention worth following: annotate each reference with a Jinja comment so the template stays readable, e.g. {{ ingredients[1] }}{# Ingwerwurzel #} schälen und grob würfeln. Comments render to nothing.

Write prose and put a placeholder wherever an amount or an ingredient name occurs, instead of repeating the numbers literally.

delete_recipeA

Permanently delete a recipe. This cannot be undone.

search_foodsA

Look up foods (ingredients) by name — all of a recipe's ingredients at once.

Results are ranked by similarity, best first, so the top hit is usually right but the tail may be unrelated. Pick the entry that means the ingredient itself: prefer 'Parmesan' over 'Parmesankäse' unless the recipe really calls for the latter.

Search for the ingredient, not the whole written line. Amount, unit and preparation are separate fields, so "100 g geriebener Parmesan" is one query for 'Parmesan', with 'gerieben' going into the ingredient's note.

Foods form a tree, so 'full_name' shows the path ('Gemüse > Zwiebel'). Called without queries this lists foods, which is rarely useful — the database holds thousands.

create_foodA

Create a new food (ingredient). Search first. Tandoor has no duplicate detection, so a second 'Zwiebel' would sit next to the existing one forever with nothing to flag it. Store the plain noun ('Parmesan'), never a prepared form ('geriebener Parmesan') — preparation belongs in the ingredient's note.

search_unitsA

Look up units of measure, or list them all.

Called without queries this returns the complete vocabulary, which is short. Do that when unsure rather than guessing a name: Tandoor keeps 'g' and 'Gramm' as separate units, and picking the wrong one is invisible afterwards.

create_unitA

Create a new unit of measure. Search first. Tandoor has no duplicate detection, so a second 'Gramm' would sit next to the existing one forever with nothing to flag it. List the units first: the vocabulary is short and the one you want almost certainly exists.

search_keywordsA

Look up keywords (tags) by name, or list them all.

Keywords form a tree like foods, so 'full_name' shows the path. Called without queries this lists the existing tags, which is a good way to match a recipe to the vocabulary already in use rather than inventing a parallel one.

create_keywordA

Create a new keyword (tag). Search first. Tandoor has no duplicate detection, so a second 'Vegan' would sit next to the existing one forever with nothing to flag it.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Hugeldugelking/tandoor-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server