dt-ai-mcp
v1.0.7
Published
MCP server for asset operations in Cursor
Readme
dt-ai-mcp
在 Cursor 等支持 MCP 的 IDE 中连接 AI管理平台(OAuth2 设备码登录)。
功能
auth_login:methods/start/poll/status(OAuth2 设备码)auth_me:当前用户auth_logout:退出登录并清理本地凭证assets_search:查询资产列表assets_detail:按 ID 查单条详情(assetType可选;不传时由后端按统一 ID 自动识别)assets_download:按 ID 导出资产(rule/skill 通过dir指定导出根目录;不传时按CLIENT_TYPE推断默认目录)assets_update:更新资产(仅 rule/skill);可传dir由 MCP 自动把本地目录转换后提交更新(不传时按CLIENT_TYPE推断并要求确认)assets_create:创建资产(仅 rule/skill,权限由后端拦截)
使用
npx -y dt-ai-mcp@latest在 Cursor 的 MCP 配置里将启动命令设为上述命令,并配置下方环境变量。
环境变量
export BASE_URL="http://localhost:8080"
export CLIENT_TYPE="cursor" # cursor | workbuddy补充说明(重点:CLIENT_TYPE)
为避免“为什么这次没提示选择目录/CLIENT_TYPE”的疑惑,建议按下面规则理解:
参数优先级:
dir>CLIENT_TYPE> 补参提示- 传了
dir:直接按dir执行,不看CLIENT_TYPE - 没传
dir但有CLIENT_TYPE:按CLIENT_TYPE推断默认目录 - 两者都没有:返回
needMoreInput=true,提示补CLIENT_TYPE或直接传dir
- 传了
CLIENT_TYPE只接受两个值(不区分大小写,内部会转小写):cursor:默认目录{工作区}/.cursorworkbuddy:默认目录{工作区}/.workbuddy- 通用规则:默认目录 =
{工作区}/.${CLIENT_TYPE} - 其他值会被当作未配置处理
{工作区}的来源:- 直接使用当前运行目录
各动作行为差异:
assets_download:cursor/workbuddy:未传dir且未传useGlobalDir时会先补问“是否全局导出”- 其余情况:
useGlobalDir=true走固定全局目录(需CLIENT_TYPE且会校验写权限);否则走工作区默认目录
assets_create/assets_update:未传dir时,除推断目录外还需要confirmDefaultDir=true才继续
常见原因与排查:
- 改了
.cursor/mcp.json但行为没变化:通常是 MCP 进程未重启,重启后再试 - 仍提示缺少
CLIENT_TYPE:确认配置写在当前工程的 MCP serverenv下,而不是其他工程 - 希望行为稳定可预期:调用时显式传
dir,不依赖默认推断
- 改了
登录(设备码)
推荐按下面的“用户可理解流程”执行:
- 调用
auth_login,{ "action": "start" } - 把返回的
verificationUriComplete原样发给用户,让用户点击并在浏览器完成授权 - 用户回复“已授权”后,调用
auth_login,{ "action": "poll" } - 调用
auth_me确认已登录
可直接发给用户的话术:
请点击此链接完成授权:
verificationUriComplete。完成后回复“已授权”,我将继续登录。
可先调用 { "action": "methods" } 查看说明。请在浏览器中登录,不要在对话里向 MCP 发送密码。
assets_search
assetType:rule|skill|mcp|all(默认all)keyword:关键词,透传后端,与平台搜索一致mine:可选,true仅查当前用户自己的资产status:主要用于mine=true的场景(筛自己资产状态)categoryId/categoryIds:分类筛选page:页码,默认1;用户要翻页时传目标页码pageSize:每页条数,默认10,上限50all:走统一接口GET /v1/assets的聚合查询;其他类型走GET /v1/assets/{assetType}
响应结构:
{
"ok": true,
"message": "查询成功",
"summary": "共 23 条,共 3 页(当前第 1 页,每页 10 条)。",
"paginationHint": "若需翻页,请告知目标页码(1 到 3),我会带 page=<页码> 重新查询。",
"data": {
"assetType": "rule",
"page": {
"records": [/* ... */],
"page": 1,
"pageSize": 10,
"total": 23,
"totalPages": 3,
"hasNext": true,
"hasPrev": false
}
}
}summary 与 paginationHint 是给上层助手直接面向用户复述的中文摘要,总条数/总页数/当前页已经算好;翻页时把目标 page 透传回来即可。
assets_detail
id:资产 ID(必填,正整数)assetType:rule|skill|mcp(可选;传入则直查,不传走统一详情)
无查看权限或资源不存在时,接口会失败;与 Web 端一致,由后端统一鉴权。
assets_download
assetType、id:同assets_detail(无权限则无法拉取内容)dir:可选,单参数决定导出根目录- 支持绝对路径(如
/Users/me/.workbuddy或C:\\Users\\me\\.workbuddy) - 支持相对工作区路径(如
.cursor、.workbuddy、exports/workbuddy) - 支持
~(如~/.cursor、~/.workbuddy)
- 支持绝对路径(如
useGlobalDir:可选,布尔值;仅在未提供dir时生效- 路径决策优先级:
- 传了
dir:直接使用dir CLIENT_TYPE=cursor|workbuddy且未传dir、未传useGlobalDir:先返回补参,要求确认useGlobalDir(true/false)- 未传
dir且useGlobalDir=true:按CLIENT_TYPE固定全局目录cursor->~/.cursorworkbuddy->~/.workbuddy- 会先检查写权限;无权限时报错
GLOBAL_DIR_NOT_WRITABLE - 若缺少
CLIENT_TYPE,返回补参提示
- 未传
dir且useGlobalDir!=true:按CLIENT_TYPE推断工作区默认目录cursor->{工作区}/.cursorworkbuddy->{工作区}/.workbuddy
- 传了
- 当
dir缺失且无法通过上述规则确定目录时,会返回补参提示 - 覆盖策略:下载前会先删除本地目标目录及同名
.zip(若存在),不做版本比对,始终按本次拉取结果整包覆盖。 - rule / skill:从 OSS 版本文件(manifest + file-content)重建内容;无 bundle 时为单个
.md,有 bundle 时展开为多文件目录(不生成.zip) - mcp:不写入本地文件,直接返回
configJson/toolsJson/remark供复制使用
assets_create
- 仅支持
rule/skill - 必填:
assetType(如能从dir路径推断也可省略;见下方决策规则) - 可选:
name(不传时默认使用dir目录名)、description、version、tags(version省略时后端默认v1.0) dir:可选,本地目录(绝对路径或相对工程根;工程根固定为当前进程cwd);传入后由 MCP 自动转换:- rule / skill:目录文件转
ASSET_BUNDLE_V1内容并写入content
- rule / skill:目录文件转
路径决策(cursor / workbuddy 一致)
- 传了
dir:- 路径段含
rules(不含skills)→ 自动判定为rule - 路径段含
skills(不含rules)→ 自动判定为skill - 同时含 / 都不含 → 返回
needMoreInput,要求传assetType - 用户显式传
assetType时,优先采用,不再做路径推断
- 路径段含
- 未传
dir:- 必须先有
CLIENT_TYPE(cursor或workbuddy),否则返回补参 - 必须先有
assetType(仅rule/skill),否则返回补参 - MCP 会列出候选目录供用户选择:
- 项目目录:
{工作区}/.${CLIENT_TYPE}/{rules|skills}/* - 全局目录:
~/.${CLIENT_TYPE}/{rules|skills}/*
- 项目目录:
- 候选条目带
source: 'project' | 'global'与path,按最近修改时间倒序 - 候选为空时不阻塞:
candidateDirs: []+ 提示用户直接传dir - 不再使用
confirmDefaultDir(已废弃)
- 必须先有
错误处理
- 上传过程遇到本地文件系统权限错误(
EACCES/EPERM):直接把原始错误信息抛给用户,不做任何兜底/重试/回退
assets_update
- 仅支持
rule/skill(mcp 资产不在此工具受理范围) - 已发布资产:后端只更新草稿;你作为作者/管理员在详情、或列表带
mine=true时会优先看到草稿,所以体感像「一保存就变了」;访客/公共列表仍读已发布版本,真正对外替换要走平台「申请发布 → 审核」。 - 必填:
id、changeLog - 可选:
assetType、name、description、tags、version、reuseDraftVersion、dir、entryPath、content assetType处理:- 不传 → MCP 按
id拉详情自动确定 - 传了且与详情不一致 → 以详情为准,并在响应
warnings中提示 - 详情类型为
mcp→ 直接拒绝(请走平台其他入口)
- 不传 → MCP 按
name默认沿用线上资产名;用户显式传name优先- 草稿复用:已发布且存在未发布草稿时,可传
reuseDraftVersion=true沿用当前草稿版本号(与手动传version二选一)
路径决策(与 assets_create 一致)
- 传了
dir:直接使用(仅支持目录,不支持单文件)- 如果
dir路径段(rules/skills)与详情类型不一致,仍按详情类型为准,并在响应warnings中提示
- 如果
- 未传
dir:- 必须先有
CLIENT_TYPE(cursor或workbuddy),否则返回补参 - 按详情的
assetType列出候选目录供用户选择:- 项目目录:
{工作区}/.${CLIENT_TYPE}/{rules|skills}/* - 全局目录:
~/.${CLIENT_TYPE}/{rules|skills}/*
- 项目目录:
- 候选条目带
source: 'project' | 'global'与path,按最近修改时间倒序 - 候选为空时不阻塞:
candidateDirs: []+ 提示用户直接传dir - 不再使用
confirmDefaultDir(已废弃)
- 必须先有
错误处理
- 上传过程遇到本地文件系统权限错误(
EACCES/EPERM):直接把原始错误信息抛给用户,不做任何兜底/重试/回退
