Netclaw.SkillClient 0.4.1

dotnet add package Netclaw.SkillClient --version 0.4.1
                    
NuGet\Install-Package Netclaw.SkillClient -Version 0.4.1
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Netclaw.SkillClient" Version="0.4.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Netclaw.SkillClient" Version="0.4.1" />
                    
Directory.Packages.props
<PackageReference Include="Netclaw.SkillClient" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Netclaw.SkillClient --version 0.4.1
                    
#r "nuget: Netclaw.SkillClient, 0.4.1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Netclaw.SkillClient@0.4.1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Netclaw.SkillClient&version=0.4.1
                    
Install as a Cake Addin
#tool nuget:?package=Netclaw.SkillClient&version=0.4.1
                    
Install as a Cake Tool

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}");
}

Native Manifest Traversal

Use the native manifest when you need SkillServer-specific version history, resourceful skill artifacts, or sub-agent definitions.

var manifest = await client.GetManifestAsync();

var skillIndex = await client.GetNativeSkillIndexAsync(manifest.Links.Skills);
var skillPage = await client.GetNativeSkillPageAsync(skillIndex.Pages[0]);
var skill = await client.GetNativeSkillIdentityAsync(skillPage.Items[0]);
var skillVersion = await client.GetNativeSkillVersionAsync(skill.Versions[0]);

var stagingPath = Path.GetTempFileName();
await using var staging = File.Create(stagingPath);
await client.DownloadNativeSkillArtifactAsync(skillVersion.Artifact, staging);

Sub-agents are native resources and do not appear in the RFC skill feed.

var subAgentIndex = await client.GetNativeSubAgentIndexAsync(manifest.Links.SubAgents);
var subAgentPage = await client.GetNativeSubAgentPageAsync(subAgentIndex.Pages[0]);
var subAgent = await client.GetNativeSubAgentIdentityAsync(subAgentPage.Items[0]);
var subAgentVersion = await client.GetNativeSubAgentVersionAsync(subAgent.Versions[0]);

var stagingPath = Path.GetTempFileName();
await using var staging = File.Create(stagingPath);
await client.DownloadNativeSubAgentArtifactAsync(subAgentVersion, staging);

The download helpers verify SHA-256 digests before returning. They write to caller-provided streams, so your sync code chooses the staging path, final destination, and install policy.

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...");

Publishing and Downloading Sub-Agents

Requires an API key for publishing and deleting. Reads are open on public registries.

await using var file = File.OpenRead("agent.md");
var result = await client.UploadSubAgentAsync("support-agent", "1.0.0", file);

var versions = await client.GetSubAgentVersionsAsync("support-agent");
var agent = await client.GetSubAgentFileAsStringAsync("support-agent", "1.0.0");

await client.DeleteSubAgentVersionAsync("support-agent", "1.0.0");

Adapter Guidance

Netclaw.SkillClient fetches manifests and verifies artifact bytes. It does not choose local filesystem paths or convert agent-md into a client-specific format.

Non-NetClaw clients should provide an adapter that:

  • Chooses managed staging and install destinations.
  • Downloads artifacts with DownloadVerifiedArtifactAsync or the native artifact helpers.
  • Parses agent-md when the target client needs a different local agent format.
  • Records source feed, resource name, version, digest, and generated local path for update and prune decisions.
  • Writes only into adapter-owned managed locations so user-authored files are not overwritten.

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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories (1)

Showing the top 1 popular GitHub repositories that depend on Netclaw.SkillClient:

Repository Stars
netclaw-dev/netclaw
Simple, secure, reliable agents. Self-hosted. Open source. Built with .NET.
Version Downloads Last Updated
0.4.1 41 7/22/2026
0.4.0 1,967 7/14/2026
0.4.0-beta.6 59 7/11/2026
0.4.0-beta.5 58 7/8/2026
0.4.0-beta.4 1,060 7/7/2026
0.4.0-beta.3 212 7/7/2026
0.4.0-beta.2 64 7/3/2026
0.4.0-beta.1 538 6/30/2026
0.3.1 10,168 5/15/2026
0.3.0 5,325 5/5/2026
0.2.1 1,414 4/29/2026
0.2.0 646 4/27/2026
0.1.2 114 4/27/2026
0.1.1 113 4/24/2026
0.1.0 112 4/23/2026

**Bug Fixes**
- Fix CLI `versions` command crashing with a 404 when a skill has no published versions — now returns gracefully (#143)
- Fix Docker quick-start compose configuration so it runs as non-root against a writable `/data` volume (#141)