1
1
package coderd
2
2
3
3
import (
4
+ "fmt"
4
5
"net/http"
5
6
6
7
"cdr.dev/slog"
@@ -9,7 +10,6 @@ import (
9
10
"github.com/coder/coder/v2/coderd/httpmw"
10
11
"github.com/coder/coder/v2/coderd/mcp"
11
12
"github.com/coder/coder/v2/codersdk"
12
- "github.com/coder/coder/v2/codersdk/toolsdk"
13
13
)
14
14
15
15
type MCPToolset string
@@ -23,61 +23,41 @@ const (
23
23
// It supports a "toolset" query parameter to select the set of tools to register.
24
24
func (api * API ) mcpHTTPHandler () http.Handler {
25
25
return http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
26
+ // Create MCP server instance for each request
27
+ mcpServer , err := mcp .NewServer (api .Logger .Named ("mcp" ))
28
+ if err != nil {
29
+ api .Logger .Error (r .Context (), "failed to create MCP server" , slog .Error (err ))
30
+ httpapi .Write (r .Context (), w , http .StatusInternalServerError , codersdk.Response {
31
+ Message : "MCP server initialization failed" ,
32
+ })
33
+ return
34
+ }
35
+ authenticatedClient := codersdk .New (api .AccessURL )
36
+ // Extract the original session token from the request
37
+ authenticatedClient .SetSessionToken (httpmw .APITokenFromRequest (r ))
38
+
26
39
toolset := MCPToolset (r .URL .Query ().Get ("toolset" ))
27
40
// Default to standard toolset if no toolset is specified.
28
41
if toolset == "" {
29
42
toolset = MCPToolsetStandard
30
43
}
31
44
32
- mcpTools := []toolsdk.GenericTool {}
33
45
switch toolset {
34
46
case MCPToolsetStandard :
35
- // Register all available tools, but exclude:
36
- // - ReportTask - which requires dependencies not available in the remote MCP context
37
- // - ChatGPT search and fetch tools, which are redundant with the standard tools.
38
- for _ , tool := range toolsdk .All {
39
- if tool .Name == toolsdk .ToolNameReportTask ||
40
- tool .Name == toolsdk .ToolNameChatGPTSearch || tool .Name == toolsdk .ToolNameChatGPTFetch {
41
- continue
42
- }
43
- mcpTools = append (mcpTools , tool )
47
+ if err := mcpServer .RegisterTools (authenticatedClient ); err != nil {
48
+ api .Logger .Warn (r .Context (), "failed to register MCP tools" , slog .Error (err ))
44
49
}
45
50
case MCPToolsetChatGPT :
46
- // ChatGPT tools are the search and fetch tools as defined in https://platform.openai.com/docs/mcp.
47
- // We do not expose any extra ones because ChatGPT has an undocumented "Safety Scan" feature.
48
- // In my experiments, if I included extra tools in the MCP server, ChatGPT would often - but not always -
49
- // refuse to add Coder as a connector.
50
- for _ , tool := range toolsdk .All {
51
- if tool .Name == toolsdk .ToolNameChatGPTSearch || tool .Name == toolsdk .ToolNameChatGPTFetch {
52
- mcpTools = append (mcpTools , tool )
53
- }
51
+ if err := mcpServer .RegisterChatGPTTools (authenticatedClient ); err != nil {
52
+ api .Logger .Warn (r .Context (), "failed to register MCP tools" , slog .Error (err ))
54
53
}
55
54
default :
56
55
httpapi .Write (r .Context (), w , http .StatusBadRequest , codersdk.Response {
57
- Message : "Invalid toolset" ,
56
+ Message : fmt . Sprintf ( "Invalid toolset: %s" , toolset ) ,
58
57
})
59
58
return
60
59
}
61
60
62
- // Create MCP server instance for each request
63
- mcpServer , err := mcp .NewServer (api .Logger .Named ("mcp" ))
64
- if err != nil {
65
- api .Logger .Error (r .Context (), "failed to create MCP server" , slog .Error (err ))
66
- httpapi .Write (r .Context (), w , http .StatusInternalServerError , codersdk.Response {
67
- Message : "MCP server initialization failed" ,
68
- })
69
- return
70
- }
71
-
72
- authenticatedClient := codersdk .New (api .AccessURL )
73
- // Extract the original session token from the request
74
- authenticatedClient .SetSessionToken (httpmw .APITokenFromRequest (r ))
75
-
76
- // Register tools with authenticated client
77
- if err := mcpServer .RegisterTools (authenticatedClient , mcpTools ); err != nil {
78
- api .Logger .Warn (r .Context (), "failed to register MCP tools" , slog .Error (err ))
79
- }
80
-
81
61
// Handle the MCP request
82
62
mcpServer .ServeHTTP (w , r )
83
63
})
0 commit comments