WorkshopSkill activity folders

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.