algokit-mcp 1.0.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.
Files changed (195) hide show
  1. package/README.md +137 -0
  2. package/dist/api/boj-scraper.d.ts +68 -0
  3. package/dist/api/boj-scraper.d.ts.map +1 -0
  4. package/dist/api/boj-scraper.js +197 -0
  5. package/dist/api/boj-scraper.js.map +1 -0
  6. package/dist/api/programmers-scraper.d.ts +70 -0
  7. package/dist/api/programmers-scraper.d.ts.map +1 -0
  8. package/dist/api/programmers-scraper.js +303 -0
  9. package/dist/api/programmers-scraper.js.map +1 -0
  10. package/dist/api/solvedac-client.d.ts +67 -0
  11. package/dist/api/solvedac-client.d.ts.map +1 -0
  12. package/dist/api/solvedac-client.js +220 -0
  13. package/dist/api/solvedac-client.js.map +1 -0
  14. package/dist/api/types.d.ts +125 -0
  15. package/dist/api/types.d.ts.map +1 -0
  16. package/dist/api/types.js +110 -0
  17. package/dist/api/types.js.map +1 -0
  18. package/dist/index.d.ts +7 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +594 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/prompts/hint-guide.d.ts +73 -0
  23. package/dist/prompts/hint-guide.d.ts.map +1 -0
  24. package/dist/prompts/hint-guide.js +174 -0
  25. package/dist/prompts/hint-guide.js.map +1 -0
  26. package/dist/prompts/programmers-hint-guide.d.ts +38 -0
  27. package/dist/prompts/programmers-hint-guide.d.ts.map +1 -0
  28. package/dist/prompts/programmers-hint-guide.js +134 -0
  29. package/dist/prompts/programmers-hint-guide.js.map +1 -0
  30. package/dist/services/code-analyzer.d.ts +46 -0
  31. package/dist/services/code-analyzer.d.ts.map +1 -0
  32. package/dist/services/code-analyzer.js +177 -0
  33. package/dist/services/code-analyzer.js.map +1 -0
  34. package/dist/services/hint-generator.d.ts +60 -0
  35. package/dist/services/hint-generator.d.ts.map +1 -0
  36. package/dist/services/hint-generator.js +222 -0
  37. package/dist/services/hint-generator.js.map +1 -0
  38. package/dist/services/problem-analyzer.d.ts +38 -0
  39. package/dist/services/problem-analyzer.d.ts.map +1 -0
  40. package/dist/services/problem-analyzer.js +114 -0
  41. package/dist/services/problem-analyzer.js.map +1 -0
  42. package/dist/services/programmers-problem-analyzer.d.ts +26 -0
  43. package/dist/services/programmers-problem-analyzer.d.ts.map +1 -0
  44. package/dist/services/programmers-problem-analyzer.js +64 -0
  45. package/dist/services/programmers-problem-analyzer.js.map +1 -0
  46. package/dist/services/programmers-review-template-generator.d.ts +27 -0
  47. package/dist/services/programmers-review-template-generator.d.ts.map +1 -0
  48. package/dist/services/programmers-review-template-generator.js +153 -0
  49. package/dist/services/programmers-review-template-generator.js.map +1 -0
  50. package/dist/services/review-generator.d.ts +51 -0
  51. package/dist/services/review-generator.d.ts.map +1 -0
  52. package/dist/services/review-generator.js +149 -0
  53. package/dist/services/review-generator.js.map +1 -0
  54. package/dist/services/review-template-generator.d.ts +27 -0
  55. package/dist/services/review-template-generator.d.ts.map +1 -0
  56. package/dist/services/review-template-generator.js +163 -0
  57. package/dist/services/review-template-generator.js.map +1 -0
  58. package/dist/templates/review-guideline.md +89 -0
  59. package/dist/tools/analyze-code-submission-boj.d.ts +67 -0
  60. package/dist/tools/analyze-code-submission-boj.d.ts.map +1 -0
  61. package/dist/tools/analyze-code-submission-boj.js +89 -0
  62. package/dist/tools/analyze-code-submission-boj.js.map +1 -0
  63. package/dist/tools/analyze-code-submission-programmers.d.ts +60 -0
  64. package/dist/tools/analyze-code-submission-programmers.d.ts.map +1 -0
  65. package/dist/tools/analyze-code-submission-programmers.js +83 -0
  66. package/dist/tools/analyze-code-submission-programmers.js.map +1 -0
  67. package/dist/tools/analyze-code-submission.d.ts +67 -0
  68. package/dist/tools/analyze-code-submission.d.ts.map +1 -0
  69. package/dist/tools/analyze-code-submission.js +89 -0
  70. package/dist/tools/analyze-code-submission.js.map +1 -0
  71. package/dist/tools/analyze-problem-boj.d.ts +48 -0
  72. package/dist/tools/analyze-problem-boj.d.ts.map +1 -0
  73. package/dist/tools/analyze-problem-boj.js +52 -0
  74. package/dist/tools/analyze-problem-boj.js.map +1 -0
  75. package/dist/tools/analyze-problem-programmers.d.ts +48 -0
  76. package/dist/tools/analyze-problem-programmers.d.ts.map +1 -0
  77. package/dist/tools/analyze-problem-programmers.js +53 -0
  78. package/dist/tools/analyze-problem-programmers.js.map +1 -0
  79. package/dist/tools/analyze-problem.d.ts +48 -0
  80. package/dist/tools/analyze-problem.d.ts.map +1 -0
  81. package/dist/tools/analyze-problem.js +52 -0
  82. package/dist/tools/analyze-problem.js.map +1 -0
  83. package/dist/tools/create-review.d.ts +47 -0
  84. package/dist/tools/create-review.d.ts.map +1 -0
  85. package/dist/tools/create-review.js +122 -0
  86. package/dist/tools/create-review.js.map +1 -0
  87. package/dist/tools/fetch-problem-content-boj.d.ts +49 -0
  88. package/dist/tools/fetch-problem-content-boj.d.ts.map +1 -0
  89. package/dist/tools/fetch-problem-content-boj.js +93 -0
  90. package/dist/tools/fetch-problem-content-boj.js.map +1 -0
  91. package/dist/tools/fetch-problem-content-programmers.d.ts +46 -0
  92. package/dist/tools/fetch-problem-content-programmers.d.ts.map +1 -0
  93. package/dist/tools/fetch-problem-content-programmers.js +74 -0
  94. package/dist/tools/fetch-problem-content-programmers.js.map +1 -0
  95. package/dist/tools/fetch-problem-content.d.ts +49 -0
  96. package/dist/tools/fetch-problem-content.d.ts.map +1 -0
  97. package/dist/tools/fetch-problem-content.js +93 -0
  98. package/dist/tools/fetch-problem-content.js.map +1 -0
  99. package/dist/tools/generate-hint-boj.d.ts +42 -0
  100. package/dist/tools/generate-hint-boj.d.ts.map +1 -0
  101. package/dist/tools/generate-hint-boj.js +80 -0
  102. package/dist/tools/generate-hint-boj.js.map +1 -0
  103. package/dist/tools/generate-hint-programmers.d.ts +42 -0
  104. package/dist/tools/generate-hint-programmers.d.ts.map +1 -0
  105. package/dist/tools/generate-hint-programmers.js +78 -0
  106. package/dist/tools/generate-hint-programmers.js.map +1 -0
  107. package/dist/tools/generate-hint.d.ts +42 -0
  108. package/dist/tools/generate-hint.d.ts.map +1 -0
  109. package/dist/tools/generate-hint.js +80 -0
  110. package/dist/tools/generate-hint.js.map +1 -0
  111. package/dist/tools/generate-review-template-boj.d.ts +48 -0
  112. package/dist/tools/generate-review-template-boj.d.ts.map +1 -0
  113. package/dist/tools/generate-review-template-boj.js +52 -0
  114. package/dist/tools/generate-review-template-boj.js.map +1 -0
  115. package/dist/tools/generate-review-template-programmers.d.ts +48 -0
  116. package/dist/tools/generate-review-template-programmers.d.ts.map +1 -0
  117. package/dist/tools/generate-review-template-programmers.js +53 -0
  118. package/dist/tools/generate-review-template-programmers.js.map +1 -0
  119. package/dist/tools/generate-review-template.d.ts +48 -0
  120. package/dist/tools/generate-review-template.d.ts.map +1 -0
  121. package/dist/tools/generate-review-template.js +52 -0
  122. package/dist/tools/generate-review-template.js.map +1 -0
  123. package/dist/tools/get-hint.d.ts +41 -0
  124. package/dist/tools/get-hint.d.ts.map +1 -0
  125. package/dist/tools/get-hint.js +108 -0
  126. package/dist/tools/get-hint.js.map +1 -0
  127. package/dist/tools/get-problem.d.ts +22 -0
  128. package/dist/tools/get-problem.d.ts.map +1 -0
  129. package/dist/tools/get-problem.js +89 -0
  130. package/dist/tools/get-problem.js.map +1 -0
  131. package/dist/tools/get-programmers-problem.d.ts +53 -0
  132. package/dist/tools/get-programmers-problem.d.ts.map +1 -0
  133. package/dist/tools/get-programmers-problem.js +161 -0
  134. package/dist/tools/get-programmers-problem.js.map +1 -0
  135. package/dist/tools/search-problems.d.ts +42 -0
  136. package/dist/tools/search-problems.d.ts.map +1 -0
  137. package/dist/tools/search-problems.js +123 -0
  138. package/dist/tools/search-problems.js.map +1 -0
  139. package/dist/tools/search-programmers-problems.d.ts +73 -0
  140. package/dist/tools/search-programmers-problems.d.ts.map +1 -0
  141. package/dist/tools/search-programmers-problems.js +171 -0
  142. package/dist/tools/search-programmers-problems.js.map +1 -0
  143. package/dist/tools/search-tags.d.ts +22 -0
  144. package/dist/tools/search-tags.d.ts.map +1 -0
  145. package/dist/tools/search-tags.js +70 -0
  146. package/dist/tools/search-tags.js.map +1 -0
  147. package/dist/types/analysis.d.ts +211 -0
  148. package/dist/types/analysis.d.ts.map +1 -0
  149. package/dist/types/analysis.js +11 -0
  150. package/dist/types/analysis.js.map +1 -0
  151. package/dist/types/problem-content.d.ts +110 -0
  152. package/dist/types/problem-content.d.ts.map +1 -0
  153. package/dist/types/problem-content.js +7 -0
  154. package/dist/types/problem-content.js.map +1 -0
  155. package/dist/types/programmers.d.ts +72 -0
  156. package/dist/types/programmers.d.ts.map +1 -0
  157. package/dist/types/programmers.js +5 -0
  158. package/dist/types/programmers.js.map +1 -0
  159. package/dist/utils/browser-pool.d.ts +93 -0
  160. package/dist/utils/browser-pool.d.ts.map +1 -0
  161. package/dist/utils/browser-pool.js +193 -0
  162. package/dist/utils/browser-pool.js.map +1 -0
  163. package/dist/utils/cache-stats.d.ts +60 -0
  164. package/dist/utils/cache-stats.d.ts.map +1 -0
  165. package/dist/utils/cache-stats.js +78 -0
  166. package/dist/utils/cache-stats.js.map +1 -0
  167. package/dist/utils/cache.d.ts +72 -0
  168. package/dist/utils/cache.d.ts.map +1 -0
  169. package/dist/utils/cache.js +99 -0
  170. package/dist/utils/cache.js.map +1 -0
  171. package/dist/utils/html-parser.d.ts +57 -0
  172. package/dist/utils/html-parser.d.ts.map +1 -0
  173. package/dist/utils/html-parser.js +383 -0
  174. package/dist/utils/html-parser.js.map +1 -0
  175. package/dist/utils/lru-cache.d.ts +124 -0
  176. package/dist/utils/lru-cache.d.ts.map +1 -0
  177. package/dist/utils/lru-cache.js +259 -0
  178. package/dist/utils/lru-cache.js.map +1 -0
  179. package/dist/utils/programmers-converter.d.ts +15 -0
  180. package/dist/utils/programmers-converter.d.ts.map +1 -0
  181. package/dist/utils/programmers-converter.js +41 -0
  182. package/dist/utils/programmers-converter.js.map +1 -0
  183. package/dist/utils/rate-limiter.d.ts +145 -0
  184. package/dist/utils/rate-limiter.d.ts.map +1 -0
  185. package/dist/utils/rate-limiter.js +244 -0
  186. package/dist/utils/rate-limiter.js.map +1 -0
  187. package/dist/utils/tier-converter.d.ts +108 -0
  188. package/dist/utils/tier-converter.d.ts.map +1 -0
  189. package/dist/utils/tier-converter.js +198 -0
  190. package/dist/utils/tier-converter.js.map +1 -0
  191. package/dist/utils/url-parser.d.ts +25 -0
  192. package/dist/utils/url-parser.d.ts.map +1 -0
  193. package/dist/utils/url-parser.js +45 -0
  194. package/dist/utils/url-parser.js.map +1 -0
  195. package/package.json +61 -0
@@ -0,0 +1,89 @@
1
+ /**
2
+ * get_problem ๋„๊ตฌ
3
+ *
4
+ * ํŠน์ • BOJ ๋ฌธ์ œ์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
5
+ */
6
+ import { z } from 'zod';
7
+ import { SolvedAcClient } from '../api/solvedac-client.js';
8
+ import { ProblemNotFoundError } from '../api/types.js';
9
+ import { getTierBadge, levelToTier } from '../utils/tier-converter.js';
10
+ /**
11
+ * ์ž…๋ ฅ ์Šคํ‚ค๋งˆ
12
+ */
13
+ export const GetProblemInputSchema = z.object({
14
+ problem_id: z.number().int().positive().describe('BOJ ๋ฌธ์ œ ๋ฒˆํ˜ธ (์–‘์˜ ์ •์ˆ˜)'),
15
+ });
16
+ /**
17
+ * ํ•œ๊ธ€ ํƒœ๊ทธ๋ช… ์ถ”์ถœ (์šฐ์„ ์ˆœ์œ„: ํ•œ๊ธ€ > ์˜์–ด > ํ‚ค)
18
+ */
19
+ function getKoreanTagName(tag) {
20
+ const korean = tag.displayNames.find(dn => dn.language === 'ko');
21
+ if (korean)
22
+ return korean.name;
23
+ const english = tag.displayNames.find(dn => dn.language === 'en');
24
+ if (english)
25
+ return english.name;
26
+ return tag.key;
27
+ }
28
+ /**
29
+ * ๋ฌธ์ œ ์ƒ์„ธ ์ •๋ณด๋ฅผ ๋งˆํฌ๋‹ค์šด์œผ๋กœ ํฌ๋งทํŒ…
30
+ */
31
+ function formatProblemDetail(problem) {
32
+ const tierBadge = getTierBadge(problem.level);
33
+ const tierName = levelToTier(problem.level);
34
+ const bojLink = `https://www.acmicpc.net/problem/${problem.problemId}`;
35
+ let result = `# [${problem.problemId}] ${problem.titleKo}\n\n`;
36
+ // ๊ธฐ๋ณธ ์ •๋ณด
37
+ result += `## ๐Ÿ“‹ ๊ธฐ๋ณธ ์ •๋ณด\n\n`;
38
+ result += `- **๋ฌธ์ œ ๋ฒˆํ˜ธ**: ${problem.problemId}\n`;
39
+ result += `- **์ œ๋ชฉ**: ${problem.titleKo}\n`;
40
+ result += `- **๋‚œ์ด๋„**: ${tierBadge} (๋ ˆ๋ฒจ ${problem.level})\n`;
41
+ result += `- **๋งํฌ**: [BOJ ${problem.problemId}](${bojLink})\n\n`;
42
+ // ํƒœ๊ทธ
43
+ if (problem.tags.length > 0) {
44
+ result += `## ๐Ÿท๏ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํƒœ๊ทธ\n\n`;
45
+ const tagList = problem.tags.map(tag => {
46
+ const koreanName = getKoreanTagName(tag);
47
+ return `- **${koreanName}** (\`${tag.key}\`)`;
48
+ }).join('\n');
49
+ result += `${tagList}\n\n`;
50
+ }
51
+ // ํ†ต๊ณ„
52
+ result += `## ๐Ÿ“Š ํ†ต๊ณ„\n\n`;
53
+ result += `- **ํ•ด๊ฒฐํ•œ ์‚ฌ์šฉ์ž**: ${problem.acceptedUserCount.toLocaleString()}๋ช…\n`;
54
+ result += `- **ํ‰๊ท  ์‹œ๋„ ํšŸ์ˆ˜**: ${problem.averageTries.toFixed(1)}ํšŒ\n`;
55
+ // ํ’€์ด ๊ฐ€๋Šฅ ์—ฌ๋ถ€
56
+ if (problem.isSolvable !== undefined) {
57
+ result += `- **ํ’€์ด ๊ฐ€๋Šฅ**: ${problem.isSolvable ? 'โœ… ์˜ˆ' : 'โŒ ์•„๋‹ˆ์˜ค'}\n`;
58
+ }
59
+ if (problem.isPartial !== undefined) {
60
+ result += `- **๋ถ€๋ถ„ ์ ์ˆ˜**: ${problem.isPartial ? 'โœ… ์žˆ์Œ' : 'โŒ ์—†์Œ'}\n`;
61
+ }
62
+ result += `\n---\n`;
63
+ result += `๐Ÿ’ก **ํŒ**: ์œ„ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด BOJ์—์„œ ๋ฌธ์ œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\n`;
64
+ return result;
65
+ }
66
+ /**
67
+ * ๋ฌธ์ œ ์ƒ์„ธ ์กฐํšŒ ๋„๊ตฌ ํ•ธ๋“ค๋Ÿฌ
68
+ */
69
+ export async function getProblem(input) {
70
+ const client = new SolvedAcClient();
71
+ try {
72
+ // API ํ˜ธ์ถœ
73
+ const problem = await client.getProblem(input.problem_id);
74
+ // ๊ฒฐ๊ณผ ํฌ๋งทํŒ…
75
+ return formatProblemDetail(problem);
76
+ }
77
+ catch (error) {
78
+ // ์—๋Ÿฌ ์ฒ˜๋ฆฌ
79
+ if (error instanceof ProblemNotFoundError) {
80
+ throw new Error(`๋ฌธ์ œ ${input.problem_id}๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ ๋ฒˆํ˜ธ๋ฅผ ํ™•์ธํ•ด์ฃผ์„ธ์š”.\n` +
81
+ `BOJ ๋งํฌ: https://www.acmicpc.net/problem/${input.problem_id}`);
82
+ }
83
+ if (error instanceof Error) {
84
+ throw new Error(`๋ฌธ์ œ ์กฐํšŒ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: ${error.message}`);
85
+ }
86
+ throw new Error('๋ฌธ์ œ ์กฐํšŒ ์ค‘ ์•Œ ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.');
87
+ }
88
+ }
89
+ //# sourceMappingURL=get-problem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-problem.js","sourceRoot":"","sources":["../../src/tools/get-problem.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * get_programmers_problem MCP ๋„๊ตฌ
3
+ *
4
+ * Phase 7 - Task 7.5: ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฌธ์ œ ์ƒ์„ธ ์กฐํšŒ MCP ๋„๊ตฌ ๊ตฌํ˜„
5
+ */
6
+ import { z } from 'zod';
7
+ /**
8
+ * ์ž…๋ ฅ ์Šคํ‚ค๋งˆ (URL ๋˜๋Š” ์ˆซ์ž ๋ชจ๋‘ ์ง€์›)
9
+ */
10
+ export declare const GetProgrammersProblemInputSchema: z.ZodObject<{
11
+ problem_id: z.ZodUnion<[z.ZodString, z.ZodNumber]>;
12
+ }, "strip", z.ZodTypeAny, {
13
+ problem_id: string | number;
14
+ }, {
15
+ problem_id: string | number;
16
+ }>;
17
+ export type GetProgrammersProblemInput = z.infer<typeof GetProgrammersProblemInputSchema>;
18
+ /**
19
+ * MCP TextContent ํƒ€์ž…
20
+ */
21
+ interface TextContent {
22
+ type: 'text';
23
+ text: string;
24
+ }
25
+ /**
26
+ * get_programmers_problem ๋„๊ตฌ ํ•ธ๋“ค๋Ÿฌ
27
+ *
28
+ * @param args - ์ž…๋ ฅ ์ธ์ž (problem_id)
29
+ * @returns ProgrammersProblemDetail ๋งˆํฌ๋‹ค์šด ๋ฌธ์ž์—ด
30
+ * @throws {Error} ๊ฒ€์ฆ ์‹คํŒจ, ์Šคํฌ๋ž˜ํ•‘ ์‹คํŒจ, ํŒŒ์‹ฑ ์‹คํŒจ ์‹œ
31
+ */
32
+ export declare function handleGetProgrammersProblem(args: unknown): Promise<TextContent>;
33
+ /**
34
+ * ํ…Œ์ŠคํŠธ์šฉ ๋ณ„์นญ (backward compatibility)
35
+ */
36
+ export declare const getProgrammersProblem: typeof handleGetProgrammersProblem;
37
+ /**
38
+ * MCP ๋„๊ตฌ ์ •์˜
39
+ */
40
+ export declare function getProgrammersProblemTool(): {
41
+ name: string;
42
+ description: string;
43
+ inputSchema: z.ZodObject<{
44
+ problem_id: z.ZodUnion<[z.ZodString, z.ZodNumber]>;
45
+ }, "strip", z.ZodTypeAny, {
46
+ problem_id: string | number;
47
+ }, {
48
+ problem_id: string | number;
49
+ }>;
50
+ handler: typeof handleGetProgrammersProblem;
51
+ };
52
+ export {};
53
+ //# sourceMappingURL=get-programmers-problem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-programmers-problem.d.ts","sourceRoot":"","sources":["../../src/tools/get-programmers-problem.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB;;GAEG;AACH,eAAO,MAAM,gCAAgC;;;;;;EAG3C,CAAC;AAEH,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gCAAgC,CAAC,CAAC;AAE1F;;GAEG;AACH,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;GAMG;AACH,wBAAsB,2BAA2B,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAsDrF;AAoED;;GAEG;AACH,eAAO,MAAM,qBAAqB,oCAA8B,CAAC;AAEjE;;GAEG;AACH,wBAAgB,yBAAyB;;;;;;;;;;;EA0BxC"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * get_programmers_problem MCP ๋„๊ตฌ
3
+ *
4
+ * Phase 7 - Task 7.5: ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฌธ์ œ ์ƒ์„ธ ์กฐํšŒ MCP ๋„๊ตฌ ๊ตฌํ˜„
5
+ */
6
+ import { z } from 'zod';
7
+ import { ProgrammersScraper, ProgrammersScrapeError } from '../api/programmers-scraper.js';
8
+ import { parseProgrammersUrl } from '../utils/url-parser.js';
9
+ /**
10
+ * ์ž…๋ ฅ ์Šคํ‚ค๋งˆ (URL ๋˜๋Š” ์ˆซ์ž ๋ชจ๋‘ ์ง€์›)
11
+ */
12
+ export const GetProgrammersProblemInputSchema = z.object({
13
+ problem_id: z.union([z.string(), z.number()])
14
+ .describe('๋ฌธ์ œ ID ๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค URL. ์˜ˆ: 42748 ๋˜๋Š” https://school.programmers.co.kr/learn/courses/30/lessons/42748'),
15
+ });
16
+ /**
17
+ * get_programmers_problem ๋„๊ตฌ ํ•ธ๋“ค๋Ÿฌ
18
+ *
19
+ * @param args - ์ž…๋ ฅ ์ธ์ž (problem_id)
20
+ * @returns ProgrammersProblemDetail ๋งˆํฌ๋‹ค์šด ๋ฌธ์ž์—ด
21
+ * @throws {Error} ๊ฒ€์ฆ ์‹คํŒจ, ์Šคํฌ๋ž˜ํ•‘ ์‹คํŒจ, ํŒŒ์‹ฑ ์‹คํŒจ ์‹œ
22
+ */
23
+ export async function handleGetProgrammersProblem(args) {
24
+ try {
25
+ // 1. ์ž…๋ ฅ ๊ฒ€์ฆ
26
+ const { problem_id } = GetProgrammersProblemInputSchema.parse(args);
27
+ // 2. URL ํŒŒ์‹ฑ (URL ๋˜๋Š” ์ˆซ์ž ๋ชจ๋‘ ์ง€์›)
28
+ const problemId = parseProgrammersUrl(problem_id);
29
+ if (!problemId) {
30
+ throw new Error(`์œ ํšจํ•˜์ง€ ์•Š์€ ๋ฌธ์ œ ID ๋˜๋Š” URL: ${problem_id}`);
31
+ }
32
+ // 3. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์Šคํฌ๋ž˜ํ•‘
33
+ const scraper = new ProgrammersScraper();
34
+ const detail = await scraper.getProblem(problemId);
35
+ // 4. ๋งˆํฌ๋‹ค์šด ํฌ๋งทํŒ…
36
+ const markdown = formatProblemAsMarkdown(detail);
37
+ return {
38
+ type: 'text',
39
+ text: markdown,
40
+ };
41
+ }
42
+ catch (error) {
43
+ // Zod ๊ฒ€์ฆ ์—๋Ÿฌ
44
+ if (error instanceof z.ZodError) {
45
+ throw new Error(`์ž…๋ ฅ ๊ฒ€์ฆ ์‹คํŒจ: ${error.issues[0].message}`);
46
+ }
47
+ // ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์Šคํฌ๋ž˜ํ•‘ ์—๋Ÿฌ
48
+ if (error instanceof ProgrammersScrapeError) {
49
+ const problemId = args.problem_id;
50
+ if (error.code === 'NAVIGATION_ERROR') {
51
+ throw new Error(`๋ฌธ์ œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: ${problemId}๋ฒˆ`);
52
+ }
53
+ if (error.code === 'TIMEOUT') {
54
+ throw new Error(`๋ฌธ์ œ ํŽ˜์ด์ง€ ์š”์ฒญ์ด ํƒ€์ž„์•„์›ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค: ${problemId}๋ฒˆ`);
55
+ }
56
+ if (error.code === 'PARSE_ERROR') {
57
+ throw new Error(`๋ฌธ์ œ ํŽ˜์ด์ง€ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: ${error.message}`);
58
+ }
59
+ if (error.code === 'SELECTOR_NOT_FOUND') {
60
+ throw new Error(`HTML ํŒŒ์‹ฑ ์‹คํŒจ (ํ•„์ˆ˜ ์š”์†Œ ์—†์Œ): ${error.message}`);
61
+ }
62
+ }
63
+ // ๊ธฐํƒ€ ์—๋Ÿฌ
64
+ if (error instanceof Error) {
65
+ throw new Error(`ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฌธ์ œ ์กฐํšŒ ์‹คํŒจ: ${error.message}`);
66
+ }
67
+ throw error;
68
+ }
69
+ }
70
+ /**
71
+ * ๋ฌธ์ œ๋ฅผ ๋งˆํฌ๋‹ค์šด์œผ๋กœ ํฌ๋งทํŒ…
72
+ */
73
+ function formatProblemAsMarkdown(problem) {
74
+ const lines = [];
75
+ // ํ—ค๋”
76
+ lines.push(`# ${problem.title}\n`);
77
+ lines.push(`**๋ ˆ๋ฒจ**: ${formatLevel(problem.level)} | **์นดํ…Œ๊ณ ๋ฆฌ**: ${problem.category}\n`);
78
+ lines.push(`**๋ฌธ์ œ ID**: ${problem.problemId}\n`);
79
+ lines.push(`**URL**: https://school.programmers.co.kr/learn/courses/30/lessons/${problem.problemId}\n`);
80
+ lines.push('---\n');
81
+ // ๋ฌธ์ œ ์„ค๋ช…
82
+ lines.push('## ๋ฌธ์ œ ์„ค๋ช…\n');
83
+ lines.push(problem.description);
84
+ lines.push('\n');
85
+ // ์ œํ•œ์‚ฌํ•ญ
86
+ if (problem.constraints.length > 0) {
87
+ lines.push('## ์ œํ•œ์‚ฌํ•ญ\n');
88
+ problem.constraints.forEach((c) => {
89
+ lines.push(`- ${c}`);
90
+ });
91
+ lines.push('\n');
92
+ }
93
+ // ์ž…์ถœ๋ ฅ ์˜ˆ์ œ
94
+ if (problem.examples.length > 0) {
95
+ lines.push('## ์ž…์ถœ๋ ฅ ์˜ˆ\n');
96
+ lines.push('| ์ž…๋ ฅ | ์ถœ๋ ฅ |');
97
+ lines.push('|------|------|');
98
+ problem.examples.forEach((ex) => {
99
+ lines.push(`| ${ex.input} | ${ex.output} |`);
100
+ });
101
+ lines.push('\n');
102
+ }
103
+ // ์•ˆ๋‚ด
104
+ lines.push('---');
105
+ lines.push('');
106
+ lines.push('๐Ÿ’ก **๋‹ค์Œ ๋‹จ๊ณ„**:');
107
+ lines.push('- ๋ฌธ์ œ ๋ถ„์„: `analyze_programmers_problem` (๊ตฌํ˜„ ์˜ˆ์ •)');
108
+ lines.push('- ์ฝ”๋“œ ์ œ์ถœ ๋ถ„์„: `analyze_code_submission` (BOJ๋งŒ ์ง€์›)');
109
+ lines.push('');
110
+ lines.push('โš ๏ธ **์ฐธ๊ณ **: ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์‚ฌ์ดํŠธ์—์„œ ์ง์ ‘ ๋ฌธ์ œ๋ฅผ ํ’€์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.');
111
+ return lines.join('\n');
112
+ }
113
+ /**
114
+ * ๋ ˆ๋ฒจ ํฌ๋งทํŒ…
115
+ */
116
+ function formatLevel(level) {
117
+ const levelEmoji = {
118
+ 0: '๐ŸŸข Lv. 0 (์ž…๋ฌธ)',
119
+ 1: '๐ŸŸข Lv. 1',
120
+ 2: '๐ŸŸก Lv. 2',
121
+ 3: '๐ŸŸ  Lv. 3',
122
+ 4: '๐Ÿ”ด Lv. 4',
123
+ 5: '๐Ÿ”ด Lv. 5',
124
+ };
125
+ return levelEmoji[level] || `Lv. ${level}`;
126
+ }
127
+ /**
128
+ * ํ…Œ์ŠคํŠธ์šฉ ๋ณ„์นญ (backward compatibility)
129
+ */
130
+ export const getProgrammersProblem = handleGetProgrammersProblem;
131
+ /**
132
+ * MCP ๋„๊ตฌ ์ •์˜
133
+ */
134
+ export function getProgrammersProblemTool() {
135
+ return {
136
+ name: 'get_programmers_problem',
137
+ description: `ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฌธ์ œ ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ (์›น ์Šคํฌ๋ž˜ํ•‘).
138
+
139
+ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ํŽ˜์ด์ง€์—์„œ ๋ฌธ์ œ ์ œ๋ชฉ, ์„ค๋ช…, ์ œํ•œ์‚ฌํ•ญ, ์ž…์ถœ๋ ฅ ์˜ˆ์ œ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
140
+
141
+ ์‘๋‹ต ๊ตฌ์กฐ: problemId, title, level, category, description, constraints, examples, tags
142
+
143
+ **์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค**:
144
+ - ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฌธ์ œ ํ’€์ด ์ „ ๋ฌธ์ œ ๋ณธ๋ฌธ ํ™•์ธ
145
+ - ๋ฌธ์ œ ๋ณต์Šต ์‹œ ๋ฌธ์ œ ๋‚ด์šฉ ์ฐธ์กฐ
146
+ - ์ฝ”๋“œ ๋ถ„์„ ์‹œ ๋ฌธ์ œ ์š”๊ตฌ์‚ฌํ•ญ ๋น„๊ต
147
+
148
+ **์ œํ•œ์‚ฌํ•ญ**:
149
+ - ์Šคํฌ๋ž˜ํ•‘ ๋Œ€์ƒ: https://school.programmers.co.kr/learn/courses/30/lessons/{problem_id}
150
+ - ํƒ€์ž„์•„์›ƒ: 10์ดˆ
151
+ - ์žฌ์‹œ๋„: ์ตœ๋Œ€ 2ํšŒ
152
+ - Rate Limiting: ์ดˆ๋‹น 1ํšŒ
153
+
154
+ **์ฐธ๊ณ **:
155
+ - BOJ์™€ ๋‹ค๋ฅด๊ฒŒ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค๋Š” fetch + cheerio ์‚ฌ์šฉ (SSR ํŽ˜์ด์ง€)
156
+ - ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค๋Š” ํƒœ๊ทธ ์ •๋ณด๊ฐ€ ์—†์œผ๋ฏ€๋กœ tags ํ•„๋“œ๋Š” ๋นˆ ๋ฐฐ์—ด`,
157
+ inputSchema: GetProgrammersProblemInputSchema,
158
+ handler: handleGetProgrammersProblem,
159
+ };
160
+ }
161
+ //# sourceMappingURL=get-programmers-problem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-programmers-problem.js","sourceRoot":"","sources":["../../src/tools/get-programmers-problem.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * search_problems ๋„๊ตฌ
3
+ *
4
+ * BOJ ๋ฌธ์ œ๋ฅผ ํ‹ฐ์–ด, ํƒœ๊ทธ, ํ‚ค์›Œ๋“œ๋กœ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
5
+ */
6
+ import { z } from 'zod';
7
+ /**
8
+ * ์ž…๋ ฅ ์Šคํ‚ค๋งˆ
9
+ *
10
+ * level_min/level_max๋Š” ์ˆซ์ž(1-30) ๋˜๋Š” ํ‹ฐ์–ด ๋ฌธ์ž์—ด(์˜ˆ: "์‹ค๋ฒ„ 3", "Gold I") ๋ชจ๋‘ ์ง€์›
11
+ */
12
+ export declare const SearchProblemsInputSchema: z.ZodObject<{
13
+ query: z.ZodOptional<z.ZodString>;
14
+ level_min: z.ZodOptional<z.ZodUnion<[z.ZodNumber, z.ZodEffects<z.ZodString, number, string>]>>;
15
+ level_max: z.ZodOptional<z.ZodUnion<[z.ZodNumber, z.ZodEffects<z.ZodString, number, string>]>>;
16
+ tags: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>>;
17
+ sort: z.ZodOptional<z.ZodEnum<["level", "id", "average_try"]>>;
18
+ direction: z.ZodOptional<z.ZodEnum<["asc", "desc"]>>;
19
+ page: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
20
+ }, "strip", z.ZodTypeAny, {
21
+ page: number;
22
+ tags?: string | string[] | undefined;
23
+ sort?: "level" | "id" | "average_try" | undefined;
24
+ query?: string | undefined;
25
+ direction?: "asc" | "desc" | undefined;
26
+ level_min?: number | undefined;
27
+ level_max?: number | undefined;
28
+ }, {
29
+ tags?: string | string[] | undefined;
30
+ sort?: "level" | "id" | "average_try" | undefined;
31
+ query?: string | undefined;
32
+ direction?: "asc" | "desc" | undefined;
33
+ page?: number | undefined;
34
+ level_min?: string | number | undefined;
35
+ level_max?: string | number | undefined;
36
+ }>;
37
+ export type SearchProblemsInput = z.infer<typeof SearchProblemsInputSchema>;
38
+ /**
39
+ * ๋ฌธ์ œ ๊ฒ€์ƒ‰ ๋„๊ตฌ ํ•ธ๋“ค๋Ÿฌ
40
+ */
41
+ export declare function searchProblems(input: SearchProblemsInput): Promise<string>;
42
+ //# sourceMappingURL=search-problems.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-problems.d.ts","sourceRoot":"","sources":["../../src/tools/search-problems.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB;;;;GAIG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;EA2CpC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAiD5E;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiChF"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * search_problems ๋„๊ตฌ
3
+ *
4
+ * BOJ ๋ฌธ์ œ๋ฅผ ํ‹ฐ์–ด, ํƒœ๊ทธ, ํ‚ค์›Œ๋“œ๋กœ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
5
+ */
6
+ import { z } from 'zod';
7
+ import { SolvedAcClient } from '../api/solvedac-client.js';
8
+ import { getTierBadge, parseTierString } from '../utils/tier-converter.js';
9
+ /**
10
+ * ์ž…๋ ฅ ์Šคํ‚ค๋งˆ
11
+ *
12
+ * level_min/level_max๋Š” ์ˆซ์ž(1-30) ๋˜๋Š” ํ‹ฐ์–ด ๋ฌธ์ž์—ด(์˜ˆ: "์‹ค๋ฒ„ 3", "Gold I") ๋ชจ๋‘ ์ง€์›
13
+ */
14
+ export const SearchProblemsInputSchema = z.object({
15
+ query: z.string().optional().describe('๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ (์ œ๋ชฉ, ๋ฒˆํ˜ธ, ํƒœ๊ทธ ๋“ฑ)'),
16
+ level_min: z
17
+ .union([
18
+ z.number().int().min(1).max(30),
19
+ z.string().transform((val, ctx) => {
20
+ try {
21
+ return parseTierString(val);
22
+ }
23
+ catch (error) {
24
+ ctx.addIssue({
25
+ code: z.ZodIssueCode.custom,
26
+ message: error instanceof Error ? error.message : 'ํ‹ฐ์–ด ํŒŒ์‹ฑ ์‹คํŒจ',
27
+ });
28
+ return z.NEVER;
29
+ }
30
+ }),
31
+ ])
32
+ .optional()
33
+ .describe('์ตœ์†Œ ๋‚œ์ด๋„ (์ˆซ์ž 1-30 ๋˜๋Š” "์‹ค๋ฒ„ 3", "Gold I" ํ˜•์‹)'),
34
+ level_max: z
35
+ .union([
36
+ z.number().int().min(1).max(30),
37
+ z.string().transform((val, ctx) => {
38
+ try {
39
+ return parseTierString(val);
40
+ }
41
+ catch (error) {
42
+ ctx.addIssue({
43
+ code: z.ZodIssueCode.custom,
44
+ message: error instanceof Error ? error.message : 'ํ‹ฐ์–ด ํŒŒ์‹ฑ ์‹คํŒจ',
45
+ });
46
+ return z.NEVER;
47
+ }
48
+ }),
49
+ ])
50
+ .optional()
51
+ .describe('์ตœ๋Œ€ ๋‚œ์ด๋„ (์ˆซ์ž 1-30 ๋˜๋Š” "์‹ค๋ฒ„ 3", "Gold I" ํ˜•์‹)'),
52
+ tags: z
53
+ .union([z.string(), z.array(z.string())])
54
+ .optional()
55
+ .describe('์•Œ๊ณ ๋ฆฌ์ฆ˜ ํƒœ๊ทธ (์˜ˆ: "dp" ๋˜๋Š” ["dp", "greedy", "bfs"])'),
56
+ sort: z.enum(['level', 'id', 'average_try']).optional().describe('์ •๋ ฌ ๊ธฐ์ค€'),
57
+ direction: z.enum(['asc', 'desc']).optional().describe('์ •๋ ฌ ๋ฐฉํ–ฅ'),
58
+ page: z.number().int().min(1).optional().default(1).describe('ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ (๊ธฐ๋ณธ: 1)'),
59
+ });
60
+ /**
61
+ * ํ•œ๊ธ€ ํƒœ๊ทธ๋ช… ์ถ”์ถœ
62
+ */
63
+ function getKoreanTagName(tag) {
64
+ const korean = tag.displayNames.find(dn => dn.language === 'ko');
65
+ return korean?.name || tag.key;
66
+ }
67
+ /**
68
+ * ๋ฌธ์ œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋งˆํฌ๋‹ค์šด ํ…Œ์ด๋ธ”๋กœ ํฌ๋งทํŒ…
69
+ */
70
+ function formatSearchResults(items, count, page) {
71
+ if (items.length === 0) {
72
+ return '๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.';
73
+ }
74
+ let result = `# ๋ฌธ์ œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ\n\n`;
75
+ result += `**์ด ${count}๊ฐœ ๋ฌธ์ œ** (${page}ํŽ˜์ด์ง€)\n\n`;
76
+ result += `| ๋ฒˆํ˜ธ | ์ œ๋ชฉ | ๋‚œ์ด๋„ | ํƒœ๊ทธ | ํ•ด๊ฒฐ์ž ์ˆ˜ | ํ‰๊ท  ์‹œ๋„ |\n`;
77
+ result += `|------|------|--------|------|-----------|----------|\n`;
78
+ for (const problem of items) {
79
+ const tierBadge = getTierBadge(problem.level);
80
+ const tags = problem.tags.slice(0, 3).map(getKoreanTagName).join(', ');
81
+ const tagsDisplay = problem.tags.length > 3 ? `${tags}...` : tags;
82
+ const bojLink = `https://www.acmicpc.net/problem/${problem.problemId}`;
83
+ result += `| [${problem.problemId}](${bojLink}) | ${problem.titleKo} | ${tierBadge} | ${tagsDisplay} | ${problem.acceptedUserCount.toLocaleString()}๋ช… | ${problem.averageTries.toFixed(1)}ํšŒ |\n`;
84
+ }
85
+ result += `\n---\n`;
86
+ result += `๐Ÿ’ก **ํŒ**: ๋ฌธ์ œ ๋ฒˆํ˜ธ๋ฅผ ํด๋ฆญํ•˜๋ฉด BOJ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.\n`;
87
+ return result;
88
+ }
89
+ /**
90
+ * ๋ฌธ์ œ ๊ฒ€์ƒ‰ ๋„๊ตฌ ํ•ธ๋“ค๋Ÿฌ
91
+ */
92
+ export async function searchProblems(input) {
93
+ // ์ž…๋ ฅ ๊ฒ€์ฆ
94
+ if (input.level_min !== undefined && input.level_max !== undefined) {
95
+ if (input.level_min > input.level_max) {
96
+ throw new Error('level_min์€ level_max๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.');
97
+ }
98
+ }
99
+ const client = new SolvedAcClient();
100
+ try {
101
+ // API ํ˜ธ์ถœ
102
+ const params = {
103
+ query: input.query,
104
+ level_min: input.level_min,
105
+ level_max: input.level_max,
106
+ tags: input.tags,
107
+ sort: input.sort,
108
+ direction: input.direction,
109
+ page: input.page,
110
+ };
111
+ const result = await client.searchProblems(params);
112
+ // ๊ฒฐ๊ณผ ํฌ๋งทํŒ…
113
+ return formatSearchResults(result.items, result.count, input.page);
114
+ }
115
+ catch (error) {
116
+ // ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ํฌ๋งทํŒ…
117
+ if (error instanceof Error) {
118
+ throw new Error(`๋ฌธ์ œ ๊ฒ€์ƒ‰ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: ${error.message}`);
119
+ }
120
+ throw new Error('๋ฌธ์ œ ๊ฒ€์ƒ‰ ์ค‘ ์•Œ ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.');
121
+ }
122
+ }
123
+ //# sourceMappingURL=search-problems.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-problems.js","sourceRoot":"","sources":["../../src/tools/search-problems.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * search_programmers_problems MCP ๋„๊ตฌ
3
+ *
4
+ * Phase 7 - Task 7.5: ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฌธ์ œ ๊ฒ€์ƒ‰ MCP ๋„๊ตฌ
5
+ */
6
+ import { z } from 'zod';
7
+ /**
8
+ * ์ž…๋ ฅ ์Šคํ‚ค๋งˆ
9
+ */
10
+ export declare const SearchProgrammersProblemsInputSchema: z.ZodObject<{
11
+ levels: z.ZodOptional<z.ZodArray<z.ZodNumber, "many">>;
12
+ order: z.ZodOptional<z.ZodEnum<["recent", "accuracy", "popular"]>>;
13
+ page: z.ZodOptional<z.ZodNumber>;
14
+ limit: z.ZodOptional<z.ZodNumber>;
15
+ query: z.ZodOptional<z.ZodString>;
16
+ }, "strip", z.ZodTypeAny, {
17
+ query?: string | undefined;
18
+ page?: number | undefined;
19
+ levels?: number[] | undefined;
20
+ order?: "recent" | "accuracy" | "popular" | undefined;
21
+ limit?: number | undefined;
22
+ }, {
23
+ query?: string | undefined;
24
+ page?: number | undefined;
25
+ levels?: number[] | undefined;
26
+ order?: "recent" | "accuracy" | "popular" | undefined;
27
+ limit?: number | undefined;
28
+ }>;
29
+ export type SearchProgrammersProblemsInput = z.infer<typeof SearchProgrammersProblemsInputSchema>;
30
+ /**
31
+ * MCP TextContent ํƒ€์ž…
32
+ */
33
+ interface TextContent {
34
+ type: 'text';
35
+ text: string;
36
+ }
37
+ /**
38
+ * ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฌธ์ œ ๊ฒ€์ƒ‰ ๋„๊ตฌ ํ•ธ๋“ค๋Ÿฌ
39
+ *
40
+ * @param args - ์ž…๋ ฅ ์ธ์ž
41
+ * @returns ๋ฌธ์ œ ๋ชฉ๋ก (๋งˆํฌ๋‹ค์šด ํ…Œ์ด๋ธ” ํ˜•์‹)
42
+ * @throws {Error} ๊ฒ€์ฆ ์‹คํŒจ ๋˜๋Š” ์Šคํฌ๋ž˜ํ•‘ ์‹คํŒจ ์‹œ
43
+ */
44
+ export declare function searchProgrammersProblems(args: unknown): Promise<TextContent>;
45
+ /**
46
+ * MCP ๋„๊ตฌ ์ •์˜
47
+ */
48
+ export declare function searchProgrammersProblemsTool(): {
49
+ name: string;
50
+ description: string;
51
+ inputSchema: z.ZodObject<{
52
+ levels: z.ZodOptional<z.ZodArray<z.ZodNumber, "many">>;
53
+ order: z.ZodOptional<z.ZodEnum<["recent", "accuracy", "popular"]>>;
54
+ page: z.ZodOptional<z.ZodNumber>;
55
+ limit: z.ZodOptional<z.ZodNumber>;
56
+ query: z.ZodOptional<z.ZodString>;
57
+ }, "strip", z.ZodTypeAny, {
58
+ query?: string | undefined;
59
+ page?: number | undefined;
60
+ levels?: number[] | undefined;
61
+ order?: "recent" | "accuracy" | "popular" | undefined;
62
+ limit?: number | undefined;
63
+ }, {
64
+ query?: string | undefined;
65
+ page?: number | undefined;
66
+ levels?: number[] | undefined;
67
+ order?: "recent" | "accuracy" | "popular" | undefined;
68
+ limit?: number | undefined;
69
+ }>;
70
+ handler: typeof searchProgrammersProblems;
71
+ };
72
+ export {};
73
+ //# sourceMappingURL=search-programmers-problems.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-programmers-problems.d.ts","sourceRoot":"","sources":["../../src/tools/search-programmers-problems.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;GAEG;AACH,eAAO,MAAM,oCAAoC;;;;;;;;;;;;;;;;;;EAW/C,CAAC;AAEH,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oCAAoC,CAAC,CAAC;AAElG;;GAEG;AACH,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;GAMG;AACH,wBAAsB,yBAAyB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CA8CnF;AA0FD;;GAEG;AACH,wBAAgB,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;EA0B5C"}