From d7246c2c64e4ea39857a4e32bf4a7c31d856fbc2 Mon Sep 17 00:00:00 2001
From: liweijie <674416404@qq.com>
Date: Tue, 8 Sep 2026 19:26:11 +0800
Subject: [PATCH 01/15] feat: add packages/mcp-server from tdesign-mcp-server
source
Bring in the MCP server source code from cnb.cool/tencent/tdesign/tdesign-mcp-server.
Exclude script-generated files (packages/docs and __snapshots__).
Update pnpm workspace to include nested mcp-server packages.
Add mcp-server build scripts to root package.json.
---
package.json | 7 +-
packages/mcp-server/.env | 6 +
packages/mcp-server/.gitignore | 30 +++
packages/mcp-server/DEVELOPMENT.md | 80 +++++++
packages/mcp-server/README.md | 35 +++
packages/mcp-server/common/config.ts | 18 ++
packages/mcp-server/common/framework.ts | 50 ++++
packages/mcp-server/common/index.ts | 4 +
packages/mcp-server/common/package.json | 8 +
packages/mcp-server/common/parser.ts | 216 ++++++++++++++++++
packages/mcp-server/common/toolkit.ts | 22 ++
packages/mcp-server/package.json | 13 ++
packages/mcp-server/prettier.config.js | 12 +
packages/mcp-server/scripts/dom/index.ts | 122 ++++++++++
.../snapshots/miniprogram/babel.config.cjs | 7 +
.../custom/action-sheet/demo/index.js | 28 +++
.../custom/action-sheet/demo/index.json | 6 +
.../custom/action-sheet/demo/index.wxml | 8 +
.../miniprogram/custom/dialog/demo/index.js | 6 +
.../miniprogram/custom/dialog/demo/index.json | 6 +
.../miniprogram/custom/dialog/demo/index.wxml | 6 +
.../miniprogram/custom/drawer/demo/index.js | 33 +++
.../miniprogram/custom/drawer/demo/index.json | 6 +
.../miniprogram/custom/drawer/demo/index.wxml | 5 +
.../custom/dropdown-menu/demo/index.js | 25 ++
.../custom/dropdown-menu/demo/index.json | 7 +
.../custom/dropdown-menu/demo/index.wxml | 13 ++
.../miniprogram/custom/guide/demo/index.js | 77 +++++++
.../miniprogram/custom/guide/demo/index.json | 8 +
.../miniprogram/custom/guide/demo/index.wxml | 20 ++
.../miniprogram/custom/icon/demo/index.js | 1 +
.../miniprogram/custom/icon/demo/index.json | 6 +
.../miniprogram/custom/icon/demo/index.wxml | 1 +
.../miniprogram/custom/indexes/demo/index.js | 126 ++++++++++
.../custom/indexes/demo/index.json | 9 +
.../custom/indexes/demo/index.wxml | 14 ++
.../miniprogram/custom/message/demo/index.js | 5 +
.../custom/message/demo/index.json | 6 +
.../custom/message/demo/index.wxml | 6 +
.../custom/message/demo/index.wxss | 0
.../miniprogram/custom/overlay/demo/index.js | 5 +
.../custom/overlay/demo/index.json | 6 +
.../custom/overlay/demo/index.wxml | 1 +
.../miniprogram/custom/popover/demo/index.js | 5 +
.../custom/popover/demo/index.json | 7 +
.../custom/popover/demo/index.wxml | 9 +
.../custom/popover/demo/index.wxss | 0
.../miniprogram/custom/popup/demo/index.js | 6 +
.../miniprogram/custom/popup/demo/index.json | 7 +
.../miniprogram/custom/popup/demo/index.wxml | 5 +
.../custom/pull-down-refresh/demo/index.js | 23 ++
.../custom/pull-down-refresh/demo/index.json | 7 +
.../custom/pull-down-refresh/demo/index.wxml | 26 +++
.../miniprogram/custom/side-bar/demo/index.js | 100 ++++++++
.../custom/side-bar/demo/index.json | 9 +
.../custom/side-bar/demo/index.wxml | 27 +++
.../miniprogram/custom/toast/demo/index.js | 10 +
.../miniprogram/custom/toast/demo/index.json | 6 +
.../miniprogram/custom/toast/demo/index.wxml | 1 +
.../dom/snapshots/miniprogram/globalSetup.cjs | 3 +
.../dom/snapshots/miniprogram/index.test.js | 71 ++++++
.../dom/snapshots/miniprogram/jest.config.cjs | 31 +++
.../dom/snapshots/miniprogram/setup.js | 149 ++++++++++++
.../snapshots/mobile/custom/action-sheet.tsx | 14 ++
.../dom/snapshots/mobile/custom/dialog.tsx | 14 ++
.../dom/snapshots/mobile/custom/drawer.tsx | 14 ++
.../dom/snapshots/mobile/custom/guide.tsx | 21 ++
.../dom/snapshots/mobile/custom/indexes.tsx | 35 +++
.../dom/snapshots/mobile/custom/message.tsx | 14 ++
.../dom/snapshots/mobile/custom/overlay.tsx | 14 ++
.../dom/snapshots/mobile/custom/popover.tsx | 23 ++
.../dom/snapshots/mobile/custom/popup.tsx | 23 ++
.../dom/snapshots/mobile/custom/toast.tsx | 14 ++
.../dom/snapshots/mobile/setup.test.ts | 69 ++++++
.../snapshots/web-chat/custom/attachments.tsx | 16 ++
.../web-chat/custom/chat-actionbar.tsx | 17 ++
.../web-chat/custom/chat-loading.tsx | 12 +
.../web-chat/custom/chat-markdown.tsx | 22 ++
.../web-chat/custom/chat-message.tsx | 18 ++
.../snapshots/web-chat/custom/chat-sender.tsx | 13 ++
.../web-chat/custom/chat-thinking.tsx | 16 ++
.../dom/snapshots/web-chat/setup.test.ts | 41 ++++
.../dom/snapshots/web/custom/date-picker.tsx | 9 +
.../dom/snapshots/web/custom/dialog.tsx | 14 ++
.../dom/snapshots/web/custom/drawer.tsx | 14 ++
.../dom/snapshots/web/custom/dropdown.tsx | 44 ++++
.../dom/snapshots/web/custom/guide.tsx | 22 ++
.../scripts/dom/snapshots/web/custom/icon.tsx | 9 +
.../dom/snapshots/web/custom/input.tsx | 32 +++
.../dom/snapshots/web/custom/layout.tsx | 23 ++
.../dom/snapshots/web/custom/popconfirm.tsx | 14 ++
.../dom/snapshots/web/custom/popup.tsx | 33 +++
.../dom/snapshots/web/custom/select.tsx | 20 ++
.../dom/snapshots/web/custom/tooltip.tsx | 32 +++
.../scripts/dom/snapshots/web/custom/tree.tsx | 15 ++
.../dom/snapshots/web/custom/typography.tsx | 24 ++
.../dom/snapshots/web/custom/upload.tsx | 14 ++
.../scripts/dom/snapshots/web/setup.test.ts | 66 ++++++
.../scripts/dom/utils/runWebComponentSnap.ts | 29 +++
.../scripts/dom/utils/serializeShadowDom.ts | 184 +++++++++++++++
packages/mcp-server/scripts/icon/index.ts | 30 +++
packages/mcp-server/scripts/index.ts | 63 +++++
packages/mcp-server/scripts/package.json | 48 ++++
packages/mcp-server/scripts/utils/path.ts | 117 ++++++++++
packages/mcp-server/scripts/vitest.config.ts | 42 ++++
packages/mcp-server/server/README.md | 29 +++
packages/mcp-server/server/package.json | 47 ++++
packages/mcp-server/server/rollup.config.js | 62 +++++
.../mcp-server/server/src/helpers/cache.ts | 102 +++++++++
.../server/src/helpers/component.ts | 39 ++++
.../mcp-server/server/src/helpers/format.ts | 27 +++
.../mcp-server/server/src/helpers/index.ts | 3 +
packages/mcp-server/server/src/http.ts | 38 +++
packages/mcp-server/server/src/init.ts | 15 ++
.../server/src/prompts/assistant.ts | 43 ++++
.../mcp-server/server/src/prompts/index.ts | 2 +
.../mcp-server/server/src/prompts/schema.ts | 32 +++
packages/mcp-server/server/src/stdio.ts | 14 ++
.../mcp-server/server/src/tools/changelog.ts | 73 ++++++
packages/mcp-server/server/src/tools/docs.ts | 71 ++++++
packages/mcp-server/server/src/tools/dom.ts | 62 +++++
packages/mcp-server/server/src/tools/icon.ts | 65 ++++++
packages/mcp-server/server/src/tools/index.ts | 15 ++
packages/mcp-server/server/src/tools/list.ts | 32 +++
packages/mcp-server/tsconfig.json | 19 ++
pnpm-workspace.yaml | 1 +
126 files changed, 3670 insertions(+), 1 deletion(-)
create mode 100644 packages/mcp-server/.env
create mode 100644 packages/mcp-server/.gitignore
create mode 100644 packages/mcp-server/DEVELOPMENT.md
create mode 100644 packages/mcp-server/README.md
create mode 100644 packages/mcp-server/common/config.ts
create mode 100644 packages/mcp-server/common/framework.ts
create mode 100644 packages/mcp-server/common/index.ts
create mode 100644 packages/mcp-server/common/package.json
create mode 100644 packages/mcp-server/common/parser.ts
create mode 100644 packages/mcp-server/common/toolkit.ts
create mode 100644 packages/mcp-server/package.json
create mode 100644 packages/mcp-server/prettier.config.js
create mode 100644 packages/mcp-server/scripts/dom/index.ts
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/babel.config.cjs
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/action-sheet/demo/index.js
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/action-sheet/demo/index.json
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/action-sheet/demo/index.wxml
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/dialog/demo/index.js
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/dialog/demo/index.json
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/dialog/demo/index.wxml
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/drawer/demo/index.js
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/drawer/demo/index.json
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/drawer/demo/index.wxml
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/dropdown-menu/demo/index.js
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/dropdown-menu/demo/index.json
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/dropdown-menu/demo/index.wxml
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/guide/demo/index.js
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/guide/demo/index.json
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/guide/demo/index.wxml
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/icon/demo/index.js
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/icon/demo/index.json
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/icon/demo/index.wxml
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/indexes/demo/index.js
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/indexes/demo/index.json
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/indexes/demo/index.wxml
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/message/demo/index.js
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/message/demo/index.json
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/message/demo/index.wxml
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/message/demo/index.wxss
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/overlay/demo/index.js
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/overlay/demo/index.json
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/overlay/demo/index.wxml
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/popover/demo/index.js
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/popover/demo/index.json
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/popover/demo/index.wxml
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/popover/demo/index.wxss
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/popup/demo/index.js
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/popup/demo/index.json
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/popup/demo/index.wxml
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/pull-down-refresh/demo/index.js
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/pull-down-refresh/demo/index.json
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/pull-down-refresh/demo/index.wxml
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/side-bar/demo/index.js
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/side-bar/demo/index.json
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/side-bar/demo/index.wxml
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/toast/demo/index.js
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/toast/demo/index.json
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/custom/toast/demo/index.wxml
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/globalSetup.cjs
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/index.test.js
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/jest.config.cjs
create mode 100644 packages/mcp-server/scripts/dom/snapshots/miniprogram/setup.js
create mode 100644 packages/mcp-server/scripts/dom/snapshots/mobile/custom/action-sheet.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/mobile/custom/dialog.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/mobile/custom/drawer.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/mobile/custom/guide.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/mobile/custom/indexes.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/mobile/custom/message.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/mobile/custom/overlay.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/mobile/custom/popover.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/mobile/custom/popup.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/mobile/custom/toast.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/mobile/setup.test.ts
create mode 100644 packages/mcp-server/scripts/dom/snapshots/web-chat/custom/attachments.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/web-chat/custom/chat-actionbar.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/web-chat/custom/chat-loading.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/web-chat/custom/chat-markdown.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/web-chat/custom/chat-message.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/web-chat/custom/chat-sender.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/web-chat/custom/chat-thinking.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/web-chat/setup.test.ts
create mode 100644 packages/mcp-server/scripts/dom/snapshots/web/custom/date-picker.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/web/custom/dialog.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/web/custom/drawer.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/web/custom/dropdown.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/web/custom/guide.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/web/custom/icon.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/web/custom/input.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/web/custom/layout.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/web/custom/popconfirm.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/web/custom/popup.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/web/custom/select.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/web/custom/tooltip.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/web/custom/tree.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/web/custom/typography.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/web/custom/upload.tsx
create mode 100644 packages/mcp-server/scripts/dom/snapshots/web/setup.test.ts
create mode 100644 packages/mcp-server/scripts/dom/utils/runWebComponentSnap.ts
create mode 100644 packages/mcp-server/scripts/dom/utils/serializeShadowDom.ts
create mode 100644 packages/mcp-server/scripts/icon/index.ts
create mode 100644 packages/mcp-server/scripts/index.ts
create mode 100644 packages/mcp-server/scripts/package.json
create mode 100644 packages/mcp-server/scripts/utils/path.ts
create mode 100644 packages/mcp-server/scripts/vitest.config.ts
create mode 100644 packages/mcp-server/server/README.md
create mode 100644 packages/mcp-server/server/package.json
create mode 100644 packages/mcp-server/server/rollup.config.js
create mode 100644 packages/mcp-server/server/src/helpers/cache.ts
create mode 100644 packages/mcp-server/server/src/helpers/component.ts
create mode 100644 packages/mcp-server/server/src/helpers/format.ts
create mode 100644 packages/mcp-server/server/src/helpers/index.ts
create mode 100644 packages/mcp-server/server/src/http.ts
create mode 100644 packages/mcp-server/server/src/init.ts
create mode 100644 packages/mcp-server/server/src/prompts/assistant.ts
create mode 100644 packages/mcp-server/server/src/prompts/index.ts
create mode 100644 packages/mcp-server/server/src/prompts/schema.ts
create mode 100644 packages/mcp-server/server/src/stdio.ts
create mode 100644 packages/mcp-server/server/src/tools/changelog.ts
create mode 100644 packages/mcp-server/server/src/tools/docs.ts
create mode 100644 packages/mcp-server/server/src/tools/dom.ts
create mode 100644 packages/mcp-server/server/src/tools/icon.ts
create mode 100644 packages/mcp-server/server/src/tools/index.ts
create mode 100644 packages/mcp-server/server/src/tools/list.ts
create mode 100644 packages/mcp-server/tsconfig.json
diff --git a/package.json b/package.json
index 23f78dde1..7c48cb6b5 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,12 @@
"site": "pnpm run build:components && pnpm run --filter tdesign-site build",
"site:preview": "pnpm run build:components && pnpm run --filter tdesign-site site:preview",
"auto-release-collection": "pnpm run --filter auto-release-collection start",
- "prepare": "husky install"
+ "prepare": "husky install",
+ "build:mcp": "pnpm run --filter tdesign-mcp-server-mono build:mcp",
+ "build:mcp-stdio": "pnpm run --filter tdesign-mcp-server-mono build:mcp-stdio",
+ "build:mcp-http": "pnpm run --filter tdesign-mcp-server-mono build:mcp-http",
+ "start:mcp-http": "pnpm run --filter tdesign-mcp-server-mono start:mcp-http",
+ "build:docs+dom": "pnpm run --filter tdesign-mcp-server-mono build:docs+dom"
},
"license": "MIT",
"dependencies": {
diff --git a/packages/mcp-server/.env b/packages/mcp-server/.env
new file mode 100644
index 000000000..f9ab63b01
--- /dev/null
+++ b/packages/mcp-server/.env
@@ -0,0 +1,6 @@
+# =============================================
+# 设为 local,从项目的 docs 文件夹读取
+# 设为 online,从 CDN 上获取文档
+# =============================================
+
+DOCS_SOURCE_MODE = 'online'
diff --git a/packages/mcp-server/.gitignore b/packages/mcp-server/.gitignore
new file mode 100644
index 000000000..492edf4f4
--- /dev/null
+++ b/packages/mcp-server/.gitignore
@@ -0,0 +1,30 @@
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+.vscode
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+pnpm-lock.yaml
+
+.npmrc
+
+# Script-generated files (do not commit)
+docs/
+scripts/dom/snapshots/*/__snapshots__/
diff --git a/packages/mcp-server/DEVELOPMENT.md b/packages/mcp-server/DEVELOPMENT.md
new file mode 100644
index 000000000..f418e8d22
--- /dev/null
+++ b/packages/mcp-server/DEVELOPMENT.md
@@ -0,0 +1,80 @@
+#
开发指南
+
+## 🏠 项目架构
+
+```bash
+# 安装依赖
+npm install
+
+#(可选)更新文档
+npm run build:docs+dom
+```
+
+- 由于该项目在提取文档时,如果找不到本地仓库的话,会自动启动 clone 其它组件库的流程。
+- 如果你本地已经有 TDesign 的其它组件库项目,可以把该仓库 clone 到相同的目录下;如果没有,建议新建一个额外的空目录,再把该仓库 clone 进去。
+
+```bash
+📄 .env # 环境变量(仅用于本地调试)
+📁 packages/mcp-server
+├── 📁 common # 通用工具函数
+├── 📁 docs # 已整理的文档(脚本生成,不入库)
+├── 📁 scripts # 自动化脚本
+└── 📁 server # 核心业务逻辑
+ ├── 📁 tools
+ └── 📁 prompts
+```
+
+### ⚠️ Apple Silicon 环境说明
+
+如果你使用 Apple Silicon(M系列)Mac,需要额外安装 Rosetta 才能运行小程序快照构建脚本(`build:snap:mini`)。
+
+- 因为底层依赖的 `miniprogram-simulate` → `miniprogram-compiler` 仅提供了 `x86_64` 架构的二进制文件,需要进行转译。
+
+```bash
+softwareupdate --install-rosetta --agree-to-license
+```
+
+## 🕹️ 本地启动
+
+| 环境变量 | 说明 | 可选值 | 默认值 |
+|:---|:---|:---|:---|
+| `DOCS_SOURCE_MODE` | 文档数据来源 | `online`(CDN)
`local`(docs 文件夹) | `online` |
+
+### Stdio
+
+```bash
+npm run build:mcp-stdio
+```
+
+```json
+{
+ "mcpServers": {
+ "tdesign-mcp-server": {
+ "command": "node",
+ "args": ["your_path_to/tdesign/packages/mcp-server/server/dist/stdio.js"],
+ "env": {
+ "DOCS_SOURCE_MODE": "local"
+ }
+ }
+ }
+}
+```
+### StreamableHttp
+
+```bash
+npm run build:mcp-http
+npm run start:mcp-http
+```
+
+```json
+{
+ "mcpServers": {
+ "tdesign-mcp-server": {
+ "url": "localhost:9000/mcp",
+ "env": {
+ "DOCS_SOURCE_MODE": "local"
+ }
+ }
+ }
+}
+```
diff --git a/packages/mcp-server/README.md b/packages/mcp-server/README.md
new file mode 100644
index 000000000..f15084a82
--- /dev/null
+++ b/packages/mcp-server/README.md
@@ -0,0 +1,35 @@
+#
TDesign MCP Server
+
+## 🎉 功能介绍
+
+### 🔨 支持框架
+- 桌面端:`react` / `vue-next` / `vue`
+- 移动端:`mobile-react` / `mobile-vue` / `miniprogram` / `uniapp`
+- AI 对话:`react-chat` / `vue-next-chat` / `miniprogram-chat` / `uniapp-chat`
+
+### 🔨 支持工具
+- [x] `search-icons`:搜索可用的图标列表,适用场景:图标查找与名称确认
+- [x] `get-component-docs`:获取组件的文档,适用场景:代码生成和代码转换
+- [x] `get-component-dom`:获取组件的 DOM 结构,适用场景:转换自定义的 CSS 样式
+- [x] `get-component-list`:获取所有可用的组件列表,适用场景:选择合适组件进行组合实现不存在的功能
+- [x] `get-component-changelog`:获取组件的变更日志,适用场景:组件库版本升级
+
+## 📦 使用说明
+```json
+{
+ "mcpServers": { // 或 servers(根据不同的 MCP 客户端决定)
+ "tdesign-mcp-server": {
+ "command": "npx",
+ "args": ["-y", "tdesign-mcp-server@latest"]
+ }
+ }
+}
+```
+
+> 💡 如果在 MCP 客户端中连接失败,可以在终端手动输入 `npx tdesign-mcp-server`,并反馈对应的报错信息在 issue。
+
+## 🔮 开发指南
+
+
+
+详见[文档](DEVELOPMENT.md)
\ No newline at end of file
diff --git a/packages/mcp-server/common/config.ts b/packages/mcp-server/common/config.ts
new file mode 100644
index 000000000..435969408
--- /dev/null
+++ b/packages/mcp-server/common/config.ts
@@ -0,0 +1,18 @@
+import { createRequire } from "module";
+import path from "path";
+import { getDirname } from "./toolkit";
+
+const __dirname = getDirname(import.meta.url);
+
+export const isProduction = process.env.NODE_ENV === "production";
+
+if (!isProduction) {
+ // 避免打包时把 dotenv 也打入产物
+ const require = createRequire(import.meta.url); // 兼容 cjs
+ const dotenv = require("dotenv");
+ dotenv.config({ path: path.join(__dirname, "../../.env"), quiet: true });
+}
+
+export const DOCS_SOURCE_MODE = process.env.DOCS_SOURCE_MODE as "online" | "local";
+
+export const isLocalMode = DOCS_SOURCE_MODE === "local";
diff --git a/packages/mcp-server/common/framework.ts b/packages/mcp-server/common/framework.ts
new file mode 100644
index 000000000..444e35489
--- /dev/null
+++ b/packages/mcp-server/common/framework.ts
@@ -0,0 +1,50 @@
+export const addTdPrefix = (suffix: string) => `tdesign-${suffix}`;
+
+export const PLATFORMS = {
+ web: "web",
+ mobile: "mobile"
+} as const;
+export type Platform = (typeof PLATFORMS)[keyof typeof PLATFORMS];
+
+export const WEB_FRAMEWORKS = ["react", "react-chat", "vue", "vue-next", "vue-next-chat"] as const;
+
+export const MOBILE_FRAMEWORKS = [
+ "mobile-react",
+ "mobile-vue",
+ "miniprogram",
+ "miniprogram-chat",
+ "uniapp",
+ "uniapp-chat"
+] as const;
+
+export const FRAMEWORKS = [...WEB_FRAMEWORKS, ...MOBILE_FRAMEWORKS] as const;
+export type Framework = (typeof FRAMEWORKS)[number];
+
+// wxss 内容置空,聚焦组件本身
+export const MINIPROGRAM_DEMO_EXTS = [".wxml", ".js", ".json"] as const;
+
+/* 组件库是否为大仓结构 */
+const MONOREPO: Framework[] = ["react", "vue-next", "miniprogram"] as const;
+export const isMonorepo = (fw: Framework) => MONOREPO.includes(fw);
+
+export const isMiniProgram = (fw: Framework) => ["miniprogram", "miniprogram-chat"].includes(fw);
+
+export const isUniapp = (fw: Framework) => ["uniapp", "uniapp-chat"].includes(fw);
+
+export const isChatFramework = (fw: Framework) => fw.includes("chat") || fw === "uniapp-chat";
+
+const SPECIAL_CHAT_COMPONENTS = ["attachments"];
+export const isChatComponent = (name: string) => name.startsWith("chat-") || SPECIAL_CHAT_COMPONENTS.includes(name);
+
+export const getSuffixByFramework = (fw: Framework) => (fw.includes("react") ? "tsx" : "vue");
+
+/** uniapp 相关框架的源仓库映射 */
+export const getUniappSourceFramework = (fw: Framework): Framework => (fw === "uniapp-chat" ? "uniapp" : "uniapp");
+
+export const getPlatformByFramework = (fw: Framework): Platform => {
+ if ((MOBILE_FRAMEWORKS as readonly Framework[]).includes(fw)) {
+ return PLATFORMS.mobile;
+ }
+
+ return PLATFORMS.web;
+};
diff --git a/packages/mcp-server/common/index.ts b/packages/mcp-server/common/index.ts
new file mode 100644
index 000000000..a40dc92c5
--- /dev/null
+++ b/packages/mcp-server/common/index.ts
@@ -0,0 +1,4 @@
+export * from "./framework";
+export * from "./parser";
+export * from "./toolkit";
+export * from "./config";
\ No newline at end of file
diff --git a/packages/mcp-server/common/package.json b/packages/mcp-server/common/package.json
new file mode 100644
index 000000000..c774d2cdb
--- /dev/null
+++ b/packages/mcp-server/common/package.json
@@ -0,0 +1,8 @@
+{
+ "name": "@tdesign-mcp-server/common",
+ "main": "index.ts",
+ "type": "module",
+ "dependencies": {
+ "dotenv": "^17.2.1"
+ }
+}
diff --git a/packages/mcp-server/common/parser.ts b/packages/mcp-server/common/parser.ts
new file mode 100644
index 000000000..f0625481e
--- /dev/null
+++ b/packages/mcp-server/common/parser.ts
@@ -0,0 +1,216 @@
+type Rule = [RegExp, string];
+export type RuleMap = Record;
+
+const MD_LINK_RULE: Rule = [/[,,。.]?\s*\[([^\]]+)\]\([^\)]+\)/g, ""];
+const DANGLING_PUNCT_RULE: Rule = [/[,,]\s*[。.](?!\.)/g, "。"];
+const ATTR_INLINE_STYLE_RULE: Rule = [/\s*:?style="([^"]*)"/g, ""];
+const LINK_RULE: Rule = [/https?[^"]*/g, ""];
+const SPACE_RULE: Rule = [/\s+/g, " "];
+const SPACE_BETWEEN_TAG: Rule = [/\s*(<|>)\s*/g, "$1"];
+
+const COMMON_RULE_MAP: RuleMap = {
+ extraLine: [/^\s*\n\s*\n/gm, "\n"],
+ blankHeadTail: [/^(\s*\n)+|(\s*\n)+$/g, ""]
+};
+
+export const API_RULE_MAP: RuleMap = {
+ // 只提取 ## API 后面的段落
+ base: [/^[\s\S]*?^## API\s*\n?/m, ""],
+ mdLink: MD_LINK_RULE,
+ danglingPunct: DANGLING_PUNCT_RULE,
+ ...COMMON_RULE_MAP
+};
+
+export const DEMO_RULE_MAP: RuleMap = {
+ meta: [/---\n([\s\S]*?)\n---/, ""],
+ style: [/\s