VSCode MCP自定义服务开发与应用实践
前言
最近VSCode更新到了1.100版本,这个版本非常好用,原生自带AI聊天功能和支持MCP服务,提示词规则设置等AI功能,对于提升开发效率有很大帮助。看到网上很多文章没有实际案例且泛泛而谈,让有些人不知道MCP服务有什么用或者不知道如何开发一个属于自己本地的MCP服务,本文将通过多语言翻译这个实际业务来详细介绍MCP服务的概念、开发流程以及在VSCode中的应用。
什么是MCP服务?
MCP(Model Context Protocol)服务我的理解就是中间处理层,它可以获取大模型的上下文内容,然后你就可以对大模型内容进行数据处理,还能执行文件操作、调用外部API等更多功能。MCP服务可以极大地扩展AI处理业务能力的边界。
对于我来说,MCP服务的主要用途是:
- 调用企业内部API,实现与现有系统的集成
- 处理特定格式的数据转换
- 执行文件操作,如多语言资源文件的生成和复制
- 扩展AI助手的能力,使其能够完成更复杂的任务
这个是MCP服务的开发文档,有兴趣的可以看看
modelcontextprotocol.io/introductio…
在学MCP开发前先看下大模型接入MCP服务后是怎样的
!以下是大模型调用MCP服务进行多语言进行翻译和下载文件到项目的实际使用效果
MCP服务开发环境准备
MCP服务可以用多种编程语言开发,如Node.js、Python等。本人比较擅长node,本文将以Node.js为例,介绍如何开发MCP服务。 在开始开发MCP服务前,我们需要用到以下环境和工具:
- Node.js环境:建议安装最新版本的Node.js
- TypeScript:推荐使用TypeScript开发,提供更好的类型检查和开发体验
- VSCode:1.100及以上版本,支持MCP服务集成
- MCP SDK:使用官方提供的SDK快速开发MCP服务
MCP服务开发步骤
1. 初始化项目
首先,创建一个新的基于TS的Node项目并安装必要的依赖:
mkdir mcp-serve
cd mcp-serve
npm init -y
npm install @modelcontextprotocol/sdk axios zod typescript
npm install -D @types/node
以下是两个mcp服务开发的核心库介绍
@modelcontextprotocol/sdk 是一个专为 Node.js 环境设计的 npm 包,提供了创建和管理MCP服务器的核心功能:
- 定义和注册工具(tools)
- 处理与AI模型的通信
- 提供标准化的请求/响应格式
- 支持多种传输方式(如stdio)
@zod
一个TypeScript优先的数据验证库,在MCP服务中用于:
- 定义工具输入参数的类型和验证规则
- 确保接收到的数据符合预期格式
- 提供运行时类型安全
- 自动生成TypeScript类型定义
2. 配置TypeScript
创建tsconfig.json文件,配置TypeScript编译选项:
{
"compilerOptions": {
"target": "ES2020",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"esModuleInterop": true,
"outDir": "./dist",
"strict": true
},
"include": ["src/**/*"]
}
3. 定义MCP服务和实现业务功能
创建src/index.ts文件,定义MCP服务和工具:
主要实现了调用API翻译多语言和下载多语言到项目两个功能。
业务代码一般写在server.tool这里面,大模型会根据需求调用对应的服务工具
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import { geti18n, TranslateToEn, downFile } from "./api";
import path from "path";
import fs from "fs";
// 创建MCP服务实例
const server = new McpServer({
name: "my-custom-mcp-server",
version: "1.0.0",
});
const port = process.env.PORT;
// 定义多语言翻译工具
server.tool(
"translationI18n",
{
input: z.string(),
},
async ({ input }) => {
// 匹配所有 ##...## 的内容
const regex = /##([\s\S]+?)##/g;
let matches = input.matchAll(regex);
let result = input;
for (const match of matches) {
const value = match[1];
if (!value) continue;
let params: Record<string, any> = {
language: 1,
autoAlias: true,
value: value,
};
// 企业版需要英文翻译
if (port === "5500") {
params.valueEn = await TranslateToEn(value);
}
// 调用多语言接口
const alias = await geti18n(params);
if (alias) {
result = result.replace(match[0], alias);
}
}
return {
content: [
{
type: "text",
text: result,
},
],
};
}
);
// 定义多语言复制工具
server.tool(
"copyI18n",
{
rootPath: z.string(),
},
async ({ rootPath }) => {
let langArr = [{ name: "ZhCn", value: 1, filePath: "ZhCn.js" }];
// 企业版需要英文文件
if (port === "5500") {
langArr.push({ name: "EnUs", value: 2, filePath: "EnUs.js" });
}
let result = "";
try {
for (let lang of langArr) {
const langTargetPath = path.join(
rootPath,
"src/lang/source",
lang.filePath
);
const tempFilePath = path.join(rootPath, lang.filePath);
// 创建写入流下载文件
const writer = fs.createWriteStream(tempFilePath);
const res = await downFile(lang.value);
res.data.pipe(writer);
await new Promise<void>((resolve, reject) => {
writer.on("finish", () => resolve());
writer.on("error", (err) => reject(err));
});
// 复制到目标目录并删除临时文件
fs.copyFileSync(tempFilePath, langTargetPath);
fs.unlinkSync(tempFilePath);
console.log(`${lang.name}文件复制成功`);
result = `${tempFilePath}文件复制成功`;
}
} catch (error) {
console.log("文件复制失败", error);
result = `文件复制失败${error},${rootPath},`;
}
return {
content: [
{
type: "text",
text: result,
},
],
};
}
);
// 启动MCP服务
async function startServer() {
const transport = new StdioServerTransport();
await server.start(transport);
console.log("MCP服务已启动");
}
startServer().catch(console.error);
编译和运行MCP服务
- 添加编译脚本到
package.json:
{
"scripts": {
"build": "tsc",
"start": "node dist/index.js"
}
}
- 编译TypeScript代码:
npm run build
在VSCode中使用MCP服务
MCP服务开发完成后接下来就可以在vscode中使用了
1. 配置VSCode
首选项-设置-打开设置(json)中添加以下内容
"mcp": {
"servers": {
"mcp-server": {
"command": "node",
"args": [
"D:\\Users\\Administrator\\Documents\\wenfeng\\mcp-serve\\dist\\index.js"
],
"env": {
"Token": "",
"URL": "",
"PORT": ""
}
}
}
}
这里定义mcp服务要运行的脚本位置以及一些环境变量,在node项目中可以用以下方式接收
const token = process.env.Token;
const url = process.env.URL;
源码获取
以上是mcp服务的完整开发流程和使用方式,不懂的可以评论交流,完整源码已上传到GitHub,欢迎下载学习和提出改进建议:
如果这个项目对你有所启发,希望点个Star支持!