googleapis/mcp-toolbox · error
INTERNAL_ERROR
INTERNAL_ERROR
Error message
unable to retrieve enableDraftSpecs from context
What it means
serverDiscoverHandler reads the enableDraftSpecs flag from the request context via util.EnableDraftSpecsFromContext; it must always be present for server/discover requests. If missing, the context was not populated by the middleware/route that normally injects it, so the handler returns a jsonrpc INTERNAL_ERROR rather than guessing a default (internal/server/mcp/v20260728/method.go:167).
Source
Thrown at internal/server/mcp/v20260728/method.go:167
return resMeta, nil
}
newMeta := make(map[string]any)
// copy current Metadata into the new meta obj
for k, v := range curMeta {
newMeta[k] = v
}
// copy the ResultMetaObject items over
for k, v := range resMeta {
newMeta[k] = v
}
return newMeta, nil
}
func serverDiscoverHandler(ctx context.Context, id jsonrpc.RequestId, body []byte, header http.Header) (any, error) {
enableDraft, ok := util.EnableDraftSpecsFromContext(ctx)
if !ok {
err := fmt.Errorf("unable to retrieve enableDraftSpecs from context")
return jsonrpc.NewError(id, jsonrpc.INTERNAL_ERROR, err.Error(), nil), err
}
var req DiscoverRequest
if err := json.Unmarshal(body, &req); err != nil {
err = fmt.Errorf("invalid server discover request: %w", err)
return jsonrpc.NewError(id, jsonrpc.INVALID_REQUEST, err.Error(), nil), err
}
validateHeaderErr, err := validateHeader(id, header, SERVER_DISCOVER, "")
if err != nil {
return validateHeaderErr, err
}
validateErr, err := validateMetadata(id, req.Params, header == nil)
if err != nil {
return validateErr, err
}
toolsListChanged := falseView on GitHub (pinned to 8cc6e09de2)
Solutions
- Route the request through the standard MCP server wiring so the middleware that injects enableDraftSpecs runs.
- In tests or custom handlers, populate the context with util.WithEnableDraftSpecs(ctx, <bool>) before calling serverDiscoverHandler.
- Update to a current toolbox version if you maintain a patched fork where the context-injection middleware was removed.
Example fix
// before handler(ctx, id, body, header) // ctx lacks the flag // after ctx = util.WithEnableDraftSpecs(ctx, true) handler(ctx, id, body, header)
Defensive patterns
Strategy: validation
Validate before calling
// Go: ensure the context carries the flag before invoking the handler
if _, ok := util.EnableDraftSpecsFromContext(ctx); !ok {
ctx = util.WithEnableDraftSpecs(ctx, false)
} Try / catch
res, err := serverDiscoverHandler(ctx, id, body, header)
if err != nil && strings.Contains(err.Error(), "unable to retrieve enableDraftSpecs") {
// handler was invoked without the standard middleware; reroute or fix wiring
log.Printf("misconfigured handler wiring: %v", err)
} Prevention
- Always invoke MCP handlers through the standard server wiring/middleware.
- In tests, construct contexts with util.WithEnableDraftSpecs.
- When porting handlers into custom frameworks, replicate all context-injection middlewares.
- Keep patched forks in sync with upstream middleware changes.
When it happens
Trigger: Invoking serverDiscoverHandler through a custom route, test harness, or ProcessMethod path that bypasses the middleware which calls util.WithEnableDraftSpecs (or equivalent) to store the flag in ctx.
Common situations: Custom HTTP handlers wrapping the MCP processor without the spec-version middleware; unit/integration tests constructing a context manually; framework adapters that create a fresh context.Context for handlers.
Related errors
AI-assisted analysis of googleapis/mcp-toolbox@8cc6e09de2 (2026-09-05).
Data as JSON: /api/errors/a0c62097dfc09d88.
Report an issue: GitHub.