@codingame/monaco-vscode-mcp-service-override 32.0.0 → 32.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/index.js +1 -0
  2. package/package.json +2 -2
  3. package/vscode/src/vs/workbench/contrib/mcp/browser/mcp.contribution.js +3 -3
  4. package/vscode/src/vs/workbench/contrib/mcp/browser/mcp.view.contribution.d.ts +1 -0
  5. package/vscode/src/vs/workbench/contrib/mcp/browser/mcp.view.contribution.js +5 -0
  6. package/vscode/src/vs/workbench/contrib/mcp/browser/mcpAddContextContribution.js +2 -2
  7. package/vscode/src/vs/workbench/contrib/mcp/browser/mcpCommands.js +61 -61
  8. package/vscode/src/vs/workbench/contrib/mcp/browser/mcpElicitationService.js +25 -25
  9. package/vscode/src/vs/workbench/contrib/mcp/browser/mcpLanguageFeatures.js +22 -22
  10. package/vscode/src/vs/workbench/contrib/mcp/browser/mcpMigration.js +4 -4
  11. package/vscode/src/vs/workbench/contrib/mcp/browser/mcpResourceQuickAccess.js +8 -8
  12. package/vscode/src/vs/workbench/contrib/mcp/browser/mcpServerEditor.js +37 -37
  13. package/vscode/src/vs/workbench/contrib/mcp/browser/mcpServerEditorInput.js +2 -2
  14. package/vscode/src/vs/workbench/contrib/mcp/browser/mcpServerIcons.js +5 -5
  15. package/vscode/src/vs/workbench/contrib/mcp/browser/mcpServerWidgets.js +98 -6
  16. package/vscode/src/vs/workbench/contrib/mcp/browser/mcpServersView.d.ts +59 -0
  17. package/vscode/src/vs/workbench/contrib/mcp/browser/mcpServersView.js +576 -0
  18. package/vscode/src/vs/workbench/contrib/mcp/browser/mcpWorkbenchService.js +10 -10
  19. package/vscode/src/vs/workbench/contrib/mcp/browser/media/mcpServersView.css +53 -0
  20. package/vscode/src/vs/workbench/contrib/mcp/common/discovery/extensionMcpDiscovery.js +4 -4
  21. package/vscode/src/vs/workbench/contrib/mcp/common/discovery/nativeMcpDiscoveryAbstract.js +1 -1
  22. package/vscode/src/vs/workbench/contrib/mcp/common/mcpContextKeys.js +4 -4
  23. package/vscode/src/vs/workbench/contrib/mcp/common/mcpLanguageModelToolContribution.js +6 -6
  24. package/vscode/src/vs/workbench/contrib/mcp/common/mcpRegistry.js +13 -13
  25. package/vscode/src/vs/workbench/contrib/mcp/common/mcpSamplingLog.js +1 -1
  26. package/vscode/src/vs/workbench/contrib/mcp/common/mcpSamplingService.js +11 -11
  27. package/vscode/src/vs/workbench/contrib/mcp/common/mcpSandboxService.js +3 -3
  28. package/vscode/src/vs/workbench/contrib/mcp/common/mcpServerConnection.js +3 -3
  29. package/vscode/src/vs/workbench/services/authentication/browser/authenticationMcpService.js +9 -9
@@ -192,7 +192,7 @@ let McpServerEditor = class McpServerEditor extends EditorPane {
192
192
  tabIndex: 0
193
193
  }));
194
194
  this._register(
195
- this.hoverService.setupManagedHover(getDefaultHoverDelegate("mouse"), name, ( localize(11067, "Extension name")))
195
+ this.hoverService.setupManagedHover(getDefaultHoverDelegate("mouse"), name, ( localize(11078, "Extension name")))
196
196
  );
197
197
  const subtitle = append(details, $(".subtitle"));
198
198
  const subTitleEntryContainers = [];
@@ -352,18 +352,18 @@ let McpServerEditor = class McpServerEditor extends EditorPane {
352
352
  this.currentIdentifier = extension.id;
353
353
  }
354
354
  if (extension.readmeUrl || extension.gallery?.readme) {
355
- template.navbar.push(McpServerEditorTab.Readme, ( localize(11068, "Details")), ( localize(11069, "Extension details, rendered from the extension's 'README.md' file")));
355
+ template.navbar.push(McpServerEditorTab.Readme, ( localize(11079, "Details")), ( localize(11080, "Extension details, rendered from the extension's 'README.md' file")));
356
356
  }
357
357
  if (extension.gallery || extension.local?.manifest) {
358
- template.navbar.push(McpServerEditorTab.Manifest, ( localize(11070, "Manifest")), ( localize(11071, "Server manifest details")));
358
+ template.navbar.push(McpServerEditorTab.Manifest, ( localize(11081, "Manifest")), ( localize(11082, "Server manifest details")));
359
359
  }
360
360
  if (extension.config) {
361
- template.navbar.push(McpServerEditorTab.Configuration, ( localize(11072, "Configuration")), ( localize(11073, "Server configuration details")));
361
+ template.navbar.push(McpServerEditorTab.Configuration, ( localize(11083, "Configuration")), ( localize(11084, "Server configuration details")));
362
362
  }
363
363
  this.transientDisposables.add(this.mcpWorkbenchService.onChange(e => {
364
364
  if (e === extension) {
365
365
  if (e.config && !( template.navbar.has(McpServerEditorTab.Configuration))) {
366
- template.navbar.push(McpServerEditorTab.Configuration, ( localize(11072, "Configuration")), ( localize(11073, "Server configuration details")), extension.readmeUrl ? 1 : 0);
366
+ template.navbar.push(McpServerEditorTab.Configuration, ( localize(11083, "Configuration")), ( localize(11084, "Server configuration details")), extension.readmeUrl ? 1 : 0);
367
367
  }
368
368
  if (!e.config && ( template.navbar.has(McpServerEditorTab.Configuration))) {
369
369
  template.navbar.remove(McpServerEditorTab.Configuration);
@@ -591,7 +591,7 @@ let McpServerEditor = class McpServerEditor extends EditorPane {
591
591
  this.contentDisposables.add(toDisposable(insert(this.layoutParticipants, {
592
592
  layout
593
593
  })));
594
- const activeElement = await this.openMarkdown(extension, this.mcpServerReadme.get(), ( localize(11074, "No README available.")), readmeContainer, WebviewIndex.Readme, ( localize(11075, "Readme")), token);
594
+ const activeElement = await this.openMarkdown(extension, this.mcpServerReadme.get(), ( localize(11085, "No README available.")), readmeContainer, WebviewIndex.Readme, ( localize(11086, "Readme")), token);
595
595
  this.renderAdditionalDetails(additionalDetailsContainer, extension);
596
596
  return activeElement;
597
597
  }
@@ -640,7 +640,7 @@ let McpServerEditor = class McpServerEditor extends EditorPane {
640
640
  content.removeChild(content.firstChild);
641
641
  }
642
642
  const noManifestMessage = append(content, $(".no-manifest"));
643
- noManifestMessage.textContent = ( localize(11076, "No manifest available for this MCP server."));
643
+ noManifestMessage.textContent = ( localize(11087, "No manifest available for this MCP server."));
644
644
  }
645
645
  const scrollableContent = ( new DomScrollableElement(content, {}));
646
646
  const layout = () => scrollableContent.scanDomNode();
@@ -657,36 +657,36 @@ let McpServerEditor = class McpServerEditor extends EditorPane {
657
657
  const config = mcpServer.config;
658
658
  if (!config) {
659
659
  const noConfigMessage = append(container, $(".no-config"));
660
- noConfigMessage.textContent = ( localize(11077, "No configuration available for this MCP server."));
660
+ noConfigMessage.textContent = ( localize(11088, "No configuration available for this MCP server."));
661
661
  return;
662
662
  }
663
663
  const nameSection = append(container, $(".config-section"));
664
664
  const nameLabel = append(nameSection, $(".config-label"));
665
- nameLabel.textContent = ( localize(11078, "Name:"));
665
+ nameLabel.textContent = ( localize(11089, "Name:"));
666
666
  const nameValue = append(nameSection, $(".config-value"));
667
667
  nameValue.textContent = mcpServer.name;
668
668
  const typeSection = append(container, $(".config-section"));
669
669
  const typeLabel = append(typeSection, $(".config-label"));
670
- typeLabel.textContent = ( localize(11079, "Type:"));
670
+ typeLabel.textContent = ( localize(11090, "Type:"));
671
671
  const typeValue = append(typeSection, $(".config-value"));
672
672
  typeValue.textContent = config.type;
673
673
  if (config.type === McpServerType.LOCAL) {
674
674
  const commandSection = append(container, $(".config-section"));
675
675
  const commandLabel = append(commandSection, $(".config-label"));
676
- commandLabel.textContent = ( localize(11080, "Command:"));
676
+ commandLabel.textContent = ( localize(11091, "Command:"));
677
677
  const commandValue = append(commandSection, $("code.config-value"));
678
678
  commandValue.textContent = config.command;
679
679
  if (config.args && config.args.length > 0) {
680
680
  const argsSection = append(container, $(".config-section"));
681
681
  const argsLabel = append(argsSection, $(".config-label"));
682
- argsLabel.textContent = ( localize(11081, "Arguments:"));
682
+ argsLabel.textContent = ( localize(11092, "Arguments:"));
683
683
  const argsValue = append(argsSection, $("code.config-value"));
684
684
  argsValue.textContent = config.args.join(" ");
685
685
  }
686
686
  if (config.env && ( Object.keys(config.env)).length > 0) {
687
687
  const envSection = append(container, $(".config-section"));
688
688
  const envLabel = append(envSection, $(".config-label"));
689
- envLabel.textContent = ( localize(11082, "Environment:"));
689
+ envLabel.textContent = ( localize(11093, "Environment:"));
690
690
  const envValue = append(envSection, $(".config-value"));
691
691
  for (const [key, value] of Object.entries(config.env)) {
692
692
  append(envValue, $("code.env-entry", undefined, `${key}=${value ?? ""}`));
@@ -695,20 +695,20 @@ let McpServerEditor = class McpServerEditor extends EditorPane {
695
695
  if (config.envFile) {
696
696
  const envFileSection = append(container, $(".config-section"));
697
697
  const envFileLabel = append(envFileSection, $(".config-label"));
698
- envFileLabel.textContent = ( localize(11083, "Environment File:"));
698
+ envFileLabel.textContent = ( localize(11094, "Environment File:"));
699
699
  const envFileValue = append(envFileSection, $("code.config-value"));
700
700
  envFileValue.textContent = config.envFile;
701
701
  }
702
702
  } else if (config.type === McpServerType.REMOTE) {
703
703
  const urlSection = append(container, $(".config-section"));
704
704
  const urlLabel = append(urlSection, $(".config-label"));
705
- urlLabel.textContent = ( localize(11084, "URL:"));
705
+ urlLabel.textContent = ( localize(11095, "URL:"));
706
706
  const urlValue = append(urlSection, $("code.config-value"));
707
707
  urlValue.textContent = config.url;
708
708
  if (config.headers && ( Object.keys(config.headers)).length > 0) {
709
709
  const headersSection = append(container, $(".config-section"));
710
710
  const headersLabel = append(headersSection, $(".config-label"));
711
- headersLabel.textContent = ( localize(11085, "Headers:"));
711
+ headersLabel.textContent = ( localize(11096, "Headers:"));
712
712
  const headersValue = append(headersSection, $(".config-value"));
713
713
  for (const [key, value] of Object.entries(config.headers)) {
714
714
  append(headersValue, $("code.env-entry", undefined, `${key}: ${value ?? ""}`));
@@ -731,7 +731,7 @@ let McpServerEditor = class McpServerEditor extends EditorPane {
731
731
  append(container, $(
732
732
  ".manifest-section",
733
733
  undefined,
734
- $(".manifest-section-title", undefined, ( localize(11086, "Packages")))
734
+ $(".manifest-section-title", undefined, ( localize(11097, "Packages")))
735
735
  ));
736
736
  for (const [packageType, packages] of packagesByType) {
737
737
  const packageSection = append(container, $(
@@ -744,7 +744,7 @@ let McpServerEditor = class McpServerEditor extends EditorPane {
744
744
  const pkg = packages[i];
745
745
  append(
746
746
  packagesGrid,
747
- $(".package-detail", undefined, $(".detail-label", undefined, ( localize(11087, "Package:"))), $(".detail-value", undefined, pkg.identifier))
747
+ $(".package-detail", undefined, $(".detail-label", undefined, ( localize(11098, "Package:"))), $(".detail-value", undefined, pkg.identifier))
748
748
  );
749
749
  if (pkg.packageArguments && pkg.packageArguments.length > 0) {
750
750
  const argStrings = [];
@@ -764,7 +764,7 @@ let McpServerEditor = class McpServerEditor extends EditorPane {
764
764
  }
765
765
  append(
766
766
  packagesGrid,
767
- $(".package-detail", undefined, $(".detail-label", undefined, ( localize(11088, "Package Arguments:"))), $("code.detail-value", undefined, argStrings.join(" ")))
767
+ $(".package-detail", undefined, $(".detail-label", undefined, ( localize(11099, "Package Arguments:"))), $("code.detail-value", undefined, argStrings.join(" ")))
768
768
  );
769
769
  }
770
770
  if (pkg.runtimeArguments && pkg.runtimeArguments.length > 0) {
@@ -785,14 +785,14 @@ let McpServerEditor = class McpServerEditor extends EditorPane {
785
785
  }
786
786
  append(
787
787
  packagesGrid,
788
- $(".package-detail", undefined, $(".detail-label", undefined, ( localize(11089, "Runtime Arguments:"))), $("code.detail-value", undefined, argStrings.join(" ")))
788
+ $(".package-detail", undefined, $(".detail-label", undefined, ( localize(11100, "Runtime Arguments:"))), $("code.detail-value", undefined, argStrings.join(" ")))
789
789
  );
790
790
  }
791
791
  if (pkg.environmentVariables && pkg.environmentVariables.length > 0) {
792
792
  const envStrings = ( pkg.environmentVariables.map(envVar => `${envVar.name}=${envVar.value ?? ""}`));
793
793
  append(
794
794
  packagesGrid,
795
- $(".package-detail", undefined, $(".detail-label", undefined, ( localize(11090, "Environment Variables:"))), $("code.detail-value", undefined, envStrings.join(" ")))
795
+ $(".package-detail", undefined, $(".detail-label", undefined, ( localize(11101, "Environment Variables:"))), $("code.detail-value", undefined, envStrings.join(" ")))
796
796
  );
797
797
  }
798
798
  if (i < packages.length - 1) {
@@ -805,25 +805,25 @@ let McpServerEditor = class McpServerEditor extends EditorPane {
805
805
  const packageSection = append(container, $(
806
806
  ".package-section",
807
807
  undefined,
808
- $(".package-section-title", undefined, ( localize(11091, "Remote")).toLocaleUpperCase())
808
+ $(".package-section-title", undefined, ( localize(11102, "Remote")).toLocaleUpperCase())
809
809
  ));
810
810
  for (const remote of manifest.remotes) {
811
811
  const packagesGrid = append(packageSection, $(".package-details"));
812
812
  append(
813
813
  packagesGrid,
814
- $(".package-detail", undefined, $(".detail-label", undefined, ( localize(11084, "URL:"))), $(".detail-value", undefined, remote.url))
814
+ $(".package-detail", undefined, $(".detail-label", undefined, ( localize(11095, "URL:"))), $(".detail-value", undefined, remote.url))
815
815
  );
816
816
  if (remote.type) {
817
817
  append(
818
818
  packagesGrid,
819
- $(".package-detail", undefined, $(".detail-label", undefined, ( localize(11092, "Transport:"))), $(".detail-value", undefined, remote.type))
819
+ $(".package-detail", undefined, $(".detail-label", undefined, ( localize(11103, "Transport:"))), $(".detail-value", undefined, remote.type))
820
820
  );
821
821
  }
822
822
  if (remote.headers && remote.headers.length > 0) {
823
823
  const headerStrings = ( remote.headers.map(header => `${header.name}: ${header.value ?? ""}`));
824
824
  append(
825
825
  packagesGrid,
826
- $(".package-detail", undefined, $(".detail-label", undefined, ( localize(11085, "Headers:"))), $(".detail-value", undefined, headerStrings.join(", ")))
826
+ $(".package-detail", undefined, $(".detail-label", undefined, ( localize(11096, "Headers:"))), $(".detail-value", undefined, headerStrings.join(", ")))
827
827
  );
828
828
  }
829
829
  }
@@ -902,7 +902,7 @@ let AdditionalDetailsWidget = class AdditionalDetailsWidget extends Disposable {
902
902
  const categoriesContainer = append(container, $(".categories-container.additional-details-element"));
903
903
  append(
904
904
  categoriesContainer,
905
- $(".additional-details-title", undefined, ( localize(11093, "Tags")))
905
+ $(".additional-details-title", undefined, ( localize(11104, "Tags")))
906
906
  );
907
907
  const categoriesElement = append(categoriesContainer, $(".categories"));
908
908
  for (const category of extension.gallery.topics) {
@@ -917,14 +917,14 @@ let AdditionalDetailsWidget = class AdditionalDetailsWidget extends Disposable {
917
917
  const manifest = await this.mcpGalleryManifestService.getMcpGalleryManifest();
918
918
  if (extension.repository) {
919
919
  try {
920
- resources.push([( localize(11094, "Repository")), ThemeIcon.fromId(Codicon.repo.id), ( URI.parse(extension.repository))]);
920
+ resources.push([( localize(11105, "Repository")), ThemeIcon.fromId(Codicon.repo.id), ( URI.parse(extension.repository))]);
921
921
  } catch (error) {}
922
922
  }
923
923
  if (manifest) {
924
924
  const supportUri = getMcpGalleryManifestResourceUri(manifest, McpGalleryResourceType.ContactSupportUri);
925
925
  if (supportUri) {
926
926
  try {
927
- resources.push([( localize(11095, "Contact Support")), ThemeIcon.fromId(Codicon.commentDiscussion.id), ( URI.parse(supportUri))]);
927
+ resources.push([( localize(11106, "Contact Support")), ThemeIcon.fromId(Codicon.commentDiscussion.id), ( URI.parse(supportUri))]);
928
928
  } catch (error) {}
929
929
  }
930
930
  }
@@ -932,7 +932,7 @@ let AdditionalDetailsWidget = class AdditionalDetailsWidget extends Disposable {
932
932
  const extensionResourcesContainer = append(container, $(".resources-container.additional-details-element"));
933
933
  append(
934
934
  extensionResourcesContainer,
935
- $(".additional-details-title", undefined, ( localize(11096, "Resources")))
935
+ $(".additional-details-title", undefined, ( localize(11107, "Resources")))
936
936
  );
937
937
  const resourcesElement = append(extensionResourcesContainer, $(".resources"));
938
938
  for (const [label, icon, uri] of resources) {
@@ -952,20 +952,20 @@ let AdditionalDetailsWidget = class AdditionalDetailsWidget extends Disposable {
952
952
  const installInfoContainer = append(container, $(".more-info-container.additional-details-element"));
953
953
  append(
954
954
  installInfoContainer,
955
- $(".additional-details-title", undefined, ( localize(11097, "Installation")))
955
+ $(".additional-details-title", undefined, ( localize(11108, "Installation")))
956
956
  );
957
957
  const installInfo = append(installInfoContainer, $(".more-info"));
958
958
  append(installInfo, $(
959
959
  ".more-info-entry",
960
960
  undefined,
961
- $("div.more-info-entry-name", undefined, ( localize(11098, "Identifier"))),
961
+ $("div.more-info-entry-name", undefined, ( localize(11109, "Identifier"))),
962
962
  $("code", undefined, extension.name)
963
963
  ));
964
964
  if (extension.version) {
965
965
  append(installInfo, $(
966
966
  ".more-info-entry",
967
967
  undefined,
968
- $("div.more-info-entry-name", undefined, ( localize(11099, "Version"))),
968
+ $("div.more-info-entry-name", undefined, ( localize(11110, "Version"))),
969
969
  $("code", undefined, extension.version)
970
970
  ));
971
971
  }
@@ -975,7 +975,7 @@ let AdditionalDetailsWidget = class AdditionalDetailsWidget extends Disposable {
975
975
  const moreInfoContainer = append(container, $(".more-info-container.additional-details-element"));
976
976
  append(
977
977
  moreInfoContainer,
978
- $(".additional-details-title", undefined, ( localize(11100, "Marketplace")))
978
+ $(".additional-details-title", undefined, ( localize(11111, "Marketplace")))
979
979
  );
980
980
  const moreInfo = append(moreInfoContainer, $(".more-info"));
981
981
  if (gallery) {
@@ -983,14 +983,14 @@ let AdditionalDetailsWidget = class AdditionalDetailsWidget extends Disposable {
983
983
  append(moreInfo, $(
984
984
  ".more-info-entry",
985
985
  undefined,
986
- $("div.more-info-entry-name", undefined, ( localize(11098, "Identifier"))),
986
+ $("div.more-info-entry-name", undefined, ( localize(11109, "Identifier"))),
987
987
  $("code", undefined, extension.name)
988
988
  ));
989
989
  if (gallery.version) {
990
990
  append(moreInfo, $(
991
991
  ".more-info-entry",
992
992
  undefined,
993
- $("div.more-info-entry-name", undefined, ( localize(11099, "Version"))),
993
+ $("div.more-info-entry-name", undefined, ( localize(11110, "Version"))),
994
994
  $("code", undefined, gallery.version)
995
995
  ));
996
996
  }
@@ -999,7 +999,7 @@ let AdditionalDetailsWidget = class AdditionalDetailsWidget extends Disposable {
999
999
  append(moreInfo, $(
1000
1000
  ".more-info-entry",
1001
1001
  undefined,
1002
- $("div.more-info-entry-name", undefined, ( localize(11101, "Last Released"))),
1002
+ $("div.more-info-entry-name", undefined, ( localize(11112, "Last Released"))),
1003
1003
  $("div", {
1004
1004
  "title": ( ( new Date(gallery.lastUpdated)).toString())
1005
1005
  }, fromNow(gallery.lastUpdated, true, true, true))
@@ -1009,7 +1009,7 @@ let AdditionalDetailsWidget = class AdditionalDetailsWidget extends Disposable {
1009
1009
  append(moreInfo, $(
1010
1010
  ".more-info-entry",
1011
1011
  undefined,
1012
- $("div.more-info-entry-name", undefined, ( localize(11102, "Published"))),
1012
+ $("div.more-info-entry-name", undefined, ( localize(11113, "Published"))),
1013
1013
  $("div", {
1014
1014
  "title": ( ( new Date(gallery.publishDate)).toString())
1015
1015
  }, fromNow(gallery.publishDate, true, true, true))
@@ -8,7 +8,7 @@ import { join } from '@codingame/monaco-vscode-api/vscode/vs/base/common/path';
8
8
  import { Codicon } from '@codingame/monaco-vscode-api/vscode/vs/base/common/codicons';
9
9
  import { registerIcon } from '@codingame/monaco-vscode-api/vscode/vs/platform/theme/common/iconRegistry';
10
10
 
11
- const MCPServerEditorIcon = registerIcon("mcp-server-editor-icon", Codicon.mcp, ( localize(11103, "Icon of the MCP Server editor.")));
11
+ const MCPServerEditorIcon = registerIcon("mcp-server-editor-icon", Codicon.mcp, ( localize(11114, "Icon of the MCP Server editor.")));
12
12
  class McpServerEditorInput extends EditorInput {
13
13
  static {
14
14
  this.ID = "workbench.mcpServer.input2";
@@ -33,7 +33,7 @@ class McpServerEditorInput extends EditorInput {
33
33
  return this._mcpServer;
34
34
  }
35
35
  getName() {
36
- return localize(11104, "MCP Server: {0}", this._mcpServer.label);
36
+ return localize(11115, "MCP Server: {0}", this._mcpServer.label);
37
37
  }
38
38
  getIcon() {
39
39
  return MCPServerEditorIcon;
@@ -3,10 +3,10 @@ import { Codicon } from '@codingame/monaco-vscode-api/vscode/vs/base/common/codi
3
3
  import { localize } from '@codingame/monaco-vscode-api/vscode/vs/nls';
4
4
  import { registerIcon } from '@codingame/monaco-vscode-api/vscode/vs/platform/theme/common/iconRegistry';
5
5
 
6
- const mcpServerIcon = registerIcon("mcp-server", Codicon.mcp, ( localize(11105, "Icon used for the MCP server.")));
7
- const mcpServerRemoteIcon = registerIcon("mcp-server-remote", Codicon.remote, ( localize(11106, "Icon to indicate that an MCP server is for the remote user scope.")));
8
- const mcpServerWorkspaceIcon = registerIcon("mcp-server-workspace", Codicon.rootFolder, ( localize(11107, "Icon to indicate that an MCP server is for the workspace scope.")));
9
- const mcpStarredIcon = registerIcon("mcp-server-starred", Codicon.starFull, ( localize(11108, "Icon shown along with the starred status.")));
10
- const mcpLicenseIcon = registerIcon("mcp-server-license", Codicon.law, ( localize(11109, "Icon shown along with the license status.")));
6
+ const mcpServerIcon = registerIcon("mcp-server", Codicon.mcp, ( localize(11116, "Icon used for the MCP server.")));
7
+ const mcpServerRemoteIcon = registerIcon("mcp-server-remote", Codicon.remote, ( localize(11117, "Icon to indicate that an MCP server is for the remote user scope.")));
8
+ const mcpServerWorkspaceIcon = registerIcon("mcp-server-workspace", Codicon.rootFolder, ( localize(11118, "Icon to indicate that an MCP server is for the workspace scope.")));
9
+ const mcpStarredIcon = registerIcon("mcp-server-starred", Codicon.starFull, ( localize(11119, "Icon shown along with the starred status.")));
10
+ const mcpLicenseIcon = registerIcon("mcp-server-license", Codicon.law, ( localize(11120, "Icon shown along with the license status.")));
11
11
 
12
12
  export { mcpLicenseIcon, mcpServerIcon, mcpServerRemoteIcon, mcpServerWorkspaceIcon, mcpStarredIcon };
@@ -17,11 +17,12 @@ import { registerThemingParticipant } from '@codingame/monaco-vscode-api/vscode/
17
17
  import { IThemeService } from '@codingame/monaco-vscode-api/vscode/vs/platform/theme/common/themeService.service';
18
18
  import { isDark } from '@codingame/monaco-vscode-api/vscode/vs/platform/theme/common/theme';
19
19
  import { Emitter } from '@codingame/monaco-vscode-api/vscode/vs/base/common/event';
20
- import { mcpServerIcon, mcpStarredIcon, mcpLicenseIcon, mcpServerRemoteIcon, mcpServerWorkspaceIcon } from './mcpServerIcons.js';
20
+ import { mcpServerIcon, mcpStarredIcon, mcpLicenseIcon, mcpServerWorkspaceIcon, mcpServerRemoteIcon } from './mcpServerIcons.js';
21
21
  import { MarkdownString } from '@codingame/monaco-vscode-api/vscode/vs/base/common/htmlContent';
22
22
  import { ExtensionIconBadge } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/extensions/browser/extensionsWidgets';
23
- import { IInstantiationService } from '@codingame/monaco-vscode-api/vscode/vs/platform/instantiation/common/instantiation';
23
+ import { IConfigurationService } from '@codingame/monaco-vscode-api/vscode/vs/platform/configuration/common/configuration.service';
24
24
  import { LocalMcpServerScope } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/mcp/common/mcpWorkbenchManagementService';
25
+ import { IInstantiationService } from '@codingame/monaco-vscode-api/vscode/vs/platform/instantiation/common/instantiation';
25
26
  import { registerColor } from '@codingame/monaco-vscode-api/vscode/vs/platform/theme/common/colorUtils';
26
27
  import { textLinkForeground } from '@codingame/monaco-vscode-api/vscode/vs/platform/theme/common/colors/baseColors';
27
28
  import '@codingame/monaco-vscode-api/vscode/vs/platform/theme/common/colors/chartsColors';
@@ -166,7 +167,7 @@ let PublisherWidget = class PublisherWidget extends McpServerWidget {
166
167
  this.element.setAttribute("role", "button");
167
168
  this.element.tabIndex = 0;
168
169
  this.containerHover = this.disposables.add(
169
- this.hoverService.setupManagedHover(getDefaultHoverDelegate("mouse"), this.element, ( localize(11110, "Publisher ({0})", this.mcpServer.publisherDisplayName)))
170
+ this.hoverService.setupManagedHover(getDefaultHoverDelegate("mouse"), this.element, ( localize(11121, "Publisher ({0})", this.mcpServer.publisherDisplayName)))
170
171
  );
171
172
  append(this.element, publisherDisplayName);
172
173
  if (this.mcpServer.gallery?.publisherDomain?.verified) {
@@ -175,7 +176,7 @@ let PublisherWidget = class PublisherWidget extends McpServerWidget {
175
176
  verifiedPublisher.tabIndex = 0;
176
177
  verifiedPublisher.setAttribute("role", "button");
177
178
  this.containerHover.update(( localize(
178
- 11111,
179
+ 11122,
179
180
  "This publisher has verified ownership of {0}",
180
181
  this.mcpServer.gallery?.publisherDomain.link
181
182
  )));
@@ -273,6 +274,97 @@ class LicenseWidget extends McpServerWidget {
273
274
  licenseElement.style.paddingLeft = "3px";
274
275
  }
275
276
  }
277
+ let McpServerHoverWidget = class McpServerHoverWidget extends McpServerWidget {
278
+ constructor(options, mcpServerStatusAction, hoverService, configurationService) {
279
+ super();
280
+ this.options = options;
281
+ this.mcpServerStatusAction = mcpServerStatusAction;
282
+ this.hoverService = hoverService;
283
+ this.configurationService = configurationService;
284
+ this.hover = this._register(( new MutableDisposable()));
285
+ }
286
+ render() {
287
+ this.hover.value = undefined;
288
+ if (this.mcpServer) {
289
+ this.hover.value = this.hoverService.setupManagedHover({
290
+ delay: this.configurationService.getValue("workbench.hover.delay"),
291
+ showHover: (options, focus) => {
292
+ return this.hoverService.showInstantHover({
293
+ ...options,
294
+ additionalClasses: ["extension-hover"],
295
+ position: {
296
+ hoverPosition: this.options.position(),
297
+ forcePosition: true
298
+ },
299
+ persistence: {
300
+ hideOnKeyDown: true
301
+ }
302
+ }, focus);
303
+ },
304
+ placement: "element"
305
+ }, this.options.target, {
306
+ markdown: () => Promise.resolve(this.getHoverMarkdown()),
307
+ markdownNotSupportedFallback: undefined
308
+ }, {
309
+ appearance: {
310
+ showHoverHint: true
311
+ }
312
+ });
313
+ }
314
+ }
315
+ getHoverMarkdown() {
316
+ if (!this.mcpServer) {
317
+ return undefined;
318
+ }
319
+ const markdown = ( new MarkdownString("", {
320
+ isTrusted: true,
321
+ supportThemeIcons: true
322
+ }));
323
+ markdown.appendMarkdown(`**${this.mcpServer.label}**`);
324
+ markdown.appendText(`\n`);
325
+ let addSeparator = false;
326
+ if (this.mcpServer.local?.scope === LocalMcpServerScope.Workspace) {
327
+ markdown.appendMarkdown(`$(${mcpServerWorkspaceIcon.id})&nbsp;`);
328
+ markdown.appendMarkdown(( localize(11123, "Workspace MCP Server")));
329
+ addSeparator = true;
330
+ }
331
+ if (this.mcpServer.local?.scope === LocalMcpServerScope.RemoteUser) {
332
+ markdown.appendMarkdown(`$(${mcpServerRemoteIcon.id})&nbsp;`);
333
+ markdown.appendMarkdown(( localize(11124, "Remote MCP Server")));
334
+ addSeparator = true;
335
+ }
336
+ if (this.mcpServer.installState === McpServerInstallState.Installed) {
337
+ if (this.mcpServer.starsCount) {
338
+ if (addSeparator) {
339
+ markdown.appendText(` | `);
340
+ }
341
+ const starsCountLabel = StarredWidget.getCountLabel(this.mcpServer.starsCount);
342
+ markdown.appendMarkdown(`$(${mcpStarredIcon.id}) ${starsCountLabel}`);
343
+ addSeparator = true;
344
+ }
345
+ }
346
+ if (addSeparator) {
347
+ markdown.appendText(`\n`);
348
+ }
349
+ if (this.mcpServer.description) {
350
+ markdown.appendMarkdown(`${this.mcpServer.description}`);
351
+ }
352
+ const extensionStatus = this.mcpServerStatusAction.status;
353
+ if (extensionStatus.length) {
354
+ markdown.appendMarkdown(`---`);
355
+ markdown.appendText(`\n`);
356
+ for (const status of extensionStatus) {
357
+ if (status.icon) {
358
+ markdown.appendMarkdown(`$(${status.icon.id})&nbsp;`);
359
+ }
360
+ markdown.appendMarkdown(status.message.value);
361
+ markdown.appendText(`\n`);
362
+ }
363
+ }
364
+ return markdown;
365
+ }
366
+ };
367
+ McpServerHoverWidget = ( __decorate([( __param(2, IHoverService)), ( __param(3, IConfigurationService))], McpServerHoverWidget));
276
368
  let McpServerScopeBadgeWidget = class McpServerScopeBadgeWidget extends McpServerWidget {
277
369
  constructor(container, instantiationService) {
278
370
  super();
@@ -356,7 +448,7 @@ const mcpStarredIconColor = registerColor("mcpIcon.starForeground", {
356
448
  dark: "#FF8E00",
357
449
  hcDark: "#FF8E00",
358
450
  hcLight: textLinkForeground
359
- }, ( localize(11112, "The icon color for mcp starred.")), false);
451
+ }, ( localize(11125, "The icon color for mcp starred.")), false);
360
452
  registerThemingParticipant((theme, collector) => {
361
453
  const mcpStarredIconColorValue = theme.getColor(mcpStarredIconColor);
362
454
  if (mcpStarredIconColorValue) {
@@ -369,4 +461,4 @@ registerThemingParticipant((theme, collector) => {
369
461
  }
370
462
  });
371
463
 
372
- export { LicenseWidget, McpServerIconWidget, McpServerScopeBadgeWidget, McpServerStatusWidget, McpServerWidget, PublisherWidget, StarredWidget, mcpStarredIconColor, onClick };
464
+ export { LicenseWidget, McpServerHoverWidget, McpServerIconWidget, McpServerScopeBadgeWidget, McpServerStatusWidget, McpServerWidget, PublisherWidget, StarredWidget, mcpStarredIconColor, onClick };
@@ -0,0 +1,59 @@
1
+ import { Disposable } from "@codingame/monaco-vscode-api/vscode/vs/base/common/lifecycle";
2
+ import { IPagedModel } from "@codingame/monaco-vscode-api/vscode/vs/base/common/paging";
3
+ import { IConfigurationService } from "@codingame/monaco-vscode-api/vscode/vs/platform/configuration/common/configuration.service";
4
+ import { IContextKeyService } from "@codingame/monaco-vscode-api/vscode/vs/platform/contextkey/common/contextkey.service";
5
+ import { IContextMenuService } from "@codingame/monaco-vscode-api/vscode/vs/platform/contextview/browser/contextView.service";
6
+ import { IDialogService } from "@codingame/monaco-vscode-api/vscode/vs/platform/dialogs/common/dialogs.service";
7
+ import { IHoverService } from "@codingame/monaco-vscode-api/vscode/vs/platform/hover/browser/hover.service";
8
+ import { IInstantiationService } from "@codingame/monaco-vscode-api/vscode/vs/platform/instantiation/common/instantiation";
9
+ import { IKeybindingService } from "@codingame/monaco-vscode-api/vscode/vs/platform/keybinding/common/keybinding.service";
10
+ import { IOpenerService } from "@codingame/monaco-vscode-api/vscode/vs/platform/opener/common/opener.service";
11
+ import { IThemeService } from "@codingame/monaco-vscode-api/vscode/vs/platform/theme/common/themeService.service";
12
+ import { IViewletViewOptions } from "@codingame/monaco-vscode-api/vscode/vs/workbench/browser/parts/views/viewsViewlet";
13
+ import { IViewDescriptorService } from "@codingame/monaco-vscode-api/vscode/vs/workbench/common/views.service";
14
+ import { IWorkbenchMcpServer } from "@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/mcp/common/mcpTypes";
15
+ import { IMcpWorkbenchService } from "@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/mcp/common/mcpTypes.service";
16
+ import { IWorkbenchContribution } from "@codingame/monaco-vscode-api/vscode/vs/workbench/common/contributions";
17
+ import { AbstractExtensionsListView } from "@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/extensions/browser/extensionsViews";
18
+ import { IWorkbenchLayoutService } from "@codingame/monaco-vscode-api/vscode/vs/workbench/services/layout/browser/layoutService.service";
19
+ import { IMcpGalleryManifestService } from "@codingame/monaco-vscode-api/vscode/vs/platform/mcp/common/mcpGalleryManifest.service";
20
+ import { IMarkdownRendererService } from "@codingame/monaco-vscode-api/vscode/vs/platform/markdown/browser/markdownRenderer.service";
21
+ import { ILogService } from "@codingame/monaco-vscode-api/vscode/vs/platform/log/common/log.service";
22
+ export interface McpServerListViewOptions {
23
+ showWelcome?: boolean;
24
+ }
25
+ export declare class McpServersListView extends AbstractExtensionsListView<IWorkbenchMcpServer> {
26
+ private readonly mpcViewOptions;
27
+ private readonly dialogService;
28
+ private readonly mcpWorkbenchService;
29
+ protected readonly mcpGalleryManifestService: IMcpGalleryManifestService;
30
+ private readonly layoutService;
31
+ protected readonly markdownRendererService: IMarkdownRendererService;
32
+ private readonly logService;
33
+ private list;
34
+ private listContainer;
35
+ private welcomeContainer;
36
+ private bodyTemplate;
37
+ private readonly contextMenuActionRunner;
38
+ private readonly modalNavigationDisposable;
39
+ private input;
40
+ constructor(mpcViewOptions: McpServerListViewOptions, options: IViewletViewOptions, keybindingService: IKeybindingService, contextMenuService: IContextMenuService, instantiationService: IInstantiationService, themeService: IThemeService, hoverService: IHoverService, configurationService: IConfigurationService, contextKeyService: IContextKeyService, viewDescriptorService: IViewDescriptorService, openerService: IOpenerService, dialogService: IDialogService, mcpWorkbenchService: IMcpWorkbenchService, mcpGalleryManifestService: IMcpGalleryManifestService, layoutService: IWorkbenchLayoutService, markdownRendererService: IMarkdownRendererService, logService: ILogService);
41
+ protected renderBody(container: HTMLElement): void;
42
+ private onContextMenu;
43
+ protected layoutBody(height: number, width: number): void;
44
+ show(query: string): Promise<IPagedModel<IWorkbenchMcpServer>>;
45
+ private renderInput;
46
+ private showWelcomeContent;
47
+ private createWelcomeContent;
48
+ private updateBody;
49
+ private query;
50
+ private mergeChangedMcpServers;
51
+ }
52
+ export declare class DefaultBrowseMcpServersView extends McpServersListView {
53
+ protected renderBody(container: HTMLElement): void;
54
+ show(): Promise<IPagedModel<IWorkbenchMcpServer>>;
55
+ }
56
+ export declare class McpServersViewsContribution extends Disposable implements IWorkbenchContribution {
57
+ static ID: string;
58
+ constructor();
59
+ }