Skip to content

agentoperations/agent-registry

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Agent Registry

A vendor-neutral, agent-framework-agnostic registry for AI agents, skills, and MCP servers.

Built on open standards: A2A AgentCard for agents, MCP server.json for MCP servers, and Agent Skills for skills.

Stores metadata alongside OCI registries. Accepts evaluation signals from external tools. Enforces a promotion lifecycle. Works with any agent framework. Does not store binaries or compute trust scores.

Architecture

Quick Start

go build -o agentctl ./cmd/agentctl
./agentctl server start
open http://localhost:8080

Demo

Demo

Full narrated walkthrough (2 min)

Presentation

Slide deck covering the problem, architecture, and workflow:

View presentation

Web UI

The server embeds a catalog UI at the root URL. Browse artifacts by kind, filter by status, search across all kinds, and click through to see identity, OCI references, eval records, promotion history, and resolved dependencies.

Catalog view

Detail panel — eval records, promotion history, dependencies

How It Works

You build an agent        agentctl does the rest            Others find it
──────────────────        ────────────────────              ──────────────

docker push image    ──>  agentctl push agents card.json    agentctl search "k8s"
                          --namespace acme                  agentctl inspect ...
                          --oci ghcr.io/acme/agent:1.0      agentctl deps ...
                          (draft — private, mutable)        agentctl get ... --format a2a

                 or  ──>  agentctl init --path .            # import from a running agent
                          (LLM generates AgentCard)         agentctl import --from-a2a \
                                                              https://agent/.well-known/agent-card.json
                     ──>  agentctl eval attach ...
                          (external tools submit results)   # export for deployment
                                                            agentctl get agents acme/x 1.0 \
                     ──>  agentctl promote --to evaluated     --format a2a > agent-card.json
                     ──>  agentctl promote --to approved    # serve at /.well-known/agent-card.json
                     ──>  agentctl promote --to published

Standards-based identity

Each artifact kind uses an open standard as its native identity format. The registry wraps it with governance.

Kind Standard What it carries What the registry adds
Agent A2A AgentCard Name, version, skills, capabilities, security, signatures BOM, evals, promotion, provenance, trust
MCP Server MCP server.json Name, version, packages, transport BOM, evals, promotion, provenance, trust
Skill Agent Skills (SKILL.md) Name, description, instructions BOM, evals, promotion, provenance, trust

Step by step

Push a standard document directly. Pass an A2A AgentCard, MCP server.json, or SKILL.md with --namespace and --oci. The registry extracts identity from the standard doc.

agentctl push agents agent-card.json \
    --namespace acme --oci ghcr.io/acme/my-agent:1.0.0

Or generate one. Point agentctl init at your project. An LLM scans source code, Dockerfile, dependencies, and README to produce a manifest. No manual YAML writing.

agentctl config set init.provider openai
agentctl config set init.model gpt-4o-mini
agentctl init --path ./my-agent --image ghcr.io/acme/my-agent:1.0.0 -o manifest.yaml

Works with Anthropic (Messages API), OpenAI (Chat Completions, Responses API), or any compatible endpoint (Ollama, vLLM, LiteLLM) via --base-url.

Or use a full registry manifest. The legacy YAML format still works.

agentctl push agents manifest.yaml

Attach eval records (optional). The registry stores results from external tools. It does not run evaluations.

agentctl eval attach agents acme/my-agent 1.0.0 \
    --category safety --provider garak --benchmark toxicity --score 0.96

Promote. Each step is a valid transition. Content becomes immutable after evaluated.

agentctl promote agents acme/my-agent 1.0.0 --to evaluated
agentctl promote agents acme/my-agent 1.0.0 --to approved
agentctl promote agents acme/my-agent 1.0.0 --to published

Discover, inspect, deploy.

agentctl search "kubernetes diagnostics"
agentctl inspect agents acme/my-agent 1.0.0
agentctl deps agents acme/my-agent 1.0.0
agentctl get agents acme/my-agent 1.0.0   # read OCI ref, then docker pull

CLI

agentctl config init                     Interactive LLM provider setup
agentctl config set <key> <value>        Set config value
agentctl config show                     Show config

agentctl init -p ./project -o out.yaml   Generate manifest from code (LLM)
agentctl push <kind> <file>              Register artifact (draft)
agentctl push <kind> <file> --namespace <ns> --oci <ref>   Push standard doc (AgentCard, server.json, SKILL.md)
agentctl get <kind> <name> [version] [--format a2a|server-json|skill-md]     Get artifact details
agentctl list <kind>                     List artifacts
agentctl delete <kind> <name> <version>  Delete draft
agentctl promote <kind> <name> <ver> --to <status>
agentctl eval attach <kind> <name> <ver> --category --provider --benchmark --score
agentctl eval list <kind> <name> <ver>
agentctl inspect <kind> <name> <ver>     Status + evals + promotion history
agentctl deps <kind> <name> <ver>        Dependency graph from BOM
agentctl search <query>                  Full-text search across all kinds
agentctl import --from-a2a <url> --namespace --oci   Import agent from A2A AgentCard URL
agentctl server start [--port] [--db]    Start server (UI at /, API at /api/v1)

<kind> is agents, skills, or mcp-servers.

API

All under /api/v1. Responses wrapped in { "data": ..., "_meta": {...}, "pagination": {...} }. Errors follow RFC 7807.

Method Path
GET /{kind} List
POST /{kind} Create (draft)
GET /{kind}/{ns}/{name}/versions/{ver} Get
DELETE /{kind}/{ns}/{name}/versions/{ver} Delete (draft only)
POST /{kind}/{ns}/{name}/versions/{ver}/promote Promote
POST /{kind}/{ns}/{name}/versions/{ver}/evals Submit eval
GET /{kind}/{ns}/{name}/versions/{ver}/evals List evals
GET /{kind}/{ns}/{name}/versions/{ver}/inspect Inspect
GET /{kind}/{ns}/{name}/versions/{ver}/dependencies Deps
GET /{kind}/{ns}/{name}/versions/{ver}/export Export standard doc
GET /search?q=... Search
GET /ping Health

Deployment

Local

go build -o agentctl ./cmd/agentctl
./agentctl server start --port 8080
# API at http://localhost:8080/api/v1, UI at http://localhost:8080

Container

make image                    # build image (multi-stage, distroless runtime)
make image push               # build and push to quay.io

The image is quay.io/azaalouk/agent-registry. Override with IMAGE_REPO and IMAGE_TAG:

make image push IMAGE_REPO=quay.io/myorg IMAGE_TAG=v0.2.0

Kubernetes

make deploy OVERLAY=k8s

This creates a namespace agent-registry with a Deployment, Service, and health probes. Access via port-forward:

kubectl -n agent-registry port-forward svc/agent-registry 8080:8080
open http://localhost:8080

OpenShift

make deploy                   # OVERLAY=openshift is the default

This creates the namespace, Deployment, Service, and a TLS Route. Get the URL:

oc -n agent-registry get route agent-registry -o jsonpath='{.spec.host}'

The deployment runs as non-root with a read-only root filesystem, passes the restricted SCC without any grants.

Tear down

make undeploy                 # removes all resources

Makefile targets

Target Description
make build Compile binary locally
make image Build container image
make push Push to container registry
make deploy Create namespace and apply manifests
make undeploy Delete all deployed resources
make clean Remove local build artifacts

Project Layout

cmd/agentctl/       Entry point (thin — embeds UI, calls cli package)
cmd/server/         Standalone server entry point
internal/
  cli/              Cobra commands (HTTP calls + output formatting only)
  handler/          HTTP handlers (parse request, call service, write response)
  service/          Business logic (promotion state machine, BOM resolution)
  store/            Storage interface + SQLite (swappable to Postgres)
  model/            Go types matching spec schemas
  server/           Chi router, middleware, serves embedded UI
pkg/client/         HTTP client (used by CLI, usable by any Go program)
ui/index.html       Catalog UI (embedded in binary, served at /)
schemas/            JSON Schemas (spec source of truth)
api/openapi.yaml    OpenAPI 3.1 spec
deploy/
  Dockerfile        Multi-stage build (distroless runtime)
  k8s/base/         Deployment, Service, Kustomization
  k8s/overlays/     openshift (+ Route) and k8s overlays
Makefile            build, image, push, deploy, undeploy
scripts/            Demo setup/teardown scripts
docs/               Presentation, architecture diagrams, screenshots

Design

Standards for identity, registry for governance. Each artifact kind uses an open standard (A2A AgentCard, MCP server.json, Agent Skills) as its native identity and capability format. The registry wraps these with governance: promotion lifecycle, evaluation records, BOM, provenance, and trust signals. The standard document answers "what is this and how do I use it?" The registry answers "should I trust it, what does it depend on, and who says it's ready?"

Metadata, not payloads. The registry indexes OCI artifacts. Binary content stays in ghcr.io / quay.io / ECR.

Three artifact kinds share promotion lifecycle, eval records, and BOM. They differ in their standard identity document and BOM structure: agents declare models + tools + skills, skills declare tool requirements, MCP servers declare runtime dependencies + external services.

Evals are external signals. The registry accepts eval records from any tool (Garak, eval-hub, lm-eval-harness, custom CI). It does not run evaluations or compute trust scores. Trust scoring is a separate concern.

Promotion is a state machine. draft -> evaluated -> approved -> published -> deprecated -> archived. No hardcoded gates. Policy layers can be added externally.

Import and export. Push a standard document directly, or import from a URL (/.well-known/agent-card.json). Export the standard document for deployment with no governance wrapping.

CLI is a thin client. All logic is server-side. Any entry point (CLI, curl, UI, CI pipeline) behaves identically.

Store is swappable. SQLite for dev, Postgres for production. Implement the Store interface.

Config

~/.config/agentctl/config.yaml

AGENTCTL_SERVER       Registry URL (default http://localhost:8080)
ANTHROPIC_API_KEY     For init with Anthropic
OPENAI_API_KEY        For init with OpenAI

About

A vendor-neutral, agent-framework-agnostic registry for AI agents, skills, and MCP servers. Metadata store with evaluation signals, promotion lifecycle, and supply chain visibility.

Topics

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors