# reactive-resume

> Integrate Reactive Resume's MCP tools with DeepSeek Harness, enabling AI to directly read, modify, and lock users' online resumes and job applications.

## Metadata

- Author: [@amruthpillai](https://github.com/amruthpillai)
- Repo: <https://github.com/amruthpillai/reactive-resume.git>
- GitHub: [amruthpillai/reactive-resume](https://github.com/amruthpillai/reactive-resume)
- Stars: 41,287
- Language: TypeScript
- License: [MIT](https://spdx.org/licenses/MIT.html)
- Homepage: <https://rxresu.me>
- Topics: `agent-skills`, `ai`, `dsh-plugin`, `hacktoberfest`, `javascript`, `mcp-server`, `react`, `resume-builder`, `self-hosted`, `typescript`
- Forks: 4,636
- Open Issues: 108
- Last push: 2026-08-20T08:56:18.000Z
- Added: 2026-08-20T00:00:00.000Z

## Install

```bash
dsh plugin --profile web add github:amruthpillai/reactive-resume/packages/dsh-plugin
```

## Wiki

## 一句话定位
把在线简历服务 Reactive Resume 的 MCP 工具集接进 DeepSeek Harness，让 AI 能像操作文件一样读取、修改、锁定和跟踪用户的简历与求职申请。配套一段系统提示教学，告诉模型怎么正确写简历数据，避免常见的 patch 路径错误。

## 核心能力
- 通过 streamable-http 桥接 Reactive Resume 的 MCP 端点，把 28+ 个简历与求职工具暴露给模型
- 注入专用的系统提示章节，规范模型编辑简历的流程（先列 ID 再读、按 RFC 6902 patch、UUID-keyed 条目、锁定状态）
- 读取并转发用户 API Key，默认走官方托管地址 `https://rxresu.me`，也支持自托管实例
- 未配置 API Key 时只打印警告、不挂载工具，保证 profile 仍可启动
- 在插件层自定义工具命名空间（`serverName`），避免多个 Reactive Resume 实例的工具名冲突

## 技术实现
- **语言**: TypeScript（ESM，TypeScript 7）
- **关键依赖**: `@deepseek-ai/cordis`（插件宿主框架）、`@deepseek-ai/dsh-mcp-client`（MCP 桥接）、`@deepseek-ai/dsh-system-prompt`（系统提示注入）、`@deepseek-ai/schemastery`（配置 schema 校验）
- **架构模式**: Cordis bundle patch 声明式注入——`cordis.patch.yml` 在安装时插入一行 `reactive-resume`，插件 `apply(ctx, config)` 钩子在 Harness 启动时调用 `ctx.plugin()` 挂载 MCP 客户端，并通过 `ctx.systemPrompt.section()` 追加 prompt
- **入口文件**: `src/index.ts`（`apply` 函数 + `Config` schema + `name`/`inject` 导出）

## 适用场景
用户已经在用 Reactive Resume 管理在线简历，并希望 DeepSeek Harness 里的对话能直接读取、修改、批量更新简历或求职申请。痛点是：手动改简历字段名、复制工作经历描述很费劲，而让模型直接操作数据又怕它猜错 UUID、踩坑锁定状态——这个插件把工具和操作规约一起交给模型。

## 前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| Node.js | ^22.19.0 \|\| >=24.0.0 | 来自 `package.json#engines` |
| @deepseek-ai/cordis | ^4.0.1 | 宿主框架，peerDependency |
| @deepseek-ai/dsh-mcp-client | ^0.1.0-rc.6 | MCP 桥接客户端 |
| @deepseek-ai/dsh-system-prompt | ^0.1.0-rc.6 | 系统提示注入接口 |
| @deepseek-ai/schemastery | ^3.18.1 | 配置 schema 校验 |
| 平台 | 跨平台 | 无原生模块依赖 |
| 原生模块 | 无 | 纯 JS 实现 |

## 安装方式
```bash
dsh plugin --profile web add github:amruthpillai/reactive-resume/packages/dsh-plugin
```

## 配置项
| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| `apiKey` | 字符串 | 从 `<url>/dashboard/settings/api-keys` 申请的 API Key；空字符串表示不挂载工具，仅打警告 | `''` |
| `url` | 字符串 | Reactive Resume 实例的根地址；自托管时改成你自己的地址 | `https://rxresu.me` |
| `serverName` | 字符串 | 工具命名空间前缀，工具在模型那边会变成 `mcp__<serverName>__<工具名>`；只允许字母数字下划线连字符、最长 32 字符 | `resume` |
| `toolCallTimeoutMs` | 数字 | 单次工具调用超时（毫秒） | `60000` |

## 常见问题

**Q: 安装后必须立刻配置 apiKey 吗？**

A: 不需要。源码里 `apply` 函数检测到空 apiKey 时只打印警告并直接返回，不会调用 `ctx.plugin()`，所以未配置状态下 profile 仍然能正常启动，模型也不会看到 Reactive Resume 工具。

**Q: 能自托管 Reactive Resume 然后接入吗？**

A: 可以。把 `url` 配置改成自托管实例地址（例如 `http://localhost:3000`），插件会自动去掉尾部斜杠并拼上 `/mcp` 端点，记得在自托管实例上也生成 API Key。

**Q: 能不能只暴露部分工具，不全部给 AI 用？**

A: 不能。Harness 的 `ctx.tools.restrict()` 只能在 agent 上下文中调用，而插件 `apply` 拿到的是插件级 context，所以裁剪工具集目前无法实现——所有 Reactive Resume 发布的工具都会暴露给模型。

**Q: serverName 这个字段是干嘛的？改了会怎样？**

A: 它是工具的命名空间前缀，模型实际看到的工具名是 `mcp__<serverName>__<rawName>`。默认是 `resume`。如果你想同时接入官方版和自托管版两个实例，把它们的 `serverName` 改成不同值（如 `resume-hosted` / `resume-self`）就能避免重名冲突。

**Q: 插件往系统提示里写了什么？**

A: 它在 `ctx.systemPrompt.section()` 里追加一段「Reactive Resume」章节，涵盖：编辑前先 `list_resumes` 再 `read_resume`、用 RFC 6902 JSON Patch 而不是覆盖写、section 条目是带 UUID id 的对象数组、锁定的简历要先 `unlock_resume`、删除动作必须用户明确授权等规约。

**Q: 工具调用超时了会怎样？**

A: 默认单次调用 60 秒（`toolCallTimeoutMs: 60000`），超时由 `dsh-mcp-client` 处理。如果你的网络或简历特别大，可以在 profile 的 `cordis.patch.yml` 里调大这个值。

## 上手难度
入门 — 配置只有一个必填项（apiKey），其他都有默认值，普通用户拿到 API Key 就能用。

## 已知问题与限制
- 工具集无法在插件层裁剪，所有 Reactive Resume 发布的工具都会暴露给模型（src/index.ts:23-30）
- 未配置 apiKey 时只 warn 不挂载，但 warn 消息没有关闭开关（src/index.ts:44）
- `serverName` 长度上限 32 字符且只允许 `[A-Za-z0-9_-]`，超出或含非法字符会在 schema 校验阶段抛错（src/config.ts:4 / src/config.ts:28-32）
- 插件直接通过 `failOnStartupError: true` 让 MCP 启动失败会冒泡到宿主，启动期网络抖动会让 profile 启动失败（src/index.ts:56）

---

This document is auto-generated by [deepseek-plugin.org](https://deepseek-plugin.org). HTML page: [reactive-resume](https://deepseek-plugin.org/plugins/amruthpillai/reactive-resume/packages/dsh-plugin)
Wiki generated by AI (model: `MiniMax-M3`)
