Einen Agent-Plugin-Marktplatz erstellen
Zentraler Tool-Store: Agent-Plugins veröffentlichen, bewerten und verteilen.
Einen Agent-Plugin-Marktplatz erstellen ist eine kostenlose AI Agents-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Agents-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.
Was ist ein Agent-Plugin-Marktplatz?
Ein Plugin-Marktplatz ist eine zentrale Registry, in der Entwickler gemeinsam nutzbare Tools veröffentlichen, andere Entwickler sie über die Suche entdecken und Agent-Systeme sie automatisch installieren. Stellen Sie sich npm für Agent-Tools vor: einmal veröffentlichen, überall verwenden.
Marktplatzarchitektur
Der Marktplatz umfasst vier zentrale Dienste: Registry (speichert Plugin-Metadaten in einer Datenbank), Storage (speichert Plugin-Archive in einem Objektspeicher), Search (Volltextindex) und Security (signiert und verifiziert Pakete). Alle Dienste werden über eine REST-API bereitgestellt.
# Marketplace REST API endpoints:
API_ROUTES = {
'POST /plugins': 'Publish a new plugin version',
'GET /plugins': 'List all plugins (paginated)',
'GET /plugins/search?q=weather': 'Search by keyword',
'GET /plugins/{name}': 'Get plugin metadata',
'GET /plugins/{name}/{version}': 'Get specific version metadata',
'GET /plugins/{name}/{version}/download': 'Download plugin archive',
'POST /plugins/{name}/{version}/reviews': 'Submit a rating/review',
'GET /plugins/{name}/reviews': 'Get all reviews',
'DELETE /plugins/{name}/{version}': 'Yank (hide) a version',
}
for route, description in API_ROUTES.items():
print(f'{route}: {description}')Ein Plugin veröffentlichen
Der Endpunkt zum Veröffentlichen validiert das Plugin-Archiv, prüft das Manifest, verifiziert die Identität des Herausgebers (über einen API-Schlüssel), sucht nach bekannten schädlichen Mustern, signiert das Paket und speichert es. Die Veröffentlichung erfolgt atomar – entweder ist der vollständige Upload erfolgreich oder es wird nichts gespeichert.
import hashlib
import hmac
import os
def publish_plugin(
archive_path: str,
api_key: str,
registry_url: str = 'https://registry.agenttools.io'
) -> dict:
import requests
# Compute checksum for integrity
with open(archive_path, 'rb') as f:
data = f.read()
sha256 = hashlib.sha256(data).hexdigest()
# Sign the archive with the developer's API key
signature = hmac.new(
api_key.encode(), data, hashlib.sha256
).hexdigest()
response = requests.post(
f'{registry_url}/plugins',
files={'archive': (os.path.basename(archive_path), data, 'application/zip')},
headers={
'X-API-Key': api_key,
'X-Signature': signature,
'X-Checksum-SHA256': sha256
},
timeout=60
)
response.raise_for_status()
return response.json()Serverseitige Validierung bei der Veröffentlichung
Der Registry-Server validiert jede Einreichung: Das Manifest muss analysierbar und vollständig sein, die Version darf noch nicht vorhanden sein, das Archiv darf die Größenbeschränkung nicht überschreiten und ein grundlegender Sicherheitsscan muss erfolgreich sein. Erst nach Abschluss aller Prüfungen akzeptiert der Server den Upload.
import zipfile
import io
import json
MAX_ARCHIVE_SIZE_MB = 50
def validate_plugin_archive(archive_bytes: bytes) -> dict:
errors = []
# Size check
size_mb = len(archive_bytes) / 1024 / 1024
if size_mb > MAX_ARCHIVE_SIZE_MB:
errors.append(f'Archive too large: {size_mb:.1f}MB (max {MAX_ARCHIVE_SIZE_MB}MB)')
return {'valid': False, 'errors': errors}
# Must be a valid zip
try:
zf = zipfile.ZipFile(io.BytesIO(archive_bytes))
except zipfile.BadZipFile:
errors.append('Not a valid zip archive')
return {'valid': False, 'errors': errors}
file_list = zf.namelist()
# Must contain plugin.json
if 'plugin.json' not in file_list:
errors.append('Missing plugin.json in archive root')
# Basic security scan: no .pyc files, no hidden dirs
suspicious = [f for f in file_list if f.startswith('.') or '__pycache__' in f]
if suspicious:
errors.append(f'Suspicious files: {suspicious[:3]}')
return {'valid': len(errors) == 0, 'errors': errors, 'files': len(file_list)}
if __name__ == '__main__':
buf = io.BytesIO()
with zipfile.ZipFile(buf, 'w') as zf:
zf.writestr('plugin.json', '{"name": "demo-plugin"}')
archive_bytes = buf.getvalue()
print('Validation result:', validate_plugin_archive(archive_bytes))
Paketsignierung und -verifizierung
Signieren Sie jedes veröffentlichte Paket mit dem Schlüssel des Herausgebers. Clients verifizieren die Signatur vor der Installation, um sicherzustellen, dass das Paket während der Übertragung oder Speicherung nicht manipuliert wurde.
import hashlib
import hmac
def sign_package(archive_bytes: bytes, secret_key: str) -> str:
return hmac.new(
secret_key.encode(), archive_bytes, hashlib.sha256
).hexdigest()
def verify_package(
archive_bytes: bytes,
signature: str,
secret_key: str
) -> bool:
expected = sign_package(archive_bytes, secret_key)
return hmac.compare_digest(expected, signature)
# Example:
package_data = b'fake plugin archive bytes'
developer_key = 'developer_secret_key_abc123'
sig = sign_package(package_data, developer_key)
print(f'Signature: {sig[:20]}...')
# Verify (registry or installer):
valid = verify_package(package_data, sig, developer_key)
print(f'Signature valid: {valid}')
# Tampered data:
tampered = b'tampered bytes'
print(f'Tampered valid: {verify_package(tampered, sig, developer_key)}')Plugins über die Suche entdecken
Die Search-API akzeptiert Freitextabfragen und Tag-Filter. Sie gibt nach Rang geordnete Ergebnisse anhand einer gewichteten Bewertung zurück: Eine exakte Namensübereinstimmung erhält die höchste Platzierung, gefolgt von Übereinstimmungen bei Tags und anschließend von Übereinstimmungen mit Schlüsselwörtern in der Beschreibung.
import requests
def search_marketplace(
query: str,
tags: list = None,
page: int = 0,
per_page: int = 20,
registry_url: str = 'https://registry.agenttools.io'
) -> dict:
params = {
'q': query,
'page': page,
'per_page': per_page
}
if tags:
params['tags'] = ','.join(tags)
response = requests.get(
f'{registry_url}/plugins/search',
params=params,
timeout=10
)
response.raise_for_status()
return response.json()
# Usage:
results = search_marketplace('weather forecast', tags=['iot', 'weather'])
# {
# 'total': 12,
# 'results': [
# {'name': 'weather-tools', 'version': '2.1.0', 'score': 0.98, ...},
# ...
# ]
# }
print(f'Total results: {results.get("total", 0)}')Ein Plugin installieren
Der Installationsprozess umfasst folgende Schritte: Archiv herunterladen, Signatur verifizieren, in das Plugin-Verzeichnis entpacken, Manifest validieren, Abhängigkeiten prüfen und in der lokalen Tool-Registry registrieren. Alle Schritte müssen erfolgreich sein, andernfalls wird die Installation zurückgerollt.
import requests
import zipfile
import io
import shutil
import os
def install_plugin(
plugin_name: str,
version: str = 'latest',
plugins_dir: str = 'plugins',
registry_url: str = 'https://registry.agenttools.io'
) -> bool:
# Step 1: Get metadata including expected signature
meta = requests.get(
f'{registry_url}/plugins/{plugin_name}/{version}',
timeout=10
).json()
# Step 2: Download archive
archive_resp = requests.get(
meta['download_url'], timeout=60
)
archive_bytes = archive_resp.content
# Step 3: Verify signature
if not verify_package(archive_bytes, meta['signature'], meta['public_key']):
print('Signature verification FAILED — aborting install')
return False
# Step 4: Extract
install_path = os.path.join(plugins_dir, plugin_name)
if os.path.exists(install_path):
shutil.rmtree(install_path) # remove old version
with zipfile.ZipFile(io.BytesIO(archive_bytes)) as zf:
zf.extractall(install_path)
print(f'Installed {plugin_name} v{version} to {install_path}')
return TrueBewertungs- und Rezensionensystem
Ein Bewertungssystem hilft Entwicklern bei der Auswahl hochwertiger Plugins. Implementieren Sie Bewertungen mit 1 bis 5 Sternen und optionalen Textrezensionen. Aggregierte Bewertungsdaten (Mittelwert, Anzahl) werden in der Registry gespeichert und in den Suchergebnissen zurückgegeben.
import requests
def submit_review(
plugin_name: str,
stars: int,
review_text: str = '',
api_key: str = '',
registry_url: str = 'https://registry.agenttools.io'
) -> dict:
if not 1 <= stars <= 5:
raise ValueError('Stars must be 1-5')
payload = {
'stars': stars,
'review': review_text[:500] # truncate to max length
}
response = requests.post(
f'{registry_url}/plugins/{plugin_name}/reviews',
json=payload,
headers={'X-API-Key': api_key},
timeout=10
)
response.raise_for_status()
return response.json()
def get_reviews(plugin_name: str, registry_url: str = 'https://registry.agenttools.io') -> dict:
response = requests.get(
f'{registry_url}/plugins/{plugin_name}/reviews',
timeout=10
)
return response.json()
# Example response structure:
# {'average_stars': 4.3, 'total_reviews': 47,
# 'reviews': [{'stars': 5, 'review': 'Works great!', 'date': '...'}]}
print('Review system ready')Eine Version zurückziehen (Deprecation)
Wenn eine veröffentlichte Version einen kritischen Fehler oder eine Sicherheitslücke enthält, ziehen Sie sie zurück: Markieren Sie sie in der Registry als verborgen, damit neue Installationen sie nicht verwenden können, während bestehende Installationen weiterhin funktionieren. Das ist sicherer als eine Löschung, durch die bestehende Agents beeinträchtigt würden.
import requests
def yank_version(
plugin_name: str,
version: str,
reason: str,
api_key: str,
registry_url: str = 'https://registry.agenttools.io'
) -> dict:
response = requests.delete(
f'{registry_url}/plugins/{plugin_name}/{version}',
json={'reason': reason},
headers={'X-API-Key': api_key},
timeout=10
)
response.raise_for_status()
return response.json()
# Yanked versions:
# - Still downloadable by users who have them pinned
# - Not returned in 'latest' queries
# - Search results show a 'yanked' badge with reason
# - Install of yanked version requires explicit --allow-yanked flag
print('Yanking removes a version from new installs without breaking existing ones.')
print('Always provide a reason: "Security vulnerability in API key handling"')CLI-Tool für den Marktplatz
Eine Befehlszeilenschnittstelle macht den Marktplatz einfach über das Terminal oder CI-Pipelines nutzbar. Implementieren Sie die Befehle marketplace install, marketplace search, marketplace publish und marketplace list.
import argparse
import sys
def main():
parser = argparse.ArgumentParser(description='Agent Tool Marketplace CLI')
subparsers = parser.add_subparsers(dest='command')
# Search
search_parser = subparsers.add_parser('search', help='Search plugins')
search_parser.add_argument('query', help='Search query')
search_parser.add_argument('--tag', action='append', dest='tags')
# Install
install_parser = subparsers.add_parser('install', help='Install a plugin')
install_parser.add_argument('plugin', help='Plugin name')
install_parser.add_argument('--version', default='latest')
install_parser.add_argument('--plugins-dir', default='plugins')
# Publish
publish_parser = subparsers.add_parser('publish', help='Publish plugin')
publish_parser.add_argument('archive', help='Path to .zip archive')
publish_parser.add_argument('--api-key', required=True)
args = parser.parse_args()
if args.command == 'search':
results = search_marketplace(args.query, tags=args.tags or [])
for r in results.get('results', []):
print(f'{r["name"]} v{r["version"]} ({r.get("average_stars", "?")} stars)')
elif args.command == 'install':
install_plugin(args.plugin, args.version, args.plugins_dir)
elif args.command == 'publish':
result = publish_plugin(args.archive, args.api_key)
print('Published:', result)Governance des Marktplatzes
Ein öffentlicher Marktplatz benötigt Governance-Regeln: Namensräume (um das Besetzen von Namen zu verhindern), Inhaltsmoderation (kein schädlicher Code), Sicherheitsscans (statische Analyse beim Upload) und ein Verfahren zum Entfernen von Inhalten (bei rechtlichen oder sicherheitsrelevanten Vorfällen). Dabei handelt es sich ebenso sehr um organisatorische wie um technische Fragen.
MARKETPLACE_POLICIES = {
'namespace_policy': (
'Plugin names must be unique across the registry. '
'Names are claimed on first publish. '
'Transfers require proof of original authorship.'
),
'security_scanning': (
'All uploads are scanned with bandit (Python security linter). '
'Critical vulnerabilities block publish. '
'High vulnerabilities generate a warning visible to installers.'
),
'rate_limits': {
'publish_per_hour': 10,
'search_per_minute': 60,
'install_per_minute': 30
},
'takedown_process': (
'Maintainers can yank versions at any time. '
'Legal/security takedowns processed within 48 hours. '
'Appeals via security@agenttools.io'
)
}
for policy, detail in MARKETPLACE_POLICIES.items():
if isinstance(detail, str):
print(f'{policy}: {detail[:80]}...')
else:
print(f'{policy}: {detail}')Wissenscheck
Was ist der Unterschied zwischen dem Zurückziehen und dem Löschen einer Plugin-Version?
Zusammenfassung: Einen Agent-Plugin-Marktplatz aufbauen
Herzlichen Glückwunsch zum Abschluss dieser Lektion! Die wichtigsten Punkte:
- Veröffentlichungspipeline: Archiv validieren → Signatur verifizieren → scannen → speichern und indexieren
- Paketsignierung: Eine HMAC-Signatur gewährleistet die Integrität; Clients verifizieren sie vor der Installation
- Suche: Volltextsuche mit Tag-Filterung und Relevanzbewertung
- Installation: herunterladen → verifizieren → entpacken → validieren → registrieren (Rollback bei Fehlern)
- Bewertungen: 1 bis 5 Sterne und Textrezensionen, aggregiert in der Registry
- Zurückziehen: Für neue Installationen ausblenden, ohne bestehende Installationen zu beeinträchtigen
Abschlusskurs: Der Weg zu autonomen Systemen.
Häufig gestellte Fragen
Ist die Lektion „Einen Agent-Plugin-Marktplatz erstellen“ kostenlos?
Ja — der vollständige Text von „Einen Agent-Plugin-Marktplatz erstellen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Agents-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Einen Agent-Plugin-Marktplatz erstellen“?
Zentraler Tool-Store: Agent-Plugins veröffentlichen, bewerten und verteilen. Du übst AI Agents mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um AI Agents zu starten?
Keine Vorkenntnisse erforderlich. AI Agents auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Einen Agent-Plugin-Marktplatz erstellen“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser AI Agents-Lektion Code schreiben und ausführen?
Ja. Jede AI Agents-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Teilbare Agent-Tools entwerfen
- Plugins entdecken und registrieren
- Tool-Versionierung und Kompatibilität
- Einen Agent-Plugin-Marktplatz erstellen