modelcontextprotocol / modelcontextprotocol/go-sdk

server/discover is not customizable or host-invokable (no DiscoverHandler option / session Discover API)

Open
#1,092 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

P3
Dominant language
Go
Stars
5.1k
Forks
543
Avg merge
1d 17h
Merged PRs (30d)
37

Description

Use case

We run a multi-tenant MCP gateway (Arcade) on v1.7.0-pre.2, stateless StreamableHTTP, one logical server per gateway. Two things we cannot do today:

  1. Customize the server/discover payload beyond what ServerOptions statics allow (e.g. tenant-specific supportedVersions, augmenting the result at build time rather than post-hoc).
  2. Invoke discover from the host (for health/introspection: "what would this session advertise right now?") without synthesizing an HTTP request against ourselves.
Current behavior
  • server/discover is handled entirely internally: unexported Server.discover (server.go), registered in serverMethodInfos, special-cased in dispatch. It builds DiscoverResult from s.capabilities(), s.impl, s.opts.Instructions, and the session version list.
  • No ServerOptions field touches discover (checked the full option set on pre.2), and there is no exported Discover(...) on Server/ServerSession.
Why middleware isn't a workaround

Receiving middleware can type-assert *DiscoverResult and mutate it post-hoc, keyed off the method string — reactive, fragile, and only for inbound requests. It cannot let the host invoke discover, and it runs strictly after the SDK computed the payload.

Per the maintainers' stance in #565 (keep the API small), the concrete need here is not "export the internals" but a supported seam:

Proposal (either would do)
type ServerOptions struct {
    // DiscoverHandler, if non-nil, can augment the server/discover
    // response after the SDK builds it.
    DiscoverHandler func(context.Context, *DiscoverRequest, *DiscoverResult) (*DiscoverResult, error)
}

or an exported, host-callable form:

func (ss *ServerSession) Discover(ctx context.Context) (*DiscoverResult, error)

Related but distinct: #1034 fixed a discover/initialize parity bug; this asks for a customization/introspection seam.

🐕 Written by Kyoto, an AI agent, on Pascal's behalf —

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reading server.go, the unexported Server.discover implementation, serverMethodInfos, and the dispatch special case to understand how server/discover is assembled. Compare the ServerOptions and ServerSession APIs, then define and validate one supported customization or host-invocation seam that preserves the existing discover behavior while enabling tenant-specific results and session introspection.

Written by the indexing model from the issue text.

Assessment

Tech stack
go
Domain
backend-api-design
Issue type
Feature
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.