feat: MCP 서버 추가 — AI 에이전트용 웹 검사 도구
Node.js + TypeScript MCP 서버 구현: - 5개 도구: inspect_page, inspect_site, get_inspection, get_issues, get_history - 듀얼 트랜스포트: stdio (Claude Desktop) + Streamable HTTP (Docker/원격) - i18n 지원 (영어/한국어) - Docker 통합 (port 3100) + Nginx /mcp 프록시 - Smithery 레지스트리 배포 설정 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
53
mcp/dist/tools/get-issues.js
vendored
Normal file
53
mcp/dist/tools/get-issues.js
vendored
Normal file
@ -0,0 +1,53 @@
|
||||
import { t } from "../i18n/index.js";
|
||||
export async function getIssues(client, id, lang, category, severity) {
|
||||
const result = await client.getIssues(id, category, severity);
|
||||
const lines = [];
|
||||
lines.push(`# ${t("get_issues.title", lang)}`);
|
||||
lines.push(`**Inspection ID**: ${result.inspection_id}`);
|
||||
lines.push(`**${t("get_issues.total", lang)}**: ${result.total}`);
|
||||
// Show applied filters
|
||||
const activeFilters = Object.entries(result.filters)
|
||||
.filter(([, v]) => v)
|
||||
.map(([k, v]) => `${k}: ${v}`)
|
||||
.join(", ");
|
||||
if (activeFilters) {
|
||||
lines.push(`**${t("get_issues.filters", lang)}**: ${activeFilters}`);
|
||||
}
|
||||
lines.push("");
|
||||
if (result.issues.length === 0) {
|
||||
lines.push("No issues found.");
|
||||
return lines.join("\n");
|
||||
}
|
||||
// Issue table
|
||||
lines.push(`| # | ${t("result.severity", lang)} | Code | ${t("result.category", lang)} | ${t("result.message", lang)} |`);
|
||||
lines.push("|---|---|---|---|---|");
|
||||
for (let i = 0; i < result.issues.length; i++) {
|
||||
const issue = result.issues[i];
|
||||
const msg = issue.message.length > 80
|
||||
? issue.message.slice(0, 77) + "..."
|
||||
: issue.message;
|
||||
lines.push(`| ${i + 1} | ${issue.severity} | ${issue.code} | ${issue.category} | ${msg} |`);
|
||||
}
|
||||
lines.push("");
|
||||
// Detailed view for first 10
|
||||
const detailCount = Math.min(result.issues.length, 10);
|
||||
lines.push("## Details");
|
||||
for (let i = 0; i < detailCount; i++) {
|
||||
const issue = result.issues[i];
|
||||
lines.push(`### ${i + 1}. [${issue.severity.toUpperCase()}] ${issue.code}`);
|
||||
lines.push(`- **${t("result.message", lang)}**: ${issue.message}`);
|
||||
if (issue.element) {
|
||||
lines.push(`- **${t("result.element", lang)}**: \`${issue.element}\``);
|
||||
}
|
||||
lines.push(`- **${t("result.suggestion", lang)}**: ${issue.suggestion}`);
|
||||
if (issue.kwcag_criterion) {
|
||||
lines.push(`- **KWCAG**: ${issue.kwcag_criterion} ${issue.kwcag_name || ""}`);
|
||||
}
|
||||
else if (issue.wcag_criterion) {
|
||||
lines.push(`- **WCAG**: ${issue.wcag_criterion}`);
|
||||
}
|
||||
lines.push("");
|
||||
}
|
||||
return lines.join("\n");
|
||||
}
|
||||
//# sourceMappingURL=get-issues.js.map
|
||||
Reference in New Issue
Block a user