A TypeScript MCP server that exposes Duolingo learning data and actions to LLM agents via the unofficial Duolingo REST API. Provides access to user profiles, streak information, language progress, topics, words, TTS audio, and shop items.
26 tools with consistent naming (verb_noun pattern: get_*), clear descriptions (avg ~150 chars), and complete input schemas. All parameters typed and described. However, output schemas are undocumented, LLMs cannot predict response structure. No error handling guidance. Response format enum is present but generic. Missing idempotency hints, rate-limit guidance, and pagination for large result sets (e.g., get_known_words, get_learned_skills). Tool descriptions lack 'when to use' context and dependency hints. No confirmation patterns for sensitive operations. Baseline: 194 chars avg description (these ~150 chars is below median); 100% of A+ tools document output schemas (this server does not).
Convert a full language name to its abbreviation. Only works for languages the given user is currently learning.
Get the TTS audio URL for a word in a language. Returns the CDN URL for the audio file.
Get the calendar of XP gains for a user. Returns a list of calendar entries with timestamps, XP improvements, event types, and skill IDs.
Get all courses (languages and non-language subjects) a user is learning. Returns course IDs, subjects (language/math/chess/music), topics, XP, and more.
Get the authenticated user's gem and lingot balances.
Get the authenticated user's XP progress for today. Returns the daily XP goal, total XP earned today, and a list of lessons completed today. Only works for the authenticated user.
Output schemas undocumented. LLMs cannot predict response structure, field names, or types. Baseline: 100% of A+ tools document return types. This server documents none.
No error handling guidance. Errors return raw API responses without recovery hints. LLMs cannot determine if errors are retryable, user-fixable, or fatal.
Descriptions lack 'when to use' context and dependency hints. E.g., get_language_details vs get_language_progress are similar; no guidance on which to call first or when each applies.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
Get the list of users who follow a given user. Returns usernames, display names, avatars, total XP, and subscription status for each follower.
Get the list of users that a given user is following. Returns usernames, display names, avatars, total XP, and subscription status for each friend.
Get the list of topics/skills with 100% strength (golden) for a language.
Get the authenticated user's current hearts/health status. Returns heart count, max hearts, refill eligibility, and timing.
Get the list of learned topic/skill names for a language.
Get the list of words learned in a language. Returns all words from learned skills.
Get a user's status and details for a specific language. Returns level, points, streak, and learning status for the given language.
Convert a language abbreviation to its full name. Only works for languages the given user is currently learning.
Get detailed progress metrics for a specific language. Returns level, percent to next level, points rank, fluency score, skills learned, and more.
Get the list of available voice names for a language. Discovers voices from the session API.
Get the list of languages a user is learning or has learned. Returns language codes, names, levels, points, and streak information for each language.
Get leaderboard data for a time unit (e.g., 'week', 'month'). Returns ranking information for the authenticated user and their friends.
Get detailed information about all learned skills in a language. Returns skill names, titles, strength, progress, and words for each skill.
Get the list of topics/skills that need review (strength < 100%) for a language.
Get the authenticated user's Duolingo account settings. Returns notification preferences and follow/follower relationship flags. Only works for the authenticated user.
Get the full shop item catalogue. Returns all purchasable items with prices, types, and last-used dates. This is a read-only endpoint — it does not purchase anything.
Get the authenticated user's current streak goal and available next streak goal options.
Get a Duolingo user's current streak information. Returns the site-wide streak count, daily XP goal, and whether the streak has been extended today.
Get the list of not-yet-learned topics/skills for a language.
Get a Duolingo user's profile information. Returns username, full name, bio, location, avatar URL, follower/following counts, learning language, UI language, cohort, admin status, and more.
No pagination or result-limit guidance for tools returning large lists (get_known_words, get_learned_skills, get_friends). Baseline: tools returning lists must accept limit/offset and document max results.
JWT token injection via environment variable (DUOLINGO_JWT) is correct, but no audit logging or rate-limit guidance. Agents could exhaust API quotas without visibility.