A community-driven registry for Claude, Cursor, Windsurf, Cline & more. Not affiliated with Anthropic.
Are you the author? Sign in to claim
Ship AI Skills, custom instructions, and MCP server configs alongside your NuGet packages. Supports GitHub Copilot, Clau
Distribute AI Skills and MCP configurations via NuGet packages
Imprint is a pattern for distributing AI Skills (those SKILLS.md files for GitHub Copilot, Claude, Cursor, Roo Code, Kiro, and other AI assistants) and MCP Server configuration via NuGet packages. When you add an Imprint package to your project:
dotnet build: Skills are automatically copied to each AI agent's native directorydotnet clean: Skills are removed (including empty parent directories).md — scripts, configs, and any other files in the skills/ folder are includedmcp.jsonThis enables scenarios like:
Library authors can choose if Skills and MCP fragments are opt-in or opt-out for consumers. By setting ImprintEnabledByDefault in the package's .csproj, authors control the default behavior:
<PropertyGroup>
<ImprintEnabledByDefault>false</ImprintEnabledByDefault> <!-- Opt-in: disabled unless user enables -->
</PropertyGroup>
Consumers can always override this per-package using metadata on their PackageReference:
<PackageReference Include="SomePackage" Version="1.0.0">
<ImprintEnabled>false</ImprintEnabled> <!-- Disable or enable this package's skills/MCP -->
</PackageReference>
The consumer's explicit setting always takes priority over the package author's default.
# Add the package
dotnet add package <some-Imprint-package>
# Build to install skills (happens automatically before build)
dotnet build
# Skills are now at .github/skills/, .claude/skills/, .cursor/rules/, .kiro/skills/ etc.
Imprint auto-detects which AI agents you use by scanning for their configuration directories (.github/, .claude/, .cursor/, .roo/, .opencode/, .windsurf/, .kiro/). Skills are copied to each detected agent's native location.
A shared .gitignore is automatically generated at .imprint/.gitignore, so no manual .gitignore configuration is needed.
Create a new class library project and add <Imprint> items to declare your content:
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<PackageReference Include="Zakira.Imprint.Sdk" Version="1.0.0-preview" />
</ItemGroup>
<!-- Declare your content using <Imprint> items -->
<ItemGroup>
<Imprint Include="skills\**\*" />
<Imprint Include="mcp\*.mcp.json" Type="Mcp" /> <!-- MCP server configs -->
</ItemGroup>
</Project>
Create your skills in a skills/ folder, then pack:
dotnet pack -o ./packages
The SDK automatically generates the .targets file at pack time — no manual MSBuild authoring required!
Imprint includes multi-agent support. Instead of targeting only GitHub Copilot, Imprint can distribute skills and MCP configurations to multiple AI agents simultaneously, placing files in each agent's native directory structure.
| Agent | Detection | Skills Path | MCP Path | MCP Root Key |
|---|---|---|---|---|
copilot | .github/ exists | .github/skills/ | .vscode/mcp.json | servers |
claude | .claude/ exists | .claude/skills/ | .claude/mcp.json | mcpServers |
cursor | .cursor/ exists | .cursor/rules/ | .cursor/mcp.json | mcpServers |
roo | .roo/ exists | .roo/rules/ | .roo/mcp.json | mcpServers |
opencode | .opencode/ exists | .opencode/skills/ | opencode.json (project root) | mcp |
windsurf | .windsurf/ exists | .windsurf/rules/ | .windsurf/mcp.json | mcpServers |
agents | .agents/ exists | .agents/skills/ | .agents/mcp.json | mcpServers |
kiro | .kiro/ exists | .kiro/skills/ | .kiro/settings/mcp.json | mcpServers |
Unknown agent names fall back to .{name}/rules/ for skills and .{name}/mcp.json for MCP.
Imprint determines which agents to target using a priority hierarchy:
Explicit configuration — Set ImprintTargetAgents in your .csproj:
<PropertyGroup>
<ImprintTargetAgents>claude;cursor</ImprintTargetAgents>
</PropertyGroup>
Auto-detection (default, ON) — Scans for agent directories at build time. If .github/ and .claude/ exist, both copilot and claude are targeted.
Supported detection directories: .github/ (copilot), .claude/ (claude), .cursor/ (cursor), .roo/ (roo), .opencode/ (opencode), .windsurf/ (windsurf), .agents/ (agents), .kiro/ (kiro).
Default fallback — If no directories are detected:
<PropertyGroup>
<ImprintDefaultAgents>copilot</ImprintDefaultAgents>
</PropertyGroup>
| Property | Default | Purpose |
|---|---|---|
ImprintTargetAgents | (empty) | Explicit agent list (semicolon-separated). Overrides auto-detection. |
ImprintAutoDetectAgents | true | Scan for agent directories at build time |
ImprintDefaultAgents | (empty) | Fallback when no agents are detected |
ImprintRootDirectory | (auto-detected) | Repository root where skills are placed. See Root Directory. |
By default, Imprint auto-detects the repository root by walking up from the project directory. Markers are checked in priority order:
.git/, .svn/, .hg/ (most authoritative).vs/ (Visual Studio), .idea/ (JetBrains)*.sln, *.slnx (fallback)This ensures that in multi-project solutions, skills are placed at the repository root (where .git/ lives) rather than inside individual project directories:
/repo-root/ <-- Skills placed here (correct)
├── .git/
├── .github/skills/ <-- Not inside src/MyProject/.github/
├── src/
│ └── MyProject/
│ └── MyProject.csproj
└── MyApp.sln
If auto-detection doesn't work for your setup, you can explicitly set the root directory:
<PropertyGroup>
<ImprintRootDirectory>$(MSBuildThisFileDirectory)..\</ImprintRootDirectory>
</PropertyGroup>
If no repository root is found and no explicit override is set, Imprint falls back to the project directory.
With .github/ and .claude/ directories present, installing Zakira.Imprint.Sample produces:
.github/
skills/
personal/
SKILL.md # Copilot sees this
.claude/
skills/
personal/
SKILL.md # Claude sees this
.vscode/
mcp.json # MCP servers for Copilot/VS Code
.claude/
mcp.json # MCP servers for Claude
.imprint/
manifest.json # Unified tracking manifest (v2)
.gitignore # Prevents tracking of managed files
| Package | Version | Description |
|---|---|---|
| Zakira.Imprint.Sdk | 1.0.0-preview | Core MSBuild task engine — auto-generates .targets, content copying, cleaning, MCP merging, multi-agent support |
All Imprint skill packages depend on Zakira.Imprint.Sdk, which provides the MSBuild task engine. Package authors declare <Imprint> items in their .csproj — the SDK auto-generates the .targets file at pack time, then handles agent resolution, file copying, MCP merging, manifest tracking, and cleanup at build/clean time.
┌───────────────────────────┐ ┌────────────────────────────────────┐
│ Sample │ │ Sample.FilesOnly │
│ (skills + MCP + code) │ │ (skills-only) │
└──────┬────────────────────┘ └──────┬─────────────────────────────┘
│ │
▼ ▼
┌─────────────────────────────────────────────────────────────────────┐
│ Zakira.Imprint.Sdk │
│ - Auto-generates .targets at pack time (ImprintGenerateTargets) │
│ - Copies skills to all agents (ImprintCopyContent) │
│ - Merges MCP servers (ImprintMergeMcpServers) │
│ - Cleans on dotnet clean (ImprintCleanContent, ImprintCleanMcp) │
└─────────────────────────────────────────────────────────────────────┘
NuGet Restore: NuGet restores skill packages, which transitively pull in Zakira.Imprint.Sdk. MSBuild auto-imports the SDK's props and targets via the buildTransitive/ folder.
Agent Resolution: Before any file operations, AgentConfig.ResolveAgents() determines which agents to target:
ImprintTargetAgents is set, use that explicit listImprintAutoDetectAgents is true, scan for .github/, .claude/, .cursor/, .roo/, .opencode/, .windsurf/ directoriesImprintDefaultAgentsContent Copy (Imprint_CopyContent): For each resolved agent, copies skill files to the agent's native skills directory. Writes a unified manifest v2 at .imprint/manifest.json tracking all files per-agent per-package. These copies and the shared .gitignore/manifest writes are safe under parallel, multi-project builds: destinations that already match the source are skipped, and concurrent writers are retried with backoff and reconciled, so building a solution with -m will not fail with "file is being used by another process" errors.
MCP Merge (Imprint_MergeMcp): Merges MCP server fragments into each agent's mcp.json. Tracks managed server keys in the unified manifest.
Clean (Imprint_CleanContent + Imprint_CleanMcp): Reads the unified manifest to delete only tracked files and managed MCP servers. Removes empty directories. Preserves user-defined MCP servers.
When you run dotnet pack on your Imprint package:
Generate Targets (Imprint_GenerateTargetsFile): The SDK reads all <Imprint> items from your .csproj and generates a .targets file at obj/{Configuration}/{TFM}/Imprint/{PackageId}.targets. This file declares ImprintContent and ImprintMcpFragment items that consumers will use.
Include Content + Cross-Targeting Import (Imprint_IncludeContentInPackage): The SDK adds the generated .targets file to both build/ and buildTransitive/ package paths, includes all content files (skills, MCP fragments) in the content/ folder, and for multi-targeted package projects (<TargetFrameworks>...) imports via buildMultiTargeting/ in the outer pack build so Imprint pack targets can run before _GetPackageFiles.
NuGet Pack: The package is created with all necessary files — no manual .targets authoring required.
Imprint uses a single manifest at .imprint/manifest.json to track everything:
{
"version": 2,
"packages": {
"Zakira.Imprint.Sample": {
"files": {
"copilot": [".github/skills/personal/SKILL.md"],
"claude": [".claude/skills/personal/SKILL.md"]
}
}
},
"mcp": {
"copilot": {
"path": ".vscode/mcp.json",
"managedServers": ["sample-echo-server"]
},
"claude": {
"path": ".claude/mcp.json",
"managedServers": ["sample-echo-server"]
}
}
}
Legacy per-package .manifest files are still written for backward compatibility.
Imprint packages can ship MCP (Model Context Protocol) server configurations. When you build, server configs are automatically merged into each targeted agent's mcp.json.
mcp/<PackageId>.mcp.json fragment file containing its server definitionsZakira.Imprint.Sdk collects all ImprintMcpFragment items from installed packagesmcp.json, preserving any servers you've configured manuallydotnet clean, only Imprint-managed servers are removed — your servers are never touchedAn Imprint package's mcp/<PackageId>.mcp.json:
{
"servers": {
"sample-echo-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@anthropic-ai/echo-mcp-server"]
}
}
}
Note: Package authors always use
"servers"as the root key in fragment files. The SDK automatically transforms this to the correct root key for each agent when writing to theirmcp.jsonfiles.
After dotnet build with both copilot and claude agents detected:
.vscode/mcp.json contains the server under "servers" (VS Code / Copilot schema).claude/mcp.json contains the server under "mcpServers" (Claude schema)mcp.json is not rewritten (no git noise)dotnet clean removes only managed servers; if no user servers remain, mcp.json is deletedmcp.json are never modified or removedinputs preserved: Top-level properties like "inputs" in mcp.json are preserved through builds and cleansmcp.json in its native location"servers" for Copilot, "mcpServers" for Claude/Cursor)Different AI agents use different JSON schemas for their MCP configuration files. The SDK handles this automatically:
| Agent | Root Key | Example |
|---|---|---|
| Copilot (VS Code) | servers | {"servers": {"my-server": {...}}} |
| Claude | mcpServers | {"mcpServers": {"my-server": {...}}} |
| Cursor | mcpServers | {"mcpServers": {"my-server": {...}}} |
| Roo Code | mcpServers | {"mcpServers": {"my-server": {...}}} |
| OpenCode | mcp | {"mcp": {"my-server": {...}}} |
| Windsurf | mcpServers | {"mcpServers": {"my-server": {...}}} |
| Kiro | mcpServers | {"mcpServers": {"my-server": {...}}} |
Package authors always write fragments using "servers" as the root key. The SDK reads these fragments and transforms them to each agent's expected schema when writing to their respective mcp.json files. The inner server definition (command, args, type, env) is identical across all agents.
Add a PackageReference to Zakira.Imprint.Sdk in your .csproj
Create a mcp/<YourPackageId>.mcp.json fragment with your server definitions
Add the fragment using the <Imprint> item with Type="Mcp":
<ItemGroup>
<Imprint Include="skills\**\*" /> <!-- Skills -->
<Imprint Include="mcp\*.mcp.json" Type="Mcp" /> <!-- MCP fragments -->
</ItemGroup>
The SDK auto-generates the .targets file at pack time — no manual configuration needed!
For packages that only distribute AI skills and MCP configs (no compiled code):
<PropertyGroup>
<IncludeBuildOutput>false</IncludeBuildOutput>
<DevelopmentDependency>true</DevelopmentDependency>
</PropertyGroup>
See samples/Sample.FilesOnly for an example.
For packages that ship both a compiled DLL and AI skills:
<PropertyGroup>
<!-- IncludeBuildOutput defaults to true - DLL ships in lib/ -->
<!-- Do NOT set DevelopmentDependency - consumers need the runtime DLL -->
</PropertyGroup>
See samples/Sample for an example — it ships string utility methods alongside an AI skill file and MCP server configuration.
Control which AI agents Imprint targets:
<PropertyGroup>
<!-- Target specific agents (overrides auto-detection) -->
<ImprintTargetAgents>copilot;claude</ImprintTargetAgents>
<!-- Or disable auto-detection and use only defaults -->
<ImprintAutoDetectAgents>false</ImprintAutoDetectAgents>
<ImprintDefaultAgents>copilot</ImprintDefaultAgents>
</PropertyGroup>
These properties are still available for backward compatibility but are generally superseded by multi-agent resolution:
| Property | Default | Purpose |
|---|---|---|
ImprintSkillsPath | .github/skills/ | Legacy: single-agent skills path |
ImprintPromptsPath | .github/prompts/ | Legacy: single-agent prompts path |
ImprintMcpPath | .vscode/ | Legacy: single-agent MCP path |
# 1. Pack the SDK first, then samples (to local-packages/)
dotnet pack src/Zakira.Imprint.Sdk -o ./local-packages
dotnet pack samples/Sample -o ./local-packages
dotnet pack samples/Sample.FilesOnly -o ./local-packages
# 2. Create a test consumer (or use samples/Consumer)
cd samples/Consumer
dotnet build
# 3. Verify skills are installed (agent directories vary by your setup)
ls .github/skills/
# personal/ StringUtils/
# 4. Verify MCP servers were injected
cat .vscode/mcp.json
# { "servers": { "sample-echo-server": {...} } }
# 5. Run unit tests
cd ../..
dotnet test Zakira.Imprint.sln
# 6. Test clean - skills and managed MCP servers are removed
cd samples/Consumer
dotnet clean
ls .github/ # Should be empty or not exist
ls .vscode/mcp.json # Should not exist (no user servers to preserve)
# 7. Build again - everything is restored
dotnet build
Package Removal: When you remove an Imprint package, its skills remain until you run dotnet clean or manually delete them.
IDE Design-Time Builds: Skills and MCP servers are only managed during actual builds, not during IDE background builds (this is intentional to avoid performance issues).
First Build Required: Skills and MCP configs are installed on the first build, not on restore.
Shared Output Folder: Multiple packages write to the same skills directory per agent. If two packages include a file with the same relative path, the last one to copy wins.
MCP Server Key Conflicts: If two Imprint packages define a server with the same key, the last fragment processed wins silently. A warning for this is planned.
Zakira.Imprint.Sdk requires .NET 8+: The Zakira.Imprint.Sdk compiled task DLL targets net8.0. Consumers must have the .NET 8 SDK or later installed.
.targets files — no manual MSBuild authoring required.prompt files to agent-specific directories)MIT
mcp-language-server gives MCP enabled clients access semantic tools like get definition, references, rename, and diagnos
MCP server integration for DaVinci Resolve Studio
Run Claude Code as an MCP server so any agent can delegate coding tasks to it
Browser automation using accessibility snapshots instead of screenshots