*** title: Agent Card Spec subtitle: Specification for the AGENT.md file format slug: agent-card-spec version: v1.0 date: 2026-03-09T00:00:00.000Z ------------------------------ ## Abstract An agent card is a UTF-8 encoded Markdown file with YAML frontmatter that serves as the public-facing documentation for an agent. It is purely descriptive — it communicates what an agent is and what it can do but does not drive any functional behavior (deployment, visibility, etc.), which remains the responsibility of `astropods.yml`. The file is named `AGENT.md` and lives at the root of the agent's project directory, alongside `astropods.yml`. It is submitted to the registry during `ast push`. ## Changelog | Version | Date | Changes | | ------- | ---------- | -------------- | | v1.0 | 2026-03-09 | Initial draft. | ## Conventions The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC 2119](https://www.rfc-editor.org/rfc/rfc2119). *** ## 1. File Format An agent card is a UTF-8 encoded Markdown file consisting of two parts: 1. **Frontmatter** — A YAML block delimited by `---` lines at the top of the file. Contains structured metadata for discovery and attribution. 2. **Body** — Free-form GitHub-Flavored Markdown (GFM) following the frontmatter. Contains human-readable documentation. Both parts are OPTIONAL. A valid agent card MAY be an empty file, a file with only frontmatter, or a file with only a Markdown body (no `---` delimiters). *** ## 2. Frontmatter Schema All frontmatter fields are OPTIONAL unless noted otherwise. ### 2.1 `description` | Property | Value | | ---------- | -------------- | | Type | string | | Required | OPTIONAL | | Max length | 200 characters | A short summary of the agent. Used for agent cards, sidebar display, and search results. SHOULD be a single sentence or short phrase. ```yaml --- description: "GitHub Issue Analyzer — ingests GitHub issues into a Neo4j knowledge graph" --- ``` When absent, the agent name is used as a fallback. This field replaces the deprecated `meta.description` in `astropods.yml`. Existing agents SHOULD migrate their description to the agent card frontmatter. ### 2.2 `tags` | Property | Value | | ----------- | --------- | | Type | string\[] | | Required | OPTIONAL | | Max entries | 10 | A list of category labels for discovery and filtering. Each entry MUST be a lowercase string using only letters, numbers, and hyphens. Tags that do not conform are normalized: whitespace is trimmed, characters are lowercased, spaces are converted to hyphens, and non-alphanumeric/non-hyphen characters are stripped. ```yaml --- tags: - analytics - data-processing - knowledge-graph --- ``` Implementations MUST reject the frontmatter if more than 10 tags are provided. This field replaces the deprecated `meta.tags` in `astropods.yml`. Existing agents SHOULD migrate their tags to the agent card frontmatter. ### 2.3 `authors` | Property | Value | | -------- | ------------------ | | Type | AgentCardAuthor\[] | | Required | OPTIONAL | A list of people or organizations who built the agent. #### AgentCardAuthor | Field | Type | Required | Description | | --------- | ------ | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------- | | `name` | string | **REQUIRED** | Display name of the author. | | `account` | string | OPTIONAL | Platform account handle. When present, clients SHOULD render it as a link to `/{account}`. Normalized to lowercase with whitespace trimmed. | ```yaml --- authors: - name: Jane Doe account: janedoe - name: Acme Corp account: acme - name: External Contributor --- ``` ### 2.4 `capabilities` | Property | Value | | ---------- | ------------------------ | | Type | string\[] | | Required | OPTIONAL | | Max length | 100 characters per entry | A list of high-level capabilities the agent provides. Each entry SHOULD be a concise verb phrase describing an action the agent performs. Unlike tags (broad categories), capabilities describe specific behaviors and are displayed on the agent's detail page. ```yaml --- capabilities: - Analyzes GitHub issues and extracts patterns - Builds and maintains a Neo4j knowledge graph - Answers natural-language queries about issue history --- ``` Implementations MUST truncate entries exceeding 100 characters silently. ### 2.5 `integrations` | Property | Value | | -------- | --------- | | Type | string\[] | | Required | OPTIONAL | A list of third-party services or platforms the agent connects to. Used to display brand icons and connection information on the agent's detail page. ```yaml --- integrations: - Jira - My Custom API --- ``` #### 2.5.1 Derivation Integrations are derived from two sources: the `integrations` section of `astropods.yml` (via `provider` fields) and the `integrations` frontmatter in `AGENT.md`. The platform MUST combine and deduplicate both sources for display. Use the agent card to declare integrations that cannot be inferred from the spec. #### 2.5.2 Matching Matching is case-insensitive. Each integration string is resolved against the known integrations registry by `id`, `name`, or `aliases`. Strings that do not match any known integration are displayed with a generic icon and the original text as a label. #### 2.5.3 Known Integrations Registry The platform maintains a registry of known integrations, each with an `id`, `name`, and optional `aliases`. See [Known Integrations](/known-integrations) for the full list. *** ## 3. Body The body is free-form GitHub-Flavored Markdown (GFM). There is no required structure, but authors SHOULD cover: * **Overview** — What the agent does and why it exists. * **Usage** — How to interact with the agent (APIs, protocols, chat, etc.). * **Limitations** — Known constraints, failure modes, or scope boundaries. * **Examples** — Sample interactions or outputs. *** ## 4. Normalization The following normalizations are applied during parsing: | Field | Rule | | ------------------- | ----------------------------------------------------------------------------------------- | | `description` | Truncated to 200 characters (rune-aware). | | `tags` | Lowercased, spaces converted to hyphens, non-alphanumeric/non-hyphen characters stripped. | | `authors[].account` | Trimmed and lowercased. | | `capabilities[]` | Truncated to 100 characters per entry (rune-aware). | | `integrations[]` | Resolved against known integrations registry (see Section 2.5.2). | *** ## 5. Registration Flow During `ast push`, the CLI: 1. Reads `AGENT.md` from the project root (if present). 2. Submits the raw file content as the `readme` field in the registration payload. The CLI does not parse the frontmatter. The server: 1. Receives the raw agent card content. 2. Parses the YAML frontmatter to extract structured metadata. 3. Resolves integrations by merging spec-derived and card-declared integrations (Section 2.5.1). 4. Stores both the raw content and the parsed metadata (as JSON) for efficient reads. ### 5.1 Legacy Compatibility Existing agents without an `AGENT.md` continue to work. For agents using the deprecated `meta.description` and `meta.tags` fields in `astropods.yml`, the server synthesizes an agent card from those fields as a fallback. *** ## 6. Client Display The client renders the agent card on the agent detail page: * **Frontmatter metadata** is displayed in structured UI elements (author links, capability badges, integration icons). * **Integrations** are rendered as brand icons (known) or generic icons with labels (unknown). * **Body** is rendered as styled Markdown. * **Description** is displayed in sidebars, cards, and search results. Falls back to the agent name if absent. *** ## Appendix A: Example ```yaml AGENT.md --- description: "GitHub Issue Analyzer — ingests GitHub issues into a Neo4j knowledge graph" tags: - analytics - knowledge-graph authors: - name: Jane Doe account: janedoe - name: Bob Smith capabilities: - Analyzes GitHub issues and extracts patterns - Builds and maintains a Neo4j knowledge graph - Answers natural-language queries about issue history integrations: - Jira - My Custom Webhook --- # GitHub Issue Analyzer This agent ingests GitHub issues into a Neo4j knowledge graph and provides natural-language querying over the resulting data. ## How It Works 1. Connect your GitHub repository via the `GITHUB_TOKEN` input. 2. The agent polls for new issues on a configurable schedule. 3. Each issue is analyzed using an LLM to extract entities and relationships. 4. Results are stored in Neo4j and queryable via the agent's chat interface. ## Limitations - Only processes issue bodies and comments; PR reviews are not yet supported. - Large repositories (>10k issues) may require extended initial ingestion time. ```