MCP 实践 01|从 0 搭建 MCP Server:读取简历与 JD,并用 MCP Inspector 测试

文章目录

  • [MCP 实践 01|从 0 搭建 MCP Server:读取简历与 JD,并用 MCP Inspector 测试](#MCP 实践 01|从 0 搭建 MCP Server:读取简历与 JD,并用 MCP Inspector 测试)
  • [1.MCP Server](#1.MCP Server)
  • [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

相关推荐
maxmaxma1 小时前
Claude Code集成DeepSeek-V4-pro全栈开发 - Tauri应用TODO
ai
TENSORTEC腾视科技13 小时前
腾视科技重磅推出AI NAS,重塑数据管理方式,开启智能高效新时代
人工智能·ai·七牛云存储·nas·企业存储·ainas·家庭存储
heyCHEEMS15 小时前
如何用 Recast 实现静态配置文件源码级读写
前端·node.js
GoodTimeGGB15 小时前
🚀 2024-2026最新AI热词终极科普:按时间线读懂Agent时代完整进化
agent·mcp·openclaw·harness·hermes
xinxin_091615 小时前
xCodeEval:多语言代码评估基准
ai
华科大胡子16 小时前
AI时代工程师superpowers进化论
ai
John_ToDebug16 小时前
AGENTS.md 进阶:如何让 AI 从「被动听从」变为「主动查阅」
人工智能·ai·agent
C澒17 小时前
AI CR:前端团队代码审查规范及高频坑汇总
前端·ai·code review
香蕉鼠片17 小时前
大模型Function Call
人工智能·深度学习·机器学习·ai