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

相关推荐
TechEdu2026062 小时前
[人工智能]AI芯片家族与产品目录指南
人工智能·ai
不会写代码的女程序猿2 小时前
中小康养门店选型参考|明理 AI 四诊仪场景适配与投入回报分析
大数据·人工智能·科技·ai·健康医疗
Cx330❀3 小时前
【Linux网络】网络层协议 IP :从网络层原理到 Linux 内核源码
linux·运维·服务器·网络·tcp/ip·ai·ai编程
蒲公英eric4 小时前
从直接重定向到白名单验证:DVWA 开放重定向模块完整漏洞分析教程
web安全·ai·ctf·dvwa·ai安全·开放重定向模块
linweidong5 小时前
中科闻歌Java面试题及参考答案
java·python·大模型·提示词·ai agent·mcp·rag原理
奇牙coding1236 小时前
GPT-6-Astra API 接入教程:OpenRouter 路由配置 + Python/curl 示例 + 静默降级踩坑
开发语言·python·gpt·ai
2601_962077538 小时前
程序员会消失吗?
ai·程序员·职业发展·未来趋势·技术变革
枫彩8 小时前
A股数据源怎么选?用 Python 验收 AI 复盘的日期与明细
python·ai agent·股票数据·mcp
chuntian_tester9 小时前
AI自动化第3步【用例设计】
人工智能·测试工具·ai·自动化