文章目录
- [MCP 实践 01|从 0 搭建 MCP Server:读取简历与 JD,并用 MCP Inspector 测试](#MCP 实践 01|从 0 搭建 MCP Server:读取简历与 JD,并用 MCP Inspector 测试)
- [1.MCP Server](#1.MCP Server)
-
- [1.1 搭建本地 MCP Server](#1.1 搭建本地 MCP Server)
- [1.2 注册 Tools](#1.2 注册 Tools)
- 1.3.配置构建与依赖说明
- [2.MCP Inspector 测试](#2.MCP Inspector 测试)
MCP 实践 01|从 0 搭建 MCP Server:读取简历与 JD,并用 MCP Inspector 测试
1.MCP Server
1.1 搭建本地 MCP Server
src/index.ts
typescript
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { registerGetJobDescriptionTool } from './tools/getJobDescription.js';
import { registerGetResumeTool } from './tools/getResume.js';
- McpServer 是用来创建 MCP Server 实例的。
你可以理解为创建一个工具服务,这个服务后面可以注册 tools、resources、prompts。
-
StdioServerTransport 是通信方式
你的这个 MCP Server 不是通过 HTTP 暴露接口,而是通过 标准输入/输出 stdio 和 MCP Client 通信。
-
引入你自己写的工具注册函数 registerGetJobDescriptionTool registerGetResumeTool
src/index.ts
typescript
const server = new McpServer({
name: 'resume-matcher-mcp',
version: '0.1.0'
});
- 建你的 MCP Server,
name是服务名, version 是版本号
typescript
registerGetResumeTool(server);
registerGetJobDescriptionTool(server);
- 注册 tools,你创建了 server 之后,它本身还没有任何工具。必须把工具注册进去,MCP Client 才能通过
tools/list发现它们。
typescript
const transport = new StdioServerTransport();
- MCP Server 需要通过某种方式和 MCP Client 通信。常见有两种:
- stdio:本地进程通信
- HTTP:远程服务通信

typescript
try {
await server.connect(transport);
} catch (err) {
const message = err instanceof Error ? err.message : String(err);
console.error(`MCP server 启动失败:${message}`);
process.exitCode = 1;
}
- 启动 server 核心是await server.connect(transport);让 MCP Server 通过 stdio transport 开始工作,等待 MCP Client 连接和调用。
- 当你点 Inspector 的
Connect时,本质上就是启动了这个进程,然后和它建立 MCP 通信。
1.2 注册 Tools
typescript
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
McpServer是 MCP Server 实例的类型。
typescript
import * as z from 'zod/v4';
zod是参数校验库。MCP tool 通常需要声明自己接收什么参数。比如:inputSchema: z.object({}).strict(),表示不需要任何参数,而且不允许传额外字段。
typescript
import { readDataFile } from '../utils/file.js';
- 引入文件读取函数,这里引入的是你自己封装的工具函数。
typescript
export function registerGetResumeTool(server: McpServer): void {
server.registerTool(
'get_resume',
{
title: 'Get Resume',
description: '读取 data/resume.md 并返回 markdown 文本',
inputSchema: z.object({}).strict()
},
async () => {
try {
const markdown = await readDataFile('resume.md');
return { content: [{ type: 'text', text: markdown }] };
} catch (err) {
const message = err instanceof Error ? err.message : String(err);
return { content: [{ type: 'text', text: `get_resume 调用失败:${message}` }] };
}
}
);
}
- server.registerTool 大概有三部分:
- tool 名称
- tool 元信息
- tool 执行函数
1.3.配置构建与依赖说明
javascript
{
"name": "resume-matcher-mcp",
"version": "0.1.0",
"private": true,
"type": "module",
"scripts": {
"dev": "tsx src/index.ts",
"build": "tsc -p tsconfig.json",
"start": "node dist/index.js",
"inspect": "pnpm -s build && pnpm dlx @modelcontextprotocol/inspector -- node dist/index.js"
},
"dependencies": {
"@modelcontextprotocol/sdk": "1.29.0",
"zod": "^4.0.0"
},
"devDependencies": {
"@types/node": "^22.0.0",
"tsx": "^4.20.0",
"typescript": "^5.8.0"
}
}
开发阶段
- "dev": "tsx src/index.ts"
tsx 会帮你临时把 TypeScript 转换成 Node 能执行的 JavaScript,然后直接跑起来。它适合开发调试,不需要你每次都手动 pnpm build。
生产阶段
- "build": "tsc -p tsconfig.json","start": "node dist/index.js"
生产/稳定运行阶段通常是两步:先用 TypeScript 编译器把
src里的.ts文件编译到dist目录。再用 Node 运行编译后的 JavaScript 文件。
测试阶段
-
"inspect": "pnpm -s build && pnpm dlx @modelcontextprotocol/inspector -- node dist/index.js"
pnpm -s build 先构建,把 TypeScript 编译成
dist/index.js。pnpm dlx @modelcontextprotocol/inspector -- node dist/index.js 临时启动 MCP Inspector,让 Inspector 作为一个测试用的 MCP Client,去连接你的 MCP Server。
项目需要的依赖:
javascript
"dependencies": {
"@modelcontextprotocol/sdk": "1.29.0",
"zod": "^4.0.0"
},
"devDependencies": {
"@types/node": "^22.0.0",javascript
"tsx": "^4.20.0",
"typescript": "^5.8.0"
}
dependencies表示:项目运行时需要的依赖。
- @modelcontextprotocol/sdk 是MCP 官方 TypeScript SDK
- zod是参数校验库
devDependencies 表示:只在开发、构建、类型检查时需要的依赖,项目真正运行时不一定需要它们。
-
@types/node
这是 Node.js 的 TypeScript 类型声明,代码里用了 Node 内置模块
-
tsx
tsx 是开发时直接运行 TypeScript 的工具。
-
typescript
2.MCP Inspector 测试

选择通信方式:

-
stdio:Inspector 启动你的本地 Node 进程,比如
node dist/index.js,然后通过 stdin / stdout 和你的 MCP Server 通信。 -
SSE:旧一些的 HTTP 流式通信方式,客户端通过 SSE 接收服务端消息。
-
Streamable HTTP:新版更推荐的远程 HTTP 通信方式,适合部署到服务器后让多个客户端远程访问。
其他配置参数:
命令Command:
表示:Inspector 要启动哪个命令
Arguments
这个是传给 node的参数。
Environment Variables 环境变量配置
以后你的 MCP Server 需要用大模型 API Key,可以在这里配置
OPENAI_API_KEY=xxx
GEMINI_API_KEY=xxx
Server Entry
一般是 Inspector 帮你查看/复制当前 server 启动配置的入口信息
Servers File
MCP Inspector 的 server 配置文件相关入口 它可以让你用类似配置文件的方式管理多个 MCP Server,而不是每次手动填 Command 和 Arguments。
Authentication
这是认证配置。
这个主要用于 HTTP / Streamable HTTP 这类远程 MCP Server。
比如远程服务需要请求头:Authorization: Bearer xxx
configuration
MCP Inspector 的连接与调试配置,主要控制"请求超时、代理地址、会话 token、任务存活时间"等
做本地 stdio MCP Server,基本不用改,默认就行。
点击 connect 连接后,就有对应的 Tools

点击运行,即可查看 Get Resume
