Spec Kit Integration Catalog
The integration catalog enables discovery, versioning, and distribution of AI agent integrations for Spec Kit.
Catalog Files
Built-In Catalog (integrations/catalog.json)
Contains integrations that ship with Spec Kit. These are maintained by the core team and always installable.
Community Catalog (integrations/catalog.community.json)
Community-contributed integrations. The default community source is discovery-only: listing an adapter is neither installation permission nor a code audit. Review external code before using an install-enabled catalog.
Catalog Configuration
The first configured layer replaces lower layers. Within that layer, lower numeric priority wins:
- Environment variable —
SPECKIT_INTEGRATION_CATALOG_URLoverrides all catalogs with a single URL - Project config —
.specify/integration-catalogs.ymlin the project root - User config —
~/.specify/integration-catalogs.ymlin the user home directory - Built-in defaults —
catalog.json+catalog.community.json
Adding the first project catalog replaces the default sources unless you also list them in the project file. See Catalogs for shared discovery, trust, and private-source guidance.
Example integration-catalogs.yml:
catalogs:
- url: "https://example.com/my-catalog.json"
name: "my-catalog"
priority: 1
install_allowed: true
CLI Commands
Browse with specify integration list --catalog, search, and info.
See the CLI reference for catalog management
and external adapter installation.
Integration Descriptor (integration.yml)
Each external integration package includes an adapter-only integration.yml
descriptor and a root __init__.py exporting an IntegrationBase subclass.
No command inventory or copied core templates are needed:
schema_version: "1.0"
integration:
id: "sample-agent"
name: "Sample Agent"
version: "1.0.0"
description: "Adapter for Sample Agent"
license: "MIT"
requires:
speckit_version: ">=1.1.2.dev0"
tools:
- name: "sample-agent"
required: true
Required descriptor fields:
| Field | Validation |
|---|---|
schema_version |
Must be the string "1.0" |
integration.id |
External IDs must match ^[a-z0-9][a-z0-9-]*$. Names con, prn, aux, nul, com1 through com9, and lpt1 through lpt9 are reserved |
integration.name, integration.description |
Must be strings |
integration.version |
Must be a PEP 440 version string |
requires.speckit_version |
Mandatory, non-empty PEP 440 version specifier string |
requires.tools is optional; omit it for adapters with no required executable.
Optional legacy provides metadata remains valid but does not supply host
commands. See integration design
for class metadata, runtime methods, tools, and storage requirements.
Catalog Schema
Both catalog files follow the same JSON schema:
{
"schema_version": "1.0",
"updated_at": "2026-04-08T00:00:00Z",
"catalog_url": "https://...",
"integrations": {
"sample-agent": {
"id": "sample-agent",
"name": "Sample Agent",
"version": "1.0.0",
"description": "Adapter for Sample Agent",
"download_url": "https://example.com/sample-agent/1.0.0/sample-agent.zip",
"tags": ["cli"]
}
}
}
Top-Level Fields
| Field | Type | Description |
|---|---|---|
schema_version |
string | Must be "1.0" |
updated_at |
string | Optional ISO 8601 timestamp |
integrations |
object | Map of integration ID → metadata |
Integration Entry Fields
| Field | Type | Required | Description |
|---|---|---|---|
id |
string | No | Optional explicit ID; must match the map key |
name |
string | Yes | Human-readable display name |
version |
string | Yes | PEP 440 version (e.g., 1.0.0, 1.0.0a1) |
description |
string | Yes | One-line description |
author |
string | No | Author name or organization |
repository |
string | No | Source repository URL |
license |
string | No | License identifier matching the descriptor |
tags |
array | No | Searchable tags (e.g., ["cli", "ide"]) |
download_url |
string | External installs | Pinned ZIP, tar.gz, or tgz archive URL; HTTPS or loopback HTTP |
sha256 |
string | No | 64-character hexadecimal SHA-256 of the archive |
requires |
object | No | Must match descriptor requirements when supplied |
releases |
object | No | Historical version metadata; not installable releases |
The map key and any declared id must match integration.id. Name, version,
description, and optional author/repository/license metadata must match the
descriptor. Built-in entries need no download fields because their
implementations ship with the CLI.
Installation Policy and Storage
Registering a catalog with integration catalog add creates an install-enabled
project source. Set install_allowed: false in its configuration to permit
discovery only. This policy cannot be overridden with --trust-integration or
--force. Each external install/update prompts before downloading/importing
Python unless explicitly pre-authorized with --trust-integration.
Authenticated GitHub assets use the existing Spec Kit authentication providers.
Installed code is stored in .specify/integrations/packages/<id>/ with
provenance and hashes in packages.json; both are excluded by the managed
.specify/.gitignore. Execution consent is stored separately in
~/.specify/integration-trust.json, bound to the project, integration ID, and
verified package digest. Generated files have their own hash-tracked
<id>.manifest.json.
Do not edit installed package code in place: publish a new archive/version and upgrade instead. See the CLI reference for trust and reauthorization and upgrade and recovery.
Contributing
See the contribution guide for adding built-in integrations or submitting external integration catalog entries. For agent-specific setup, start with the integration directory. Shared user-facing commands are documented in the integration management reference.