diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d3386e5..51700ad 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,3 +8,4 @@ 1. List tools: `curl -vs http://localhost:9001 -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'` 1. Get item: `curl -vs http://localhost:9001 -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name": "get_item", "arguments": {"pathOrId": "/sitecore/content/home"}}}'` +1. Or use the MCP inspector by running: `npx @modelcontextprotocol/inspector` diff --git a/src/SitecoreBasicMcp.Http/SitecoreBasicMcp.Http.csproj b/src/SitecoreBasicMcp.Http/SitecoreBasicMcp.Http.csproj index 687df42..6a00e2c 100644 --- a/src/SitecoreBasicMcp.Http/SitecoreBasicMcp.Http.csproj +++ b/src/SitecoreBasicMcp.Http/SitecoreBasicMcp.Http.csproj @@ -7,7 +7,7 @@ - + diff --git a/src/SitecoreBasicMcp.Http/packages.lock.json b/src/SitecoreBasicMcp.Http/packages.lock.json index 7d16e74..f7fda07 100644 --- a/src/SitecoreBasicMcp.Http/packages.lock.json +++ b/src/SitecoreBasicMcp.Http/packages.lock.json @@ -4,11 +4,11 @@ "net10.0": { "ModelContextProtocol.AspNetCore": { "type": "Direct", - "requested": "[0.5.0-preview.1, )", - "resolved": "0.5.0-preview.1", - "contentHash": "4KYK/rc6E8uuSJorludY/0Gpcm0wCXT5BGyZPcLRHisMT+cqW/P6lOv5luQZvy6iOxhwMmTMmY7DzU+VKVvjaw==", + "requested": "[0.6.0-preview.1, )", + "resolved": "0.6.0-preview.1", + "contentHash": "UltrLduMY0CRzh4XZAx3hp9fQeprxeVqd8hXhKWlBRib2WUo8yAavTy5yQZrel4JnbjfGGN77dXPyphshpwvbQ==", "dependencies": { - "ModelContextProtocol": "0.5.0-preview.1" + "ModelContextProtocol": "0.6.0-preview.1" } }, "GraphQL.Client": { @@ -52,23 +52,23 @@ }, "Microsoft.Extensions.AI.Abstractions": { "type": "Transitive", - "resolved": "10.0.0", - "contentHash": "PHeuDm2tC6wJPEQvleUr2kNQaIMNqSf3aEbzkIPlZyQ0+0SYI9SwXVLdGD1NPBI+xB+Vb2lxZKhrFlIf9kP9WA==" + "resolved": "10.1.1", + "contentHash": "cgj8iHv4JwUpcPANZ0oLILz146Y1Oa+l280b1c1a3DjwZflH9nmYcrX952YUuqftz2sheAC2TPCGcEa6unKQgQ==" }, "ModelContextProtocol": { "type": "Transitive", - "resolved": "0.5.0-preview.1", - "contentHash": "QJpuNEnMZLJmvASbZ2nvMqENTZk3HYF83IihoHs3EJ5vTlz4sYjji9bXh2HP5UxpXIdHGn0iuHu0X2Tpq2zilw==", + "resolved": "0.6.0-preview.1", + "contentHash": "onUtGV9yny1rFZQ1qGUp6XPJBB2VxvWXvEioq8+/8hYOX6zEoc/Mc4tX8u7KRhU1mLss48jMh5DHFBMKifMiVw==", "dependencies": { - "ModelContextProtocol.Core": "0.5.0-preview.1" + "ModelContextProtocol.Core": "0.6.0-preview.1" } }, "ModelContextProtocol.Core": { "type": "Transitive", - "resolved": "0.5.0-preview.1", - "contentHash": "33V1Druluweou6x2LN6MSMbhiwHOYZxTUEJ1okFKjYDRIthctTVe0EJi//nifl4MRld2b5D5LnuV9sezz54p6g==", + "resolved": "0.6.0-preview.1", + "contentHash": "vjpbeJL7O4kNAgwv6wZtqlAAUX/tWaYLtbBzENDablIQfI1bH2tYTD/eK/6JvxP+Qp1H/lXaMvuRM6wohAzauA==", "dependencies": { - "Microsoft.Extensions.AI.Abstractions": "10.0.0" + "Microsoft.Extensions.AI.Abstractions": "10.1.1" } }, "System.Reactive": { @@ -81,7 +81,7 @@ "dependencies": { "GraphQL.Client": "[6.1.0, )", "GraphQL.Client.Serializer.SystemTextJson": "[6.1.0, )", - "ModelContextProtocol": "[0.5.0-preview.1, )" + "ModelContextProtocol": "[0.6.0-preview.1, )" } } } diff --git a/src/SitecoreBasicMcp.Stdio/SitecoreBasicMcp.Stdio.csproj b/src/SitecoreBasicMcp.Stdio/SitecoreBasicMcp.Stdio.csproj index 099da34..5bff2e0 100644 --- a/src/SitecoreBasicMcp.Stdio/SitecoreBasicMcp.Stdio.csproj +++ b/src/SitecoreBasicMcp.Stdio/SitecoreBasicMcp.Stdio.csproj @@ -9,7 +9,7 @@ - + diff --git a/src/SitecoreBasicMcp.Stdio/packages.lock.json b/src/SitecoreBasicMcp.Stdio/packages.lock.json index 633b9b8..630cf64 100644 --- a/src/SitecoreBasicMcp.Stdio/packages.lock.json +++ b/src/SitecoreBasicMcp.Stdio/packages.lock.json @@ -4,11 +4,11 @@ "net10.0": { "ModelContextProtocol": { "type": "Direct", - "requested": "[0.5.0-preview.1, )", - "resolved": "0.5.0-preview.1", - "contentHash": "QJpuNEnMZLJmvASbZ2nvMqENTZk3HYF83IihoHs3EJ5vTlz4sYjji9bXh2HP5UxpXIdHGn0iuHu0X2Tpq2zilw==", + "requested": "[0.6.0-preview.1, )", + "resolved": "0.6.0-preview.1", + "contentHash": "onUtGV9yny1rFZQ1qGUp6XPJBB2VxvWXvEioq8+/8hYOX6zEoc/Mc4tX8u7KRhU1mLss48jMh5DHFBMKifMiVw==", "dependencies": { - "ModelContextProtocol.Core": "0.5.0-preview.1" + "ModelContextProtocol.Core": "0.6.0-preview.1" } }, "GraphQL.Client": { @@ -52,15 +52,15 @@ }, "Microsoft.Extensions.AI.Abstractions": { "type": "Transitive", - "resolved": "10.0.0", - "contentHash": "PHeuDm2tC6wJPEQvleUr2kNQaIMNqSf3aEbzkIPlZyQ0+0SYI9SwXVLdGD1NPBI+xB+Vb2lxZKhrFlIf9kP9WA==" + "resolved": "10.1.1", + "contentHash": "cgj8iHv4JwUpcPANZ0oLILz146Y1Oa+l280b1c1a3DjwZflH9nmYcrX952YUuqftz2sheAC2TPCGcEa6unKQgQ==" }, "ModelContextProtocol.Core": { "type": "Transitive", - "resolved": "0.5.0-preview.1", - "contentHash": "33V1Druluweou6x2LN6MSMbhiwHOYZxTUEJ1okFKjYDRIthctTVe0EJi//nifl4MRld2b5D5LnuV9sezz54p6g==", + "resolved": "0.6.0-preview.1", + "contentHash": "vjpbeJL7O4kNAgwv6wZtqlAAUX/tWaYLtbBzENDablIQfI1bH2tYTD/eK/6JvxP+Qp1H/lXaMvuRM6wohAzauA==", "dependencies": { - "Microsoft.Extensions.AI.Abstractions": "10.0.0" + "Microsoft.Extensions.AI.Abstractions": "10.1.1" } }, "System.Reactive": { @@ -73,7 +73,7 @@ "dependencies": { "GraphQL.Client": "[6.1.0, )", "GraphQL.Client.Serializer.SystemTextJson": "[6.1.0, )", - "ModelContextProtocol": "[0.5.0-preview.1, )" + "ModelContextProtocol": "[0.6.0-preview.1, )" } } } diff --git a/src/SitecoreBasicMcp/SitecoreBasicMcp.csproj b/src/SitecoreBasicMcp/SitecoreBasicMcp.csproj index 86abd64..b9df33f 100644 --- a/src/SitecoreBasicMcp/SitecoreBasicMcp.csproj +++ b/src/SitecoreBasicMcp/SitecoreBasicMcp.csproj @@ -6,9 +6,9 @@ enable - - - + + + diff --git a/src/SitecoreBasicMcp/Tools/CreateItemTool.cs b/src/SitecoreBasicMcp/Tools/CreateItemTool.cs index 5c8024b..89f03ef 100644 --- a/src/SitecoreBasicMcp/Tools/CreateItemTool.cs +++ b/src/SitecoreBasicMcp/Tools/CreateItemTool.cs @@ -39,7 +39,7 @@ mutation CreateItem( record CreateItemData(BasicItem Item); record CreateItemMutationResponse(CreateItemData CreateItem); - [McpServerTool(Idempotent = false, ReadOnly = false, UseStructuredContent = true), Description("Create a new Sitecore item under parent id or path.")] + [McpServerTool(Idempotent = false, ReadOnly = false), Description("Create a new Sitecore item under parent id or path.")] public async Task CreateItem(string parentPathOrId, string name, string templateId, string language, Field[] fields, CancellationToken cancellationToken) { var client = await GetAuthoringClient(cancellationToken); @@ -70,7 +70,7 @@ public async Task CreateItem(string parentPathOrId, string name, string return ErrorResultFromGraphQL(response.Errors); } - return response.Data.CreateItem.Item; + return ItemResult(response.Data.CreateItem.Item); } } diff --git a/src/SitecoreBasicMcp/Tools/CreateItemVersionTool.cs b/src/SitecoreBasicMcp/Tools/CreateItemVersionTool.cs index e9d1995..7aa9815 100644 --- a/src/SitecoreBasicMcp/Tools/CreateItemVersionTool.cs +++ b/src/SitecoreBasicMcp/Tools/CreateItemVersionTool.cs @@ -1,5 +1,6 @@ using GraphQL; using Microsoft.Extensions.Options; +using ModelContextProtocol.Protocol; using ModelContextProtocol.Server; using SitecoreBasicMcp.Authentication; using System.ComponentModel; @@ -25,8 +26,8 @@ mutation AddItemVersion($itemId: ID!, $language: String!) { record AddItemVersionData(BasicItem Item); record AddItemVersionMutationResponse(AddItemVersionData AddItemVersion); - [McpServerTool(Idempotent = false, ReadOnly = false, UseStructuredContent = true), Description("Create a new language version to a Sitecore item by its path or id.")] - public async Task CreateItemVersion(string pathOrId, string language, CancellationToken cancellationToken) + [McpServerTool(Idempotent = false, ReadOnly = false), Description("Create a new language version to a Sitecore item by its path or id.")] + public async Task CreateItemVersion(string pathOrId, string language, CancellationToken cancellationToken) { var client = await GetAuthoringClient(cancellationToken); var resolveItemIdResult = await ResolveItemId(pathOrId, language, client, cancellationToken); @@ -53,7 +54,7 @@ public async Task CreateItemVersion(string pathOrId, string language, Ca return ErrorResultFromGraphQL(response.Errors); } - return response.Data.AddItemVersion.Item; + return ItemResult(response.Data.AddItemVersion.Item); } } diff --git a/src/SitecoreBasicMcp/Tools/DeleteItemTool.cs b/src/SitecoreBasicMcp/Tools/DeleteItemTool.cs index d72960d..ab37c4f 100644 --- a/src/SitecoreBasicMcp/Tools/DeleteItemTool.cs +++ b/src/SitecoreBasicMcp/Tools/DeleteItemTool.cs @@ -1,5 +1,6 @@ using GraphQL; using Microsoft.Extensions.Options; +using ModelContextProtocol.Protocol; using ModelContextProtocol.Server; using SitecoreBasicMcp.Authentication; using System.ComponentModel; @@ -24,8 +25,8 @@ mutation DeleteItem($path: String!) { record DeleteItemData(bool Successful); record DeleteItemMutationResponse(DeleteItemData DeleteItem); - [McpServerTool(Idempotent = false, ReadOnly = false, UseStructuredContent = true), Description("Delete a Sitecore item by its path or id.")] - public async Task DeleteItem(string pathOrId, CancellationToken cancellationToken) + [McpServerTool(Idempotent = false, ReadOnly = false), Description("Delete a Sitecore item by its path or id.")] + public async Task DeleteItem(string pathOrId, CancellationToken cancellationToken) { var client = await GetAuthoringClient(cancellationToken); var request = new GraphQLRequest(_deleteItemMutation) @@ -43,6 +44,14 @@ public async Task DeleteItem(string pathOrId, CancellationToken cancella return ErrorResultFromGraphQL(response.Errors); } - return response.Data.DeleteItem.Successful; + if (!response.Data.DeleteItem.Successful) + { + return ErrorResult("Item was not deleted."); + } + + return new() + { + Content = [new TextContentBlock { Text = "Item was deleted." }], + }; } } diff --git a/src/SitecoreBasicMcp/Tools/DeleteItemVersionTool.cs b/src/SitecoreBasicMcp/Tools/DeleteItemVersionTool.cs index 452ae93..0fcf4af 100644 --- a/src/SitecoreBasicMcp/Tools/DeleteItemVersionTool.cs +++ b/src/SitecoreBasicMcp/Tools/DeleteItemVersionTool.cs @@ -1,5 +1,6 @@ using GraphQL; using Microsoft.Extensions.Options; +using ModelContextProtocol.Protocol; using ModelContextProtocol.Server; using SitecoreBasicMcp.Authentication; using System.ComponentModel; @@ -27,8 +28,8 @@ mutation DeleteVersionItem($itemId: ID!, $language: String!, $version: Int!) { record DeleteItemVersionData(BasicItem Item); record DeleteItemMutationResponse(DeleteItemVersionData DeleteItemVersion); - [McpServerTool(Idempotent = false, ReadOnly = false, UseStructuredContent = true), Description("Delete a language version on a Sitecore item by its path or id.")] - public async Task DeleteItemVersion(string pathOrId, string language, int version, CancellationToken cancellationToken) + [McpServerTool(Idempotent = false, ReadOnly = false), Description("Delete a language version on a Sitecore item by its path or id.")] + public async Task DeleteItemVersion(string pathOrId, string language, int version, CancellationToken cancellationToken) { var client = await GetAuthoringClient(cancellationToken); var resolveItemIdResult = await ResolveItemId(pathOrId, language, client, cancellationToken); @@ -56,6 +57,6 @@ public async Task DeleteItemVersion(string pathOrId, string language, in return ErrorResultFromGraphQL(response.Errors); } - return response.Data.DeleteItemVersion.Item; + return ItemResult(response.Data.DeleteItemVersion.Item); } } diff --git a/src/SitecoreBasicMcp/Tools/GetItemTool.cs b/src/SitecoreBasicMcp/Tools/GetItemTool.cs index 85cb15b..0adda2d 100644 --- a/src/SitecoreBasicMcp/Tools/GetItemTool.cs +++ b/src/SitecoreBasicMcp/Tools/GetItemTool.cs @@ -1,8 +1,10 @@ using GraphQL; using Microsoft.Extensions.Options; +using ModelContextProtocol.Protocol; using ModelContextProtocol.Server; using SitecoreBasicMcp.Authentication; using System.ComponentModel; +using System.Text.Json; namespace SitecoreBasicMcp.Tools; @@ -10,32 +12,30 @@ namespace SitecoreBasicMcp.Tools; public class GetItemTool(IOptions options, SitecoreAuthenticationService authenticationService) : SitecoreAuthoringToolBase(options, authenticationService) { private static readonly string _getItemQuery = """ - query GetItem($path: String, $language: String, $ownFields: Boolean) { + fragment BasicItem on Item { + id: itemId + name + path + version + } + + query GetItem($path: String, $language: String!) { item(where: { path: $path, language: $language }) { - id: itemId - path - name - version + ...BasicItem template { id: templateId fullName name } parent { - id: itemId - path - name - version + ...BasicItem } children { nodes { - id: itemId - path - name - version + ...BasicItem } } - fields(ownFields:$ownFields) { + fields(ownFields: true) { nodes { name value @@ -47,8 +47,8 @@ query GetItem($path: String, $language: String, $ownFields: Boolean) { record GetItemQueryResponse(Item? Item); - [McpServerTool(Idempotent = true, ReadOnly = true, UseStructuredContent = true), Description("Get a Sitecore item by its path or id.")] - public async Task GetItem(string pathOrId, CancellationToken cancellationToken, string language = "en", bool includeStandardFields = false) + [McpServerTool(Idempotent = true, ReadOnly = true), Description("Get a Sitecore item by its path or id.")] + public async Task GetItem(string pathOrId, CancellationToken cancellationToken, string language = "en", bool includeStandardFields = false) { var client = await GetAuthoringClient(cancellationToken); var request = new GraphQLRequest(_getItemQuery) @@ -75,6 +75,6 @@ public async Task GetItem(string pathOrId, CancellationToken cancellatio return ErrorResult("Item was not found."); } - return item; + return ItemResult(item); } } diff --git a/src/SitecoreBasicMcp/Tools/ItemModel.cs b/src/SitecoreBasicMcp/Tools/ItemModel.cs index 08d4897..cb29668 100644 --- a/src/SitecoreBasicMcp/Tools/ItemModel.cs +++ b/src/SitecoreBasicMcp/Tools/ItemModel.cs @@ -6,5 +6,20 @@ public record ChildItem(string Id, string Name, string Path, int Version); public record Children(ChildItem[] Nodes); public record Template(string Id, string Name, string FullName); public record Parent(string Id, string Name, string Path, int Version); -public record Item(string Id, string Name, string Path, int Version, Fields Fields, Children Children, Template Template, Parent? Parent); -public record BasicItem(string Id, string Name, string Path, int Version); + +public class BasicItem +{ + public required string Id { get; set; } + public required string Name { get; set; } + public required string Path { get; set; } + public int Version { get; set; } +} + +public class Item : BasicItem +{ + public required Fields Fields { get; set; } + public required Children Children { get; set; } + public required Template Template { get; set; } + public Parent? Parent { get; set; } + +} \ No newline at end of file diff --git a/src/SitecoreBasicMcp/Tools/SitecoreAuthoringToolBase.cs b/src/SitecoreBasicMcp/Tools/SitecoreAuthoringToolBase.cs index 083db6f..fecfd9f 100644 --- a/src/SitecoreBasicMcp/Tools/SitecoreAuthoringToolBase.cs +++ b/src/SitecoreBasicMcp/Tools/SitecoreAuthoringToolBase.cs @@ -99,6 +99,22 @@ protected CallToolResult ErrorResultFromGraphQL(GraphQLError[] errors) Content = [new TextContentBlock { Text = text }], IsError = true }; + + protected CallToolResult ItemResult(T item) where T : BasicItem + { + var node = JsonSerializer.SerializeToNode(item); + + if (node == null) + { + return ErrorResult("Node was null, item could not be serialized."); + } + + return new() + { + + Content = [new TextContentBlock { Text = node.ToJsonString() }], + }; + } } public record ResolveItemIdResults(string? ItemId = null, CallToolResult? ErrorResult = null); diff --git a/src/SitecoreBasicMcp/Tools/UpdateItemTool.cs b/src/SitecoreBasicMcp/Tools/UpdateItemTool.cs index 79ff87d..f109387 100644 --- a/src/SitecoreBasicMcp/Tools/UpdateItemTool.cs +++ b/src/SitecoreBasicMcp/Tools/UpdateItemTool.cs @@ -1,5 +1,6 @@ using GraphQL; using Microsoft.Extensions.Options; +using ModelContextProtocol.Protocol; using ModelContextProtocol.Server; using SitecoreBasicMcp.Authentication; using System.ComponentModel; @@ -29,8 +30,8 @@ mutation UpdateItem( record UpdateItemData(BasicItem Item); record UpdateItemMutationResponse(UpdateItemData UpdateItem); - [McpServerTool(Idempotent = false, ReadOnly = false, UseStructuredContent = true), Description("Update a Sitecore item by its path or id.")] - public async Task UpdateItem(string pathOrId, string language, Field[] fields, CancellationToken cancellationToken) + [McpServerTool(Idempotent = false, ReadOnly = false), Description("Update a Sitecore item by its path or id.")] + public async Task UpdateItem(string pathOrId, string language, Field[] fields, CancellationToken cancellationToken) { var client = await GetAuthoringClient(cancellationToken); var request = new GraphQLRequest(_updateItemMutation) @@ -50,6 +51,6 @@ public async Task UpdateItem(string pathOrId, string language, Field[] f return ErrorResultFromGraphQL(response.Errors); } - return response.Data.UpdateItem.Item; + return ItemResult(response.Data.UpdateItem.Item); } } diff --git a/src/SitecoreBasicMcp/packages.lock.json b/src/SitecoreBasicMcp/packages.lock.json index 8d64b9d..977e920 100644 --- a/src/SitecoreBasicMcp/packages.lock.json +++ b/src/SitecoreBasicMcp/packages.lock.json @@ -24,35 +24,35 @@ }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Direct", - "requested": "[10.0.1, )", - "resolved": "10.0.1", - "contentHash": "kPlU11hql+L9RjrN2N9/0GcRcRcZrNFlLLjadasFWeBORT6pL6OE+RYRk90GGCyVGSxTK+e1/f3dsMj5zpFFiQ==", + "requested": "[10.0.2, )", + "resolved": "10.0.2", + "contentHash": "KC5PslaTDnTuTvyke0KYAVBYdZ7IVTsU3JhHe69BpEbHLcj1YThP3bIGtZNOkZfast2AuLnul5lk4rZKxAdUGQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.1" + "Microsoft.Extensions.Primitives": "10.0.2" } }, "Microsoft.Extensions.Http": { "type": "Direct", - "requested": "[10.0.1, )", - "resolved": "10.0.1", - "contentHash": "ZXJup9ReE1Ot3M8jqcw1b/lnc8USxyYS3cyLsssU39u04TES9JNGviWUGIvP3K7mMU3TF7kQl2aS0SmVwegflw==", + "requested": "[10.0.2, )", + "resolved": "10.0.2", + "contentHash": "egUPC0xydb1ugCMcRyJ6zaOGOzx7N4coOVlGeLcIsXhUf1xHHwZeX+ob7JuG0dXExFduHYE/t+4/4y8BLlBKmw==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.1", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.1", - "Microsoft.Extensions.Diagnostics": "10.0.1", - "Microsoft.Extensions.Logging": "10.0.1", - "Microsoft.Extensions.Logging.Abstractions": "10.0.1", - "Microsoft.Extensions.Options": "10.0.1" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.2", + "Microsoft.Extensions.Diagnostics": "10.0.2", + "Microsoft.Extensions.Logging": "10.0.2", + "Microsoft.Extensions.Logging.Abstractions": "10.0.2", + "Microsoft.Extensions.Options": "10.0.2" } }, "ModelContextProtocol": { "type": "Direct", - "requested": "[0.5.0-preview.1, )", - "resolved": "0.5.0-preview.1", - "contentHash": "QJpuNEnMZLJmvASbZ2nvMqENTZk3HYF83IihoHs3EJ5vTlz4sYjji9bXh2HP5UxpXIdHGn0iuHu0X2Tpq2zilw==", + "requested": "[0.6.0-preview.1, )", + "resolved": "0.6.0-preview.1", + "contentHash": "onUtGV9yny1rFZQ1qGUp6XPJBB2VxvWXvEioq8+/8hYOX6zEoc/Mc4tX8u7KRhU1mLss48jMh5DHFBMKifMiVw==", "dependencies": { - "Microsoft.Extensions.Hosting.Abstractions": "10.0.0", - "ModelContextProtocol.Core": "0.5.0-preview.1" + "Microsoft.Extensions.Hosting.Abstractions": "10.0.1", + "ModelContextProtocol.Core": "0.6.0-preview.1" } }, "GraphQL.Client.Abstractions": { @@ -78,130 +78,130 @@ }, "Microsoft.Extensions.AI.Abstractions": { "type": "Transitive", - "resolved": "10.0.0", - "contentHash": "PHeuDm2tC6wJPEQvleUr2kNQaIMNqSf3aEbzkIPlZyQ0+0SYI9SwXVLdGD1NPBI+xB+Vb2lxZKhrFlIf9kP9WA==" + "resolved": "10.1.1", + "contentHash": "cgj8iHv4JwUpcPANZ0oLILz146Y1Oa+l280b1c1a3DjwZflH9nmYcrX952YUuqftz2sheAC2TPCGcEa6unKQgQ==" }, "Microsoft.Extensions.Configuration": { "type": "Transitive", - "resolved": "10.0.1", - "contentHash": "njoRekyMIK+smav8B6KL2YgIfUtlsRNuT7wvurpLW+m/hoRKVnoELk2YxnUnWRGScCd1rukLMxShwLqEOKowDg==", + "resolved": "10.0.2", + "contentHash": "Lws+o4DFw6p5NquRoYA3d5QVvi49ugNw7TxbW4QGLsL8F1LCCyJqWFy0+RMQ/hzUuS9aKV5NJ/XGAF5N9/RQcQ==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.1", - "Microsoft.Extensions.Primitives": "10.0.1" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.2", + "Microsoft.Extensions.Primitives": "10.0.2" } }, "Microsoft.Extensions.Configuration.Binder": { "type": "Transitive", - "resolved": "10.0.1", - "contentHash": "Lp4CZIuTVXtlvkAnTq6QvMSW7+H62gX2cU2vdFxHQUxvrWTpi7LwYI3X+YAyIS0r12/p7gaosco7efIxL4yFNw==", + "resolved": "10.0.2", + "contentHash": "/SdW50prUuenglSy7MXU3eVQkOk4/J4fjc+GIhv4NkTmaZOQyTqpVAYi8nRjNtOKHzCy7g5cSlOSgkbT7clLwQ==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.1", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.1" + "Microsoft.Extensions.Configuration": "10.0.2", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.2" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "10.0.1", - "contentHash": "zerXV0GAR9LCSXoSIApbWn+Dq1/T+6vbXMHGduq1LoVQRHT0BXsGQEau0jeLUBUcsoF/NaUT8ADPu8b+eNcIyg==", + "resolved": "10.0.2", + "contentHash": "J/Zmp6fY93JbaiZ11ckWvcyxMPjD6XVwIHQXBjryTBgn7O6O20HYg9uVLFcZlNfgH78MnreE/7EH+hjfzn7VyA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.1" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.2" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "10.0.1", - "contentHash": "oIy8fQxxbUsSrrOvgBqlVgOeCtDmrcynnTG+FQufcUWBrwyPfwlUkCDB2vaiBeYPyT+20u9/HeuHeBf+H4F/8g==" + "resolved": "10.0.2", + "contentHash": "zOIurr59+kUf9vNcsUkCvKWZv+fPosUZXURZesYkJCvl0EzTc9F7maAO4Cd2WEV7ZJJ0AZrFQvuH6Npph9wdBw==" }, "Microsoft.Extensions.Diagnostics": { "type": "Transitive", - "resolved": "10.0.1", - "contentHash": "YaocqxscJLxLit0F5yq2XyB+9C7rSRfeTL7MJIl7XwaOoUO3i0EqfO2kmtjiRduYWw7yjcSINEApYZbzjau2gQ==", + "resolved": "10.0.2", + "contentHash": "+2lv/hi6VGnaJt4877BFkkySiMiHrKCeX7K5ElIshIKpF65o63zeXMnUR4U6EQ/eM75Hx7T8s3RcqnjdcnVB1A==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.1", - "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.1", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.1" + "Microsoft.Extensions.Configuration": "10.0.2", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.2", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.2" } }, "Microsoft.Extensions.Diagnostics.Abstractions": { "type": "Transitive", - "resolved": "10.0.1", - "contentHash": "QMoMrkNpnQym5mpfdxfxpRDuqLpsOuztguFvzH9p+Ex+do+uLFoi7UkAsBO4e9/tNR3eMFraFf2fOAi2cp3jjA==", + "resolved": "10.0.2", + "contentHash": "GaiaeKUuLuUbRPkUokndDuzonhO6dk4lcfGflHsCeXiJ5JrZxcyks1KuG6eB9pON16x/+9uWfa4w9g3oP8AYvQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.1", - "Microsoft.Extensions.Options": "10.0.1" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.2", + "Microsoft.Extensions.Options": "10.0.2" } }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "10.0.0", - "contentHash": "/ppSdehKk3fuXjlqCDgSOtjRK/pSHU8eWgzSHfHdwVm5BP4Dgejehkw+PtxKG2j98qTDEHDst2Y99aNsmJldmw==", + "resolved": "10.0.1", + "contentHash": "+b3DligYSZuoWltU5YdbMpIEUHNZPgPrzWfNiIuDkMdqOl93UxYB5KzS3lgpRfTXJhTNpo/CZ8w/sTkDTPDdxQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.0" + "Microsoft.Extensions.Primitives": "10.0.1" } }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "10.0.0", - "contentHash": "KrN6TGFwCwqOkLLk/idW/XtDQh+8In+CL9T4M1Dx+5ScsjTq4TlVbal8q532m82UYrMr6RiQJF2HvYCN0QwVsA==", + "resolved": "10.0.1", + "contentHash": "qmoQkVZcbm4/gFpted3W3Y+1kTATZTcUhV3mRkbtpfBXlxWCHwh/2oMffVcCruaGOfJuEnyAsGyaSUouSdECOw==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0", - "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.0", - "Microsoft.Extensions.Logging.Abstractions": "10.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.1", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.1", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.1", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.1", + "Microsoft.Extensions.Logging.Abstractions": "10.0.1" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "10.0.1", - "contentHash": "9ItMpMLFZFJFqCuHLLbR3LiA4ahA8dMtYuXpXl2YamSDWZhYS9BruPprkftY0tYi2bQ0slNrixdFm+4kpz1g5w==", + "resolved": "10.0.2", + "contentHash": "a0EWuBs6D3d7XMGroDXm+WsAi5CVVfjOJvyxurzWnuhBN9CO+1qHKcrKV1JK7H/T4ZtHIoVCOX/YyWM8K87qtw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "10.0.1", - "Microsoft.Extensions.Logging.Abstractions": "10.0.1", - "Microsoft.Extensions.Options": "10.0.1" + "Microsoft.Extensions.DependencyInjection": "10.0.2", + "Microsoft.Extensions.Logging.Abstractions": "10.0.2", + "Microsoft.Extensions.Options": "10.0.2" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "10.0.1", - "contentHash": "YkmyiPIWAXVb+lPIrM0LE5bbtLOJkCiRTFiHpkVOvhI7uTvCfoOHLEN0LcsY56GpSD7NqX3gJNpsaDe87/B3zg==", + "resolved": "10.0.2", + "contentHash": "RZkez/JjpnO+MZ6efKkSynN6ZztLpw3WbxNzjLCPBd97wWj1S9ZYPWi0nmT4kWBRa6atHsdM1ydGkUr8GudyDQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.1" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.2" } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "10.0.1", - "contentHash": "G6VVwywpJI4XIobetGHwg7wDOYC2L2XBYdtskxLaKF/Ynb5QBwLl7Q//wxAR2aVCLkMpoQrjSP9VoORkyddsNQ==", + "resolved": "10.0.2", + "contentHash": "1De2LJjmxdqopI5AYC5dIhoZQ79AR5ayywxNF1rXrXFtKQfbQOV9+n/IsZBa7qWlr0MqoGpW8+OY2v/57udZOA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.1", - "Microsoft.Extensions.Primitives": "10.0.1" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.2", + "Microsoft.Extensions.Primitives": "10.0.2" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { "type": "Transitive", - "resolved": "10.0.1", - "contentHash": "pL78/Im7O3WmxHzlKUsWTYchKL881udU7E26gCD3T0+/tPhWVfjPwMzfN/MRKU7aoFYcOiqcG2k1QTlH5woWow==", + "resolved": "10.0.2", + "contentHash": "8njGDg0OdDBM4Zox0ybuUOJZkQ8HcH49F+POZBlG+nsfzEyqOCHyHEkWeRVI62qsssiugUVEKqUttT1ZbV0aJQ==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.1", - "Microsoft.Extensions.Configuration.Binder": "10.0.1", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.1", - "Microsoft.Extensions.Options": "10.0.1", - "Microsoft.Extensions.Primitives": "10.0.1" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.2", + "Microsoft.Extensions.Configuration.Binder": "10.0.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.2", + "Microsoft.Extensions.Options": "10.0.2", + "Microsoft.Extensions.Primitives": "10.0.2" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "10.0.1", - "contentHash": "DO8XrJkp5x4PddDuc/CH37yDBCs9BYN6ijlKyR3vMb55BP1Vwh90vOX8bNfnKxr5B2qEI3D8bvbY1fFbDveDHQ==" + "resolved": "10.0.2", + "contentHash": "QmSiO+oLBEooGgB3i0GRXyeYRDHjllqt3k365jwfZlYWhvSHA3UL2NEVV5m8aZa041eIlblo6KMI5txvTMpTwA==" }, "ModelContextProtocol.Core": { "type": "Transitive", - "resolved": "0.5.0-preview.1", - "contentHash": "33V1Druluweou6x2LN6MSMbhiwHOYZxTUEJ1okFKjYDRIthctTVe0EJi//nifl4MRld2b5D5LnuV9sezz54p6g==", + "resolved": "0.6.0-preview.1", + "contentHash": "vjpbeJL7O4kNAgwv6wZtqlAAUX/tWaYLtbBzENDablIQfI1bH2tYTD/eK/6JvxP+Qp1H/lXaMvuRM6wohAzauA==", "dependencies": { - "Microsoft.Extensions.AI.Abstractions": "10.0.0", - "Microsoft.Extensions.Logging.Abstractions": "10.0.0" + "Microsoft.Extensions.AI.Abstractions": "10.1.1", + "Microsoft.Extensions.Logging.Abstractions": "10.0.1" } }, "System.Reactive": {