Skip to content

Commit 70d3c0a

Browse files
fix: address code review feedback for ToolPipe MCP Server integration
- Fix MCP API types: use vscode.McpHttpServerDefinition and vscode.McpStdioServerDefinition - Remove unused dead code (promptConfigureToolPipe function) - Implement dynamic Markdown fence escaping to prevent backtick-related breakage - Replace ephemeral tunnel URLs with example placeholders - Change default remoteUrl to empty string with user guidance - Add extension to build compilation list (gulpfile.extensions.ts) - Update tsconfig.json with skipLibCheck and proper glob pattern - Update engine requirement to ^1.97.0 when MCP APIs were introduced - Remove trailing whitespace
1 parent 18d968d commit 70d3c0a

7 files changed

Lines changed: 56 additions & 110 deletions

File tree

build/gulpfile.extensions.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ const compilations = [
8585
'extensions/references-view/tsconfig.json',
8686
'extensions/search-result/tsconfig.json',
8787
'extensions/simple-browser/tsconfig.json',
88+
'extensions/toolpipe-mcp-server/tsconfig.json',
8889
'extensions/tunnel-forwarding/tsconfig.json',
8990
'extensions/typescript-language-features/web/tsconfig.json',
9091
'extensions/typescript-language-features/tsconfig.json',

extensions/toolpipe-mcp-server/README.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,18 +52,20 @@ ToolPipe MCP Server provides comprehensive developer tools organized into five c
5252

5353
## Configuration
5454

55-
### Quick Start (Remote Mode - Recommended)
55+
### Quick Start (Remote Mode)
5656

57-
By default, ToolPipe uses the **remote cloud-hosted server** which requires no additional setup:
57+
To use ToolPipe with a remote server, configure the URL of your MCP server:
5858

5959
```json
6060
{
6161
"toolpipeMcpServer.enabled": true,
6262
"toolpipeMcpServer.mode": "remote",
63-
"toolpipeMcpServer.remoteUrl": "https://troops-submission-what-stays.trycloudflare.com/mcp"
63+
"toolpipeMcpServer.remoteUrl": "https://example.com/mcp"
6464
}
6565
```
6666

67+
Replace `https://example.com/mcp` with your actual ToolPipe server URL.
68+
6769
### Advanced Configuration
6870

6971
#### Using Local Server

extensions/toolpipe-mcp-server/package.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
"version": "1.0.0",
66
"publisher": "vscode",
77
"license": "MIT",
8-
"engines": {
9-
"vscode": "^1.96.0"
10-
},
8+
"engines": {
9+
"vscode": "^1.97.0"
10+
},
1111
"categories": [
1212
"Other",
1313
"Developer Tools"
@@ -57,11 +57,11 @@
5757
"default": "remote",
5858
"description": "ToolPipe connection mode: 'remote' for cloud-hosted server, 'local' for npm-based server"
5959
},
60-
"toolpipeMcpServer.remoteUrl": {
61-
"type": "string",
62-
"default": "https://troops-submission-what-stays.trycloudflare.com/mcp",
63-
"description": "Remote URL for ToolPipe MCP Server (HTTP endpoint)"
64-
},
60+
"toolpipeMcpServer.remoteUrl": {
61+
"type": "string",
62+
"default": "",
63+
"description": "Remote URL for ToolPipe MCP Server (HTTPS endpoint). Provide your own server URL, for example: https://example.com/mcp"
64+
},
6565
"toolpipeMcpServer.localCommand": {
6666
"type": "string",
6767
"default": "npx",

extensions/toolpipe-mcp-server/src/extension.ts

Lines changed: 21 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import * as vscode from 'vscode';
77

88
/**
99
* ToolPipe MCP Server Extension
10-
*
10+
*
1111
* Provides integration with ToolPipe MCP Server, which offers 120+ developer utilities:
1212
* - Code tools: Review, minification, formatting (JS/TS/Python/SQL/CSS/HTML)
1313
* - Data tools: JSON/CSV/XML/YAML conversion, Base64, UUID generation
@@ -16,9 +16,6 @@ import * as vscode from 'vscode';
1616
* - DevOps: Docker Compose generation, GitHub Actions workflows, Nginx configs
1717
*/
1818

19-
// Store for MCP Server definitions
20-
const mcpDefinitions = new Map<string, vscode.lm.McpServerDefinition>();
21-
2219
export async function activate(context: vscode.ExtensionContext) {
2320
const config = vscode.workspace.getConfiguration('toolpipeMcpServer');
2421
const enabled = config.get('enabled', true);
@@ -30,7 +27,7 @@ export async function activate(context: vscode.ExtensionContext) {
3027

3128
// Register MCP Server Definition Provider
3229
const provider = {
33-
provideMcpServerDefinitions: async (): Promise<vscode.lm.McpServerDefinition[]> => {
30+
provideMcpServerDefinitions: async (): Promise<vscode.McpServerDefinition[]> => {
3431
return getMcpServerDefinitions();
3532
}
3633
};
@@ -45,92 +42,36 @@ export async function activate(context: vscode.ExtensionContext) {
4542
/**
4643
* Generates MCP Server definitions based on current configuration
4744
*/
48-
function getMcpServerDefinitions(): vscode.lm.McpServerDefinition[] {
45+
function getMcpServerDefinitions(): vscode.McpServerDefinition[] {
4946
const config = vscode.workspace.getConfiguration('toolpipeMcpServer');
5047
const mode = config.get<string>('mode', 'remote');
5148

52-
const definitions: vscode.lm.McpServerDefinition[] = [];
49+
const definitions: vscode.McpServerDefinition[] = [];
5350

5451
if (mode === 'remote') {
55-
const remoteUrl = config.get<string>('remoteUrl', 'https://troops-submission-what-stays.trycloudflare.com/mcp');
56-
definitions.push({
57-
name: 'toolpipe',
58-
displayName: 'ToolPipe Developer Tools',
59-
description: 'Access 120+ developer utilities for code, data, security, API, and DevOps tasks',
60-
type: 'http',
61-
url: remoteUrl,
62-
capabilities: {
63-
tools: {},
64-
resources: {}
65-
}
66-
} as any);
52+
const remoteUrl = config.get<string>('remoteUrl', '');
53+
if (remoteUrl) {
54+
definitions.push(
55+
new vscode.McpHttpServerDefinition(
56+
'ToolPipe Developer Tools',
57+
vscode.Uri.parse(remoteUrl)
58+
)
59+
);
60+
}
6761
} else if (mode === 'local') {
6862
const command = config.get<string>('localCommand', 'npx');
6963
const args = config.get<string[]>('localArgs', ['@cosai-labs/toolpipe-mcp-server']);
70-
71-
definitions.push({
72-
name: 'toolpipe',
73-
displayName: 'ToolPipe Developer Tools (Local)',
74-
description: 'Access 120+ developer utilities via locally-hosted ToolPipe server',
75-
type: 'stdio',
76-
command,
77-
args,
78-
capabilities: {
79-
tools: {},
80-
resources: {}
81-
}
82-
} as any);
83-
}
84-
85-
return definitions;
86-
}
8764

88-
/**
89-
* Prompts user to configure ToolPipe if not already configured
90-
*/
91-
async function promptConfigureToolPipe(): Promise<void> {
92-
const config = vscode.workspace.getConfiguration('toolpipeMcpServer');
93-
94-
if (config.get('configured')) {
95-
return;
65+
definitions.push(
66+
new vscode.McpStdioServerDefinition(
67+
'ToolPipe Developer Tools (Local)',
68+
command,
69+
args
70+
)
71+
);
9672
}
9773

98-
const choice = await vscode.window.showQuickPick(
99-
[
100-
{
101-
label: 'Use Remote Server (Cloud-hosted)',
102-
description: 'Connect to ToolPipe cloud server (no setup required)',
103-
value: 'remote'
104-
},
105-
{
106-
label: 'Use Local Server (npm-based)',
107-
description: 'Run ToolPipe locally: npx @cosai-labs/toolpipe-mcp-server',
108-
value: 'local'
109-
},
110-
{
111-
label: 'Skip Configuration',
112-
description: 'Configure later',
113-
value: 'skip'
114-
}
115-
],
116-
{ placeHolder: 'Choose ToolPipe server mode' }
117-
);
118-
119-
if (!choice) {
120-
return;
121-
}
122-
123-
if (choice.value === 'skip') {
124-
return;
125-
}
126-
127-
// Update configuration
128-
await config.update('mode', choice.value, vscode.ConfigurationTarget.Global);
129-
await config.update('configured', true, vscode.ConfigurationTarget.Global);
130-
131-
vscode.window.showInformationMessage(
132-
`ToolPipe MCP Server configured to use ${choice.value} mode. Settings can be changed in preferences.`
133-
);
74+
return definitions;
13475
}
13576

13677
export function deactivate() {
Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
{
2-
"compilerOptions": {
3-
"target": "ES2022",
4-
"module": "commonjs",
5-
"lib": ["ES2022"],
6-
"outDir": "./out",
7-
"rootDir": "./src",
8-
"declaration": true,
9-
"strict": true,
10-
"esModuleInterop": true,
11-
"skipLibCheck": true,
12-
"forceConsistentCasingInFileNames": true,
13-
"resolveJsonModule": true,
14-
"moduleResolution": "node"
15-
},
16-
"include": ["src"],
17-
"exclude": ["node_modules", "out"]
2+
"extends": "../tsconfig.base.json",
3+
"compilerOptions": {
4+
"outDir": "./out",
5+
"rootDir": "./src",
6+
"skipLibCheck": true
7+
},
8+
"include": [
9+
"src/**/*",
10+
"../../src/vscode-dts/vscode.d.ts",
11+
"../../src/vscode-dts/vscode.proposed.mcpServerDefinitions.d.ts"
12+
],
13+
"exclude": [
14+
"node_modules",
15+
"out"
16+
]
1817
}

src/vs/workbench/contrib/chat/common/widget/annotations.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,14 @@ export function annotateSpecialMarkdownContent(response: Iterable<IChatProgressR
109109
const refId = refIdPool++;
110110
const printUri = URI.parse(contentRefUrl).with({ path: String(refId) });
111111
let markdownText = `[${label}](${printUri.toString()})`;
112-
112+
113113
// If the inline reference includes a code snippet, append it as a code block
114114
if (item.snippet) {
115115
const languageId = item.languageId || inferLanguageFromLabel(label) || '';
116-
markdownText += `\n\`\`\`${languageId}\n${item.snippet}\n\`\`\``;
116+
// Use a fence length that exceeds any backtick run in the snippet
117+
const fenceLength = Math.max(3, (item.snippet.match(/`+/g)?.reduce((max, run) => Math.max(max, run.length), 0) ?? 0) + 1);
118+
const fence = '`'.repeat(fenceLength);
119+
markdownText += `\n${fence}${languageId}\n${item.snippet}\n${fence}`;
117120
}
118121

119122
const annotationMetadata = { [refId]: item };

src/vs/workbench/contrib/mcp/common/mcpConfiguration.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ const httpSchemaExamples = {
8181
},
8282
'toolpipe-remote': {
8383
type: 'http',
84-
url: 'https://troops-submission-what-stays.trycloudflare.com/mcp',
84+
url: 'https://example.com/mcp',
8585
}
8686
};
8787

0 commit comments

Comments
 (0)