Frappe LMS MCP Server
Integrates with Frappe LMS to allow AI agents to manage courses, chapters, lessons, quizzes, enrollments, batches, and certificates. Supports course creation, caching, and re-upload across multiple instances.
Click on "Install 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., "@Frappe LMS MCP Servercreate a new course called 'Web Development Basics'"
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.
Frappe LMS MCP Server
An MCP (Model Context Protocol) server that lets AI agents manage a Frappe LMS instance — create courses, chapters, lessons, quizzes, enrollments, batches, and certificates.
Designed for instructors and admins who want to build comprehensive course content using AI.
Features
39 MCP tools for managing Frappe LMS (courses, chapters, lessons, quizzes, enrollments, batches, certificates)
Web dashboard (FastAPI + Jinja2) on port 8080 for browser-based login and course browsing
SQLite database for connection storage, course caching, and audit logging
Dual authentication — API key/secret (token auth) or password (session auth fallback)
Course memory — auto-cache course specs on creation for cross-instance re-upload
Multi-instance — store multiple Frappe connections, switch between them
Audit trail — all operations logged to SQLite
Related MCP server: Moodle MCP Server
Architecture
┌─────────────────────────────────────┐
│ MCP Server Process (Python) │
│ │
AI Agent ────────►│ FastMCP (stdio) FastAPI (:8080) │
(ZCode, Claude, │ │ │ │
Codex, etc.) │ ▼ ▼ │
│ tools.py ◄──── Web Dashboard │
│ │ (login UI, │
│ │ course browser) │
│ ▼ │
│ client.py ◄── API Key/Secret │
│ │ (from SQLite) │
│ ▼ │
│ SQLite (frappe_lms.db) │
│ - connections: api_key, password │
│ - courses: id, title, spec_json │
│ - operations: audit log │
└───────┬─────────────────────────────┘
│
▼
Frappe LMS (localhost:8000)Project Structure
lms-mcp-tools/
├── pyproject.toml # Package config, deps, entry points
├── README.md
├── .env.example # Template credentials (safe to commit)
├── .gitignore
├── src/frappe_lms_mcp/
│ ├── __init__.py
│ ├── client.py # FrappeClient — REST API wrapper (dual auth)
│ ├── content_blocks.py # EditorJS block builders
│ ├── db.py # SQLite schema + CRUD (connections, cache, logs)
│ ├── dashboard.py # FastAPI web dashboard (login, courses, logs)
│ ├── dashboard_cli.py # Standalone dashboard entry point
│ ├── tools.py # Tool implementations (business logic)
│ ├── server.py # FastMCP server — registers 39 tools + dual-start
│ └── templates/ # Jinja2 HTML templates (8 pages)
├── skill/
│ └── SKILL.md # Skill definition for AI agents
└── examples/
└── web-development-course.json # Example course specStep-by-Step Setup
Prerequisites
Python 3.10+ (tested on 3.11)
Frappe LMS running and reachable (e.g. via Docker on
http://localhost:8000)A Frappe user with Course Creator or Moderator role
Step 1 — Clone & Install
git clone https://github.com/anggun-indra/frape-lms-mcp-tools.git
cd frape-lms-mcp-tools
# Create virtual environment
python3 -m venv .venv
source .venv/bin/activate
# Install the package (editable mode)
pip install -e .Step 2 — Start Frappe LMS
Make sure your Frappe LMS instance is running. If using Docker:
cd path/to/your/frappe-docker
docker compose up -d
# Wait for Frappe to be ready
curl http://localhost:8000 # should return HTTP 200Step 3 — Configure Credentials
Choose one method:
Method A — .env file (simplest)
cp .env.example .env
# Edit .env with your real credentials.env contents:
FRAPPE_URL=http://localhost:8000
FRAPPE_SITE=lms.localhost
FRAPPE_USERNAME=your_email@example.com
FRAPPE_PASSWORD=your_password⚠️
.envis gitignored — it will never be committed.
Method B — Web Dashboard (recommended — no password in config)
Start the dashboard:
source .venv/bin/activate frappe-lms-dashboardOpen
http://localhost:8080/loginin your browserFill in: Name (e.g. "Local LMS"), Frappe URL, Site, Username, Password
Click "Connect" — the dashboard logs in to Frappe, generates API keys if possible, and stores them in SQLite
The MCP server now uses these credentials automatically — no env vars needed
Method C — Shell environment variables
# ~/.zshrc or ~/.bashrc
export FRAPPE_URL="http://localhost:8000"
export FRAPPE_SITE="lms.localhost"
export FRAPPE_USERNAME="your_email@example.com"
export FRAPPE_PASSWORD="your_password"Step 4 — Verify the Installation
source .venv/bin/activate
# Verify the MCP server starts and lists all tools
python -c "
from frappe_lms_mcp.server import mcp
import asyncio
tools = asyncio.run(mcp.list_tools())
print(f'{len(tools)} tools registered')
"You should see: 39 tools registered
Step 5 — Register with Your AI Agent
The MCP server communicates over stdio (standard MCP transport). Every MCP-compatible agent can use it — the only difference is the config file location and key name.
ZCode
Config file: .zcode/config.json (workspace scope) or ~/.zcode/config.json (user scope)
{
"mcp": {
"servers": {
"frappe-lms": {
"command": "/absolute/path/to/frape-lms-mcp-tools/.venv/bin/frappe-lms-mcp",
"env": {
"FRAPPE_URL": "http://localhost:8000",
"FRAPPE_SITE": "lms.localhost",
"FRAPPE_USERNAME": "your_email@example.com",
"FRAPPE_PASSWORD": "your_password"
}
}
}
}
}If you configured credentials via the dashboard (Method B), you can omit the
envblock entirely — the server reads from SQLite.
Claude Desktop
Config file: ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
{
"mcpServers": {
"frappe-lms": {
"command": "/absolute/path/to/frape-lms-mcp-tools/.venv/bin/frappe-lms-mcp",
"env": {
"FRAPPE_URL": "http://localhost:8000",
"FRAPPE_SITE": "lms.localhost",
"FRAPPE_USERNAME": "your_email@example.com",
"FRAPPE_PASSWORD": "your_password"
}
}
}
}After saving, restart Claude Desktop. The tools will appear as mcp__frappe-lms__<tool_name>.
OpenAI Codex (GPT Codex)
Config file: ~/.codex/config.toml or project-level codex.toml
[mcp_servers.frappe_lms]
command = "/absolute/path/to/frape-lms-mcp-tools/.venv/bin/frappe-lms-mcp"
env = { FRAPPE_URL = "http://localhost:8000", FRAPPE_SITE = "lms.localhost", FRAPPE_USERNAME = "your_email@example.com", FRAPPE_PASSWORD = "your_password" }Or if using Codex CLI with JSON config (~/.codex/config.json):
{
"mcpServers": {
"frappe_lms": {
"command": "/absolute/path/to/frape-lms-mcp-tools/.venv/bin/frappe-lms-mcp",
"env": {
"FRAPPE_URL": "http://localhost:8000",
"FRAPPE_SITE": "lms.localhost",
"FRAPPE_USERNAME": "your_email@example.com",
"FRAPPE_PASSWORD": "your_password"
}
}
}
}Claude Code (CLI)
Config file: ~/.claude/claude_config.json or .claude/config.json (project scope)
{
"mcpServers": {
"frappe-lms": {
"command": "/absolute/path/to/frape-lms-mcp-tools/.venv/bin/frappe-lms-mcp",
"env": {
"FRAPPE_URL": "http://localhost:8000",
"FRAPPE_SITE": "lms.localhost",
"FRAPPE_USERNAME": "your_email@example.com",
"FRAPPE_PASSWORD": "your_password"
}
}
}
}Generic MCP Client (any MCP-compatible tool)
The server uses the standard MCP stdio transport. Any tool that supports MCP can connect. The minimal config is:
Command: /absolute/path/to/frape-lms-mcp-tools/.venv/bin/frappe-lms-mcp
Transport: stdio
Environment variables (optional if using dashboard auth):
FRAPPE_URL=http://localhost:8000
FRAPPE_SITE=lms.localhost
FRAPPE_USERNAME=your_email@example.com
FRAPPE_PASSWORD=your_password💡 Tip: Replace
/absolute/path/to/with the actual path on your machine. Usewhich frappe-lms-mcp(inside the venv) to find it.
Step 6 — Use It!
Once registered, ask your AI agent to manage courses. Examples:
"Create a Python programming course with 3 chapters: Basics, Data Structures, and OOP. Each chapter should have 2 lessons with content and a quiz."
The agent will use create_full_course with a generated JSON spec. The course is automatically cached to SQLite for future re-upload.
"List all cached courses and re-upload course ID 1 to the active connection"
The agent uses list_cached_courses and reupload_course — no need to re-specify course details.
See examples/web-development-course.json for a complete course spec example.
Running the Dashboard
The dashboard runs automatically alongside the MCP server (in a background thread on port 8080). To run it standalone:
source .venv/bin/activate
frappe-lms-dashboardOpen http://localhost:8080 in your browser.
Page | URL | Purpose |
Dashboard |
| Overview: active connection, recent courses |
Login |
| Add a new Frappe connection |
Connections |
| Manage multiple Frappe instances |
Courses |
| Browse cached courses |
Import |
| Import course from Frappe to cache |
Logs |
| Audit trail of all operations |
To disable the dashboard (MCP-only mode):
export FRAPPE_LMS_NO_DASHBOARD=1To change the dashboard port:
export FRAPPE_LMS_DASHBOARD_PORT=9090Authentication
The server supports two authentication methods, tried in this order:
1. Token Auth (API Key/Secret) — preferred
No login needed — each request sends
Authorization: token <key>:<secret>headerGenerated via the dashboard login flow (requires System Manager role)
Stored in SQLite
2. Session Auth (Password) — fallback
Used when the user doesn't have System Manager role (can't generate API keys)
The server logs in with username/password and maintains a session cookie
Password stored in SQLite (encrypted at rest by Frappe, but stored plaintext locally)
Auth Priority in get_client():
Active SQLite connection with API key/secret → token auth
Active SQLite connection with password → session auth (auto-login)
Environment variables (
FRAPPE_USERNAME/FRAPPE_PASSWORD) → session authError if no credentials found
Available Tools (39)
Courses
Tool | Description |
| List courses (optionally published only) |
| Get course details + chapter/lesson outline |
| Create a new course |
| Update course fields |
| Delete a course and all dependencies |
| Toggle published status |
Chapters
Tool | Description |
| Create a chapter in a course |
| Get chapter with its lessons |
| Rename a chapter |
| Delete chapter + lessons |
| Move chapter to new position |
Lessons
Tool | Description |
| Create a lesson with content |
| Get lesson content and metadata |
| Update lesson fields |
| Delete a lesson |
| Move/reorder lesson between chapters |
| Build EditorJS JSON from a spec |
| Append paragraph to content |
Quizzes & Questions
Tool | Description |
| Create a reusable question |
| Create a quiz with questions |
| Add question to existing quiz |
| Get quiz with question details |
| List all quizzes |
| Delete a quiz |
| Embed quiz in lesson content |
Enrollments
Tool | Description |
| Enroll a student in a course |
| List enrollments (filter by course/student) |
| Remove an enrollment |
Batches & Certificates
Tool | Description |
| Create a batch (cohort) |
| List batches |
| Issue a certificate to a member |
High-level
Tool | Description |
| Create an entire course from a JSON spec (auto-caches to SQLite) |
Connections & Cache (SQLite)
Tool | Description |
| List all saved Frappe connections (secrets masked) |
| Activate a different Frappe instance |
| List courses from SQLite cache (fast, no Frappe query) |
| Get full cached course including spec JSON |
| Re-upload a cached course spec to a Frappe instance |
| Fetch a course from Frappe and cache it to SQLite |
| View audit trail of all operations |
Lesson Content Format
Lessons use EditorJS JSON for rich content. The build_lesson_content tool accepts a spec with these optional keys:
{
"paragraphs": ["Plain text paragraphs"],
"headers": [{"text": "Section Title", "level": 2}],
"lists": [{"items": ["item 1", "item 2"], "ordered": true}],
"images": [{"url": "/files/image.png", "caption": "A diagram"}],
"code": [{"code": "print('hello')", "language": "python"}],
"embeds": [{"service": "youtube", "source": "https://youtube.com/watch?v=..."}],
"quiz_refs": ["quiz-slug-name"],
"markdown": ["## Raw markdown section"]
}Environment Variables
Variable | Default | Description |
|
| Frappe base URL |
|
| Frappe site name |
| (none) | Login username/email |
| (none) | Login password |
| (none) | API key for token auth (alternative to password) |
| (none) | API secret for token auth |
| (unset) | Set to |
|
| Port for the web dashboard |
|
| SQLite database file path |
| (random) | Secret key for dashboard session cookies |
Development
# Install in dev mode
pip install -e ".[dev]"
# Run the server directly (with dashboard)
python -m frappe_lms_mcp.server
# Run dashboard only (no MCP)
frappe-lms-dashboard
# Run tests
pytestSecurity Notes
Credentials live in
.env(gitignored) or SQLite (indata/, also gitignored) — never committed..env.example(committed) contains only placeholder values — safe to share.The MCP server inherits the permissions of the configured Frappe user. For production, create a dedicated Frappe user with only the LMS roles needed (Course Creator, Moderator) rather than using Administrator.
The SQLite database at
data/frappe_lms.dbcontains API keys and passwords — it is gitignored. If you need to share the project, delete this file first.API key generation requires the System Manager role. Users without this role fall back to session auth (password stored in SQLite).
License
MIT
Available Tools
39 toolsadd_paragraph_to_contentA
Append a paragraph to an existing EditorJS content string.
Args: existing_content: Current EditorJS JSON string (can be empty). text: Paragraph text to append.
Returns: Updated EditorJS JSON string.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| existing_content | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the burden. It indicates modification (append) and return of updated string, and mentions 'can be empty' for input. However, it lacks details on side effects, error handling, or ordering guarantees.
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 description is concise, uses a clear structure with Args and Returns sections, and every sentence adds value. No unnecessary text.
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?
Given the existence of an output schema (not shown), the return description is sufficient. However, the description could be more complete by explaining that the paragraph is appended as a new block, or addressing edge cases like invalid input.
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?
With 0% schema coverage, the description compensates by explaining both parameters: existing_content is 'current EditorJS JSON string (can be empty)' and text is 'paragraph text to append'. This adds meaning beyond names but lacks details like format constraints or allowed character limits.
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 clearly states the action ('Append a paragraph') and the resource ('existing EditorJS content string'). It distinguishes itself from sibling tools that handle broader operations like creating lessons or building full content.
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?
The description implies when to use (when wanting to add a paragraph to EditorJS content) but provides no explicit guidelines on when not to use or alternatives. No mention of prerequisites or context relative to siblings like build_lesson_content.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_question_to_quizB
Add an existing question to a quiz.
Args: quiz: The quiz name (slug). question: The LMS Question name. marks: Marks for this question.
| Name | Required | Description | Default |
|---|---|---|---|
| quiz | Yes | ||
| marks | No | ||
| question | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must bear the full burden. It states 'Add an existing question' implying mutation, but does not disclose effects like duplication handling, permissions required, or impact on quiz total marks. The description lacks sufficient behavioral detail.
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 description is very concise, with a clear one-line summary followed by structured parameter descriptions. No extraneous information, every sentence serves a purpose.
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?
Important missing context: what happens if the question is already in the quiz (duplicate/ignore/overwrite)? Does adding a question adjust the quiz's total marks? Despite an output schema existing, the description lacks edge-case behavior and side effects.
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 Args section adds meaning beyond the input schema by explaining that 'quiz' is a slug, 'question' is the LMS question name, and 'marks' has a default of 1. This compensates for the 0% schema description coverage. However, the format for 'question' (e.g., name vs ID) is not specified.
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 clearly states the action 'Add an existing question to a quiz', using a specific verb and resource. This distinguishes it from sibling tools like create_question (which creates a new question) and other quiz operations.
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?
No guidance on when to use this tool versus alternatives, such as when to add an existing question vs creating a new one. No prerequisites or context for using the tool are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_lesson_contentA
Build an EditorJS JSON content string for a lesson from a spec.
Args: content_spec: JSON string with optional keys: paragraphs, headers, lists, images, code, embeds, quiz_refs, markdown. Example: '{"paragraphs":["Hello world"],"headers":[{"text":"Intro","level":2}]}'
Returns: EditorJS JSON string ready for the content field of a Course Lesson.
| Name | Required | Description | Default |
|---|---|---|---|
| content_spec | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must cover behavioral traits. It explains the return type (EditorJS JSON string) and that it builds from a spec, but does not mention validation, side effects, or error handling. Still, it provides adequate transparency for a builder tool.
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?
Description is concise with a clear purpose statement followed by an Args and Returns section. Every sentence adds value, no repetition or fluff.
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 tool with one parameter and an output schema, the description is mostly complete. It covers input format, output format, and example. Could mention potential limitations or error cases, but overall adequate.
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 0%, but description fully compensates by detailing the content_spec parameter as a JSON string with optional keys (paragraphs, headers, etc.) and providing an example. This adds significant meaning beyond the schema's type-only definition.
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?
Description clearly states the tool builds an EditorJS JSON content string from a spec, specifying the resource (lesson content) and action (build). It distinguishes from siblings like add_paragraph_to_content, which operates at a smaller scope.
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?
The description explains what the tool does and the input format, but does not explicitly state when to use this tool vs alternatives like add_paragraph_to_content or creating a lesson. Usage context is implied but not clearly delimited.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_batchA
Create an LMS Batch (cohort).
Args: title: Batch title. start_date: Start date (YYYY-MM-DD). end_date: End date (YYYY-MM-DD). start_time: Start time (HH:MM:SS). end_time: End time (HH:MM:SS). timezone: Timezone, e.g. "Asia/Jakarta". description: Short description. batch_details: Full HTML details. instructor: Instructor User email/ID. courses: JSON list of course names to include, e.g. '["course-1","course-2"]'. published: Whether the batch is published. allow_self_enrollment: Allow students to self-enroll. seat_count: Number of seats (0 = unlimited). medium: "Online" or "Offline". paid_batch: Whether this is a paid batch. amount: Price amount (required if paid_batch). currency: Currency code (required if paid_batch). category: Category name.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| amount | No | ||
| medium | No | Online | |
| courses | No | ||
| category | No | ||
| currency | No | ||
| end_date | Yes | ||
| end_time | Yes | ||
| timezone | Yes | ||
| published | No | ||
| instructor | Yes | ||
| paid_batch | No | ||
| seat_count | No | ||
| start_date | Yes | ||
| start_time | Yes | ||
| description | Yes | ||
| batch_details | Yes | ||
| allow_self_enrollment | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose side effects and authorization needs. It only lists parameters without mentioning consequences like data persistence, cancellation policies, or access requirements. This is insufficient for a creation operation.
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 first line provides a clear summary, followed by a structured parameter list. Although lengthy due to 18 parameters, each line is concise and useful. No redundancy or filler.
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?
Given the large number of parameters and the presence of an output schema (as per context), the parameter descriptions are complete. However, missing usage guidelines and behavioral details reduce overall completeness. It's adequate but could be better.
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 description thoroughly explains every parameter with formats, defaults, and conditional requirements (e.g., 'required if paid_batch' for amount and currency). Since the input schema has 0% description coverage, this fully compensates, making parameter semantics very clear.
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 clearly states the verb 'create' and the resource 'LMS Batch (cohort)', making the purpose immediately understandable. It distinguishes from sibling tools like list_batches by specifying it's for creation.
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?
No guidance is provided on when to use this tool versus alternatives, or any prerequisites. The description lacks explicit 'when to use' or 'when not to use' context, leaving the agent to infer usage solely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_chapterA
Create a chapter in a course.
Args: course: The course name (slug). title: Chapter title.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| course | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, and the description lacks behavioral details such as whether duplicate titles are allowed, what happens if the course slug does not exist, or any side effects beyond creation.
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 description is extremely concise with no wasted words. It follows a clear 'Args' structure that is easy to parse.
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?
Given the tool's simplicity and the existence of an output schema, the description covers the essentials. However, it lacks information about error handling or idempotency, which would be helpful.
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 description adds meaning by noting that 'course' is a slug, which is not evident from the schema alone. With 0% schema coverage, this clarification is valuable, though constraints like uniqueness or length are missing.
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 clearly states 'Create a chapter in a course,' using a specific verb and resource. It distinguishes this tool from sibling tools like get_chapter, update_chapter, and delete_chapter.
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?
No guidance is provided on when to use this tool versus alternatives such as create_lesson or create_course. There are no exclusions or context about prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_courseB
Create a new LMS Course. A URL slug is auto-generated from the title.
Args: title: Course title (required). short_introduction: One-line summary shown on course cards (required). description: Full HTML description. instructor: Email/User ID of the instructor. tags: Comma-separated tags, e.g. "Python, Web, Beginner". category: Category name (must exist in LMS Category doctype). image: Path to preview image. video_link: YouTube video ID or embed URL. published: Publish immediately. featured: Mark as featured. upcoming: Mark as upcoming. card_gradient: Card colour (Red/Blue/Green/Amber/Cyan/Orange/Pink/Purple/Teal/Violet/Yellow/Gray). disable_self_learning: Students can only learn via batches. paid_course: Whether this is a paid course. course_price: Price (required if paid_course). currency: Currency code (required if paid_course), e.g. "USD" or "IDR". enable_certification: Enable completion certificate. paid_certificate: Certificate requires payment.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| image | No | ||
| title | Yes | ||
| category | No | ||
| currency | No | ||
| featured | No | ||
| upcoming | No | ||
| published | No | ||
| instructor | No | ||
| video_link | No | ||
| description | No | ||
| paid_course | No | ||
| course_price | No | ||
| card_gradient | No | ||
| paid_certificate | No | ||
| short_introduction | Yes | ||
| enable_certification | No | ||
| disable_self_learning | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It mentions auto-generated slug and conditional requirements (e.g., course_price required if paid_course). However, it does not cover other behavioral aspects like uniqueness of title, idempotency, or error handling.
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 description is front-loaded with the purpose, then lists all 18 parameters in a structured Args block. While comprehensive, it is somewhat verbose for the number of parameters; every sentence is earned but could be more concise.
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?
Given the tool's complexity (18 parameters, no annotations) and the existence of an output schema, the description covers parameter semantics thoroughly and mentions auto-generated slug and conditional requirements. It does not explain return values, but that is covered by the output schema.
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 description coverage is 0%, so the description adds significant value by explaining each parameter's meaning, including conditional requirements. For example, 'short_introduction: One-line summary shown on course cards' and 'paid_course: Whether this is a paid course' provide context beyond the 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?
The description clearly states 'Create a new LMS Course', which specifies the verb and resource. It also adds that a URL slug is auto-generated. However, it does not distinguish itself from siblings like 'create_full_course', which might create a more comprehensive course.
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?
No guidance is provided on when to use this tool versus alternatives such as 'create_full_course' or 'reupload_course'. There is no context about prerequisites or situations where this tool is preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_full_courseA
Create a complete course with chapters, lessons, and quizzes from a single JSON spec.
This is the primary tool for building comprehensive courses in one call.
Args: spec: JSON string with the full course definition. Structure: { "title": "...", "short_introduction": "...", "description": "...", "instructor": "email", "tags": "a,b", "category": "...", "published": false, "chapters": [ { "title": "Chapter 1", "lessons": [ { "title": "Lesson 1", "content": { "paragraphs": ["text..."], "headers": [{"text": "Section", "level": 2}], "lists": [{"items": ["a","b"], "ordered": false}], "code": [{"code": "print(1)", "language": "python"}], "embeds": [{"service": "youtube", "source": "url"}] } }, { "title": "Quiz Lesson", "content": {"paragraphs": ["Test your knowledge"]}, "quiz": { "title": "Quiz 1", "passing_percentage": 70, "questions": [ {"question": "text", "type": "Choices", "options": [{"text":"Yes","correct":false},{"text":"No","correct":true}]} ] } } ] } ] }
Returns: JSON with course name, chapter names, lesson names, and quiz names.
| Name | Required | Description | Default |
|---|---|---|---|
| spec | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It details the creation process and the spec structure, and mentions the return format. It lacks information on side effects like publishing, permissions, or error handling, but overall provides substantial behavioral context.
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 description is well-structured with a summary, usage note, and detailed argument description. It is slightly long but every part adds value. Could be tightened slightly, but overall concise for the complexity.
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?
Given the tool's complexity, the description covers the spec structure, return value, and usage context. It could mention prerequisites or error scenarios, but it is largely complete considering the output schema exists.
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 0%, but the description fully compensates with a detailed breakdown of the spec JSON structure, including nested objects for chapters, lessons, quizzes, and content. This provides far more meaning than the simple 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?
The description clearly states 'Create a complete course with chapters, lessons, and quizzes from a single JSON spec.' It uses a specific verb and resource, and distinguishes itself from simpler creation tools like create_course and individual component creators.
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 says 'This is the primary tool for building comprehensive courses in one call,' implying when to use it. However, it does not explicitly mention when not to use it or alternatives like create_chapter for individual components, though siblings are listed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_lessonA
Create a lesson in a chapter.
Args: chapter: The chapter name. title: Lesson title. content: EditorJS JSON string for the lesson body. Use build_lesson_content to construct it.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| chapter | Yes | ||
| content | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not disclose behavioral traits such as side effects, permissions required, or idempotency. It only states the creation action.
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 description is very concise: a one-line purpose followed by a clean three-item list. No unnecessary words; 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?
Given the presence of an output schema and only 3 parameters, the description covers inputs adequately. It references a sibling tool for content construction. Lacks behavioral details but is otherwise complete.
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?
Despite 0% schema description coverage, the description explains each parameter (chapter, title, content) and adds context for content (EditorJS JSON, use build_lesson_content). This adds significant value beyond the 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?
The description clearly states the action (create), resource (lesson), and context (in a chapter). It distinguishes from sibling tools like create_chapter.
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?
The description hints at using build_lesson_content for the content parameter but does not provide explicit guidance on when to use this tool vs alternatives like update_lesson or delete_lesson.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_questionA
Create a reusable LMS Question.
Args: question: The question text (HTML allowed). question_type: "Choices", "User Input", or "Open Ended". options: JSON list for Choices type: [{"text":"Yes","correct":false,"explanation":"..."},...]. possibilities: JSON list of strings for User Input type: ["answer1","answer2"].
| Name | Required | Description | Default |
|---|---|---|---|
| options | No | ||
| question | Yes | ||
| possibilities | No | ||
| question_type | No | Choices |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description must disclose behavior. It explains parameters but does not mention side effects (e.g., whether creation is idempotent), what the return value is, or any permissions needed. The focus is on parameter format, not operational 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?
The description is moderately sized with clear bullet-like lines for each parameter. Every sentence adds value, though it could be slightly more compact. The structure is easy to parse.
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?
Given the complexity (JSON parameters, multiple types), the description covers parameter formats well. However, it lacks details on return values (output schema exists but not described), constraints on question text, or error handling. Some gaps remain.
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 description coverage is 0%, so the description is the sole source for parameter meanings. It explains each parameter clearly, including formats for options (JSON list with objects) and possibilities (JSON list of strings), and lists values for question_type. This adds significant value beyond the bare 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?
The description clearly states 'Create a reusable LMS Question,' specifying the verb 'create' and the resource. It distinguishes from sibling tools like create_quiz (creates a quiz) and add_question_to_quiz (adds existing question to quiz), making the tool's role clear.
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?
The description provides no guidance on when to use this tool versus alternatives (e.g., add_question_to_quiz) or what steps to follow after creation. No mention of prerequisites or context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_quizA
Create an LMS Quiz with optional questions.
Args: title: Quiz title (slug auto-generated). passing_percentage: Minimum percentage to pass (0-100). questions: JSON list of [{"question":"","marks":5}]. max_attempts: Max attempts (0 = unlimited). show_answers: Show correct answers after submission. duration: Time limit in minutes (as string). shuffle_questions: Randomise question order. enable_negative_marking: Deduct marks for wrong answers. marks_to_cut: Marks to deduct per wrong answer.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| duration | No | ||
| questions | No | ||
| marks_to_cut | No | ||
| max_attempts | No | ||
| show_answers | No | ||
| shuffle_questions | No | ||
| passing_percentage | No | ||
| enable_negative_marking | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It effectively explains that a quiz is created, slug is auto-generated, and parameters control behavior (e.g., passing_percentage, max_attempts). However, it does not mention side effects like immediate persistence or if any notification is sent.
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 description is concise: a one-line summary followed by a clear bullet list of parameters. Every sentence adds value, and there is no redundant text.
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?
Given 9 parameters, 1 required, and the existence of an output schema, the description covers all parameters adequately. It does not discuss return values, but the output schema likely covers that. It could mention prerequisites or system interactions for full completeness.
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 0%, so the description compensates well. Each parameter has a brief but meaningful explanation (e.g., 'slug auto-generated' for title, 'JSON list of...' for questions). Some details could be sharper (e.g., 'duration' format as string), but overall it clarifies usage.
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 clearly states 'Create an LMS Quiz with optional questions.' It identifies the verb (create) and resource (quiz). While it distinguishes from sibling quiz tools like 'get_quiz' or 'add_question_to_quiz', it does not explicitly differentiate from potential alternative creation methods.
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?
The description implies usage for creating a quiz with optional questions, but lacks explicit guidance on when to use this tool versus alternatives (e.g., adding questions later via 'add_question_to_quiz'). No when-not-to or prerequisite context is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_chapterB
Delete a chapter and all its lessons.
Args: chapter: The chapter name.
| Name | Required | Description | Default |
|---|---|---|---|
| chapter | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the cascading deletion ('and all its lessons'), which is a key behavioral trait. However, it fails to mention permanence, reversibility, or any side effects on related entities.
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 description is very short and front-loaded, efficiently conveying the primary action. The 'Args' formatting adds a bit of structure, but it's acceptable. No wasted 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?
Given the presence of an output schema, the description does not need to explain return values. However, it omits important context like error handling, permanent deletion, and potential impact on other tools (e.g., enrollments or quizzes referencing lessons). It is minimally complete for a simple delete action but lacks depth.
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 description adds minimal meaning over the schema: it repeats that 'chapter' is a string labeled 'The chapter name.' With 0% schema description coverage, the description should provide more context, such as format, constraints, or example values.
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 clearly states the action ('Delete a chapter and all its lessons') with a specific verb and resource. It distinguishes itself from sibling tools like 'create_chapter' and 'get_chapter' by focusing on deletion and cascading effect.
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?
No guidance on when to use this tool versus alternatives, such as prerequisites, permissions, or consequences. The description does not provide any context for appropriate usage or warnings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_courseA
Delete a course and all its chapters, lessons, and enrollments.
Args: course: The course name (slug).
| Name | Required | Description | Default |
|---|---|---|---|
| course | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses cascading deletion, which is critical. However, it lacks details on permission requirements, irreversibility, or error cases. Does not contradict annotations (none provided).
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 description is two sentences: first states the action and scope, second describes the parameter. It is front-loaded and concise without waste.
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?
While the description covers the core action and cascading, it omits return value (output schema exists but not described) and does not warn against alternatives. Given the complexity, more detail on return and when to use granular deletion would help.
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 description coverage is 0%, so the description must compensate. It explains that 'course' is a slug, adding meaning beyond the schema's 'string' type. But it does not specify format or constraints beyond that.
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 'Delete a course and all its chapters, lessons, and enrollments.' It uses a specific verb (Delete) and resource (course) and distinguishes from sibling tools like create_course, update_course, and publish_course.
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?
The description implies usage through the name and cascading effect, but does not explicitly state when to use this tool versus alternatives like delete_chapter or delete_lesson. No guidance on prerequisites or when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_lessonC
Delete a lesson and remove it from the chapter.
Args: lesson: The lesson name. chapter: The chapter name.
| Name | Required | Description | Default |
|---|---|---|---|
| lesson | Yes | ||
| chapter | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must disclose behavior. It states deletion and removal from chapter but does not discuss irreversibility, effects on related content (e.g., quizzes, paragraphs), or required permissions.
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 description is concise but lacks structure. It front-loads the main action and then lists parameters, but it omits important details that could be added without significant verbosity.
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?
Given the presence of an output schema and many sibling tools, the description fails to explain return values, error conditions, or side effects. It is insufficient for safe and effective usage.
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 0% (no descriptions in schema). The description adds that 'lesson' and 'chapter' are names, which provides minimal extra meaning beyond the schema's type definitions.
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 clearly states the action (delete) and the resource (lesson), specifying that it removes the lesson from the chapter. It effectively distinguishes itself from sibling tools like create_lesson, update_lesson, and move_lesson.
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?
No guidance is provided on when to use this tool versus alternatives such as delete_chapter or other mutation tools. There are no preconditions or exclusions mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_quizB
Delete a quiz.
Args: quiz: The quiz name (slug).
| Name | Required | Description | Default |
|---|---|---|---|
| quiz | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It only states 'Delete a quiz' without disclosing whether the deletion is permanent, what side effects occur (e.g., removing questions, embedding), or any required permissions. This is insufficient for a destructive operation.
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 description is extremely concise with two sentences, the first stating the purpose and the second defining the parameter. No redundancy or unnecessary information.
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?
Given the tool's destructive nature and the presence of an output schema, the description lacks important context such as irreversibility, effects on related data (e.g., quiz questions, lesson embeddings), and return value. An output schema exists but is not referenced, reducing completeness.
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 0%, and the description adds a single line: 'quiz: The quiz name (slug).' While this clarifies the parameter as a slug, it does not explain how to obtain the slug or any constraints. Adequate but minimal value added.
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 'Delete a quiz,' which is a specific verb and resource. It clearly distinguishes from sibling tools like delete_chapter or delete_lesson, as it is the only delete tool for quizzes.
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?
No guidance is provided on when to use this tool versus alternatives, such as when to use delete_quiz versus simply unenrolling or archiving. There is no mention of prerequisites or situations to avoid deletion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
embed_quiz_in_lessonB
Embed a quiz into a lesson's content as an EditorJS quiz block.
Args: lesson: The lesson name. quiz: The quiz name (slug).
| Name | Required | Description | Default |
|---|---|---|---|
| quiz | Yes | ||
| lesson | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not disclose behavioral traits such as whether the tool is idempotent, what happens if the quiz is already embedded, or any side effects on the lesson content. The agent is left to infer 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?
The description is short and to the point, with the main action front-loaded. The parameter section is clearly separated. While concise, it could be slightly more structured by grouping related info.
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 description explains the core action but lacks details on error conditions, the effect on existing content, or the return value (though an output schema may exist). It is minimally complete for a simple embedding operation but leaves gaps for an agent.
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 description provides brief parameter explanations ('lesson: The lesson name', 'quiz: The quiz name (slug)'), clarifying that 'quiz' expects a slug. However, no details on valid formats or how to obtain these values, meaning the description adds some value over the schema but not enough to fully compensate for the 0% schema coverage.
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 clearly states the action ('Embed a quiz'), the target resource ('into a lesson's content'), and the format ('as an EditorJS quiz block'). This distinguishes it from other quiz-related tools like create_quiz or get_quiz.
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?
No guidance is provided on when to use this tool versus alternatives, prerequisites (e.g., lesson and quiz must exist), or when not to use it. The description simply states the action without context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
enroll_studentA
Enroll a student in a course.
Args: course: The course name (slug). student: The User email/ID of the student. member_type: "Student", "Mentor", or "Staff".
| Name | Required | Description | Default |
|---|---|---|---|
| course | Yes | ||
| student | Yes | ||
| member_type | No | Student |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations present. Description does not disclose side effects, authorization needs, duplicate enrollment handling, or any behavioral traits beyond the basic action.
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?
Extremely concise and well-structured with a clear verb and Args list. Every sentence adds value; no waste.
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?
No annotations and an output schema exists, but description does not cover return value, error cases, or edge conditions like duplicate enrollment or full course. Adequate but not thorough.
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?
Description adds meaning by explaining each parameter beyond the schema titles: 'course name (slug)', 'User email/ID', and member_type options. A default is noted, but schema already has it.
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 clearly states 'Enroll a student in a course.' using a specific verb and resource. It distinguishes from sibling tools like list_enrollments and unenroll_student.
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?
No guidance on when to use this tool vs alternatives, prerequisites, or conditions for enrollment (e.g., course existence, student eligibility).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cached_courseA
Get full details of a cached course, including its JSON spec. The spec_json field contains the full create_full_course spec that can be re-uploaded to any Frappe instance. Args: course_id: The cache ID (from list_cached_courses).
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that the output contains a 'spec_json' field with the full create_full_course spec reusable for re-upload, indicating the result is a read operation with actionable data. No annotations provided, but description covers key behavioral aspect.
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: first states purpose, second adds output detail, third clarifies parameter. No extraneous words, front-loaded with essential info.
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 simple retrieval tool with one parameter and an output schema, the description covers the tool's purpose, key output field, and parameter source. Sufficient for correct invocation.
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?
With 0% schema description coverage, the description fully defines the parameter 'course_id' as 'The cache ID (from list_cached_courses)', adding source and purpose beyond the schema type integer.
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?
Clearly states 'Get full details of a cached course, including its JSON spec', with a specific verb and resource. Distinguishes from sibling 'list_cached_courses' which lists but doesn't provide details.
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 'course_id: The cache ID (from list_cached_courses)', guiding the agent to use the output of the sibling tool. No explicit when-not-to-use, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_chapterB
Get a chapter with its lessons.
Args: chapter: The chapter name.
| Name | Required | Description | Default |
|---|---|---|---|
| chapter | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not disclose behavioral traits beyond the basic operation. For a read-only tool, there is no mention of safety, idempotency, or error behavior. The output schema exists but the description adds no behavioral context.
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 description is extremely concise with two short sentences, no redundant information, and front-loaded with the core purpose.
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?
While the tool is simple with one parameter and has an output schema, the description lacks critical context such as return format details, pagination if any, or behavioral notes. Without annotations, it feels incomplete for an AI agent to use confidently.
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 0%, so the description carries the burden. It only states 'chapter: The chapter name,' which adds minimal meaning over the schema's title 'Chapter.' There is no detail about format, examples, or constraints.
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 clearly states the tool retrieves a chapter along with its lessons, using a specific verb and resource. This distinguishes it from sibling tools like create_chapter, update_chapter, or get_course.
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?
No guidance is provided on when to use this tool versus alternatives such as list_cached_courses or get_course. The description lacks context about prerequisites or situational recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_courseA
Get full details of a course including its chapter/lesson outline.
Args: course: The course name (slug) or title.
| Name | Required | Description | Default |
|---|---|---|---|
| course | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided. The description only states the return content ('full details' and outline) but does not disclose any behavioral traits such as side effects, authorization requirements, or rate limits.
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 description is extremely concise, consisting of two sentences and an args doc, with the primary purpose stated upfront and no unnecessary information.
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 simple retrieval tool with one parameter and an output schema (implied), the description adequately explains what is returned. However, it omits error conditions and potential limitations.
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?
Despite 0% schema description coverage, the description adds value by clarifying that 'course' can be a slug or title, which goes beyond the schema's simple type definition.
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 clearly states the verb 'Get' and the resource 'full details of a course including its chapter/lesson outline', distinguishing it from sibling tools like list_cached_courses (listing) and get_cached_course (cached version).
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?
No guidance provided on when to use this tool versus alternatives like get_cached_course, or any preconditions or context for invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_lessonC
Get a lesson with its content and metadata.
Args: lesson: The lesson name.
| Name | Required | Description | Default |
|---|---|---|---|
| lesson | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must fully disclose behavior. It implies read-only access but fails to mention authentication needs, rate limits, or what 'content and metadata' specifically includes. The output schema exists but is not described, leaving the agent uncertain about return structure.
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 description is short and front-loaded, but it is too brief to fully inform the agent. Every sentence is necessary but insufficient; there is no wasted text, but the lack of additional context reduces effectiveness.
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?
Given the tool has an output schema and multiple sibling tools, the description is incomplete. It does not summarize return fields, error scenarios, or prerequisites. The agent would need to rely on the output schema alone, which is not elaborated.
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 description adds minimal meaning beyond the schema: it restates 'lesson' as 'The lesson name'. Since schema description coverage is 0%, this provides some clarification but is still vague and lacks details like format, uniqueness, or expected values.
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 clearly states 'Get a lesson with its content and metadata', specifying the verb and resource. It distinguishes from sibling tools like create_lesson, update_lesson, delete_lesson, but does not differentiate from other getter tools (e.g., get_chapter, get_course).
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?
No guidance is provided on when to use this tool versus alternatives, such as when to use get_chapter or list_cached_courses. There are no prerequisites, exclusions, or hints about preferred contexts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_quizA
Get a quiz, optionally with full question details.
Args: quiz: The quiz name (slug). with_questions: If True, fetch full question text and options.
| Name | Required | Description | Default |
|---|---|---|---|
| quiz | Yes | ||
| with_questions | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It clearly indicates a read operation with optional parameter behavior, but doesn't mention error handling or caching. Still, it is sufficiently transparent for a simple retrieval tool.
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 description is very concise: two sentences plus parameter list, no wasted words, and the main purpose is 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?
Given the simple tool, the description adequately covers purpose and parameters. An output schema exists to explain return values, so no need to describe them. Could be improved by noting error cases, but overall complete.
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 0%, so the description fully explains both parameters: quiz (slug) and with_questions (boolean to include full details). This adds essential meaning beyond the schema's type and title.
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 uses a specific verb 'Get' and identifies the resource 'quiz', clearly distinguishing from sibling tools like list_quizzes (which lists all quizzes) and create/delete quizzes.
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?
The description implies usage for retrieving a specific quiz when the slug is known, but does not explicitly state when not to use it (e.g., when listing) or provide alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_course_from_frappeA
Import a course from the active Frappe connection into the local cache. Fetches the course outline and stores its metadata in SQLite for quick lookup. Args: course_slug: The Frappe course name (slug).
| Name | Required | Description | Default |
|---|---|---|---|
| course_slug | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavior. It mentions fetching from Frappe and storing in SQLite, indicating network I/O and local state mutation. However, it does not specify idempotency (e.g., overwrites or skips if cached), error handling for inactive connections, or authentication requirements.
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 description is two sentences plus an Args list, all relevant and front-loaded. Every sentence adds value, with no unnecessary words. The structure is efficient and easy to parse.
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?
Given the tool's simplicity (one parameter, basic import operation) and the existence of an output schema (not shown), the description covers the core behavior well. It lacks details on handling duplicate imports or edge cases, but this is acceptable for a straightforward 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?
The only parameter course_slug is described as 'The Frappe course name (slug).' This adds meaning beyond the schema, which only has a title and no description. Since schema coverage is 0%, the description effectively compensates by clarifying the parameter's purpose.
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 clearly specifies the action (import), source (active Frappe connection), destination (local cache), and what is fetched (course outline) and stored (metadata in SQLite). It distinguishes itself from sibling tools like list_cached_courses or create_course by focusing on importing from an external connection.
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?
The description implies usage when you want to bring a Frappe course into local cache, but does not explicitly state when to use it versus alternatives (e.g., if course already cached) or prerequisites (e.g., need an active connection). No exclusions or alternative suggestions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
issue_certificateA
Manually issue a certificate to a member for a course.
Args: course: The course name (slug). member: The User email/ID. template: The Print Format name for the certificate template. issue_date: Issue date (YYYY-MM-DD). Empty = today. expiry_date: Expiry date (YYYY-MM-DD). Empty = no expiry.
| Name | Required | Description | Default |
|---|---|---|---|
| course | Yes | ||
| member | Yes | ||
| template | Yes | ||
| issue_date | No | ||
| expiry_date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears full burden but only states the action. It does not disclose side effects (e.g., email sent, grade impact), permissions needed, or whether the operation is reversible.
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 description is concise, with a clear one-line purpose followed by a structured parameter list. No extraneous 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?
Given 5 parameters and no annotations, the description covers input semantics well. An output schema exists, so return details are not needed. Minor gap: no mention of prerequisites (e.g., enrollment status) or error conditions.
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 has no descriptions (0% coverage); the description compensates by explaining each parameter: course as slug, member as email/ID, template as print format name, and date formats with defaults. This is highly informative.
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 clearly states the action 'Manually issue a certificate to a member for a course' with a specific verb-resource combination. It distinguishes itself from sibling tools, none of which mention certificate issuance.
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?
No guidance on when to use this tool versus alternatives (e.g., might there be an automated issuance?). No exclusions or prerequisites mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_batchesC
List LMS batches.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description should disclose behavioral traits. It only says 'List LMS batches' without mentioning that it is a read operation, any side effects, rate limits, or result format.
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 description is extremely concise (two words), but this conciseness sacrifices completeness. It is front-loaded but lacks necessary details.
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?
Given one parameter, no annotations, and an output schema, the description is incomplete. It does not mention pagination, ordering, or what a 'batch' represents in the LMS context.
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 schema has one parameter 'limit' with 0% description coverage. The description does not explain the parameter's role or meaning, leaving the agent to infer from the name alone.
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 'List LMS batches' clearly states the action (list) and resource (batches in LMS). It distinguishes from siblings like 'create_batch' and 'list_courses'.
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?
No guidance is provided on when to use this tool versus alternatives such as 'list_courses' or 'list_enrollments'. No prerequisites or use context are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_cached_coursesA
List courses cached in the local SQLite database. These are courses previously created or imported. Use this to find a course by ID for re-upload without querying Frappe. Args: connection_name: Filter by connection name. Empty = all connections.
| Name | Required | Description | Default |
|---|---|---|---|
| connection_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description discloses that the tool reads from a local SQLite cache and that results are previously created/imported courses. It does not mention performance or pagination, but for a simple list operation this is sufficient. No contradiction with annotations (none exist).
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 primary purpose. Every sentence adds value without redundancy. Perfectly concise for the tool's simplicity.
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?
Given the tool's low complexity (one optional parameter, output schema present), the description covers purpose, filter usage, and rationale. No gaps for an efficient list operation.
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 only parameter, connection_name, is fully explained: 'Filter by connection name. Empty = all connections.' This adds meaning beyond the schema which only provides a default. Schema coverage is 0%, so the description fully compensates.
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?
Clearly states the verb 'list', resource 'cached courses', and context 'local SQLite database'. Distinguishes from sibling tools by specifying these are previously created or imported courses, and its use for re-upload without querying Frappe.
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 'Use this to find a course by ID for re-upload without querying Frappe', providing a specific use case. Mentions the connection_name filter. Could be more explicit about when not to use compared to list_courses, but current guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_connectionsA
List all saved Frappe LMS connections from the local database. The active connection is shown first. API secrets are masked. Use this to see which Frappe instances are configured and which is active.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses behavioral traits: 'active connection is shown first' and 'API secrets are masked.' No annotations are provided, so the description adds necessary transparency. Minor gap: does not mention whether it returns all connections or just the active one, but the context is sufficient.
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 cover purpose, behavior, and usage guidance without waste. Information is front-loaded and each sentence adds value.
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?
Given no parameters, no annotations, and an output schema (though not shown), the description fully equips the agent to understand the tool's purpose and behavior. The tool is simple and the description covers all necessary aspects.
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 input schema has zero parameters with 100% coverage. The description adds context beyond the schema by explaining the output ordering and masking behavior, making it clear what the tool does without needing parameters.
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 clearly states the verb 'list' and the resource 'saved Frappe LMS connections' from the local database. It distinguishes the tool from siblings by specifying it lists connections rather than courses or other entities.
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 states 'Use this to see which Frappe instances are configured and which is active.' This guides the agent on when to invoke this tool, differentiating it from other tools like switch_connection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_coursesB
List LMS courses. Set published_only=True to see only published courses.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| published_only | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully inform about behavior. It correctly implies a read operation but does not mention pagination behavior, ordering, or caching considerations. The description is adequate but lacks deeper disclosure.
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 description is very concise with only two sentences, front-loading the core action. Every phrase serves a purpose, with no wasted 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?
The tool is simple with two optional parameters and an output schema that presumably covers return values. However, the description misses context about the difference from 'list_cached_courses' and does not mention the limit parameter's purpose or default.
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 description coverage is 0%, so the description must compensate. It explains 'published_only' but not 'limit', leaving one of two parameters undocumented. This is insufficient for the schema coverage gap.
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 clearly states 'List LMS courses' which identifies the verb and resource. However, it does not differentiate from the sibling tool 'list_cached_courses', so it lacks sibling distinction.
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?
The description provides a brief hint about using 'published_only=True' but offers no guidance on when to use this tool versus alternatives like 'list_cached_courses', nor does it give any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_enrollmentsA
List enrollments, optionally filtered by course or student.
Args: course: Filter by course name (empty = all). student: Filter by student User email/ID (empty = all). limit: Maximum results.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| course | No | ||
| student | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavior. It states the listing action and filters but does not clarify the scope of enrollments (e.g., all system-wide or user-specific) or any side effects. The output schema exists, but the description could be more explicit.
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 description is concise at 4 lines, using a clear Docstring format. Every sentence adds value without redundancy.
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 description covers the core functionality and parameters well. Given the presence of an output schema, it does not need to explain return values. However, it could mention permission requirements or the scope of enrollments listed.
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?
With 0% schema coverage, the description adds full meaning: 'course: Filter by course name (empty = all).' and 'student: Filter by student User email/ID (empty = all).' It fills the gap left by the schema, specifying the expected format and default behavior.
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 clearly states 'List enrollments, optionally filtered by course or student,' specifying the verb 'list' and the resource 'enrollments'. It differentiates from siblings like 'list_courses' or 'list_quizzes' by focusing on enrollments.
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?
The description provides no guidance on when to use this tool versus alternatives (e.g., 'list_cached_courses' or 'enroll_student'). It lacks context about prerequisites or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_operation_logsA
List recent operations from the audit log (most recent first). Shows create, delete, reupload, and import operations across all connections. Args: limit: Maximum number of entries to return.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must fully disclose behavioral traits. It mentions ordering (most recent first) and the types of operations, but does not discuss potential side effects, authentication requirements, rate limits, pagination, or whether the listing is read-only. Additional context beyond what is present would improve transparency.
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 description is concise (two sentences plus args) and front-loaded with the main purpose. It efficiently communicates key aspects without extra words, though some details like ordering are embedded rather than highlighted.
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?
Given the tool's simplicity (one optional parameter, output schema present), the description is reasonably complete. It specifies the operation types and ordering, but lacks details like time range filtering or explanation of the output schema contents. The presence of an output schema reduces the burden, but minor gaps remain.
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 input schema has 0% coverage (no property descriptions), so the description carries the burden. It effectively explains the sole parameter 'limit' as 'Maximum number of entries to return,' adding meaning beyond the schema's type and default. This justifies a score above baseline 3.
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 clearly states the tool lists recent operations from the audit log, specifying the verb (list), resource (audit log), ordering (most recent first), and the types of operations included. It distinguishes itself from sibling tools which focus on courses, chapters, lessons, etc., as this is the only audit log tool.
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?
The description does not explicitly state when to use this tool versus alternatives or when not to use it. While it implies usage for viewing audit logs, it lacks guidance on context, prerequisites, or exclusion criteria. Since there are no competing audit log tools, the purpose is clear but the guidance is minimal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_quizzesC
List all quizzes.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, and the description fails to disclose any behavioral traits such as read-only, pagination, or sorting. The agent gets no insight beyond the minimal action.
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 description is extremely short but lacks necessary detail, making it under-specified rather than concise. It does not efficiently convey useful information.
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?
Despite having an output schema, the description provides no completeness: no parameter explanation, no usage context, no behavioral details. A simple list tool with one optional param should have more guidance.
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 single parameter 'limit' has no description in the schema (0% coverage), and the tool description does not explain its purpose or effect. The agent cannot infer what the limit does.
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?
Description clearly states it lists quizzes, with a specific verb and resource. It distinguishes from sibling tools like list_courses, but lacks any scope or filtering conditions.
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?
No guidance on when to use this tool versus alternatives like list_cached_courses or list_courses. The description is silent on appropriate contexts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_lessonA
Move a lesson to a different chapter or reorder within the same chapter.
Args: lesson: The lesson name. source_chapter: Current chapter. target_chapter: Destination chapter (same as source to reorder). idx: New 0-based position.
| Name | Required | Description | Default |
|---|---|---|---|
| idx | Yes | ||
| lesson | Yes | ||
| source_chapter | Yes | ||
| target_chapter | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description lists parameters but lacks key behavioral details like side effects on other lessons or timestamps.
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?
Short paragraph plus bullet list; every sentence is necessary and well-organized.
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 use cases and parameters; output schema exists to describe return value, reducing burden on description.
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?
Adds meaningful descriptions for each parameter (e.g., 'same as source to reorder' for target_chapter, 'New 0-based position' for idx) beyond schema names.
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?
Uses verb 'move' and resource 'lesson' clearly; distinguishes from sibling 'reorder_chapter' by specifying action on lessons.
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 states moving to different chapter or reordering within same chapter; does not specify when not to use but implies context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_courseA
Toggle the published status of a course.
Args: course: The course name (slug). published: True to publish, False to unpublish.
| Name | Required | Description | Default |
|---|---|---|---|
| course | Yes | ||
| published | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden. It discloses that the tool mutates state and specifies the boolean parameter's effect. However, it omits details on permissions, error handling, or side effects, which are relevant for a write operation.
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 description is extremely concise, consisting of one sentence and an Arg list. It front-loads the primary action and wastes no words. Every sentence adds necessary information.
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?
Given the existence of an output schema (not shown), the description need not cover return values. For a simple toggle tool, it provides sufficient context to invoke correctly, though it could note that the operation toggles from current state.
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?
Despite the context signal indicating 0% schema coverage, the description effectively documents both parameters: course as a slug and published with a default value and clear meaning ('True to publish, False to unpublish'). This adds significant clarity beyond the raw 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?
The description uses a specific verb 'Toggle' and clearly identifies the resource as 'published status of a course'. It distinguishes from sibling tools like create_course and update_course by focusing solely on the publication toggle.
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?
The description implies usage for publishing/unpublishing but provides no explicit guidance on when to use this tool versus alternatives like update_course. No when-not-to-use or prerequisites are mentioned, leaving the agent to infer context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reorder_chapterA
Move a chapter to a new position in the course outline.
Args: course: The course name (slug). chapter: The chapter name. idx: New 0-based position.
| Name | Required | Description | Default |
|---|---|---|---|
| idx | Yes | ||
| course | Yes | ||
| chapter | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description does not disclose side effects (e.g., whether other chapters shift, permission requirements, or reversibility). It only states the basic action, lacking behavioral context for a mutation tool.
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?
Description is concise with no wasted words, but the Args block is somewhat redundant with the schema. Front-loaded sentence is clear. Overall efficient.
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?
Provides parameter explanation but omits behavioral details (e.g., impact on other chapters, permissions). Output schema exists but description doesn't mention return value. Adequate for basic use but not fully complete.
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?
Despite 0% schema description coverage, the description adds meaning: course is 'slug', chapter is 'name', idx is 'new 0-based position'. This clarifies the parameters beyond the bare schema names.
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?
Description clearly states 'Move a chapter to a new position in the course outline', identifying specific verb (move), resource (chapter), and context (course outline). This distinguishes it from sibling tools like update_chapter or delete_chapter.
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?
No explicit guidance on when to use vs alternatives or prerequisites. The description states what it does but not when it should be chosen over other tools like move_lesson or update_chapter. Usage is implied but not clarified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reupload_courseA
Re-upload a cached course to a Frappe LMS instance. Uses the stored JSON spec to recreate the course on the specified (or active) connection. Useful for migrating courses between Frappe instances. Args: course_id: The cache ID of the course to re-upload. connection_name: Target connection name. Empty = active connection.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | ||
| connection_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses the mechanism (uses cached JSON spec, recreates course on specified connection) but omits details like whether it overwrites existing courses, required permissions, or error handling. It adds some value but lacks full transparency.
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 description is concise: three short sentences plus parameter descriptions. The main action is front-loaded in the first sentence. No redundant information.
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?
Given two parameters and an existing output schema, the description covers purpose, parameter meanings, and usage. It does not mention prerequisites (e.g., a cached course must exist) but sibling tools imply that. Lacks explanation of return value, but output schema covers that. Reasonably complete.
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 description coverage is 0%, so description must compensate. It provides meanings for both parameters: course_id as 'cache ID' and connection_name as 'target connection; empty means active'. This adds significant value beyond the schema titles.
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 clearly states the verb 're-upload' and resource 'cached course', and explains it recreates the course from stored JSON spec. It distinguishes from sibling tools like create_course (which creates new courses) and list_cached_courses (listing only).
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?
The description explicitly says 'Useful for migrating courses between Frappe instances', giving a clear use case. It does not list exclusions or alternatives, but this context is sufficient for an agent to decide when to use this tool over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
switch_connectionA
Switch the active Frappe LMS connection by name. After switching, all subsequent MCP tool calls use the new connection's credentials. Args: name: The connection name (label) to activate.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains that switching changes the credentials for subsequent MCP calls, which is a key behavioral detail. However, it does not mention potential error cases (e.g., invalid name) or whether the switch is persistent.
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 description is very concise: two sentences plus the parameter description. Every sentence adds value with no redundancy.
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 description is sufficient for a simple one-parameter tool. It lacks details about the return value, but an output schema likely exists (context indicates 'Has output schema: true').
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 description provides a clear explanation of the 'name' parameter ('The connection name (label) to activate'), adding meaning beyond the schema's type-only definition. Schema coverage is 0%, so the description fully compensates.
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 clearly states the tool switches the active Frappe LMS connection by name, and explains the effect on subsequent calls. It distinguishes itself from sibling tools (none of which perform connection switching).
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?
The description mentions the tool is used to switch the active connection, but does not explicitly discuss when not to use it or compare with alternatives like list_connections.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unenroll_studentB
Remove a student's enrollment.
Args: enrollment: The enrollment name.
| Name | Required | Description | Default |
|---|---|---|---|
| enrollment | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden of behavioral disclosure. It only states 'Remove', implying a destructive action, but lacks details on reversibility, permissions, or side effects.
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 description is extremely concise with no superfluous text. Every word contributes to the purpose.
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 simple tool with one parameter and an output schema, the description is minimally adequate. However, it lacks usage context and behavioral details that would make it complete for complex scenarios.
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 description coverage is 0%, and the description adds minimal meaning: 'The enrollment name.' No format, examples, or clarification on how to obtain the enrollment identifier.
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 clearly states the action ('Remove') and the resource ('a student's enrollment'), making the tool's purpose immediately obvious. It distinguishes well from sibling tools like 'enroll_student' and 'list_enrollments'.
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?
No guidance is provided on when to use this tool versus alternatives, nor any prerequisites or consequences. The description merely states the action without context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_chapterA
Update a chapter title.
Args: chapter: The chapter name. title: New chapter title.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| chapter | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It only says 'Update a chapter title' without detailing side effects, permissions requirements, or any changes to the state. The behavioral transparency is minimal.
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 description is extremely concise, consisting of a single sentence and a short parameter list. It is front-loaded with the main action and wastes no words. Every element is necessary.
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?
Given the simplicity of the tool (2 required parameters, no nested objects, and an output schema present), the description is fairly complete. It explains the action and parameters. While it could mention prerequisites or error conditions, the output schema likely covers return values, making extra detail less critical.
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 input schema has 0% description coverage, but the description includes an 'Args' section explaining that 'chapter' is the chapter name and 'title' is the new chapter title. This adds meaning beyond the schema, which only provides types and titles. The description effectively compensates for the lack of schema descriptions.
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 clearly states 'Update a chapter title,' specifying the verb (update), resource (chapter), and the specific field being updated (title). It distinguishes from sibling tools like create_chapter, get_chapter, delete_chapter, and reorder_chapter by focusing on updating the title.
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?
No guidance is provided on when to use this tool versus alternatives, nor are there any conditions or exclusions mentioned. The description lacks any contextual usage advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_courseA
Update fields on an existing course.
Args: course: The course name (slug). fields: JSON string of fields to update, e.g. '{"title":"New Title","published":true}'.
| Name | Required | Description | Default |
|---|---|---|---|
| course | Yes | ||
| fields | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Indicates mutation ('update') but lacks details on side effects, error behavior, permissions, or idempotency. No annotations provided to compensate.
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 plus args in a readable format. Front-loaded purpose. Could be slightly more integrated, but overall efficient.
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?
Output schema exists (not shown) so return values are covered. But the tool is a mutation; no description of what happens on success/failure or if the course is not found. Adequate for a simple update with param clarity.
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?
Despite 0% schema description coverage, the description adds comprehensive meaning: defines 'course' as a slug and 'fields' as a JSON string with an example. This fully compensates for missing schema descriptions.
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?
Clearly states 'Update fields on an existing course,' specifying the verb (update) and resource (course). Distinguishes from siblings like create_course, delete_course, and publish_course.
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?
No guidance on when to use this tool versus alternatives (e.g., update_chapter vs update_course). No prerequisites or context like requiring course existence or authentication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_lessonA
Update a lesson's fields. Pass empty strings for fields you don't want to change.
Args: lesson: The lesson name. title: New lesson title (empty = no change). content: EditorJS JSON string (empty = no change). youtube: YouTube video URL (empty = no change). include_in_preview: Whether this lesson is visible in the course preview. instructor_notes: Markdown instructor notes (empty = no change).
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | ||
| lesson | Yes | ||
| content | No | ||
| youtube | No | ||
| instructor_notes | No | ||
| include_in_preview | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It explains the effect of empty strings and defaults but does not disclose side effects, auth requirements, or rate limits. Acceptable for a simple update tool.
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 description is reasonably concise and structured as an args list. It is front-loaded with the main action, but the parameter details could be slightly more compact. No unnecessary sentences.
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?
Given the tool's simplicity and the existence of an output schema (though not shown), the description is fairly complete. It covers all input parameters and their behavior. Missing information about return values is likely covered by the output schema.
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 0%, so description must add meaning. Each parameter is explained with its role and how to indicate no change (e.g., 'empty = no change'), providing substantial value beyond the schema's titles and defaults.
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 clearly states the tool updates a lesson's fields, which is a specific verb+resource combination. It distinguishes from sibling tools like create_lesson, get_lesson, delete_lesson by focusing on updating existing lessons.
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?
The description explicitly tells users to pass empty strings for fields they don't want to change, providing clear usage guidance. It does not directly compare to alternatives but implies use when modifying existing lessons.
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. Dates show when Glama detected each change.
39 tool updates
v1.0.0- First observed
add_paragraph_to_content - First observed
add_question_to_quiz - First observed
build_lesson_content - First observed
create_batch - First observed
create_chapter - First observed
create_course - First observed
create_full_course - First observed
create_lesson - First observed
create_question - First observed
create_quiz - First observed
delete_chapter - First observed
delete_course - First observed
delete_lesson - First observed
delete_quiz - First observed
embed_quiz_in_lesson - First observed
enroll_student - First observed
get_cached_course - First observed
get_chapter - First observed
get_course - First observed
get_lesson - First observed
get_quiz - First observed
import_course_from_frappe - First observed
issue_certificate - First observed
list_batches - First observed
list_cached_courses - First observed
list_connections - First observed
list_courses - First observed
list_enrollments - First observed
list_operation_logs - First observed
list_quizzes - First observed
move_lesson - First observed
publish_course - First observed
reorder_chapter - First observed
reupload_course - First observed
switch_connection - First observed
unenroll_student - First observed
update_chapter - First observed
update_course - First observed
update_lesson
TDQS
Most tools have clear, distinct purposes (courses, chapters, lessons, quizzes, enrollments, batches, connections). However, overlap exists between cached vs live course tools (list_cached_courses vs list_courses) and content-building utilities (build_lesson_content vs add_paragraph_to_content), which could cause minor confusion.
Tool names generally follow a verb_noun pattern (e.g., create_course, list_quizzes). There are some deviations like embed_quiz_in_lesson and reupload_course, and mix of 'get' vs 'list' for retrieval, but overall pattern is recognizable and predictable.
39 tools is high for an MCP server, covering many LMS operations plus caching and connection management. While the domain is broad, some tools like add_paragraph_to_content and list_operation_logs feel like utilities that could be integrated or removed, making the set slightly bloated.
The tool surface covers CRUD for courses, chapters, lessons, quizzes, enrollments, and batches. Missing are updates for quizzes and questions (e.g., no update_quiz or delete_question), which are minor gaps. Caching and import/export features add extra completeness for migration scenarios.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for building and testing AI agents with multi-model experimentation and insights.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
- ZapierOAuthcom.zapier
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
Related MCP Servers
- AlicenseBqualityDmaintenanceAn MCP server that enables LLMs to interact with Moodle platforms to manage courses, students, assignments, and quizzes through natural language commands.71542MIT
- AlicenseBqualityDmaintenanceAn MCP server that enables LLMs to interact with the Moodle platform to manage courses, students, assignments, and quizzes.715MIT
- AlicenseNot gradedqualityAmaintenanceMCP server that enables LLMs to interact with ERPNext/Frappe sites for document CRUD, search, reports, workflows, and analytics, respecting user permissions and logging all actions.295AGPL 3.0
- AlicenseNot gradedqualityCmaintenanceMCP server that enables Claude, ChatGPT, and other LLMs to interact with ERPNext sites through natural language, supporting document CRUD, search, reports, workflows, and custom tools, while respecting user permissions and logging all calls.AGPL 3.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/anggun-indra/frape-lms-mcp-tools'
If you have feedback or need assistance with the MCP directory API, please join our Discord server