Skip to content

Commit 8df6004

Browse files
author
Taois
committed
feat: MCP服务拆解优化
1 parent f485f7e commit 8df6004

File tree

10 files changed

+880
-681
lines changed

10 files changed

+880
-681
lines changed

drpy-node-mcp/README.md

Lines changed: 83 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
这是一个基于 [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) 实现的辅助服务,旨在帮助 AI 助手更方便地维护 `drpy-node` 项目。
44

5-
通过这个 MCP 服务,AI 可以直接安全地访问项目文件系统、管理爬虫源、检查路由信息以及执行基本的运维操作
5+
通过这个 MCP 服务,AI 可以直接安全地访问项目文件系统、管理爬虫源、检查路由信息、分析日志、查询数据库以及执行基本的运维操作
66

77
## 目录
88

@@ -14,11 +14,9 @@
1414
- [客户端配置 (Trae/Claude Desktop)](#客户端配置-traeclaude-desktop)
1515
- [可用工具 (Tools)](#可用工具-tools)
1616
- [文件系统操作](#文件系统操作)
17-
- [爬虫源管理](#爬虫源管理)
18-
- [高级开发工具 (New)](#高级开发工具-new)
19-
- [系统维护](#系统维护)
17+
- [爬虫开发与调试 (New)](#爬虫开发与调试-new)
18+
- [系统维护与监控 (New)](#系统维护与监控-new)
2019
- [AI 交互示例 (Best Practice)](#ai-交互示例-best-practice)
21-
- [配置说明](#配置说明)
2220

2321
## 安装与运行
2422

@@ -64,154 +62,114 @@ node index.js
6462
6563
## 可用工具 (Tools)
6664

67-
本服务提供以下工具供 AI 调用
65+
本服务提供以下工具供 AI 调用,旨在覆盖项目维护的全生命周期。
6866

6967
### 文件系统操作
7068

7169
* **`list_directory`**
72-
* **描述**: 列出项目中的文件和目录。
73-
* **参数**: `path` (可选,默认为项目根目录 `.`)
74-
* **用途**: 探索项目结构。
70+
* 描述: 列出项目中的文件和目录。
71+
* 参数: `path` (可选,默认为项目根目录 `.`)
72+
* 用途: 探索项目结构。
7573

7674
* **`read_file`**
77-
* **描述**: 读取指定文件的内容。
78-
* **参数**: `path` (必填,相对于项目根目录的文件路径)
79-
* **用途**: 读取代码、配置文件等。
75+
* 描述: 读取指定文件的内容(支持自动解密 DS 格式的加密 JS 源文件)
76+
* 参数: `path` (必填)
77+
* 用途: 读取代码、配置文件等。
8078

8179
* **`write_file`**
82-
* **描述**: 写入内容到文件(如果目录不存在会自动创建)。
83-
* **参数**:
84-
* `path` (必填)
85-
* `content` (必填)
86-
* **用途**: 修改代码、新建文件。
80+
* 描述: 写入内容到文件(自动创建目录)。
81+
* 参数: `path` (必填), `content` (必填)
82+
* 用途: 修改代码、新建文件。
8783

8884
* **`delete_file`**
89-
* **描述**: 删除指定的文件或目录。
90-
* **参数**: `path` (必填)
91-
* **用途**: 清理废弃文件。
85+
* 描述: 删除指定的文件或目录。
86+
* 参数: `path` (必填)
87+
* 用途: 清理废弃文件。
9288

93-
### 爬虫源管理
89+
### 爬虫开发与调试 (New)
9490

95-
* **`list_sources`**
96-
* **描述**: 专门列出 `spider/js/``spider/catvod/` 目录下的所有爬虫源文件。
97-
* **参数**: 无
98-
* **用途**: 快速获取当前项目中的所有爬虫源列表,无需遍历整个目录。
99-
100-
* **`check_syntax`**
101-
* **描述**: 检查指定 JavaScript 文件的语法是否正确(使用 `node --check`)。
102-
* **参数**: `path` (必填)
103-
* **用途**: 在修改或创建 JS 文件后,验证是否存在语法错误。
91+
这些工具专门为编写和调试 drpy 爬虫源(JS)设计,赋予 AI 强大的代码理解和验证能力。
10492

105-
### 高级开发工具 (New)
93+
* **`list_sources`**
94+
* 描述: 列出 `spider/js/``spider/catvod/` 下的所有源文件。
95+
* 用途: 快速概览现有爬虫源。
10696

10797
* **`fetch_spider_url`**
108-
* **描述**: 使用 `drpy-node` 的请求库抓取 URL 内容,支持自定义 Header 和 Method。
109-
* **参数**:
110-
* `url` (必填): 目标 URL。
111-
* `options` (可选): 请求配置对象。
112-
* `method`: HTTP 方法 (GET, POST)。
113-
* `headers`: 请求头 (User-Agent, Cookie, Referer 等)。
114-
* `data`: 请求体数据 (POST 数据)。
115-
* **用途**: AI 在编写源之前,先调用此工具确认网站的可访问性,测试反爬策略(如是否需要特定 UA 或 Cookie),并获取原始内容以供分析。
98+
* 描述: 使用 drpy-node 的请求库 (`req`) 抓取 URL。
99+
* 参数: `url` (必填), `options` (可选: method, headers, data)
100+
* 用途: 调试目标网站的连通性、反爬策略(如 Headers 校验)。
116101

117102
* **`debug_spider_rule`**
118-
* **描述**: 调试 drpy 爬虫规则,支持解析 HTML 内容或在线抓取 URL。
119-
* **参数**:
120-
* `html` (可选): 需要解析的 HTML 文本内容。
121-
* `url` (可选): 需要抓取的网页 URL(若未提供 `html`,则会自动请求此 URL)。
122-
* `rule` (必填): drpy 解析规则 (如 `.list li`, `a&&href`, `body&&Text`)。
123-
* `mode` (必填): 解析模式,可选 `pdfa` (列表), `pdfh` (HTML), `pd` (URL)。
124-
* `baseUrl` (可选): 用于拼接相对链接的基础 URL。
125-
* `options` (可选): 请求配置 (method, headers, data)。
126-
* **用途**: AI 在编写或修复源时,可直接使用此工具验证选择器是否正确,无需运行完整爬虫。
127-
128-
* **`get_spider_template`**
129-
* **描述**: 获取标准的 `drpy` JS 爬虫源模板代码。
130-
* **参数**: 无
131-
* **特性**:
132-
* **默认使用基础写法**: `一级`, `二级`, `搜索`, `推荐` 均采用字符串/对象规则,简单易懂。
133-
* **保留高级选项**: 包含注释掉的 `async function` 模板,供复杂场景(如动态加载、加密参数)使用。
134-
* **用途**: AI 创建新源时,优先使用基础模板;仅在基础规则无法满足需求时,才启用高级异步函数。
135-
136-
* **`get_drpy_libs_info`**
137-
* **描述**: 获取 `drpy-node` 运行环境中可用的全局变量、辅助函数及开发规范。
138-
* **参数**: 无
139-
* **包含信息**:
140-
* 全局函数: `request`, `pdfa`, `pdfh`, `ungzip`, `$.require`
141-
* 开发规范: 明确指出优先使用字符串/对象规则,避免滥用异步函数。
142-
* 上下文变量 (`this`): `input`, `MY_PAGE`, `MY_CATE`
143-
* 第三方库: `Cheerio`, `CryptoJS`, `Underscore`
144-
* **用途**: 帮助 AI 了解当前的沙箱环境支持哪些能力,以便正确使用 `this` 上下文和内置库。
103+
* 描述: 使用 drpy 的解析规则(pdfa/pdfh/pd)解析 HTML 或 URL 内容。
104+
* 参数: `rule` (规则), `mode` (模式), `html``url`
105+
* 用途: 验证选择器(CSS Selector/Regex)是否正确,无需运行完整爬虫。
145106

146107
* **`validate_spider`**
147-
* **描述**: 对爬虫源文件进行深度校验,包括 JS 语法检查和 `drpy` 规则结构检查。
148-
* **参数**: `path` (必填)
149-
* **检查项**:
150-
* JS 语法正确性 (`node --check`)
151-
* `rule` 对象及必要字段 (`title`, `url`) 存在性
152-
* 高级特性检测: 异步解析函数、代理规则 (`proxy_rule`)、本地导入 (`$.require`)
153-
* 逻辑一致性: `filterable``filter_def` 的对应关系
154-
* **用途**: 在编写完源文件后,进行最终的质量把关,确保源码符合 drpy-node 的运行规范。
155-
156-
### 系统维护
157-
158-
* **`get_routes_info`**
159-
* **描述**: 分析 `controllers/index.js`,返回当前系统注册的所有 Fastify 路由控制器信息。
160-
* **参数**: 无
161-
* **用途**: 帮助 AI 理解当前的 API 和页面路由结构。
162-
163-
* **`restart_service`**
164-
* **描述**: 尝试通过 PM2 重启 `drpys` 服务。
165-
* **参数**: 无
166-
* **注意**: 仅在服务器环境安装了 PM2 且服务名为 `drpys` 时有效。
167-
168-
## AI 交互示例 (Best Practice)
169-
170-
配置完成后,您可以直接用自然语言向 AI 提出需求,AI 会自动选择合适的工具。以下是几个典型场景:
171-
172-
### 场景 1:修改现有爬虫源
173-
174-
**用户指令**:
175-
> "请帮我检查一下 '360影视[].js' 这个源,把它的 api 地址更新为 'https://new-api.360.com',修改完记得检查一下语法。"
108+
* 描述: 验证爬虫源文件的语法和基本结构。
109+
* 参数: `path` (必填)
110+
* 用途: 确保编写的代码没有语法错误且包含必要的 `rule` 定义。
176111

177-
**AI 执行流程**:
178-
1. 调用 `list_sources` 确认文件名。
179-
2. 调用 `read_file` 读取 `spider/js/360影视[官].js` 的内容。
180-
3. 在内存中修改代码。
181-
4. 调用 `write_file` 将新代码写回。
182-
5. 调用 `check_syntax` 确保没有引入语法错误。
112+
* **`get_spider_template`**
113+
* 描述: 获取标准的 drpy JS 爬虫模板。
114+
* 用途: AI 生成新爬虫时的起手式。
183115

184-
### 场景 2:排查服务启动问题
116+
* **`get_drpy_libs_info`**
117+
* 描述: 获取 drpy 环境中可用的全局函数和库信息(如 `pdfa`, `req`, `CryptoJS` 等)。
118+
* 用途: 帮助 AI 了解可用的 API 和工具函数。
185119

186-
**用户指令**:
187-
> "我最近加了几个新路由,但是服务启动好像有问题,帮我看看现在注册了哪些控制器,然后重启一下服务。"
120+
* **`check_syntax`**
121+
* 描述: 通用的 JS 语法检查工具。
122+
* 参数: `path` (必填)
123+
* 用途: 快速检查任何 JS 文件的语法正确性。
188124

189-
**AI 执行流程**:
190-
1. 调用 `get_routes_info` 获取当前 `controllers/index.js` 中的注册信息。
191-
2. 向用户汇报发现的路由。
192-
3. 调用 `restart_service` 重启 PM2 服务。
125+
### 系统维护与监控 (New)
193126

194-
### 场景 3:创建新源
127+
用于项目运行时的状态监控和配置管理。
195128

196-
**用户指令**:
197-
> "在 js 目录下帮我新建一个名为 'test_spider.js' 的源,写入一个基础的 drpy 模板。"
129+
* **`read_logs`**
130+
* 描述: 读取最新的应用程序日志(支持日志轮转)。
131+
* 参数: `lines` (读取行数,默认 50)
132+
* 用途: 排查运行时错误、分析系统行为。
198133

199-
**AI 执行流程**:
200-
1. 调用 `write_file` 创建 `spider/js/test_spider.js` 并写入模板代码。
201-
2. 调用 `list_sources` 确认文件已创建。
134+
* **`sql_query`**
135+
* 描述: 对 `database.db` 执行只读 SQL 查询 (SELECT)。
136+
* 参数: `query` (SQL 语句)
137+
* 用途: 检查数据库状态、用户数据或缓存记录。
202138

203-
### 场景 4:智能创建与校验爬虫源 (New)
139+
* **`manage_config`**
140+
* 描述: 读取或更新项目配置 (`config/env.json`)。
141+
* 参数: `action` (get/set), `key` (支持点号嵌套), `value`
142+
* 用途: 动态调整系统参数(如端口、超时设置等)。
204143

205-
**用户指令**:
206-
> "我要写一个新网站的源,网站叫 '酷酷影视',首页是 'https://kuku.com'。需要支持二级页面的异步解析,并且有防盗链处理。请用 drpy 模板帮我写好结构,如果不确定环境里有哪些库,先查一下。"
144+
* **`get_routes_info`**
145+
* 描述: 获取已注册的 Fastify 路由和控制器信息。
146+
* 用途: 了解系统当前的 API 暴露情况。
207147

208-
**AI 执行流程**:
209-
1. 调用 `get_spider_template` 获取标准模板。
210-
2. 调用 `get_drpy_libs_info` 确认 `pdfh` 等函数是否可用。
211-
3. 基于模板和用户提供的网址,生成代码并调用 `write_file` 写入 `spider/js/酷酷影视.js`
212-
4. 最后调用 `validate_spider` 对新文件进行语法和结构双重检查,确保可以直接运行。
148+
* **`restart_service`**
149+
* 描述: 重启 drpy-node 服务 (PM2)。
150+
* 用途: 应用配置更改或代码更新后重启服务。
213151

214-
## 配置说明
152+
## AI 交互示例 (Best Practice)
215153

216-
* **安全限制**: 所有文件操作都被限制在 `drpy-node` 项目根目录下,无法访问项目外部的文件。
217-
* **依赖**: 本服务依赖于 `@modelcontextprotocol/sdk`, `fs-extra`, `zod` 等库。
154+
**场景 1:修复爬虫源**
155+
> User: "XX 网站的爬虫好像失效了,列表页解析不到数据。"
156+
> AI Action:
157+
> 1. 调用 `fetch_spider_url` 获取目标网页源码,确认网站是否能访问或有反爬。
158+
> 2. 读取原爬虫代码 (`read_file`)。
159+
> 3. 调用 `debug_spider_rule` 测试原有规则是否还能匹配到内容。
160+
> 4. 如果规则失效,调整规则并再次测试。
161+
> 5. 确认修复后,使用 `write_file` 更新代码。
162+
163+
**场景 2:系统故障排查**
164+
> User: "服务好像报错了,看一下日志。"
165+
> AI Action:
166+
> 1. 调用 `read_logs` 获取最近的错误堆栈。
167+
> 2. 根据错误信息定位相关代码文件。
168+
> 3. 分析并提出修复建议。
169+
170+
**场景 3:配置修改**
171+
> User: "把服务端口改成 3000。"
172+
> AI Action:
173+
> 1. 调用 `manage_config` 读取当前配置,确认键名(如 `port``server.port`)。
174+
> 2. 调用 `manage_config` (action=set) 更新配置。
175+
> 3. 调用 `restart_service` 使配置生效。

0 commit comments

Comments
 (0)