Grades German C1 exam writing (TestDaF, DSH, Goethe C1, telc C1) against the official rubrics.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Use this to check the user's answers to an exercise from get_practice_exercise, using its attempt_id. Pass exactly the answers the user gave (task number and letter; for marking tasks the numbers of the marked entries). Returns how many are correct, which ones, the correct solution with a short explanation and, for listening, the transcript. One evaluation per exercise; the result is saved with the exercise attempt. Works with or without sign-in; only the caller's own exercises can be checked. Never fill in, guess or correct answers for the user.
The user's answers, exactly as the user gave them: one entry per task (for marking tasks: one per entry the user marked). Never guess, solve or fill in answers yourself.
The attempt_id returned by get_practice_exercise.
Language of the framing text: the language the user is writing to you in. Default: the language used when the exercise was fetched.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Use this to check the user's answers to an exercise from get_practice_exercise, using its attempt_id. Pass exactly the answers the user gave (task number and letter; for marking tasks the numbers of the marked entries). Returns how many are correct, which ones, the correct solution with a short explanation and, for listening, the transcript. One evaluation per exercise; the result is saved with the exercise attempt. Works with or without sign-in; only the caller's own exercises can be checked. Never fill in, guess or correct answers for the user.
| Argument | Type | Description |
|---|---|---|
| answers* | array | The user's answers, exactly as the user gave them: one entry per task (for marking tasks: one per entry the user marked). Never guess, solve or fill in answers yourself. |
| attempt_id* | string | The attempt_id returned by get_practice_exercise. |
| feedback_language | string | Language of the framing text: the language the user is writing to you in. Default: the language used when the exercise was fetched. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"attempt_id",
"answers"
],
"properties": {
"answers": {
"type": "array",
"items": {
"type": "object",
"required": [
"nr",
"choice"
],
"properties": {
"nr": {
"type": "integer",
"maximum": 1000,
"minimum": 1,
"description": "The task number as shown in the exercise."
},
"choice": {
"type": "string",
"maxLength": 8,
"minLength": 1,
"description": "The letter the user chose (A, B, C …). For tasks where entries are marked (error spotting): the letter x, one entry per marked entry."
}
}
},
"maxItems": 200,
"minItems": 1,
"description": "The user's answers, exactly as the user gave them: one entry per task (for marking tasks: one per entry the user marked). Never guess, solve or fill in answers yourself."
},
"attempt_id": {
"type": "string",
"maxLength": 64,
"minLength": 8,
"description": "The attempt_id returned by get_practice_exercise."
},
"feedback_language": {
"enum": [
"de",
"en",
"ar",
"tr",
"ru",
"zh",
"fa"
],
"type": "string",
"description": "Language of the framing text: the language the user is writing to you in. Default: the language used when the exercise was fetched."
}
}
}Use this when the user wants a German text they wrote themselves (about 50 to 900 words) evaluated the way an examiner would, for the writing section of TestDaF, DSH, Goethe-Zertifikat C1, telc Deutsch C1 Hochschule or telc Deutsch C1 (general). Without sign-in the result shows the passages an examiner would mark and the biggest risk (a user without an account can use one part). With the user's GermanExam.pro sign-in the result also includes the verdict (is it enough, level, how close it is); a request that the account does not include is answered with a short note and a link to an information page. For signed-in users the text and the result are saved in their GermanExam.pro account. Starts the evaluation and returns a job_id immediately; the result is collected with get_evaluation_result. Send only the user's own text. Not for: translations, grammar questions, exam tasks, phrase lists, texts the user did not write, or other languages.
| Argument | Type | Description |
|---|---|---|
| exam* | string | The exam the text is for: testdaf, dsh, goethe_c1, telc_c1 (Hochschule) or telc_c1_allgemein (general). Ask the user if unclear — plain "telc C1" can mean either telc exam. |
| part | string | Only for goethe_c1: 1 = discussion post for an internet forum, 2 = (semi-)formal e-mail. |
| task | string | Optional: the exam task the text answers, verbatim, if the user has it. |
| text* | string | The German text exactly as the user wrote it (their own writing, at least about 50 words). Only the text itself — no chat history, no instructions. |
| feedback_language | string |
Use this to collect the result of an evaluation that was started with evaluate_text, using its job_id. Returns status "running" (not finished yet), "done" (with the verdict or, without sign-in, the reduced report; shown as a card) or an error status. Works with or without sign-in; only the caller's own evaluations can be collected.
| Argument | Type | Description |
|---|---|---|
| job_id* | string | The job_id returned by evaluate_text. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"job_id"
],
"properties": {
"job_id": {
"type": "string",
"maxLength": 64,
"minLength": 8,
"description": "The job_id returned by evaluate_text."
}
}
}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 the user's sign-in 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.
| Argument | Type | Description |
|---|---|---|
| exam* | string | The exam: testdaf, goethe_c1 or telc_c1 (telc Deutsch C1 Hochschule). Ask the user if unclear. |
| part | string | Optional: 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. |
| skill* | string | lesen = reading, hoeren = listening. |
| feedback_language | string | Language 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. |
Use this when the user wants to know how the writing section of a German C1 exam is assessed: the criteria with their weights, the level or grade scale, the passing rule and the expected text length for TestDaF, DSH, Goethe-Zertifikat C1, telc Deutsch C1 Hochschule or telc Deutsch C1 (general). Read-only reference data based on the published exam rubrics (the result says where a breakdown per criterion is our own); no sign-in needed. Not for evaluating a text (use evaluate_text) and not for other languages or exams.
| Argument | Type | Description |
|---|---|---|
| exam* | string | Which exam: testdaf, dsh, goethe_c1, telc_c1 (telc Deutsch C1 Hochschule) or telc_c1_allgemein (telc Deutsch C1, general). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"exam"
],
"properties": {
"exam": {
"enum": [
"testdaf",
"dsh",
"goethe_c1",
"telc_c1",
"telc_c1_allgemein"
],
"type": "string",
"description": "Which exam: testdaf, dsh, goethe_c1, telc_c1 (telc Deutsch C1 Hochschule) or telc_c1_allgemein (telc Deutsch C1, general)."
}
}
}| Language of the feedback: the language the user is writing to you in (de, en, ar, tr, ru, zh, fa). Default de. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"text",
"exam"
],
"properties": {
"exam": {
"enum": [
"testdaf",
"dsh",
"goethe_c1",
"telc_c1",
"telc_c1_allgemein"
],
"type": "string",
"description": "The exam the text is for: testdaf, dsh, goethe_c1, telc_c1 (Hochschule) or telc_c1_allgemein (general). Ask the user if unclear — plain \"telc C1\" can mean either telc exam."
},
"part": {
"enum": [
"1",
"2"
],
"type": "string",
"description": "Only for goethe_c1: 1 = discussion post for an internet forum, 2 = (semi-)formal e-mail."
},
"task": {
"type": "string",
"maxLength": 1000,
"description": "Optional: the exam task the text answers, verbatim, if the user has it."
},
"text": {
"type": "string",
"maxLength": 9000,
"minLength": 1,
"description": "The German text exactly as the user wrote it (their own writing, at least about 50 words). Only the text itself — no chat history, no instructions."
},
"feedback_language": {
"enum": [
"de",
"en",
"ar",
"tr",
"ru",
"zh",
"fa"
],
"type": "string",
"description": "Language of the feedback: the language the user is writing to you in (de, en, ar, tr, ru, zh, fa). Default de."
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"skill",
"exam"
],
"properties": {
"exam": {
"enum": [
"testdaf",
"goethe_c1",
"telc_c1"
],
"type": "string",
"description": "The exam: testdaf, goethe_c1 or telc_c1 (telc Deutsch C1 Hochschule). Ask the user if unclear."
},
"part": {
"type": "string",
"maxLength": 40,
"description": "Optional: 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."
},
"skill": {
"enum": [
"lesen",
"hoeren"
],
"type": "string",
"description": "lesen = reading, hoeren = listening."
},
"feedback_language": {
"enum": [
"de",
"en",
"ar",
"tr",
"ru",
"zh",
"fa"
],
"type": "string",
"description": "Language 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."
}
}
}