@@ -2,15 +2,15 @@ package api
22
33import (
44 "context"
5+ "errors"
56 "fmt"
6- "strings"
77 "time"
88
99 "github.com/danielgtaylor/huma/v2"
1010 "github.com/mark3labs/mcp-go/mcp"
1111
1212 "github.com/mozilla-ai/mcpd/v2/internal/contracts"
13- "github.com/mozilla-ai/mcpd/v2/internal/errors"
13+ errorsint "github.com/mozilla-ai/mcpd/v2/internal/errors"
1414)
1515
1616// DomainResource wraps mcp.Resource for API conversion.
@@ -171,7 +171,7 @@ func handleServerResources(
171171) (* ResourcesResponse , error ) {
172172 mcpClient , clientOk := accessor .Client (name )
173173 if ! clientOk {
174- return nil , fmt .Errorf ("%w: %s" , errors .ErrServerNotFound , name )
174+ return nil , fmt .Errorf ("%w: %s" , errorsint .ErrServerNotFound , name )
175175 }
176176
177177 ctx , cancel := context .WithTimeout (context .Background (), 15 * time .Second )
@@ -186,16 +186,13 @@ func handleServerResources(
186186
187187 result , err := mcpClient .ListResources (ctx , req )
188188 if err != nil {
189- // TODO: This string matching is fragile and should be replaced with proper JSON-RPC error code checking.
190- // Once mcp-go preserves JSON-RPC error codes, use errors.Is(err, mcp.ErrMethodNotFound) instead.
191- // See: https://github.com/mark3labs/mcp-go/issues/593
192- if strings .Contains (err .Error (), methodNotFoundMessage ) {
193- return nil , fmt .Errorf ("%w: %s" , errors .ErrResourcesNotImplemented , name )
189+ if errors .Is (err , mcp .ErrMethodNotFound ) {
190+ return nil , fmt .Errorf ("%w: %s" , errorsint .ErrResourcesNotImplemented , name )
194191 }
195- return nil , fmt .Errorf ("%w: %s: %w" , errors .ErrResourceListFailed , name , err )
192+ return nil , fmt .Errorf ("%w: %s: %w" , errorsint .ErrResourceListFailed , name , err )
196193 }
197194 if result == nil {
198- return nil , fmt .Errorf ("%w: %s: no result" , errors .ErrResourceListFailed , name )
195+ return nil , fmt .Errorf ("%w: %s: no result" , errorsint .ErrResourceListFailed , name )
199196 }
200197
201198 resources := make ([]Resource , 0 , len (result .Resources ))
@@ -224,7 +221,7 @@ func handleServerResourceTemplates(
224221) (* ResourceTemplatesResponse , error ) {
225222 mcpClient , clientOk := accessor .Client (name )
226223 if ! clientOk {
227- return nil , fmt .Errorf ("%w: %s" , errors .ErrServerNotFound , name )
224+ return nil , fmt .Errorf ("%w: %s" , errorsint .ErrServerNotFound , name )
228225 }
229226
230227 ctx , cancel := context .WithTimeout (context .Background (), 15 * time .Second )
@@ -239,16 +236,13 @@ func handleServerResourceTemplates(
239236
240237 result , err := mcpClient .ListResourceTemplates (ctx , req )
241238 if err != nil {
242- // TODO: This string matching is fragile and should be replaced with proper JSON-RPC error code checking.
243- // Once mcp-go preserves JSON-RPC error codes, use errors.Is(err, mcp.ErrMethodNotFound) instead.
244- // See: https://github.com/mark3labs/mcp-go/issues/593
245- if strings .Contains (err .Error (), methodNotFoundMessage ) {
246- return nil , fmt .Errorf ("%w: %s" , errors .ErrResourcesNotImplemented , name )
239+ if errors .Is (err , mcp .ErrMethodNotFound ) {
240+ return nil , fmt .Errorf ("%w: %s" , errorsint .ErrResourcesNotImplemented , name )
247241 }
248- return nil , fmt .Errorf ("%w: %s: %w" , errors .ErrResourceTemplateListFailed , name , err )
242+ return nil , fmt .Errorf ("%w: %s: %w" , errorsint .ErrResourceTemplateListFailed , name , err )
249243 }
250244 if result == nil {
251- return nil , fmt .Errorf ("%w: %s: no result" , errors .ErrResourceTemplateListFailed , name )
245+ return nil , fmt .Errorf ("%w: %s: no result" , errorsint .ErrResourceTemplateListFailed , name )
252246 }
253247
254248 templates := make ([]ResourceTemplate , 0 , len (result .ResourceTemplates ))
@@ -277,7 +271,7 @@ func handleServerResourceContent(
277271) (* ResourceContentResponse , error ) {
278272 mcpClient , clientOk := accessor .Client (name )
279273 if ! clientOk {
280- return nil , fmt .Errorf ("%w: %s" , errors .ErrServerNotFound , name )
274+ return nil , fmt .Errorf ("%w: %s" , errorsint .ErrServerNotFound , name )
281275 }
282276
283277 ctx , cancel := context .WithTimeout (context .Background (), 15 * time .Second )
@@ -289,16 +283,13 @@ func handleServerResourceContent(
289283 },
290284 })
291285 if err != nil {
292- // TODO: This string matching is fragile and should be replaced with proper JSON-RPC error code checking.
293- // Once mcp-go preserves JSON-RPC error codes, use errors.Is(err, mcp.ErrMethodNotFound) instead.
294- // See: https://github.com/mark3labs/mcp-go/issues/593
295- if strings .Contains (err .Error (), methodNotFoundMessage ) {
296- return nil , fmt .Errorf ("%w: %s" , errors .ErrResourcesNotImplemented , name )
286+ if errors .Is (err , mcp .ErrMethodNotFound ) {
287+ return nil , fmt .Errorf ("%w: %s" , errorsint .ErrResourcesNotImplemented , name )
297288 }
298- return nil , fmt .Errorf ("%w: %s: %s: %w" , errors .ErrResourceReadFailed , name , uri , err )
289+ return nil , fmt .Errorf ("%w: %s: %s: %w" , errorsint .ErrResourceReadFailed , name , uri , err )
299290 }
300291 if result == nil {
301- return nil , fmt .Errorf ("%w: %s: %s: no result" , errors .ErrResourceReadFailed , name , uri )
292+ return nil , fmt .Errorf ("%w: %s: %s: no result" , errorsint .ErrResourceReadFailed , name , uri )
302293 }
303294
304295 contents := make ([]ResourceContent , 0 , len (result .Contents ))
0 commit comments