Add SchemaCreateOptions in McpServerToolCreateOptions/McpServerPromptCreateOptions (#354)
* Add SchemaCreateOptions in McpServerToolCreateOptions * Use TransformSchemaNode for SchemaCreateOptions testing * Add SchemaCreateOptions in McpServerPromptCreateOptions also
This commit is contained in:
parent
ea296f5dc4
commit
e190844218
6 changed files with 71 additions and 0 deletions
|
|
@ -130,6 +130,7 @@ internal sealed class AIFunctionMcpServerPrompt : McpServerPrompt
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
JsonSchemaCreateOptions = options?.SchemaCreateOptions,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// <summary>Creates an <see cref="McpServerPrompt"/> that wraps the specified <see cref="AIFunction"/>.</summary>
|
/// <summary>Creates an <see cref="McpServerPrompt"/> that wraps the specified <see cref="AIFunction"/>.</summary>
|
||||||
|
|
|
||||||
|
|
@ -151,6 +151,7 @@ internal sealed class AIFunctionMcpServerTool : McpServerTool
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
JsonSchemaCreateOptions = options?.SchemaCreateOptions,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// <summary>Creates an <see cref="McpServerTool"/> that wraps the specified <see cref="AIFunction"/>.</summary>
|
/// <summary>Creates an <see cref="McpServerTool"/> that wraps the specified <see cref="AIFunction"/>.</summary>
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
using Microsoft.Extensions.AI;
|
||||||
using ModelContextProtocol.Utils.Json;
|
using ModelContextProtocol.Utils.Json;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
|
|
@ -55,6 +56,14 @@ public sealed class McpServerPromptCreateOptions
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public JsonSerializerOptions? SerializerOptions { get; set; }
|
public JsonSerializerOptions? SerializerOptions { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the JSON schema options when creating <see cref="AIFunction"/> from a method.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Defaults to <see cref="AIJsonSchemaCreateOptions.Default"/> if left unspecified.
|
||||||
|
/// </remarks>
|
||||||
|
public AIJsonSchemaCreateOptions? SchemaCreateOptions { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a shallow clone of the current <see cref="McpServerPromptCreateOptions"/> instance.
|
/// Creates a shallow clone of the current <see cref="McpServerPromptCreateOptions"/> instance.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -65,5 +74,6 @@ public sealed class McpServerPromptCreateOptions
|
||||||
Name = Name,
|
Name = Name,
|
||||||
Description = Description,
|
Description = Description,
|
||||||
SerializerOptions = SerializerOptions,
|
SerializerOptions = SerializerOptions,
|
||||||
|
SchemaCreateOptions = SchemaCreateOptions,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
using Microsoft.Extensions.AI;
|
||||||
using ModelContextProtocol.Utils.Json;
|
using ModelContextProtocol.Utils.Json;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
|
|
@ -132,6 +133,14 @@ public sealed class McpServerToolCreateOptions
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public JsonSerializerOptions? SerializerOptions { get; set; }
|
public JsonSerializerOptions? SerializerOptions { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the JSON schema options when creating <see cref="AIFunction"/> from a method.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Defaults to <see cref="AIJsonSchemaCreateOptions.Default"/> if left unspecified.
|
||||||
|
/// </remarks>
|
||||||
|
public AIJsonSchemaCreateOptions? SchemaCreateOptions { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a shallow clone of the current <see cref="McpServerToolCreateOptions"/> instance.
|
/// Creates a shallow clone of the current <see cref="McpServerToolCreateOptions"/> instance.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -147,5 +156,6 @@ public sealed class McpServerToolCreateOptions
|
||||||
OpenWorld = OpenWorld,
|
OpenWorld = OpenWorld,
|
||||||
ReadOnly = ReadOnly,
|
ReadOnly = ReadOnly,
|
||||||
SerializerOptions = SerializerOptions,
|
SerializerOptions = SerializerOptions,
|
||||||
|
SchemaCreateOptions = SchemaCreateOptions,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,9 @@ using Microsoft.Extensions.DependencyInjection;
|
||||||
using ModelContextProtocol.Protocol.Types;
|
using ModelContextProtocol.Protocol.Types;
|
||||||
using ModelContextProtocol.Server;
|
using ModelContextProtocol.Server;
|
||||||
using Moq;
|
using Moq;
|
||||||
|
using System.ComponentModel;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.Text.Json;
|
||||||
|
|
||||||
namespace ModelContextProtocol.Tests.Server;
|
namespace ModelContextProtocol.Tests.Server;
|
||||||
|
|
||||||
|
|
@ -316,6 +318,30 @@ public class McpServerPromptTests
|
||||||
TestContext.Current.CancellationToken));
|
TestContext.Current.CancellationToken));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task SupportsSchemaCreateOptions()
|
||||||
|
{
|
||||||
|
AIJsonSchemaCreateOptions schemaCreateOptions = new()
|
||||||
|
{
|
||||||
|
TransformSchemaNode = (context, node) =>
|
||||||
|
{
|
||||||
|
node["description"] = "1234";
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
McpServerPrompt prompt = McpServerPrompt.Create(([Description("argument1")] int num, [Description("argument2")] string str) =>
|
||||||
|
{
|
||||||
|
return new ChatMessage(ChatRole.User, "Hello");
|
||||||
|
}, new() { SchemaCreateOptions = schemaCreateOptions });
|
||||||
|
|
||||||
|
Assert.NotNull(prompt.ProtocolPrompt.Arguments);
|
||||||
|
Assert.All(
|
||||||
|
prompt.ProtocolPrompt.Arguments,
|
||||||
|
x => Assert.Equal("1234", x.Description)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
private sealed class MyService;
|
private sealed class MyService;
|
||||||
|
|
||||||
private class DisposablePromptType : IDisposable
|
private class DisposablePromptType : IDisposable
|
||||||
|
|
|
||||||
|
|
@ -355,6 +355,29 @@ public partial class McpServerToolTests
|
||||||
Assert.Equal("image", result.Content[1].Type);
|
Assert.Equal("image", result.Content[1].Type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task SupportsSchemaCreateOptions()
|
||||||
|
{
|
||||||
|
AIJsonSchemaCreateOptions schemaCreateOptions = new ()
|
||||||
|
{
|
||||||
|
TransformSchemaNode = (context, node) =>
|
||||||
|
{
|
||||||
|
node["text"] = "1234";
|
||||||
|
return node;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
McpServerTool tool = McpServerTool.Create((int num, string str) =>
|
||||||
|
{
|
||||||
|
return "42";
|
||||||
|
}, new() { SchemaCreateOptions = schemaCreateOptions });
|
||||||
|
|
||||||
|
Assert.All(
|
||||||
|
tool.ProtocolTool.InputSchema.GetProperty("properties").EnumerateObject(),
|
||||||
|
x => Assert.True(x.Value.TryGetProperty("text", out JsonElement value) && value.ToString() == "1234")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
private sealed class MyService;
|
private sealed class MyService;
|
||||||
|
|
||||||
private class DisposableToolType : IDisposable
|
private class DisposableToolType : IDisposable
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue