Agent skill

Frappe Impl Serverscripts

by Impertio-Studio in Impertio-Studio/Frappe_Claude_Skill_Package

A skill your agent uses when implementing server-side features via Setup Server Script: document validation, auto-fill, API endpoints, scheduled tasks, permission queries.

MITAuto-check passedProductivity & Automation

Install Frappe Impl Serverscripts

skills CLI
$ npx skills add Impertio-Studio/Frappe_Claude_Skill_Package --skill frappe-impl-serverscripts -a claude-code

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

GitHub CLI
$ gh skill install Impertio-Studio/Frappe_Claude_Skill_Package frappe-impl-serverscripts --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/Impertio-Studio/Frappe_Claude_Skill_Package.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/source/impl/frappe-impl-serverscripts .claude/skills/frappe-impl-serverscripts && 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
frappe-impl-serverscripts
GitHub stars
187
Token cost
~2.6k tokens
SKILL.md length
598 words
Files
5 (incl. references)
Skills in repo
61
Repo updated
First seen
Licence
MIT

At a glance

A skill your agent uses when implementing server-side features via Setup Server Script: document validation, auto-fill, API endpoints, scheduled tasks, permission queries.

  • Works in 8 steps: Enable server scripts: bench set-config… → Navigate to Setup > Server Script (or… → Select Script Type (see decision tree… → …
  • Implementing server-side features via Setup Server Script: document validation
  • SKILL.md covers CRITICAL: Sandbox Limitations, Workflow 1: Create a Server…, Workflow 2: Choose the Script… and Workflow 3: Document Event:…, plus 9 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Frappe Impl Serverscripts is an agent skill from Impertio-Studio/Frappe_Claude_Skill_Package. Use when implementing server-side features via Setup Server Script: document validation, auto-fill, API endpoints, scheduled tasks, permission queries. Covers sandbox-safe coding, script type selection, testing, migration to controllers. Keywords: how to implement server script, which script type, sandbox limitation, Document Event, API script, Scheduler Event, Permission Query, migrate to controller, no-code automation, run code on save, auto-fill field, server-side validation, scheduled script.

Its SKILL.md is about 2.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 5 other files, including reference files (for example `references/anti-patterns.md`, `references/decision-tree.md` and `references/examples.md`). Compatibility notes: Claude Code, Claude.ai Projects, Claude API. Frappe v14-v16.

It sits in Productivity & Automation, covering Scheduled and recurring tasks, REST APIs and Backend development. The repository describes itself as: 60 deterministic Claude AI skills for Frappe Framework & ERPNext v14-v16 development and operations. The licence is MIT.

When your agent uses it

  • Implementing server-side features via Setup Server Script: document validation
  • Scheduled tasks
  • Permission queries

Example prompts

  • “/frappe-impl-serverscripts”

Requirements

  • Python 3
  • Compatibility (from SKILL.md): Claude Code, Claude.ai Projects, Claude API. Frappe v14-v16.

Workflow steps

8 steps, taken from the first numbered list in SKILL.md.

  1. Enable server scripts: bench set-config server_script_enabled true
  2. Navigate to Setup > Server Script (or awesomebar: "New Server Script")
  3. Select Script Type (see decision tree below)
  4. Configure type-specific settings (DocType, event, API method, cron)
  5. Write script in the editor
  6. Save — script is active immediately
  7. Test by triggering the configured event
  8. Use "Compare Versions" button to diff changes

What it can do on your machine

Read from SKILL.md and the folder at commit 36cfa80. 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

    No scripts in the folder and no shell commands in SKILL.md (its code samples are python).

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

  • Network

    No URLs in SKILL.md.

    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.

  • Compatibility

    Claude Code, Claude.ai Projects, Claude API. Frappe v14-v16.

    From compatibility in the SKILL.md frontmatter.

Context cost

Frappe Impl Serverscripts loads about 2.6k tokens when it runs, and up to ~10k if it reads all its reference files. Until then it costs about 132 tokens; SKILL.md has 598 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~132
When it runs · the whole SKILL.md, loaded when a task matches
~2.6k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~10k

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 Impertio-Studio/Frappe_Claude_Skill_Package at commit 36cfa80, republished under its MIT licence (© Impertio-Studio). 598 words, ~2,634 tokens.

Download SKILL.mdSave it as .claude/skills/frappe-impl-serverscripts/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.
name
frappe-impl-serverscripts
description
Use when implementing server-side features via Setup > Server Script: document validation, auto-fill, API endpoints, scheduled tasks, permission queries. Covers sandbox-safe coding, script type selection, testing, migration to controllers. Keywords: how to implement server script, which script type, sandbox limitation, Document Event, API script, Scheduler Event, Permission Query, migrate to controller, no-code automation, run code on save, auto-fill field, server-side validation, scheduled script.
compatibility
Claude Code, Claude.ai Projects, Claude API. Frappe v14-v16.
license
MIT
metadata.author
OpenAEC-Foundation
metadata.version
2.0

Server Scripts — Implementation Workflows

Step-by-step workflows for building server-side features without a custom app. For exact syntax, see frappe-syntax-serverscripts.

Version: v14/v15/v16 | v15+ Note: Server Scripts disabled by default — enable with bench set-config server_script_enabled true

CRITICAL: Sandbox Limitations

ALL IMPORTS BLOCKED — RestrictedPython sandbox
  import json          → ImportError: __import__ not found
  from frappe.utils    → ImportError
  import requests      → ImportError

SOLUTION: Use pre-loaded namespace:
  frappe.utils.nowdate()        frappe.utils.flt()
  frappe.parse_json(data)       json.loads() (json IS available)
  frappe.as_json(obj)           json.dumps()
  frappe.make_get_request(url)  (replaces requests.get)

Rule: If you need import statements beyond json, ALWAYS use a Controller instead.

Workflow 1: Create a Server Script

  1. Enable server scripts: bench set-config server_script_enabled true
  2. Navigate to Setup > Server Script (or awesomebar: "New Server Script")
  3. Select Script Type (see decision tree below)
  4. Configure type-specific settings (DocType, event, API method, cron)
  5. Write script in the editor
  6. Save — script is active immediately
  7. Test by triggering the configured event
  8. Use "Compare Versions" button to diff changes

Workflow 2: Choose the Script Type

WHAT DO YOU NEED?
│
├── React to document save/submit/cancel?
│   └── Document Event
│       └── Select DocType + Event (Before Save, After Save, etc.)
│
├── Create a REST API endpoint?
│   └── API
│       └── Set method name + guest access setting
│       └── Endpoint: /api/method/{method_name}
│
├── Run task on schedule (daily/hourly/cron)?
│   └── Scheduler Event
│       └── Set cron pattern or frequency
│
└── Filter list views per user/role?
    └── Permission Query
        └── Select DocType — set `conditions` variable

See references/decision-tree.md for complete decision tree.

Workflow 3: Document Event: Validation

Goal: Validate Sales Order before save.

Step 1: Choose event — "Before Save" maps to validate hook.

Step 2: Write sandbox-safe script:

python
# Type: Document Event | Event: Before Save | DocType: Sales Order

errors = []

if not doc.customer:
    errors.append("Customer is required")

if doc.delivery_date and doc.delivery_date < frappe.utils.today():
    errors.append("Delivery date cannot be in the past")

for item in doc.items:
    if item.qty <= 0:
        errors.append(f"Row {item.idx}: Quantity must be positive")

if errors:
    frappe.throw("<br>".join(errors), title="Validation Error")

Rules:

  • ALWAYS collect errors and throw once (better UX than multiple throws)
  • NEVER call doc.save() in Before Save — framework handles it
  • ALWAYS use frappe.throw() — msgprint does NOT stop save

Workflow 4: Document Event: Auto-Calculate

Goal: Auto-calculate totals and set derived fields.

python
# Type: Document Event | Event: Before Save | DocType: Purchase Order

doc.total_qty = sum(item.qty or 0 for item in doc.items)
doc.total_amount = sum((item.qty or 0) * (item.rate or 0) for item in doc.items)

if doc.total_amount > 50000:
    doc.requires_approval = 1
    doc.approval_status = "Pending"

if doc.supplier and not doc.supplier_name:
    doc.supplier_name = frappe.db.get_value("Supplier", doc.supplier, "supplier_name")

Rule: ALWAYS modify doc fields directly in Before Save — they are automatically persisted.

Goal: Create a ToDo when a new Lead is inserted.

python
# Type: Document Event | Event: After Insert | DocType: Lead

frappe.get_doc({
    "doctype": "ToDo",
    "allocated_to": doc.lead_owner or doc.owner,
    "reference_type": "Lead",
    "reference_name": doc.name,
    "description": f"Follow up with new lead: {doc.lead_name}",
    "date": frappe.utils.add_days(frappe.utils.today(), 1),
    "priority": "High" if doc.status == "Hot" else "Medium"
}).insert(ignore_permissions=True)

Rules:

  • ALWAYS use After Insert or After Save for creating related docs
  • NEVER create documents in Before Save — doc.name may not exist yet
  • ALWAYS use ignore_permissions=True for system-generated documents

Workflow 6: API Endpoint

Goal: Create authenticated REST API returning customer data.

python
# Type: API | Method: get_customer_dashboard | Allow Guest: No
# Endpoint: /api/method/get_customer_dashboard

customer = frappe.form_dict.get("customer")
if not customer:
    frappe.throw("Parameter 'customer' is required")

# ALWAYS check permissions
if not frappe.has_permission("Customer", "read", customer):
    frappe.throw("Access denied", frappe.PermissionError)

orders = frappe.db.count("Sales Order", {"customer": customer, "docstatus": 1})
revenue = frappe.db.get_value("Sales Invoice",
    filters={"customer": customer, "docstatus": 1},
    fieldname="sum(grand_total)") or 0

frappe.response["message"] = {
    "customer": customer,
    "total_orders": orders,
    "total_revenue": revenue
}

Rules:

  • ALWAYS validate input parameters
  • ALWAYS check permissions (even with Allow Guest: No)
  • ALWAYS cap query limits: min(frappe.utils.cint(limit), 100)
  • NEVER expose full documents — return only needed fields

Workflow 7: Scheduler Event

Goal: Daily reminder for overdue invoices.

python
# Type: Scheduler Event | Cron: 0 9 * * * (daily at 9:00)

BATCH_SIZE = 50
today = frappe.utils.today()

overdue = frappe.get_all("Sales Invoice",
    filters={
        "status": "Unpaid",
        "due_date": ["<", today],
        "docstatus": 1
    },
    fields=["name", "customer", "owner", "due_date", "grand_total"],
    limit=BATCH_SIZE
)

for inv in overdue:
    days = frappe.utils.date_diff(today, inv.due_date)
    if not frappe.db.exists("ToDo", {
        "reference_type": "Sales Invoice",
        "reference_name": inv.name,
        "status": "Open"
    }):
        frappe.get_doc({
            "doctype": "ToDo",
            "allocated_to": inv.owner,
            "reference_type": "Sales Invoice",
            "reference_name": inv.name,
            "description": f"Invoice {inv.name} is {days} days overdue"
        }).insert(ignore_permissions=True)

frappe.db.commit()  # REQUIRED in scheduler scripts

Rules:

  • ALWAYS add frappe.db.commit() at end of scheduler scripts
  • ALWAYS add limit to queries — prevent memory exhaustion
  • ALWAYS use try/except + frappe.log_error() in loops
  • NEVER run scheduler scripts that process unlimited records

Workflow 8: Permission Query

Goal: Users see only their territory's customers.

python
# Type: Permission Query | DocType: Customer

user_territory = frappe.db.get_value("User", user, "territory")
user_roles = frappe.get_roles(user)

if "System Manager" in user_roles:
    conditions = ""  # Full access
elif user_territory:
    conditions = f"`tabCustomer`.territory = {frappe.db.escape(user_territory)}"
else:
    conditions = f"`tabCustomer`.owner = {frappe.db.escape(user)}"

Rules:

  • ALWAYS give System Manager full access (conditions = "")
  • ALWAYS use frappe.db.escape() for user input in SQL
  • ALWAYS set conditions variable — it is the output
  • Permission Query only affects frappe.db.get_list, NOT frappe.db.get_all
Show full SKILL.md (219 more words)Show less

Event Name Mapping

UI NameInternal HookBest For
Before Validatebefore_validatePre-validation defaults
Before SavevalidateValidation + calculations (MOST COMMON)
After Saveon_updateNotifications, audit logs
After Insertafter_insertCreate related docs (new only)
Before Submitbefore_submitSubmit-time validation
After Submiton_submitPost-submit automation
Before Cancelbefore_cancelCancel prevention
After Cancelon_cancelCleanup after cancel
Before Deleteon_trashDelete prevention

Sandbox-Safe API Quick Reference

NeedUse (NOT import)
Parse JSONfrappe.parse_json() or json.loads()
Serialize JSONfrappe.as_json() or json.dumps()
Today's datefrappe.utils.today()
Now (datetime)frappe.utils.now()
Add daysfrappe.utils.add_days(date, n)
Date difffrappe.utils.date_diff(d1, d2)
Float conversionfrappe.utils.flt(val)
Int conversionfrappe.utils.cint(val)
HTTP GETfrappe.make_get_request(url)
HTTP POSTfrappe.make_post_request(url, data)
Render templatefrappe.render_template(tmpl, ctx)
Log errorfrappe.log_error(msg, title)
Send emailfrappe.sendmail(recipients, subject, message)

When to Migrate to Controller

ALWAYS migrate to a Document Controller when:

  • You need import statements (beyond json)
  • Script exceeds 100 lines
  • You need try/except with rollback
  • You need frappe.enqueue() for background jobs
  • You need to extend an existing ERPNext DocType
  • Multiple scripts on same DocType become hard to manage

Migration path: See frappe-impl-controllers for controller implementation.

  • frappe-syntax-serverscripts — Exact sandbox API reference
  • frappe-errors-serverscripts — Error handling and anti-patterns
  • frappe-core-database — frappe.db.* operations
  • frappe-core-permissions — Permission system details
  • frappe-impl-controllers — When to migrate from Server Script

See references/decision-tree.md for complete decision trees. See references/workflows.md for extended patterns. See references/examples.md for 10+ complete examples.

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

Files

SKILL.md and 4 other files (references) in skills/source/impl/frappe-impl-serverscripts of Impertio-Studio/Frappe_Claude_Skill_Package.

  • SKILL.md
  • references/anti-patterns.md
  • references/decision-tree.md
  • references/examples.md
  • references/workflows.md

Open the folder on GitHubat commit 36cfa80

Compare with similar skills

Frappe Impl Serverscripts 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.

Frappe Impl Serverscripts compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Frappe Impl Serverscripts this skillImpertio-Studio/Frappe_Claude_Skill_Package187—~2.6kAutomated safety check: PassMIT
N8n Workflow Patternsdavila7/claude-code-templates32k1 repos~2.8kAutomated safety check: PassMIT
Clickupsundial-org/awesome-openclaw-skills663—~1.6kAutomated safety check: PassNone
Paperclipaiskillstore/marketplace430—~8.9kAutomated safety check: PassNone
Superset Automatesuperset-sh/superset15k—~1.4kAutomated safety check: PassCustom licence
Task Manager0xranx/golembot323—~694Automated safety check: PassMIT

Similar skills

  • N8n Workflow Patterns

    davila7/claude-code-templates

    Proven workflow architectural patterns from real n8n workflows.

    32k GitHub starsUsed in 1 repo~2.8k tokens
    Productivity & AutomationAuto-check passed
  • Clickup

    sundial-org/awesome-openclaw-skills

    Interact with ClickUp project management platform via REST API.

    663 GitHub stars~1.6k tokensUpdated 7 mo ago
    Productivity & AutomationAuto-check passed
  • Paperclip

    aiskillstore/marketplace

    Interact with the Paperclip control plane API to manage tasks, coordinate with other agents, and follow company governance.

    430 GitHub stars~8.9k tokensUpdated today
    Productivity & AutomationAuto-check passed
  • Superset Automate

    superset-sh/superset

    Turns a recurring chore into a scheduled or event-triggered Superset agent, drafting its prompt, picking a target and trigger, and reviewing the first run.

    15k GitHub stars~1.4k tokensUpdated today
    Productivity & AutomationAuto-check passed
  • Task Manager

    0xranx/golembot

    Creates and manages scheduled tasks, cron jobs, recurring reminders, and timers via the Task HTTP API.

    323 GitHub stars~694 tokensUpdated 9 days ago
    Productivity & AutomationAuto-check passed
  • AI Automation Workflows

    NeverSight/learn-skills.dev

    Build automated AI workflows combining multiple models and services.

    216 GitHub starsUsed in 1 repo~2.6k tokens
    Productivity & AutomationAuto-check passed

More from Impertio-Studio/Frappe_Claude_Skill_Package

All 61 skills in this repo
  • Frappe Agent Interpreter

    Impertio-Studio/Frappe_Claude_Skill_Package

    A skill your agent uses when receiving vague or unclear ERPNext/Frappe development requests that need interpretation.

    187 GitHub starsUsed in 1 repo~3.2k tokens
    Auto-check passed
  • Frappe Ops Website Deploy

    Impertio-Studio/Frappe_Claude_Skill_Package

    Deploy HTML/CSS websites to ERPNext/Frappe (v15/v16) as Web Pages via the REST API.

    187 GitHub stars~2.5k tokensUpdated 20 days ago
    Auto-check passed
  • Frappe Core API

    Impertio-Studio/Frappe_Claude_Skill_Package

    A skill your agent uses when building ERPNext/Frappe API integrations (v14/v15/v16) including REST API, RPC API, authentication, webhooks, and rate limiting.

    187 GitHub starsUsed in 1 repo~3.2k tokens
    Auto-check passed
  • Frappe Errors API

    Impertio-Studio/Frappe_Claude_Skill_Package

    A skill your agent uses when debugging or handling API errors in Frappe/ERPNext v14/v15/v16.

    187 GitHub starsUsed in 1 repo~4k tokens
    Auto-check passed
  • Frappe Impl Hooks

    Impertio-Studio/Frappe_Claude_Skill_Package

    A skill your agent uses when implementing hooks.py configurations in a Frappe custom app.

    187 GitHub starsUsed in 1 repo~3k tokens
    Auto-check passed
  • Frappe Impl Whitelisted

    Impertio-Studio/Frappe_Claude_Skill_Package

    A skill your agent uses when building API endpoints with @frappe.whitelist() in Frappe.

    187 GitHub starsUsed in 1 repo~3.1k tokens
    Auto-check passed

Questions about Frappe Impl Serverscripts

What does Frappe Impl Serverscripts do?

A skill your agent uses when implementing server-side features via Setup Server Script: document validation, auto-fill, API endpoints, scheduled tasks, permission queries. Frappe Impl Serverscripts is an agent skill from Impertio-Studio/Frappe_Claude_Skill_Package. Use when implementing server-side features via Setup Server Script: document validation, auto-fill, API endpoints, scheduled tasks, permission queries.

When should I use Frappe Impl Serverscripts?

Frappe Impl Serverscripts fits situations like: implementing server-side features via Setup Server Script: document validation; scheduled tasks; permission queries.

How do I install Frappe Impl Serverscripts in Claude Code?

Run `npx skills add Impertio-Studio/Frappe_Claude_Skill_Package --skill frappe-impl-serverscripts -a claude-code`. Or copy the skill folder (skills/source/impl/frappe-impl-serverscripts in Impertio-Studio/Frappe_Claude_Skill_Package) into .claude/skills/frappe-impl-serverscripts in your project. Claude Code loads it when a task matches its description.

How do I install Frappe Impl Serverscripts in Codex?

Run `npx skills add Impertio-Studio/Frappe_Claude_Skill_Package --skill frappe-impl-serverscripts -a codex`. Or copy the skill folder (skills/source/impl/frappe-impl-serverscripts in Impertio-Studio/Frappe_Claude_Skill_Package) into .agents/skills/frappe-impl-serverscripts in your project. Codex loads it when a task matches its description.

Can I use Frappe Impl Serverscripts 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 Impertio-Studio/Frappe_Claude_Skill_Package --skill frappe-impl-serverscripts -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/frappe-impl-serverscripts, .gemini/skills/frappe-impl-serverscripts, .github/skills/frappe-impl-serverscripts and .opencode/skills/frappe-impl-serverscripts in your project.

What does Frappe Impl Serverscripts need to run?

SKILL.md names no scripts, command-line tools or credentials: Frappe Impl Serverscripts is instructions for the agent only. Our summary lists: Python 3. Compatibility (from SKILL.md): Claude Code, Claude.ai Projects, Claude API. Frappe v14-v16..

Does Frappe Impl Serverscripts access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Frappe Impl Serverscripts 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 Frappe Impl Serverscripts use?

Frappe Impl Serverscripts is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Frappe Impl Serverscripts use?

About 2.6k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 7.6k tokens, read only when the agent opens those files.

What are the alternatives to Frappe Impl Serverscripts?

Skills that share tags, products or a category with Frappe Impl Serverscripts: N8n Workflow Patterns (davila7/claude-code-templates, 32k stars), Clickup (sundial-org/awesome-openclaw-skills, 663 stars), Paperclip (aiskillstore/marketplace, 430 stars) and Superset Automate (superset-sh/superset, 15k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Frappe Impl Serverscripts?

Impertio-Studio (a GitHub organization) maintains it in Impertio-Studio/Frappe_Claude_Skill_Package, which has 187 GitHub stars. The repository holds 61 skills in this directory. The repository was last updated on September 17, 2026.

Source: Impertio-Studio/Frappe_Claude_Skill_Package on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.