h5p-mcp
Builds content-only .h5p packages for H5P activities in Moodle, validated against their content types and ready to upload to a Moodle site; uploading itself is handled by the moodle-teacher extension.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@h5p-mcpBuild a 5-question multiple choice quiz about photosynthesis as an .h5p file"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
h5p-mcp
Your AI agent writes interactive H5P content, as a package ready to upload. Multiple choice, true/false, fill in the blanks, drag the words, cards, question sets and course presentations, built and checked on your computer.
๐ Documentation ยท ๐ Documentaciรณn en espaรฑol
h5p-mcp is an MCP server that turns content an AI agent writes (questions and their answers, cards, slides) into an .h5p package on your computer, checked against its content type before it's written, and reads one back to review or reuse it. The packages carry only their content, not H5P's code, so they're small and play on any site that has the content type, such as a Moodle with its H5P activity. It uploads nothing: in Moodle, the moodle-teacher extension does that.
โจ Why h5p-mcp
๐ฆ Packages a site takes. The format Moodle validates and deploys, tried on a real site.
โ Checked before it's written. A question without its right answer, or a blank without its word, is refused with what to fix.
๐ Read back. An existing package's content, in the same shape, to review it, change it and build it again.
๐ Reviewed before uploading. A plain preview of the questions, options and cards, without H5P's player.
๐ชถ Nothing else on your computer. One bundled file run with
npx; no H5P code to install or keep up to date.
Related MCP server: DJAI Tools MCP
๐ Quick start
With Node.js 20 or later, add it to Claude Code:
claude mcp add h5p-mcp -- npx -y @falkenslab/h5p-mcpThen ask for an activity. Other AI apps, and agents built on agent-kit, are in Getting started.
๐ฌ What you can ask
๐ฉโ๐ซ As a teacher:
"Make me a ten-question quiz on the water cycle, as an H5P package in my Downloads folder."
"Turn these vocabulary pairs into Dialog Cards, in Spanish."
"Read this .h5p and add two harder questions to it."
๐งฐ What's inside
Area | For example |
๐งฉ Content types |
|
๐ ๏ธ Tools |
|
๐ Languages | Buttons and messages in the package's language, from each type's own translations (about fifty languages) |
๐ For agents | The |
The tools reference has every tool with the description the agent reads.
๐ Documentation
Getting started: install it in your AI app.
Building packages: the content types, what is checked, languages and what isn't supported yet.
Tools: every tool, with the description the agent reads.
๐ ๏ธ Developing
The design is in .minispec/ and the main decision in ADR-005; CLAUDE.md lists every command. npm run build, npm test and npm run check before every commit. Releases are published to npm by the owner.
Made with ๐ by Falken's Lab Team
Available Tools
4 toolsbuild_h5pBuild an H5P packageA
Build a content-only .h5p package (h5p.json and content/content.json, no libraries) from content written for one of list_h5p_types' types, in the shape its fields give. The content is checked first, with the rules a site applies when it deploys the package (required fields, kinds, limits, the HTML tags each text allows) and the type's own (a multiple choice with a right answer, a blank with its answerโฆ); if anything is wrong nothing is written and the error lists what to fix. Plain text is escaped; where a field takes HTML, simple HTML with its allowed tags may be used. Buttons and messages are filled in the package's language. Writes /.h5p and, unless preview is false, .preview.html next to it: the content as a page to review before uploading. Confirm with the person before overwriting. The package plays only on a site with that type installed at that version; uploading it is another tool's job.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The file name without .h5p; by default made from the title | |
| type | Yes | The content type, such as H5P.MultiChoice (from list_h5p_types) | |
| title | Yes | The package's title, as the site will show it | |
| content | Yes | The content, in the shape list_h5p_types gives for the type | |
| destDir | Yes | An existing folder to write the package in (absolute path) | |
| preview | No | Write the HTML preview next to the package (default true) | |
| language | Yes | The content's language code, such as es or en: its buttons and messages come in it | |
| overwrite | No | Replace the package and preview if they exist; only once the person agrees |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | The package written |
| type | Yes | |
| title | Yes | |
| preview | No | The HTML preview written next to it |
| version | Yes | The type's version the site must have |
| language | Yes | |
| warnings | Yes | What the person should know, such as texts left in English |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: it discloses that validation runs before any write, that a failed check writes nothing and returns an error listing what to fix, the exact files produced (<destDir>/<name>.h5p plus optional <name>.preview.html), escaping behavior for plain text versus allowed HTML tags, and the compatibility limit that the package only plays on a site with that type installed at that version. That is the kind of consequence-level detail the readOnlyHint/destructiveHint flags cannot convey.
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?
Front-loaded with what is built and from what, then validation, then outputs. It is a dense single block and could be split for scanability, but each sentence carries distinct information about behavior rather than restating the schema.
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 everything an agent needs for an eight-parameter, nested-content, file-writing tool: input provenance, validation outcomes, exact output locations, language handling, overwrite safety, and post-build compatibility. An output schema exists, so return values need no elaboration.
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 baseline is 3; the description adds real meaning beyond it by explaining that name defaults from title, that preview writes the HTML page unless false (matching the schema default), and that language drives the buttons and messages inside the package. It does not elaborate on overwrite's failure modes beyond the confirmation requirement.
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?
A precise verb plus resource plus scope: builds a content-only .h5p package with h5p.json and content/content.json and no libraries, sourced from list_h5p_types. It is unmistakable against read_h5p, list_h5p_types and server_info, and even names the sibling that supplies the input shape.
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 precondition (content must be written for one of list_h5p_types' types and in the shape its fields give) and a scope boundary (uploading is another tool's job; confirm with the person before overwriting). It stops short of naming a specific alternative tool for upload or preview review, so routing is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_h5p_typesList the H5P content typesARead-only
List the H5P content types this server builds packages for: each one's library and pinned version, what it's for and, for the types that hold others (Question Set, Course Presentation), the types that go inside (parts). Pass type to get its fields: the shape of the content build_h5p takes for it, with each field's kind, whether it's required, its limits, its options and the HTML tags it allows. Buttons and messages aren't listed: build_h5p fills them in the package's language. Images and other media aren't supported yet. Read the fields of each type before writing its content, and of each part you put inside another.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | A content type or part, such as H5P.MultiChoice, to get its fields; leave it out for the list |
Output Schema
| Name | Required | Description |
|---|---|---|
| types | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description is consistent with a safe read. Beyond that it discloses meaningful scope limits: buttons/messages are omitted because build_h5p localizes them, and media isn't supported yet. It does not discuss caching or response size, which is a minor gap given an output schema exists.
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?
Front-loaded with the list purpose, then the detail mode, then exclusions and the workflow rule โ good ordering with no filler sentences. The middle sentence is long and packs several concepts together, which costs a little readability.
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 both invocation modes, the return contents of each, the types that contain parts, exclusions, and the ordering relationship with build_h5p. With an output schema also present, nothing needed to select or 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% and the single parameter is documented there, but the description adds real meaning: 'type' returns the field shape build_h5p expects for that type, including kind, required, limits, options and allowed HTML tags. This tells the agent what the parameter actually unlocks rather than just restating its type.
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 ('List the H5P content types this server builds packages for') and immediately clarifies the second mode when 'type' is passed. An agent can distinguish this from build_h5p/read_h5p without opening any 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 says when to pass 'type' vs omit it, and gives the workflow rule: 'Read the fields of each type before writing its content, and of each part you put inside another.' It also names exclusions (buttons/messages, media) so the agent knows what it won't find.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_h5pRead an H5P packageARead-only
Read what a local .h5p package holds: its type and version, title, language and its content, in the same shape build_h5p takes, so it can be reviewed, or changed and built again with build_h5p. Packages that bring their libraries are read too (their content only; libraries lists them). supported says whether build_h5p builds this type at this version. Only reads.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | The .h5p file (absolute path) |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| type | Yes | The main library, such as H5P.MultiChoice |
| media | No | Files under content/ besides content.json |
| title | Yes | |
| content | Yes | |
| version | No | |
| language | Yes | |
| libraries | No | Libraries the package brings with it |
| supported | Yes | build_h5p builds this type at this version |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the closing 'Only reads' largely restates that. The description earns credit elsewhere: it discloses that bundled-library packages are read for content only while 'libraries' merely lists them, and that 'supported' reports whether build_h5p can build that type at that version โ behavior no annotation or schema conveys.
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 purpose is front-loaded in the first sentence, and near every clause carries information (round-trip shape, libraries handling, supported flag). The middle sentences are run-on with only light connective punctuation, which slows parsing slightly but wastes no words.
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?
For a one-parameter read tool with an output schema, the description goes beyond necessity: it explains the round-trip contract with build_h5p, the meaning of 'supported', and how libraries are handled. An agent has everything needed to call it and interpret the result.
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 parameter is documented as 'The .h5p file (absolute path)'. The description adds the context that the path must be a local package, but supplies no format details beyond that. Baseline 3 is appropriate when the schema does the work.
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 ('Read what a local .h5p package holds') and enumerates the returned facets: type, version, title, language, content. It explicitly positions itself opposite build_h5p ('the same shape build_h5p takes') and against list_h5p_types, so an agent can pick correctly 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?
Gives concrete usage contexts: reviewing a package, or changing it and rebuilding with build_h5p, which names the sibling to use for the write path. It lacks an explicit exclusion ('do not use for remote URLs' or 'not for listing available types'), so it is clear but not fully bounded.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_infoServer infoARead-only
Show this server's name, version and data folder, and, for a server that needs programs installed apart, whether they're there. Contains no secrets.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| node | Yes | |
| dataDir | Yes | Where it keeps its state and caches |
| version | Yes | |
| requirements | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds a genuinely useful disclosure โ "Contains no secrets" โ signaling the output is safe to surface, plus the conditional behavior of reporting whether separate programs are installed.
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?
A single sentence, front-loaded with the primary payload (name, version, data folder) and ending with the conditional check. The clause about separately-installed programs is slightly wordy but earns its place by describing a non-obvious behavior.
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?
For a no-param, read-only tool with an output schema documenting the return shape and annotations covering safety, the description supplies everything an agent needs: what it returns, the conditional program check, and the reassurance that no secrets are exposed.
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 no parameters, so the baseline is 4 and there is nothing for the description to disambiguate. The enumerated output fields are not parameters and belong to the output schema.
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 ("Show") and enumerates exactly what is retrieved: server name, version, data folder, plus whether separately-installed programs are present. An agent knows precisely what this tool returns without opening the 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?
There is no explicit when-to-use statement, no prerequisites, and no alternatives named (there are no siblings). For a zero-parameter informational tool the intended use is implied and obvious, so this is adequate but not enriched.
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.
4 tool updates
v0.1.0- First observed
build_h5p - First observed
list_h5p_types - First observed
read_h5p - First observed
server_info
TDQS
Scored across 4 tools
Each tool has a clearly distinct role: listing supported H5P types and their field schemas, building a package, reading an existing package, and reporting server metadata. There is no overlapping behavior that would make tool selection ambiguous.
Three core tools follow a clear verb_noun_h5p pattern (list_h5p_types, build_h5p, read_h5p), making their relationship obvious. server_info is a minor deviation, but the overall convention remains readable and predictable.
Four tools are well-scoped for a package builder: schema discovery, build, read, and server metadata. No tool feels redundant, and the surface is compact without being thin.
The core lifecycle of discovering types, building validated packages, and reading packages is covered. Upload/deployment is explicitly out of scope, but the surface otherwise lacks no obvious operation needed for content-only package work.
Maintenance
Related MCP Connectors
Create, edit, translate, and export SCORM eLearning modules from a connected AI assistant.
PDF, image, video, OCR, screenshot, SQL, QR and text tools for agents. No API key, no signup.
AI-powered LMS course builder: 89 tools, 17 skills, SCORM/xAPI export, agentic UI
Create, edit and publish Educaplay educational games and quizzes from any AI assistant.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceBuilds SCORM 2004 compliant e-learning courses locally with automated packaging and data privacy.1MIT
- AlicenseAqualityDmaintenanceProvides AI agents with local file-processing capabilities for token counting, RAG chunking, CSV/JSON conversion, QR generation, and more, while keeping documents private on the user's machine.71MIT
- AlicenseAqualityCmaintenanceEnables AI agents to generate and package SCORM 1.2 compliant interactive learning activities (matching and quiz) with a 16:9 responsive player shell, including scoring, timers, lives, and synthesized audio.3MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to read and edit Korean HWP/HWPX documents, including converting Hanyang PUA old-Hangul characters to Unicode jamo, diagnosing unsupported characters, and preserving arae-a, panch'im, yet-ieung, expanded jamo, filler and side dots. Also supports HWPX search-and-replace, template filling, paragraph/table/image/style editing, page rendering to SVG/HTML, and creating new HWPX documents.1MIT