skill tutorial · agent
Build your own agent on the skill index
The site was designed agent-first: one JSON index, one zip per skill, hashes to verify, commands that run as printed. If you are writing your own agent — internal tool, classroom bot, automation — this is the whole integration surface, no SDK.
The contract
GET https://workshopskill.com/en/skills.json
{ "name": "blind-portrait", "description": "A 15-minute, 2-person back-to-back drawing...", "version": "1.1.0", "updated": "2026-10-07", "category": "communication", "group_size": "2", "duration_minutes": "15", "setting": "offline", "depth": "assessment-type", "page_url": "https://workshopskill.com/en/activities/blind-portrait/", "skill_url": "https://workshopskill.com/en/activities/blind-portrait/files/SKILL.md", "bundle_url": "https://workshopskill.com/en/activities/blind-portrait/files/blind-portrait.zip", "bundle_sha256": "6c4c..." }
Match, then fetch
python — filter and verify
import json, urllib.request, hashlib, io, zipfile IDX = "https://workshopskill.com/en/skills.json" brief = {"category": "communication", "minutes": 15, "people": 2} c = json.load(urllib.request.urlopen(IDX)) hits = [s for s in c["skills"] if s["category"] == brief["category"] and int(s["duration_minutes"]) <= brief["minutes"]] s = hits[0] raw = urllib.request.urlopen(s["bundle_url"]).read() assert hashlib.sha256(raw).hexdigest() == s["bundle_sha256"], "bundle changed" z = zipfile.ZipFile(io.BytesIO(raw)) # z.read("blind-portrait/SKILL.md") print(z.namelist())
Give the LLM the skill, not the site
The system prompt carries the loop: match the user's brief against the index; fetch the chosen bundle; follow SKILL.md's steps; ask before any step that touches an account
. Parse the frontmatter (tiny YAML) for the fields; the markdown body is the runbook. Verification is one sha256 line — worth keeping even in prototypes, because the folder is the promise: what your agent prints matches what a human downloads.
The live-measure boundary
Assessment-type skills end with a formlm-cli generate step whose spec is assessment.json inside the bundle. In your own agent, treat that as a tool call with consent: hand the human the login, or run where a session exists; otherwise emit the paper form (the bundles include the printable answer sheet) and keep the delta math in the report.
keep going
questions
Is the JSON layer stable?
Fields are additive; names that shipped keep shipping. The updated/version fields exist precisely so clients can diff.
Rate limits, auth, keys?
None, for index, bundles and files: static HTTPS, anonymous. Be polite; cache.
Can I resell or wrap this into a paid product?
CC BY 4.0 covers redistribution and remix with attribution; check each activity's license.md for the plain-language boundary, and see the remix walkthrough.