Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,549Letters: 14Defects: 1,324counted just now
teppi

Server definition

Hash
sha256:a90c7ce967797d7ae83fc19351f2e20c650fa77ef5126cfd91e10f078476efe8
What it is
What a remote MCP server returned when asked what it offers: 24 tools

The blob, as servednamed by its sha256

{ "instructions": "Ripostiq delivers courses that run right inside this chat (Claude, ChatGPT, or any MCP client): each module teaches, makes the learner build real work, then a boss-battle stakeholder grills them until they can defend it.\nGETTING STARTED: when a user wants to learn / browse / start, call list_courses FIRST (no login needed) and show them the catalog. Anyone can start ANY course's free Module 1 right now — call begin_course(course) then teach_section — without logging in.\nROAST MY WORK: if someone wants honest, pointed feedback on a real artifact (a PRD, architecture, code, pitch, resume, plan…), call roast(work, kind) — a free, no-login stakeholder grilling that doubles as a taste of the boss-battle method.\nDAILY DRILL: a returning learner can do a two-minute drill — call daily_drill(course) for today's recall question, then daily_drill(course, done=true) after they answer, to keep their streak. Offer it when they come back or finish a session.\nPRACTICE EXAM: some courses (see `has_exam` in list_courses) include a SCORED PRACTICE EXAM — a full multiple-choice mock that returns a scaled score against the real pass line, a per-domain breakdown, and rationale per question. Call start_exam(course) to draw a form, proctor it one question at a time WITHOUT revealing or answering, then submit_exam(course, answers) to score. Login + entitlement gated like the paid capstone.\nMOCK INTERVIEW: if someone is prepping for an interview, call interview_prep(jd_or_skill, role, experience) — a free, calibrated grilling against their target role that ends with a candid scorecard. A high-intent entry point into the courses.\nINTERVIEW PREP (curated topics): for a known topic the catalog covers (e.g. 'agentic AI in production', 'production AI/LLM systems'), call list_interviews() then start_interview(interview) — an adaptive mock interview from a curated question bank (concept→scenario pairs across several areas). It checks ~4-5 areas, hints when the learner is stuck, ends with a scorecard, and funnels into the matching course. LOGIN REQUIRED (free in the current beta, gated like a course): if start_interview returns needs_login, ask the learner to log in with the connector before running it — for a quick no-login taste use the free-form interview_prep instead.\nCREATE A COURSE: if the learner wants to learn something the catalog DOESN'T cover (check list_courses first), offer to build it: call create_course(topic) and follow the authoring protocol to generate a full course (lessons + labs + boss battles). Save it in CHUNKS — save_course_draft, then add_course_module once per module, then finalize_course — never one giant save_course call. It's saved privately to them and works like any course; they can submit it for review to publish it. This is how the catalog grows — never tell someone 'we don't have that', offer to make it.\nIDENTITY: login happens via this app/connector's 'Log in with Ripostiq' approval (OAuth) or at ripostiq.com — NEVER ask the user to type their email or password into the chat, and never use the login tool to collect a password. Only PAID modules and cross-device progress sync need login; if get_entitlements/whoami says not logged in, keep going with free content and point them to the connector login only when they want paid modules.", "tools": [ { "description": "Start a course. Returns the tutor protocol, intake guidance, and the module map.\nCall this first, run the intake, then call teach_section to teach Module 1.", "inputSchema": { "additionalProperties": false, "properties": { "auth_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "course": { "type": "string" } }, "required": [ "course" ], "type": "object" }, "name": "begin_course", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "The two-minute drill — today's spaced-recall question + the learner's day streak. Call it\nto fetch today's question (deterministic per day, drawn from modules they've started); after\nthey answer and you reveal it, call again with done=true to log it and bump the streak. A\ndaily habit: one question, two minutes, keep the streak alive.", "inputSchema": { "additionalProperties": false, "properties": { "auth_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "course": { "type": "string" }, "done": { "default": false, "type": "boolean" } }, "required": [ "course" ], "type": "object" }, "name": "daily_drill", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Fetch a saved Library artifact's full content (by id, or by key+course). Use to pull a\nprior deliverable forward and build on it in a new chat.", "inputSchema": { "additionalProperties": false, "properties": { "artifact_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null }, "auth_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "course": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "key": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null } }, "type": "object" }, "name": "get_artifact", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Ripostiq certificate status. Pass `module` for that module's certificate (earned when\nits boss battle is passed); omit it for the course certificate (earned when EVERY module's\nboss is passed). Both are viewable at /certificate and publicly verifiable at /verify/<code>.", "inputSchema": { "additionalProperties": false, "properties": { "auth_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "course": { "type": "string" }, "module": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null } }, "required": [ "course" ], "type": "object" }, "name": "get_certificate", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "List the logged-in account's entitlements across courses (OAuth bearer or auth_token).", "inputSchema": { "additionalProperties": false, "properties": { "auth_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null } }, "type": "object" }, "name": "get_entitlements", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Fetch a module's lesson content. Free module is open; paid modules require an\nactive entitlement. Returns {locked, teaser, checkout_url} when not entitled.", "inputSchema": { "additionalProperties": false, "properties": { "auth_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "course": { "type": "string" }, "module": { "type": "string" }, "section": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null } }, "required": [ "course", "module" ], "type": "object" }, "name": "get_lesson", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Full course outline — every module + its section titles — so the learner can pick ANY\nmodule/section to start, in any order. Marks locked modules and their progress.", "inputSchema": { "additionalProperties": false, "properties": { "auth_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "course": { "type": "string" } }, "required": [ "course" ], "type": "object" }, "name": "get_outline", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Return the learner's progress for a course — the raw doc plus a display-ready summary\n(per-module sections done/total, boss status, overall percent, current position), and\nwind_down coverage (which modules have their cheatsheet + session summary saved).", "inputSchema": { "additionalProperties": false, "properties": { "auth_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "course": { "type": "string" } }, "required": [ "course" ], "type": "object" }, "name": "get_progress", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Resume briefing for a returning learner — what they've covered, mastery levels,\nstrong/weak topics, and recall questions to reactivate memory. Call at session start.", "inputSchema": { "additionalProperties": false, "properties": { "auth_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "course": { "type": "string" } }, "required": [ "course" ], "type": "object" }, "name": "get_recap", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Free 'Mock interview' — a realistic, calibrated interview for a role. `jd_or_skill` is the\njob description (paste it) or the skill/role to interview against; `role` and `experience`\n(e.g. 'senior backend engineer', '5 years') calibrate difficulty; `focus` narrows it (e.g.\n'system design'). No login or course needed. Returns the interview protocol + a course\nrecommendation. Great when someone is prepping for an interview and wants a real grilling.", "inputSchema": { "additionalProperties": false, "properties": { "auth_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "experience": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "focus": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "jd_or_skill": { "type": "string" }, "role": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null } }, "required": [ "jd_or_skill" ], "type": "object" }, "name": "interview_prep", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "List the learner's saved Library artifacts (titles + metadata, newest first). Use at\nsession start (with get_recap) to reference prior work and continue seamlessly.", "inputSchema": { "additionalProperties": false, "properties": { "auth_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "course": { "type": "string" }, "module": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null } }, "required": [ "course" ], "type": "object" }, "name": "list_artifacts", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "List every available Ripostiq course (no login needed). Call this FIRST when a user wants\nto browse or start learning. Each course has a free Module 1 anyone can start immediately via\nbegin_course(course) → teach_section. Returns the `course` id to pass to other tools.\nFor a logged-in learner this also includes courses THEY authored (marked `mine`, with their\n`visibility`) — offer those alongside the catalog.", "inputSchema": { "additionalProperties": false, "properties": { "auth_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null } }, "type": "object" }, "name": "list_courses", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "List the curated Interview-Prep topics (e.g. 'Agentic AI in Production'). Each is a\nrealistic, adaptive mock interview on a fixed topic — concept→scenario question pairs across\nseveral areas — that ends in a candid scorecard. No login or course needed. Call this when\nsomeone wants to prep for an interview on a topic the catalog covers, then start_interview.", "inputSchema": { "additionalProperties": false, "properties": {}, "type": "object" }, "name": "list_interviews", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Claude Code plugin login only (auth_token flow). On the web/desktop connector, identity\ncomes from the connector's OAuth approval — do NOT ask the user to type their email/password\ninto the chat; direct them to the connector's 'Log in with Ripostiq' or ripostiq.com instead.", "inputSchema": { "additionalProperties": false, "properties": { "email": { "type": "string" }, "password": { "type": "string" } }, "required": [ "email", "password" ], "type": "object" }, "name": "login", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Record the learner's progress server-side (shows on their account + syncs across\ndevices). Call when a section is genuinely completed (section_id), or after a boss battle\n(boss='passed'/'failed', boss_attempt=true), or on a lab status change (lab=...).", "inputSchema": { "additionalProperties": false, "properties": { "auth_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "boss": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "boss_attempt": { "default": false, "type": "boolean" }, "course": { "type": "string" }, "lab": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "module": { "type": "string" }, "section_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null } }, "required": [ "course", "module" ], "type": "object" }, "name": "mark_progress", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Return spaced-recall questions drawn from the account's completed modules.", "inputSchema": { "additionalProperties": false, "properties": { "auth_token": { "type": "string" }, "count": { "default": 2, "type": "integer" }, "course": { "type": "string" } }, "required": [ "auth_token", "course" ], "type": "object" }, "name": "recall_questions", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Free 'Roast my work' — a single tough-but-fair stakeholder grilling of ANY artifact the\nuser pastes (PRD, architecture, code, pitch, resume, plan, essay…). No login or course\nneeded. `work` is the artifact (or a solid description); `kind` optionally hints the type\n(prd/architecture/code/pitch/strategy/resume/design…) to pick the right persona; `focus` is\nwhat they most want pushback on. Returns the roast protocol + a course recommendation. Great\nas an entry point when someone wants honest, pointed feedback on real work.", "inputSchema": { "additionalProperties": false, "properties": { "auth_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "focus": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "kind": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "work": { "type": "string" } }, "required": [ "work" ], "type": "object" }, "name": "roast", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Get the module's boss-battle simulation + how to run it (in-character, real stakes,\nearned PASS). Gated like lessons. `difficulty` dials the intensity — 'friendly' (supportive\ncoach), 'standard' (default), or 'brutal' (relentless, skeptical, high bar) — and optional\n`persona_style` sets a flavor (e.g. 'skeptical CTO', 'hostile board member'). The rubric is\nunchanged; only how hard the stakeholder presses. Offer the learner the choice first.", "inputSchema": { "additionalProperties": false, "properties": { "auth_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "course": { "type": "string" }, "difficulty": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "module": { "type": "string" }, "persona_style": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null } }, "required": [ "course", "module" ], "type": "object" }, "name": "run_boss", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Start the course's SCORED PRACTICE EXAM — a full, blueprint-aligned multiple-choice mock\nthat returns a scaled score against the real pass line, a per-domain breakdown, and rationale\nfor every question. Login + entitlement gated like the paid capstone (returns needs_login /\nlocked if not). Returns a drawn `form` of questions WITHOUT the answers (the key is held\nserver-side); proctor them one at a time, collect the learner's letters, then call\nsubmit_exam(course, answers) to score. Never reveal or answer the questions yourself.", "inputSchema": { "additionalProperties": false, "properties": { "auth_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "course": { "type": "string" } }, "required": [ "course" ], "type": "object" }, "name": "start_exam", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Begin a curated Interview-Prep session on a fixed topic. `interview` is the topic id from\nlist_interviews (e.g. 'agentic-ai-in-production'); `role`/`experience` calibrate difficulty.\nLOGIN REQUIRED (free in the current beta, like a course): if the learner isn't logged in this\nreturns needs_login — ask them to log in with the connector, don't run the questions. Once\nunlocked, returns the question bank + an adaptive protocol (one question at a time across ~4-5\nareas, concept then scenario, hint when stuck, scorecard at the end). Save it with\nsave_interview.", "inputSchema": { "additionalProperties": false, "properties": { "auth_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "experience": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "interview": { "type": "string" }, "role": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null } }, "required": [ "interview" ], "type": "object" }, "name": "start_interview", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Submit a lab deliverable. Stores it in the learner's Library (type='deliverable') and\nreturns the module rubric so it can be reviewed against the bar. Call get_review next.\nFor general note-taking use save_artifact instead.", "inputSchema": { "additionalProperties": false, "properties": { "auth_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "content_text": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "course": { "type": "string" }, "module": { "type": "string" }, "repo_ref": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "type": { "type": "string" } }, "required": [ "course", "module", "type" ], "type": "object" }, "name": "submit_artifact", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Score a practice exam started with start_exam. `answers` maps each question id to the\nlearner's chosen letter, e.g. {\"q001\": \"A\", \"q002\": \"C\"}; unanswered questions score as\nincorrect. Returns the scaled score, PASS/FAIL vs the pass line, a per-domain breakdown, and\nthe per-question rationale for review. Deliver it as an honest scorecard and point them to the\nweak domains' modules.", "inputSchema": { "additionalProperties": false, "properties": { "answers": { "additionalProperties": true, "type": "object" }, "auth_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "course": { "type": "string" } }, "required": [ "course", "answers" ], "type": "object" }, "name": "submit_exam", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Get one lesson section's content + the teaching protocol for it. Free module is\nopen; paid modules require an active entitlement (returns {locked, teaser} if not).\nTeach it socratically, then call again with section_index+1 to advance.", "inputSchema": { "additionalProperties": false, "properties": { "auth_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null }, "course": { "type": "string" }, "module": { "type": "string" }, "section_index": { "default": 0, "type": "integer" } }, "required": [ "course", "module" ], "type": "object" }, "name": "teach_section", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Return the current logged-in user (via OAuth bearer or an auth_token).", "inputSchema": { "additionalProperties": false, "properties": { "auth_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null } }, "type": "object" }, "name": "whoami", "outputSchema": { "additionalProperties": true, "type": "object" } } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:a90c7ce967797d7ae83fc19351f2e20c650fa77ef5126cfd91e10f078476efe8 | sha256sum