@codingame/monaco-vscode-mcp-service-override 21.3.2 → 21.3.3
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.
- package/package.json +15 -15
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcp.contribution.js +3 -3
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpAddContextContribution.js +2 -2
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpCommands.js +54 -54
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpElicitationService.js +17 -17
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpLanguageFeatures.js +18 -18
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpMigration.js +5 -5
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpResourceQuickAccess.js +7 -7
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpServerActions.js +26 -26
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpServerEditor.js +34 -34
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpServerEditorInput.js +2 -2
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpServerIcons.js +4 -4
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpServerWidgets.js +5 -5
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpServersView.js +8 -8
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpWorkbenchService.js +5 -5
- package/vscode/src/vs/workbench/contrib/mcp/common/discovery/extensionMcpDiscovery.js +3 -3
- package/vscode/src/vs/workbench/contrib/mcp/common/discovery/nativeMcpDiscoveryAbstract.js +1 -1
- package/vscode/src/vs/workbench/contrib/mcp/common/mcpContextKeys.js +4 -4
- package/vscode/src/vs/workbench/contrib/mcp/common/mcpLanguageModelToolContribution.js +6 -6
- package/vscode/src/vs/workbench/contrib/mcp/common/mcpRegistry.js +12 -12
- package/vscode/src/vs/workbench/contrib/mcp/common/mcpSamplingLog.js +1 -1
- package/vscode/src/vs/workbench/contrib/mcp/common/mcpSamplingService.js +11 -11
- package/vscode/src/vs/workbench/contrib/mcp/common/mcpServer.js +9 -9
- package/vscode/src/vs/workbench/contrib/mcp/common/mcpServerConnection.js +3 -3
- package/vscode/src/vs/workbench/contrib/mcp/common/mcpService.js +3 -3
- package/vscode/src/vs/workbench/services/authentication/browser/authenticationMcpService.js +9 -9
|
@@ -152,7 +152,7 @@ let McpServerEditor = class McpServerEditor extends EditorPane {
|
|
|
152
152
|
const details = append(header, $('.details'));
|
|
153
153
|
const title = append(details, $('.title'));
|
|
154
154
|
const name = append(title, $('span.name.clickable', { role: 'heading', tabIndex: 0 }));
|
|
155
|
-
this._register(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), name, ( localize(
|
|
155
|
+
this._register(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), name, ( localize(8401, "Extension name"))));
|
|
156
156
|
const subtitle = append(details, $('.subtitle'));
|
|
157
157
|
const subTitleEntryContainers = [];
|
|
158
158
|
const publisherContainer = append(subtitle, $('.subtitle-entry'));
|
|
@@ -272,18 +272,18 @@ let McpServerEditor = class McpServerEditor extends EditorPane {
|
|
|
272
272
|
this.currentIdentifier = extension.id;
|
|
273
273
|
}
|
|
274
274
|
if (extension.readmeUrl || extension.gallery?.readme) {
|
|
275
|
-
template.navbar.push(McpServerEditorTab.Readme, ( localize(
|
|
275
|
+
template.navbar.push(McpServerEditorTab.Readme, ( localize(8402, "Details")), ( localize(8403, "Extension details, rendered from the extension's 'README.md' file")));
|
|
276
276
|
}
|
|
277
277
|
if (extension.gallery || extension.local?.manifest) {
|
|
278
|
-
template.navbar.push(McpServerEditorTab.Manifest, ( localize(
|
|
278
|
+
template.navbar.push(McpServerEditorTab.Manifest, ( localize(8404, "Manifest")), ( localize(8405, "Server manifest details")));
|
|
279
279
|
}
|
|
280
280
|
if (extension.config) {
|
|
281
|
-
template.navbar.push(McpServerEditorTab.Configuration, ( localize(
|
|
281
|
+
template.navbar.push(McpServerEditorTab.Configuration, ( localize(8406, "Configuration")), ( localize(8407, "Server configuration details")));
|
|
282
282
|
}
|
|
283
283
|
this.transientDisposables.add(this.mcpWorkbenchService.onChange(e => {
|
|
284
284
|
if (e === extension) {
|
|
285
285
|
if (e.config && !( template.navbar.has(McpServerEditorTab.Configuration))) {
|
|
286
|
-
template.navbar.push(McpServerEditorTab.Configuration, ( localize(
|
|
286
|
+
template.navbar.push(McpServerEditorTab.Configuration, ( localize(8406, "Configuration")), ( localize(8407, "Server configuration details")), extension.readmeUrl ? 1 : 0);
|
|
287
287
|
}
|
|
288
288
|
if (!e.config && ( template.navbar.has(McpServerEditorTab.Configuration))) {
|
|
289
289
|
template.navbar.remove(McpServerEditorTab.Configuration);
|
|
@@ -482,7 +482,7 @@ let McpServerEditor = class McpServerEditor extends EditorPane {
|
|
|
482
482
|
const layout = () => details.classList.toggle('narrow', this.dimension && this.dimension.width < 500);
|
|
483
483
|
layout();
|
|
484
484
|
this.contentDisposables.add(toDisposable(insert(this.layoutParticipants, { layout })));
|
|
485
|
-
const activeElement = await this.openMarkdown(extension, this.mcpServerReadme.get(), ( localize(
|
|
485
|
+
const activeElement = await this.openMarkdown(extension, this.mcpServerReadme.get(), ( localize(8408, "No README available.")), readmeContainer, WebviewIndex.Readme, ( localize(8409, "Readme")), token);
|
|
486
486
|
this.renderAdditionalDetails(additionalDetailsContainer, extension);
|
|
487
487
|
return activeElement;
|
|
488
488
|
}
|
|
@@ -522,7 +522,7 @@ let McpServerEditor = class McpServerEditor extends EditorPane {
|
|
|
522
522
|
content.removeChild(content.firstChild);
|
|
523
523
|
}
|
|
524
524
|
const noManifestMessage = append(content, $('.no-manifest'));
|
|
525
|
-
noManifestMessage.textContent = ( localize(
|
|
525
|
+
noManifestMessage.textContent = ( localize(8410, "No manifest available for this MCP server."));
|
|
526
526
|
}
|
|
527
527
|
const scrollableContent = ( new DomScrollableElement(content, {}));
|
|
528
528
|
const layout = () => scrollableContent.scanDomNode();
|
|
@@ -535,29 +535,29 @@ let McpServerEditor = class McpServerEditor extends EditorPane {
|
|
|
535
535
|
const config = mcpServer.config;
|
|
536
536
|
if (!config) {
|
|
537
537
|
const noConfigMessage = append(container, $('.no-config'));
|
|
538
|
-
noConfigMessage.textContent = ( localize(
|
|
538
|
+
noConfigMessage.textContent = ( localize(8411, "No configuration available for this MCP server."));
|
|
539
539
|
return;
|
|
540
540
|
}
|
|
541
541
|
const nameSection = append(container, $('.config-section'));
|
|
542
542
|
const nameLabel = append(nameSection, $('.config-label'));
|
|
543
|
-
nameLabel.textContent = ( localize(
|
|
543
|
+
nameLabel.textContent = ( localize(8412, "Name:"));
|
|
544
544
|
const nameValue = append(nameSection, $('.config-value'));
|
|
545
545
|
nameValue.textContent = mcpServer.name;
|
|
546
546
|
const typeSection = append(container, $('.config-section'));
|
|
547
547
|
const typeLabel = append(typeSection, $('.config-label'));
|
|
548
|
-
typeLabel.textContent = ( localize(
|
|
548
|
+
typeLabel.textContent = ( localize(8413, "Type:"));
|
|
549
549
|
const typeValue = append(typeSection, $('.config-value'));
|
|
550
550
|
typeValue.textContent = config.type;
|
|
551
551
|
if (config.type === McpServerType.LOCAL) {
|
|
552
552
|
const commandSection = append(container, $('.config-section'));
|
|
553
553
|
const commandLabel = append(commandSection, $('.config-label'));
|
|
554
|
-
commandLabel.textContent = ( localize(
|
|
554
|
+
commandLabel.textContent = ( localize(8414, "Command:"));
|
|
555
555
|
const commandValue = append(commandSection, $('code.config-value'));
|
|
556
556
|
commandValue.textContent = config.command;
|
|
557
557
|
if (config.args && config.args.length > 0) {
|
|
558
558
|
const argsSection = append(container, $('.config-section'));
|
|
559
559
|
const argsLabel = append(argsSection, $('.config-label'));
|
|
560
|
-
argsLabel.textContent = ( localize(
|
|
560
|
+
argsLabel.textContent = ( localize(8415, "Arguments:"));
|
|
561
561
|
const argsValue = append(argsSection, $('code.config-value'));
|
|
562
562
|
argsValue.textContent = config.args.join(' ');
|
|
563
563
|
}
|
|
@@ -565,7 +565,7 @@ let McpServerEditor = class McpServerEditor extends EditorPane {
|
|
|
565
565
|
else if (config.type === McpServerType.REMOTE) {
|
|
566
566
|
const urlSection = append(container, $('.config-section'));
|
|
567
567
|
const urlLabel = append(urlSection, $('.config-label'));
|
|
568
|
-
urlLabel.textContent = ( localize(
|
|
568
|
+
urlLabel.textContent = ( localize(8416, "URL:"));
|
|
569
569
|
const urlValue = append(urlSection, $('code.config-value'));
|
|
570
570
|
urlValue.textContent = config.url;
|
|
571
571
|
}
|
|
@@ -582,13 +582,13 @@ let McpServerEditor = class McpServerEditor extends EditorPane {
|
|
|
582
582
|
}
|
|
583
583
|
packages.push(pkg);
|
|
584
584
|
}
|
|
585
|
-
append(container, $('.manifest-section', undefined, $('.manifest-section-title', undefined, ( localize(
|
|
585
|
+
append(container, $('.manifest-section', undefined, $('.manifest-section-title', undefined, ( localize(8417, "Packages")))));
|
|
586
586
|
for (const [packageType, packages] of packagesByType) {
|
|
587
587
|
const packageSection = append(container, $('.package-section', undefined, $('.package-section-title', undefined, packageType.toUpperCase())));
|
|
588
588
|
const packagesGrid = append(packageSection, $('.package-details'));
|
|
589
589
|
for (let i = 0; i < packages.length; i++) {
|
|
590
590
|
const pkg = packages[i];
|
|
591
|
-
append(packagesGrid, $('.package-detail', undefined, $('.detail-label', undefined, ( localize(
|
|
591
|
+
append(packagesGrid, $('.package-detail', undefined, $('.detail-label', undefined, ( localize(8418, "Package:"))), $('.detail-value', undefined, pkg.identifier)));
|
|
592
592
|
if (pkg.package_arguments && pkg.package_arguments.length > 0) {
|
|
593
593
|
const argStrings = [];
|
|
594
594
|
for (const arg of pkg.package_arguments) {
|
|
@@ -602,7 +602,7 @@ let McpServerEditor = class McpServerEditor extends EditorPane {
|
|
|
602
602
|
argStrings.push(arg.value ?? arg.value_hint);
|
|
603
603
|
}
|
|
604
604
|
}
|
|
605
|
-
append(packagesGrid, $('.package-detail', undefined, $('.detail-label', undefined, ( localize(
|
|
605
|
+
append(packagesGrid, $('.package-detail', undefined, $('.detail-label', undefined, ( localize(8419, "Package Arguments:"))), $('code.detail-value', undefined, argStrings.join(' '))));
|
|
606
606
|
}
|
|
607
607
|
if (pkg.runtime_arguments && pkg.runtime_arguments.length > 0) {
|
|
608
608
|
const argStrings = [];
|
|
@@ -617,11 +617,11 @@ let McpServerEditor = class McpServerEditor extends EditorPane {
|
|
|
617
617
|
argStrings.push(arg.value ?? arg.value_hint);
|
|
618
618
|
}
|
|
619
619
|
}
|
|
620
|
-
append(packagesGrid, $('.package-detail', undefined, $('.detail-label', undefined, ( localize(
|
|
620
|
+
append(packagesGrid, $('.package-detail', undefined, $('.detail-label', undefined, ( localize(8420, "Runtime Arguments:"))), $('code.detail-value', undefined, argStrings.join(' '))));
|
|
621
621
|
}
|
|
622
622
|
if (pkg.environment_variables && pkg.environment_variables.length > 0) {
|
|
623
623
|
const envStrings = ( pkg.environment_variables.map((envVar) => `${envVar.name}=${envVar.value}`));
|
|
624
|
-
append(packagesGrid, $('.package-detail', undefined, $('.detail-label', undefined, ( localize(
|
|
624
|
+
append(packagesGrid, $('.package-detail', undefined, $('.detail-label', undefined, ( localize(8421, "Environment Variables:"))), $('code.detail-value', undefined, envStrings.join(' '))));
|
|
625
625
|
}
|
|
626
626
|
if (i < packages.length - 1) {
|
|
627
627
|
append(packagesGrid, $('.package-separator'));
|
|
@@ -630,16 +630,16 @@ let McpServerEditor = class McpServerEditor extends EditorPane {
|
|
|
630
630
|
}
|
|
631
631
|
}
|
|
632
632
|
if (manifest.remotes && manifest.remotes.length > 0) {
|
|
633
|
-
const packageSection = append(container, $('.package-section', undefined, $('.package-section-title', undefined, ( localize(
|
|
633
|
+
const packageSection = append(container, $('.package-section', undefined, $('.package-section-title', undefined, ( localize(8422, "Remote")).toLocaleUpperCase())));
|
|
634
634
|
for (const remote of manifest.remotes) {
|
|
635
635
|
const packagesGrid = append(packageSection, $('.package-details'));
|
|
636
|
-
append(packagesGrid, $('.package-detail', undefined, $('.detail-label', undefined, ( localize(
|
|
636
|
+
append(packagesGrid, $('.package-detail', undefined, $('.detail-label', undefined, ( localize(8416, "URL:"))), $('.detail-value', undefined, remote.url)));
|
|
637
637
|
if (remote.transport_type) {
|
|
638
|
-
append(packagesGrid, $('.package-detail', undefined, $('.detail-label', undefined, ( localize(
|
|
638
|
+
append(packagesGrid, $('.package-detail', undefined, $('.detail-label', undefined, ( localize(8423, "Transport:"))), $('.detail-value', undefined, remote.transport_type)));
|
|
639
639
|
}
|
|
640
640
|
if (remote.headers && remote.headers.length > 0) {
|
|
641
641
|
const headerStrings = ( remote.headers.map((header) => `${header.name}: ${header.value}`));
|
|
642
|
-
append(packagesGrid, $('.package-detail', undefined, $('.detail-label', undefined, ( localize(
|
|
642
|
+
append(packagesGrid, $('.package-detail', undefined, $('.detail-label', undefined, ( localize(8424, "Headers:"))), $('.detail-value', undefined, headerStrings.join(', '))));
|
|
643
643
|
}
|
|
644
644
|
}
|
|
645
645
|
}
|
|
@@ -711,7 +711,7 @@ let AdditionalDetailsWidget = class AdditionalDetailsWidget extends Disposable {
|
|
|
711
711
|
renderTopics(container, extension) {
|
|
712
712
|
if (extension.gallery?.topics?.length) {
|
|
713
713
|
const categoriesContainer = append(container, $('.categories-container.additional-details-element'));
|
|
714
|
-
append(categoriesContainer, $('.additional-details-title', undefined, ( localize(
|
|
714
|
+
append(categoriesContainer, $('.additional-details-title', undefined, ( localize(8425, "Categories"))));
|
|
715
715
|
const categoriesElement = append(categoriesContainer, $('.categories'));
|
|
716
716
|
for (const category of extension.gallery.topics) {
|
|
717
717
|
append(categoriesElement, $('span.category', { tabindex: '0' }, category));
|
|
@@ -722,7 +722,7 @@ let AdditionalDetailsWidget = class AdditionalDetailsWidget extends Disposable {
|
|
|
722
722
|
const resources = [];
|
|
723
723
|
if (extension.repository) {
|
|
724
724
|
try {
|
|
725
|
-
resources.push([( localize(
|
|
725
|
+
resources.push([( localize(8426, "Repository")), ( URI.parse(extension.repository))]);
|
|
726
726
|
}
|
|
727
727
|
catch (error) { }
|
|
728
728
|
}
|
|
@@ -731,7 +731,7 @@ let AdditionalDetailsWidget = class AdditionalDetailsWidget extends Disposable {
|
|
|
731
731
|
}
|
|
732
732
|
if (resources.length) {
|
|
733
733
|
const extensionResourcesContainer = append(container, $('.resources-container.additional-details-element'));
|
|
734
|
-
append(extensionResourcesContainer, $('.additional-details-title', undefined, ( localize(
|
|
734
|
+
append(extensionResourcesContainer, $('.additional-details-title', undefined, ( localize(8427, "Resources"))));
|
|
735
735
|
const resourcesElement = append(extensionResourcesContainer, $('.resources'));
|
|
736
736
|
for (const [label, uri] of resources) {
|
|
737
737
|
const resource = append(resourcesElement, $('a.resource', { tabindex: '0' }, label));
|
|
@@ -742,33 +742,33 @@ let AdditionalDetailsWidget = class AdditionalDetailsWidget extends Disposable {
|
|
|
742
742
|
}
|
|
743
743
|
renderInstallInfo(container, extension) {
|
|
744
744
|
const installInfoContainer = append(container, $('.more-info-container.additional-details-element'));
|
|
745
|
-
append(installInfoContainer, $('.additional-details-title', undefined, ( localize(
|
|
745
|
+
append(installInfoContainer, $('.additional-details-title', undefined, ( localize(8428, "Installation"))));
|
|
746
746
|
const installInfo = append(installInfoContainer, $('.more-info'));
|
|
747
|
-
append(installInfo, $('.more-info-entry', undefined, $('div.more-info-entry-name', undefined, ( localize(
|
|
747
|
+
append(installInfo, $('.more-info-entry', undefined, $('div.more-info-entry-name', undefined, ( localize(8429, "Identifier"))), $('code', undefined, extension.name)));
|
|
748
748
|
if (extension.version) {
|
|
749
|
-
append(installInfo, $('.more-info-entry', undefined, $('div.more-info-entry-name', undefined, ( localize(
|
|
749
|
+
append(installInfo, $('.more-info-entry', undefined, $('div.more-info-entry-name', undefined, ( localize(8430, "Version"))), $('code', undefined, extension.version)));
|
|
750
750
|
}
|
|
751
751
|
}
|
|
752
752
|
renderMarketplaceInfo(container, extension) {
|
|
753
753
|
const gallery = extension.gallery;
|
|
754
754
|
const moreInfoContainer = append(container, $('.more-info-container.additional-details-element'));
|
|
755
|
-
append(moreInfoContainer, $('.additional-details-title', undefined, ( localize(
|
|
755
|
+
append(moreInfoContainer, $('.additional-details-title', undefined, ( localize(8431, "Marketplace"))));
|
|
756
756
|
const moreInfo = append(moreInfoContainer, $('.more-info'));
|
|
757
757
|
if (gallery) {
|
|
758
758
|
if (!extension.local) {
|
|
759
|
-
append(moreInfo, $('.more-info-entry', undefined, $('div.more-info-entry-name', undefined, ( localize(
|
|
759
|
+
append(moreInfo, $('.more-info-entry', undefined, $('div.more-info-entry-name', undefined, ( localize(8429, "Identifier"))), $('code', undefined, extension.name)));
|
|
760
760
|
if (gallery.version) {
|
|
761
|
-
append(moreInfo, $('.more-info-entry', undefined, $('div.more-info-entry-name', undefined, ( localize(
|
|
761
|
+
append(moreInfo, $('.more-info-entry', undefined, $('div.more-info-entry-name', undefined, ( localize(8430, "Version"))), $('code', undefined, gallery.version)));
|
|
762
762
|
}
|
|
763
763
|
}
|
|
764
764
|
if (gallery.publishDate) {
|
|
765
|
-
append(moreInfo, $('.more-info-entry', undefined, $('div.more-info-entry-name', undefined, ( localize(
|
|
765
|
+
append(moreInfo, $('.more-info-entry', undefined, $('div.more-info-entry-name', undefined, ( localize(8432, "Published"))), $('div', undefined, toDateString(( new Date(gallery.publishDate))))));
|
|
766
766
|
}
|
|
767
767
|
if (gallery.releaseDate) {
|
|
768
|
-
append(moreInfo, $('.more-info-entry', undefined, $('div.more-info-entry-name', undefined, ( localize(
|
|
768
|
+
append(moreInfo, $('.more-info-entry', undefined, $('div.more-info-entry-name', undefined, ( localize(8433, "Released"))), $('div', undefined, toDateString(( new Date(gallery.releaseDate))))));
|
|
769
769
|
}
|
|
770
770
|
if (gallery.lastUpdated) {
|
|
771
|
-
append(moreInfo, $('.more-info-entry', undefined, $('div.more-info-entry-name', undefined, ( localize(
|
|
771
|
+
append(moreInfo, $('.more-info-entry', undefined, $('div.more-info-entry-name', undefined, ( localize(8434, "Last Released"))), $('div', undefined, toDateString(( new Date(gallery.lastUpdated))))));
|
|
772
772
|
}
|
|
773
773
|
}
|
|
774
774
|
}
|
|
@@ -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(
|
|
11
|
+
const MCPServerEditorIcon = registerIcon('mcp-server-editor-icon', Codicon.mcp, ( localize(8435, 'Icon of the MCP Server editor.')));
|
|
12
12
|
class McpServerEditorInput extends EditorInput {
|
|
13
13
|
static { this.ID = 'workbench.mcpServer.input2'; }
|
|
14
14
|
get typeId() {
|
|
@@ -29,7 +29,7 @@ class McpServerEditorInput extends EditorInput {
|
|
|
29
29
|
}
|
|
30
30
|
get mcpServer() { return this._mcpServer; }
|
|
31
31
|
getName() {
|
|
32
|
-
return localize(
|
|
32
|
+
return localize(8436, "MCP Server: {0}", this._mcpServer.label);
|
|
33
33
|
}
|
|
34
34
|
getIcon() {
|
|
35
35
|
return MCPServerEditorIcon;
|
|
@@ -3,9 +3,9 @@ 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(
|
|
7
|
-
const mcpServerRemoteIcon = registerIcon('mcp-server-remote', Codicon.remote, ( localize(
|
|
8
|
-
const mcpServerWorkspaceIcon = registerIcon('mcp-server-workspace', Codicon.rootFolder, ( localize(
|
|
9
|
-
const mcpStarredIcon = registerIcon('mcp-server-starred', Codicon.starFull, ( localize(
|
|
6
|
+
const mcpServerIcon = registerIcon('mcp-server', Codicon.mcp, ( localize(8437, 'Icon used for the MCP server.')));
|
|
7
|
+
const mcpServerRemoteIcon = registerIcon('mcp-server-remote', Codicon.remote, ( localize(8438, 'Icon to indicate that an MCP server is for the remote user scope.')));
|
|
8
|
+
const mcpServerWorkspaceIcon = registerIcon('mcp-server-workspace', Codicon.rootFolder, ( localize(8439, 'Icon to indicate that an MCP server is for the workspace scope.')));
|
|
9
|
+
const mcpStarredIcon = registerIcon('mcp-server-starred', Codicon.starFull, ( localize(8440, 'Icon shown along with the starred status.')));
|
|
10
10
|
|
|
11
11
|
export { mcpServerIcon, mcpServerRemoteIcon, mcpServerWorkspaceIcon, mcpStarredIcon };
|
|
@@ -153,7 +153,7 @@ let PublisherWidget = class PublisherWidget extends McpServerWidget {
|
|
|
153
153
|
else {
|
|
154
154
|
this.element.setAttribute('role', 'button');
|
|
155
155
|
this.element.tabIndex = 0;
|
|
156
|
-
this.containerHover = this.disposables.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), this.element, ( localize(
|
|
156
|
+
this.containerHover = this.disposables.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), this.element, ( localize(8441, "Publisher ({0})", this.mcpServer.publisherDisplayName))));
|
|
157
157
|
append(this.element, publisherDisplayName);
|
|
158
158
|
if (this.mcpServer.gallery?.publisherDomain?.verified) {
|
|
159
159
|
append(this.element, verifiedPublisher);
|
|
@@ -161,7 +161,7 @@ let PublisherWidget = class PublisherWidget extends McpServerWidget {
|
|
|
161
161
|
verifiedPublisher.tabIndex = 0;
|
|
162
162
|
verifiedPublisher.setAttribute('role', 'button');
|
|
163
163
|
this.containerHover.update(( localize(
|
|
164
|
-
|
|
164
|
+
8442,
|
|
165
165
|
"This publisher has verified ownership of {0}",
|
|
166
166
|
this.mcpServer.gallery?.publisherDomain.link
|
|
167
167
|
)));
|
|
@@ -268,12 +268,12 @@ let McpServerHoverWidget = class McpServerHoverWidget extends McpServerWidget {
|
|
|
268
268
|
let addSeparator = false;
|
|
269
269
|
if (this.mcpServer.local?.scope === LocalMcpServerScope.Workspace) {
|
|
270
270
|
markdown.appendMarkdown(`$(${mcpServerWorkspaceIcon.id}) `);
|
|
271
|
-
markdown.appendMarkdown(( localize(
|
|
271
|
+
markdown.appendMarkdown(( localize(8443, "Workspace MCP Server")));
|
|
272
272
|
addSeparator = true;
|
|
273
273
|
}
|
|
274
274
|
if (this.mcpServer.local?.scope === LocalMcpServerScope.RemoteUser) {
|
|
275
275
|
markdown.appendMarkdown(`$(${mcpServerRemoteIcon.id}) `);
|
|
276
|
-
markdown.appendMarkdown(( localize(
|
|
276
|
+
markdown.appendMarkdown(( localize(8444, "Remote MCP Server")));
|
|
277
277
|
addSeparator = true;
|
|
278
278
|
}
|
|
279
279
|
if (this.mcpServer.installState === McpServerInstallState.Installed) {
|
|
@@ -392,7 +392,7 @@ let McpServerStatusWidget = class McpServerStatusWidget extends McpServerWidget
|
|
|
392
392
|
McpServerStatusWidget = ( __decorate([
|
|
393
393
|
( __param(2, IOpenerService))
|
|
394
394
|
], McpServerStatusWidget));
|
|
395
|
-
const mcpStarredIconColor = registerColor('mcpIcon.starForeground', { light: '#DF6100', dark: '#FF8E00', hcDark: '#FF8E00', hcLight: textLinkForeground }, ( localize(
|
|
395
|
+
const mcpStarredIconColor = registerColor('mcpIcon.starForeground', { light: '#DF6100', dark: '#FF8E00', hcDark: '#FF8E00', hcLight: textLinkForeground }, ( localize(8445, "The icon color for mcp starred.")), false);
|
|
396
396
|
registerThemingParticipant((theme, collector) => {
|
|
397
397
|
const mcpStarredIconColorValue = theme.getColor(mcpStarredIconColor);
|
|
398
398
|
if (mcpStarredIconColorValue) {
|
|
@@ -93,7 +93,7 @@ let McpServersListView = class McpServersListView extends AbstractExtensionsList
|
|
|
93
93
|
return mcpServer?.label ?? '';
|
|
94
94
|
},
|
|
95
95
|
getWidgetAriaLabel() {
|
|
96
|
-
return localize(
|
|
96
|
+
return localize(8446, "MCP Servers");
|
|
97
97
|
}
|
|
98
98
|
},
|
|
99
99
|
overrideStyles: getLocationBasedViewColors(this.viewDescriptorService.getViewLocationById(this.id)).listOverrideStyles,
|
|
@@ -180,10 +180,10 @@ let McpServersListView = class McpServersListView extends AbstractExtensionsList
|
|
|
180
180
|
const iconElement = append(iconContainer, $('span'));
|
|
181
181
|
iconElement.className = ThemeIcon.asClassName(mcpServerIcon);
|
|
182
182
|
const title = append(welcomeContent, $('.mcp-welcome-title'));
|
|
183
|
-
title.textContent = ( localize(
|
|
183
|
+
title.textContent = ( localize(8447, "MCP Servers"));
|
|
184
184
|
const description = append(welcomeContent, $('.mcp-welcome-description'));
|
|
185
185
|
const markdownResult = this._register(renderMarkdown(( new MarkdownString(( localize(
|
|
186
|
-
|
|
186
|
+
8448,
|
|
187
187
|
"Extend agent mode by installing MCP servers to bring extra tools for connecting to databases, invoking APIs and performing specialized tasks."
|
|
188
188
|
)), { isTrusted: true })), {
|
|
189
189
|
actionHandler: (content) => {
|
|
@@ -193,10 +193,10 @@ let McpServersListView = class McpServersListView extends AbstractExtensionsList
|
|
|
193
193
|
description.appendChild(markdownResult.element);
|
|
194
194
|
const buttonContainer = append(welcomeContent, $('.mcp-welcome-button-container'));
|
|
195
195
|
const button = this._register(( new Button(buttonContainer, {
|
|
196
|
-
title: ( localize(
|
|
196
|
+
title: ( localize(8449, "Browse MCP Servers")),
|
|
197
197
|
...defaultButtonStyles
|
|
198
198
|
})));
|
|
199
|
-
button.label = ( localize(
|
|
199
|
+
button.label = ( localize(8449, "Browse MCP Servers"));
|
|
200
200
|
this._register(button.onDidClick(() => this.openerService.open(( URI.parse(
|
|
201
201
|
this.productService.quality === 'insider' ? 'https://code.visualstudio.com/insider/mcp' : 'https://code.visualstudio.com/mcp'
|
|
202
202
|
)))));
|
|
@@ -371,7 +371,7 @@ class McpServersViewsContribution extends Disposable {
|
|
|
371
371
|
( Registry.as(Extensions.ViewsRegistry)).registerViews([
|
|
372
372
|
{
|
|
373
373
|
id: InstalledMcpServersViewId,
|
|
374
|
-
name: ( localize2(
|
|
374
|
+
name: ( localize2(8450, "MCP Servers - Installed")),
|
|
375
375
|
ctorDescriptor: ( new SyncDescriptor(McpServersListView, [{ showWelcomeOnEmpty: false }])),
|
|
376
376
|
when: ( ContextKeyExpr.and(DefaultViewsContext, HasInstalledMcpServersContext)),
|
|
377
377
|
weight: 40,
|
|
@@ -380,7 +380,7 @@ class McpServersViewsContribution extends Disposable {
|
|
|
380
380
|
},
|
|
381
381
|
{
|
|
382
382
|
id: 'workbench.views.mcp.default.marketplace',
|
|
383
|
-
name: ( localize2(
|
|
383
|
+
name: ( localize2(8451, "MCP Servers")),
|
|
384
384
|
ctorDescriptor: ( new SyncDescriptor(DefaultBrowseMcpServersView, [{ showWelcomeOnEmpty: true }])),
|
|
385
385
|
when: ( ContextKeyExpr.and(DefaultViewsContext, ( HasInstalledMcpServersContext.toNegated()), ( ChatContextKeys.Setup.hidden.negate()))),
|
|
386
386
|
weight: 40,
|
|
@@ -389,7 +389,7 @@ class McpServersViewsContribution extends Disposable {
|
|
|
389
389
|
},
|
|
390
390
|
{
|
|
391
391
|
id: 'workbench.views.mcp.marketplace',
|
|
392
|
-
name: ( localize2(
|
|
392
|
+
name: ( localize2(8451, "MCP Servers")),
|
|
393
393
|
ctorDescriptor: ( new SyncDescriptor(McpServersListView, [{ showWelcomeOnEmpty: true }])),
|
|
394
394
|
when: ( ContextKeyExpr.and(SearchMcpServersContext)),
|
|
395
395
|
}
|
|
@@ -352,7 +352,7 @@ let McpWorkbenchService = class McpWorkbenchService extends Disposable {
|
|
|
352
352
|
const existing = result.get(server.name);
|
|
353
353
|
if (existing) {
|
|
354
354
|
this.logService.warn(( localize(
|
|
355
|
-
|
|
355
|
+
8452,
|
|
356
356
|
"Overwriting mcp server '{0}' from {1} with {2}.",
|
|
357
357
|
server.name,
|
|
358
358
|
server.mcpResource.path,
|
|
@@ -365,7 +365,7 @@ let McpWorkbenchService = class McpWorkbenchService extends Disposable {
|
|
|
365
365
|
const existing = result.get(server.name);
|
|
366
366
|
if (existing) {
|
|
367
367
|
this.logService.warn(( localize(
|
|
368
|
-
|
|
368
|
+
8452,
|
|
369
369
|
"Overwriting mcp server '{0}' from {1} with {2}.",
|
|
370
370
|
server.name,
|
|
371
371
|
server.mcpResource.path,
|
|
@@ -378,7 +378,7 @@ let McpWorkbenchService = class McpWorkbenchService extends Disposable {
|
|
|
378
378
|
}
|
|
379
379
|
canInstall(mcpServer) {
|
|
380
380
|
if (!(mcpServer instanceof McpWorkbenchServer)) {
|
|
381
|
-
return ( new MarkdownString()).appendText(( localize(
|
|
381
|
+
return ( new MarkdownString()).appendText(( localize(8453, "The provided object is not an mcp server.")));
|
|
382
382
|
}
|
|
383
383
|
if (mcpServer.gallery) {
|
|
384
384
|
const result = this.mcpManagementService.canInstall(mcpServer.gallery);
|
|
@@ -395,7 +395,7 @@ let McpWorkbenchService = class McpWorkbenchService extends Disposable {
|
|
|
395
395
|
return result;
|
|
396
396
|
}
|
|
397
397
|
return ( new MarkdownString()).appendText(( localize(
|
|
398
|
-
|
|
398
|
+
8454,
|
|
399
399
|
"Cannot install the '{0}' MCP Server because it is not available in this setup.",
|
|
400
400
|
mcpServer.label
|
|
401
401
|
)));
|
|
@@ -492,7 +492,7 @@ let McpWorkbenchService = class McpWorkbenchService extends Disposable {
|
|
|
492
492
|
id: USER_CONFIG_ID,
|
|
493
493
|
key: 'userLocalValue',
|
|
494
494
|
target: ConfigurationTarget.USER_LOCAL,
|
|
495
|
-
label: ( localize(
|
|
495
|
+
label: ( localize(8455, 'Global in {0}', this.productService.nameShort)),
|
|
496
496
|
scope: StorageScope.PROFILE,
|
|
497
497
|
order: McpCollectionSortOrder.User,
|
|
498
498
|
uri: mcpResource,
|
|
@@ -99,16 +99,16 @@ let ExtensionMcpDiscovery = ExtensionMcpDiscovery_1 = class ExtensionMcpDiscover
|
|
|
99
99
|
}
|
|
100
100
|
static _validate(user) {
|
|
101
101
|
if (!Array.isArray(user.value)) {
|
|
102
|
-
user.collector.error(( localize(
|
|
102
|
+
user.collector.error(( localize(8456, "Expected an array of MCP collections")));
|
|
103
103
|
return false;
|
|
104
104
|
}
|
|
105
105
|
for (const contribution of user.value) {
|
|
106
106
|
if (typeof contribution.id !== 'string' || isFalsyOrWhitespace(contribution.id)) {
|
|
107
|
-
user.collector.error(( localize(
|
|
107
|
+
user.collector.error(( localize(8457, "Expected 'id' to be a non-empty string.")));
|
|
108
108
|
return false;
|
|
109
109
|
}
|
|
110
110
|
if (typeof contribution.label !== 'string' || isFalsyOrWhitespace(contribution.label)) {
|
|
111
|
-
user.collector.error(( localize(
|
|
111
|
+
user.collector.error(( localize(8458, "Expected 'label' to be a non-empty string.")));
|
|
112
112
|
return false;
|
|
113
113
|
}
|
|
114
114
|
}
|
|
@@ -83,7 +83,7 @@ let NativeFilesystemMcpDiscovery = class NativeFilesystemMcpDiscovery extends Fi
|
|
|
83
83
|
this.suffix = '';
|
|
84
84
|
if (remoteAuthority) {
|
|
85
85
|
this.suffix = ' ' + ( localize(
|
|
86
|
-
|
|
86
|
+
8459,
|
|
87
87
|
' on {0}',
|
|
88
88
|
labelService.getHostLabel(Schemas.vscodeRemote, remoteAuthority)
|
|
89
89
|
));
|
|
@@ -15,19 +15,19 @@ var McpContextKeys;
|
|
|
15
15
|
McpContextKeys.serverCount = ( new RawContextKey(
|
|
16
16
|
'mcp.serverCount',
|
|
17
17
|
undefined,
|
|
18
|
-
{ type: 'number', description: ( localize(
|
|
18
|
+
{ type: 'number', description: ( localize(8490, "Context key that has the number of registered MCP servers")) }
|
|
19
19
|
));
|
|
20
20
|
McpContextKeys.hasUnknownTools = ( new RawContextKey(
|
|
21
21
|
'mcp.hasUnknownTools',
|
|
22
22
|
undefined,
|
|
23
|
-
{ type: 'boolean', description: ( localize(
|
|
23
|
+
{ type: 'boolean', description: ( localize(8491, "Indicates whether there are MCP servers with unknown tools.")) }
|
|
24
24
|
));
|
|
25
25
|
McpContextKeys.hasServersWithErrors = ( new RawContextKey(
|
|
26
26
|
'mcp.hasServersWithErrors',
|
|
27
27
|
undefined,
|
|
28
|
-
{ type: 'boolean', description: ( localize(
|
|
28
|
+
{ type: 'boolean', description: ( localize(8492, "Indicates whether there are any MCP servers with errors.")) }
|
|
29
29
|
));
|
|
30
|
-
McpContextKeys.toolsCount = ( new RawContextKey('mcp.toolsCount', undefined, { type: 'number', description: ( localize(
|
|
30
|
+
McpContextKeys.toolsCount = ( new RawContextKey('mcp.toolsCount', undefined, { type: 'number', description: ( localize(8493, "Context key that has the number of registered MCP tools")) }));
|
|
31
31
|
})(McpContextKeys || (McpContextKeys = {}));
|
|
32
32
|
let McpContextKeysController = class McpContextKeysController extends Disposable {
|
|
33
33
|
static { this.ID = 'workbench.contrib.mcp.contextKey'; }
|
|
@@ -50,7 +50,7 @@ let McpLanguageModelToolContribution = class McpLanguageModelToolContribution ex
|
|
|
50
50
|
const source = mcpServerToSourceData(server);
|
|
51
51
|
const toolSet = store.add(this._toolsService.createToolSet(source, server.definition.id, server.definition.label, {
|
|
52
52
|
icon: Codicon.mcp,
|
|
53
|
-
description: ( localize(
|
|
53
|
+
description: ( localize(8494, "{0}: All Tools", server.definition.label))
|
|
54
54
|
}));
|
|
55
55
|
return { toolSet, source };
|
|
56
56
|
}));
|
|
@@ -154,7 +154,7 @@ let McpToolImplementation = class McpToolImplementation {
|
|
|
154
154
|
const tool = this._tool;
|
|
155
155
|
const server = this._server;
|
|
156
156
|
const mcpToolWarning = ( localize(
|
|
157
|
-
|
|
157
|
+
8495,
|
|
158
158
|
"Note that MCP servers or malicious conversation content may attempt to misuse '{0}' through tools.",
|
|
159
159
|
this._productService.nameShort
|
|
160
160
|
));
|
|
@@ -162,14 +162,14 @@ let McpToolImplementation = class McpToolImplementation {
|
|
|
162
162
|
const title = tool.definition.annotations?.title || tool.definition.title || ('`' + tool.definition.name + '`');
|
|
163
163
|
return {
|
|
164
164
|
confirmationMessages: needsConfirmation ? {
|
|
165
|
-
title: ( new MarkdownString(( localize(
|
|
165
|
+
title: ( new MarkdownString(( localize(8496, "Run {0}", title)))),
|
|
166
166
|
message: ( new MarkdownString(tool.definition.description, { supportThemeIcons: true })),
|
|
167
167
|
disclaimer: mcpToolWarning,
|
|
168
168
|
allowAutoConfirm: true,
|
|
169
169
|
} : undefined,
|
|
170
|
-
invocationMessage: ( new MarkdownString(( localize(
|
|
171
|
-
pastTenseMessage: ( new MarkdownString(( localize(
|
|
172
|
-
originMessage: ( localize(
|
|
170
|
+
invocationMessage: ( new MarkdownString(( localize(8497, "Running {0}", title)))),
|
|
171
|
+
pastTenseMessage: ( new MarkdownString(( localize(8498, "Ran {0} ", title)))),
|
|
172
|
+
originMessage: ( localize(8499, "{0} (MCP Server)", server.definition.label)),
|
|
173
173
|
toolSpecificData: {
|
|
174
174
|
kind: 'input',
|
|
175
175
|
rawInput: context.parameters
|
|
@@ -245,7 +245,7 @@ let McpRegistry = class McpRegistry extends Disposable {
|
|
|
245
245
|
const originURI = r.definition.presentation?.origin?.uri || r.collection.presentation?.origin;
|
|
246
246
|
let labelWithOrigin = originURI ? `[\`${r.definition.label}\`](${originURI})` : '`' + r.definition.label + '`';
|
|
247
247
|
if (r.collection.source instanceof ExtensionIdentifier) {
|
|
248
|
-
labelWithOrigin += ` (${( localize(
|
|
248
|
+
labelWithOrigin += ` (${( localize(8500, 'from {0}', r.collection.source.value))})`;
|
|
249
249
|
}
|
|
250
250
|
return labelWithOrigin;
|
|
251
251
|
}
|
|
@@ -253,12 +253,12 @@ let McpRegistry = class McpRegistry extends Disposable {
|
|
|
253
253
|
const def = definitions[0];
|
|
254
254
|
const originURI = def.definition.presentation?.origin?.uri;
|
|
255
255
|
const { result } = await this._dialogService.prompt({
|
|
256
|
-
message: ( localize(
|
|
256
|
+
message: ( localize(8501, 'Trust and run MCP server {0}?', def.definition.label)),
|
|
257
257
|
custom: {
|
|
258
258
|
icon: Codicon.shield,
|
|
259
259
|
markdownDetails: [{
|
|
260
260
|
markdown: ( new MarkdownString(( localize(
|
|
261
|
-
|
|
261
|
+
8502,
|
|
262
262
|
'The MCP server {0} was updated. MCP servers may add context to your chat session and lead to unexpected behavior. Do you want to trust and run this server?',
|
|
263
263
|
labelFor(def)
|
|
264
264
|
)))),
|
|
@@ -269,20 +269,20 @@ let McpRegistry = class McpRegistry extends Disposable {
|
|
|
269
269
|
}]
|
|
270
270
|
},
|
|
271
271
|
buttons: [
|
|
272
|
-
{ label: ( localize(
|
|
273
|
-
{ label: ( localize(
|
|
272
|
+
{ label: ( localize(8503, 'Trust')), run: () => true },
|
|
273
|
+
{ label: ( localize(8504, 'Do not trust')), run: () => false }
|
|
274
274
|
],
|
|
275
275
|
});
|
|
276
276
|
return result === undefined ? undefined : (result ? [def.definition.id] : []);
|
|
277
277
|
}
|
|
278
278
|
const list = ( definitions.map(d => `- ${labelFor(d)}`)).join('\n');
|
|
279
279
|
const { result } = await this._dialogService.prompt({
|
|
280
|
-
message: ( localize(
|
|
280
|
+
message: ( localize(8505, 'Trust and run {0} MCP servers?', definitions.length)),
|
|
281
281
|
custom: {
|
|
282
282
|
icon: Codicon.shield,
|
|
283
283
|
markdownDetails: [{
|
|
284
284
|
markdown: ( new MarkdownString(( localize(
|
|
285
|
-
|
|
285
|
+
8506,
|
|
286
286
|
'Several updated MCP servers were discovered:\n\n{0}\n\n MCP servers may add context to your chat session and lead to unexpected behavior. Do you want to trust and run these server?',
|
|
287
287
|
list
|
|
288
288
|
)))),
|
|
@@ -293,9 +293,9 @@ let McpRegistry = class McpRegistry extends Disposable {
|
|
|
293
293
|
}]
|
|
294
294
|
},
|
|
295
295
|
buttons: [
|
|
296
|
-
{ label: ( localize(
|
|
297
|
-
{ label: ( localize(
|
|
298
|
-
{ label: ( localize(
|
|
296
|
+
{ label: ( localize(8503, 'Trust')), run: () => 'all' },
|
|
297
|
+
{ label: ( localize(8507, 'Pick Trusted')), run: () => 'pick' },
|
|
298
|
+
{ label: ( localize(8504, 'Do not trust')), run: () => 'none' },
|
|
299
299
|
],
|
|
300
300
|
});
|
|
301
301
|
if (result === undefined) {
|
|
@@ -422,7 +422,7 @@ let McpRegistry = class McpRegistry extends Disposable {
|
|
|
422
422
|
catch (e) {
|
|
423
423
|
this._notificationService.notify({
|
|
424
424
|
severity: Severity.Error,
|
|
425
|
-
message: ( localize(
|
|
425
|
+
message: ( localize(8508, 'Error starting {0}: {1}', definition.label, String(e))),
|
|
426
426
|
actions: {
|
|
427
427
|
primary: collection.presentation?.origin && [
|
|
428
428
|
{
|
|
@@ -430,7 +430,7 @@ let McpRegistry = class McpRegistry extends Disposable {
|
|
|
430
430
|
class: undefined,
|
|
431
431
|
enabled: true,
|
|
432
432
|
tooltip: '',
|
|
433
|
-
label: ( localize(
|
|
433
|
+
label: ( localize(8509, 'Open Configuration')),
|
|
434
434
|
run: () => this._editorService.openEditor({
|
|
435
435
|
resource: collection.presentation.origin,
|
|
436
436
|
options: { selection: definition.presentation?.origin?.range }
|
|
@@ -41,7 +41,7 @@ let McpSamplingLog = class McpSamplingLog extends Disposable {
|
|
|
41
41
|
}
|
|
42
42
|
const parts = [];
|
|
43
43
|
const total = record.bins.reduce((sum, value) => sum + value, 0);
|
|
44
|
-
parts.push(( localize(
|
|
44
|
+
parts.push(( localize(8510, '{0} total requests in the last 7 days.', total)));
|
|
45
45
|
parts.push(this._formatRecentRequests(record));
|
|
46
46
|
return parts.join('\n');
|
|
47
47
|
}
|