Skip to content

feat(amazonq): mcp support #5770

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 16 commits into from
Jun 9, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.Encry
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.EncryptedQuickActionChatParams
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GET_SERIALIZED_CHAT_REQUEST_METHOD
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResponse
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LIST_MCP_SERVERS_REQUEST_METHOD
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.MCP_SERVER_CLICK_REQUEST_METHOD
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OPEN_SETTINGS
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OPEN_WORKSPACE_SETTINGS_KEY
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenSettingsNotification
Expand Down Expand Up @@ -461,6 +463,28 @@ class BrowserConnector(
TELEMETRY_EVENT -> {
handleChat(AmazonQChatServer.telemetryEvent, node)
}
LIST_MCP_SERVERS_REQUEST_METHOD -> {
handleChat(AmazonQChatServer.listMcpServers, node)
.whenComplete { response, _ ->
browser.postChat(
FlareUiMessage(
command = LIST_MCP_SERVERS_REQUEST_METHOD,
params = response
)
)
}
}
MCP_SERVER_CLICK_REQUEST_METHOD -> {
handleChat(AmazonQChatServer.mcpServerClick, node)
.whenComplete { response, _ ->
browser.postChat(
FlareUiMessage(
command = MCP_SERVER_CLICK_REQUEST_METHOD,
params = response
)
)
}
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
package software.aws.toolkits.jetbrains.services.amazonq.lsp

import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethodProvider
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.LSPAny
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ButtonClickParams
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ButtonClickResult
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_BUTTON_CLICK
Expand Down Expand Up @@ -37,8 +38,10 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSe
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResult
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InfoLinkClickParams
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InsertToCursorPositionParams
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LIST_MCP_SERVERS_REQUEST_METHOD
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LinkClickParams
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ListConversationsParams
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.MCP_SERVER_CLICK_REQUEST_METHOD
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.PROMPT_INPUT_OPTIONS_CHANGE
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.PromptInputOptionChangeParams
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_CHAT_COMMAND_PROMPT
Expand Down Expand Up @@ -174,6 +177,18 @@ object AmazonQChatServer : JsonRpcMethodProvider {
Any::class.java
)

val listMcpServers = JsonRpcRequest(
LIST_MCP_SERVERS_REQUEST_METHOD,
LSPAny::class.java,
LSPAny::class.java
)

val mcpServerClick = JsonRpcRequest(
MCP_SERVER_CLICK_REQUEST_METHOD,
LSPAny::class.java,
LSPAny::class.java
)

val conversationClick = JsonRpcRequest(
CHAT_CONVERSATION_CLICK,
ConversationClickParams::class.java,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@ import java.util.concurrent.atomic.AtomicInteger
class ArtifactHelper(private val lspArtifactsPath: Path = DEFAULT_ARTIFACT_PATH, private val maxDownloadAttempts: Int = MAX_DOWNLOAD_ATTEMPTS) {

companion object {
private val DEFAULT_ARTIFACT_PATH = getToolkitsCommonCacheRoot().resolve(Paths.get("aws", "toolkits", "language-servers", "AmazonQ-JetBrains-temp"))
private val DEFAULT_ARTIFACT_PATH = getToolkitsCommonCacheRoot().resolve(
Paths.get("aws", "toolkits", "language-servers", "AmazonQ-JetBrains-temp")
)
private val logger = getLogger<ArtifactHelper>()
private const val MAX_DOWNLOAD_ATTEMPTS = 3
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ class AwsServerCapabilitiesProvider {
)
),
history = true,
export = true
export = true,
mcpServers = true
)
}
}
Expand All @@ -46,6 +47,7 @@ data class ChatOptions(
val quickActions: QuickActions,
val history: Boolean,
val export: Boolean,
val mcpServers: Boolean,
)

data class QuickActions(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ data class AwsClientCapabilities(

data class DeveloperProfiles(
val developerProfiles: Boolean,
val mcp: Boolean,
)

data class WindowSettings(
Expand Down Expand Up @@ -60,7 +61,8 @@ fun createExtendedClientMetadata(project: Project): ExtendedClientMetadata {
),
awsClientCapabilities = AwsClientCapabilities(
q = DeveloperProfiles(
developerProfiles = true
developerProfiles = true,
mcp = true
),
window = WindowSettings(
showSaveFileDialog = true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,12 @@ data class ChatMessage(
val codeReference: List<ReferenceTrackerInformation>? = null,
val fileList: FileList? = null,
val contextList: FileList? = null,
val summary: Summary? = null,
)

data class Summary(
val content: ChatMessage? = null,
val collapsedContent: List<ChatMessage>? = null,
)

data class MessageHeader(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,24 @@ data class TextBasedFilterOption(
val type: String,
val placeholder: String?,
val icon: IconType?,
val title: String?,
val description: String?,
)

data class FilterOption(
val id: String,
val placeholder: String? = null,
val title: String? = null,
val description: String? = null,
val icon: IconType? = null,
val type: String,
val placeholder: String?,
val icon: IconType?,
)
val options: List<Option>? = null,
) {
data class Option(
val value: String,
val label: String,
)
}

data class Action(
val id: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,7 @@ const val SHOW_SAVE_FILE_DIALOG_REQUEST_METHOD = "aws/showSaveFileDialog"
const val STOP_CHAT_RESPONSE = "stopChatResponse"
const val SEND_TO_PROMPT = "sendToPrompt"
const val TELEMETRY_EVENT = "telemetry/event"

// https://github.com/aws/language-server-runtimes/blob/112feba70219a98a12f13727d67c540205fa9c9f/types/chat.ts#L32
const val LIST_MCP_SERVERS_REQUEST_METHOD = "aws/chat/listMcpServers"
const val MCP_SERVER_CLICK_REQUEST_METHOD = "aws/chat/mcpServerClick"
Loading