Skip to main content
Use this cookbook to publish a reusable Skill, retrieve a known version, and inspect how it is used. It covers direct API publishing and supported repository automation.

Sync a repository from GitHub

Use Atlan SkillSync when Git should remain the source of truth for several skills. The GitHub Action posts a read-only impact report on pull requests, then publishes approved additions and updates from a protected branch. The current flow requires destination workspace IDs in .atlan/package.json and a repository secret named ATLANAI_TOKEN. The preflight workflow receives neither that secret nor checked-out pull request code.

Set up GitHub SkillSync

Add the manifest, repository secret, pull request preflight, and protected-branch publish workflow.

Publish a Skill

Preview. Start with a disposable workspace and an approved canonical sample bundle. This direct API recipe uses the current multipart contract; it does not define a new Skill package format.
The API is not the shortest path here. atlanai skill publish does the bundling, the multipart request, and the version check in one command — see Publish skills with the CLI. To publish on merge, use the SkillSync Action. Use this cookbook when you are building the request yourself because there is no CLI on the host, the language is unsupported, or the CLI does not expose the operation.

Publish a Skill

Prepare a ZIP bundle with SKILL.md at its root and only the supporting files the Skill needs. The metadata multipart part carries the Skill name, optional description, and target workspace. The body part carries the ZIP.
SKILL.md opens with YAML front matter carrying name and description. These describe the Skill to the runtime that loads it, and are required in addition to the metadata part, which addresses the Skill in the Registry. A bundle without front matter returns 422 validation_failed.
SKILL.md
Or with the SDK — see Install:
metadata and items are multipart parts rather than a request body, so pass them as JSON strings in both languages. Their keys stay snake_case, since the string is JSON you build yourself rather than an object the client serialises for you.
Do not include tokens, customer data, or private source material in the bundle. A Skill with the same name in the same workspace receives a new version when its content changes; identical content does not create a duplicate. The response identifies the Skill and its current version. Preserve those values in your deployment record rather than finding the Skill again by name.

Bulk-create Skills

Use the bulk endpoint when an application needs to create a one-time batch of new skill bundles. It accepts at most 100 items. Each item in the items JSON array supplies the same metadata used for one Skill and a body_part name. The multipart request includes a ZIP body under each of those names.
Preview. A bulk response is 207 Multi-Status, even when some items were created. Read every returned item instead of treating the HTTP status alone as a successful import.
With the SDK, items is the same JSON string, and each body_part name becomes its own multipart part:
The response items array follows the request order. A 201 item includes the created skill. A rejected item includes its own status and problem document; successful items are not rolled back. For a duplicate-content rejection, the problem can include existing_artifact_id, which identifies the skill that already holds that content. Use the returned IDs to inspect every created skill and record failed item indexes for a corrected retry. Do not resubmit a whole batch until you know which items were created.

Find a Skill

Search takes the query in the body, so it is a POST:
With the SDK:
All 17 skill operations are in the skill operations reference. From the CLI, atlanai skill list and atlanai search cover the same ground in one command — see the skills guide. For an agent doing this itself, use registry__search.

Retrieve a version

Use the current Skill when you need the latest maintained package. Use a pinned version when an environment needs reproducible content. Verify that the selected version contains the files your consuming environment expects. Read a specific version’s metadata before downloading it:
The bundle response is application/zip, not JSON. Compare the downloaded package with the source bundle before a consuming environment uses it. With the SDK, both bundle operations return raw bytes, so write them straight to a file or read them in memory:
skill_get_version_enriched returns the version’s metadata and file manifest; the bundle operations return the archive itself. Check the content type before writing the bytes to a file — a problem response would otherwise be saved as a corrupt archive.
From JavaScript, read the response as bytes and assert the content type before writing the file — a JSON problem body would otherwise be saved as a corrupt archive:

Publish a content change

Upload an updated ZIP to publish updated Skill content. Use the version-specific read or bundle actions in the Skill API category to verify that a consumer will receive the intended version. Use the same category when only a name or description needs to change.

Inspect usage

After publication, find out whether the Skill is actually being used and how well it performs.
Aggregate rather than paging when you want totals over a window. The query goes in the body:
With the SDK. The stats request needs an explicit window and at least one named query, and each query’s measure comes from a fixed set:
request_type is scalar, table, or time_series. measure is one of sessions, traces, spans, skill_invocations, tool_calls, tokens, active_users, error_rate, success_rate, tokens_per_trace, cost, latency_p50, latency_p90, or latency_p99. Traces only appear here if the consuming runtime reports them. If a Skill you know is in use shows nothing, the gap is instrumentation, not the Skill — see the tracing SDKs or the Claude Code trace plugin. From the CLI, atlanai skill runs and atlanai trace cover the same ground — see the traces guide.

Publish with the CLI

One command instead of a multipart request.

Publish from GitHub

Publish on merge from a protected branch.

Discover and use a skill

Reviewing a Skill before use.

Agents cookbook

Register an Agent and record its runs.