@chantezy/mcp-product-design 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,72 @@
1
+ # @chantezy/mcp-product-design
2
+
3
+ 产品设计师专用 MCP 服务 —— 将 [chantezy/skills](https://github.com/chantezy/skills) 仓库中的结构化技能通过 MCP 协议暴露给 AI 编码助手。
4
+
5
+ ## 可用技能
6
+
7
+ | 技能 | 用途 |
8
+ |------|------|
9
+ | `requirements-content-analysis` | 需求内容结构化解析与交互设计分析 |
10
+ | `b-design-diverge` | B端设计方案快速发散与多方案对比 |
11
+ | `interaction-design-eval` | 交互设计量化评估与职级匹配 |
12
+ | `interaction-spec` | 交互说明文档生成 |
13
+ | `prd-generator` | PRD 需求文档生成 |
14
+
15
+ ## MCP 工具
16
+
17
+ | 工具 | 描述 |
18
+ |------|------|
19
+ | `list_skills` | 列出所有可用技能及其触发条件 |
20
+ | `get_skill` | 获取指定技能的完整工作流程和输出模板 |
21
+ | `get_reference` | 获取技能的资料文件(评分标准、设计原则等) |
22
+
23
+ ## 使用方法
24
+
25
+ ### 1. 配置 IDE MCP
26
+
27
+ 在 MCP 配置文件中添加:
28
+
29
+ ```json
30
+ {
31
+ "mcpServers": {
32
+ "product-design": {
33
+ "command": "npx",
34
+ "args": ["-y", "@chantezy/mcp-product-design@latest"]
35
+ }
36
+ }
37
+ }
38
+ ```
39
+
40
+ 各 IDE 配置文件位置:
41
+ - **WorkBuddy**: `~/.workbuddy/mcp.json`
42
+ - **Cursor**: `~/.cursor/mcp.json`
43
+ - **Claude Code**: `~/.claude/mcp.json`
44
+
45
+ ### 2. 使用流程
46
+
47
+ ```
48
+ 1. AI 先调用 list_skills 了解可用技能
49
+ 2. 根据用户需求选择技能,调用 get_skill 获取工作流程
50
+ 3. 按需调用 get_reference 获取领域知识
51
+ 4. 按照 SKILL.md 中定义的流程执行
52
+ ```
53
+
54
+ ## 更新机制
55
+
56
+ 1. 修改 `chantezy/skills` 仓库中的任意 skill 文件
57
+ 2. Push 到 main 分支
58
+ 3. GitHub Actions 自动检测内容变更,构建并发布到 npm
59
+ 4. 重启 IDE 即可自动获取最新版本
60
+
61
+ ## 开发
62
+
63
+ ```bash
64
+ # 同步 skills 文件
65
+ npm run sync
66
+
67
+ # 构建
68
+ npm run build
69
+
70
+ # 本地测试
71
+ echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | node dist/index.js
72
+ ```
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { z } from "zod";
5
+ import { listSkills, getSkill, getReference } from "./skill-loader.js";
6
+ const server = new McpServer({
7
+ name: "mcp-product-design",
8
+ version: "0.1.0",
9
+ });
10
+ server.tool("list_skills", "列出所有可用的产品设计技能及其触发条件。应先调用此工具了解可用技能。", {}, async () => {
11
+ const skills = listSkills();
12
+ if (skills.length === 0) {
13
+ return {
14
+ content: [
15
+ {
16
+ type: "text",
17
+ text: "未找到任何技能。skills 目录可能为空或未正确同步,请检查 mcp-server/skills/ 目录。",
18
+ },
19
+ ],
20
+ };
21
+ }
22
+ const lines = skills.map((s) => `- **${s.name}** — ${s.description || "无描述"}`);
23
+ const text = `# 可用产品设计技能 (${skills.length})\n\n` +
24
+ lines.join("\n") +
25
+ `\n\n---\n使用 \`get_skill\` 工具并提供技能名称来获取完整的工作流程指令。`;
26
+ return {
27
+ content: [{ type: "text", text }],
28
+ };
29
+ });
30
+ server.tool("get_skill", "获取指定技能的完整 SKILL.md 内容,包括工作流程、输出模板和可用的参考文件列表。", {
31
+ name: z.string().describe("技能名称,支持 kebab-case(如 'prd-generator'、'b-design-diverge')"),
32
+ }, async ({ name }) => {
33
+ const skill = getSkill(name);
34
+ if (!skill) {
35
+ const available = listSkills().map((s) => s.name).join("、");
36
+ return {
37
+ content: [
38
+ {
39
+ type: "text",
40
+ text: `未找到技能 "${name}"。可用技能:${available}`,
41
+ },
42
+ ],
43
+ isError: true,
44
+ };
45
+ }
46
+ const refSection = skill.references.length > 0
47
+ ? `\n\n---\n## 可用参考资料\n${skill.references.map((r) => `- ${r}`).join("\n")}\n\n使用 \`get_reference\` 工具并提供技能名称和参考资料名称来读取。`
48
+ : "";
49
+ return {
50
+ content: [
51
+ {
52
+ type: "text",
53
+ text: skill.content + refSection,
54
+ },
55
+ ],
56
+ };
57
+ });
58
+ server.tool("get_reference", "获取指定技能的资料文件内容。资料文件包含领域知识,如评分标准、设计原则、模板等。", {
59
+ name: z.string().describe("技能名称"),
60
+ ref: z.string().describe("参考资料文件名,不含 .md 扩展名(如 'scoring_criteria'、'prd-template')"),
61
+ }, async ({ name, ref }) => {
62
+ const content = getReference(name, ref);
63
+ if (!content) {
64
+ const skill = getSkill(name);
65
+ const available = skill
66
+ ? skill.references.join("、")
67
+ : "技能不存在";
68
+ return {
69
+ content: [
70
+ {
71
+ type: "text",
72
+ text: `未找到技能 "${name}" 的资料 "${ref}"。可用资料:${available}`,
73
+ },
74
+ ],
75
+ isError: true,
76
+ };
77
+ }
78
+ return {
79
+ content: [{ type: "text", text: content }],
80
+ };
81
+ });
82
+ async function main() {
83
+ const transport = new StdioServerTransport();
84
+ await server.connect(transport);
85
+ const skills = listSkills();
86
+ if (process.env.DEBUG) {
87
+ console.error(`[mcp-product-design] 已加载 ${skills.length} 个技能:${skills.map((s) => s.name).join(", ")}`);
88
+ }
89
+ }
90
+ main().catch((err) => {
91
+ console.error("MCP Server 启动失败:", err);
92
+ process.exit(1);
93
+ });
94
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface SkillMeta {
2
+ name: string;
3
+ description: string;
4
+ directory: string;
5
+ }
6
+ export interface SkillDetail extends SkillMeta {
7
+ content: string;
8
+ body: string;
9
+ references: string[];
10
+ }
11
+ export declare function listSkills(): SkillMeta[];
12
+ export declare function getSkill(name: string): SkillDetail | null;
13
+ export declare function getReference(name: string, ref: string): string | null;
@@ -0,0 +1,101 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import * as yaml from "js-yaml";
5
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
6
+ const SKILLS_DIR = path.join(__dirname, "..", "skills");
7
+ function parseFrontmatter(content) {
8
+ const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);
9
+ if (!match) {
10
+ return { fm: {}, body: content };
11
+ }
12
+ let fm = {};
13
+ try {
14
+ fm = yaml.load(match[1]) || {};
15
+ }
16
+ catch {
17
+ // Fallback: simple regex parsing if yaml.load fails
18
+ const nameMatch = match[1].match(/^name:\s*(.+)$/m);
19
+ const descMatch = match[1].match(/^description:\s*(.+)$/m);
20
+ if (nameMatch)
21
+ fm.name = nameMatch[1].trim().replace(/^["']|["']$/g, "");
22
+ if (descMatch)
23
+ fm.description = descMatch[1].trim().replace(/^["']|["']$/g, "");
24
+ }
25
+ return { fm, body: match[2] || "" };
26
+ }
27
+ function normalizeSkillDir(name) {
28
+ return name.toLowerCase().replace(/\s+/g, "-");
29
+ }
30
+ export function listSkills() {
31
+ if (!fs.existsSync(SKILLS_DIR)) {
32
+ return [];
33
+ }
34
+ const skills = [];
35
+ const entries = fs.readdirSync(SKILLS_DIR);
36
+ for (const entry of entries) {
37
+ const entryPath = path.join(SKILLS_DIR, entry);
38
+ const skillMdPath = path.join(entryPath, "SKILL.md");
39
+ if (fs.statSync(entryPath).isDirectory() && fs.existsSync(skillMdPath)) {
40
+ const content = fs.readFileSync(skillMdPath, "utf-8");
41
+ const { fm } = parseFrontmatter(content);
42
+ skills.push({
43
+ name: fm.name || normalizeSkillDir(entry),
44
+ description: fm.description || "",
45
+ directory: entry,
46
+ });
47
+ }
48
+ }
49
+ return skills;
50
+ }
51
+ export function getSkill(name) {
52
+ const skills = listSkills();
53
+ const normalized = name.toLowerCase().replace(/\s+/g, "-");
54
+ const skill = skills.find((s) => s.name === name ||
55
+ s.name === normalized ||
56
+ s.directory === name ||
57
+ s.directory === normalized);
58
+ if (!skill)
59
+ return null;
60
+ const skillMdPath = path.join(SKILLS_DIR, skill.directory, "SKILL.md");
61
+ const content = fs.readFileSync(skillMdPath, "utf-8");
62
+ const { fm, body } = parseFrontmatter(content);
63
+ const refDir = path.join(SKILLS_DIR, skill.directory, "references");
64
+ const references = [];
65
+ if (fs.existsSync(refDir) && fs.statSync(refDir).isDirectory()) {
66
+ const files = fs.readdirSync(refDir);
67
+ for (const file of files) {
68
+ if (file.endsWith(".md")) {
69
+ references.push(file.replace(/\.md$/, ""));
70
+ }
71
+ }
72
+ }
73
+ return {
74
+ name: fm.name || skill.name,
75
+ description: fm.description || skill.description,
76
+ directory: skill.directory,
77
+ content,
78
+ body,
79
+ references,
80
+ };
81
+ }
82
+ export function getReference(name, ref) {
83
+ const skills = listSkills();
84
+ const normalized = name.toLowerCase().replace(/\s+/g, "-");
85
+ const skill = skills.find((s) => s.name === name ||
86
+ s.name === normalized ||
87
+ s.directory === name ||
88
+ s.directory === normalized);
89
+ if (!skill)
90
+ return null;
91
+ const refPath = path.join(SKILLS_DIR, skill.directory, "references", `${ref}.md`);
92
+ if (!fs.existsSync(refPath)) {
93
+ const tryPath = path.join(SKILLS_DIR, skill.directory, "references", `${ref}`);
94
+ if (fs.existsSync(tryPath)) {
95
+ return fs.readFileSync(tryPath, "utf-8");
96
+ }
97
+ return null;
98
+ }
99
+ return fs.readFileSync(refPath, "utf-8");
100
+ }
101
+ //# sourceMappingURL=skill-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-loader.js","sourceRoot":"","sources":["../src/skill-loader.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@chantezy/mcp-product-design",
3
+ "version": "0.1.0",
4
+ "description": "Product design skills MCP server - structured design workflow tools for AI agents",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "bin": {
8
+ "mcp-product-design": "./dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "skills"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "sync": "bash scripts/sync-skills.sh",
17
+ "prepublishOnly": "npm run build"
18
+ },
19
+ "keywords": [
20
+ "mcp",
21
+ "product-design",
22
+ "ui-design",
23
+ "ux-design",
24
+ "skills",
25
+ "ai-agent"
26
+ ],
27
+ "author": "chantezy",
28
+ "license": "MIT",
29
+ "dependencies": {
30
+ "@modelcontextprotocol/sdk": "^1.22.0",
31
+ "js-yaml": "^4.1.0",
32
+ "zod": "^3.24.0"
33
+ },
34
+ "devDependencies": {
35
+ "@types/js-yaml": "^4.0.9",
36
+ "@types/node": "^22.0.0",
37
+ "typescript": "^5.8.0"
38
+ }
39
+ }
@@ -0,0 +1,23 @@
1
+ ---
2
+ name: test-skill
3
+ description: 一个测试技能,用于验证 MCP 服务是否正常工作
4
+ ---
5
+
6
+ # 测试技能
7
+
8
+ 这是用于测试 MCP 服务端到端功能的示例技能。
9
+
10
+ ## 工作流程
11
+
12
+ 1. 接收测试输入
13
+ 2. 验证处理逻辑
14
+ 3. 输出测试结果
15
+
16
+ ## 输出格式
17
+
18
+ ```markdown
19
+ ## 测试结果
20
+
21
+ - 状态: ✅ 通过
22
+ - 时间: {{timestamp}}
23
+ ```
@@ -0,0 +1,3 @@
1
+ # 测试参考资料
2
+
3
+ 这是一个测试参考资料,用于验证 `get_reference` 工具是否正常工作。