Agent skill

Moodle External API Development

by davila7 in davila7/claude-code-templates

Create custom external web service APIs for Moodle LMS. An agent skill from davila7/claude-code-templates.

MITAuto-check passedDevelopment

Install Moodle External API Development

skills CLI
$ npx skills add davila7/claude-code-templates --skill moodle-external-api-development -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install davila7/claude-code-templates moodle-external-api-development --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/davila7/claude-code-templates.git skills-src && mkdir -p .claude/skills && cp -r skills-src/cli-tool/components/skills/development/moodle-external-api-development .claude/skills/moodle-external-api-development && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
moodle-external-api-development
GitHub stars
32k
Used in
8 other repos
Token cost
~4.6k tokens
SKILL.md length
750 words
Files
1
Skills in repo
477
Repo updated
First seen
Licence
MIT

At a glance

Create custom external web service APIs for Moodle LMS. An agent skill from davila7/claude-code-templates.

  • Works in 12 steps: Create the External API Class File → Define Input Parameters → Implement Business Logic → …
  • Implementing web services for course management
  • SKILL.md covers When to Use This Skill, Core Architecture Pattern, Step-by-Step Implementation and Advanced Patterns, plus 5 more sections
  • Calls curl

What it does

Moodle External API Development is an agent skill from davila7/claude-code-templates. Create custom external web service APIs for Moodle LMS. Use when implementing web services for course management, user tracking, quiz operations, or custom plugin functionality. Covers parameter validation, database operations, error handling, service registration, and Moodle coding standards.

Its SKILL.md is about 4.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development, covering Code quality and Database administration. The repository describes itself as: CLI tool for configuring and monitoring Claude Code. The licence is MIT.

When your agent uses it

  • Implementing web services for course management
  • Quiz operations
  • Custom plugin functionality

Example prompts

  • “/moodle-external-api-development”

Workflow steps

12 steps, taken from the step headings in SKILL.md.

  1. Create the External API Class File
  2. Define Input Parameters
  3. Implement Business Logic
  4. Define Return Structure
  5. Register the Service
  6. Implement Error Handling & Logging
  7. Via Moodle Web Services Test Client
  8. Via curl
  9. Via JavaScript (AJAX)
  10. "Function not found" Error
  11. "Invalid parameter value detected"
  12. SQL Injection Vulnerabilities

What it can do on your machine

Read from SKILL.md and the folder at commit 14680ec. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • curl

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • moodledev.io

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Moodle External API Development loads about 4.6k tokens when it runs. Until then it costs about 82 tokens; SKILL.md has 750 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~82
When it runs · the whole SKILL.md, loaded when a task matches
~4.6k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from davila7/claude-code-templates at commit 14680ec, republished under its MIT licence (© davila7). 750 words, ~4,552 tokens.

Download SKILL.mdSave it as .claude/skills/moodle-external-api-development/SKILL.md (or your agent's skills folder).
name
moodle-external-api-development
description
Create custom external web service APIs for Moodle LMS. Use when implementing web services for course management, user tracking, quiz operations, or custom plugin functionality. Covers parameter validation, database operations, error handling, service registration, and Moodle coding standards.

Moodle External API Development

This skill guides you through creating custom external web service APIs for Moodle LMS, following Moodle's external API framework and coding standards.

When to Use This Skill

  • Creating custom web services for Moodle plugins
  • Implementing REST/AJAX endpoints for course management
  • Building APIs for quiz operations, user tracking, or reporting
  • Exposing Moodle functionality to external applications
  • Developing mobile app backends using Moodle

Core Architecture Pattern

Moodle external APIs follow a strict three-method pattern:

  1. execute_parameters() - Defines input parameter structure
  2. execute() - Contains business logic
  3. execute_returns() - Defines return structure

Step-by-Step Implementation

Step 1: Create the External API Class File

Location: /local/yourplugin/classes/external/your_api_name.php

php
<?php
namespace local_yourplugin\external;

defined('MOODLE_INTERNAL') || die();
require_once("$CFG->libdir/externallib.php");

use external_api;
use external_function_parameters;
use external_single_structure;
use external_value;

class your_api_name extends external_api {
    
    // Three required methods will go here
    
}

Key Points:

  • Class must extend external_api
  • Namespace follows: local_pluginname\external or mod_modname\external
  • Include the security check: defined('MOODLE_INTERNAL') || die();
  • Require externallib.php for base classes
Step 2: Define Input Parameters
php
public static function execute_parameters() {
    return new external_function_parameters([
        'userid' => new external_value(PARAM_INT, 'User ID', VALUE_REQUIRED),
        'courseid' => new external_value(PARAM_INT, 'Course ID', VALUE_REQUIRED),
        'options' => new external_single_structure([
            'includedetails' => new external_value(PARAM_BOOL, 'Include details', VALUE_DEFAULT, false),
            'limit' => new external_value(PARAM_INT, 'Result limit', VALUE_DEFAULT, 10)
        ], 'Options', VALUE_OPTIONAL)
    ]);
}

Common Parameter Types:

  • PARAM_INT - Integers
  • PARAM_TEXT - Plain text (HTML stripped)
  • PARAM_RAW - Raw text (no cleaning)
  • PARAM_BOOL - Boolean values
  • PARAM_FLOAT - Floating point numbers
  • PARAM_ALPHANUMEXT - Alphanumeric with extended chars

Structures:

  • external_value - Single value
  • external_single_structure - Object with named fields
  • external_multiple_structure - Array of items

Value Flags:

  • VALUE_REQUIRED - Parameter must be provided
  • VALUE_OPTIONAL - Parameter is optional
  • VALUE_DEFAULT, defaultvalue - Optional with default
Step 3: Implement Business Logic
php
public static function execute($userid, $courseid, $options = []) {
    global $DB, $USER;

    // 1. Validate parameters
    $params = self::validate_parameters(self::execute_parameters(), [
        'userid' => $userid,
        'courseid' => $courseid,
        'options' => $options
    ]);

    // 2. Check permissions/capabilities
    $context = \context_course::instance($params['courseid']);
    self::validate_context($context);
    require_capability('moodle/course:view', $context);

    // 3. Verify user access
    if ($params['userid'] != $USER->id) {
        require_capability('moodle/course:viewhiddenactivities', $context);
    }

    // 4. Database operations
    $sql = "SELECT id, name, timecreated
            FROM {your_table}
            WHERE userid = :userid
              AND courseid = :courseid
            LIMIT :limit";
    
    $records = $DB->get_records_sql($sql, [
        'userid' => $params['userid'],
        'courseid' => $params['courseid'],
        'limit' => $params['options']['limit']
    ]);

    // 5. Process and return data
    $results = [];
    foreach ($records as $record) {
        $results[] = [
            'id' => $record->id,
            'name' => $record->name,
            'timestamp' => $record->timecreated
        ];
    }

    return [
        'items' => $results,
        'count' => count($results)
    ];
}

Critical Steps:

  1. Always validate parameters using validate_parameters()
  2. Check context using validate_context()
  3. Verify capabilities using require_capability()
  4. Use parameterized queries to prevent SQL injection
  5. Return structured data matching return definition
Step 4: Define Return Structure
php
public static function execute_returns() {
    return new external_single_structure([
        'items' => new external_multiple_structure(
            new external_single_structure([
                'id' => new external_value(PARAM_INT, 'Item ID'),
                'name' => new external_value(PARAM_TEXT, 'Item name'),
                'timestamp' => new external_value(PARAM_INT, 'Creation time')
            ])
        ),
        'count' => new external_value(PARAM_INT, 'Total items')
    ]);
}

Return Structure Rules:

  • Must match exactly what execute() returns
  • Use appropriate parameter types
  • Document each field with description
  • Nested structures allowed
Step 5: Register the Service

Location: /local/yourplugin/db/services.php

php
<?php
defined('MOODLE_INTERNAL') || die();

$functions = [
    'local_yourplugin_your_api_name' => [
        'classname'   => 'local_yourplugin\external\your_api_name',
        'methodname'  => 'execute',
        'classpath'   => 'local/yourplugin/classes/external/your_api_name.php',
        'description' => 'Brief description of what this API does',
        'type'        => 'read',  // or 'write'
        'ajax'        => true,
        'capabilities'=> 'moodle/course:view', // comma-separated if multiple
        'services'    => [MOODLE_OFFICIAL_MOBILE_SERVICE] // Optional
    ],
];

$services = [
    'Your Plugin Web Service' => [
        'functions' => [
            'local_yourplugin_your_api_name'
        ],
        'restrictedusers' => 0,
        'enabled' => 1
    ]
];

Service Registration Keys:

  • classname - Full namespaced class name
  • methodname - Always 'execute'
  • type - 'read' (SELECT) or 'write' (INSERT/UPDATE/DELETE)
  • ajax - Set true for AJAX/REST access
  • capabilities - Required Moodle capabilities
  • services - Optional service bundles
Step 6: Implement Error Handling & Logging
php
private static function log_debug($message) {
    global $CFG;
    $logdir = $CFG->dataroot . '/local_yourplugin';
    if (!file_exists($logdir)) {
        mkdir($logdir, 0777, true);
    }
    $debuglog = $logdir . '/api_debug.log';
    $timestamp = date('Y-m-d H:i:s');
    file_put_contents($debuglog, "[$timestamp] $message\n", FILE_APPEND | LOCK_EX);
}

public static function execute($userid, $courseid) {
    global $DB;

    try {
        self::log_debug("API called: userid=$userid, courseid=$courseid");
        
        // Validate parameters
        $params = self::validate_parameters(self::execute_parameters(), [
            'userid' => $userid,
            'courseid' => $courseid
        ]);

        // Your logic here
        
        self::log_debug("API completed successfully");
        return $result;

    } catch (\invalid_parameter_exception $e) {
        self::log_debug("Parameter validation failed: " . $e->getMessage());
        throw $e;
    } catch (\moodle_exception $e) {
        self::log_debug("Moodle exception: " . $e->getMessage());
        throw $e;
    } catch (\Exception $e) {
        // Log detailed error info
        $lastsql = method_exists($DB, 'get_last_sql') ? $DB->get_last_sql() : '[N/A]';
        self::log_debug("Fatal error: " . $e->getMessage());
        self::log_debug("Last SQL: " . $lastsql);
        self::log_debug("Stack trace: " . $e->getTraceAsString());
        throw $e;
    }
}

Error Handling Best Practices:

  • Wrap logic in try-catch blocks
  • Log errors with timestamps and context
  • Capture SQL queries on database errors
  • Preserve stack traces for debugging
  • Re-throw exceptions after logging

Advanced Patterns

Complex Database Operations
php
// Transaction example
$transaction = $DB->start_delegated_transaction();

try {
    // Insert record
    $recordid = $DB->insert_record('your_table', $dataobject);
    
    // Update related records
    $DB->set_field('another_table', 'status', 1, ['recordid' => $recordid]);
    
    // Commit transaction
    $transaction->allow_commit();
} catch (\Exception $e) {
    $transaction->rollback($e);
    throw $e;
}
Working with Course Modules
php
// Create course module
$moduleid = $DB->get_field('modules', 'id', ['name' => 'quiz'], MUST_EXIST);

$cm = new \stdClass();
$cm->course = $courseid;
$cm->module = $moduleid;
$cm->instance = 0; // Will be updated after activity creation
$cm->visible = 1;
$cm->groupmode = 0;
$cmid = add_course_module($cm);

// Create activity instance (e.g., quiz)
$quiz = new \stdClass();
$quiz->course = $courseid;
$quiz->name = 'My Quiz';
$quiz->coursemodule = $cmid;
// ... other quiz fields ...

$quizid = quiz_add_instance($quiz, null);

// Update course module with instance ID
$DB->set_field('course_modules', 'instance', $quizid, ['id' => $cmid]);
course_add_cm_to_section($courseid, $cmid, 0);
Access Restrictions (Groups/Availability)
php
// Restrict activity to specific user via group
$groupname = 'activity_' . $activityid . '_user_' . $userid;

// Create or get group
if (!$groupid = $DB->get_field('groups', 'id', ['courseid' => $courseid, 'name' => $groupname])) {
    $groupdata = (object)[
        'courseid' => $courseid,
        'name' => $groupname,
        'timecreated' => time(),
        'timemodified' => time()
    ];
    $groupid = $DB->insert_record('groups', $groupdata);
}

// Add user to group
if (!$DB->record_exists('groups_members', ['groupid' => $groupid, 'userid' => $userid])) {
    $DB->insert_record('groups_members', (object)[
        'groupid' => $groupid,
        'userid' => $userid,
        'timeadded' => time()
    ]);
}

// Set availability condition
$restriction = [
    'op' => '&',
    'show' => false,
    'c' => [
        [
            'type' => 'group',
            'id' => $groupid
        ]
    ],
    'showc' => [false]
];

$DB->set_field('course_modules', 'availability', json_encode($restriction), ['id' => $cmid]);
Random Question Selection with Tags
php
private static function get_random_questions($categoryid, $tagname, $limit) {
    global $DB;
    
    $sql = "SELECT q.id
            FROM {question} q
            INNER JOIN {question_versions} qv ON qv.questionid = q.id
            INNER JOIN {question_bank_entries} qbe ON qbe.id = qv.questionbankentryid
            INNER JOIN {question_categories} qc ON qc.id = qbe.questioncategoryid
            JOIN {tag_instance} ti ON ti.itemid = q.id
            JOIN {tag} t ON t.id = ti.tagid
            WHERE LOWER(t.name) = :tagname
              AND qc.id = :categoryid
              AND ti.itemtype = 'question'
              AND q.qtype = 'multichoice'";
    
    $qids = $DB->get_fieldset_sql($sql, [
        'categoryid' => $categoryid,
        'tagname' => strtolower($tagname)
    ]);
    
    shuffle($qids);
    return array_slice($qids, 0, $limit);
}

Testing Your API

1. Via Moodle Web Services Test Client
  1. Enable web services: Site administration > Advanced features
  2. Enable REST protocol: Site administration > Plugins > Web services > Manage protocols
  3. Create service: Site administration > Server > Web services > External services
  4. Test function: Site administration > Development > Web service test client
2. Via curl
bash
# Get token first
curl -X POST "https://yourmoodle.com/login/token.php" \
  -d "username=admin" \
  -d "password=yourpassword" \
  -d "service=moodle_mobile_app"

# Call your API
curl -X POST "https://yourmoodle.com/webservice/rest/server.php" \
  -d "wstoken=YOUR_TOKEN" \
  -d "wsfunction=local_yourplugin_your_api_name" \
  -d "moodlewsrestformat=json" \
  -d "userid=2" \
  -d "courseid=3"
3. Via JavaScript (AJAX)
javascript
require(['core/ajax'], function(ajax) {
    var promises = ajax.call([{
        methodname: 'local_yourplugin_your_api_name',
        args: {
            userid: 2,
            courseid: 3
        }
    }]);

    promises[0].done(function(response) {
        console.log('Success:', response);
    }).fail(function(error) {
        console.error('Error:', error);
    });
});

Common Pitfalls & Solutions

1. "Function not found" Error

Solution:

  • Purge caches: Site administration > Development > Purge all caches
  • Verify function name in services.php matches exactly
  • Check namespace and class name are correct
2. "Invalid parameter value detected"

Solution:

  • Ensure parameter types match between definition and usage
  • Check required vs optional parameters
  • Validate nested structure definitions
Show full SKILL.md (298 more words)Show less
3. SQL Injection Vulnerabilities

Solution:

  • Always use placeholder parameters (:paramname)
  • Never concatenate user input into SQL strings
  • Use Moodle's database methods: get_record(), get_records(), etc.
4. Permission Denied Errors

Solution:

  • Call self::validate_context($context) early in execute()
  • Check required capabilities match user's permissions
  • Verify user has role assignments in the context
5. Transaction Deadlocks

Solution:

  • Keep transactions short
  • Always commit or rollback in finally blocks
  • Avoid nested transactions

Debugging Checklist

  • Check Moodle debug mode: Site administration > Development > Debugging
  • Review web services logs: Site administration > Reports > Logs
  • Check custom log files in $CFG->dataroot/local_yourplugin/
  • Verify database queries using $DB->set_debug(true)
  • Test with admin user to rule out permission issues
  • Clear browser cache and Moodle caches
  • Check PHP error logs on server

Plugin Structure Checklist

local/yourplugin/
├── version.php                 # Plugin version and metadata
├── db/
│   ├── services.php           # External service definitions
│   └── access.php             # Capability definitions (optional)
├── classes/
│   └── external/
│       ├── your_api_name.php  # External API implementation
│       └── another_api.php    # Additional APIs
├── lang/
│   └── en/
│       └── local_yourplugin.php  # Language strings
└── tests/
    └── external_test.php      # Unit tests (optional but recommended)

Examples from Real Implementation

Simple Read API (Get Quiz Attempts)
php
<?php
namespace local_userlog\external;

defined('MOODLE_INTERNAL') || die();
require_once("$CFG->libdir/externallib.php");

use external_api;
use external_function_parameters;
use external_single_structure;
use external_value;

class get_quiz_attempts extends external_api {
    public static function execute_parameters() {
        return new external_function_parameters([
            'userid' => new external_value(PARAM_INT, 'User ID'),
            'courseid' => new external_value(PARAM_INT, 'Course ID')
        ]);
    }

    public static function execute($userid, $courseid) {
        global $DB;

        self::validate_parameters(self::execute_parameters(), [
            'userid' => $userid,
            'courseid' => $courseid
        ]);

        $sql = "SELECT COUNT(*) AS quiz_attempts
                FROM {quiz_attempts} qa
                JOIN {quiz} q ON qa.quiz = q.id
                WHERE qa.userid = :userid AND q.course = :courseid";

        $attempts = $DB->get_field_sql($sql, [
            'userid' => $userid,
            'courseid' => $courseid
        ]);

        return ['quiz_attempts' => (int)$attempts];
    }

    public static function execute_returns() {
        return new external_single_structure([
            'quiz_attempts' => new external_value(PARAM_INT, 'Total number of quiz attempts')
        ]);
    }
}
Complex Write API (Create Quiz from Categories)

See attached create_quiz_from_categories.php for a comprehensive example including:

  • Multiple database insertions
  • Course module creation
  • Quiz instance configuration
  • Random question selection with tags
  • Group-based access restrictions
  • Extensive error logging
  • Transaction management

Quick Reference: Common Moodle Tables

TablePurpose
{user}User accounts
{course}Courses
{course_modules}Activity instances in courses
{modules}Available activity types (quiz, forum, etc.)
{quiz}Quiz configurations
{quiz_attempts}Quiz attempt records
{question}Question bank
{question_categories}Question categories
{grade_items}Gradebook items
{grade_grades}Student grades
{groups}Course groups
{groups_members}Group memberships
{logstore_standard_log}Activity logs

Additional Resources

Guidelines

  • Always validate input parameters using validate_parameters()
  • Check user context and capabilities before operations
  • Use parameterized SQL queries (never string concatenation)
  • Implement comprehensive error handling and logging
  • Follow Moodle naming conventions (lowercase, underscores)
  • Document all parameters and return values clearly
  • Test with different user roles and permissions
  • Consider transaction safety for write operations
  • Purge caches after service registration changes
  • Keep API methods focused and single-purpose

© davila7, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in cli-tool/components/skills/development/moodle-external-api-development of davila7/claude-code-templates.

Open the folder on GitHubat commit 14680ec

Used in 8 other repositories

We found 23 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 8 other GitHub owners. This page covers the copy in davila7/claude-code-templates, which our catalogue first saw on October 7, 2026.

Compare with similar skills

Moodle External API Development next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Moodle External API Development compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Moodle External API Development this skilldavila7/claude-code-templates32k8 repos~4.6kAutomated safety check: PassMIT
Self Reviewverl-project/verl-omni1.2k—~2kAutomated safety check: PassApache-2.0
Score StyleOpenHands/extensions158—~721Automated safety check: PassMIT
Install Anti-Slop Oxlint Rulesdmmulroy/anti-slop5.3k1 repos~2.2kAutomated safety check: PassMIT
WooCommerce Code Reviewwoocommerce/woocommerce11k3 repos~1.1kAutomated safety check: PassCustom licence
Systematic Code Refactoringluongnv89/claude-howto42k—~3kAutomated safety check: PassMIT

Similar skills

  • Self Review

    verl-project/verl-omni

    Review your own verl-omni branch against the project rubric before opening or updating a PR.

    1.2k GitHub stars~2k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Score Style

    OpenHands/extensions

    Score migrated code against style guidelines and best practices.

    158 GitHub stars~721 tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Installs, updates or migrates the vendored anti-slop Oxlint plugin in a repository, keeping local rule changes and the plugin's license and provenance files.

    5.3k GitHub starsUsed in 1 repo~2.2k tokens
    DevelopmentAuto-check passed
  • WooCommerce Code Review

    woocommerce/woocommerce

    Reviews WooCommerce code changes against the project's standards, flagging backend PHP architecture, naming, documentation, data integrity and testing violations.

    11k GitHub starsUsed in 3 repos~1.1k tokens
    DevelopmentAuto-check passed
  • Systematic Code Refactoring

    luongnv89/claude-howto

    Guides refactoring in phases based on Martin Fowler's method: research, test coverage check, planning and small tested steps, with your approval at each phase.

    42k GitHub stars~3k tokensUpdated 8 days ago
    DevelopmentAuto-check passed
  • Constraint-Driven Development

    addyosmani/agent-skills

    Records a project's quality bar in CONSTRAINTS.md and watches diffs for signs an agent quietly weakened it, such as suppressions, skipped tests or lowered thresholds.

    103k GitHub starsUsed in 2 repos~5.2k tokens
    DevelopmentAuto-check passed

More from davila7/claude-code-templates

All 477 skills in this repo
  • Perplexity Web Search

    davila7/claude-code-templates

    Runs web-grounded searches through Perplexity's Sonar models over OpenRouter for current events, recent literature and cited facts beyond the model's training cutoff.

    32k GitHub starsUsed in 12 repos~3.5k tokens
    Auto-check: notes
  • Neuropixels Data Analysis

    davila7/claude-code-templates

    Analyzes Neuropixels recordings from SpikeGLX or Open Ephys through preprocessing, drift correction, Kilosort4 spike sorting, quality metrics and curation.

    32k GitHub starsUsed in 10 repos~2.8k tokens
    Auto-check passed
  • Scientific Venue Templates

    davila7/claude-code-templates

    Supplies LaTeX templates and formatting rules for journals, conferences, posters, and grant proposals, then can check a draft against them.

    32k GitHub starsUsed in 9 repos~5.1k tokens
    Auto-check: notes
  • Brand Voice Content Creator

    davila7/claude-code-templates

    Analyzes a brand's existing writing to lock in a consistent voice, then builds SEO blog posts and platform-specific social content around it.

    32k GitHub starsUsed in 3 repos~1.9k tokens
    Auto-check passed
  • CAPA Officer

    davila7/claude-code-templates

    Guides corrective and preventive action (CAPA) work in a quality management system, from initiation and root cause analysis through effectiveness verification.

    32k GitHub starsUsed in 1 repo~2k tokens
    Auto-check passed
  • Fda Consultant Specialist

    davila7/claude-code-templates

    Senior FDA consultant and specialist for medical device companies including HIPAA compliance and requirement management.

    32k GitHub starsUsed in 1 repo~2.7k tokens
    Auto-check passed

Questions about Moodle External API Development

What does Moodle External API Development do?

Create custom external web service APIs for Moodle LMS. An agent skill from davila7/claude-code-templates. Moodle External API Development is an agent skill from davila7/claude-code-templates. Create custom external web service APIs for Moodle LMS.

When should I use Moodle External API Development?

Moodle External API Development fits situations like: implementing web services for course management; quiz operations; custom plugin functionality.

How do I install Moodle External API Development in Claude Code?

Run `npx skills add davila7/claude-code-templates --skill moodle-external-api-development -a claude-code`. Or copy the skill folder (cli-tool/components/skills/development/moodle-external-api-development in davila7/claude-code-templates) into .claude/skills/moodle-external-api-development in your project. Claude Code loads it when a task matches its description.

How do I install Moodle External API Development in Codex?

Run `npx skills add davila7/claude-code-templates --skill moodle-external-api-development -a codex`. Or copy the skill folder (cli-tool/components/skills/development/moodle-external-api-development in davila7/claude-code-templates) into .agents/skills/moodle-external-api-development in your project. Codex loads it when a task matches its description.

Can I use Moodle External API Development in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add davila7/claude-code-templates --skill moodle-external-api-development -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/moodle-external-api-development, .gemini/skills/moodle-external-api-development, .github/skills/moodle-external-api-development and .opencode/skills/moodle-external-api-development in your project.

What does Moodle External API Development need to run?

Going by SKILL.md and its folder, Moodle External API Development needs the command-line tools its instructions call (curl).

Does Moodle External API Development access the network?

SKILL.md names 1 domain. As links in the text: moodledev.io. This is read from the text; nothing was executed.

Is Moodle External API Development safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Moodle External API Development use?

Moodle External API Development is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Moodle External API Development use?

About 4.6k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Moodle External API Development?

Skills that share tags, products or a category with Moodle External API Development: Self Review (verl-project/verl-omni, 1.2k stars), Score Style (OpenHands/extensions, 158 stars), Install Anti-Slop Oxlint Rules (dmmulroy/anti-slop, 5.3k stars) and WooCommerce Code Review (woocommerce/woocommerce, 11k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Moodle External API Development?

davila7 (a GitHub user) maintains it in davila7/claude-code-templates, which has 32,463 GitHub stars. The repository holds 477 skills in this directory. The repository was last updated on October 8, 2026.

Source: davila7/claude-code-templates on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.