@@ -37,6 +37,7 @@ import (
3737 "github.com/modelcontextprotocol/go-sdk/internal/util"
3838 "github.com/modelcontextprotocol/go-sdk/internal/xcontext"
3939 "github.com/modelcontextprotocol/go-sdk/jsonrpc"
40+ "golang.org/x/oauth2"
4041)
4142
4243// A StreamableHTTPHandler is an http.Handler that serves streamable MCP
@@ -1803,6 +1804,7 @@ func (c *streamableClientConn) Write(ctx context.Context, msg jsonrpc.Message) e
18031804 }
18041805 req .Header .Set ("Content-Type" , "application/json" )
18051806 req .Header .Set ("Accept" , "application/json, text/event-stream" )
1807+
18061808 if err := c .setMCPHeaders (req ); err != nil {
18071809 // Failure to set headers means that the request was not sent.
18081810 // Wrap with ErrRejected so the jsonrpc2 connection doesn't set writeErr
@@ -1934,9 +1936,20 @@ func (c *streamableClientConn) setMCPHeaders(req *http.Request) error {
19341936 if ts != nil {
19351937 token , err := ts .Token ()
19361938 if err != nil {
1937- return err
1938- }
1939- if token != nil {
1939+ // If the error is an invalid_grant oauth2.RetrieveError it indicates
1940+ // that the token source doesn't have valid authorization for the token
1941+ // endpoint, per RFC 6749 section 5.2. For example, the refresh token
1942+ // may be expired or invalid.
1943+ //
1944+ // In that case, ignore the error, skip setting the Authorization
1945+ // header, and proceed with the request. Callers that support
1946+ // authorization flows get a 401/403 response and trigger the
1947+ // Authorize() flow to refresh their token.
1948+ var retrieveErr * oauth2.RetrieveError
1949+ if ! errors .As (err , & retrieveErr ) || retrieveErr .ErrorCode != "invalid_grant" {
1950+ return err
1951+ }
1952+ } else if token != nil {
19401953 req .Header .Set ("Authorization" , "Bearer " + token .AccessToken )
19411954 }
19421955 }
@@ -2236,8 +2249,10 @@ func (c *streamableClientConn) Close() error {
22362249 } else {
22372250 if err := c .setMCPHeaders (req ); err != nil {
22382251 c .closeErr = err
2239- } else if _ , err := c .client .Do (req ); err != nil {
2252+ } else if resp , err := c .client .Do (req ); err != nil {
22402253 c .closeErr = err
2254+ } else {
2255+ resp .Body .Close ()
22412256 }
22422257 }
22432258 }
0 commit comments