MCPulse 0.1.0
dotnet add package MCPulse --version 0.1.0
NuGet\Install-Package MCPulse -Version 0.1.0
<PackageReference Include="MCPulse" Version="0.1.0" />
<PackageVersion Include="MCPulse" Version="0.1.0" />
<PackageReference Include="MCPulse" />
paket add MCPulse --version 0.1.0
#r "nuget: MCPulse, 0.1.0"
#:package MCPulse@0.1.0
#addin nuget:?package=MCPulse&version=0.1.0
#tool nuget:?package=MCPulse&version=0.1.0
MCPulse for .NET
Analytics for MCP servers, for the official C# MCP SDK.
using MCPulse;
McPulse.Configure(new McPulseOptions { Key = "mp_live_…" });
Then wrap each tool invocation:
return await McPulse.RecordAsync(
toolName: request.Params.Name,
arguments: request.Params.Arguments,
clientName: server.ClientInfo?.Name,
invoke: () => next(request, cancellationToken));
Best placed in whatever your host already uses to see every call — a
CallTool handler wrapper, or the filter your server builder exposes.
Install
dotnet add package MCPulse
Zero package references. This library is loaded into other people's servers, and a transitive dependency that conflicts with what the customer already pins is a support burden with no upside. The canonicaliser, the HTTP call and the buffering are all in the base class library.
Options
| Property | Default | Meaning |
|---|---|---|
Key |
— | Ingest key, mp_live_…, minted per MCP in the dashboard |
Endpoint |
https://api.getmcpulse.com |
Point at a local API while developing |
Enabled |
true |
false makes everything a no-op — useful in tests and CI |
Debug |
false |
Log what is sent, and why a send failed, to stderr |
An empty key turns it off, so a server started without its key configured is silent rather than a source of 401s on every flush.
One known gap
RecordAsync wraps your handler, so a throw arrives as a throw rather than as
the isError result the server would have converted it into — that is what
separates crashed from tool_error.
What it cannot see is bad_args. The .NET SDK binds and validates arguments
before the handler runs, so a rejected argument set never reaches the wrapper.
Reporting it anyway would mean reading the difference back out of an error
message, and error strings are not an interface anyone promised to keep.
What leaves your process
Sizes and hashes. Arguments and results do not, and no option turns that on.
The three rules
- Never throw. Every entry point swallows. Your exception is re-raised untouched; ours never reach you.
- Never block. A bounded
ChannelwithDropOldestmeansTryWritenever blocks and never fails — the same mechanism gives rule 2 and the memory ceiling at once. - Never store customer data. See above.
Cross-language consistency
ArgsHash is the first 12 hex characters of the SHA-256 of the
RFC 8785 canonical form of the
arguments. tests/MCPulse.Tests/canonical.json is the shared conformance suite
every MCPulse SDK runs.
.NET needed two things undone and got one for free. System.Text.Json escapes
<, > and & by default, and .NET's round-trip number format writes 1E+21
and 1E-07 where ECMAScript writes 1e+21 and 1e-7. The free part: RFC 8785
sorts keys by UTF-16 code unit, which is exactly StringComparer.Ordinal.
Running the tests
dotnet run --project tests/MCPulse.Tests
Licence
MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net9.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.1.0 | 86 | 9/6/2026 |