章
目
录
在日常使用电脑的过程中,你是否曾想过,要是能快速知道自己电脑里都装了哪些软件就好了?今天,咱们就来学习开发一个MCP服务,专门用来获取本地电脑安装的软件信息。接下来,跟着我的节奏,一步步来实现吧。
一、为啥要开发这个MCP服务?
在常见的AI Agent客户端里,像文件操作、系统操作这类指令往往是受限的。但接入MCP服务后,这些操作就变得轻松简单。今天我们开发的这个MCP服务,主要功能就是获取本地电脑安装的软件,通过它可以让AI Agent客户端的功能更强大,能处理更多复杂场景。
二、前期准备工作
(一)开发环境选择
对于前端开发工程师来说,Javascript和Typescript是常用的开发语言。MCP官方也提供了Typescript版本的SDK,所以我们选择在Node环境下开发。开发前,需要确保你的电脑满足以下条件:
- Node版本:Node 16及以上版本。
- 安装Claude桌面客户端:这是后续验证服务是否正常运行的关键工具。
- 演示环境:本文以MacOS系统为例进行演示,其他系统操作步骤可能略有差异。
(二)初始化项目
准备好开发环境后,就要开始初始化项目了。具体操作步骤如下:
# 创建项目目录
mkdir mcp-get-installed-apps
cd mcp-get-installed-apps
# npm初始化
npm init -y
# 安装依赖
npm install @modelcontextprotocol/sdk zod
npm install -D @types/node typescript
# 创建文件
mkdir src
touch src/index.ts
在这段代码中,mkdir
用于创建目录,cd
用来切换目录,npm init -y
会快速初始化一个npm项目,npm install
用于安装项目所需的依赖包,最后创建了src
目录和index.ts
文件,后续的业务逻辑代码就写在这个文件里。
(三)更新配置文件
项目初始化完成后,还需要更新package.json
和tsconfig.json
这两个配置文件。
package.json
配置如下:
{
"type": "module",
"bin": {
"weather": "./build/index.js"
},
"scripts": {
"build": "tsc && chmod 755 build/index.js"
},
"files": [
"build"
]
}
"type": "module"
表示项目使用ES模块规范;"bin"
字段指定了可执行文件的入口;"scripts"
里的"build"
脚本用于编译TypeScript代码并设置可执行权限;"files"
指定了发布时包含的文件目录。
tsconfig.json
配置如下:
{
"compilerOptions": {
"target": "ES2022",
"module": "Node16",
"moduleResolution": "Node16",
"outDir": "./build",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
},
"include": ["src/**/*"],
"exclude": ["node_modules"]
}
compilerOptions
里的各项配置用于指定TypeScript编译器的行为,比如目标ES版本、模块系统、输出目录等。include
和exclude
分别指定了需要编译的文件和需要排除的文件目录。
三、构建MCP服务
完成前面的准备工作,就进入到构建MCP服务的核心环节了。整体代码不到50行,虽然简短,但功能强大。代码如下:
// 引入必要的模块
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { getInstalledApps } from "get-installed-apps";
// 创建McpServer实例,配置服务名称、版本和能力
const server = new McpServer({
name: "mcp-get-installed-apps",
version: "1.0.0",
capabilities: {
resources: {},
tools: {}
}
});
// 定义一个工具,用于获取电脑安装的软件
server.tool(
"get-installed-apps",
"Get my computer's installed apps",
async () => {
const apps = await getInstalledApps();
return {
content: [
{
type: "text",
text: JSON.stringify(apps, null, 2)
}
]
};
}
);
// 程序入口函数
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("Weather MCP Server running on stdio");
}
main().catch((error) => {
console.error("Fatal error in main():", error);
process.exit(1);
});
这段代码主要做了三件事:
- 创建McpServer实例:给服务取名为
mcp-get-installed-apps
,版本设为1.0.0
,并初始化了服务的能力。 - 定义工具:使用
server.tool()
方法定义了一个名为get-installed-apps
的工具,描述为“Get my computer’s installed apps”,在工具的实现函数里,通过getInstalledApps()
方法获取安装的软件信息,并进行格式化返回。这里的get-installed-apps
是一个npm库,需要额外安装。
npm install get-installed-apps
- 程序入口:
main()
函数是整个程序的入口,创建了StdioServerTransport
实例作为通信传输,然后将服务连接到这个传输上,启动服务。如果在启动过程中出现错误,会捕获并打印错误信息,同时退出程序。
四、打包服务
服务构建完成后,需要进行打包,方便后续使用。打包操作很简单,在项目目录下执行以下命令即可:
npm run build
这个命令会执行package.json
里定义的build
脚本,将TypeScript代码编译成JavaScript代码,并设置可执行权限。
五、与Claude桌面客户端结合验证
打包完成后,还需要和Claude桌面客户端结合,来验证服务是否能正常工作。具体步骤如下:
- 添加或编辑配置文件:找到
claude_desktop_config.json
文件,它的路径在/Users/xxx/Library/Application Support/Claude/claude_desktop_config.json
。在文件中添加如下配置:
{
"mcpServers": {
"get-installed-apps": {
"command": "node",
"args": [
"/Users/xxx/Documents/git/mcp-get-installed-apps/build/index.js"
]
}
}
}
注意,/Users/xxx/Documents/git/mcp-get-installed-apps/build/index.js
要替换成你实际构建后的服务运行路径。
2. 重启Claude桌面客户端:重启的目的是让客户端重载配置,成功导入我们开发的服务。
重启后,如果一切正常,Claude就能使用我们开发的get-installed-apps
工具了。当你在Claude里询问获取电脑安装软件相关问题时,就能看到类似下面这样的结果:
六、服务工作原理
可能你会好奇,这个服务是怎么运作的呢?其实流程并不复杂:
- 用户提问:客户端把你输入的问题发送给Claude。
- 工具选择:Claude接收到问题后,会分析可用的工具,判断哪个工具能解决这个问题,这里就会选择我们开发的
get-installed-apps
工具。 - 工具执行:客户端通过MCP服务器执行选定的工具。
- 结果返回:工具执行完成后,将结果返回给Claude。
- 生成回答:Claude把返回的结果组织成自然语言,呈现给用户。
七、写在最后
通过这个教程,我们成功开发了一个简单的MCP服务,实现了获取本地电脑安装软件的功能。从这个小服务中,我们也能感受到MCP服务的强大之处。以后,随着更多MCP服务的出现,AI Agent客户端将会有更丰富的功能,能应对各种复杂的使用场景。希望大家在学习这个教程的过程中有所收获,也期待大家能基于此开发出更多有趣、实用的MCP服务。