@@ -6,16 +6,15 @@ import (
66 "context"
77 "errors"
88 "fmt"
9- "io"
109 "log/slog"
1110 "net/http"
1211 "os"
1312 "strings"
1413 "time"
1514
15+ "github.com/modelcontextprotocol/go-sdk/mcp"
16+
1617 mcpauth "github.com/meridianhub/meridian/services/mcp-server/internal/auth"
17- "github.com/meridianhub/meridian/services/mcp-server/internal/server"
18- "github.com/meridianhub/meridian/services/mcp-server/internal/transport"
1918 platformauth "github.com/meridianhub/meridian/shared/platform/auth"
2019 "github.com/meridianhub/meridian/shared/platform/bootstrap"
2120 "github.com/meridianhub/meridian/shared/platform/env"
@@ -56,39 +55,36 @@ func run(logger *slog.Logger) error {
5655 transportMode := env .GetEnvOrDefault ("MCP_TRANSPORT" , "stdio" )
5756 serverName := env .GetEnvOrDefault ("MCP_SERVER_NAME" , "meridian-mcp" )
5857
59- cfg := server.Config {
60- ServerName : serverName ,
61- ServerVersion : Version ,
58+ srv := mcp .NewServer (& mcp.Implementation {
59+ Name : serverName ,
60+ Version : Version ,
61+ }, & mcp.ServerOptions {
62+ Logger : logger ,
63+ })
64+
65+ // Wire tools, resources, and prompts onto the server.
66+ // cookbookFS is nil until the cookbook directory is embedded at build time.
67+ cleanup , err := wireServer (srv , logger , nil )
68+ if err != nil {
69+ return fmt .Errorf ("wire server: %w" , err )
70+ }
71+ if cleanup != nil {
72+ defer cleanup ()
6273 }
6374
6475 switch transportMode {
6576 case "stdio" :
66- return runStdio (logger , cfg )
77+ return runStdio (logger , srv )
6778 case "http" :
68- return runHTTP (logger , cfg )
79+ return runHTTP (logger , srv )
6980 default :
7081 return bootstrap .Permanent (fmt .Errorf ("%w: %s (expected stdio or http)" , errUnknownTransport , transportMode ))
7182 }
7283}
7384
74- func runStdio (logger * slog.Logger , cfg server. Config ) error {
85+ func runStdio (logger * slog.Logger , srv * mcp. Server ) error {
7586 logger .Info ("using stdio transport" )
7687
77- tr := transport .NewStdioTransport (os .Stdin , os .Stdout )
78- defer tr .Close ()
79-
80- srv := server .New (tr , cfg , logger )
81-
82- // Wire tools, resources, and prompts onto the server.
83- // cookbookFS is nil until the cookbook directory is embedded at build time.
84- cleanup , err := wireServer (srv , logger , nil )
85- if err != nil {
86- return fmt .Errorf ("wire server: %w" , err )
87- }
88- if cleanup != nil {
89- defer cleanup ()
90- }
91-
9288 // For stdio, we run until stdin closes or we receive a signal.
9389 ctx , cancel := context .WithCancel (context .Background ())
9490 defer cancel ()
@@ -105,7 +101,7 @@ func runStdio(logger *slog.Logger, cfg server.Config) error {
105101 }
106102 }()
107103
108- return srv .Run (ctx )
104+ return srv .Run (ctx , & mcp. StdioTransport {} )
109105}
110106
111107const (
@@ -180,33 +176,16 @@ func (p *passthroughIssuer) Issue(claims map[string]any) (string, error) {
180176 return fmt .Sprintf ("mcp-issued-%v" , claims ["client_id" ]), nil
181177}
182178
183- func runHTTP (logger * slog.Logger , cfg server. Config ) error {
179+ func runHTTP (logger * slog.Logger , srv * mcp. Server ) error {
184180 port := env .GetEnvOrDefault ("MCP_PORT" , "8090" )
185181 addr := fmt .Sprintf (":%s" , port )
186182
187183 logger .Info ("using streamable HTTP transport" , "address" , addr )
188184
189- // The streamable HTTP handler calls Dispatch() directly — no transport
190- // read/write loop is needed. We provide a no-op transport to satisfy
191- // server.New(); Run() is never called in HTTP mode.
192- pr , pw := io .Pipe ()
193- noopTr := transport .NewStdioTransport (pr , io .Discard )
194- defer func () { _ = pw .Close (); _ = noopTr .Close () }()
195-
196- srv := server .New (noopTr , cfg , logger )
197-
198- // Wire tools, resources, and prompts onto the server.
199- // cookbookFS is nil until the cookbook directory is embedded at build time.
200- cleanup , wireErr := wireServer (srv , logger , nil )
201- if wireErr != nil {
202- return fmt .Errorf ("wire server: %w" , wireErr )
203- }
204- if cleanup != nil {
205- defer cleanup ()
206- }
207-
208- streamableHandler := transport .NewStreamableHTTPHandler (srv , logger )
209- defer streamableHandler .Close ()
185+ // The SDK's StreamableHTTPHandler creates sessions and transports internally.
186+ streamableHandler := mcp .NewStreamableHTTPHandler (func (_ * http.Request ) * mcp.Server {
187+ return srv
188+ }, nil )
210189
211190 mux := http .NewServeMux ()
212191
0 commit comments