Use WithResources in EverythingServer sample (#400)
This commit is contained in:
parent
d86b3277d4
commit
26c3622101
2 changed files with 41 additions and 78 deletions
|
|
@ -1,5 +1,6 @@
|
||||||
using EverythingServer;
|
using EverythingServer;
|
||||||
using EverythingServer.Prompts;
|
using EverythingServer.Prompts;
|
||||||
|
using EverythingServer.Resources;
|
||||||
using EverythingServer.Tools;
|
using EverythingServer.Tools;
|
||||||
using Microsoft.Extensions.AI;
|
using Microsoft.Extensions.AI;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
@ -14,8 +15,6 @@ using OpenTelemetry.Metrics;
|
||||||
using OpenTelemetry.Resources;
|
using OpenTelemetry.Resources;
|
||||||
using OpenTelemetry.Trace;
|
using OpenTelemetry.Trace;
|
||||||
|
|
||||||
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
|
|
||||||
|
|
||||||
var builder = Host.CreateApplicationBuilder(args);
|
var builder = Host.CreateApplicationBuilder(args);
|
||||||
builder.Logging.AddConsole(consoleLogOptions =>
|
builder.Logging.AddConsole(consoleLogOptions =>
|
||||||
{
|
{
|
||||||
|
|
@ -38,82 +37,7 @@ builder.Services
|
||||||
.WithTools<TinyImageTool>()
|
.WithTools<TinyImageTool>()
|
||||||
.WithPrompts<ComplexPromptType>()
|
.WithPrompts<ComplexPromptType>()
|
||||||
.WithPrompts<SimplePromptType>()
|
.WithPrompts<SimplePromptType>()
|
||||||
.WithListResourcesHandler(async (ctx, ct) =>
|
.WithResources<SimpleResourceType>()
|
||||||
{
|
|
||||||
return new ListResourcesResult
|
|
||||||
{
|
|
||||||
Resources =
|
|
||||||
[
|
|
||||||
new ModelContextProtocol.Protocol.Types.Resource { Name = "Direct Text Resource", Description = "A direct text resource", MimeType = "text/plain", Uri = "test://direct/text/resource" },
|
|
||||||
]
|
|
||||||
};
|
|
||||||
})
|
|
||||||
.WithListResourceTemplatesHandler(async (ctx, ct) =>
|
|
||||||
{
|
|
||||||
return new ListResourceTemplatesResult
|
|
||||||
{
|
|
||||||
ResourceTemplates =
|
|
||||||
[
|
|
||||||
new ResourceTemplate { Name = "Template Resource", Description = "A template resource with a numeric ID", UriTemplate = "test://template/resource/{id}" }
|
|
||||||
]
|
|
||||||
};
|
|
||||||
})
|
|
||||||
.WithReadResourceHandler(async (ctx, ct) =>
|
|
||||||
{
|
|
||||||
var uri = ctx.Params?.Uri;
|
|
||||||
|
|
||||||
if (uri == "test://direct/text/resource")
|
|
||||||
{
|
|
||||||
return new ReadResourceResult
|
|
||||||
{
|
|
||||||
Contents = [new TextResourceContents
|
|
||||||
{
|
|
||||||
Text = "This is a direct resource",
|
|
||||||
MimeType = "text/plain",
|
|
||||||
Uri = uri,
|
|
||||||
}]
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (uri is null || !uri.StartsWith("test://template/resource/"))
|
|
||||||
{
|
|
||||||
throw new NotSupportedException($"Unknown resource: {uri}");
|
|
||||||
}
|
|
||||||
|
|
||||||
int index = int.Parse(uri["test://template/resource/".Length..]) - 1;
|
|
||||||
|
|
||||||
if (index < 0 || index >= ResourceGenerator.Resources.Count)
|
|
||||||
{
|
|
||||||
throw new NotSupportedException($"Unknown resource: {uri}");
|
|
||||||
}
|
|
||||||
|
|
||||||
var resource = ResourceGenerator.Resources[index];
|
|
||||||
|
|
||||||
if (resource.MimeType == "text/plain")
|
|
||||||
{
|
|
||||||
return new ReadResourceResult
|
|
||||||
{
|
|
||||||
Contents = [new TextResourceContents
|
|
||||||
{
|
|
||||||
Text = resource.Description!,
|
|
||||||
MimeType = resource.MimeType,
|
|
||||||
Uri = resource.Uri,
|
|
||||||
}]
|
|
||||||
};
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return new ReadResourceResult
|
|
||||||
{
|
|
||||||
Contents = [new BlobResourceContents
|
|
||||||
{
|
|
||||||
Blob = resource.Description!,
|
|
||||||
MimeType = resource.MimeType,
|
|
||||||
Uri = resource.Uri,
|
|
||||||
}]
|
|
||||||
};
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.WithSubscribeToResourcesHandler(async (ctx, ct) =>
|
.WithSubscribeToResourcesHandler(async (ctx, ct) =>
|
||||||
{
|
{
|
||||||
var uri = ctx.Params?.Uri;
|
var uri = ctx.Params?.Uri;
|
||||||
|
|
|
||||||
39
samples/EverythingServer/Resources/SimpleResourceType.cs
Normal file
39
samples/EverythingServer/Resources/SimpleResourceType.cs
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
using ModelContextProtocol.Protocol.Types;
|
||||||
|
using ModelContextProtocol.Server;
|
||||||
|
using System.ComponentModel;
|
||||||
|
|
||||||
|
namespace EverythingServer.Resources;
|
||||||
|
|
||||||
|
[McpServerResourceType]
|
||||||
|
public class SimpleResourceType
|
||||||
|
{
|
||||||
|
[McpServerResource(UriTemplate = "test://direct/text/resource", Name = "Direct Text Resource", MimeType = "text/plain")]
|
||||||
|
[Description("A direct text resource")]
|
||||||
|
public static string DirectTextResource() => "This is a direct resource";
|
||||||
|
|
||||||
|
[McpServerResource(UriTemplate = "test://template/resource/{id}", Name = "Template Resource")]
|
||||||
|
[Description("A template resource with a numeric ID")]
|
||||||
|
public static ResourceContents TemplateResource(RequestContext<ReadResourceRequestParams> requestContext, int id)
|
||||||
|
{
|
||||||
|
int index = id - 1;
|
||||||
|
if ((uint)index >= ResourceGenerator.Resources.Count)
|
||||||
|
{
|
||||||
|
throw new NotSupportedException($"Unknown resource: {requestContext.Params?.Uri}");
|
||||||
|
}
|
||||||
|
|
||||||
|
var resource = ResourceGenerator.Resources[index];
|
||||||
|
return resource.MimeType == "text/plain" ?
|
||||||
|
new TextResourceContents
|
||||||
|
{
|
||||||
|
Text = resource.Description!,
|
||||||
|
MimeType = resource.MimeType,
|
||||||
|
Uri = resource.Uri,
|
||||||
|
} :
|
||||||
|
new BlobResourceContents
|
||||||
|
{
|
||||||
|
Blob = resource.Description!,
|
||||||
|
MimeType = resource.MimeType,
|
||||||
|
Uri = resource.Uri,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue