.NET / C# SDK

Single-file client for .NET 6+.

The .NET SDK is one file — drop MnueronClient.cs into your project. No NuGet package required; uses built-in System.Net.Http.Json.

Quick start

using Mnueron;

await using var client = new MnueronClient("mnu_...");

var mem = await client.SaveAsync(
    content: "User prefers concise replies",
    @namespace: "my-app",
    tags: new[] { "preferences" });

foreach (var r in await client.SearchAsync(
             "how does the user like responses?",
             @namespace: "my-app", k: 5))
    Console.WriteLine($"{r.Content} ({r.Score})");

await client.UpdateAsync(mem.Id,
    tags: new[] { "preferences", "tone" },
    metadata: new Dictionary<string, object?> { ["confidence"] = 0.9 });

await client.DeleteAsync(mem.Id);

Env vars

export MNUERON_API_KEY=mnu_...
# Optional — default is https://www.mnueron.com
export MNUERON_API_URL=https://www.mnueron.com
await using var client = new MnueronClient();  // picks up env vars

ASP.NET integration

// Program.cs
builder.Services.AddSingleton(sp =>
    new MnueronClient(apiKey: builder.Configuration["Mnueron:ApiKey"]!));

// In a controller
public class ChatController : ControllerBase
{
    private readonly MnueronClient _mnueron;
    public ChatController(MnueronClient mnueron) => _mnueron = mnueron;

    [HttpPost("ask")]
    public async Task<IActionResult> Ask([FromBody] AskRequest req)
    {
        var context = await _mnueron.SearchAsync(
            req.Question,
            @namespace: $"user-{User.Identity!.Name}",
            k: 5);
        // ... pass context to your LLM
        return Ok();
    }
}

Date + metadata filters

var since = DateTimeOffset.UtcNow.AddDays(-1).ToUnixTimeMilliseconds();
var recent = await client.ListAsync(
    @namespace: "my-app",
    createdAfter: since,
    metadataFilter: new Dictionary<string, object?> { ["speaker"] = "sarah" });
var bulk = await client.BulkSearchAsync(
    new[] { "onboarding", "billing edge cases", "JWT setup" },
    @namespace: "work", k: 5);

foreach (var r in bulk)
    Console.WriteLine($"{r.Query}{r.Hits.Count} hits");

Webhooks

var hook = await client.CreateWebhookAsync(
    url: "https://example.com/mnueron-hook",
    events: new[] { "memory.saved", "memory.deleted" });
Console.WriteLine($"Store now: {hook.Secret}");

// In your ASP.NET handler:
[HttpPost("mnueron-hook")]
public async Task<IActionResult> Hook()
{
    using var ms = new MemoryStream();
    await Request.Body.CopyToAsync(ms);
    var body = ms.ToArray();
    var sig = Request.Headers["X-Mnueron-Signature"].ToString();
    if (!MnueronClient.VerifyWebhookSignature(_secret, body, sig))
        return Unauthorized();
    // ... handle event
    return Ok();
}

Cancellation tokens

Every async method takes an optional CancellationToken — wire it up from HttpContext.RequestAborted or your own CancellationTokenSource.

Last updated 2026-05-16edit