Netclaw.SkillClient
0.3.0
dotnet add package Netclaw.SkillClient --version 0.3.0
NuGet\Install-Package Netclaw.SkillClient -Version 0.3.0
<PackageReference Include="Netclaw.SkillClient" Version="0.3.0" />
<PackageVersion Include="Netclaw.SkillClient" Version="0.3.0" />
<PackageReference Include="Netclaw.SkillClient" />
paket add Netclaw.SkillClient --version 0.3.0
#r "nuget: Netclaw.SkillClient, 0.3.0"
#:package Netclaw.SkillClient@0.3.0
#addin nuget:?package=Netclaw.SkillClient&version=0.3.0
#tool nuget:?package=Netclaw.SkillClient&version=0.3.0
Netclaw.SkillClient
.NET client library for SkillServer, a self-hosted skill registry for AI agents.
SkillServer implements the Cloudflare Agent Skills Discovery RFC v0.2.0 and the AgentSkills.io SKILL.md format.
Installation
dotnet add package Netclaw.SkillClient
Usage
Direct Instantiation
using Netclaw.SkillClient;
// Read-only access (no auth needed for discovery and downloads)
using var client = new SkillServerClient("http://localhost:8080");
// With API key for write operations (publish, delete)
using var client = new SkillServerClient("http://localhost:8080", apiKey: "sk-your-api-key");
Dependency Injection
// Read-only
services.AddSkillServerClient("http://localhost:8080");
// With API key
services.AddSkillServerClient("http://localhost:8080", "sk-your-api-key");
Discovering Skills
// Get the RFC-compliant skill index (/.well-known/agent-skills/index.json)
var index = await client.GetRfcIndexAsync();
foreach (var skill in index.Skills)
{
Console.WriteLine($"{skill.Name} - {skill.Description}");
Console.WriteLine($" URL: {skill.Url}");
Console.WriteLine($" Digest: {skill.Digest}");
}
Listing and Browsing Skills
// List all skills (paginated)
var skills = await client.ListSkillsAsync();
var page = await client.ListSkillsAsync(skip: 10, take: 5);
// Get all versions of a skill
var versions = await client.GetSkillVersionsAsync("my-skill");
// Get a specific version
var version = await client.GetVersionAsync("my-skill", "1.0.0");
Searching Skills
// Full-text search across skill names, descriptions, and categories
var results = await client.SearchSkillsAsync("kubernetes deployment");
var page = await client.SearchSkillsAsync("kubernetes", skip: 0, take: 10);
Getting the Latest Version
// Get the latest version of a specific skill
var latest = await client.GetLatestVersionAsync("my-skill");
Console.WriteLine($"Latest: {latest.Version} ({latest.Sha256})");
Checking for Updates
// Check if any of your cached skills have newer versions
var updates = await client.CheckUpdatesAsync([
new CheckUpdateRequest { Name = "my-skill", Version = "1.0.0" },
new CheckUpdateRequest { Name = "other-skill", Version = "2.1.0" }
]);
foreach (var item in updates.Where(u => u.HasUpdate))
{
Console.WriteLine($"{item.Name}: {item.CurrentVersion} -> {item.LatestVersion}");
}
Downloading Skills
// Download SKILL.md as a string
var content = await client.GetSkillFileAsStringAsync("my-skill", "1.0.0");
// Download SKILL.md as a stream
await using var stream = await client.GetSkillFileAsync("my-skill", "1.0.0");
// Download a resource file from a skill archive
await using var resource = await client.GetSkillFileAsync("my-skill", "1.0.0", "prompts/system.md");
// Download a blob by its SHA-256 digest
await using var blob = await client.GetBlobAsync("sha256:abc123...");
Verifying Integrity
// Verify a downloaded skill matches its published digest
var isValid = await client.VerifyDigestAsync("my-skill", "1.0.0", "sha256:abc123...");
Publishing Skills
Requires an API key with write access.
await using var file = File.OpenRead("SKILL.md");
var result = await client.UploadSkillAsync("my-skill", "1.0.0", file, category: "coding");
Console.WriteLine($"Published: {result.Url}");
Console.WriteLine($"Digest: {result.Sha256}");
Deleting Skills
await client.DeleteVersionAsync("my-skill", "1.0.0");
AOT Compatibility
This library is fully AOT-compatible. All JSON serialization uses source-generated System.Text.Json contexts with no runtime reflection.
License
Apache-2.0 - Copyright 2025 Petabridge, LLC
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Microsoft.Extensions.Http (>= 10.0.7)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
**New Features**
- Add `skillserver` CLI tool for publishing and managing skills from the command line (#56)
- Commands: `publish`, `publish-all`, `delete`, `list`, `versions`, `verify`, `config`, `api-key`
- Distributed as a .NET global tool (`dotnet tool install -g Netclaw.SkillServer.Cli`) and standalone trimmed binaries for linux-x64, linux-arm64, osx-arm64, and win-x64
- Install scripts for Linux/macOS (`install-skillserver.sh`) and Windows (`install-skillserver.ps1`)
- Add `UploadSkillWithResourcesAsync` and `UploadSkillIfNotExistsAsync` to `Netclaw.SkillClient` for idempotent publishing with resource file support (#56)
**Improvements**
- Consolidate `publish_nuget.yml` and `publish_container.yml` into a unified `release.yml` workflow — NuGet packages, CLI binaries, and container images build in parallel with a single coordinated publish stage (#56)
- Add CLI publish dry-run, trim warning checks, and install script linting to PR validation (#56)
**Dependency Updates**
- Bump YamlDotNet from 17.0.1 to 17.1.0 (#55)