Skip to content

Commit d59e595

Browse files
while1forkdmjb
andauthored
Add support for Sourcegraph Amp (#1202) (#1204)
Signed-off-by: Chris Gernon <[email protected]> Co-authored-by: Don Browne <[email protected]>
1 parent e0feda4 commit d59e595

File tree

9 files changed

+201
-10
lines changed

9 files changed

+201
-10
lines changed

cmd/thv/app/client.go

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ var clientRegisterCmd = &cobra.Command{
3737
Long: `Register a client for MCP server configuration.
3838
3939
Valid clients:
40+
- amp-cli: Sourcegraph Amp CLI
41+
- amp-cursor: Sourcegraph Amp extension for Cursor
42+
- amp-vscode: Sourcegraph Amp extension for VS Code
43+
- amp-vscode-insider: Sourcegraph Amp extension for VS Code Insiders
44+
- amp-windsurf: Sourcegraph Amp extension for Windsurf
4045
- claude-code: Claude Code CLI
4146
- cline: Cline extension for VS Code
4247
- cursor: Cursor editor
@@ -55,6 +60,11 @@ var clientRemoveCmd = &cobra.Command{
5560
Long: `Remove a client from MCP server configuration.
5661
5762
Valid clients:
63+
- amp-cli: Sourcegraph Amp CLI
64+
- amp-cursor: Sourcegraph Amp extension for Cursor
65+
- amp-vscode: Sourcegraph Amp extension for VS Code
66+
- amp-vscode-insider: Sourcegraph Amp extension for VS Code Insiders
67+
- amp-windsurf: Sourcegraph Amp extension for Windsurf
5868
- claude-code: Claude Code CLI
5969
- cline: Cline extension for VS Code
6070
- cursor: Cursor editor
@@ -155,12 +165,13 @@ func clientRegisterCmdFunc(cmd *cobra.Command, args []string) error {
155165

156166
// Validate the client type
157167
switch clientType {
158-
case "roo-code", "cline", "cursor", "claude-code", "vscode-insider", "vscode", "windsurf", "windsurf-jetbrains":
168+
case "roo-code", "cline", "cursor", "claude-code", "vscode-insider", "vscode", "windsurf", "windsurf-jetbrains",
169+
"amp-cli", "amp-vscode", "amp-vscode-insider", "amp-cursor", "amp-windsurf":
159170
// Valid client type
160171
default:
161172
return fmt.Errorf(
162-
"invalid client type: %s (valid types: roo-code, cline, cursor, claude-code, vscode, "+
163-
"vscode-insider, windsurf, windsurf-jetbrains)",
173+
"invalid client type: %s (valid types: roo-code, cline, cursor, claude-code, vscode, vscode-insider, "+
174+
"windsurf, windsurf-jetbrains, amp-cli, amp-vscode, amp-vscode-insider, amp-cursor, amp-windsurf)",
164175
clientType)
165176
}
166177

@@ -186,12 +197,13 @@ func clientRemoveCmdFunc(cmd *cobra.Command, args []string) error {
186197

187198
// Validate the client type
188199
switch clientType {
189-
case "roo-code", "cline", "cursor", "claude-code", "vscode-insider", "vscode", "windsurf", "windsurf-jetbrains":
200+
case "roo-code", "cline", "cursor", "claude-code", "vscode-insider", "vscode", "windsurf", "windsurf-jetbrains",
201+
"amp-cli", "amp-vscode", "amp-vscode-insider", "amp-cursor", "amp-windsurf":
190202
// Valid client type
191203
default:
192204
return fmt.Errorf(
193-
"invalid client type: %s (valid types: roo-code, cline, cursor, claude-code, vscode, "+
194-
"vscode-insider, windsurf, windsurf-jetbrains)",
205+
"invalid client type: %s (valid types: roo-code, cline, cursor, claude-code, vscode, vscode-insider, "+
206+
"windsurf, windsurf-jetbrains, amp-cli, amp-vscode, amp-vscode-insider, amp-cursor, amp-windsurf)",
195207
clientType)
196208
}
197209

docs/cli/thv_client_register.md

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/cli/thv_client_remove.md

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/server/docs.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/server/swagger.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/server/swagger.yaml

Lines changed: 25 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/client/config.go

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,16 @@ const (
4242
Windsurf MCPClient = "windsurf"
4343
// WindsurfJetBrains represents the Windsurf plugin for JetBrains.
4444
WindsurfJetBrains MCPClient = "windsurf-jetbrains"
45+
// AmpCli represents the Sourcegraph Amp CLI.
46+
AmpCli MCPClient = "amp-cli"
47+
// AmpVSCode represents the Sourcegraph Amp extension for VS Code.
48+
AmpVSCode MCPClient = "amp-vscode"
49+
// AmpCursor represents the Sourcegraph Amp extension for Cursor.
50+
AmpCursor MCPClient = "amp-cursor"
51+
// AmpVSCodeInsider represents the Sourcegraph Amp extension for VS Code Insiders.
52+
AmpVSCodeInsider MCPClient = "amp-vscode-insider"
53+
// AmpWindsurf represents the Sourcegraph Amp extension for Windsurf.
54+
AmpWindsurf MCPClient = "amp-windsurf"
4555
)
4656

4757
// Extension is extension of the client config file.
@@ -221,6 +231,101 @@ var supportedClientIntegrations = []mcpClientConfig{
221231
IsTransportTypeFieldSupported: true,
222232
MCPServersUrlLabel: "serverUrl",
223233
},
234+
{
235+
ClientType: AmpCli,
236+
Description: "Sourcegraph Amp CLI",
237+
SettingsFile: "settings.json",
238+
MCPServersPathPrefix: "/amp.mcpServers",
239+
RelPath: []string{"amp"},
240+
PlatformPrefix: map[string][]string{
241+
"linux": {".config"},
242+
"darwin": {".config"},
243+
"windows": {"AppData", "Roaming"},
244+
},
245+
Extension: JSON,
246+
SupportedTransportTypesMap: map[types.TransportType]string{
247+
types.TransportTypeStdio: "sse",
248+
types.TransportTypeSSE: "sse",
249+
types.TransportTypeStreamableHTTP: "http",
250+
},
251+
IsTransportTypeFieldSupported: true,
252+
},
253+
{
254+
ClientType: AmpVSCode,
255+
Description: "VS Code Sourcegraph Amp extension",
256+
SettingsFile: "settings.json",
257+
MCPServersPathPrefix: "/amp.mcpServers",
258+
RelPath: []string{"Code", "User"},
259+
PlatformPrefix: map[string][]string{
260+
"linux": {".config"},
261+
"darwin": {"Library", "Application Support"},
262+
"windows": {"AppData", "Roaming"},
263+
},
264+
Extension: JSON,
265+
SupportedTransportTypesMap: map[types.TransportType]string{
266+
types.TransportTypeStdio: "sse",
267+
types.TransportTypeSSE: "sse",
268+
types.TransportTypeStreamableHTTP: "http",
269+
},
270+
IsTransportTypeFieldSupported: true,
271+
},
272+
{
273+
ClientType: AmpVSCodeInsider,
274+
Description: "VS Code Insiders Sourcegraph Amp extension",
275+
SettingsFile: "settings.json",
276+
MCPServersPathPrefix: "/amp.mcpServers",
277+
RelPath: []string{"Code - Insiders", "User"},
278+
PlatformPrefix: map[string][]string{
279+
"linux": {".config"},
280+
"darwin": {"Library", "Application Support"},
281+
"windows": {"AppData", "Roaming"},
282+
},
283+
Extension: JSON,
284+
SupportedTransportTypesMap: map[types.TransportType]string{
285+
types.TransportTypeStdio: "sse",
286+
types.TransportTypeSSE: "sse",
287+
types.TransportTypeStreamableHTTP: "http",
288+
},
289+
IsTransportTypeFieldSupported: true,
290+
},
291+
{
292+
ClientType: AmpCursor,
293+
Description: "Cursor Sourcegraph Amp extension",
294+
SettingsFile: "settings.json",
295+
MCPServersPathPrefix: "/amp.mcpServers",
296+
RelPath: []string{"Cursor", "User"},
297+
PlatformPrefix: map[string][]string{
298+
"linux": {".config"},
299+
"darwin": {"Library", "Application Support"},
300+
"windows": {"AppData", "Roaming"},
301+
},
302+
Extension: JSON,
303+
SupportedTransportTypesMap: map[types.TransportType]string{
304+
types.TransportTypeStdio: "sse",
305+
types.TransportTypeSSE: "sse",
306+
types.TransportTypeStreamableHTTP: "http",
307+
},
308+
IsTransportTypeFieldSupported: true,
309+
},
310+
{
311+
ClientType: AmpWindsurf,
312+
Description: "Windsurf Sourcegraph Amp extension",
313+
SettingsFile: "settings.json",
314+
MCPServersPathPrefix: "/amp.mcpServers",
315+
RelPath: []string{"Windsurf", "User"},
316+
PlatformPrefix: map[string][]string{
317+
"linux": {".config"},
318+
"darwin": {"Library", "Application Support"},
319+
"windows": {"AppData", "Roaming"},
320+
},
321+
Extension: JSON,
322+
SupportedTransportTypesMap: map[types.TransportType]string{
323+
types.TransportTypeStdio: "sse",
324+
types.TransportTypeSSE: "sse",
325+
types.TransportTypeStreamableHTTP: "http",
326+
},
327+
IsTransportTypeFieldSupported: true,
328+
},
224329
}
225330

226331
// ConfigFile represents a client configuration file

pkg/client/config_test.go

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,22 @@ func createMockClientConfigs() []mcpClientConfig {
5353
MCPServersPathPrefix: "/mcpServers",
5454
Extension: JSON,
5555
},
56+
{
57+
ClientType: AmpCli,
58+
Description: "Sourcegraph Amp CLI (Mock)",
59+
RelPath: []string{"mock_amp_cli"},
60+
SettingsFile: "settings.json",
61+
MCPServersPathPrefix: "/amp.mcpServers",
62+
Extension: JSON,
63+
},
64+
{
65+
ClientType: AmpCursor,
66+
Description: "Cursor Sourcegraph Amp extension (Mock)",
67+
RelPath: []string{"mock_amp_cursor"},
68+
SettingsFile: "settings.json",
69+
MCPServersPathPrefix: "/amp.mcpServers",
70+
Extension: JSON,
71+
},
5672
}
5773
}
5874

@@ -260,6 +276,11 @@ func TestSuccessfulClientConfigOperations(t *testing.T) {
260276
string(RooCode),
261277
string(ClaudeCode),
262278
string(Cline),
279+
string(AmpCli),
280+
string(AmpVSCode),
281+
string(AmpCursor),
282+
string(AmpVSCodeInsider),
283+
string(AmpWindsurf),
263284
},
264285
},
265286
}
@@ -318,6 +339,21 @@ func TestSuccessfulClientConfigOperations(t *testing.T) {
318339
case WindsurfJetBrains:
319340
assert.Contains(t, string(content), `"mcpServers":`,
320341
"WindsurfJetBrains config should contain mcpServers key")
342+
case AmpCli:
343+
assert.Contains(t, string(content), `"mcpServers":`,
344+
"AmpCli config should contain mcpServers key")
345+
case AmpVSCode:
346+
assert.Contains(t, string(content), `"mcpServers":`,
347+
"AmpVSCode config should contain mcpServers key")
348+
case AmpVSCodeInsider:
349+
assert.Contains(t, string(content), `"mcpServers":`,
350+
"AmpVSCodeInsider config should contain mcpServers key")
351+
case AmpCursor:
352+
assert.Contains(t, string(content), `"mcpServers":`,
353+
"AmpCursor config should contain mcpServers key")
354+
case AmpWindsurf:
355+
assert.Contains(t, string(content), `"mcpServers":`,
356+
"AmpWindsurf config should contain mcpServers key")
321357
}
322358
}
323359
})
@@ -343,7 +379,8 @@ func TestSuccessfulClientConfigOperations(t *testing.T) {
343379
case VSCode, VSCodeInsider:
344380
assert.Contains(t, string(content), testURL,
345381
"VSCode config should contain the server URL")
346-
case Cursor, RooCode, ClaudeCode, Cline, Windsurf, WindsurfJetBrains:
382+
case Cursor, RooCode, ClaudeCode, Cline, Windsurf, WindsurfJetBrains, AmpCli,
383+
AmpVSCode, AmpCursor, AmpVSCodeInsider, AmpWindsurf:
347384
assert.Contains(t, string(content), testURL,
348385
"Config should contain the server URL")
349386
}

pkg/config/config_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,9 @@ func TestSave(t *testing.T) {
106106
ProviderType: string(secrets.EncryptedType),
107107
},
108108
Clients: Clients{
109-
RegisteredClients: []string{"vscode", "cursor", "roo-code", "cline", "claude-code"},
109+
RegisteredClients: []string{
110+
"vscode", "cursor", "roo-code", "cline", "claude-code", "amp-cli", "amp-vscode", "amp-cursor",
111+
},
110112
},
111113
}
112114

0 commit comments

Comments
 (0)