-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
46 lines (35 loc) · 1.59 KB
/
Copy pathProgram.cs
File metadata and controls
46 lines (35 loc) · 1.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Builder;
using Microsoft.Azure.Functions.Worker.Extensions.Mcp.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
var builder = FunctionsApplication.CreateBuilder(args);
builder.ConfigureFunctionsWebApplication();
builder.Services
.AddApplicationInsightsTelemetryWorkerService()
.ConfigureFunctionsApplicationInsights();
builder.EnableMcpToolMetadata();
// Adapter: map IOptionsSnapshot<ToolOptions> to IOptionsMonitor<ToolOptions>
builder.Services.AddSingleton<IOptionsSnapshot<ToolOptions>>(sp =>
new OptionsSnapshotFromMonitor<ToolOptions>(sp.GetRequiredService<IOptionsMonitor<ToolOptions>>()));
builder.Build().Run();
// Workaround: The MCP preview extension tries to resolve IOptionsSnapshot<ToolOptions>
// from the root provider. In .NET 8+ this throws. Adapt snapshot from monitor as singleton.
internal sealed class OptionsSnapshotFromMonitor<T> : IOptionsSnapshot<T> where T : class
{
private readonly IOptionsMonitor<T> _monitor;
public OptionsSnapshotFromMonitor(IOptionsMonitor<T> monitor)
=> _monitor = monitor;
public T Value => _monitor.CurrentValue;
public T Get(string? name) => _monitor.Get(name);
}
// Register the adapter for ToolOptions
public partial class Program
{
static Program()
{
// This static constructor is used to register services on startup.
// Since FunctionsApplicationBuilder is already created above, we add via global ServiceCollection extensions.
}
}