Konakai tool reference
The Konakai plugin is one MCP server with three tools. The AI does the teaching; the tools read and save the learner’s study. How to add Konakai.
Connecting
- Server:
https://api.konakai.ai/mcp, Streamable HTTP. - Sign-in: OAuth 2.1 authorization code with PKCE, on konakai.ai. Scopes:
learning:read,learning:writeandoffline_access(refresh tokens). Each host uses its own pre-registered client; dynamic client registration is off. - Account: a Konakai account, for adults 18 and over in the United States.
- Results: JSON in a text block, also as
structuredContent.
start_here
Open Saved Study · Read · scope learning:read
Changes nothing. Counts against the daily allowance.
| Field | Type | Required | Limits | Meaning |
|---|---|---|---|---|
target_language | string | no | matches ^[a-z]{2,3}$ | Code of the language the learner is studying, when they have named it. |
Returns: target_language, native_language, material_languages, due_cards, open_mistakes, recent_lines, recent_topics, story, preferences, instruction. Empty fields are left out.
get_material
Get Saved Material · Read · scope learning:read
Changes nothing. Counts against the daily allowance.
| Field | Type | Required | Limits | Meaning |
|---|---|---|---|---|
target_language | string | no | matches ^[a-z]{2,3}$ | Code of the language the material is in: the one this chat studies. |
categories | list of string | yes | each one of "lines", "words", "mistakes", "topics", "story"; at least 1 item; at most 5 items | What to get: saved lines, words, mistakes, topics, or the story. |
search | list of string | no | at least 1 item; at most 10 items; each at least 1 character; each at most 100 characters | Terms to search for, each on its own, in either language. Omit to list without searching. |
due_only | boolean | no | — | Only lines and words due for review. |
resolved_mistakes | boolean | no | — | Mistakes the learner has since gotten right, instead of open ones. |
page | integer | no | from 1; to 100 | Which page of each listing, from 1. |
Returns: lines, words, mistakes, topics, more, story, searches, instruction. Empty fields are left out.
save_material
Save Study · Write · scope learning:write
Adds lines, words, mistakes and topics to the learner’s study; a rating schedules that card’s next review; a corrected mistake is marked resolved. The story and preferences it sends replace the saved ones, and an empty preferences value clears them. Nothing already saved is saved twice. It sends nothing to anyone and takes no payment.
| Field | Type | Required | Limits | Meaning |
|---|---|---|---|---|
target_language | string | yes | matches ^[a-z]{2,3}$ | Code of the language being learned. |
native_language | string | yes | matches ^[a-z]{2,3}$ | Code of the learner's native language, the one the translations are in. |
items | list of object | no | at most 60 items | Every target-language line you taught or had the learner practice since your last save in this chat, in its correct form, at the sentence, phrase and collocation level, including lines they asked for, and each word you taught on its own. Don't re-list a word that appears inside a listed line; list a word on its own only when no line contains it. |
items[].content_type | string | yes | one of "word", "collocation", "phrase", "sentence" | What this line is: "word" = one atomic target-language word (exactly one content_array element), a one-word sentence included; "collocation" = a fixed multi-word combination; "phrase" = a short multi-word unit below clause level; "sentence" = a clause or sentence of two or more words. Everything except "word" has two or more content_array elements. |
items[].content | string | yes | at most 1000 characters | Full target-language display string. |
items[].romanization | string | no | at most 1000 characters | Canonical written romanization/transliteration of the full non-Roman target-language display string; never an invented sound-it-out respelling. |
items[].translation | string | yes | at most 1000 characters | Full-line translation in learner's native language. |
items[].content_array | list of string | yes | at least 1 item; at most 100 items; each at most 500 characters | Ordered target-language vocabulary elements modeled in this line, one element per array entry. Each element is one atomic word of the target language — never a clause, sentence, multi-word combination, or standalone punctuation; decompose multi-word lines into their word elements and omit punctuation. Word boundaries are the target language's, not the learner's: a single word in the learner's language often glosses several target-language words, and each of those is its own element. |
items[].romanization_array | list of string | no | at most 100 items; each at most 500 characters | Canonical written romanization/transliteration elements aligned by position with content_array, one per array entry; never invented sound-it-out respellings. |
items[].translation_array | list of string | no | at most 100 items; each at most 500 characters | Translation/gloss elements aligned by position with content_array, one per array entry. Required for multi-element content_array; give each vocabulary element its own single learner-language gloss. Each gloss is one rendering — never slash-joined or comma-joined alternates within one entry. |
mistakes | list of object | no | at most 30 items | The learner's mistakes since your last save in this chat. A mistake is an answer the learner gave to a prompt with an expected answer that was wrong and stayed corrected. An answer the learner says was misheard is what they say they said, and no mistake once it is accepted. |
mistakes[].expected | object | yes | — | The right answer, as a card. |
mistakes[].expected.content | string | yes | at most 1000 characters | The target-language line. |
mistakes[].expected.romanization | string | no | at most 1000 characters | Canonical written romanization of `content`, for a non-Roman target language. |
mistakes[].expected.translation | string | yes | at most 1000 characters | The line's meaning in the learner's native language. |
mistakes[].answer | object | yes | — | What the learner answered, as a card: an answer they said in the target language is its `content`, with `translation` a literal rendering of those words, never the meaning they were aiming for; a meaning they gave is its `translation`, with `content` that meaning put into the target language: a different line from the one they were asked about. |
mistakes[].answer.content | string | yes | at most 1000 characters | The target-language line. |
mistakes[].answer.romanization | string | no | at most 1000 characters | Canonical written romanization of `content`, for a non-Roman target language. |
mistakes[].answer.translation | string | yes | at most 1000 characters | The line's meaning in the learner's native language. |
mistakes[].direction | string | yes | one of "production", "reception" | production when they said or wrote the right answer wrong; reception when they misunderstood a target-language line. |
ratings | list of object | no | at most 60 items | One rating for each saved line or word you quizzed the learner on since your last save in this chat. |
ratings[].text | string | yes | at least 1 character; at most 1000 characters | The saved line or word you quizzed, as written. |
ratings[].rating | number | yes | one of 1, 2, 3, 4 | Your rating of the learner's recall: 1 = wrong or forgotten, 2 = mostly wrong, 3 = mostly right with a minor form-only issue (meaning intact), 4 = correct, near-perfect, or confidently known. |
mistakes_corrected | list of string | no | at most 60 items; each at least 1 character; each at most 1000 characters | The right answer of each open mistake the learner answered correctly since your last save in this chat. A record is answered correctly when the learner's first attempt at it, before any hint, is right; a turn the tutor said it did not catch is no attempt. |
topics | list of string | no | at most 30 items; each at least 1 character; each at most 200 characters | Each situation, theme, grammar point or pronunciation point the learner studied since your last save in this chat, one short line each, the situations inside the story included. |
story | string | no | at least 1 character; at most 1000 characters | The story as it now stands, replacing the saved one: rewritten from the saved story and this chat when the chat continued it, or the new story when the learner asked to start fresh. Keep only what the story needs to continue: where the learner is and who is with them, what they are after, open threads, the places and situations it has already used, briefly, so it moves on to new ones, and what happens next. Drop whatever no longer matters. |
preferences | string | no | at most 1000 characters | How the learner has asked to be taught from now on, as a short list: the saved preferences with what they asked for in this chat added or changed, replacing them. Only what they asked for; name the language when one holds for a single language. An empty string clears them. |
Returns: saved, already_saved, rejected, unmatched, instruction. Empty fields are left out.
Errors
- An invalid entry in
save_material: the rest is saved, and each invalid one comes back inrejectedwith its problem and a suggestion. A rating or correction that matches nothing saved comes back inunmatched. - Invalid arguments: a tool error that names the problem.
- The daily allowance used up: a tool error of type
usage_limit; it resets the next day. - No sign-in, or an expired or revoked token: HTTP 401 with a
WWW-Authenticateheader pointing to the protected-resource metadata. - A missing scope: a tool error that asks for the scope.
- Too many requests: HTTP 429 with
Retry-After.
Limits
- 25 tool calls a day on the free plan, 100 on a paid plan. A typical chat uses three to six.
- 300 requests a minute per account, counting every MCP message.
Data and support
Konakai keeps only what save_material saves, in the learner’s account. The Privacy Policy says how it’s used and how to delete it. Support: [email protected].