Bettyapp lecture moments
Server Details
Find the moments in university and school lectures that explain a topic, with links to play them.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 6 tools
Most tools have distinct roles, but search and search_moments overlap heavily: both find moments by topic/question, with search_moments described as a richer variant. fetch also appears to handle both moment IDs and lecture IDs/pages, which partially overlaps get_lecture.
The set mostly follows a readable verb_noun pattern: get_lecture, get_topic, list_subjects, search_moments. The bare verbs fetch and search are minor deviations, though search vs search_moments introduces some naming ambiguity.
Six tools is well within the appropriate range for a focused read-only lecture/moment lookup server. The surface is compact and purpose-specific, even if one search tool may be redundant.
Core workflows are covered: search for moments, fetch a moment, get a lecture, get topic explanations, and list subjects. Minor gaps remain, such as no clearly described subject/level-filtered search despite list_subjects implying those values are used for search_moments, and no teacher/course browsing.
Available Tools
6 toolsfetchOne lecture moment in fullARead-onlyIdempotentInspect
One result of search by its id ("@"), or a lecture by its id or the address of its page: the moment's title, summary, the questions it answers and the teacher's words at its start, its lecture and credit line, and the url that plays from it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | A search result's id, a lecture's id, or a Bettyapp lecture address. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| url | Yes | The lecture page, playing from the moment. |
| text | Yes | The moment (or the lecture and its moments) in words, with the credit line. |
| title | Yes | |
| metadata | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so safety is covered. The description contributes some behavioral context by naming what portion of a lecture is returned (only words 'at its start', not the full transcript), but says nothing about cost, permissions, or what happens with a malformed id. With annotations carrying the safety profile, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single sentence with no filler, but it is syntactically tangled — a colon-introduced list of return fields embedded in a disjunction about id types. The most decision-relevant fact (a moment id is '<lecture id>@<second>') is buried mid-sentence rather than front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one required parameter, full schema coverage, complete annotations, and an output schema to describe return values, the description covers what the agent still needs: which id forms are accepted and roughly what a moment record contains. Nothing required to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single id parameter, so the baseline is 3. The description earns an extra point by revealing the concrete moment-id format '<lecture id>@<second>', which the schema does not spell out, and by restating that a page address is also acceptable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description makes clear this returns a single lecture moment (or a whole lecture) with its title, summary, answered questions, opening transcript, lecture/credit line, and playback URL. That is a specific resource with an enumerated payload, well beyond the generic name 'fetch'. It stops short of a 5 because it never distinguishes itself from the sibling get_lecture, even though it explicitly accepts a lecture id as input.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'One result of search by its id' hints that this is the follow-up to a search call, but no sentence says when to prefer this over search_moments, get_lecture, or get_topic. There are no exclusions or prerequisites stated, leaving the agent to infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_lectureA lecture and all its momentsARead-onlyIdempotentInspect
One lecture on Bettyapp, by its id (lecture.id in a moment) or the address of its page: its course, teacher, Subjects and Levels, credit line, and every moment in it, in order, each with its play_url. Use it to give a student more of a lecture a moment came from, or to read a Bettyapp lecture link the student sent.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Or the lecture page's address (https://bettyapp.org/lectures/...). | |
| lecture_id | No | The lecture's id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| terms | Yes | The terms of use. |
| lecture | Yes | |
| moments | Yes | Its moments in order (without lecture: it is the one above). |
| attribution | Yes | How to credit Bettyapp and the lecture's creator. Follow it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive, closed-world behavior. The description adds that lookup can be by lecture id or page URL and that moments are returned in order with play_url, though it omits auth, error, and pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, with the core retrieval purpose front-loaded and the return contents and use cases following efficiently. The density is justified by the amount of useful information conveyed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema exists, parameters are fully documented, and annotations cover the safety profile. The description adds retrieval contexts and ordering semantics, leaving no major ambiguity for an agent calling this read-only tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is already high. The description adds useful meaning by tying lecture_id to lecture.id in a moment and confirming url is the lecture page address.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific retrieval action for a lecture, identifiable by id or page URL, and enumerates the returned fields and ordered moments. It is clear against generic siblings, though it does not explicitly name alternatives such as fetch or search_moments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives two concrete use cases: giving a student more of the lecture a moment came from, or reading a lecture link the student sent. It lacks explicit when-not guidance or named alternatives, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_topicThe best moment at each Level for a topicARead-onlyIdempotentInspect
A topic (photosynthesis, chain rule, supply and demand): the best moment on Bettyapp that explains it at each Level, from school to university, then a few more and related topics. Use it to give a student an explanation at their level, or an easier or a harder one. If Bettyapp has no page for the topic, try search_moments.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | The topic, in plain words. |
Output Schema
| Name | Required | Description |
|---|---|---|
| more | Yes | More moments that explain it. |
| terms | Yes | The terms of use. |
| topic | Yes | |
| levels | Yes | The best moment at each Level, lowest Level first. |
| attribution | Yes | How to credit Bettyapp and the lecture's creator. Follow it. |
| related_topics | No | Topics related to it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent, non-destructive and closed-world, so the safety bar is low; the description still adds real value by disclosing the return shape (one best moment per Level, plus extras and related topics) and the empty-result behavior that triggers the fallback. It doesn't discuss coverage depth or what 'Level' means precisely, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded, but the middle sentence is garbled ('from school to university, then a few more and related topics') and costs the reader a re-read. The fallback hint is well placed at the end; overall it's usable but not tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one required parameter, a 100% covered schema, an output schema, and rich annotations, the description only needs to explain intent and return shape — both of which it does, plus the not-found path. The ambiguity around what a 'Level' is and what 'a few more' means is the only remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already says 'The topic, in plain words,' so the baseline would be 3. The description earns an extra point by supplying example topics (photosynthesis, chain rule, supply and demand) that clarify the expected granularity and the school-to-university breadth of acceptable input for this free-text parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (a topic) and states what comes back: the best moment at each Level plus related topics, with concrete topic examples. It is recognizable against siblings, and explicitly points to search_moments as the fallback, though it never contrasts with get_lecture or search, so the distinction from those remains implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear use case ('give a student an explanation at their level, or an easier or a harder one') and an explicit negative condition with an alternative ('If Bettyapp has no page for the topic, try search_moments'). It stops short of a full 5 because it doesn't say when to prefer get_lecture or plain search over this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_subjectsThe Subjects and LevelsARead-onlyIdempotentInspect
Every Subject with lectures on Bettyapp, each with its Levels and how many lectures it has, and the Level ladder from Elementary to Graduate & Professional. Use it to find the subject and level values for search_moments, or to tell a student what Bettyapp covers.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| terms | Yes | The terms of use. |
| levels | Yes | |
| subjects | Yes | |
| attribution | Yes | How to credit Bettyapp and the lecture's creator. Follow it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so the safety profile is covered. The description adds genuine content context by describing exactly what the response contains (subjects, their levels, lecture counts, level ladder) and that it is a static reference listing; it does not mention result size or pagination, but with an output schema present that is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with what is returned and followed by when to use it. The first sentence is somewhat dense and stacks multiple payload elements, but nothing is redundant or wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, strong annotations, and an output schema covering return shape, the description supplies everything else an agent needs: what the listing contains, why it exists, and which sibling consumes its values. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 and there is nothing for the description to clarify. The description correctly implies a no-argument, full-catalog call rather than a filtered query.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb-and-resource: it enumerates every Subject with lectures on Bettyapp, each with its Levels and lecture counts, plus the Elementary-to-Graduate level ladder. An agent can immediately distinguish this catalog/listing tool from siblings like get_lecture, get_topic, and search_moments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names two concrete use cases: sourcing subject/level values for search_moments, and answering 'what does Bettyapp cover'. That gives clear routing context, though it stops short of stating when not to use it or naming any other alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchSearch Bettyapp's lecture momentsARead-onlyIdempotentInspect
Search Bettyapp's university and school lectures for the moments that explain a topic or question. Returns results, best first, each with an id for fetch, a title and the url that opens the lecture at that moment. For a student, search_moments gives more (the summary, teacher and credit line). No results: Bettyapp has no lecture on it.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The topic or question, in plain words. |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | The moments, best first. Empty: Bettyapp has no lecture on it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and a closed-world scope, and the description is consistent with that — 'No results: Bettyapp has no lecture on it' reinforces openWorldHint=false. It adds genuine behavioral context beyond the annotations: results are ordered best-first and the empty-result case has a specific meaning.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the purpose, then return shape, then the alternative and empty-state. Every sentence carries information, though the return-field list is somewhat dense and borders on restating what the output schema covers.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, result ordering, result fields, empty-state semantics, and the sibling alternative — more than enough for a one-parameter read tool with an output schema. The return-field explanation is partly redundant with the output schema, keeping it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single query parameter is already documented as 'The topic or question, in plain words.' The description restates the same idea without adding syntax, length limits, or formatting guidance, so it does not exceed the schema-driven baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and resource (Bettyapp's university and school lecture moments) plus the retrieval intent — moments that explain a topic or question. It also names the sibling search_moments and what distinguishes it, so an agent can tell the two apart without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to search_moments when fuller student-facing detail (summary, teacher, credit line) is wanted, which is a real when-to-use-alternative signal. It does not give a fully symmetric 'use this instead when...' framing, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_momentsFind lecture moments that explain a topic or questionARead-onlyIdempotentInspect
Find the moments in Bettyapp's university and school lectures that explain a topic or answer a student's question. Use it when a student asks about a topic, or is stuck on a question, and a short part of a real lecture would help. Each moment has a play_url that opens the lecture at that moment: give the student the best one or two, with the lecture title, teacher and credit line. The moments come best first. If none come back, Bettyapp has no lecture on it: do not say that it has.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | Only lectures at this Level: a code from list_subjects' levels (high_school, university_year1 ...) or its name. Leave it out for every Level. | |
| limit | No | How many moments, 1 to 10. | |
| query | Yes | The topic or the student's question, in plain words, for example "why does ice float" or "integration by parts". | |
| subject | No | Only lectures in this Subject: a name from list_subjects (for example Chemistry). Leave it out to search every Subject. |
Output Schema
| Name | Required | Description |
|---|---|---|
| level | No | The Level searched at. |
| query | Yes | The words searched for, as sent. |
| terms | Yes | The terms of use. |
| message | No | Said when there are no moments. |
| moments | Yes | The moments, best first. Empty: Bettyapp has nothing on it. |
| subject | No | The Subject searched in. |
| attribution | Yes | How to credit Bettyapp and the lecture's creator. Follow it. |
| searched_for | No | The words searched for when a misspelt word was corrected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds behavior the annotations cannot: results are ordered best-first, each moment carries a play_url that deep-links into the lecture, and an empty response specifically means Bettyapp has no lecture on the topic rather than the topic not existing. That is real operational context for interpreting output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five tight sentences with no filler: purpose first, then the usage trigger, then output handling, then ordering, then empty-result semantics. Every sentence carries actionable information for the calling agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the description need not document return fields, yet it still surfaces the critical ones (play_url, lecture title, teacher, credit line) and the ordering guarantee. Combined with full schema coverage and clear annotations, nothing needed to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so `level`, `subject`, `limit` and `query` are all documented in the schema itself. The description adds only an implicit hint about limit ('give the student the best one or two') and nothing about level/subject values, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — finding moments within Bettyapp's university and school lectures that explain a topic or answer a question — and scopes it to real lecture excerpts, which separates it from the generic `search` and from `get_lecture`/`get_topic` that return whole objects. An agent knows exactly what kind of artifact comes back.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear trigger: 'Use it when a student asks about a topic, or is stuck on a question, and a short part of a real lecture would help.' It also covers the negative case (empty results mean no lecture exists). It stops short of naming when to prefer the sibling `search` or `get_topic` instead, so it is clear but not fully routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
- Added
fetch - Changed
get_lecture1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "attribution": { + "description": "How to credit Bettyapp and the lecture's creator. Follow it.", + "type": [ + "string", + "null" + ] + }, + "lecture": { + "allOf": [ + { + "properties": { + "course": { + "properties": { + "id": { + "type": [ + "integer", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "id": { + "description": "The lecture's id.", + "type": [ + "integer", + "null" + ] + }, + "length_seconds": { + "description": "How long it is.", + "type": [ + "integer", + "null" + ] + }, + "number": { + "description": "Its place in its course.", + "type": [ + "integer", + "null" + ] + }, + "of": { + "description": "Lectures in its course with pages.", + "type": [ + "integer", + "null" + ] + }, + "subjects": { + "description": "Its Subjects, each with its Levels.", + "items": { + "properties": { + "levels": { + "items": { + "type": [ + "string", + "null" + ] + }, + "type": "array" + }, + "subject": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "subject", + "levels" + ], + "type": "object" + }, + "type": "array" + }, + "teacher": { + "description": "The course's teacher or publisher.", + "type": [ + "string", + "null" + ] + }, + "title": { + "description": "Its title.", + "type": [ + "string", + "null" + ] + }, + "url": { + "description": "Its page on Bettyapp.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id", + "title", + "url", + "course", + "teacher", + "subjects" + ], + "type": "object" + }, + { + "properties": { + "credit": { + "description": "Who made the lecture and its licence. Show line wherever the moment is linked.", + "properties": { + "creator": { + "description": "Who made the lecture.", + "type": [ + "string", + "null" + ] + }, + "creator_url": { + "description": "The creator's own site.", + "type": [ + "string", + "null" + ] + }, + "licence": { + "description": "The licence, for example CC BY-NC-SA 4.0.", + "type": [ + "string", + "null" + ] + }, + "licence_url": { + "description": "The licence's text.", + "type": [ + "string", + "null" + ] + }, + "line": { + "description": "The credit line, as the lecture page shows it.", + "type": [ + "string", + "null" + ] + }, + "transcript": { + "description": "Whether the lecture page may show the whole transcript, or only short excerpts.", + "enum": [ + "full", + "short excerpts only" + ], + "type": [ + "string", + "null" + ] + }, + "watch_at_source": { + "description": "The lecture at its own source (YouTube, the publisher).", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "line", + "creator", + "licence", + "transcript" + ], + "type": [ + "object", + "null" + ] + } + }, + "type": "object" + } + ] + }, + "moments": { + "description": "Its moments in order (without lecture: it is the one above).", + "items": { + "description": "A moment of a lecture: where it starts and ends, what it explains, and where to play it.", + "properties": { + "also_called": { + "description": "Other names for its topic.", + "items": { + "type": [ + "string", + "null" + ] + }, + "type": "array" + }, + "credit": { + "description": "Who made the lecture and its licence. Show line wherever the moment is linked.", + "properties": { + "creator": { + "description": "Who made the lecture.", + "type": [ + "string", + "null" + ] + }, + "creator_url": { + "description": "The creator's own site.", + "type": [ + "string", + "null" + ] + }, + "licence": { + "description": "The licence, for example CC BY-NC-SA 4.0.", + "type": [ + "string", + "null" + ] + }, + "licence_url": { + "description": "The licence's text.", + "type": [ + "string", + "null" + ] + }, + "line": { + "description": "The credit line, as the lecture page shows it.", + "type": [ + "string", + "null" + ] + }, + "transcript": { + "description": "Whether the lecture page may show the whole transcript, or only short excerpts.", + "enum": [ + "full", + "short excerpts only" + ], + "type": [ + "string", + "null" + ] + }, + "watch_at_source": { + "description": "The lecture at its own source (YouTube, the publisher).", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "line", + "creator", + "licence", + "transcript" + ], + "type": [ + "object", + "null" + ] + }, + "end_seconds": { + "description": "Where its part of the lecture ends.", + "type": [ + "integer", + "null" + ] + }, + "excerpt": { + "description": "The teacher's words at its start: at most 300 characters, and as short as the lecture's licence asks (at most 40 words for lectures whose licence allows only short excerpts).", + "type": [ + "string", + "null" + ] + }, + "lecture": { + "properties": { + "course": { + "properties": { + "id": { + "type": [ + "integer", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "id": { + "description": "The lecture's id.", + "type": [ + "integer", + "null" + ] + }, + "length_seconds": { + "description": "How long it is.", + "type": [ + "integer", + "null" + ] + }, + "number": { + "description": "Its place in its course.", + "type": [ + "integer", + "null" + ] + }, + "of": { + "description": "Lectures in its course with pages.", + "type": [ + "integer", + "null" + ] + }, + "subjects": { + "description": "Its Subjects, each with its Levels.", + "items": { + "properties": { + "levels": { + "items": { + "type": [ + "string", + "null" + ] + }, + "type": "array" + }, + "subject": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "subject", + "levels" + ], + "type": "object" + }, + "type": "array" + }, + "teacher": { + "description": "The course's teacher or publisher.", + "type": [ + "string", + "null" + ] + }, + "title": { + "description": "Its title.", + "type": [ + "string", + "null" + ] + }, + "url": { + "description": "Its page on Bettyapp.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id", + "title", + "url", + "course", + "teacher", + "subjects" + ], + "type": "object" + }, + "play_url": { + "description": "The lecture page, playing from this moment. Send the student here.", + "type": [ + "string", + "null" + ] + }, + "questions": { + "description": "Questions a student might ask that it answers (as title).", + "items": { + "type": [ + "string", + "null" + ] + }, + "type": "array" + }, + "start_seconds": { + "description": "Where it starts, in seconds from the lecture's start.", + "type": [ + "integer", + "null" + ] + }, + "summary": { + "description": "One or two sentences on what it explains (as title).", + "type": [ + "string", + "null" + ] + }, + "thumbnail_url": { + "description": "A picture of the lecture at about this moment.", + "type": [ + "string", + "null" + ] + }, + "time": { + "description": "start_seconds as a clock (4:33).", + "type": [ + "string", + "null" + ] + }, + "title": { + "description": "What it explains, in a few words (written with the help of an AI model and checked against the lecture).", + "type": [ + "string", + "null" + ] + }, + "topics": { + "description": "The topics explained there, most mentioned first.", + "items": { + "type": [ + "string", + "null" + ] + }, + "type": "array" + } + }, + "required": [ + "start_seconds", + "end_seconds", + "time", + "title", + "summary", + "questions", + "topics", + "excerpt", + "play_url", + "thumbnail_url", + "credit" + ], + "type": "object" + }, + "type": "array" + }, + "terms": { + "description": "The terms of use.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "attribution", + "terms", + "lecture", + "moments" + ], + "type": "object" +}
- Changed
get_topic1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "attribution": { + "description": "How to credit Bettyapp and the lecture's creator. Follow it.", + "type": [ + "string", + "null" + ] + }, + "levels": { + "description": "The best moment at each Level, lowest Level first.", + "items": { + "properties": { + "level": { + "type": [ + "string", + "null" + ] + }, + "moment": { + "description": "A moment of a lecture: where it starts and ends, what it explains, and where to play it.", + "properties": { + "also_called": { + "description": "Other names for its topic.", + "items": { + "type": [ + "string", + "null" + ] + }, + "type": "array" + }, + "credit": { + "description": "Who made the lecture and its licence. Show line wherever the moment is linked.", + "properties": { + "creator": { + "description": "Who made the lecture.", + "type": [ + "string", + "null" + ] + }, + "creator_url": { + "description": "The creator's own site.", + "type": [ + "string", + "null" + ] + }, + "licence": { + "description": "The licence, for example CC BY-NC-SA 4.0.", + "type": [ + "string", + "null" + ] + }, + "licence_url": { + "description": "The licence's text.", + "type": [ + "string", + "null" + ] + }, + "line": { + "description": "The credit line, as the lecture page shows it.", + "type": [ + "string", + "null" + ] + }, + "transcript": { + "description": "Whether the lecture page may show the whole transcript, or only short excerpts.", + "enum": [ + "full", + "short excerpts only" + ], + "type": [ + "string", + "null" + ] + }, + "watch_at_source": { + "description": "The lecture at its own source (YouTube, the publisher).", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "line", + "creator", + "licence", + "transcript" + ], + "type": [ + "object", + "null" + ] + }, + "end_seconds": { + "description": "Where its part of the lecture ends.", + "type": [ + "integer", + "null" + ] + }, + "excerpt": { + "description": "The teacher's words at its start: at most 300 characters, and as short as the lecture's licence asks (at most 40 words for lectures whose licence allows only short excerpts).", + "type": [ + "string", + "null" + ] + }, + "lecture": { + "properties": { + "course": { + "properties": { + "id": { + "type": [ + "integer", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "id": { + "description": "The lecture's id.", + "type": [ + "integer", + "null" + ] + }, + "length_seconds": { + "description": "How long it is.", + "type": [ + "integer", + "null" + ] + }, + "number": { + "description": "Its place in its course.", + "type": [ + "integer", + "null" + ] + }, + "of": { + "description": "Lectures in its course with pages.", + "type": [ + "integer", + "null" + ] + }, + "subjects": { + "description": "Its Subjects, each with its Levels.", + "items": { + "properties": { + "levels": { + "items": { + "type": [ + "string", + "null" + ] + }, + "type": "array" + }, + "subject": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "subject", + "levels" + ], + "type": "object" + }, + "type": "array" + }, + "teacher": { + "description": "The course's teacher or publisher.", + "type": [ + "string", + "null" + ] + }, + "title": { + "description": "Its title.", + "type": [ + "string", + "null" + ] + }, + "url": { + "description": "Its page on Bettyapp.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id", + "title", + "url", + "course", + "teacher", + "subjects" + ], + "type": "object" + }, + "play_url": { + "description": "The lecture page, playing from this moment. Send the student here.", + "type": [ + "string", + "null" + ] + }, + "questions": { + "description": "Questions a student might ask that it answers (as title).", + "items": { + "type": [ + "string", + "null" + ] + }, + "type": "array" + }, + "start_seconds": { + "description": "Where it starts, in seconds from the lecture's start.", + "type": [ + "integer", + "null" + ] + }, + "summary": { + "description": "One or two sentences on what it explains (as title).", + "type": [ + "string", + "null" + ] + }, + "thumbnail_url": { + "description": "A picture of the lecture at about this moment.", + "type": [ + "string", + "null" + ] + }, + "time": { + "description": "start_seconds as a clock (4:33).", + "type": [ + "string", + "null" + ] + }, + "title": { + "description": "What it explains, in a few words (written with the help of an AI model and checked against the lecture).", + "type": [ + "string", + "null" + ] + }, + "topics": { + "description": "The topics explained there, most mentioned first.", + "items": { + "type": [ + "string", + "null" + ] + }, + "type": "array" + } + }, + "required": [ + "start_seconds", + "end_seconds", + "time", + "title", + "summary", + "questions", + "topics", + "excerpt", + "play_url", + "thumbnail_url", + "credit" + ], + "type": "object" + } + }, + "required": [ + "level", + "moment" + ], + "type": "object" + }, + "type": "array" + }, + "more": { + "description": "More moments that explain it.", + "items": { + "description": "A moment of a lecture: where it starts and ends, what it explains, and where to play it.", + "properties": { + "also_called": { + "description": "Other names for its topic.", + "items": { + "type": [ + "string", + "null" + ] + }, + "type": "array" + }, + "credit": { + "description": "Who made the lecture and its licence. Show line wherever the moment is linked.", + "properties": { + "creator": { + "description": "Who made the lecture.", + "type": [ + "string", + "null" + ] + }, + "creator_url": { + "description": "The creator's own site.", + "type": [ + "string", + "null" + ] + }, + "licence": { + "description": "The licence, for example CC BY-NC-SA 4.0.", + "type": [ + "string", + "null" + ] + }, + "licence_url": { + "description": "The licence's text.", + "type": [ + "string", + "null" + ] + }, + "line": { + "description": "The credit line, as the lecture page shows it.", + "type": [ + "string", + "null" + ] + }, + "transcript": { + "description": "Whether the lecture page may show the whole transcript, or only short excerpts.", + "enum": [ + "full", + "short excerpts only" + ], + "type": [ + "string", + "null" + ] + }, + "watch_at_source": { + "description": "The lecture at its own source (YouTube, the publisher).", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "line", + "creator", + "licence", + "transcript" + ], + "type": [ + "object", + "null" + ] + }, + "end_seconds": { + "description": "Where its part of the lecture ends.", + "type": [ + "integer", + "null" + ] + }, + "excerpt": { + "description": "The teacher's words at its start: at most 300 characters, and as short as the lecture's licence asks (at most 40 words for lectures whose licence allows only short excerpts).", + "type": [ + "string", + "null" + ] + }, + "lecture": { + "properties": { + "course": { + "properties": { + "id": { + "type": [ + "integer", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "id": { + "description": "The lecture's id.", + "type": [ + "integer", + "null" + ] + }, + "length_seconds": { + "description": "How long it is.", + "type": [ + "integer", + "null" + ] + }, + "number": { + "description": "Its place in its course.", + "type": [ + "integer", + "null" + ] + }, + "of": { + "description": "Lectures in its course with pages.", + "type": [ + "integer", + "null" + ] + }, + "subjects": { + "description": "Its Subjects, each with its Levels.", + "items": { + "properties": { + "levels": { + "items": { + "type": [ + "string", + "null" + ] + }, + "type": "array" + }, + "subject": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "subject", + "levels" + ], + "type": "object" + }, + "type": "array" + }, + "teacher": { + "description": "The course's teacher or publisher.", + "type": [ + "string", + "null" + ] + }, + "title": { + "description": "Its title.", + "type": [ + "string", + "null" + ] + }, + "url": { + "description": "Its page on Bettyapp.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id", + "title", + "url", + "course", + "teacher", + "subjects" + ], + "type": "object" + }, + "play_url": { + "description": "The lecture page, playing from this moment. Send the student here.", + "type": [ + "string", + "null" + ] + }, + "questions": { + "description": "Questions a student might ask that it answers (as title).", + "items": { + "type": [ + "string", + "null" + ] + }, + "type": "array" + }, + "start_seconds": { + "description": "Where it starts, in seconds from the lecture's start.", + "type": [ + "integer", + "null" + ] + }, + "summary": { + "description": "One or two sentences on what it explains (as title).", + "type": [ + "string", + "null" + ] + }, + "thumbnail_url": { + "description": "A picture of the lecture at about this moment.", + "type": [ + "string", + "null" + ] + }, + "time": { + "description": "start_seconds as a clock (4:33).", + "type": [ + "string", + "null" + ] + }, + "title": { + "description": "What it explains, in a few words (written with the help of an AI model and checked against the lecture).", + "type": [ + "string", + "null" + ] + }, + "topics": { + "description": "The topics explained there, most mentioned first.", + "items": { + "type": [ + "string", + "null" + ] + }, + "type": "array" + } + }, + "required": [ + "start_seconds", + "end_seconds", + "time", + "title", + "summary", + "questions", + "topics", + "excerpt", + "play_url", + "thumbnail_url", + "credit" + ], + "type": "object" + }, + "type": "array" + }, + "related_topics": { + "description": "Topics related to it.", + "items": { + "properties": { + "name": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "terms": { + "description": "The terms of use.", + "type": [ + "string", + "null" + ] + }, + "topic": { + "properties": { + "name": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "name", + "url" + ], + "type": "object" + } + }, + "required": [ + "attribution", + "terms", + "topic", + "levels", + "more" + ], + "type": "object" +}
- Changed
list_subjects1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "attribution": { + "description": "How to credit Bettyapp and the lecture's creator. Follow it.", + "type": [ + "string", + "null" + ] + }, + "levels": { + "items": { + "properties": { + "code": { + "type": [ + "string", + "null" + ] + }, + "lectures": { + "type": [ + "integer", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "slug": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "code", + "name", + "lectures" + ], + "type": "object" + }, + "type": "array" + }, + "subjects": { + "items": { + "properties": { + "courses": { + "type": [ + "integer", + "null" + ] + }, + "lectures": { + "type": [ + "integer", + "null" + ] + }, + "levels": { + "items": { + "properties": { + "code": { + "type": [ + "string", + "null" + ] + }, + "lectures": { + "type": [ + "integer", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "name", + "code", + "lectures" + ], + "type": "object" + }, + "type": "array" + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "slug": { + "type": [ + "string", + "null" + ] + }, + "url": { + "description": "The Subject's page, where it has one.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "name", + "slug", + "lectures", + "levels" + ], + "type": "object" + }, + "type": "array" + }, + "terms": { + "description": "The terms of use.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "attribution", + "terms", + "subjects", + "levels" + ], + "type": "object" +}
- Added
search - Changed
search_moments1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "attribution": { + "description": "How to credit Bettyapp and the lecture's creator. Follow it.", + "type": [ + "string", + "null" + ] + }, + "level": { + "description": "The Level searched at.", + "type": [ + "string", + "null" + ] + }, + "message": { + "description": "Said when there are no moments.", + "type": [ + "string", + "null" + ] + }, + "moments": { + "description": "The moments, best first. Empty: Bettyapp has nothing on it.", + "items": { + "description": "A moment of a lecture: where it starts and ends, what it explains, and where to play it.", + "properties": { + "also_called": { + "description": "Other names for its topic.", + "items": { + "type": [ + "string", + "null" + ] + }, + "type": "array" + }, + "credit": { + "description": "Who made the lecture and its licence. Show line wherever the moment is linked.", + "properties": { + "creator": { + "description": "Who made the lecture.", + "type": [ + "string", + "null" + ] + }, + "creator_url": { + "description": "The creator's own site.", + "type": [ + "string", + "null" + ] + }, + "licence": { + "description": "The licence, for example CC BY-NC-SA 4.0.", + "type": [ + "string", + "null" + ] + }, + "licence_url": { + "description": "The licence's text.", + "type": [ + "string", + "null" + ] + }, + "line": { + "description": "The credit line, as the lecture page shows it.", + "type": [ + "string", + "null" + ] + }, + "transcript": { + "description": "Whether the lecture page may show the whole transcript, or only short excerpts.", + "enum": [ + "full", + "short excerpts only" + ], + "type": [ + "string", + "null" + ] + }, + "watch_at_source": { + "description": "The lecture at its own source (YouTube, the publisher).", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "line", + "creator", + "licence", + "transcript" + ], + "type": [ + "object", + "null" + ] + }, + "end_seconds": { + "description": "Where its part of the lecture ends.", + "type": [ + "integer", + "null" + ] + }, + "excerpt": { + "description": "The teacher's words at its start: at most 300 characters, and as short as the lecture's licence asks (at most 40 words for lectures whose licence allows only short excerpts).", + "type": [ + "string", + "null" + ] + }, + "lecture": { + "properties": { + "course": { + "properties": { + "id": { + "type": [ + "integer", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "id": { + "description": "The lecture's id.", + "type": [ + "integer", + "null" + ] + }, + "length_seconds": { + "description": "How long it is.", + "type": [ + "integer", + "null" + ] + }, + "number": { + "description": "Its place in its course.", + "type": [ + "integer", + "null" + ] + }, + "of": { + "description": "Lectures in its course with pages.", + "type": [ + "integer", + "null" + ] + }, + "subjects": { + "description": "Its Subjects, each with its Levels.", + "items": { + "properties": { + "levels": { + "items": { + "type": [ + "string", + "null" + ] + }, + "type": "array" + }, + "subject": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "subject", + "levels" + ], + "type": "object" + }, + "type": "array" + }, + "teacher": { + "description": "The course's teacher or publisher.", + "type": [ + "string", + "null" + ] + }, + "title": { + "description": "Its title.", + "type": [ + "string", + "null" + ] + }, + "url": { + "description": "Its page on Bettyapp.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id", + "title", + "url", + "course", + "teacher", + "subjects" + ], + "type": "object" + }, + "play_url": { + "description": "The lecture page, playing from this moment. Send the student here.", + "type": [ + "string", + "null" + ] + }, + "questions": { + "description": "Questions a student might ask that it answers (as title).", + "items": { + "type": [ + "string", + "null" + ] + }, + "type": "array" + }, + "start_seconds": { + "description": "Where it starts, in seconds from the lecture's start.", + "type": [ + "integer", + "null" + ] + }, + "summary": { + "description": "One or two sentences on what it explains (as title).", + "type": [ + "string", + "null" + ] + }, + "thumbnail_url": { + "description": "A picture of the lecture at about this moment.", + "type": [ + "string", + "null" + ] + }, + "time": { + "description": "start_seconds as a clock (4:33).", + "type": [ + "string", + "null" + ] + }, + "title": { + "description": "What it explains, in a few words (written with the help of an AI model and checked against the lecture).", + "type": [ + "string", + "null" + ] + }, + "topics": { + "description": "The topics explained there, most mentioned first.", + "items": { + "type": [ + "string", + "null" + ] + }, + "type": "array" + } + }, + "required": [ + "start_seconds", + "end_seconds", + "time", + "title", + "summary", + "questions", + "topics", + "excerpt", + "play_url", + "thumbnail_url", + "credit" + ], + "type": "object" + }, + "type": "array" + }, + "query": { + "description": "The words searched for, as sent.", + "type": [ + "string", + "null" + ] + }, + "searched_for": { + "description": "The words searched for when a misspelt word was corrected.", + "type": [ + "string", + "null" + ] + }, + "subject": { + "description": "The Subject searched in.", + "type": [ + "string", + "null" + ] + }, + "terms": { + "description": "The terms of use.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "attribution", + "terms", + "query", + "moments" + ], + "type": "object" +}
4 tool updates
- First observed
get_lecture - First observed
get_topic - First observed
list_subjects - First observed
search_moments
Related MCP Connectors
Find, cite and clip moments in YouTube videos: analyses, transcripts, Q&A and 1080p clip downloads.
Extract YouTube transcripts, search what was said, and read on-screen frames with cited timestamps.
Search verified podcast moments and episode summaries with canonical Egleze links.
- CleoLMOAuthcom.cleolm
Search and cite timestamped YouTube and podcast transcripts; transcribe any video or episode.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables semantic search over transcribed C++ lecture fragments with clickable YouTube timestamps, allowing users to retrieve and cite specific moments from the videos.MIT
- AlicenseAqualityAmaintenanceSearch a YouTube video's transcript and get back only the moments that answer the question, each with a clickable timestamp deep link. Also reads the video's frames — slides, charts, demos and on-screen text — and verifies every citation against recorded evidence before returning it9MIT
- FlicenseNot gradedqualityDmaintenanceEnables users to search Samin Yasar's video library and receive full-video recommendations grounded in transcript evidence with links to exact matched caption cues.-
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to extract educational content from YouTube videos by fetching timestamped transcripts and visually meaningful frames, returning them as base64 JPEGs for analysis.-
Glama MCP Gateway
Add one secure layer between your agents and this server.