关于 CvLAC (MinCiencias)
CvLAC (MinCiencias) 是面向哥伦比亚研究人员的 MCP 服务,可通过 AI 助手读取和更新研究履历。它在本地使用浏览器操作,并会先询问是否处理可能的重复项。
主要功能
- 01读取和编辑履历栏目
- 02添加或删除研究记录
- 03检查可能重复的条目
- 04核实更改是否保存
- 05凭据保留在本地电脑
适用场景
- 01通过聊天添加论文或研究项目
- 02查看学术经历和奖项
- 03检查重复后更正履历条目
MCP 相关
它向兼容 MCP 的 AI 助手提供与 CvLAC 交互的工具,包括读取和编辑履历记录,并在用户电脑上运行。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
13收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| force | boolean | 否 | 即使会话有效,也强制重新登录 |
详细介绍
cvlac-mcp
与 AI 助手对话即可更新 CvLAC,无需手动填写表单。
填写 MinCiencias 的 CvLAC 很耗时:每门课程、每个奖项或项目都要填写一份表单,而且机构和市镇目录中不一定能找到你要的内容。cvlac-mcp 让你的 AI 助手(例如 Claude)能够代你完成这些操作:你在聊天中告诉它要添加或更正什么,它便会使用你的账号登录 CvLAC、填写表单、保存并检查是否保存成功。
它在你的电脑上运行。你的凭据不会离开电脑,也不会经过任何中间服务器。
效果展示
对话大致如下:
你: 给我看看我在 CvLAC 上有哪些荣誉。
助手: 你有 6 项,其中包括“教学工作表彰”(2023 年)和“全国工程大会最佳报告”(2021 年)……
你: 添加这个:“教学工作荣誉奖”,北方大学,2024 年,国家级。
助手: 我还没有保存:这似乎和“教学工作表彰”(2023 年)相似,而这项已经在你的 CvLAC 上了。这是同一项荣誉,你想更正它,还是另一项荣誉,需要单独创建?
你: 是另一项,创建吧。
助手: 好了,CvLAC 已确认保存。它现在已出现在你的列表中:“教学工作荣誉奖”,2024 年,国家级。
助手不会删除任何内容,也不会在未事先询问你的情况下创建重复项。本例中的名称均为虚构。
可以做什么,不能做什么
可以读取、添加、修改和删除:
| CvLAC 中的名称 | 示例 |
|---|---|
| 学历 | 本科、专科、硕士、博士 |
| 补充培训 | 文凭课程、拓展课程(见下方说明) |
| 专业经历 | 在大学和企业的任职经历 |
| 短期课程 | 课程和工作坊 |
| 荣誉 | 奖项、荣誉称号、表彰 |
| 项目 | 研究、创新、拓展项目 |
| 软件 | 已登记的软件产品 |
| 科学活动 | 你参加过的大会、研讨会、工作坊 |
| 语言 | 你的阅读、写作、口语和听力水平 |
| 研究方向 | 当前或非当前研究方向及其目标 |
| 其他作品 | 其他成果 |
| 文章 | 具有 ISSN 或属于目录中期刊的文章 |
| 书籍 | 具有 ISBN、出版社和目录中领域信息的书籍 |
| 章节 | 与书籍及目录中领域相关联的章节 |
| 指导的论文 | 论文、课程和机构 |
| 评审 | 学位论文或毕业论文的评审工作 |
| 技术成果 | 报告、创新成果、技术产品、咨询和原型 |
| 个人资料 | 个人简介、学术社交网络(ORCID、Google Scholar、Scopus…)和研究领域 |
目前还不能:
- **通过
complete_product上传证书:**该操作用于管理关键词、领域、合著者、荣誉,以及论文中关联的学生。书籍证书通过带有本地路径的update_section附加;它们不属于complete_product列表。 - **创建 CvLAC 目录中不存在的期刊、书籍、出版社、课程或领域。**如果目录返回多个选项,工具会显示这些选项供你选择。
- **使用外国国籍账户登录。**目前登录流程默认使用哥伦比亚国籍。
- **更改你的身份信息和地址,**也不能更改任何 GrupLAC 信息。
- **创建 CvLAC 尚未登记的补充培训课程。**CvLAC 搜索器只会显示该机构已有的课程,网站也不允许创建其他课程。
自动比较你的 CvLAC 与其他来源的内容(diff 工具)目前仅适用于具有特定结构的网页简历组合(详情)。如果你没有,也没关系:把简历文本粘贴到聊天中,或者口述给助手,助手会读取你的 CvLAC,并逐项添加缺少的内容;遇到任何相似项时都会先向你确认。
你需要准备什么
- **你的 CvLAC 用户信息:**名字、身份证号码和密码,也就是你登录网站时使用的信息。
- 一台安装了 Windows、macOS 或 Linux 的电脑。
- **Node.js 20 或更高版本,**这是一个让此工具运行的免费程序。第 1 步会介绍如何安装。
- **一款支持 MCP 服务的 AI 应用。**MCP 是这类应用连接此类工具所使用的标准。如果你还没有,可以从 Claude Desktop 开始:它最简单,也是本指南使用的应用。Claude Code、Cursor、VS Code、Windsurf、Zed 和 JetBrains 也适用(如何连接)。
你不需要会编程。你只需要在终端中复制并粘贴几条命令;本指南会准确告诉你要输入哪些命令。
分步安装
什么是终端? 一个用于输入命令的窗口。 **在 Windows 上:**按 Windows 键,输入
PowerShell并打开它。 **在 macOS 上:**按 Cmd + 空格,输入Terminal并打开它。 要粘贴命令:在 Windows 上右键单击,在 macOS 上按 Cmd + V。然后按 Enter。
步骤 1 · 安装 Node.js
从 nodejs.org 下载 LTS 版本,并使用默认勾选的选项安装。然后关闭并重新打开终端,检查:
node --version
应显示 v20 或更高版本(例如 v22.11.0)。
其他安装方式
步骤 2 · 下载工具使用的浏览器
cvlac-mcp 使用自带的 Chromium 副本操作 CvLAC。Chromium 是一种无窗口运行的浏览器。只需下载一次(约 150 MB):
npx -y cvlac-mcp@1 install-browser
最后应显示 Chromium 已安装。
遇到 UNABLE_TO_VERIFY_LEAF_SIGNATURE 或 SELF_SIGNED_CERT_IN_CHAIN 错误怎么办?
杀毒软件(Avast、ESET、Kaspersky……)或你所在大学的网络会使用自己的安全证书检查流量。让 Node 信任系统证书(需要 Node 22.15 或更高版本):
$env:NODE_OPTIONS="--use-system-ca"; npx -y cvlac-mcp@1 install-browser # Windows (PowerShell)
NODE_OPTIONS=--use-system-ca npx -y cvlac-mcp@1 install-browser # macOS / Linux
如果使用较早版本的 Node,请导出杀毒软件或网络的根证书,并通过 NODE_EXTRA_CA_CERTS=/ruta/al/certificado.pem 指定该证书。
为什么不使用 npx playwright install?@1 又是什么意思?
install-browser 使用此软件包自带的 Playwright。npx playwright install 会下载最新版本,可能导致 Chromium 无法被此服务启动(Executable doesn't exist)。
@1 固定了主版本:你可以获得修复,但不会在不知情的情况下遇到不兼容变更。在某些 Linux 发行版上,还需要执行 npx playwright install-deps chromium。
步骤 3 · 保存你的登录信息
请将登录信息保存在用户文件夹中的另一个文本文件里,并确保只有你能读取。
Windows — 在 PowerShell 中执行:
mkdir "$HOME\.config\cvlac-mcp" -Force
notepad "$HOME\.config\cvlac-mcp\.env"
记事本会询问是否创建文件,请回答是。粘贴以下三行,将引号内的内容替换为你的信息,保留单引号,然后按 Ctrl + S 保存:
CVLAC_NOMBRE='Tu primer nombre'
CVLAC_CEDULA='1234567890'
CVLAC_PASSWORD='tu clave'
关闭记事本,并将文件设为只有你的用户可以读取:
icacls "$HOME\.config\cvlac-mcp\.env" /inheritance:r /grant:r "${env:USERNAME}:(R,W)"
macOS / Linux — 粘贴前先更改这三个值,保留单引号:
mkdir -p ~/.config/cvlac-mcp
cat > ~/.config/cvlac-mcp/.env <<'EOF'
CVLAC_NOMBRE='Tu primer nombre'
CVLAC_CEDULA='1234567890'
CVLAC_PASSWORD='tu clave'
EOF
chmod 600 ~/.config/cvlac-mcp/.env
CVLAC_NOMBRE是你在 CvLAC 注册时填写的名字,请保留重音符号和 ñ。- 单引号很重要:如果不加引号,密码中的
#及其后面的内容会被截断。 - 如果桌面或文档文件夹正在与 OneDrive 或 Google Drive 同步,请勿将此文件保存在其中。上面的文件夹不会同步。
不使用记事本创建文件(Windows)
$contenido = @'
CVLAC_NOMBRE='Tu primer nombre'
CVLAC_CEDULA='1234567890'
CVLAC_PASSWORD='tu clave'
'@
[IO.File]::WriteAllText("$HOME\.config\cvlac-mcp\.env", $contenido)
带单引号的 @'...'@ 不会改动密码中的 $;@"..."@ 则会改动。WriteAllText 会以 UTF-8 保存。如果文件使用了其他编码——Out-File 和 > 会以 UTF-16 保存,Set-Content 会以 ANSI 保存——cvlac-mcp 可以检测到并正确读取,还会在启动时将其记录到日志中。
- 打开 Claude Desktop,前往 设置 → 开发者 → 编辑配置(英文界面为:
Settings → Developer → Edit Config)。系统会打开包含
claude_desktop_config.json文件的文件夹:用记事本或 TextEdit 打开该文件。 - 粘贴适用于你系统的代码块,将
TU_USUARIO替换为你的电脑用户名。要查看用户名: 在 PowerShell 中运行echo $env:USERNAME,或在 macOS 终端中运行whoami。
Windows:
{
"mcpServers": {
"cvlac-mcp": {
"command": "cmd",
"args": ["/c", "npx", "-y", "cvlac-mcp@1"],
"env": {
"CVLAC_ENV_FILE": "C:\\Users\\TU_USUARIO\\.config\\cvlac-mcp\\.env"
}
}
}
}
macOS(在 Linux 中,路径以 /home/ 开头,而不是 /Users/):
{
"mcpServers": {
"cvlac-mcp": {
"command": "npx",
"args": ["-y", "cvlac-mcp@1"],
"env": {
"CVLAC_ENV_FILE": "/Users/TU_USUARIO/.config/cvlac-mcp/.env"
}
}
}
}
- 保存并完全退出 Claude Desktop;仅关闭窗口还不够。在 Windows 中,右键单击时钟旁边的图标 → 退出。在 macOS 中,按 Cmd + Q。然后重新打开应用。
常见问题:
- 如果文件中已有内容,请勿替换:将
"cvlac-mcp": {...}添加到现有的"mcpServers"中,并用逗号隔开。 - 在 Windows 中,路径中的反斜杠必须写成双反斜杠(
\\),因为该文件是 JSON。cmd /c必须放在前面,因为在 Windows 中,npx不是程序,而是脚本。 CVLAC_ENV_FILE是必需的:它用于告诉 cvlac-mcp 第 3 步的文件所在位置。
步骤 5 · 测试
在 Claude Desktop 中新建一个聊天,然后输入:
- “登录 CvLAC”——它应回复已登录。
- “显示我在 CvLAC 上的学历信息”——它应列出你已有的信息。
如果两项都正常,就设置完成了。首次连接可能需要约 15 秒,因为需要下载软件包;如果显示未连接,请稍等片刻,然后重启 Claude Desktop。
遇到问题?→ 常见问题。
其他 AI 应用
所有应用的配置都与步骤 4 相同;只需更改粘贴配置的位置。
| 应用 | 配置位置 |
|---|---|
| Claude Code | 使用命令,见下文 |
| Cursor | ~/.cursor/mcp.json · Windows:%USERPROFILE%\.cursor\mcp.json |
| VS Code(Copilot,Agent 模式) | 命令面板 → MCP: Open User Configuration。键名是 "servers",而不是 "mcpServers",且每个服务还需添加 "type": "stdio" |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
| Zed | settings.json 中的 "context_servers" 下,并添加 "source": "custom" |
| JetBrains | Settings → Tools → AI Assistant → Model Context Protocol (MCP) → Add;支持相同的 JSON |
Claude Code:
# macOS / Linux
claude mcp add cvlac-mcp --scope user -e CVLAC_ENV_FILE=$HOME/.config/cvlac-mcp/.env -- npx -y cvlac-mcp@1
# Windows, desde Git Bash
MSYS_NO_PATHCONV=1 claude mcp add cvlac-mcp --scope user -e 'CVLAC_ENV_FILE=C:\Users\TU_USUARIO\.config\cvlac-mcp\.env' -- cmd /c npx -y cvlac-mcp@1
在 Git Bash 中,如果不设置 MSYS_NO_PATHCONV=1,/c 会被转换为 C:/,导致服务无法连接。从
PowerShell 执行该命令会报错 unknown option '-y',因为 PowerShell 会吞掉 --:请使用 Git Bash、
在参数前加上 --%,或粘贴 Windows 的 JSON 并运行 claude mcp add-json。
可以让它做什么
用西班牙语自然地交流。以下是一些示例:
| 你想…… | 可以这样说…… |
|---|---|
| 查看已有内容 | “显示我在 CvLAC 中的课程” |
| 查看完整记录 | “显示项目 X 保存的所有数据” |
| 添加内容 | “添加我在 2025 年修读的课程‘科学写作’,共 40 小时” |
| 更正内容 | “我的学历信息中,硕士学位于 2019 年结束,而不是 2018 年” |
| 删除内容 | “删除活动‘测试’”——操作前会要求你确认 |
| 根据 DOI 准备文章 | “查找这个 DOI,并在登记前向我显示数据:10.… ” |
| 登记成果 | “登记我的 DOI 为 10.… 的文章”或“添加我担任某篇硕士论文评审人的经历……” |
| 更新个人资料 | “将我的个人资料文本替换为:……” |
| 添加学术网络 | “添加我的 ORCID:https://orcid.org/0000-0000-0000-0000” |
| 更新履历 | 粘贴履历文本并说:“将这些内容与我的 CvLAC 进行比较,告诉我还缺少什么。暂时不要做任何更改。” |
建议:
- 先查看,再更改。“告诉我你会添加什么,但不要保存任何内容”是不错的起点。
- **提供完整信息:**日期、机构、小时数、范围(国内或国际)。如果缺少 CvLAC 要求的数据,助手会提醒你,而不是凭空编造。
- 在 CvLAC 中检查写入的内容。履历中的信息由你负责;助手虽然会核实每次保存,但仍可能误解你的要求。
如何保护你
CvLAC 没有撤销按钮,因此 cvlac-mcp 宁可先询问,也不愿出错:
- **未经询问,不会创建重复项。**如果你要添加的内容与已有内容相似,它不会写入任何内容,而是向你展示相似项。
- **不会立即删除。**任何删除操作都需要再次确认,包括移除学术网络或研究领域。
- **不会替你选择。**如果机构名称在 CvLAC 目录中匹配到多个结果——其中有 6 所“安第斯大学”——它会向你展示这些选项。
- **不会编造数据。**如果缺少数据,它会提醒你,而不是随便填入听起来合理的内容。
- 核实结果。它不会仅仅因为已发送表单就认为内容已保存:它会查看 CvLAC 的响应;如果仍有疑问,就会重新读取记录。如果 CvLAC 在保存过程中途发生故障,它会告诉你无法确认保存结果,让你先检查,再决定是否重试。
- **说明失败原因。**如果 CvLAC 拒绝表单,它会告诉你是哪个字段出了问题,以及原因。
- **保护你的账户。**如果 CvLAC 拒绝你的密码,它不会再次尝试,以免导致你的账户被锁定。此外,它还会控制访问 CvLAC 的频率,避免使其过载。
常见问题
明明填写了凭据,却提示“缺少凭据”
消息会说明缺少哪些数据,以及查找了哪个文件:
- “不存在”: 配置中的
CVLAC_ENV_FILE路径(步骤 4)没有指向该文件。检查用户是否正确;在 Windows 上,还要确认反斜杠是双写的。 - “没有找到任何变量”: 文件存在,但为空或格式有误。每行必须是
NOMBRE='valor'。 - “没有包含这些变量”: 检查变量名是否与步骤 3 中完全一致。
CvLAC 拒绝了登录
cvlac-mcp 只尝试了一次,以免锁定你的账户。请检查文件中的内容:
CVLAC_NOMBRE:你的名字,包含重音符号,且与注册时填写的一致。CVLAC_CEDULA:仅填写数字,不要加句点。CVLAC_PASSWORD:用单引号括起来。
再次尝试之前,请使用相同的数据手动登录 CvLAC。
Claude Desktop 中没有显示 cvlac-mcp,或显示为已断开连接
- 编辑配置后,你是否完全退出了 Claude Desktop?(步骤 4,第 3 点)
- 检查 JSON 是否有效:代码块之间有逗号、括号已闭合、Windows 上的反斜杠已双写。
- 首次下载需要一些时间:等待一分钟,然后重启。
- 在 macOS 上,如果你通过 nvm 或 Homebrew 安装了 Node,Claude Desktop 可能找不到
npx。请填写完整路径:在终端中运行which npx即可查看(例如/opt/homebrew/bin/npx),并将其填入"command"。
Executable doesn't exist 或浏览器无法打开
缺少浏览器,或浏览器版本不匹配。请重新执行步骤 2:npx -y cvlac-mcp@1 install-browser。在 Linux 上,如果浏览器已安装但无法启动,则缺少系统库:npx playwright install-deps chromium。
CvLAC 已宕机或返回 5xx 错误
MinCiencias 经常宕机。cvlac-mcp 会检测到这种情况并耐心重试;如果服务仍然宕机,它会告知你,而不会将你的履历报告为空。请稍等一会儿再试。如果问题发生在保存过程中,请先检查 CvLAC 中是否已保存,然后再重试。
还有其他问题?请提交一个 issue,但不要附上你的个人数据,也不要附上包含个人信息的截图。
安全与隐私
具体来说,你的数据会如何处理:
- 你的凭据不会离开你的电脑。 它们存放在第 3 步的文件中。cvlac-mcp 会在
启动时读取这些凭据,并且只会将其填入
scienti.minciencias.gov.co的登录表单。 - 没有中间服务器、账户、遥测或分析。 cvlac-mcp 作为程序在你的 电脑上运行,并直接与 AI 应用通信。只有在你请求只读 DOI 查询时,它才会连接到 CvLAC、你配置的个人资料库和 api.crossref.org。
- 你的 AI 助手确实能看到你的简历。 但看不到你的凭据——cvlac-mcp 不会返回凭据;它能看到从 CvLAC 读取的内容,因为这些内容会发送到聊天中。如果你的简历包含敏感数据,选择应用时请考虑这一点。
- 会话的安全性不亚于你的密码。 为避免每一步都要求输入密码,cvlac-mcp 会将会话保存在用户文件夹中的
.cvlac-session.json。只要会话仍然有效,任何复制了该文件的人都能进入你的 CvLAC 并进行修改,无需你的密码。在 macOS 和 Linux 上,该文件仅对你可读;在 Windows 上,它会继承用户文件夹的权限。要手动限制权限:chmod 600 ~/.cvlac-session.json(macOS/Linux)或icacls "$HOME\.cvlac-session.json" /inheritance:r /grant:r "${env:USERNAME}:(R,W)"(Windows)。 - 不要将数据文件或会话文件放在同步文件夹中(OneDrive、Google Drive、Dropbox)。本指南中的路径不在此类文件夹中。
- **要结束会话,**请删除
.cvlac-session.json。下次运行时,cvlac-mcp 会重新登录。 - 日志不会显示机密信息。 即使启用详细模式进行调试,密码、身份证号和 Cookie 也会显示为
***。如果配置了CVLAC_LOG_FILE,该文件会以仅限你的用户访问的权限(0600)创建。 - 屏幕截图可能包含个人数据。 分享前请先检查。
- 经过身份验证的浏览仅限 CvLAC。
inspect_form、screenshot和内部链接只接受scienti.minciencias.gov.co上的 HTTPS;file://、其他主机以及删除/保存等操作链接都会被拒绝。 - 浏览器默认保留 Chromium 沙箱。 只有无法以这种方式启动浏览器的环境才应明确设置
CVLAC_NO_SANDBOX=true,并了解这会带来额外风险。 - **如果怀疑信息已泄露,**请更改 CvLAC 密码并删除会话文件。
负责任地使用
- 此工具使用你自己的账户和自己的数据,自动操作哥伦比亚政府网站。它不会绕过身份验证、访问他人的简历,也不会使用任何隐藏 API:它做的和你在浏览器中的操作一样,只是更快。
- 使用前请查看 ScienTI/MinCiencias 的使用条款以及所在机构的政策。
- 始终由人工监督。 应先查看更改,再决定是否应用;不要让它在无人查看的情况下运行,也不要将其设置为自动运行。
- 不要同时对多个账户运行,也不要提高请求频率。
- 简历中的内容由你负责。 这是一份会影响征集和评估结果的声明:请在 CvLAC 中核实已写入的内容。
独立项目。 本项目与 MinCiencias 无关联,也未获得该机构背书。它不复制该机构的徽标或视觉形象:上方的符号是原创设计——由环绕在汇聚线条中的 JSON-RPC 花括号
{ }组成;「CvLAC」「ScienTI」和「MinCiencias」仅用于标识此服务所连接的系统。
更新或卸载
- 更新: 无需执行任何操作。使用
cvlac-mcp@1时,每次打开 AI 应用都会使用最新的 1.x 版本。如果以后发布 2.x 版本,请在配置中将@1改为@2(请先阅读 ROADMAP 了解变更内容)。 - 查看当前版本:
npx -y cvlac-mcp@1 --version。 - 卸载: 从应用配置中移除
"cvlac-mcp"配置块,并删除用户文件夹中的.config/cvlac-mcp文件夹和.cvlac-session.json文件。
面向开发者
以下内容适用于希望审查代码、贡献代码、直接使用 MCP 工具或将 CvLAC 与网页作品集进行比较的开发者。
基于 TypeScript + Playwright 的 MCP(stdio)服务,采用严格 ESM,使用 Vitest 在 Linux、Windows 和 macOS 上进行测试。已验证的内容、尚待完成的事项和已知限制请参阅 ROADMAP。
从源代码安装
适用于开发、贡献或审查代码的情况。如果你只想使用服务,逐步安装指南更简短。请按顺序执行步骤;每一步都包含验证,以免在环境有问题时继续操作。
步骤 0 - 前置条件(所有平台)
需要 Node.js 20 或更高版本、npm 10+ 和 git。
| 平台 | Node 20+ 安装方式 |
|---|---|
| Linux(Debian/Ubuntu) | curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - && sudo apt-get install -y nodejs git |
| Linux(任意发行版,推荐) | 安装 nvm,然后运行 nvm install 20 && nvm use 20 |
| macOS | 通过 Homebrew 运行 brew install node@20 git,或使用 nvm |
| Windows | 运行 winget install OpenJS.NodeJS.LTS 和 winget install Git.Git(或通过 nodejs.org 获取安装程序) |
验证(bash、zsh 或 PowerShell 均适用):
node --version # debe mostrar v20.x o superior
npm --version # debe mostrar 10.x o superior
git --version
步骤 1 - 克隆仓库
Linux / macOS(bash 或 zsh):
cd ~/dev # o la carpeta que prefieras
git clone https://github.com/stivenson/cvlac-mcp.git
cd cvlac-mcp
Windows(PowerShell):
cd $HOME\dev # crea la carpeta antes si no existe: mkdir $HOME\dev
git clone https://github.com/stivenson/cvlac-mcp.git
cd cvlac-mcp
步骤 2 - 安装依赖并编译
三个平台的操作相同:
npm install
npm run build
验证: 编译后的入口文件 dist/index.js 应已存在。
# Linux / macOS
ls dist/index.js
# Windows (PowerShell)
Test-Path dist\index.js # debe imprimir True
步骤 3 - 安装 Playwright 浏览器
该服务使用无头 Chromium 自动操作 CvLAC。请下载与项目所用 Playwright 版本相对应的构建版本:
node dist/index.js install-browser
在 Linux 上,如果缺少系统库,也请安装原生依赖:
npx playwright install-deps chromium # requiere sudo en algunas distros
步骤 4 - 配置环境变量(.env)
复制模板并编辑值:
Linux / macOS:
cp .env.example .env
Windows(PowerShell):
Copy-Item .env.example .env
使用你的数据编辑 .env:
CVLAC_NOMBRE='TuNombre'
CVLAC_CEDULA='TuDocumento'
CVLAC_PASSWORD='TuPassword'
PORTFOLIO_URL='https://tu-usuario.github.io'
# Opcional: por defecto, .cvlac-session.json en tu carpeta de usuario
# CVLAC_SESSION_PATH='/ruta/a/tu/.cvlac-session.json'
限制文件权限(Linux/macOS):
chmod 600 .env
在 Windows 上,chmod 的对应命令是
icacls .env /inheritance:r /grant:r "${env:USERNAME}:(R,W)"。
按平台设置 CVLAC_SESSION_PATH(示例,如需更改):
- Linux:
/home/TU_USUARIO/.cvlac-session.json - macOS:
/Users/TU_USUARIO/.cvlac-session.json - Windows:
C:\\Users\\TU_USUARIO\\.cvlac-session.json
步骤 4b - 配置默认值(cvlac.config.json)
CvLAC 的多个表单要求填写你的作品集里没有的字段(市镇、每周课时、语言)。在此处统一声明:
cp cvlac.config.example.json cvlac.config.json
{
"portfolioUrl": "https://tu-usuario.github.io",
"defaults": {
"municipio": { "nombre": "Bogotá", "codigoDane": "11001" },
"institucionFallback": "Universidad Nacional de Colombia",
"horasSemanales": 1,
"idioma": "ES",
"pais": "CO"
}
}
所有字段均为可选。如果缺少某个值,该字段会留空,响应中会附带警告——服务不会为你的简历编造数据。
步骤 4c - 整理项目、软件和活动(data/portfolio-extra.json)
这三个部分无法从作品集中读取:它们需要只有 CvLAC 才有的元数据(项目类型、DANE 代码、枚举代码)。需要手动维护:
cp data/portfolio-extra.example.json data/portfolio-extra.json
文件在加载时会进行验证;如果某个条目格式不正确,服务会报告问题并继续处理其他部分。
步骤 5 - 在你的应用中注册 MCP
与分步安装相同,只需将 npx 替换为 node,并将路径改为你的
dist/index.js。无需设置 CVLAC_ENV_FILE:克隆后,服务会读取仓库根目录下的 .env 文件。
{
"mcpServers": {
"cvlac-mcp": {
"command": "node",
"args": ["/home/TU_USUARIO/dev/cvlac-mcp/dist/index.js"]
}
}
}
- macOS:
"/Users/TU_USUARIO/dev/cvlac-mcp/dist/index.js" - Windows:
"C:\\Users\\TU_USUARIO\\dev\\cvlac-mcp\\dist\\index.js"(JSON 中使用双反斜杠;此处无需cmd /c, 因为node是可执行文件) - Claude Code:
claude mcp add cvlac-mcp --scope user -- node /ruta/a/cvlac-mcp/dist/index.js - 各应用中 JSON 的位置:其他 AI 应用。
**只将凭据保存在
.env中。**应用配置文件通常没有严格的权限限制,或者会在多台机器间同步。即使你仍将凭据放在env块中,它们也会优先于.env。
步骤 6 - 验证安装
-
构建和测试均通过:
npm run build npm test -
启动服务(基本检查;服务会通过 stdio 等待,请用
Ctrl+C关闭):node dist/index.js -
**在你的编辑器中:**重启编辑器(Claude Desktop 需要完全退出),并确认
cvlac-mcp已启用且列出了工具——在 Cursor 中查看 Settings → MCP,在 Claude Code 中运行claude mcp list或/mcp,或查看 VS Code 中 Agent 聊天的工具选择器。 -
在编辑器的聊天窗口中按以下顺序进行基本功能测试:
login(应完成身份验证并持久化会话)- 使用
section: "formacion"调用read_cvlac(应返回 CvLAC 中已有的内容) - 如果配置了作品集:先调用
read_portfolio,再调用diff
如果响应没有错误,则 MCP 已正确安装和配置。
高级配置
使用服务不需要进行以下配置。通过 npx 安装时,每个文件的路径都通过应用配置中同一 env 块内的变量指定,与 CVLAC_ENV_FILE 并列;克隆后,则从仓库根目录读取。
| 变量 | 指向 | 用途 |
|---|---|---|
CVLAC_CONFIG_PATH | 你的 cvlac.config.json | CvLAC 要求但你的来源没有的默认值:市镇、备用机构、每周小时数、语言、国家、作品集 URL(格式) |
CVLAC_PORTFOLIO_EXTRA_PATH | 你的 portfolio-extra.json | 手动整理的项目、软件和活动,以便纳入 diff(格式) |
建议:将它们保存在 .env 旁边的 ~/.config/cvlac-mcp/ 中。如果缺少默认值,该字段会留空,响应中会附带警告:服务绝不会为简历编造数据。
与作品集比较(diff 和 sync)
diff 会将 CvLAC 与网页作品集进行比较,并将每个条目分为四组:缺失、
待更新、相似(已有类似内容:由人工决定)和最新。sync
默认会预览;只有在调用时设置 dry_run: false,才会应用缺失项和待更新项,并且永远不会应用相似项。
重要限制:read_portfolio 是为特定网站构建的——一个带有 #/resume 路径、包含经历、教育和课程标签页,以及“杰出成就”版块的 React 应用。如果找不到这种结构,它会返回空列表,并在日志中发出警告。项目、软件和活动并非来自网站,而是来自 portfolio-extra.json。以下内容也不会纳入 diff:专业经历(公司名称差异太大)、语言、研究方向及其他工作。
将数据源与引擎分离——让 diff 接受标准化的简历 JSON,无论它来自 PDF、ORCID 还是口述——已列入 ROADMAP。
建议的流程:
login- 使用
dry_run: true调用sync - 与人工一起检查报告:缺失项、待更新项、相似项和最新项
- 逐一处理相似项——对现有条目使用
update,或使用add并设置confirm_duplicate:true - 应用其余更改:使用
dry_run: false调用sync,或逐项使用update_section,并检查warnings - 使用受影响版块的
read_cvlac或read_cvlac_detail进行验证
read_portfolio ─┐
├─► diff ─► sync (dry_run → apply) ─► update_section (add / update / delete)
read_cvlac ─────┘
如果你使用 Claude Code,客户端工作区中的 cvlac-sync skill 封装了这一流程。
MCP 工具参考
| 工具 | 功能 |
|---|---|
login | 在 CvLAC 中进行身份验证并持久化会话。force:true 会重新登录。被拒绝时不会重试 |
read_cvlac | 读取一个或所有版块(all) |
read_cvlac_detail | 打开某个条目的完整档案(按版块和标签指定),并返回字段/值对。列表显示两列或三列;这是查看实际保存内容的方式 |
read_profile | 读取 CvLAC 保存为单条记录的内容:个人简介文本、学术社交网络表格和研究领域。这些内容不会出现在 read_cvlac 中 |
update_profile | 写入个人简介、社交网络和/或研究领域(详情见下文) |
read_portfolio | 渲染 PORTFOLIO_URL 中的作品集,并将其与 portfolio-extra.json 合并 |
diff | 将 CvLAC 与作品集进行比较:missing、toUpdate、similar、upToDate |
lookup_doi | 查询 Crossref,不进行写入,并返回待审核的文章草稿 |
complete_product | 完成现有成果的第二阶段:替换并排序关键词、研究领域、合作者和荣誉;对于论文,会关联学生及其参与情况。dry_run:true 可预览;移除值需要设置 confirm_delete:true |
update_section | 应用单项更改:add、update 或 delete |
sync | 执行 diff 并默认预览;dry_run:false 会应用 missing 和 toUpdate。similar 永远不会自动应用 |
screenshot | 截取给定的 url,或截取最近访问的列表、档案或表单,并按当前状态重新加载。会拒绝操作链接(删除、保存):在 CvLAC 中打开这类链接会执行操作 |
inspect_form | 列出 CvLAC 安全页面上的实际字段(input/select/textarea)、字段选项及必填项;不会打开其他主机或操作链接 |
工具失败时会返回 isError: true。needs_confirmation 和 unverified 不属于错误:它们要求人工决定或检查。
complete_product
label 用于查找现有产品,操作会接收一个或多个完整列表:
keywords:按顺序排列的关键词。areas:按名称或 CvLAC 代码排列的知识领域。coauthors:从先前登记的个人资料目录中按顺序排列的合著者姓名; 简历所有者会自动保留。recognitions:从 CvLAC 简历中已登记的表彰中按顺序排列的表彰标题。students:仅适用于tesis;对象为{name, participation, person_id?}。participation接受TUT、ASE、COT、ORI或对应标签(Tutor、Asesor、Cotutor、Orientado)。如果省略, 则使用ORI。
这些列表会替换已存储的内容。如果操作会移除现有值,则会先返回
needs_confirmation,并附带 removed;使用 confirm_delete:true 重复操作。无法解析或对应多个个人资料的人会出现在 choices 中,且不会写入任何内容。
update_section
分区:formacion、formacionComple、experiencia、cursos、reconocimientos、proyectos、
software、eventos、idiomas、lineas、demasTrabajos、articulos、libros、capitulos、
tesis、jurados、informesTecnicos、innovacionesProceso、productosTecnologicos、consultorias、
prototipos。每个分区的 data 架构见
src/schemas.ts;格式错误的字段会在打开浏览器前指出名称并拒绝。
status | 含义 |
|---|---|
ok | 已保存。仍请检查 warnings:其中包含未填写的字段 |
needs_confirmation | **未写入任何内容。**有三种原因:similar 中有相似条目(使用 confirm_duplicate:true 重试,或执行 update);机构有歧义,候选项列在 choices 中(使用 data.institucionId 重试);或者执行了未设置 confirm_delete:true 的 delete |
failed | CvLAC 拒绝了表单。message 包含其错误,并指出相关字段 |
unverified | 已提交,但无法确认,通常是因为 CvLAC 中途故障。不要盲目重试:请使用 read_cvlac_detail 验证 |
更多详情:
- 如果
update未能更改表单中的任何字段,则不会提交:会返回带有警告的failed。 - 精确匹配的机构会自动解析。目录中存在精确重复项——有 6 个“Universidad de los Andes”——因此仅凭名称有时不足以确定机构。
- formacionComple 使用与
formacion相同的表单,但采用另一套级别目录(Y其他、8延伸教育、F短期课程、EMBA),并包含startMonth。只有 CvLAC 已为该机构和级别登记的学术项目才能执行add。 - libros:
certificateCLCDO和certificateCLRI是指向实际表单中两份 PDF 证书的可选本地路径。提交前会验证%PDF-签名、扩展名、文件是否存在以及 2 MiB 的大小上限。CvLAC 不会将这些文件作为表单值返回,因此仅编辑证书可能会返回unverified;请先确认档案再重试。 - demasTrabajos:
name、year、month、medio(纸质、互联网或其他)、finalidad,以及可选的idioma和ciudad。表单默认预选 Enero 和 Papel:如果缺少month或medio,则会保存这些默认值并发出提醒。 - idiomas:
language(西班牙语名称或 2 个字母的 ISO 代码)以及read/write/speak/listen级别;也可以使用level一次设置所有级别:Deficiente、Aceptable 或 Bueno。 - lineas:
name、active(默认为true,并会发出提醒)和objective。 - experiencia:CvLAC 表单没有职位字段;如果条目包含
role,系统会提示该字段未写入。
update_profile
description会替换个人简介文本。不能为空:CvLAC 将其标记为必填项(最多 3950 个字符)。networks会与已保存的内容合并:CvLAC 表单会重写整张表,因此工具会先读取现有内容,再一并提交。url:null会移除一个网络,并要求设置confirm_delete:true。接受的网络包括:google_scholar、researchgate、ssr、ssrn、academia_edu、mendeley、linkedin、repositorios_disciplinares、repositorios_institucionales、researcher_id、scopus_author_id、orcid和otro(在label中填写其名称)。areas是完整的研究领域列表,顺序不可更改——第一项为主要领域——可使用名称或 CvLAC 代码(0-1B01)。它会替换已保存的内容:遗漏任何一项都意味着删除该项,并要求设置confirm_delete:true。目录包含 3 个级别的 267 个领域;如果名称存在歧义,会在choices中返回选项,而不会自行猜测。
环境变量
在 .env 中定义,或在应用配置的 env 区块中定义;后者优先级更高。
| 变量 | 描述 |
|---|---|
CVLAC_NOMBRE | 用于登录 CvLAC 的名字 |
CVLAC_CEDULA | 身份证件 |
CVLAC_PASSWORD | CvLAC 密码 |
CVLAC_ENV_FILE | .env 文件的位置。通过 npm 安装时必不可少,因为服务从 npx 缓存中运行。应在应用配置中设置,而不是 .env 中 |
CVLAC_SESSION_PATH | 会话保存位置。默认保存到用户文件夹中的 .cvlac-session.json |
PORTFOLIO_URL | 要比较的作品集。也可在 cvlac.config.json 中通过 portfolioUrl 配置 |
CVLAC_CONFIG_PATH | cvlac.config.json 的位置 |
CVLAC_PORTFOLIO_EXTRA_PATH | portfolio-extra.json 的位置 |
CVLAC_HEADLESS | 设置为 false 可打开浏览器查看运行情况 |
CVLAC_NO_SANDBOX | 设置为 true 可仅在无法启动 Chromium sandbox 的环境中将其禁用;不建议使用 |
CVLAC_LOG_LEVEL | debug | info(默认)| warn | error | silent。日志输出到 stderr |
CVLAC_LOG_FILE | 除 stderr 外,还会将每行日志追加到此文件 |
CVLAC_USER_AGENT | 替换 user-agent。默认使用实际 Chromium 的 user-agent,与系统相符 |
启动时,服务会在 stderr 中写明读取的 .env 文件:
env file: <ruta> (found, 3 vars)、NOT FOUND,或者在文件不是 UTF-8 编码时显示 read as utf16le / read as latin1。
请求节奏
请求过于密集时,CvLAC 会开始返回 5xx。服务会在每次导航之间留出间隔,采用退避策略重试;如果网站连续拒绝多个请求,服务会停止重试,直到冷却时间结束。默认值适用于正常的 sync;如果连续遇到 503,请调高这些值:
| 变量 | 默认值 | 描述 |
|---|---|---|
CVLAC_MIN_REQUEST_GAP_MS | 900 | 两次请求之间的最短等待时间 |
CVLAC_REQUEST_JITTER_MS | 700 | 加到等待时间上的随机时长,以避免呈现机械式请求节奏 |
CVLAC_NAV_TIMEOUT_MS | 30000 | 等待页面加载的时间 |
CVLAC_NAV_MAX_ATTEMPTS | 3 | 每次导航的尝试次数(5xx 或超时)。设置为 1 可禁用重试 |
CVLAC_BACKOFF_BASE_MS | 2000 | 首次失败后的等待时间;每次重试时翻倍 |
CVLAC_BACKOFF_CAP_MS | 30000 | 等待时间上限 |
CVLAC_OUTAGE_THRESHOLD | 3 | 连续失败多少次导航后停止请求 |
CVLAC_OUTAGE_COOLDOWN_MS | 120000 | 停止请求后静默等待的时长 |
架构
src/
├── index.ts # Entry point: subcomandos, carga del .env, stdio transport
├── cli.ts # install-browser, --version, --help
├── env.ts # Ubicación y lectura del .env (UTF-8, UTF-16 o ANSI)
├── server.ts # Registro de tools MCP, isError
├── types.ts # Tipos de portfolio/CvLAC/diff/update
├── schemas.ts # Un schema zod por sección
├── config.ts # cvlac.config.json
├── logger.ts # Logs a stderr, con secretos ocultos
├── diff.ts # Motor de comparación (normalize + nameMatches)
├── browser/
│ ├── session.ts # Login, sesión persistente, Playwright context
│ ├── navigation.ts # URLs de listas y formularios CvLAC
│ ├── navigate.ts # Toda navegación: ritmo, reintentos, cortes
│ ├── pacing.ts # Espaciado de peticiones y backoff
│ ├── availability.ts # Distingue "CvLAC caído" de un error propio
│ └── catalogue.ts # Catálogos de CvLAC (municipios, instituciones)
├── tools/
│ ├── login.ts read-cvlac.ts read-cvlac-detail.ts read-portfolio.ts diff.ts sync.ts
│ ├── update-section.ts # add/update/delete por sección
│ ├── write-verdict.ts # ¿Se guardó? saved / rejected / unverified
│ ├── profile.ts # Perfil y redes académicas
│ ├── areas.ts # Áreas de actuación
│ └── screenshot.ts
└── extractors/
├── portfolio.ts # Renderiza el portafolio + portfolio-extra.json
└── cvlac/ # Un extractor por sección, sobre rows.ts
已导致过问题的设计决策和 CvLAC 的注意事项见
CLAUDE.md;经实际验证的 URL、列和字段名称见
docs/cvlac-findings.md。
测试与构建
npm test # suite completa: sin red, sin credenciales, sin CvLAC
npm run build # compila src/ a dist/, que es lo que ejecuta la app
npm run dev # corre src/ con tsx, sin compilar
npm run test:watch
测试涵盖提取器(使用匿名化 HTML fixture)、diff 引擎、schemas、配置和 .env 加载、日志中的密钥脱敏、sync 报告、MCP 边界以及详细信息卡片读取。fixture 特意使用虚构数据:如果你为新测试捕获了真实 HTML,请在提交前将其匿名化。
smoke 工作流在 Linux、Windows 和 macOS 上运行:编译、运行测试、使用 install-browser 安装 Chromium,并执行 scripts/smoke.mjs,以检查启动、MCP 协议、已注册的工具、不包含凭据的消息以及浏览器是否能打开。另一个 job 会在 PowerShell 5.1 和 7 中以三种常见方式写入 .env,并验证服务能否读取。手动触发时,它还会测试从 npm 安装后的软件包。
实时测试套件(可选,会写入你的真实 CvLAC)
CVLAC_E2E=1 npm run test:e2e:live # las secciones con lista
CVLAC_E2E=1 npm run test:e2e:live -- --sections=cursos # solo una
CVLAC_E2E=1 npm run test:e2e:live -- --sections=perfil # perfil y redes
针对你的真实账户,按板块遍历完整 CRUD 流程:列表 → add → 列表 → read_cvlac_detail → 重复执行 add(应返回 needs_confirmation)→ update → 查看详情以确认更改 → delete → 最终列表。它创建的每个条目都带有前缀 ZZ PRUEBA MCP,并且总会尝试删除这些条目;如果有任何条目残留,会在最后报告,供你手动删除。--sections=perfil 会创建快照,在无人使用的网络上写入数据,编辑并删除它,然后恢复原有内容。
这是唯一会操作真实数据的测试套件,因此需要 CVLAC_E2E=1,且不会随 npm test 运行。它与 dist/index.js 通信,因此要在 npm run build 之后运行。报告保存在 tests/e2e/report-<fecha>.json(已加入 gitignore)。
开发问题
- **应用使用的是旧版代码:**修改
src/后运行npm run build。应用运行的是dist/index.js,而不是src/index.ts。 - **应用中没有显示(克隆安装):**检查
args中指向dist/index.js的绝对路径;在 Windows 上使用双反斜杠,然后重启应用。 - **表单未保存某个字段:**CvLAC 的多个字段是
readonly,由 JS 填写。使用inspect_form查看实际名称,使用CVLAC_HEADLESS=false查看浏览器,并使用CVLAC_LOG_LEVEL=debug查看每个字段的详细信息。 diff中误报缺失项:nameMatches()会规范化重音符号和后缀((en línea)、- Aprobado ...);经验部分有意不纳入 diff。
状态与路线图
原有的 11 个板块、个人资料、学术网络和研究领域均支持读取和写入(add/update/delete),并已针对真实 CvLAC 验证 CRUD。文章、图书、章节、论文、评审和技术成果板块也已实现。文章的完整 CRUD 已在真实环境中验证;技术报告和咨询项目已验证新增、列表、详情、重复项拦截和删除。某些编辑字段取决于真实表单的变化,相关情况已记录在路线图中。diff 和重复项拦截也通过 JMesa 分页覆盖完整列表。
complete_product 已可为现有成果补全关键词、研究领域、共同作者和认可信息,并关联参与论文项目的学生。图书在 update_section 中也支持本地路径 certificateCLCDO 和 certificateCLRI;每个 PDF 最大为 2 MiB。该操作已通过临时记录完成端到端验证。
完整详情、已知限制及后续计划: 路线图。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。