AI-agnostic skills API

FSA-API treats the open Agent Skills package as its interchange format: a directory containing SKILL.md with YAML frontmatter, plus optional scripts, references, and assets. Provider behavior is declared in config/agent-skills.yml, so adding another AI normally requires configuration, not a new code path.

Trust boundary

The API discovers, validates, inspects, and copies skill packages. It never executes a skill or any bundled script. A skill can contain operational instructions and executable code, so installation is an authenticated, explicit operation and defaults to a dry run.

Validation confines reads and writes to configured workspace-relative roots, rejects symlinks by default, limits package file count and total size, parses frontmatter with yaml.safe_load, and checks the portable Agent Skills naming and metadata rules.

Provider registry

The default registry includes:

Provider IDDiscoveryExport
agents.agents/skills.agents/skills
codex.agents/skills, .codex/skills.codex/skills
claude.agents/skills, .claude/skills.claude/skills
copilot.agents/skills, .github/skills, .claude/skills.github/skills
gemini.agents/skills, .gemini/skills.gemini/skills
ona.ona/skills legacy Markdown.ona/skills legacy Markdown

The Ona entry preserves compatibility with this repository's existing flat Markdown skills. Those files can be projected into a standard package by installing them for a package-based provider. A standard-to-legacy export copies only SKILL.md; the response warns when the source also contains resources. Prefer the canonical .agents/skills location when multiple agents share a workspace.

To add another provider, add a unique ID with format, discovery_paths, and export_path. Supported formats are agent-skills and legacy-markdown. Every path must also appear under policy.allowed_roots.

HTTP routes

GET  /api/fsa/skills
GET  /api/fsa/skills/providers
GET  /api/fsa/skills/:name
POST /api/fsa/skills/validate
POST /api/fsa/skills/export

Examples:

curl -sS http://localhost:8090/api/fsa/skills?provider=codex

curl -sS -X POST http://localhost:8090/api/fsa/skills/validate \
  -H "Authorization: Bearer $FSA_AUTH" \
  -H "Content-Type: application/json" \
  -d '{"path":".agents/skills/example"}'

# Preview only; no files are changed.
curl -sS -X POST http://localhost:8090/api/fsa/skills/export \
  -H "Authorization: Bearer $FSA_AUTH" \
  -H "Content-Type: application/json" \
  -d '{"name":"example","provider":"claude","dry_run":true}'

The same engine can be run locally:

python3 scripts/agent-skills.py providers
python3 scripts/agent-skills.py list --provider all
python3 scripts/agent-skills.py validate .agents/skills/example
python3 scripts/agent-skills.py export example claude
python3 scripts/agent-skills.py export example claude --materialize

Scope

“AI-agnostic” means the core is provider-neutral and the provider registry is extensible. It does not imply that every AI product can consume every resource or tool declaration identically. The validation response retains standard metadata, while provider-specific installation remains an adapter concern.