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" });
Bulk search
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.