使用说明
MCP服务器和客户端示例(TypeScript)
该项目演示了使用TypeScript和 @modelcontextprotocol/sdk.
设置包括:
my-mcp-greeter-server:提供问候相关工具、资源和提示的MCP服务器。my-mcp-client-script:一个简单的命令行客户端脚本,用于启动服务器、连接到服务器并以编程方式与其功能进行交互。
本例中客户端和服务器之间的通信使用 标准输入/输出 运输机制。
所遵循过程概述
该项目是按照以下主要阶段建造的:
- 服务器开发:创建MCP服务提供商。
- 客户端开发:创建一个脚本来使用服务器的服务。
- 测试与交互:运行客户端脚本,启动服务器并演示通信。
- (可选)集成:讨论如何将服务器与现有的MCP客户端(如VS Code扩展)集成。
先决条件
在开始之前,请确保已安装以下内容:
- Node.js (建议使用v16或更高版本)
- npm (通常包含在Node.js中)
- 文本编辑器或IDE(如VS Code)
npx(通常包含在npm中)-适用于使用MCP Inspector进行测试。
第一阶段:构建MCP服务器(my-mcp-greeter-server)
-
项目设置:
- 已创建目录
my-mcp-greeter-server. - 初始化了一个npm项目:
npm init -y. - 已安装必要的依赖项:
npm install @modelcontextprotocol/sdk zod. - 已安装的开发依赖关系:
npm install -D typescript @types/node. - 已初始化TypeScript配置:
npx tsc --init. - 已配置
tsconfig.json(设置"module": "Node16","target": "ES2022","outDir": "./build","rootDir": "./src"等等)。 - 更新
package.json包括"type": "module"并添加build/start脚本。 - 已创建源文件
src/index.ts.
- 已创建目录
-
服务器实现(
src/index.ts):- 导入所需模块(
McpServer,StdioServerTransport,z). - 为服务器定义常量
name和version. - 被实例化
McpServer,传递名称、版本并声明其功能(工具、资源、提示)。 - 定义工具(
greet):已使用server.tool()创建一个可由客户端调用的函数。包含描述,使用Zod定义输入参数(name,politeness),并实现了返回个性化问候字符串的处理程序。 - 定义资源(
server-info):已使用server.resource()以暴露静态数据。提供了一个唯一的URI(info://greeter/about)并实现了返回服务器名称和版本的处理程序。 - 定义提示(
suggest-greeting):已使用server.prompt()创建可重用的交互模板。包含描述并实现了处理程序,以返回一组预定义的用户/助理消息来指导LLM交互。 - 二手标准运输:即时
StdioServerTransport作为一种沟通方式。 - 连接:已呼叫
await server.connect(transport)使服务器准备就绪。 - 日志记录:已添加
console.error用于执行期间可见性的语句,对于stdio传输尤其重要,其中stdout用于协议消息。 - 活着:确保Node.js进程在连接后没有立即退出。
- 导入所需模块(
-
建筑与装修:
- 跑
npm run build将TypeScript编译为JavaScriptbuild目录。 - 修复了与直接访问服务器版本相关的TypeScript错误,选择使用预定义的常量。
- 跑
第二阶段:构建MCP客户端脚本(my-mcp-client-script)
-
项目设置:
- 创建了一个单独的目录
my-mcp-client-script. - 初始化了一个npm项目:
npm init -y. - 已安装必要的依赖项:
npm install @modelcontextprotocol/sdk. - 已安装的开发依赖关系:
npm install -D typescript @types/node. - 已初始化并配置
tsconfig.json与服务器项目类似。 - 更新
package.json随着"type": "module"和build/start脚本。 - 已创建源文件
src/client-script.ts.
- 创建了一个单独的目录
-
客户端实施(
src/client-script.ts):- 导入所需模块(
Client,StdioClientTransport,path,url). - 已确定服务器路径:计算到的路径 服务器的 编译
index.js文件(相对或绝对)。 - 配置的标准传输:即时
StdioClientTransport,提供command(node)以及args(服务器脚本的路径)。 此配置是关键,因为客户端传输会启动服务器进程。 - 即时客户端:创建了一个
Client例如,给它一个身份,并声明它使用工具和资源的意图。 - 连接:已呼叫
await client.connect(transport),它启动了服务器进程,并通过其stdio流建立了MCP连接。 - 与服务器交互:
- 被称为
greet工具使用await client.callTool(). - 阅读
server-info资源利用await client.readResource(). - 拿走了
suggest-greeting提示使用await client.getPrompt().
- 被称为
- 记录的结果:已使用
console.log以显示从服务器接收到的响应。 - 封闭连接:已使用
await client.close()在一个finallyblock以彻底关闭连接并终止服务器进程。
- 导入所需模块(
第三阶段:建设与运营
-
构建两个项目:
cd my-mcp-greeter-server && npm run buildcd ../my-mcp-client-script && npm run build
-
运行客户端:
cd my-mcp-client-scriptnpm run start(或node build/client-script.js)- 观察到两个客户端的交错输出(
console.log)以及服务器(console.error),确认工具/资源/提示的成功沟通和执行。
角色说明
-
服务器(
GreeterServer):- 提供服务:显示特定功能(问候工具、服务器信息、提示模板)。
- 被动监听器(在stdio中):等待客户端通过其标准流连接。
- 执行逻辑:当客户端请求时,运行与工具/资源/提示符关联的代码。
- 发送结果:根据MCP规范格式化结果并将其发送回客户端。
-
客户(
client-script.ts):- 消费服务:使用服务器提供的功能。
- 启动器(在stdio中):启动服务器进程并建立连接。
- 发送请求:决定调用哪个工具、读取哪个资源或获取哪个提示,并发送相应的MCP请求。
- 接收结果:处理服务器发回的响应。
- 控制流量:管理交互顺序并决定何时关闭连接。
交互式测试服务器
当客户端脚本测试程序化交互时,您可以使用MCP检查器单独测试服务器的功能:
# Make sure the server is NOT already running
# Replace /path/to/... with the actual absolute path
npx @modelcontextprotocol/inspector node /path/to/my-mcp-greeter-server/build/index.js