Skip to content

Commit ba16a27

Browse files
committed
mcp/server.go: changed approach to handling this error
1 parent 4ee891b commit ba16a27

File tree

2 files changed

+10
-21
lines changed

2 files changed

+10
-21
lines changed

mcp/server.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,15 @@ func AddTool[In, Out any](s *Server, t *Tool, h ToolHandlerFor[In, Out]) {
171171

172172
func addToolErr[In, Out any](s *Server, t *Tool, h ToolHandlerFor[In, Out]) (err error) {
173173
defer util.Wrapf(&err, "adding tool %q", t.Name)
174+
// If the exact same Tool pointer has already been registered under this name,
175+
// avoid rebuilding schemas and re-registering. This prevents duplicate
176+
// registration from causing errors (and unnecessary work).
177+
s.mu.Lock()
178+
if existing, ok := s.tools.get(t.Name); ok && existing.tool == t {
179+
s.mu.Unlock()
180+
return nil
181+
}
182+
s.mu.Unlock()
174183
st, err := newServerTool(t, h)
175184
if err != nil {
176185
return err

mcp/tool.go

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -97,31 +97,11 @@ func setSchema[T any](sfield **jsonschema.Schema, rfield **jsonschema.Resolved)
9797
var err error
9898
if *sfield == nil {
9999
*sfield, err = jsonschema.For[T](nil)
100-
if err != nil {
101-
return err
102-
}
103100
}
104-
// Resolve operates with internal state and cannot be called twice on the same
105-
// Schema instance. Deep-copy the schema before resolving to avoid mutating the
106-
// original (which may be reused when adding the same tool again).
107-
cloned, err := func(orig *jsonschema.Schema) (*jsonschema.Schema, error) {
108-
if orig == nil {
109-
return nil, nil
110-
}
111-
b, err := json.Marshal(orig)
112-
if err != nil {
113-
return nil, err
114-
}
115-
var cp jsonschema.Schema
116-
if err := json.Unmarshal(b, &cp); err != nil {
117-
return nil, err
118-
}
119-
return &cp, nil
120-
}(*sfield)
121101
if err != nil {
122102
return err
123103
}
124-
*rfield, err = cloned.Resolve(&jsonschema.ResolveOptions{ValidateDefaults: true})
104+
*rfield, err = (*sfield).Resolve(&jsonschema.ResolveOptions{ValidateDefaults: true})
125105
return err
126106
}
127107

0 commit comments

Comments
 (0)