Using Dotnet
novotnyllc/dotnet-artisan
Detects .NET intent for any C, ASP.NET Core, EF Core, Blazor, MAUI, Uno Platform, WPF, WinUI, SignalR, gRPC, xUnit, NuGet, or MSBuild request from prompt keywords and repository signals (.sln…
Provides C and ASP.NET Core coding standards for this repository.
$ npx skills add microsoft-foundry/foundry-agent-webapp --skill writing-csharp-code -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install microsoft-foundry/foundry-agent-webapp writing-csharp-code --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/microsoft-foundry/foundry-agent-webapp.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.github/skills/writing-csharp-code .claude/skills/writing-csharp-code && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "writing-csharp-code" agent skill from https://github.com/microsoft-foundry/foundry-agent-webapp/tree/main/.github/skills/writing-csharp-code into .claude/skills/writing-csharp-code/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "writing-csharp-code", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/microsoft-foundry/foundry-agent-webapp/tree/main/.github/skills/writing-csharp-codeType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add microsoft-foundry/foundry-agent-webapp --skill writing-csharp-code -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install microsoft-foundry/foundry-agent-webapp writing-csharp-code --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/microsoft-foundry/foundry-agent-webapp.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.github/skills/writing-csharp-code .agents/skills/writing-csharp-code && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "writing-csharp-code" agent skill from https://github.com/microsoft-foundry/foundry-agent-webapp/tree/main/.github/skills/writing-csharp-code into .agents/skills/writing-csharp-code/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "writing-csharp-code", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add microsoft-foundry/foundry-agent-webapp --skill writing-csharp-code -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install microsoft-foundry/foundry-agent-webapp writing-csharp-code --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/microsoft-foundry/foundry-agent-webapp.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.github/skills/writing-csharp-code .cursor/skills/writing-csharp-code && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "writing-csharp-code" agent skill from https://github.com/microsoft-foundry/foundry-agent-webapp/tree/main/.github/skills/writing-csharp-code into .cursor/skills/writing-csharp-code/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "writing-csharp-code", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/microsoft-foundry/foundry-agent-webapp.git --path .github/skills/writing-csharp-code--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add microsoft-foundry/foundry-agent-webapp --skill writing-csharp-code -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install microsoft-foundry/foundry-agent-webapp writing-csharp-code --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/microsoft-foundry/foundry-agent-webapp.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.github/skills/writing-csharp-code .gemini/skills/writing-csharp-code && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "writing-csharp-code" agent skill from https://github.com/microsoft-foundry/foundry-agent-webapp/tree/main/.github/skills/writing-csharp-code into .gemini/skills/writing-csharp-code/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "writing-csharp-code", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install microsoft-foundry/foundry-agent-webapp writing-csharp-codeInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add microsoft-foundry/foundry-agent-webapp --skill writing-csharp-code -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/microsoft-foundry/foundry-agent-webapp.git skills-src && mkdir -p .github/skills && cp -r skills-src/.github/skills/writing-csharp-code .github/skills/writing-csharp-code && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "writing-csharp-code" agent skill from https://github.com/microsoft-foundry/foundry-agent-webapp/tree/main/.github/skills/writing-csharp-code into .github/skills/writing-csharp-code/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "writing-csharp-code", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add microsoft-foundry/foundry-agent-webapp --skill writing-csharp-code -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install microsoft-foundry/foundry-agent-webapp writing-csharp-code --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/microsoft-foundry/foundry-agent-webapp.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.github/skills/writing-csharp-code .opencode/skills/writing-csharp-code && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "writing-csharp-code" agent skill from https://github.com/microsoft-foundry/foundry-agent-webapp/tree/main/.github/skills/writing-csharp-code into .opencode/skills/writing-csharp-code/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "writing-csharp-code", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
writing-csharp-codeProvides C and ASP.NET Core coding standards for this repository.
Writing Csharp Code is an agent skill from microsoft-foundry/foundry-agent-webapp. Provides C and ASP.NET Core coding standards for this repository. Use when writing or modifying C code, implementing API endpoints, configuring middleware, or working with authentication in the backend.
Its SKILL.md is about 3.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Backend & APIs, covering Code quality, Authentication and REST APIs. It works with C#, ASP.NET Core, Azure AI Foundry and OpenAI. The repository describes itself as: GitHub Copilot enabled repo for building and deploying a web application with Entra ID authentication and integrated with Azure AI Foundry Agents. The licence is MIT.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit f6cb362. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
dotnetFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
github.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Writing Csharp Code loads about 3.2k tokens when it runs. Until then it costs about 56 tokens; SKILL.md has 649 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
Auto-load `.env` file before building configuration:ombine(Directory.GetCurrentDirectory(), ".env");Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from microsoft-foundry/foundry-agent-webapp at commit f6cb362, republished under its MIT licence (© microsoft-foundry). 649 words, ~3,200 tokens.
.claude/skills/writing-csharp-code/SKILL.md (or your agent's skills folder).Goal: Write clean, secure ASP.NET Core code with proper authentication
The backend runs in watch mode (dotnet watch run). When you edit C# code:
VS Code Tasks (use Run Task command or check terminal panel):
Backend: ASP.NET Core API - Runs dotnet watch run with live recompilationNo restart needed - Just edit, save, and test. Watch for compilation errors in the terminal.
Testing changes: Use Playwright browser tools to make requests and check browser console logs, or call endpoints directly.
Use typed request models, CancellationToken, and IHostEnvironment:
app.MapPost("/api/endpoint", async (
RequestModel request,
MyService service,
IHostEnvironment env,
CancellationToken cancellationToken) =>
{
try
{
var result = await service.ProcessAsync(request, cancellationToken);
return Results.Ok(result);
}
catch (Exception ex)
{
return ErrorResponseFactory.CreateFromException(ex, env);
}
})
.RequireAuthorization("RequireChatScope")
.WithName("EndpointName");JWT Bearer with Entra ID:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(options =>
{
builder.Configuration.Bind("AzureAd", options);
options.TokenValidationParameters.ValidAudiences = new[]
{
builder.Configuration["AzureAd:ClientId"],
$"api://{builder.Configuration["AzureAd:ClientId"]}"
};
}, options => builder.Configuration.Bind("AzureAd", options));// ✅ Use async/await with CancellationToken
public async Task<Result> ProcessAsync(Request req, CancellationToken ct)
{
return await _service.ExecuteAsync(req, ct);
}
// ❌ Never block on async
var result = _service.ExecuteAsync(req).Result; // WRONGpublic async IAsyncEnumerable<string> StreamAsync(
string input,
[EnumeratorCancellation] CancellationToken cancellationToken = default)
{
await foreach (var chunk in source.WithCancellation(cancellationToken))
{
yield return chunk;
}
}TokenCredential credential = env.IsDevelopment()
? new ChainedTokenCredential(
new AzureCliCredential(),
new AzureDeveloperCliCredential()) // Supports 'azd auth login'
: new ManagedIdentityCredential(miClientId); // User-assigned MI in productionWhy ChainedTokenCredential: Avoids DefaultAzureCredential's "fail fast" mode issues. Explicit, predictable credential chain.
public class MyService : IDisposable
{
private readonly SemaphoreSlim _lock = new(1, 1);
private readonly CancellationTokenSource _disposeCts = new();
private bool _disposed;
public void DoWork()
{
ObjectDisposedException.ThrowIf(_disposed, this);
// ...
}
public void Dispose()
{
if (_disposed) return;
_disposed = true;
// Cancel pending operations first
try { _disposeCts.Cancel(); }
catch (ObjectDisposedException) { }
_disposeCts.Dispose();
_lock.Dispose();
}
}Use ErrorResponseFactory.CreateFromException() for consistent error responses.
See: backend/WebApp.Api/Models/ErrorResponse.cs
.Result or .Wait() on async methodsCancellationToken parameter.RequireAuthorization() on endpointsIDisposableGoal: Serve static files → validate auth → route APIs → SPA fallback
app.UseDefaultFiles(); // index.html for /
app.UseStaticFiles(); // wwwroot/* assets
app.UseCors(); // Dev only
app.UseAuthentication(); // Validate JWT
app.UseAuthorization(); // Enforce scope
// Map endpoints here
app.MapFallbackToFile("index.html"); // MUST BE LASTSee: backend/WebApp.Api/Services/AgentFrameworkService.cs
SDK Packages:
Azure.AI.Projects — Main entry point, v2 Agents API (see *.csproj for version)Azure.AI.Projects.Agents — ProjectsAgentVersion, DeclarativeAgentDefinition, AgentAdministrationClientAzure.AI.Extensions.OpenAI — ProjectOpenAIClient, ProjectConversationsClient, ProjectResponsesClientSub-namespaces: Azure.AI.Projects.Agents, Azure.AI.Extensions.OpenAI, OpenAI.Responses
Key patterns:
IDisposable implementationObjectDisposedException.ThrowIf) in all public methodsProjectsAgentVersion resolved once per process via SemaphoreSlimAI_AGENT_ENDPOINT, AI_AGENT_ID, optional AI_AGENT_VERSION)Agent Loading (direct SDK):
// Load agent metadata directly from v2 Agents API.
// NOTE: the REST spec has no "latest" keyword — the agent_version path parameter is a
// plain string. To resolve the newest version, enumerate versions in descending order
// and take the first. Pin a specific version by passing its id to GetAgentVersionAsync.
ProjectsAgentVersion? agentVersion = null;
await foreach (var v in projectClient.AgentAdministrationClient.GetAgentVersionsAsync(
agentName: agentId,
limit: 1,
order: AgentListOrder.Descending,
after: null,
before: null,
cancellationToken: ct))
{
agentVersion = v;
break;
}
// Access definition for model/instructions/structured inputs
var definition = agentVersion?.Definition as DeclarativeAgentDefinition;Streaming (direct ProjectResponsesClient — required for specialized types):
// Direct SDK for streaming — IChatClient doesn't expose MCP/annotations.
// Pin to the resolved agentVersion.Version so streaming and metadata stay in sync.
ProjectResponsesClient responsesClient = projectClient.ProjectOpenAIClient.GetProjectResponsesClientForAgent(
new AgentReference(agentId, agentVersion.Version), conversationId);Why direct streaming? The IChatClient abstraction doesn't expose:
McpToolCallApprovalRequestItem for MCP approval flowsFileSearchCallResponseItem for file search quotesMessageResponseItem.OutputTextAnnotations for citationsStreaming Pattern: Returns IAsyncEnumerable<StreamChunk> where StreamChunk contains either:
chunk.IsText, chunk.TextDelta)chunk.HasAnnotations, chunk.Annotations)Streaming Response Types (from OpenAI.Responses):
StreamingResponseOutputTextDeltaUpdate - Text content deltaStreamingResponseOutputItemDoneUpdate - Item completion (has annotations)StreamingResponseCompletedUpdate - Response completion with usage statsImage Validation (in BuildUserMessage()):
image/png, image/jpeg, image/gif, image/webpAnnotation Types (from OpenAI.Responses):
UriCitationMessageAnnotation - Bing, Azure AI Search, SharePointFileCitationMessageAnnotation - File search (vector stores)FilePathMessageAnnotation - Code interpreter outputContainerFileCitationMessageAnnotation - Container file citationsStarter Prompts: Parsed from agent metadata (starterPrompts key, newline-separated).
Auto-load .env file before building configuration:
var envFile = Path.Combine(Directory.GetCurrentDirectory(), ".env");
if (File.Exists(envFile))
{
foreach (var line in File.ReadAllLines(envFile)
.Where(l => !string.IsNullOrWhiteSpace(l) && !l.StartsWith("#")))
{
var parts = line.Split('=', 2);
if (parts.Length == 2)
Environment.SetEnvironmentVariable(parts[0].Trim(), parts[1].Trim());
}
}When things break: SDK type mismatches and missing methods almost always happen after a package upgrade. Check backend/WebApp.Api/WebApp.Api.csproj for current versions:
Azure.AI.Projects - check WebApp.Api.csproj for current versionAzure.Identity - check WebApp.Api.csproj for current versionIf types don't match documentation or samples, verify you're looking at docs for the same version installed in the project.
When you need to understand SDK internals, fetch the actual source:
For project-level overviews only—use sparingly:
# List public types in backend (overview, not deep exploration)
Get-ChildItem -Path backend -Recurse -Include *.cs |
Select-String -Pattern "^\s*(public|internal)\s+(class|record|interface)\s+(\w+)" |
ForEach-Object { $_.Matches.Groups[3].Value } | Sort-Object -Unique
# Find IDisposable implementations
Get-ChildItem -Path backend -Recurse -Include *.cs |
Select-String -Pattern ":\s*.*IDisposable"Use for: Quick inventory of what exists. Follow up with pattern search or IDE navigation for understanding.
Use when you need to discover exact type members on any .NET assembly (especially beta SDKs):
# 1. Build first to ensure DLLs are current
cd backend/WebApp.Api; dotnet build --no-restore
# 2. Find and load any assembly by name
$dll = Get-ChildItem -Path "bin/Debug" -Recurse -Filter "SomePackage.dll" | Select-Object -First 1
$asm = [System.Reflection.Assembly]::LoadFrom($dll.FullName)
# 3. Inspect a specific type's properties
$type = $asm.GetType("SomeNamespace.SomeClass")
Write-Host "Type: $($type.FullName)"
Write-Host "Assembly: $($asm.GetName().Name) v$($asm.GetName().Version)"
$type.GetProperties() | ForEach-Object { Write-Host " $($_.PropertyType.Name) $($_.Name)" }
# 4. Check base type for inherited members
Write-Host "Base: $($type.BaseType.Name)"
$type.BaseType.GetProperties() | ForEach-Object { Write-Host " $($_.PropertyType.Name) $($_.Name)" }Finding types by pattern (when you don't know exact namespace):
# Search for types matching a pattern
$asm.GetTypes() | Where-Object { $_.Name -like "*Response*" } | ForEach-Object { Write-Host $_.FullName }
# Find methods on a type
$type.GetMethods() | Where-Object { $_.Name -like "*Async*" } | Select-Object Name, ReturnTypeCommon assemblies to inspect (after dotnet build):
| Assembly | Path | Contains |
|---|---|---|
Azure.AI.Projects.dll | bin/Debug/net10.0/ | AIProjectClient, AgentReference |
Azure.AI.Projects.Agents.dll | bin/Debug/net10.0/ | AgentAdministrationClient, ProjectsAgentVersion, DeclarativeAgentDefinition |
Azure.AI.Extensions.OpenAI.dll | bin/Debug/net10.0/ | ProjectOpenAIClient, ProjectConversationsClient, ProjectResponsesClient |
OpenAI.dll | bin/Debug/net10.0/ | ResponseItem, StreamingResponse*, annotations |
Azure.Identity.dll | bin/Debug/net10.0/ | Credential types |
When to use: Beta SDK properties aren't in docs, IDE tooltips are incomplete, or you need to verify a type's actual API surface.
Limitation: Returns raw API surface without intent or usage guidance. Combine with GitHub source for context.
© microsoft-foundry, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .github/skills/writing-csharp-code of microsoft-foundry/foundry-agent-webapp.
Open the folder on GitHubat commit f6cb362
Writing Csharp Code next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Writing Csharp Code this skillmicrosoft-foundry/foundry-agent-webapp | 127 | — | ~3.2k | Automated safety check: Notes | MIT | |
| Using Dotnetnovotnyllc/dotnet-artisan | 233 | — | ~2.3k | Automated safety check: Warn | MIT | |
| C# and .NET DeveloperJeffallan/claude-skills | 12k | — | ~1.3k | Automated safety check: Pass | MIT | |
| Verify Authendpointsmadeyoga/AuthEndpoints | 121 | — | ~2.6k | Automated safety check: Pass | MIT | |
| Dotnet Webapidotnet/skills | 5.6k | 2 repos | ~5.5k | Automated safety check: Pass | MIT | |
| Dotnet ExpertLeoYeAI/openclaw-master-skills | 2.2k | — | ~4.7k | Automated safety check: Pass | MIT |
novotnyllc/dotnet-artisan
Detects .NET intent for any C, ASP.NET Core, EF Core, Blazor, MAUI, Uno Platform, WPF, WinUI, SignalR, gRPC, xUnit, NuGet, or MSBuild request from prompt keywords and repository signals (.sln…
Jeffallan/claude-skills
Guides C# work on .NET 8+: ASP.NET Core APIs, Entity Framework Core data access, Blazor apps and CQRS with MediatR, following a five-step build workflow.
madeyoga/AuthEndpoints
Drive the AuthEndpoints HTTP API via the in-repo test host (cookie sessions, Identity bearer, Simple JWT, CSRF, ReAuth).
dotnet/skills
Guides creation and modification of ASP.NET Core Web API endpoints with correct HTTP semantics, OpenAPI metadata, and error handling.
LeoYeAI/openclaw-master-skills
A skill your agent uses when building .NET 8/9 applications, ASP.NET Core APIs, Entity Framework Core, MediatR CQRS, modular monolith architecture, FluentValidation, Result pattern, JWT…
novotnyllc/dotnet-artisan
Baseline C skill loaded for every .NET code path. An agent skill from novotnyllc/dotnet-artisan.
microsoft-foundry/foundry-agent-webapp
Provides commit message format and workflow for this repository.
microsoft-foundry/foundry-agent-webapp
Provides SSE streaming patterns for the chat API and frontend.
microsoft-foundry/foundry-agent-webapp
Provides structured plan template for feature implementation.
microsoft-foundry/foundry-agent-webapp
Provides research patterns for Foundry Agent Service SDK. An agent skill from microsoft-foundry/foundry-agent-webapp.
microsoft-foundry/foundry-agent-webapp
Provides deployment commands and troubleshooting for Azure Container Apps.
microsoft-foundry/foundry-agent-webapp
Synchronize MCP server configuration between VS Code (.vscode/mcp.json) and Copilot CLI (~/.copilot/mcp-config.json).
Works with
Categories
Provides C and ASP.NET Core coding standards for this repository. Writing Csharp Code is an agent skill from microsoft-foundry/foundry-agent-webapp.NET Core coding standards for this repository.
Writing Csharp Code fits situations like: modifying C code; implementing API endpoints; configuring middleware; working with authentication in the backend.
Run `npx skills add microsoft-foundry/foundry-agent-webapp --skill writing-csharp-code -a claude-code`. Or copy the skill folder (.github/skills/writing-csharp-code in microsoft-foundry/foundry-agent-webapp) into .claude/skills/writing-csharp-code in your project. Claude Code loads it when a task matches its description.
Run `npx skills add microsoft-foundry/foundry-agent-webapp --skill writing-csharp-code -a codex`. Or copy the skill folder (.github/skills/writing-csharp-code in microsoft-foundry/foundry-agent-webapp) into .agents/skills/writing-csharp-code in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add microsoft-foundry/foundry-agent-webapp --skill writing-csharp-code -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/writing-csharp-code, .gemini/skills/writing-csharp-code, .github/skills/writing-csharp-code and .opencode/skills/writing-csharp-code in your project.
Going by SKILL.md and its folder, Writing Csharp Code needs the command-line tools its instructions call (dotnet).
SKILL.md names 1 domain. As links in the text: github.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Writing Csharp Code is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.2k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Writing Csharp Code: Using Dotnet (novotnyllc/dotnet-artisan, 233 stars), C# and .NET Developer (Jeffallan/claude-skills, 12k stars), Verify Authendpoints (madeyoga/AuthEndpoints, 121 stars) and Dotnet Webapi (dotnet/skills, 5.6k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
microsoft-foundry (a GitHub organization) maintains it in microsoft-foundry/foundry-agent-webapp, which has 127 GitHub stars. The repository holds 19 skills in this directory. The repository was last updated on April 21, 2026.
Source: microsoft-foundry/foundry-agent-webapp on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.