An extensible toolkit for Microsoft Semantic Kernel that bridges Claude Code skills, plugins, and hooks into SK applications, and adds context management primitives (compaction, semantic memory) for building production-grade AI agents.
- 📝 Skills — Parse
SKILL.mdfiles (YAML frontmatter + markdown) intoKernelFunctionorPromptTemplate - 🔗 Hooks — Map Claude Code lifecycle events (
PreToolUse,PostToolUse, etc.) to SK'sIFunctionInvocationFilterandIPromptRenderFilter - 📦 Plugins — Load
.claude-plugin/directories with skills, hooks, and MCP configs - 🗜️ Compaction — Transparent context window management with configurable triggers and hierarchical summarization
- 🧠 Memory — Semantic memory with MMR reranking, temporal decay scoring, and query expansion
- 💾 Memory.Sqlite — SQLite-backed persistent memory storage
- 🎯 Fluent API —
UseSkills(),UseHooks(),UsePlugins(),AddCompaction(),AddSemanticMemory()extension methods
dotnet add package JD.SemanticKernel.Extensionsusing JD.SemanticKernel.Extensions.Skills;
var kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion("gpt-4o", apiKey)
.UseSkills("./skills/") // Scans for SKILL.md files
.Build();A SKILL.md file follows the Claude Code / AgentSkills.io format:
---
name: code-reviewer
description: Reviews code for quality issues
allowed-tools: [Read, Grep, Glob]
---
# Code Reviewer
Review the provided code for:
1. Bug risks
2. Security vulnerabilities
3. Performance issues
Input: $ARGUMENTSusing JD.SemanticKernel.Extensions.Hooks;
var kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion("gpt-4o", apiKey)
.UseHooks(hooks =>
{
hooks.OnFunctionInvoking("Bash|Execute", async ctx =>
{
Console.WriteLine($"Validating: {ctx.Function.Name}");
});
hooks.OnFunctionInvoked("Write|Edit", async ctx =>
{
Console.WriteLine($"Post-edit hook: {ctx.Function.Name}");
});
hooks.OnPromptRendering(async ctx =>
{
Console.WriteLine("Prompt is about to render...");
});
})
.Build();using JD.SemanticKernel.Extensions.Plugins;
var kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion("gpt-4o", apiKey)
.UsePlugins("./my-plugin/") // Single plugin directory
.UseAllPlugins("./plugins/") // All plugins in directory
.Build();Plugin directories follow the .claude-plugin/ convention:
my-plugin/
├── .claude-plugin/
│ └── plugin.json # Manifest
├── skills/
│ └── reviewer/SKILL.md # Skills
├── hooks/
│ └── hooks.json # Hooks
└── .mcp.json # MCP servers (future)
using JD.SemanticKernel.Extensions;
var kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion("gpt-4o", apiKey)
.AddClaudeCodeSkills("./skills/")
.AddClaudeCodePlugin("./my-plugin/")
.AddClaudeCodeHooks(hooks => hooks.OnFunctionInvoking(".*", _ => Task.CompletedTask))
.Build();Automatically compress chat history when it grows too large, preserving key context while staying within token limits.
using JD.SemanticKernel.Extensions.Compaction;
var kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion("gpt-4o", apiKey)
.Build();
// Register compaction as transparent middleware
kernel.Services.AddCompaction(options =>
{
options.TriggerMode = CompactionTriggerMode.ContextPercentage;
options.Threshold = 0.70; // Compact at 70% of context window
options.MaxContextWindowTokens = 128_000; // Model's context limit
options.PreserveLastMessages = 10; // Always keep recent messages
options.MinMessagesBeforeCompaction = 5; // Don't compact short conversations
});Trigger modes:
TokenThreshold— Compact when estimated tokens exceed an absolute countContextPercentage— Compact when usage exceeds a percentage of the context window
Token estimation:
var tokens = TokenEstimator.EstimateTokens("Hello world"); // ~2 tokens
var historyTokens = TokenEstimator.EstimateTokens(chatHistory); // Includes overheadStore, search, and retrieve context-relevant information with embedding-based similarity, MMR diversity reranking, and temporal decay scoring.
using JD.SemanticKernel.Extensions.Memory;
// Register with in-memory backend
kernel.Services.AddSemanticMemory(options =>
{
options.DefaultSearchOptions = new MemorySearchOptions
{
TopK = 10,
MinRelevanceScore = 0.7,
UseMmrReranking = true,
MmrLambda = 0.7, // Balance relevance vs diversity
UseTemporalDecay = true,
TemporalDecayRate = 0.01,
};
});SQLite persistence:
using JD.SemanticKernel.Extensions.Memory.Sqlite;
kernel.Services.AddSqliteMemoryBackend("Data Source=memory.db");Key capabilities:
- MMR reranking — Maximal Marginal Relevance for diverse search results
- Temporal decay — Recent memories rank higher with configurable decay rate
- Query expansion — Automatically generate alternative queries for broader recall
- Pluggable backends —
InMemoryBackend(default),SqliteMemoryBackend, or implementIMemoryBackend
| Claude Code Event | SK Filter |
|---|---|
PreToolUse |
IFunctionInvocationFilter.OnFunctionInvokingAsync |
PostToolUse |
IFunctionInvocationFilter.OnFunctionInvokedAsync |
UserPromptSubmit |
IPromptRenderFilter.OnPromptRenderingAsync |
Stop / SubagentStop |
IAutoFunctionInvocationFilter |
SessionStart / SessionEnd |
IExtensionEventBus (custom) |
PreCompact / Notification |
IExtensionEventBus (custom) |
| Project | Description |
|---|---|
| JD.SemanticKernel.Connectors.ClaudeCode | Claude Code authentication provider for SK |
| JD.SemanticKernel.Connectors.GitHubCopilot | GitHub Copilot authentication provider for SK |
dotnet restore
dotnet build
dotnet testMIT © JD