Netclaw.SkillClient 0.4.0-beta.2

This is a prerelease version of Netclaw.SkillClient.
dotnet add package Netclaw.SkillClient --version 0.4.0-beta.2
                    
NuGet\Install-Package Netclaw.SkillClient -Version 0.4.0-beta.2
                    
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.0-beta.2" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Netclaw.SkillClient" Version="0.4.0-beta.2" />
                    
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.0-beta.2
                    
#r "nuget: Netclaw.SkillClient, 0.4.0-beta.2"
                    
#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.0-beta.2
                    
#: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.0-beta.2&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=Netclaw.SkillClient&version=0.4.0-beta.2&prerelease
                    
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.0-beta.2 37 7/3/2026
0.4.0-beta.1 241 6/30/2026
0.3.1 10,026 5/15/2026
0.3.0 5,309 5/5/2026
0.2.1 1,408 4/29/2026
0.2.0 637 4/27/2026
0.1.2 106 4/27/2026
0.1.1 107 4/24/2026
0.1.0 105 4/23/2026

**New Features**
- Add native manifest endpoints (`/manifest.json` and linked skill identity/version documents) for destination-agnostic, RFC-compatible sync (#96)
- Add first-class sub-agent support — `/subagents` storage with upload, list, delete, and `agent.md` download endpoints, and NetClaw sub-agent markdown frontmatter validation (#97)
- Add native sub-agent manifest endpoints (`/manifest/subagents/...`) that traverse from the root native manifest alongside skills (#98)
- Add sub-agent support to `Netclaw.SkillClient` — upload, list, download, delete, and native manifest traversal helpers (#99)
- Add CLI sub-agent commands: `lint subagent`, `publish-subagent`, and `download-subagent` for validating, publishing, and syncing sub-agents from the command line (#100)
- Add deterministic `archive.zip` downloads for resourceful skills, backfilled for existing skill versions (#95)

**Improvements**
- Preserve executable permission bits (Unix mode) for skill resources — packaged helper scripts in downloaded archives no longer need a manual `chmod` (#103)

**CI/CD**
- Skip the Docker `latest` tag and mark GitHub releases as prerelease automatically when publishing a prerelease tag (#101)

**Security**
- Resolve CVE-2026-49451 / GHSA-v5pm-xwqc-g5wc by pinning the transitive `Microsoft.OpenApi` dependency to 2.7.5 (#104)
- Resolve GHSA-hv8m-jj95-wg3x (MessagePack/StreamJsonRpc LZ4 decompression DoS) by upgrading MessagePack from 2.5.301 to 3.1.7 (#76, #80)
- Suppress GHSA-2m69-gcr7-jv3q (SQLitePCLRaw) pending an upstream patched release (#76)

**Dependency Updates**
- Bump Microsoft.Data.Sqlite from 10.0.7 to 10.0.9 (#106)
- Bump Microsoft.Extensions.Http from 10.0.7 to 10.0.9 (#107)
- Bump Dapper from 2.1.72 to 2.1.79 (#78)
- Bump Microsoft.AspNetCore.OpenApi from 10.0.7 to 10.0.9 (#83)