loading…
Search for a command to run...
loading…
Remote MCP server for Hangfire that exposes background jobs as dynamic MCP tools, allowing clients like VS Code to inspect, trigger, and manage jobs in-process.
Remote MCP server for Hangfire that exposes background jobs as dynamic MCP tools, allowing clients like VS Code to inspect, trigger, and manage jobs in-process.
NuGet NuGet Downloads Build License: MIT
Remote MCP server for Hangfire — exposes background jobs as MCP tools, in-process with the Hangfire server.
📖 Documentation: https://nikiforovall.github.io/hangfire-mcp-dotnet/
/mcp. Any MCP client (VS Code, Claude Desktop, custom agents) can connect.MethodInfo. JSON Schema generated per method. Required vs. optional respects both C# defaults and nullable annotations (int?, string?).Install:
dotnet add package Nall.Hangfire.Mcp
Minimum host setup — three lines on top of an existing Hangfire app:
builder.Services.AddHangfireMcp(); // registers MCP server + JobCatalog
var app = builder.Build();
app.MapHangfireMcp("/mcp"); // streamable HTTP endpoint
Full minimal example:
using Hangfire;
using Nall.Hangfire.Mcp;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHangfire(cfg => cfg.UsePostgreSqlStorage(...));
builder.Services.AddHangfireServer();
builder.Services.AddHangfireMcp();
var app = builder.Build();
app.MapHangfireDashboard();
app.MapHangfireMcp("/mcp");
app.Services.GetRequiredService<IRecurringJobManager>()
.AddOrUpdate<IReportJob>("report.daily", j => j.GenerateAsync(2026, "pdf", null), Cron.Daily);
app.Run();
Every recurring job is now an MCP tool: Run_report.daily with a JSON Schema derived from GenerateAsync's parameters.
VS Code MCP config:
{
"servers": {
"hangfire": { "url": "https://your-host/mcp" }
}
}
| Source | What it sees | When to use |
|---|---|---|
RecurringStorage (default) |
RecurringJobDto.Job from Hangfire storage. |
Every recurring job is a tool. |
StaticManifest |
Compile-time scan of AddOrUpdate / Enqueue / Schedule call sites via the optional Nall.Hangfire.Mcp.Generator source generator. |
Expose helper methods you only ever one-shot enqueue, or jobs not yet registered as recurring. |
All |
Union of both, deduped by (DeclaringType, MethodInfo). |
Most apps. |
Configure via AddHangfireMcp:
builder.Services.AddHangfireMcp(o =>
{
o.Sources = JobDiscoverySources.All; // default: RecurringStorage
o.Filter = rj => rj.Id.StartsWith("public."); // optional storage filter
});
To populate the manifest, install the generator package in each project that contains Hangfire registration calls:
dotnet add package Nall.Hangfire.Mcp.Generator
Every MCP server hosted by AddHangfireMcp() also exposes a fixed set of hangfire_* tools for inspecting and managing jobs alongside the dynamic Run_* tools:
| Tool | Purpose |
|---|---|
hangfire_get_statistics |
Global counters: Enqueued/Failed/Processing/Scheduled/Succeeded/Deleted/Recurring/Retries/Servers. |
hangfire_list_jobs |
Page jobs by state with optional filter. Use this to discover ids before bulk ops. |
hangfire_get_job |
Full details + state history for one id. |
hangfire_delete_job |
Move one job to Deleted. |
hangfire_requeue_job |
Requeue one job (covers retry of Failed). |
hangfire_delete_jobs |
Bulk delete by ids or filter (exactly one). |
hangfire_requeue_jobs |
Bulk requeue by ids or filter. |
Filter shape (used by list_jobs, delete_jobs, requeue_jobs):
{
"state": "Failed",
"queue": "default",
"jobType": "ReportJob",
"method": "Generate",
"messageContains": "timeout",
"exceptionContains": "SqlException"
}
jobType and method are case-insensitive substring matches. messageContains / exceptionContains are most useful for Failed.
For each tool call:
T? value or annotated reference) and no default → bound to null when omitted.MapHangfireMcp returns IEndpointConventionBuilder — the library is auth-agnostic. Chain any ASP.NET Core auth scheme:
app.MapHangfireMcp("/mcp")
.RequireAuthorization(p => p.RequireAuthenticatedUser()
.AddAuthenticationSchemes(McpAuthenticationDefaults.AuthenticationScheme));
samples/Web wires Keycloak + JwtBearer + AddMcp() from ModelContextProtocol.AspNetCore.Authentication to advertise RFC 9728 protected-resource-metadata. End-to-end flow, standards, and gotchas: docs/authentication.md.AuthenticationHandler<T>, register it, and pass its scheme to RequireAuthorization above. The Run_* and hangfire_* tools work the same regardless of how the principal got there.samples/Web exercises overloads, complex objects, enums, collections, defaults, nullable optionals, and manifest-only one-shot jobs. GET /jobs lists the discovered catalog.
MIT
Run in your terminal:
claude mcp add nall-hangfire-mcp -- npx Security
Low riskAutomated heuristic from public metadata — not a security guarantee.