Skip to content

Commit 6beb9f8

Browse files
authored
[mcp] Removed @mcpTool directive (#8944)
1 parent 6acc1c6 commit 6beb9f8

File tree

9 files changed

+30
-180
lines changed

9 files changed

+30
-180
lines changed

src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Directives/McpToolDirective.cs

Lines changed: 0 additions & 25 deletions
This file was deleted.

src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Directives/McpToolDirectiveParser.cs

Lines changed: 0 additions & 67 deletions
This file was deleted.

src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Extensions/OperationDefinitionNodeExtensions.cs

Lines changed: 0 additions & 17 deletions
This file was deleted.

src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Properties/McpAdapterResources.Designer.cs

Lines changed: 0 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Properties/McpAdapterResources.resx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,6 @@
2121
<data name="CallToolHandler_ToolNotFound" xml:space="preserve">
2222
<value>The tool '{0}' was not found.</value>
2323
</data>
24-
<data name="McpToolDirectiveParser_ArgumentNotSupportedOnMcpToolDirective" xml:space="preserve">
25-
<value>The argument `{0}` is not supported on @mcpTool.</value>
26-
</data>
2724
<data name="OpenAiComponent_ToolInvokedStatusTextCannotExceed64Characters" xml:space="preserve">
2825
<value>ToolInvokedStatusText cannot exceed 64 characters.</value>
2926
</data>

src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Storage/OperationToolDefinition.cs

Lines changed: 8 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
using System.Security.Cryptography;
22
using System.Text;
33
using CaseConverter;
4-
using HotChocolate.Adapters.Mcp.Extensions;
54
using HotChocolate.Language;
65
using static HotChocolate.Adapters.Mcp.Properties.McpAdapterResources;
7-
using static HotChocolate.Adapters.Mcp.WellKnownDirectiveNames;
86

97
namespace HotChocolate.Adapters.Mcp.Storage;
108

@@ -24,16 +22,16 @@ public sealed class OperationToolDefinition
2422
/// The name of the MCP tool.
2523
/// </param>
2624
/// <param name="title">
27-
/// Optional tool title. Overrides directive metadata if provided.
25+
/// Optional tool title.
2826
/// </param>
2927
/// <param name="destructiveHint">
30-
/// Optional destructive operation hint. Overrides directive metadata if provided.
28+
/// Optional destructive operation hint.
3129
/// </param>
3230
/// <param name="idempotentHint">
33-
/// Optional idempotent operation hint. Overrides directive metadata if provided.
31+
/// Optional idempotent operation hint.
3432
/// </param>
3533
/// <param name="openWorldHint">
36-
/// Optional open-world assumption hint. Overrides directive metadata if provided.
34+
/// Optional open-world assumption hint.
3735
/// </param>
3836
/// <exception cref="ArgumentException">
3937
/// Thrown when document doesn't contain exactly one operation.
@@ -69,48 +67,12 @@ public OperationToolDefinition(
6967
nameof(document));
7068
}
7169

72-
// If we find a tool directive, parse it and remove it from the document.
73-
// The tool directive is metadata only and doesn't exist in the target schema.
74-
// Removing it prevents execution errors when the operation is executed.
75-
var toolDirective = operation.GetMcpToolDirective();
76-
if (toolDirective is not null)
77-
{
78-
var tempDirectives = operation.Directives.ToList();
79-
foreach (var directive in operation.Directives)
80-
{
81-
if (directive.Name.Value.Equals(McpTool))
82-
{
83-
tempDirectives.Remove(directive);
84-
}
85-
}
86-
87-
IReadOnlyList<DirectiveNode> cleanedDirectives;
88-
if (tempDirectives.Count == 0)
89-
{
90-
cleanedDirectives = [];
91-
}
92-
else
93-
{
94-
tempDirectives.Capacity = tempDirectives.Count;
95-
cleanedDirectives = tempDirectives;
96-
}
97-
98-
var cleanedOperation = operation.WithDirectives(cleanedDirectives);
99-
var cleanedDefinitions = document.Definitions.ToList();
100-
cleanedDefinitions.Remove(operation);
101-
cleanedDefinitions.Add(cleanedOperation);
102-
cleanedDefinitions.Capacity = cleanedDefinitions.Count;
103-
document = document.WithDefinitions(cleanedDefinitions);
104-
}
105-
10670
Name = name ?? operation.Name?.Value.ToSnakeCase()!;
10771
Document = document;
108-
109-
// Explicit parameters take precedence over directive metadata.
110-
Title = title ?? toolDirective?.Title;
111-
DestructiveHint = destructiveHint ?? toolDirective?.DestructiveHint;
112-
IdempotentHint = idempotentHint ?? toolDirective?.IdempotentHint;
113-
OpenWorldHint = openWorldHint ?? toolDirective?.OpenWorldHint;
72+
Title = title;
73+
DestructiveHint = destructiveHint;
74+
IdempotentHint = idempotentHint;
75+
OpenWorldHint = openWorldHint;
11476
}
11577

11678
/// <summary>

src/HotChocolate/Adapters/src/Adapters.Mcp.Core/WellKnownDirectiveNames.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ namespace HotChocolate.Adapters.Mcp;
33
internal static class WellKnownDirectiveNames
44
{
55
public const string Include = "include";
6-
public const string McpTool = "mcpTool";
76
public const string McpToolAnnotations = "mcpToolAnnotations";
87
public const string Skip = "skip";
98
}

src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/IntegrationTestBase.cs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -183,12 +183,13 @@ await storage.AddOrUpdateToolAsync(
183183
new OperationToolDefinition(
184184
Utf8GraphQLParser.Parse(
185185
"""
186-
query GetBooks @mcpTool(title: "Custom Title") {
186+
query GetBooks {
187187
books {
188188
title
189189
}
190190
}
191-
""")));
191+
"""),
192+
title: "Custom Title"));
192193
var server = await CreateTestServerAsync(storage);
193194
var mcpClient = await CreateMcpClientAsync(server.CreateClient());
194195

@@ -200,18 +201,21 @@ query GetBooks @mcpTool(title: "Custom Title") {
200201
}
201202

202203
[Fact]
203-
public async Task ListTools_SetAnnotationsInDocument_ReturnsExpectedResult()
204+
public async Task ListTools_SetAnnotations_ReturnsExpectedResult()
204205
{
205206
// arrange
206207
var storage = new TestOperationToolStorage();
207208
await storage.AddOrUpdateToolAsync(
208209
new OperationToolDefinition(
209210
Utf8GraphQLParser.Parse(
210211
"""
211-
mutation AddBook @mcpTool(destructiveHint: false, idempotentHint: true, openWorldHint: false) {
212+
mutation AddBook {
212213
addBook { title }
213214
}
214-
""")));
215+
"""),
216+
destructiveHint: false,
217+
idempotentHint: true,
218+
openWorldHint: false));
215219
var server = await CreateTestServerAsync(storage);
216220
var mcpClient = await CreateMcpClientAsync(server.CreateClient());
217221

@@ -288,15 +292,17 @@ public async Task ListTools_UpdateToolsInvalidDocument_ReturnsExpectedResult()
288292
var storage = new TestOperationToolStorage();
289293
await storage.AddOrUpdateToolAsync(
290294
new OperationToolDefinition(
291-
Utf8GraphQLParser.Parse("""query Tool @mcpTool(title: "BEFORE") { books { title } }""")));
295+
Utf8GraphQLParser.Parse("query Tool { books { title } }"),
296+
title: "BEFORE"));
292297
var listener = new TestMcpDiagnosticEventListener();
293298
var server = await CreateTestServerAsync(storage, diagnosticEventListener: listener);
294299
var mcpClient = await CreateMcpClientAsync(server.CreateClient());
295300

296301
// act
297302
await storage.AddOrUpdateToolAsync(
298303
new OperationToolDefinition(
299-
Utf8GraphQLParser.Parse("""query Tool @mcpTool(title: "AFTER") { doesNotExist1, doesNotExist2 }""")));
304+
Utf8GraphQLParser.Parse("query Tool { doesNotExist1, doesNotExist2 }"),
305+
title: "AFTER"));
300306
await Task.Delay(500); // Wait for the observer buffer to flush.
301307
var result = await mcpClient.ListToolsAsync();
302308

src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/OperationToolFactoryTests.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -155,13 +155,13 @@ public void CreateTool_SetTitle_ReturnsTool()
155155
var schema = CreateSchema();
156156
var document = Utf8GraphQLParser.Parse(
157157
"""
158-
query GetBooks @mcpTool(title: "Custom Title") {
158+
query GetBooks {
159159
books {
160160
title
161161
}
162162
}
163163
""");
164-
var toolDefinition = new OperationToolDefinition(document);
164+
var toolDefinition = new OperationToolDefinition(document, title: "Custom Title");
165165

166166
// act
167167
var tool = new OperationToolFactory(schema).CreateTool(toolDefinition);
@@ -177,14 +177,18 @@ public void CreateTool_SetAnnotations_ReturnsTool()
177177
var schema = CreateSchema();
178178
var document = Utf8GraphQLParser.Parse(
179179
"""
180-
mutation AddBook
181-
@mcpTool(destructiveHint: false, idempotentHint: true, openWorldHint: false) {
180+
mutation AddBook {
182181
addBook {
183182
title
184183
}
185184
}
186185
""");
187-
var toolDefinition = new OperationToolDefinition(document);
186+
var toolDefinition =
187+
new OperationToolDefinition(
188+
document,
189+
destructiveHint: false,
190+
idempotentHint: true,
191+
openWorldHint: false);
188192

189193
// act
190194
var tool = new OperationToolFactory(schema).CreateTool(toolDefinition);

0 commit comments

Comments
 (0)