accoding-mcp-server-test-new 0.1.1 → 0.1.3

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 CHANGED
@@ -158,3 +158,27 @@ curl -X POST http://localhost:3000/mcp \
158
158
  3. **简化注册**:`RegistryBase` 只区分认证/非认证,不需要区分站点
159
159
  4. **API 目录**:使用 `api/` 目录替代 `graphql/` 目录
160
160
 
161
+
162
+ 服务器部署:
163
+ pm2 start ecosystem.config.cjs
164
+ # 查看状态
165
+ pm2 status
166
+
167
+ # 查看日志
168
+ pm2 logs accoding-mcp
169
+ pm2 logs accoding-mcp --lines 50
170
+
171
+ # 重启应用
172
+ pm2 restart accoding-mcp
173
+
174
+ # 停止应用
175
+ pm2 stop accoding-mcp
176
+
177
+ # 删除应用
178
+ pm2 delete accoding-mcp
179
+
180
+ # 监控
181
+ pm2 monit
182
+
183
+ # 重新加载(代码更新后)
184
+ pm2 reload accoding-mcp
@@ -35,6 +35,34 @@ export interface AccodingBaseService {
35
35
  * 需要有效的 session cookie
36
36
  */
37
37
  getUserWeeklySubmissions(): Promise<any>;
38
+ /**
39
+ * 获取所有标签列表
40
+ * 用于获取标签ID和名称的对应关系
41
+ */
42
+ getAllTags(): Promise<any>;
43
+ /**
44
+ * 搜索题目
45
+ * 支持按标题、ID、作者、标签等条件搜索
46
+ * tagNames 会自动转换为 tagIds
47
+ * 会自动获取所有页的数据并合并返回(最多20页,每页10道题目)
48
+ */
49
+ searchProblems(titleSearch?: string, idSearch?: string, authorSearch?: string, tagNames?: string[]): Promise<any>;
50
+ /**
51
+ * 根据题目ID获取题目详情
52
+ * 包括题目内容、统计信息、支持的语言等,并计算通过率和正确率
53
+ */
54
+ getProblemInfo(problemId: string): Promise<any>;
55
+ /**
56
+ * 获取题目提交记录
57
+ * 根据题目ID获取该题目的所有提交记录,支持按结果类型和提交ID过滤
58
+ * 会自动获取所有页的数据并合并返回
59
+ */
60
+ getProblemSubmissions(problemId: string, result?: string, submissionId?: string): Promise<any>;
61
+ /**
62
+ * 根据提交记录ID获取提交详情和代码
63
+ * 包括提交详情(评测结果、时间、内存等)和提交的代码
64
+ */
65
+ getSubmissionDetail(submissionId: string): Promise<any>;
38
66
  /**
39
67
  * 检查当前服务是否有有效的认证凭证
40
68
  */
@@ -11,5 +11,10 @@ export declare class AccodingServiceImpl implements AccodingBaseService {
11
11
  getMyClassList(): Promise<any>;
12
12
  getUserSubmissionStats(): Promise<any>;
13
13
  getUserWeeklySubmissions(): Promise<any>;
14
+ getAllTags(): Promise<any>;
15
+ searchProblems(titleSearch?: string, idSearch?: string, authorSearch?: string, tagNames?: string[]): Promise<any>;
16
+ getProblemInfo(problemId: string): Promise<any>;
17
+ getProblemSubmissions(problemId: string, result?: string, submissionId?: string): Promise<any>;
18
+ getSubmissionDetail(submissionId: string): Promise<any>;
14
19
  isAuthenticated(): boolean;
15
20
  }
@@ -1,5 +1,8 @@
1
+ import * as problemApi from "./api/problem-api.js";
1
2
  import * as userApi from "./api/user-api.js";
2
3
  import * as contestApi from "./api/contest-api.js";
4
+ import * as submissionApi from "./api/submission-api.js";
5
+ import logger from "../utils/logger.js";
3
6
  /**
4
7
  * Accoding服务实现
5
8
  */
@@ -32,6 +35,234 @@ export class AccodingServiceImpl {
32
35
  // 调用真实的userApi获取用户本周提交情况
33
36
  return await userApi.getUserWeeklySubmissions(this.session);
34
37
  }
38
+ async getAllTags() {
39
+ // 调用真实的problemApi获取所有标签
40
+ return await problemApi.getAllTags(this.session);
41
+ }
42
+ async searchProblems(titleSearch, idSearch, authorSearch, tagNames) {
43
+ // 固定每页显示10道题目
44
+ const limit = 10;
45
+ // 如果提供了标签名称,需要先转换为标签ID
46
+ // 注意:API的tagSearch参数需要的是ID数组(number[]),而不是名称数组
47
+ let tagIds;
48
+ if (tagNames && tagNames.length > 0) {
49
+ try {
50
+ // 步骤1:调用API获取所有标签列表,建立标签名称到ID的映射关系
51
+ const allTags = await problemApi.getAllTags(this.session);
52
+ // 步骤2:创建标签名称到ID的映射表
53
+ const tagMap = new Map();
54
+ allTags.forEach((tag) => {
55
+ tagMap.set(tag.name, tag.id);
56
+ });
57
+ // 步骤3:将用户提供的标签名称数组转换为标签ID数组
58
+ // 例如:["二叉树", "动态规划"] -> [2, 1]
59
+ tagIds = tagNames
60
+ .map((name) => tagMap.get(name))
61
+ .filter((id) => id !== undefined);
62
+ logger.info(`标签名称转换: ${JSON.stringify(tagNames)} -> ${JSON.stringify(tagIds)}`);
63
+ if (tagIds.length === 0) {
64
+ logger.warn("未找到匹配的标签,将使用默认标签映射");
65
+ // 使用默认映射
66
+ const defaultTagMap = {
67
+ "动态规划": 1,
68
+ "二叉树": 2,
69
+ "分治": 3,
70
+ "判断": 5
71
+ };
72
+ tagIds = tagNames
73
+ .map((name) => defaultTagMap[name])
74
+ .filter((id) => id !== undefined);
75
+ }
76
+ }
77
+ catch (error) {
78
+ logger.warn("获取标签列表失败,使用默认标签映射: %s", error);
79
+ // 使用默认映射
80
+ const defaultTagMap = {
81
+ "动态规划": 1,
82
+ "二叉树": 2,
83
+ "分治": 3,
84
+ "判断": 5
85
+ };
86
+ tagIds = tagNames
87
+ .map((name) => defaultTagMap[name])
88
+ .filter((id) => id !== undefined);
89
+ }
90
+ }
91
+ // 先获取总页数
92
+ const totalPages = await problemApi.getProblemSearchPageNum(limit, titleSearch, idSearch, authorSearch, tagIds, this.session);
93
+ // 设置最大页数限制,避免获取过多数据
94
+ const MAX_PAGES = 20;
95
+ const pagesToFetch = Math.min(totalPages, MAX_PAGES);
96
+ const isTruncated = totalPages > MAX_PAGES;
97
+ // 获取指定页数的数据
98
+ const allProblems = [];
99
+ for (let page = 1; page <= pagesToFetch; page++) {
100
+ const problems = await problemApi.searchProblems(page, limit, titleSearch, idSearch, authorSearch, tagIds, this.session);
101
+ allProblems.push(...problems);
102
+ }
103
+ // 为每个题目生成链接并添加status和difficulty说明
104
+ // status含义:0=已通过,1=做了但没通过,2=还没做
105
+ // difficulty是难度星级,范围1.0-5.0,表示1-5颗星
106
+ const problemsWithLinks = allProblems.map((problem) => {
107
+ const statusMap = {
108
+ 0: "已通过",
109
+ 1: "做了但没通过",
110
+ 2: "还没做"
111
+ };
112
+ // 格式化难度星级(1.0-5.0,表示1-5颗星)
113
+ let difficultyText = "未知";
114
+ if (problem.difficulty !== undefined && problem.difficulty !== null) {
115
+ const rounded = parseFloat(problem.difficulty).toFixed(1);
116
+ difficultyText = `${rounded}颗星 (${problem.difficulty})`;
117
+ }
118
+ return {
119
+ ...problem,
120
+ link: `http://10.251.252.33/problem/${problem.id}`,
121
+ statusText: statusMap[problem.status] || `未知状态(${problem.status})`,
122
+ difficultyText: difficultyText
123
+ };
124
+ });
125
+ return {
126
+ problems: problemsWithLinks,
127
+ totalPages: totalPages,
128
+ fetchedPages: pagesToFetch,
129
+ limit: limit,
130
+ totalCount: problemsWithLinks.length,
131
+ isTruncated: isTruncated,
132
+ message: isTruncated
133
+ ? `共找到 ${totalPages} 页题目,但只返回了前 ${pagesToFetch} 页(共 ${problemsWithLinks.length} 道题目)。如需查看更多结果,请添加更具体的搜索条件(如标题、标签等)来缩小搜索范围。`
134
+ : `共找到 ${totalPages} 页题目,已全部返回(共 ${problemsWithLinks.length} 道题目)。`
135
+ };
136
+ }
137
+ async getProblemInfo(problemId) {
138
+ // 调用真实的problemApi获取题目详情
139
+ const data = await problemApi.getProblemInfo(problemId, this.session);
140
+ const problem = data.problem || {};
141
+ const languages = data.languages || [];
142
+ // 计算通过率(通过人数/提交人数)
143
+ const passRate = problem.sub_user_num > 0
144
+ ? (problem.ac_user_num / problem.sub_user_num * 100).toFixed(2) + '%'
145
+ : '0%';
146
+ // 计算正确率(通过次数/提交次数)
147
+ const correctRate = problem.sub_num > 0
148
+ ? (problem.ac_num / problem.sub_num * 100).toFixed(2) + '%'
149
+ : '0%';
150
+ // 格式化时间限制(毫秒转秒)
151
+ const timeLimitSeconds = problem.time_limit ? (problem.time_limit / 1000).toFixed(2) + '秒' : '未知';
152
+ // 格式化内存限制(字节转KB/MB)
153
+ let memoryLimitFormatted = '未知';
154
+ if (problem.memory_limit) {
155
+ if (problem.memory_limit >= 1024 * 1024) {
156
+ memoryLimitFormatted = (problem.memory_limit / (1024 * 1024)).toFixed(2) + 'MB';
157
+ }
158
+ else if (problem.memory_limit >= 1024) {
159
+ memoryLimitFormatted = (problem.memory_limit / 1024).toFixed(2) + 'KB';
160
+ }
161
+ else {
162
+ memoryLimitFormatted = problem.memory_limit + 'B';
163
+ }
164
+ }
165
+ return {
166
+ problem: {
167
+ ...problem,
168
+ id: problemId,
169
+ link: `http://10.251.252.33/problem/${problemId}`,
170
+ passRate: passRate,
171
+ correctRate: correctRate,
172
+ timeLimitFormatted: timeLimitSeconds,
173
+ memoryLimitFormatted: memoryLimitFormatted
174
+ },
175
+ languages: languages,
176
+ statistics: {
177
+ subNum: problem.sub_num || 0,
178
+ subUserNum: problem.sub_user_num || 0,
179
+ acNum: problem.ac_num || 0,
180
+ acUserNum: problem.ac_user_num || 0,
181
+ passRate: passRate,
182
+ correctRate: correctRate
183
+ }
184
+ };
185
+ }
186
+ async getProblemSubmissions(problemId, result, submissionId) {
187
+ // 固定每页显示20条记录
188
+ const pageSize = 20;
189
+ // 先获取总页数
190
+ const totalPages = await submissionApi.getProblemSubmissionPageNum(problemId, pageSize, result, submissionId, this.session);
191
+ // 获取所有页的数据
192
+ const allSubmissions = [];
193
+ for (let page = 1; page <= totalPages; page++) {
194
+ const submissions = await submissionApi.getProblemSubmissions(problemId, page, pageSize, result, submissionId, this.session);
195
+ allSubmissions.push(...submissions);
196
+ }
197
+ // 添加结果说明
198
+ const resultMap = {
199
+ "AC": "通过 (Accepted)",
200
+ "CE": "编译错误 (Compilation Error)",
201
+ "PE": "输出错误 (Presentation Error)",
202
+ "OE": "其他错误 (Other Error)",
203
+ "WA": "未通过 (Wrong Answer)",
204
+ "TLE": "超时 (Time Limit Exceeded)"
205
+ };
206
+ const submissionsWithDescription = allSubmissions.map((submission) => ({
207
+ ...submission,
208
+ resultText: resultMap[submission.result] || submission.result || "未知"
209
+ }));
210
+ return {
211
+ submissions: submissionsWithDescription,
212
+ totalPages: totalPages,
213
+ pageSize: pageSize,
214
+ totalCount: submissionsWithDescription.length,
215
+ problemId: problemId,
216
+ filters: {
217
+ result: result || null,
218
+ submissionId: submissionId || null
219
+ }
220
+ };
221
+ }
222
+ async getSubmissionDetail(submissionId) {
223
+ // 同时获取提交详情和代码
224
+ const [detail, codeData] = await Promise.all([
225
+ submissionApi.getSubmissionDetail(submissionId, this.session),
226
+ submissionApi.getSubmissionCode(submissionId, this.session)
227
+ ]);
228
+ // 添加结果说明
229
+ const resultMap = {
230
+ "AC": "通过 (Accepted)",
231
+ "CE": "编译错误 (Compilation Error)",
232
+ "PE": "输出错误 (Presentation Error)",
233
+ "OE": "其他错误 (Other Error)",
234
+ "WA": "未通过 (Wrong Answer)",
235
+ "TLE": "超时 (Time Limit Exceeded)"
236
+ };
237
+ // 格式化时间成本(毫秒转秒)
238
+ const timeCostFormatted = detail.timeCost
239
+ ? `${(detail.timeCost / 1000).toFixed(3)}秒`
240
+ : "未知";
241
+ // 格式化内存成本(字节转KB/MB)
242
+ let memoryCostFormatted = "未知";
243
+ if (detail.memoryCost) {
244
+ if (detail.memoryCost >= 1024 * 1024) {
245
+ memoryCostFormatted = (detail.memoryCost / (1024 * 1024)).toFixed(2) + "MB";
246
+ }
247
+ else if (detail.memoryCost >= 1024) {
248
+ memoryCostFormatted = (detail.memoryCost / 1024).toFixed(2) + "KB";
249
+ }
250
+ else {
251
+ memoryCostFormatted = detail.memoryCost + "B";
252
+ }
253
+ }
254
+ return {
255
+ submission: {
256
+ ...detail,
257
+ resultText: resultMap[detail.result] || detail.result || "未知",
258
+ timeCostFormatted: timeCostFormatted,
259
+ memoryCostFormatted: memoryCostFormatted,
260
+ problemLink: `http://10.251.252.33/problem/${detail.problemId}`
261
+ },
262
+ code: codeData.code || "",
263
+ submissionId: submissionId
264
+ };
265
+ }
35
266
  isAuthenticated() {
36
267
  return !!this.session;
37
268
  }
@@ -1 +1 @@
1
- {"version":3,"file":"accoding-service-impl.js","sourceRoot":"","sources":["../../src/accoding/accoding-service-impl.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,OAAO,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,UAAU,MAAM,sBAAsB,CAAC;AAGnD;;GAEG;AACH,MAAM,OAAO,mBAAmB;IACpB,OAAO,CAAU;IAEzB,YAAY,OAAgB;QACxB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,SAAiB;QACtC,wBAAwB;QACxB,OAAO,MAAM,UAAU,CAAC,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,WAAW;QACb,qBAAqB;QACrB,OAAO,MAAM,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAAkB,EAAE,UAAmB;QACtD,qBAAqB;QACrB,OAAO,MAAM,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,cAAc;QAChB,uBAAuB;QACvB,OAAO,MAAM,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,sBAAsB;QACxB,uBAAuB;QACvB,OAAO,MAAM,OAAO,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,wBAAwB;QAC1B,yBAAyB;QACzB,OAAO,MAAM,OAAO,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChE,CAAC;IAED,eAAe;QACX,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;IAC1B,CAAC;CACJ"}
1
+ {"version":3,"file":"accoding-service-impl.js","sourceRoot":"","sources":["../../src/accoding/accoding-service-impl.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  * Accoding平台比赛相关API调用
3
3
  */
4
4
  //const API_BASE_URL = "https://accoding.buaa.edu.cn";
5
- const API_BASE_URL = "https://http://10.251.252.33";
5
+ const API_BASE_URL = "http://10.251.252.33";
6
6
  /**
7
7
  * 向Accoding API发起HTTP请求
8
8
  */
@@ -1 +1 @@
1
- {"version":3,"file":"contest-api.js","sourceRoot":"","sources":["../../../src/accoding/api/contest-api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contest-api.js","sourceRoot":"","sources":["../../../src/accoding/api/contest-api.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,23 @@
1
1
  /**
2
2
  * Accoding平台题目相关API调用
3
- * 预留文件,当前无需实现具体功能
4
3
  */
5
- export {};
4
+ /**
5
+ * 获取所有标签列表
6
+ * 用于获取标签ID和名称的对应关系
7
+ */
8
+ export declare function getAllTags(session?: string): Promise<any>;
9
+ /**
10
+ * 获取题目搜索的总页数
11
+ */
12
+ export declare function getProblemSearchPageNum(limit: number, titleSearch?: string, idSearch?: string, authorSearch?: string, tagSearch?: number[], // int类型数组,里边为tag的id
13
+ session?: string): Promise<number>;
14
+ /**
15
+ * 搜索题目
16
+ */
17
+ export declare function searchProblems(page: number, limit: number, titleSearch?: string, idSearch?: string, authorSearch?: string, tagSearch?: number[], // int类型数组,里边为tag的id
18
+ session?: string): Promise<any>;
19
+ /**
20
+ * 根据题目ID获取题目详情
21
+ * @param problemId 题目ID
22
+ */
23
+ export declare function getProblemInfo(problemId: string, session?: string): Promise<any>;
@@ -1,9 +1,8 @@
1
1
  /**
2
2
  * Accoding平台题目相关API调用
3
- * 预留文件,当前无需实现具体功能
4
3
  */
5
4
  //const API_BASE_URL = "https://accoding.buaa.edu.cn";
6
- const API_BASE_URL = "https://http://10.251.252.33";
5
+ const API_BASE_URL = "http://10.251.252.33";
7
6
  /**
8
7
  * 向Accoding API发起HTTP请求
9
8
  */
@@ -14,17 +13,120 @@ async function apiRequest(endpoint, options = {}, session) {
14
13
  ...options.headers
15
14
  };
16
15
  if (session) {
17
- headers["Cookie"] = session;
16
+ headers["Authorization"] = session;
18
17
  }
19
18
  const response = await fetch(url, {
20
19
  ...options,
21
20
  headers
22
21
  });
23
22
  if (!response.ok) {
24
- throw new Error(`API请求失败: ${response.status} ${response.statusText}`);
23
+ const errorText = await response.text().catch(() => response.statusText);
24
+ throw new Error(`API请求失败: ${response.status} ${errorText}`);
25
25
  }
26
- return await response.json();
26
+ const contentType = response.headers.get("content-type");
27
+ if (contentType && contentType.includes("application/json")) {
28
+ return await response.json();
29
+ }
30
+ else {
31
+ const text = await response.text();
32
+ throw new Error(`API返回了非JSON内容: ${contentType}`);
33
+ }
34
+ }
35
+ /**
36
+ * 获取所有标签列表
37
+ * 用于获取标签ID和名称的对应关系
38
+ */
39
+ export async function getAllTags(session) {
40
+ const response = await apiRequest("/api/admin/tag/all", { method: "GET" }, session);
41
+ // 检查响应格式
42
+ if (response.status !== 200) {
43
+ throw new Error(`获取标签列表失败: ${response.msg || "未知错误"}`);
44
+ }
45
+ // 返回标签列表数据
46
+ return response.data || [];
47
+ }
48
+ /**
49
+ * 获取题目搜索的总页数
50
+ */
51
+ export async function getProblemSearchPageNum(limit, titleSearch, idSearch, authorSearch, tagSearch, // int类型数组,里边为tag的id
52
+ session) {
53
+ // 构建查询参数
54
+ const params = new URLSearchParams();
55
+ params.append("limit", limit.toString());
56
+ if (titleSearch) {
57
+ params.append("titleSearch", titleSearch);
58
+ }
59
+ if (idSearch) {
60
+ params.append("idSearch", idSearch);
61
+ }
62
+ if (authorSearch) {
63
+ params.append("AuthorSearch", authorSearch);
64
+ }
65
+ if (tagSearch && tagSearch.length > 0) {
66
+ // tagSearch 是int类型数组,需要特殊处理
67
+ // 使用重复参数格式:tagSearch=5&tagSearch=6
68
+ // URLSearchParams.append() 需要字符串参数,所以需要toString()
69
+ tagSearch.forEach((tagId) => {
70
+ params.append("tagSearch", tagId.toString());
71
+ });
72
+ }
73
+ const queryString = params.toString();
74
+ const endpoint = `/api/problem/searchPageNum?${queryString}`;
75
+ const response = await apiRequest(endpoint, { method: "GET" }, session);
76
+ // 检查响应格式
77
+ if (response.status !== 200) {
78
+ throw new Error(`获取搜索页数失败: ${response.msg || "未知错误"}`);
79
+ }
80
+ // 返回页数
81
+ return response.data || 1;
82
+ }
83
+ /**
84
+ * 搜索题目
85
+ */
86
+ export async function searchProblems(page, limit, titleSearch, idSearch, authorSearch, tagSearch, // int类型数组,里边为tag的id
87
+ session) {
88
+ // 构建查询参数
89
+ const params = new URLSearchParams();
90
+ params.append("page", page.toString());
91
+ params.append("limit", limit.toString());
92
+ if (titleSearch) {
93
+ params.append("titleSearch", titleSearch);
94
+ }
95
+ if (idSearch) {
96
+ params.append("idSearch", idSearch);
97
+ }
98
+ if (authorSearch) {
99
+ params.append("AuthorSearch", authorSearch);
100
+ }
101
+ if (tagSearch && tagSearch.length > 0) {
102
+ // tagSearch 是int类型数组,需要特殊处理
103
+ // 使用重复参数格式:tagSearch=5&tagSearch=6
104
+ // URLSearchParams.append() 需要字符串参数,所以需要toString()
105
+ tagSearch.forEach((tagId) => {
106
+ params.append("tagSearch", tagId.toString());
107
+ });
108
+ }
109
+ const queryString = params.toString();
110
+ const endpoint = `/api/problem/search?${queryString}`;
111
+ const response = await apiRequest(endpoint, { method: "GET" }, session);
112
+ // 检查响应格式
113
+ if (response.status !== 200) {
114
+ throw new Error(`搜索题目失败: ${response.msg || "未知错误"}`);
115
+ }
116
+ // 返回题目列表数据
117
+ return response.data || [];
118
+ }
119
+ /**
120
+ * 根据题目ID获取题目详情
121
+ * @param problemId 题目ID
122
+ */
123
+ export async function getProblemInfo(problemId, session) {
124
+ const response = await apiRequest(`/api/problem/${problemId}/info`, { method: "GET" }, session);
125
+ // 检查响应格式
126
+ if (response.status !== 200) {
127
+ throw new Error(`获取题目详情失败: ${response.msg || "未知错误"}`);
128
+ }
129
+ // 返回题目详情数据
130
+ return response.data || {};
27
131
  }
28
- export {};
29
- // 此文件暂时没有导出的API函数,后续需要题目相关功能时再实现
30
132
  //# sourceMappingURL=problem-api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"problem-api.js","sourceRoot":"","sources":["../../../src/accoding/api/problem-api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,sDAAsD;AACtD,MAAM,YAAY,GAAG,8BAA8B,CAAC;AAEpD;;GAEG;AACH,KAAK,UAAU,UAAU,CACrB,QAAgB,EAChB,UAAuB,EAAE,EACzB,OAAgB;IAEhB,MAAM,GAAG,GAAG,GAAG,YAAY,GAAG,QAAQ,EAAE,CAAC;IACzC,MAAM,OAAO,GAA2B;QACpC,cAAc,EAAE,kBAAkB;QAClC,GAAI,OAAO,CAAC,OAAkC;KACjD,CAAC;IAEF,IAAI,OAAO,EAAE,CAAC;QACV,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;IAChC,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC9B,GAAG,OAAO;QACV,OAAO;KACV,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,YAAY,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;AACjC,CAAC;;AAED,iCAAiC"}
1
+ {"version":3,"file":"problem-api.js","sourceRoot":"","sources":["../../../src/accoding/api/problem-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Accoding平台提交记录相关API调用
3
+ */
4
+ /**
5
+ * 获取题目提交记录的总页数
6
+ * @param problemId 题目ID
7
+ * @param pageSize 每页大小,固定为20
8
+ * @param result 评测结果过滤(可选):AC、CE、PE、OE、WA、TLE
9
+ * @param submissionId 提交记录ID精确匹配(可选)
10
+ */
11
+ export declare function getProblemSubmissionPageNum(problemId: string, pageSize?: number, result?: string, submissionId?: string, session?: string): Promise<number>;
12
+ /**
13
+ * 获取题目的提交记录
14
+ * @param problemId 题目ID
15
+ * @param page 页码
16
+ * @param pageSize 每页大小,固定为20
17
+ * @param result 评测结果过滤(可选):AC、CE、PE、OE、WA、TLE
18
+ * @param submissionId 提交记录ID精确匹配(可选)
19
+ */
20
+ export declare function getProblemSubmissions(problemId: string, page: number, pageSize?: number, result?: string, submissionId?: string, session?: string): Promise<any>;
21
+ /**
22
+ * 根据提交记录ID获取提交详情
23
+ * @param submissionId 提交记录ID
24
+ */
25
+ export declare function getSubmissionDetail(submissionId: string, session?: string): Promise<any>;
26
+ /**
27
+ * 根据提交记录ID获取提交代码
28
+ * @param submissionId 提交记录ID
29
+ */
30
+ export declare function getSubmissionCode(submissionId: string, session?: string): Promise<any>;
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Accoding平台提交记录相关API调用
3
+ */
4
+ //const API_BASE_URL = "https://accoding.buaa.edu.cn";
5
+ const API_BASE_URL = "http://10.251.252.33";
6
+ /**
7
+ * 向Accoding API发起HTTP请求
8
+ */
9
+ async function apiRequest(endpoint, options = {}, session) {
10
+ const url = `${API_BASE_URL}${endpoint}`;
11
+ const headers = {
12
+ "Content-Type": "application/json",
13
+ ...options.headers
14
+ };
15
+ if (session) {
16
+ headers["Authorization"] = session;
17
+ }
18
+ const response = await fetch(url, {
19
+ ...options,
20
+ headers
21
+ });
22
+ if (!response.ok) {
23
+ const errorText = await response.text().catch(() => response.statusText);
24
+ throw new Error(`API请求失败: ${response.status} ${errorText}`);
25
+ }
26
+ const contentType = response.headers.get("content-type");
27
+ if (contentType && contentType.includes("application/json")) {
28
+ return await response.json();
29
+ }
30
+ else {
31
+ const text = await response.text();
32
+ throw new Error(`API返回了非JSON内容: ${contentType}`);
33
+ }
34
+ }
35
+ /**
36
+ * 获取题目提交记录的总页数
37
+ * @param problemId 题目ID
38
+ * @param pageSize 每页大小,固定为20
39
+ * @param result 评测结果过滤(可选):AC、CE、PE、OE、WA、TLE
40
+ * @param submissionId 提交记录ID精确匹配(可选)
41
+ */
42
+ export async function getProblemSubmissionPageNum(problemId, pageSize = 20, result, submissionId, session) {
43
+ // 构建查询参数
44
+ const params = new URLSearchParams();
45
+ params.append("pageSize", pageSize.toString());
46
+ if (result) {
47
+ params.append("result", result);
48
+ }
49
+ if (submissionId) {
50
+ params.append("submissionId", submissionId);
51
+ }
52
+ const queryString = params.toString();
53
+ const endpoint = `/api/submission/problem/${problemId}/pageNum?${queryString}`;
54
+ const response = await apiRequest(endpoint, { method: "GET" }, session);
55
+ // 检查响应格式
56
+ if (response.status !== 200) {
57
+ throw new Error(`获取提交记录页数失败: ${response.msg || "未知错误"}`);
58
+ }
59
+ // 返回页数
60
+ return response.data || 1;
61
+ }
62
+ /**
63
+ * 获取题目的提交记录
64
+ * @param problemId 题目ID
65
+ * @param page 页码
66
+ * @param pageSize 每页大小,固定为20
67
+ * @param result 评测结果过滤(可选):AC、CE、PE、OE、WA、TLE
68
+ * @param submissionId 提交记录ID精确匹配(可选)
69
+ */
70
+ export async function getProblemSubmissions(problemId, page, pageSize = 20, result, submissionId, session) {
71
+ // 构建查询参数
72
+ const params = new URLSearchParams();
73
+ params.append("page", page.toString());
74
+ params.append("pageSize", pageSize.toString());
75
+ if (result) {
76
+ params.append("result", result);
77
+ }
78
+ if (submissionId) {
79
+ params.append("submissionId", submissionId);
80
+ }
81
+ const queryString = params.toString();
82
+ const endpoint = `/api/submission/problem/${problemId}?${queryString}`;
83
+ const response = await apiRequest(endpoint, { method: "GET" }, session);
84
+ // 检查响应格式
85
+ if (response.status !== 200) {
86
+ throw new Error(`获取提交记录失败: ${response.msg || "未知错误"}`);
87
+ }
88
+ // 返回提交记录数据
89
+ return response.data || [];
90
+ }
91
+ /**
92
+ * 根据提交记录ID获取提交详情
93
+ * @param submissionId 提交记录ID
94
+ */
95
+ export async function getSubmissionDetail(submissionId, session) {
96
+ const response = await apiRequest(`/api/submission/${submissionId}`, { method: "GET" }, session);
97
+ // 检查响应格式
98
+ if (response.status !== 200) {
99
+ throw new Error(`获取提交详情失败: ${response.msg || "未知错误"}`);
100
+ }
101
+ // 返回提交详情数据
102
+ return response.data || {};
103
+ }
104
+ /**
105
+ * 根据提交记录ID获取提交代码
106
+ * @param submissionId 提交记录ID
107
+ */
108
+ export async function getSubmissionCode(submissionId, session) {
109
+ const response = await apiRequest(`/api/submission/${submissionId}/codeDetail`, { method: "GET" }, session);
110
+ // 检查响应格式
111
+ if (response.status !== 200) {
112
+ throw new Error(`获取提交代码失败: ${response.msg || "未知错误"}`);
113
+ }
114
+ // 返回提交代码数据
115
+ return response.data || {};
116
+ }
117
+ //# sourceMappingURL=submission-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submission-api.js","sourceRoot":"","sources":["../../../src/accoding/api/submission-api.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,14 @@ import { ToolRegistry } from "./tool-registry.js";
8
8
  export declare class ProblemToolRegistry extends ToolRegistry {
9
9
  protected registerCommon(): void;
10
10
  protected registerAuthenticated(): void;
11
+ /**
12
+ * 注册搜索题目的工具
13
+ */
14
+ private registerSearchProblems;
15
+ /**
16
+ * 注册获取题目详情的工具
17
+ */
18
+ private registerGetProblemInfo;
11
19
  }
12
20
  /**
13
21
  * 注册所有题目相关工具
@@ -1,3 +1,4 @@
1
+ import { z } from "zod";
1
2
  import { ToolRegistry } from "./tool-registry.js";
2
3
  /**
3
4
  * 题目工具注册器
@@ -5,10 +6,100 @@ import { ToolRegistry } from "./tool-registry.js";
5
6
  */
6
7
  export class ProblemToolRegistry extends ToolRegistry {
7
8
  registerCommon() {
8
- // 当前没有需要实现的题目工具
9
+ // 不需要认证的题目工具可以在这里注册
9
10
  }
10
11
  registerAuthenticated() {
11
12
  // 需要认证的题目工具可以在这里注册
13
+ this.registerSearchProblems();
14
+ this.registerGetProblemInfo();
15
+ }
16
+ /**
17
+ * 注册搜索题目的工具
18
+ */
19
+ registerSearchProblems() {
20
+ this.server.tool("search_problems", "搜索题目列表,支持按标题、ID、作者、标签等条件搜索。会自动获取所有页的数据并返回完整结果(最多20页),每个题目包含可直接访问的链接。每页固定显示10道题目。当用户想要按标签搜索题目时(如'标签为判断的题目'、'搜索二叉树类型的题目'),使用tagNames参数传入标签名称数组。", {
21
+ titleSearch: z.string().optional().describe("题目标题模糊搜索,用于搜索标题中包含特定关键词的题目(可选)"),
22
+ idSearch: z.string().optional().describe("题目ID精确搜索,用于根据题目ID精确查找(可选)"),
23
+ authorSearch: z.string().optional().describe("创建者的nickname模糊搜索,用于搜索特定作者创建的题目(可选)"),
24
+ tagNames: z.array(z.string()).optional().describe("按标签搜索题目,传入标签名称数组。例如:用户说'搜索标签为判断的题目'时,传入['判断'];用户说'搜索二叉树和动态规划的题目'时,传入['二叉树', '动态规划']。系统会自动将标签名称转换为标签ID进行搜索。常用标签:'动态规划'、'二叉树'、'分治'、'判断'等(可选)")
25
+ }, async ({ titleSearch, idSearch, authorSearch, tagNames }) => {
26
+ try {
27
+ const result = await this.accodingService.searchProblems(titleSearch, idSearch, authorSearch, tagNames);
28
+ return {
29
+ content: [
30
+ {
31
+ type: "text",
32
+ text: JSON.stringify({
33
+ ...result,
34
+ searchParams: {
35
+ titleSearch: titleSearch || null,
36
+ idSearch: idSearch || null,
37
+ authorSearch: authorSearch || null,
38
+ tagNames: tagNames || null
39
+ }
40
+ }, null, 2)
41
+ }
42
+ ]
43
+ };
44
+ }
45
+ catch (error) {
46
+ const errorMessage = error.message || String(error);
47
+ return {
48
+ content: [
49
+ {
50
+ type: "text",
51
+ text: JSON.stringify({
52
+ error: "Failed to search problems",
53
+ message: errorMessage,
54
+ searchParams: {
55
+ titleSearch: titleSearch || null,
56
+ idSearch: idSearch || null,
57
+ authorSearch: authorSearch || null,
58
+ tagNames: tagNames || null
59
+ }
60
+ })
61
+ }
62
+ ],
63
+ isError: true
64
+ };
65
+ }
66
+ });
67
+ }
68
+ /**
69
+ * 注册获取题目详情的工具
70
+ */
71
+ registerGetProblemInfo() {
72
+ this.server.tool("get_problem_info", "根据题目ID获取题目的详细信息,包括题目内容、描述、输入输出格式、时间限制、内存限制、支持的语言、提交统计、通过率和正确率等。返回的题目包含可直接访问的链接。", {
73
+ problemId: z.string().describe("题目的唯一标识ID")
74
+ }, async ({ problemId }) => {
75
+ try {
76
+ const result = await this.accodingService.getProblemInfo(problemId);
77
+ return {
78
+ content: [
79
+ {
80
+ type: "text",
81
+ text: JSON.stringify(result, null, 2)
82
+ }
83
+ ]
84
+ };
85
+ }
86
+ catch (error) {
87
+ const errorMessage = error.message || String(error);
88
+ return {
89
+ content: [
90
+ {
91
+ type: "text",
92
+ text: JSON.stringify({
93
+ error: "Failed to get problem info",
94
+ message: errorMessage,
95
+ problemId: problemId
96
+ })
97
+ }
98
+ ],
99
+ isError: true
100
+ };
101
+ }
102
+ });
12
103
  }
13
104
  }
14
105
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"problem-tools.js","sourceRoot":"","sources":["../../../src/mcp/tools/problem-tools.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;GAGG;AACH,MAAM,OAAO,mBAAoB,SAAQ,YAAY;IACvC,cAAc;QACpB,gBAAgB;IACpB,CAAC;IAES,qBAAqB;QAC3B,mBAAmB;IACvB,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAChC,MAAiB,EACjB,eAAoC;IAEpC,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAClE,QAAQ,CAAC,aAAa,EAAE,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"problem-tools.js","sourceRoot":"","sources":["../../../src/mcp/tools/problem-tools.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,14 @@ import { ToolRegistry } from "./tool-registry.js";
8
8
  export declare class SubmissionToolRegistry extends ToolRegistry {
9
9
  protected registerCommon(): void;
10
10
  protected registerAuthenticated(): void;
11
+ /**
12
+ * 注册获取题目提交记录的工具
13
+ */
14
+ private registerGetProblemSubmissions;
15
+ /**
16
+ * 注册获取提交详情的工具
17
+ */
18
+ private registerGetSubmissionDetail;
11
19
  }
12
20
  /**
13
21
  * 注册所有提交相关工具
@@ -1,3 +1,4 @@
1
+ import { z } from "zod";
1
2
  import { ToolRegistry } from "./tool-registry.js";
2
3
  /**
3
4
  * 提交工具注册器
@@ -9,6 +10,86 @@ export class SubmissionToolRegistry extends ToolRegistry {
9
10
  }
10
11
  registerAuthenticated() {
11
12
  // 需要认证的提交工具可以在这里注册
13
+ this.registerGetProblemSubmissions();
14
+ this.registerGetSubmissionDetail();
15
+ }
16
+ /**
17
+ * 注册获取题目提交记录的工具
18
+ */
19
+ registerGetProblemSubmissions() {
20
+ this.server.tool("get_problem_submissions", "根据题目ID获取该题目的所有提交记录(评测记录)。支持按评测结果类型(AC、CE、PE、OE、WA、TLE)和提交ID过滤。会自动获取所有页的数据并返回完整结果。当用户想查看自己在某道题的提交记录时,需要先通过题目ID获取提交记录。", {
21
+ problemId: z.string().describe("题目的唯一标识ID(必需)"),
22
+ result: z.enum(["AC", "CE", "PE", "OE", "WA", "TLE"]).optional().describe("评测结果过滤(可选):AC(通过)、CE(编译错误)、PE(输出错误)、OE(其他错误)、WA(未通过)、TLE(超时)"),
23
+ submissionId: z.string().optional().describe("提交记录ID精确匹配(可选)")
24
+ }, async ({ problemId, result, submissionId }) => {
25
+ try {
26
+ const submissionResult = await this.accodingService.getProblemSubmissions(problemId, result, submissionId);
27
+ return {
28
+ content: [
29
+ {
30
+ type: "text",
31
+ text: JSON.stringify(submissionResult, null, 2)
32
+ }
33
+ ]
34
+ };
35
+ }
36
+ catch (error) {
37
+ const errorMessage = error.message || String(error);
38
+ return {
39
+ content: [
40
+ {
41
+ type: "text",
42
+ text: JSON.stringify({
43
+ error: "Failed to get problem submissions",
44
+ message: errorMessage,
45
+ problemId: problemId,
46
+ filters: {
47
+ result: result || null,
48
+ submissionId: submissionId || null
49
+ }
50
+ })
51
+ }
52
+ ],
53
+ isError: true
54
+ };
55
+ }
56
+ });
57
+ }
58
+ /**
59
+ * 注册获取提交详情的工具
60
+ */
61
+ registerGetSubmissionDetail() {
62
+ this.server.tool("get_submission_detail", "根据提交记录ID获取提交详情和代码。包括评测结果、时间消耗、内存消耗、提交代码等完整信息。当用户想查看某个提交记录的详细信息时使用此工具。", {
63
+ submissionId: z.string().describe("提交记录的唯一标识ID(必需)")
64
+ }, async ({ submissionId }) => {
65
+ try {
66
+ const result = await this.accodingService.getSubmissionDetail(submissionId);
67
+ return {
68
+ content: [
69
+ {
70
+ type: "text",
71
+ text: JSON.stringify(result, null, 2)
72
+ }
73
+ ]
74
+ };
75
+ }
76
+ catch (error) {
77
+ const errorMessage = error.message || String(error);
78
+ return {
79
+ content: [
80
+ {
81
+ type: "text",
82
+ text: JSON.stringify({
83
+ error: "Failed to get submission detail",
84
+ message: errorMessage,
85
+ submissionId: submissionId
86
+ })
87
+ }
88
+ ],
89
+ isError: true
90
+ };
91
+ }
92
+ });
12
93
  }
13
94
  }
14
95
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"submission-tools.js","sourceRoot":"","sources":["../../../src/mcp/tools/submission-tools.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;GAGG;AACH,MAAM,OAAO,sBAAuB,SAAQ,YAAY;IAC1C,cAAc;QACpB,oBAAoB;IACxB,CAAC;IAES,qBAAqB;QAC3B,mBAAmB;IACvB,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACnC,MAAiB,EACjB,eAAoC;IAEpC,MAAM,QAAQ,GAAG,IAAI,sBAAsB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACrE,QAAQ,CAAC,aAAa,EAAE,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"submission-tools.js","sourceRoot":"","sources":["../../../src/mcp/tools/submission-tools.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,7 @@
1
+ /**
2
+ * 创建 logger 实例
3
+ * 在 stdio 模式下,MCP 使用 stdout 进行 JSONRPC 通信
4
+ * 因此日志必须输出到 stderr,避免干扰 JSONRPC 消息
5
+ */
1
6
  declare const logger: import("pino").Logger<never, boolean>;
2
7
  export default logger;
@@ -1,4 +1,9 @@
1
1
  import { pino } from "pino";
2
+ /**
3
+ * 创建 logger 实例
4
+ * 在 stdio 模式下,MCP 使用 stdout 进行 JSONRPC 通信
5
+ * 因此日志必须输出到 stderr,避免干扰 JSONRPC 消息
6
+ */
2
7
  const logger = pino({
3
8
  level: "info",
4
9
  formatters: {
@@ -7,6 +12,8 @@ const logger = pino({
7
12
  timestamp: () => `,"timestamp":"${new Date().toISOString()}"`,
8
13
  messageKey: "message",
9
14
  nestedKey: "payload"
10
- });
15
+ },
16
+ // 输出到 stderr,避免干扰 MCP 的 JSONRPC 通信(使用 stdout)
17
+ process.stderr);
11
18
  export default logger;
12
19
  //# sourceMappingURL=logger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,MAAM,GAAG,IAAI,CAAC;IAChB,KAAK,EAAE,MAAM;IACb,UAAU,EAAE;QACR,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;KAC7D;IACD,SAAS,EAAE,GAAG,EAAE,CAAC,iBAAiB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,GAAG;IAC7D,UAAU,EAAE,SAAS;IACrB,SAAS,EAAE,SAAS;CACvB,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B;;;;GAIG;AACH,MAAM,MAAM,GAAG,IAAI,CACf;IACI,KAAK,EAAE,MAAM;IACb,UAAU,EAAE;QACR,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;KAC7D;IACD,SAAS,EAAE,GAAG,EAAE,CAAC,iBAAiB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,GAAG;IAC7D,UAAU,EAAE,SAAS;IACrB,SAAS,EAAE,SAAS;CACvB;AACD,8CAA8C;AAC9C,OAAO,CAAC,MAAM,CACjB,CAAC;AAEF,eAAe,MAAM,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "accoding-mcp-server-test-new",
3
3
  "description": "MCP Server for Accoding API-test",
4
- "version": "0.1.1",
4
+ "version": "0.1.3",
5
5
  "author": "",
6
6
  "main": "./build/index.js",
7
7
  "keywords": [