Skip to main content
Glama

Get practice exercise

get_practice_exercise

Use this when the user wants to practise reading or listening for a German C1 exam (TestDaF, Goethe-Zertifikat C1 or telc Deutsch C1 Hochschule) and asks for an exercise or the next task. Returns one exam-format exercise WITHOUT the solution: a text with questions (reading) or a recording with questions (listening). The user answers in the chat; then check the answers with check_practice_answers. A user without an account can use one part (one reading exercise, one listening exercise or one text evaluation); after that a free GermanExam.pro account is needed, and a request that the account does not include is answered with a short note and a link to an information page. The exercise attempt is stored for 30 days (and, for signed-in users, in their GermanExam.pro account). Never solve the exercise yourself and never reveal or guess answers. Not for writing (use evaluate_text), speaking, grammar drills or other exams.

Input Schema

NameRequiredDescriptionDefault
examYesThe exam: testdaf, goethe_c1 or telc_c1 (telc Deutsch C1 Hochschule). Ask the user if unclear.
partNoOptional: the part of the exam the user wants to practise, as the user says it: a part number such as "Teil 2" (Goethe, telc) or a part name such as "Multiple Choice" or "Textabschnitte ordnen" (TestDaF). Omit for any part; if no such part exists the tool says so.
skillYeslesen = reading, hoeren = listening.
feedback_languageNoLanguage of the framing text: the language the user is writing to you in (de, en, ar, tr, ru, zh, fa). Default de. The exercise itself is always German.

Output Schema

NameRequiredDescriptionDefault
taskNo
labelsNo
resultNo
statusYes
infoUrlNo
messageYes
languageNo
infoLabelNo
answerHintNo
retryAfterSecondsNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed25 schema fields changed
    • removedOutput schema / properties / result / properties / items / items / properties / correctChoice / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / result / properties / items / items / properties / correctChoice / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / result / properties / items / items / properties / correctText / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / result / properties / items / items / properties / correctText / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / result / properties / items / items / properties / explanation / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / result / properties / items / items / properties / explanation / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / result / properties / items / items / properties / whyWrong / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / result / properties / items / items / properties / whyWrong / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / result / properties / items / items / properties / yourChoice / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / result / properties / items / items / properties / yourChoice / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / result / properties / items / items / properties / yourText / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / result / properties / items / items / properties / yourText / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / result / properties / partName / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / result / properties / partName / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / result / properties / transcript / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / result / properties / transcript / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / task / properties / audio / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "plays": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "seconds": {
      -        "anyOf": [
      -          {
      -            "type": "number"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "url": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "url",
      -      "seconds",
      -      "plays"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "plays": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "seconds": {
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "url": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "url",
      +      "seconds",
      +      "plays"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / task / properties / instruction / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / task / properties / instruction / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / task / properties / markCount / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / task / properties / markCount / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / task / properties / partName / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / task / properties / partName / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / task / properties / text / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / task / properties / text / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  2. Added

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare the tool is not read-only and not idempotent, but the description goes well beyond that: it discloses that the solution is withheld, that attempts are stored for 30 days, that anonymous users get exactly one part before an account is required, and how account-gated requests are answered (short note plus link). It also states a key agent constraint — never solve the exercise or reveal/guess answers — which no annotation conveys.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the trigger condition and the return format, then layers quotas, storage, and exclusions in a logical order. It is dense and somewhat long for a single paragraph, but nearly every sentence carries non-redundant information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be re-explained; given that, the description covers what remains: auth/quota behavior, data retention, safety constraints around answers, and the sibling to call next. Nothing an agent needs in order to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and all three enums are documented in the schema itself, so baseline is 3. The description adds indirect meaning about the returned exercise shape (text with questions vs. recording with questions) but does not explain the 'part' parameter or any parameter behavior beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Returns one exam-format exercise') and constrains it to German C1 exams (TestDaF, Goethe-Zertifikat C1, telc Deutsch C1 Hochschule) for reading or listening. It also distinguishes itself from siblings by naming check_practice_answers as the follow-up and evaluate_text as the writing alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit trigger conditions ('when the user wants to practise reading or listening ... and asks for an exercise or the next task') and explicit exclusions ('Not for writing (use evaluate_text), speaking, grammar drills or other exams'). The alternative tool is named alongside the condition that selects it, plus the follow-up step for checking answers.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources