Skip to content

Commit 7e2db69

Browse files
authored
feat: add Tool.Title, fix OpenWorldHint, add OutputSchema (#68) (#69)
- Add human-readable display titles to all 19 tools via Tool.Title field (e.g. "Search Catalog", "Get Entity", "Get Lineage"). Titles are shown in MCP clients like Claude Desktop in place of raw tool names. - Fix OpenWorldHint: change from false → true for all 19 tools. All tools communicate with an external DataHub instance, so true is correct per the MCP spec. - Add OutputSchema declarations for all 19 tools. Each tool now carries a JSON Schema object describing the structure of its response, enabling clients to validate and display output shapes. All three features follow the existing three-tier priority pattern: 1. Per-registration WithTitle/WithOutputSchema (highest) 2. Toolkit-level WithTitles/WithOutputSchemas (middle) 3. Built-in defaults in titles.go / output_schemas.go (lowest) New files: - pkg/tools/titles.go + titles_test.go - pkg/tools/output_schemas.go + output_schemas_test.go New options: - WithTitle / WithTitles (ToolOption / ToolkitOption) - WithOutputSchema / WithOutputSchemas (ToolOption / ToolkitOption) Docs updated: - CLAUDE.md - docs/server/tools.md - docs/reference/tools-api.md
1 parent dedd65e commit 7e2db69

27 files changed

+1106
-131
lines changed

CLAUDE.md

Lines changed: 47 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -100,34 +100,38 @@ export DATAHUB_TOKEN=your_token
100100

101101
## Available Tools (19 total: 12 read + 7 write)
102102

103+
Each tool has a `Title` (human-readable display name shown in MCP clients like Claude Desktop),
104+
an `OutputSchema` (JSON Schema describing the response structure), and `Annotations`.
105+
All are customizable via the three-tier priority pattern.
106+
103107
### Read Tools
104108

105-
| Tool | Description |
106-
|------|-------------|
107-
| `datahub_search` | Search entities by query and type |
108-
| `datahub_get_entity` | Get entity metadata by URN |
109-
| `datahub_get_schema` | Get dataset schema |
110-
| `datahub_get_lineage` | Get upstream/downstream lineage |
111-
| `datahub_get_column_lineage` | Get fine-grained column-level lineage |
112-
| `datahub_get_queries` | Get associated SQL queries |
113-
| `datahub_get_glossary_term` | Get glossary term details |
114-
| `datahub_list_tags` | List available tags |
115-
| `datahub_list_domains` | List data domains |
116-
| `datahub_list_data_products` | List data products |
117-
| `datahub_get_data_product` | Get data product details |
118-
| `datahub_list_connections` | List configured DataHub server connections |
109+
| Tool | Title | Description |
110+
|------|-------|-------------|
111+
| `datahub_search` | Search Catalog | Search entities by query and type |
112+
| `datahub_get_entity` | Get Entity | Get entity metadata by URN |
113+
| `datahub_get_schema` | Get Schema | Get dataset schema |
114+
| `datahub_get_lineage` | Get Lineage | Get upstream/downstream lineage |
115+
| `datahub_get_column_lineage` | Get Column Lineage | Get fine-grained column-level lineage |
116+
| `datahub_get_queries` | Get Queries | Get associated SQL queries |
117+
| `datahub_get_glossary_term` | Get Glossary Term | Get glossary term details |
118+
| `datahub_list_tags` | List Tags | List available tags |
119+
| `datahub_list_domains` | List Domains | List data domains |
120+
| `datahub_list_data_products` | List Data Products | List data products |
121+
| `datahub_get_data_product` | Get Data Product | Get data product details |
122+
| `datahub_list_connections` | List Connections | List configured DataHub server connections |
119123

120124
### Write Tools (require `WriteEnabled: true`)
121125

122-
| Tool | Description |
123-
|------|-------------|
124-
| `datahub_update_description` | Update entity description |
125-
| `datahub_add_tag` | Add a tag to an entity |
126-
| `datahub_remove_tag` | Remove a tag from an entity |
127-
| `datahub_add_glossary_term` | Add a glossary term to an entity |
128-
| `datahub_remove_glossary_term` | Remove a glossary term from an entity |
129-
| `datahub_add_link` | Add a link to an entity |
130-
| `datahub_remove_link` | Remove a link from an entity |
126+
| Tool | Title | Description |
127+
|------|-------|-------------|
128+
| `datahub_update_description` | Update Description | Update entity description |
129+
| `datahub_add_tag` | Add Tag | Add a tag to an entity |
130+
| `datahub_remove_tag` | Remove Tag | Remove a tag from an entity |
131+
| `datahub_add_glossary_term` | Add Glossary Term | Add a glossary term to an entity |
132+
| `datahub_remove_glossary_term` | Remove Glossary Term | Remove a glossary term from an entity |
133+
| `datahub_add_link` | Add Link | Add a link to an entity |
134+
| `datahub_remove_link` | Remove Link | Remove a link from an entity |
131135

132136
## Description Overrides
133137

@@ -139,6 +143,22 @@ Tool descriptions can be customized at three levels of priority:
139143

140144
Descriptions can also be set via config file (`toolkit.descriptions` section) or the `Descriptions` field in `server.Options`.
141145

146+
## Title Overrides
147+
148+
Tool display names (shown in MCP clients) follow the same three-level priority:
149+
150+
1. **Per-registration** (highest): `toolkit.RegisterWith(server, tools.ToolSearch, tools.WithTitle("My Search"))`
151+
2. **Toolkit-level**: `tools.NewToolkit(client, cfg, tools.WithTitles(map[tools.ToolName]string{...}))`
152+
3. **Default**: Built-in titles from `pkg/tools/titles.go`
153+
154+
## OutputSchema Overrides
155+
156+
Tool output schemas (JSON Schema describing the response) follow the same three-level priority:
157+
158+
1. **Per-registration** (highest): `toolkit.RegisterWith(server, tools.ToolSearch, tools.WithOutputSchema(schema))`
159+
2. **Toolkit-level**: `tools.NewToolkit(client, cfg, tools.WithOutputSchemas(map[tools.ToolName]any{...}))`
160+
3. **Default**: Built-in schemas from `pkg/tools/output_schemas.go`
161+
142162
## Annotation Overrides
143163

144164
MCP tool annotations (behavior hints per the MCP specification) follow the same three-level priority:
@@ -149,8 +169,10 @@ MCP tool annotations (behavior hints per the MCP specification) follow the same
149169

150170
Default annotations for all 19 tools:
151171

152-
- **Read tools** (12): `ReadOnlyHint: true`, `IdempotentHint: true`, `OpenWorldHint: false`
153-
- **Write tools** (7): `DestructiveHint: false`, `IdempotentHint: true`, `OpenWorldHint: false`
172+
- **Read tools** (12): `ReadOnlyHint: true`, `IdempotentHint: true`, `OpenWorldHint: true`
173+
- **Write tools** (7): `DestructiveHint: false`, `IdempotentHint: true`, `OpenWorldHint: true`
174+
175+
`OpenWorldHint: true` is correct because all tools communicate with an external DataHub instance.
154176

155177
## Extensions Package (`pkg/extensions/`)
156178

docs/reference/tools-api.md

Lines changed: 82 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,8 +205,88 @@ func DefaultAnnotations(name ToolName) *mcp.ToolAnnotations
205205

206206
| Tool Category | ReadOnlyHint | DestructiveHint | IdempotentHint | OpenWorldHint |
207207
|---------------|:------------:|:---------------:|:--------------:|:-------------:|
208-
| Read tools (12) | `true` | _(default)_ | `true` | `false` |
209-
| Write tools (7) | `false` | `false` | `true` | `false` |
208+
| Read tools (12) | `true` | _(default)_ | `true` | `true` |
209+
| Write tools (7) | `false` | `false` | `true` | `true` |
210+
211+
`OpenWorldHint` is `true` for all tools because every tool communicates with an external DataHub instance.
212+
213+
### WithTitles
214+
215+
Overrides tool display names at the toolkit level. Titles appear in MCP clients (e.g., Claude Desktop) instead of raw tool names.
216+
217+
```go
218+
func WithTitles(titles map[ToolName]string) ToolkitOption
219+
```
220+
221+
**Example:**
222+
223+
```go
224+
toolkit := tools.NewToolkit(datahubClient, config,
225+
tools.WithTitles(map[tools.ToolName]string{
226+
tools.ToolSearch: "Search Our Catalog",
227+
}),
228+
)
229+
```
230+
231+
### WithTitle
232+
233+
Overrides the display title for a single tool at registration time.
234+
235+
```go
236+
func WithTitle(title string) ToolOption
237+
```
238+
239+
**Example:**
240+
241+
```go
242+
toolkit.RegisterWith(server, tools.ToolSearch,
243+
tools.WithTitle("Search Our Catalog"),
244+
)
245+
```
246+
247+
**Title Priority:**
248+
249+
1. Per-registration `WithTitle()` (highest)
250+
2. Toolkit-level `WithTitles()` map
251+
3. Built-in default title (lowest)
252+
253+
### DefaultTitle
254+
255+
Returns the default display title for a tool by name. Returns empty string for unknown tool names.
256+
257+
```go
258+
func DefaultTitle(name ToolName) string
259+
```
260+
261+
### WithOutputSchemas
262+
263+
Overrides the output JSON Schema for multiple tools at the toolkit level.
264+
265+
```go
266+
func WithOutputSchemas(schemas map[ToolName]any) ToolkitOption
267+
```
268+
269+
### WithOutputSchema
270+
271+
Overrides the output JSON Schema for a single tool at registration time.
272+
273+
```go
274+
func WithOutputSchema(schema any) ToolOption
275+
```
276+
277+
**OutputSchema Priority:**
278+
279+
1. Per-registration `WithOutputSchema()` (highest)
280+
2. Toolkit-level `WithOutputSchemas()` map
281+
3. Built-in default output schema (lowest)
282+
283+
### DefaultOutputSchema
284+
285+
Returns the default output JSON Schema for a tool by name. Returns nil for unknown tool names.
286+
287+
```go
288+
func DefaultOutputSchema(name ToolName) json.RawMessage
289+
```
210290

211291
## Tool Names
212292

docs/server/tools.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ All tools include [MCP tool annotations](https://modelcontextprotocol.io/specifi
1111
| `ReadOnlyHint` | `true` | `false` | Whether the tool only reads data |
1212
| `DestructiveHint` | _(default)_ | `false` | Whether the tool may destructively update |
1313
| `IdempotentHint` | `true` | `true` | Whether repeated calls produce the same result |
14-
| `OpenWorldHint` | `false` | `false` | Whether the tool interacts with external entities |
14+
| `OpenWorldHint` | `true` | `true` | Whether the tool interacts with external entities |
15+
16+
`OpenWorldHint` is `true` for all tools because every tool communicates with an external DataHub instance.
1517

1618
These annotations help MCP clients make informed decisions about tool invocation (e.g., auto-approving read-only tools). Library users can override annotations per-tool or per-toolkit; see the [Tools API Reference](../reference/tools-api.md#withannotations).
1719

pkg/tools/annotations.go

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,27 @@ func boolPtr(b bool) *bool {
1515
// - OpenWorldHint (*bool, default true): tool interacts with external entities
1616
var defaultAnnotations = map[ToolName]*mcp.ToolAnnotations{
1717
// Read-only tools
18-
ToolSearch: {ReadOnlyHint: true, IdempotentHint: true, OpenWorldHint: boolPtr(false)},
19-
ToolGetEntity: {ReadOnlyHint: true, IdempotentHint: true, OpenWorldHint: boolPtr(false)},
20-
ToolGetSchema: {ReadOnlyHint: true, IdempotentHint: true, OpenWorldHint: boolPtr(false)},
21-
ToolGetLineage: {ReadOnlyHint: true, IdempotentHint: true, OpenWorldHint: boolPtr(false)},
22-
ToolGetColumnLineage: {ReadOnlyHint: true, IdempotentHint: true, OpenWorldHint: boolPtr(false)},
23-
ToolGetQueries: {ReadOnlyHint: true, IdempotentHint: true, OpenWorldHint: boolPtr(false)},
24-
ToolGetGlossaryTerm: {ReadOnlyHint: true, IdempotentHint: true, OpenWorldHint: boolPtr(false)},
25-
ToolListTags: {ReadOnlyHint: true, IdempotentHint: true, OpenWorldHint: boolPtr(false)},
26-
ToolListDomains: {ReadOnlyHint: true, IdempotentHint: true, OpenWorldHint: boolPtr(false)},
27-
ToolListDataProducts: {ReadOnlyHint: true, IdempotentHint: true, OpenWorldHint: boolPtr(false)},
28-
ToolGetDataProduct: {ReadOnlyHint: true, IdempotentHint: true, OpenWorldHint: boolPtr(false)},
29-
ToolListConnections: {ReadOnlyHint: true, IdempotentHint: true, OpenWorldHint: boolPtr(false)},
18+
ToolSearch: {ReadOnlyHint: true, IdempotentHint: true, OpenWorldHint: boolPtr(true)},
19+
ToolGetEntity: {ReadOnlyHint: true, IdempotentHint: true, OpenWorldHint: boolPtr(true)},
20+
ToolGetSchema: {ReadOnlyHint: true, IdempotentHint: true, OpenWorldHint: boolPtr(true)},
21+
ToolGetLineage: {ReadOnlyHint: true, IdempotentHint: true, OpenWorldHint: boolPtr(true)},
22+
ToolGetColumnLineage: {ReadOnlyHint: true, IdempotentHint: true, OpenWorldHint: boolPtr(true)},
23+
ToolGetQueries: {ReadOnlyHint: true, IdempotentHint: true, OpenWorldHint: boolPtr(true)},
24+
ToolGetGlossaryTerm: {ReadOnlyHint: true, IdempotentHint: true, OpenWorldHint: boolPtr(true)},
25+
ToolListTags: {ReadOnlyHint: true, IdempotentHint: true, OpenWorldHint: boolPtr(true)},
26+
ToolListDomains: {ReadOnlyHint: true, IdempotentHint: true, OpenWorldHint: boolPtr(true)},
27+
ToolListDataProducts: {ReadOnlyHint: true, IdempotentHint: true, OpenWorldHint: boolPtr(true)},
28+
ToolGetDataProduct: {ReadOnlyHint: true, IdempotentHint: true, OpenWorldHint: boolPtr(true)},
29+
ToolListConnections: {ReadOnlyHint: true, IdempotentHint: true, OpenWorldHint: boolPtr(true)},
3030

3131
// Write tools
32-
ToolUpdateDescription: {DestructiveHint: boolPtr(false), IdempotentHint: true, OpenWorldHint: boolPtr(false)},
33-
ToolAddTag: {DestructiveHint: boolPtr(false), IdempotentHint: true, OpenWorldHint: boolPtr(false)},
34-
ToolRemoveTag: {DestructiveHint: boolPtr(false), IdempotentHint: true, OpenWorldHint: boolPtr(false)},
35-
ToolAddGlossaryTerm: {DestructiveHint: boolPtr(false), IdempotentHint: true, OpenWorldHint: boolPtr(false)},
36-
ToolRemoveGlossaryTerm: {DestructiveHint: boolPtr(false), IdempotentHint: true, OpenWorldHint: boolPtr(false)},
37-
ToolAddLink: {DestructiveHint: boolPtr(false), IdempotentHint: true, OpenWorldHint: boolPtr(false)},
38-
ToolRemoveLink: {DestructiveHint: boolPtr(false), IdempotentHint: true, OpenWorldHint: boolPtr(false)},
32+
ToolUpdateDescription: {DestructiveHint: boolPtr(false), IdempotentHint: true, OpenWorldHint: boolPtr(true)},
33+
ToolAddTag: {DestructiveHint: boolPtr(false), IdempotentHint: true, OpenWorldHint: boolPtr(true)},
34+
ToolRemoveTag: {DestructiveHint: boolPtr(false), IdempotentHint: true, OpenWorldHint: boolPtr(true)},
35+
ToolAddGlossaryTerm: {DestructiveHint: boolPtr(false), IdempotentHint: true, OpenWorldHint: boolPtr(true)},
36+
ToolRemoveGlossaryTerm: {DestructiveHint: boolPtr(false), IdempotentHint: true, OpenWorldHint: boolPtr(true)},
37+
ToolAddLink: {DestructiveHint: boolPtr(false), IdempotentHint: true, OpenWorldHint: boolPtr(true)},
38+
ToolRemoveLink: {DestructiveHint: boolPtr(false), IdempotentHint: true, OpenWorldHint: boolPtr(true)},
3939
}
4040

4141
// DefaultAnnotations returns the default annotations for a tool.

pkg/tools/annotations_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@ func TestDefaultAnnotations_ReadOnlyTools(t *testing.T) {
7171
if !ann.IdempotentHint {
7272
t.Errorf("expected IdempotentHint=true for %s", name)
7373
}
74-
if ann.OpenWorldHint == nil || *ann.OpenWorldHint {
75-
t.Errorf("expected OpenWorldHint=false for %s", name)
74+
if ann.OpenWorldHint == nil || !*ann.OpenWorldHint {
75+
t.Errorf("expected OpenWorldHint=true for %s", name)
7676
}
7777
})
7878
}
@@ -97,8 +97,8 @@ func TestDefaultAnnotations_WriteTools(t *testing.T) {
9797
if !ann.IdempotentHint {
9898
t.Errorf("expected IdempotentHint=true for %s", name)
9999
}
100-
if ann.OpenWorldHint == nil || *ann.OpenWorldHint {
101-
t.Errorf("expected OpenWorldHint=false for %s", name)
100+
if ann.OpenWorldHint == nil || !*ann.OpenWorldHint {
101+
t.Errorf("expected OpenWorldHint=true for %s", name)
102102
}
103103
})
104104
}

pkg/tools/column_lineage.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@ func (t *Toolkit) registerGetColumnLineageTool(server *mcp.Server, cfg *toolConf
2525
wrappedHandler := t.wrapHandler(ToolGetColumnLineage, baseHandler, cfg)
2626

2727
mcp.AddTool(server, &mcp.Tool{
28-
Name: string(ToolGetColumnLineage),
29-
Description: t.getDescription(ToolGetColumnLineage, cfg),
30-
Annotations: t.getAnnotations(ToolGetColumnLineage, cfg),
31-
Icons: t.getIcons(ToolGetColumnLineage, cfg),
28+
Name: string(ToolGetColumnLineage),
29+
Description: t.getDescription(ToolGetColumnLineage, cfg),
30+
Annotations: t.getAnnotations(ToolGetColumnLineage, cfg),
31+
Icons: t.getIcons(ToolGetColumnLineage, cfg),
32+
Title: t.getTitle(ToolGetColumnLineage, cfg),
33+
OutputSchema: t.getOutputSchema(ToolGetColumnLineage, cfg),
3234
}, func(ctx context.Context, req *mcp.CallToolRequest, input GetColumnLineageInput) (*mcp.CallToolResult, any, error) {
3335
return wrappedHandler(ctx, req, input)
3436
})

pkg/tools/connections.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,12 @@ func (t *Toolkit) registerListConnectionsTool(server *mcp.Server, cfg *toolConfi
3636

3737
// Register with MCP
3838
mcp.AddTool(server, &mcp.Tool{
39-
Name: string(ToolListConnections),
40-
Description: t.getDescription(ToolListConnections, cfg),
41-
Annotations: t.getAnnotations(ToolListConnections, cfg),
42-
Icons: t.getIcons(ToolListConnections, cfg),
39+
Name: string(ToolListConnections),
40+
Description: t.getDescription(ToolListConnections, cfg),
41+
Annotations: t.getAnnotations(ToolListConnections, cfg),
42+
Icons: t.getIcons(ToolListConnections, cfg),
43+
Title: t.getTitle(ToolListConnections, cfg),
44+
OutputSchema: t.getOutputSchema(ToolListConnections, cfg),
4345
}, func(ctx context.Context, req *mcp.CallToolRequest, input ListConnectionsInput) (*mcp.CallToolResult, *ListConnectionsOutput, error) {
4446
result, out, err := wrappedHandler(ctx, req, input)
4547
if typed, ok := out.(*ListConnectionsOutput); ok {

pkg/tools/dataproducts.go

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@ func (t *Toolkit) registerListDataProductsTool(server *mcp.Server, cfg *toolConf
2424
wrappedHandler := t.wrapHandler(ToolListDataProducts, baseHandler, cfg)
2525

2626
mcp.AddTool(server, &mcp.Tool{
27-
Name: string(ToolListDataProducts),
28-
Description: t.getDescription(ToolListDataProducts, cfg),
29-
Annotations: t.getAnnotations(ToolListDataProducts, cfg),
30-
Icons: t.getIcons(ToolListDataProducts, cfg),
27+
Name: string(ToolListDataProducts),
28+
Description: t.getDescription(ToolListDataProducts, cfg),
29+
Annotations: t.getAnnotations(ToolListDataProducts, cfg),
30+
Icons: t.getIcons(ToolListDataProducts, cfg),
31+
Title: t.getTitle(ToolListDataProducts, cfg),
32+
OutputSchema: t.getOutputSchema(ToolListDataProducts, cfg),
3133
}, func(ctx context.Context, req *mcp.CallToolRequest, input ListDataProductsInput) (*mcp.CallToolResult, any, error) {
3234
return wrappedHandler(ctx, req, input)
3335
})
@@ -74,10 +76,12 @@ func (t *Toolkit) registerGetDataProductTool(server *mcp.Server, cfg *toolConfig
7476
wrappedHandler := t.wrapHandler(ToolGetDataProduct, baseHandler, cfg)
7577

7678
mcp.AddTool(server, &mcp.Tool{
77-
Name: string(ToolGetDataProduct),
78-
Description: t.getDescription(ToolGetDataProduct, cfg),
79-
Annotations: t.getAnnotations(ToolGetDataProduct, cfg),
80-
Icons: t.getIcons(ToolGetDataProduct, cfg),
79+
Name: string(ToolGetDataProduct),
80+
Description: t.getDescription(ToolGetDataProduct, cfg),
81+
Annotations: t.getAnnotations(ToolGetDataProduct, cfg),
82+
Icons: t.getIcons(ToolGetDataProduct, cfg),
83+
Title: t.getTitle(ToolGetDataProduct, cfg),
84+
OutputSchema: t.getOutputSchema(ToolGetDataProduct, cfg),
8185
}, func(ctx context.Context, req *mcp.CallToolRequest, input GetDataProductInput) (*mcp.CallToolResult, any, error) {
8286
return wrappedHandler(ctx, req, input)
8387
})

pkg/tools/domains.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@ func (t *Toolkit) registerListDomainsTool(server *mcp.Server, cfg *toolConfig) {
2424
wrappedHandler := t.wrapHandler(ToolListDomains, baseHandler, cfg)
2525

2626
mcp.AddTool(server, &mcp.Tool{
27-
Name: string(ToolListDomains),
28-
Description: t.getDescription(ToolListDomains, cfg),
29-
Annotations: t.getAnnotations(ToolListDomains, cfg),
30-
Icons: t.getIcons(ToolListDomains, cfg),
27+
Name: string(ToolListDomains),
28+
Description: t.getDescription(ToolListDomains, cfg),
29+
Annotations: t.getAnnotations(ToolListDomains, cfg),
30+
Icons: t.getIcons(ToolListDomains, cfg),
31+
Title: t.getTitle(ToolListDomains, cfg),
32+
OutputSchema: t.getOutputSchema(ToolListDomains, cfg),
3133
}, func(ctx context.Context, req *mcp.CallToolRequest, input ListDomainsInput) (*mcp.CallToolResult, any, error) {
3234
return wrappedHandler(ctx, req, input)
3335
})

pkg/tools/entity.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@ func (t *Toolkit) registerGetEntityTool(server *mcp.Server, cfg *toolConfig) {
2525
wrappedHandler := t.wrapHandler(ToolGetEntity, baseHandler, cfg)
2626

2727
mcp.AddTool(server, &mcp.Tool{
28-
Name: string(ToolGetEntity),
29-
Description: t.getDescription(ToolGetEntity, cfg),
30-
Annotations: t.getAnnotations(ToolGetEntity, cfg),
31-
Icons: t.getIcons(ToolGetEntity, cfg),
28+
Name: string(ToolGetEntity),
29+
Description: t.getDescription(ToolGetEntity, cfg),
30+
Annotations: t.getAnnotations(ToolGetEntity, cfg),
31+
Icons: t.getIcons(ToolGetEntity, cfg),
32+
Title: t.getTitle(ToolGetEntity, cfg),
33+
OutputSchema: t.getOutputSchema(ToolGetEntity, cfg),
3234
}, func(ctx context.Context, req *mcp.CallToolRequest, input GetEntityInput) (*mcp.CallToolResult, any, error) {
3335
return wrappedHandler(ctx, req, input)
3436
})

0 commit comments

Comments
 (0)