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 yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:a90c7ce967797d7ae83fc19351f2e20c650fa77ef5126cfd91e10f078476efe8 | sha256sum