Lighthouse MCP
Lighthouse MCP 서버
Google Lighthouse를 사용하여 포괄적인 웹 성능 감사 및 분석 기능을 제공하는 Model Context Protocol(MCP) 서버입니다. 이 서버는 LLM과 AI 에이전트가 상세한 웹사이트 성능 평가, 접근성 감사, SEO 분석, 보안 점검, Core Web Vitals 모니터링을 수행할 수 있게 해줍니다.
🌟 주요 기능
🚀 성능 분석: Core Web Vitals, 성능 점수, 최적화 권장사항을 포함한 완전한 Lighthouse 감사
♿ 접근성 감사: WCAG 준수 여부 확인 및 접근성 점수 분석
🔍 SEO 분석: 검색 엔진 최적화 감사 및 모범 사례 권장사항
🔒 보안 평가: HTTPS, CSP, 보안 취약점 스캔
📊 리소스 분석: JavaScript, CSS, 이미지, 폰트 최적화 기회
📱 모바일 vs 데스크톱: 스로틀링 옵션을 포함한 기기 간 비교 분석
⚡ Core Web Vitals: LCP, INP, CLS 모니터링 및 임계값 확인
🎯 성능 예산: 사용자 정의 성능 임계값 및 예산 모니터링
🤖 에이전트 브라우징: 페이지가 AI 에이전트에 얼마나 잘 제공되는지에 대한 Lighthouse 13 감사(WebMCP 도구, 에이전트 접근성 트리, llms.txt)
🧩 구조화된 출력: 모든 도구는
outputSchema를 선언하고 검증된structuredContent를 반환하므로 클라이언트는 JSON 문자열을 파싱하는 대신 타입이 지정된 데이터를 받습니다📚 참조 리소스: 웹 성능, 접근성, SEO, 보안에 대한 내장 가이드라인 및 모범 사례
Related MCP server: mcp-seo
🛠️ 요구 사항
Node.js 22.0.0 이상
Chrome/Chromium 브라우저(Lighthouse가 자동으로 관리)
VS Code, Cursor, Windsurf, Claude Desktop 또는 기타 MCP 클라이언트
🚀 시작하기
아래 구성 중 하나를 사용하여 선호하는 클라이언트에 Lighthouse MCP 서버를 설치하세요:
{
"mcpServers": {
"lighthouse": {
"command": "npx",
"args": ["@danielsogl/lighthouse-mcp@latest"]
}
}
}영구 Chrome 프로필(로그인 세션)
인증된 세션이 필요한 경우 영구 Chrome 프로필로 시작하고 헤드드(headed) 모드로 실행하세요:
{
"mcpServers": {
"lighthouse": {
"command": "npx",
"args": [
"@danielsogl/lighthouse-mcp@latest",
"--profile-path",
"<profile-path>",
"--no-headless"
]
}
}
}--chrome-flag로 추가 Chrome 플래그를 전달할 수 있습니다(예: --chrome-flag=--disable-gpu).
플래그 값이 --로 시작하고 알려진 옵션 이름과 일치하는 경우, 최상위 옵션으로 파싱되지 않도록 --chrome-flag=...를 사용하는 것이 좋습니다.
프로필 모드는 Lighthouse의 저장소 재설정을 비활성화하여 쿠키와 로컬 저장소가 실행 간에 유지됩니다.
--user-data-dir가 존재하지 않는 디렉터리를 가리키면 해당 디렉터리가 생성되고 새 프로필로 처리됩니다.
--profile-path를 chrome://version에 표시된 프로필 경로(예: .../Default)로 설정하세요.
참고: Chrome의 원격 디버깅에는 기본이 아닌 사용자 데이터 디렉터리가 필요하므로 시스템 기본값 대신 전용 프로필 디렉터리를 재사용하세요.
원하는 경우 --user-data-dir + --profile-directory를 별도로 전달할 수도 있습니다.
--chrome-port만으로 연결하면 저장소가 보존되지 않습니다. 세션을 유지하려면 프로필 플래그를 포함하세요.
CLI 옵션
MCP 서버에서 지원하는 런타임 플래그:
--profile-path <path>:chrome://version의 프로필 경로 사용(사용자 데이터 디렉터리 + 프로필 이름 자동 파생)--user-data-dir <path>: 영구 세션을 위해 Chrome 프로필 디렉터리 재사용--profile-directory <name>: 사용자 데이터 디렉터리 내에서 프로필 선택--chrome-path <path>: Chrome/Chromium 실행 파일의 명시적 경로(자동 감지 재정의,CHROME_PATH환경 변수도 존중)--chrome-flag <flag>또는--chrome-flag=<flag>: 추가 Chrome 플래그 전달(반복 가능)--chrome-port <port>또는--remote-debugging-port <port>: 원격 디버깅이 활성화된 기존 Chrome 인스턴스에 연결--headless: 헤드리스 모드 강제--no-headless: 헤드드 모드 강제
로깅
Lighthouse는 stderr에 로그를 기록합니다. 서버는 MCP 클라이언트 로그가 넘치지 않도록 이를 error 수준으로 유지합니다. 디버깅 시(예: Chrome 시작 실패) LIGHTHOUSE_LOG_LEVEL을 silent, info 또는 verbose로 설정하세요.
LIGHTHOUSE_LOG_LEVEL=verbose npx @danielsogl/lighthouse-mcp@latestWSL2 / 사용자 정의 Chrome 경로
잘못된 Chrome 바이너리가 선택된 경우(예: WSL2에서 Linux 바이너리 대신 Windows Chrome), 경로를 명시적으로 설정하세요:
# Via CLI flag
npx @danielsogl/lighthouse-mcp@latest --chrome-path /usr/bin/google-chrome
# Via environment variable
CHROME_PATH=/usr/bin/google-chrome npx @danielsogl/lighthouse-mcp@latestMCP 구성에서:
{
"mcpServers": {
"lighthouse": {
"command": "npx",
"args": ["@danielsogl/lighthouse-mcp@latest", "--chrome-path", "/usr/bin/google-chrome"]
}
}
}E2E 스모크 테스트(프로필)
영구 프로필로 실제 감사를 실행합니다(기존 프로필 디렉터리를 사용하고 필요시 한 번 로그인):
npm run smoke:profile -- --url https://example.com \
--profile-path "<profile-path>" \
--no-headlessE2E 스모크 테스트(기존 Chrome에 연결)
원격 디버깅을 활성화하여 Chrome을 시작합니다:
/path/to/GoogleChromeExecutable \
--remote-debugging-port=9222 \
--user-data-dir /path/to/chrome-profile/path/to/GoogleChromeExecutable을 해당 플랫폼의 Chrome/Chromium 바이너리 경로로 바꾸세요.
그런 다음 Lighthouse를 해당 인스턴스에 연결합니다:
npm run smoke:profile -- --url https://example.com --chrome-port 9222연결 시 저장소를 보존하려면 프로필 경로를 전달하여 Lighthouse가 쿠키/로컬 저장소를 유지하도록 하세요:
npm run smoke:profile -- --url https://example.com \
--chrome-port 9222 \
--profile-path "<profile-path>"VS Code에 설치
VS Code CLI를 사용하여 Lighthouse MCP 서버를 설치할 수도 있습니다:
# For VS Code
code --add-mcp '{"name":"lighthouse","command":"npx","args":["-y","@danielsogl/lighthouse-mcp@latest"]}'
# For VS Code Insiders
code-insiders --add-mcp '{"name":"lighthouse","command":"npx","args":["-y","@danielsogl/lighthouse-mcp@latest"]}'설치 후 Lighthouse MCP 서버는 VS Code에서 GitHub Copilot 에이전트와 함께 사용할 수 있습니다.
Cursor에 설치
Cursor 설정 → MCP → 새 MCP 서버 추가로 이동하세요. 이름을 "lighthouse"로 지정하고, command 유형과 명령어 npx @danielsogl/lighthouse-mcp@latest를 사용하세요:
{
"mcpServers": {
"lighthouse": {
"command": "npx",
"args": ["@danielsogl/lighthouse-mcp@latest"]
}
}
}Windsurf에 설치
Windsurf MCP 문서를 따르세요. 다음 구성을 사용하세요:
{
"mcpServers": {
"lighthouse": {
"command": "npx",
"args": ["@danielsogl/lighthouse-mcp@latest"]
}
}
}Claude Desktop에 설치
MCP 설치 가이드를 따르고 다음 구성을 사용하세요:
{
"mcpServers": {
"lighthouse": {
"command": "npx",
"args": ["@danielsogl/lighthouse-mcp@latest"]
}
}
}🔧 사용 가능한 도구
Lighthouse MCP 서버는 포괄적인 웹 분석을 위한 다음 도구를 제공합니다:
🏁 감사 도구
도구 | 설명 | 매개변수 |
| 포괄적인 Lighthouse 감사 실행 |
|
| 접근성 점수 및 권장사항 가져오기 |
|
| SEO 분석 및 권장사항 가져오기 |
|
⚡ 성능 도구
도구 | 설명 | 매개변수 |
| 전체 성능 점수 가져오기 |
|
| Core Web Vitals 지표 가져오기 |
|
| 기기 간 성능 비교 |
|
| 성능 예산 확인 |
|
| LCP 최적화 기회 찾기 |
|
🔍 분석 도구
도구 | 설명 | 매개변수 |
| 사용되지 않는 JavaScript 코드 찾기 |
|
| 모든 웹사이트 리소스 분석 |
|
🔒 보안 도구
도구 | 설명 | 매개변수 |
| 포괄적인 보안 감사 수행 |
|
💬 사용 가능한 프롬프트
Lighthouse MCP 서버는 LLM이 구조화된 분석과 권장사항을 제공하는 데 도움이 되는 재사용 가능한 프롬프트를 포함합니다:
📊 분석 프롬프트
프롬프트 | 설명 | 매개변수 |
| Lighthouse 감사 결과 분석 |
|
| 전후 감사 결과 비교 |
|
| Core Web Vitals 최적화 권장사항 가져오기 |
|
| 리소스 최적화 권장사항 가져오기 |
|
📚 사용 가능한 리소스
Lighthouse MCP 서버는 필수 가이드라인과 모범 사례가 포함된 내장 참조 리소스를 제공합니다:
리소스 | 설명 | URI |
| Core Web Vitals 성능 임계값 |
|
| 성능 최적화 기법 및 영향 |
|
| WCAG 2.1 접근성 가이드라인 및 이슈 |
|
| SEO 모범 사례 및 최적화 기회 |
|
| 웹 보안 모범 사례 및 취약점 |
|
| 사이트 유형별 성능 예산 권장 사항 |
|
| Lighthouse 감사 카테고리 및 점수 산정 방법 |
|
| 프레임워크별 최적화 가이드 |
|
🎯 전략 프롬프트
프롬프트 | 설명 | 매개변수 |
| 포괄적인 성능 개선 계획 생성 |
|
| 맞춤형 성능 예산 권장 사항 생성 |
|
| SEO 개선 권장 사항 생성 |
|
| 접근성 개선 가이드 생성 |
|
🔧 프롬프트 매개변수 세부 정보
auditResults: Lighthouse 도구의 JSON 감사 결과focusArea: 집중할 특정 카테고리 ("performance","accessibility","seo","best-practices","agentic-browsing")beforeAudit/afterAudit: 변경 전후의 Lighthouse 감사 결과changesImplemented: 감사 사이에 구현된 변경 사항 설명currentMetrics: 감사에서 얻은 현재 성능 지표targetGoals: 특정 성능 목표 또는 비즈니스 목표timeframe: 개선 구현을 위한 기간framework: 프론트엔드 프레임워크 또는 기술 스택constraints: 기술적 또는 비즈니스 제약 사항websiteType: 웹사이트 유형 (예: 전자상거래, 블로그, 기업)targetAudience: 대상 청중 또는 시장 정보complianceLevel: WCAG 준수 수준 ("AA"또는"AAA")userGroups: 접근성을 위해 고려해야 할 특정 사용자 그룹
📋 매개변수 세부 정보
공통 매개변수
url(필수): 분석할 웹사이트 URLdevice: 대상 기기 ("desktop"또는"mobile", 기본값:"desktop")includeDetails: 상세 감사 정보 포함 (기본값:false)throttling: 네트워크/CPU 스로틀링 활성화 (기본값:false)
특정 매개변수
categories: 감사할 Lighthouse 카테고리 (["performance", "accessibility", "best-practices", "seo", "agentic-browsing"])threshold: 지표에 대한 사용자 지정 임계값 (예:{"lcp": 2.5, "inp": 200, "cls": 0.1})budget: 성능 예산 한도 (예:{"performanceScore": 90, "largestContentfulPaint": 2500})resourceTypes: 분석할 리소스 유형 (["images", "javascript", "css", "fonts", "other"])minBytes: 분석을 위한 최소 파일 크기 임계값 (기본값:2048)checks: 수행할 보안 검사 (["https", "csp", "hsts", "origin-isolation", "clickjacking", "trusted-types", "third-party-cookies", "deprecations"])
💡 사용 예시
기본 성능 감사
// Get overall performance score
{
"tool": "get_performance_score",
"arguments": {
"url": "https://example.com",
"device": "mobile"
}
}Core Web Vitals 분석
// Check Core Web Vitals with custom thresholds
{
"tool": "get_core_web_vitals",
"arguments": {
"url": "https://example.com",
"device": "mobile",
"includeDetails": true,
"threshold": {
"lcp": 2.5,
"inp": 200,
"cls": 0.1
}
}
}보안 평가
// Comprehensive security audit
{
"tool": "get_security_audit",
"arguments": {
"url": "https://example.com",
"checks": ["https", "csp", "hsts"]
}
}리소스 최적화
// Find optimization opportunities
{
"tool": "analyze_resources",
"arguments": {
"url": "https://example.com",
"resourceTypes": ["images", "javascript"],
"minSize": 1024
}
}참조 리소스 사용
내장된 가이드라인 및 모범 사례에 액세스:
// Get Core Web Vitals thresholds
{
"resource": {
"uri": "lighthouse://performance/core-web-vitals-thresholds"
}
}
// Access WCAG accessibility guidelines
{
"resource": {
"uri": "lighthouse://accessibility/wcag-guidelines"
}
}
// Get framework-specific optimization guides
{
"resource": {
"uri": "lighthouse://frameworks/optimization-guides"
}
}분석을 위한 프롬프트 사용
// Analyze audit results with focused recommendations
{
"prompt": "analyze-audit-results",
"arguments": {
"auditResults": "{...lighthouse audit json...}",
"focusArea": "performance"
}
}
// Create a performance improvement plan
{
"prompt": "create-performance-plan",
"arguments": {
"currentMetrics": "{...current performance metrics...}",
"targetGoals": "Achieve 90+ performance score and sub-2s LCP",
"timeframe": "3 months"
}
}
// Compare before/after audit results
{
"prompt": "compare-audits",
"arguments": {
"beforeAudit": "{...before audit results...}",
"afterAudit": "{...after audit results...}",
"changesImplemented": "Implemented lazy loading and image optimization"
}
}🎯 사용 사례
성능 모니터링: 자동 성능 추적 및 Core Web Vitals 모니터링
접근성 준수: WCAG 2.1 준수 확인 및 수정 지침
SEO 최적화: 기술적 SEO 감사 및 검색 엔진 최적화 권장 사항
보안 평가: 취약점 스캔 및 보안 모범 사례 검증
리소스 최적화: 번들 분석 및 최적화 기회 식별
성능 예산: 자동 성능 예산 모니터링 및 알림
CI/CD 통합: 자동화된 품질 게이트 및 성능 회귀 감지
🏗️ 아키텍처
서버는 다음을 사용하여 구축되었습니다:
Model Context Protocol SDK: MCP 서버 구현용
Google Lighthouse: 웹 성능 감사용
Chrome Launcher: 브라우저 자동화용
TypeScript: 타입 안전성과 더 나은 개발자 경험을 위해
Zod: 런타임 스키마 검증용
🧪 테스트
npm run test:run # unit tests
npm run test:coverage # unit tests with coverage
npm run test:e2e # end-to-end tests엔드투엔드 스위트는 서버를 빌드하고, 실제 MCP 클라이언트와 함께 stdio를 통해 서버를 실행하며, 루프백에서 제공되는 픽스처 페이지에 대해 실제 Lighthouse 감사를 실행합니다. Chrome이 설치되어 있어야 하며, 비표준 위치에 있는 경우 CHROME_PATH를 설정하세요.
🤝 기여
기여를 환영합니다! 자세한 내용은 기여 가이드를 참조하세요:
코드 스타일 및 표준
테스트 요구 사항
풀 리퀘스트 프로세스
개발 환경 설정
📜 라이선스
이 프로젝트는 MIT 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.
🔒 보안
보안 문제는 보안 정책을 참조하세요.
📞 지원
🐛 버그 신고: GitHub Issues
💬 토론: GitHub Discussions
📧 이메일: security@codingrules.ai
🙏 감사의 말
훌륭한 감사 엔진을 제공한 Google Lighthouse 팀
Model Context Protocol 사양을 제공한 Anthropic
지속적인 영감과 기여를 주는 오픈 소스 커뮤니티
❤️ Daniel Sogl 제작
Available Tools
11 toolsanalyze_resourcesAnalyze Page ResourcesARead-only
Analyze website resources (images, JS, CSS, fonts) for optimization opportunities
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to audit | |
| device | No | Device to emulate (default: desktop) | desktop |
| minSize | No | Minimum resource size in KB to include | |
| resourceTypes | No | Types of resources to analyze |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| device | Yes | |
| filters | Yes | |
| summary | Yes | |
| resources | Yes | |
| timestamp | Yes | |
| optimization | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the agent knows this is a safe, read-only operation that may access external URLs. The description adds the focus on optimization opportunities but does not disclose details like whether it fetches live pages, handles redirects, or has rate limits. With annotations covering the safety profile, a 3 is appropriate – it adds some context but not rich behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, clear sentence that front-loads the resource types and purpose. No waste, though it could be slightly more specific about the output or usage context. Efficient and to the point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and annotations cover safety, the description is adequate for a resource analysis tool. It doesn't explain return values (covered by output schema) or edge cases, but for a read-only analysis tool with 4 parameters, it is reasonably complete. Could benefit from mentioning that it analyzes a single URL or that it's for optimization, but these are minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are documented in the schema. The description adds the overall purpose but does not add syntax or format details beyond what the schema provides. Baseline 3 is correct when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Analyze') and resource ('website resources') with a clear scope (images, JS, CSS, fonts) and purpose (optimization opportunities). It distinguishes from siblings like get_performance_score or get_seo_analysis by focusing on resource-level analysis, though it doesn't explicitly name a sibling it is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for optimization analysis but does not explicitly state when to use this tool versus alternatives like find_unused_javascript or get_lcp_opportunities. The sibling list suggests related tools, but no exclusions or conditions are provided. The context is clear enough for a general audit, but lacks explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_performance_budgetCheck Performance BudgetBRead-only
Check if website performance meets specified budget thresholds
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to audit | |
| budget | Yes | ||
| device | No | Device to emulate (default: desktop) | desktop |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| summary | Yes | |
| recommendations | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint: true and openWorldHint: true, indicating a read-only operation that may access external resources. The description adds no extra behavioral context—it does not mention that the tool will perform a live audit, make network requests, or have rate limits. While there is no contradiction, the description fails to disclose the operation's networked nature, which is a meaningful behavioral trait beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no filler. It conveys the purpose immediately and contains no redundant information. It earns a high score for being appropriately sized and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (nested budget object, optional device, output schema present), the description is minimal. It does not explain when to use it compared to siblings, nor does it clarify the semantics of the budget fields beyond what the schema provides. The output schema exists, so return values are covered, but the lack of usage guidance leaves the description somewhat incomplete for guiding an agent toward correct invocation in context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%: url and device have descriptions, but the budget object itself lacks a description at the top level. The inner properties are described, so the schema partially covers the main parameter. The description adds no additional meaning about how to structure the budget or interpret thresholds, leaving the agent to rely on the schema's inner property descriptions, which are adequate but not enriched.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: checking website performance against budget thresholds. It uses a specific verb ('check') and resource ('website performance'), and the notion of 'budget thresholds' distinguishes it from sibling tools that return raw scores or metrics. However, it does not explicitly name an alternative or contrast with similar tools like get_performance_score, so it is clear but not strongly differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool instead of siblings such as run_audit, get_performance_score, or get_core_web_vitals. The description only states what it does, leaving the agent to infer appropriate use. No exclusions, alternatives, or preconditions are provided, so usage context is entirely absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_mobile_desktopCompare Mobile vs DesktopARead-only
Compare website performance between mobile and desktop devices
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to audit | |
| categories | No | ||
| throttling | No | Whether to throttle the audit (default: false) | |
| includeDetails | No | Include detailed metrics and recommendations |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| summary | Yes | |
| recommendations | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the description does not need to restate safety. However, it adds no extra behavioral context such as how the comparison is structured, whether it returns a single report or dual reports, or any throttling implications. With annotations covering the read-only nature, the description provides marginal added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with zero filler. It delivers the core purpose immediately and does not elaborate unnecessarily.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, annotations cover safety, and an output schema exists so return format details are not required. However, the description lacks usage guidance and does not mention any special considerations (e.g., throttling, category selection) that an agent might need to know for effective invocation. It is minimally sufficient but not comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75% (high), and all parameters have descriptive names and default values in the schema. The description adds no parameter-specific meaning beyond what the schema already provides. The baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (compare) on a defined resource (website performance) between mobile and desktop devices. It clearly distinguishes itself from sibling audit tools like run_audit or get_performance_score, which focus on single-device audits or individual metric categories.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is given on when to use this tool versus alternatives. It does not mention that it is the preferred tool when a mobile/desktop comparison is needed, nor does it exclude cases where a single-device audit would suffice. The usage context is only implied by the tool's name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_unused_javascriptFind Unused JavaScriptBRead-only
Find unused JavaScript code to reduce bundle size
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to audit | |
| device | No | Device to emulate (default: desktop) | desktop |
| minBytes | No | Minimum unused bytes to report (default: 2048) |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| device | Yes | |
| summary | Yes | |
| timestamp | Yes | |
| unusedFiles | Yes | |
| thresholdBytes | No | |
| recommendations | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint=true and openWorldHint=true, so the tool's non-destructive and open-world behavior is covered, and the description does not contradict the annotations. The description adds little beyond the generic 'find' behavior—no mention of how the scan is performed, what resources are fetched, or what output to expect—so it stays at the baseline for annotation-covered tools.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence that immediately states the tool's core function. It avoids filler and front-loads the verb and resource, making it easy for an agent to parse at a glance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, and the schema, annotations, and output schema fill in a lot. However, the description does not mention the need for a URL or clarify how this audit relates to the many other audit siblings, leaving the agent without enough context to confidently choose and invoke it among the broader toolset.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage of the input parameters is 100%, so the baseline is 3. The description mentions bundle size, which loosely relates to minBytes, but it does not add detail about how url, device, or minBytes interplay; the schema carries the burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Find') and a concrete resource ('unused JavaScript code'), and adds the motivating goal of reducing bundle size. It is clear enough to be distinguished from performance scoring tools, but it does not explicitly differentiate it from a sibling like analyze_resources, so it misses the 5 criterion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives such as get_performance_score, analyze_resources, or run_audit. There are no conditions, prerequisites, or exclusion criteria—only a one-line purpose statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_accessibility_scoreGet Accessibility ScoreBRead-only
Get the accessibility score and recommendations for a website
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to audit | |
| device | No | Device to emulate (default: desktop) | desktop |
| includeDetails | No | Include detailed metrics and recommendations |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| summary | Yes | |
| recommendations | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description only restates the purpose and adds no behavioral traits beyond the annotations. Annotations declare readOnlyHint and openWorldHint, but the description does not disclose what an audit entails (e.g., live network request, duration, caching). Since annotations are present, the burden is lower, but the description adds no value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, clear sentence with no redundancy. The primary action and outcome are front-loaded. Perfectly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, has an output schema (though not shown), and full schema coverage. The description is adequate but omits context about how the audit is performed (live vs. cached) and what 'recommendations' entail. Given the complexity level, this is a minimum-viable description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for all parameters, including device enum and includeDetails. The description does not elaborate on parameters, but the schema carries the full burden. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'accessibility score and recommendations for a website'. It distinguishes itself from performance, SEO, and security siblings by naming the accessibility domain, but does not explicitly reference alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives. It does not mention prerequisites, use cases, or exclusions. An agent would have to infer from the name that it is for accessibility audits only.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_core_web_vitalsGet Core Web VitalsARead-only
Get Core Web Vitals metrics for a website
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to audit | |
| device | No | Device to emulate (default: desktop) | desktop |
| threshold | No | ||
| includeDetails | No | Include detailed metrics and recommendations |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| summary | Yes | |
| recommendations | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true and openWorldHint=true, meaning the tool performs a safe, read-only operation. The description adds no new behavioral information beyond the name, but given the annotations already cover the safety and non-mutating nature, the description's transparency is adequate. It does not contradict annotations, and the openWorldHint suggests the tool may reach external websites, which is not disclosed in the description but is implied by the term 'website'. The absence of details about rate limits or external dependencies is minor since the tool is read-only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that directly states the tool's purpose. Every word is meaningful; there is no fluff or repetition. It is appropriately front-loaded, with the verb 'Get' immediately clarifying the action. This is a model of conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (4 parameters, nested threshold object, output schema present), the description is relatively sparse, but the robust input schema and presence of an output schema reduce the need for extensive description. The description covers the 'what' but not the 'how' or nuances like how thresholds affect evaluation or what 'detailed metrics' entails. With the output schema handling return values and the schema handling parameters, the description is sufficient for a read-only tool, so it slightly exceeds the minimum viable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes all parameters with reasonable detail (url, device, threshold object with fields, includeDetails). The schema description coverage is 75%, so most parameters are documented. The description does not add any additional meaning beyond what the schema provides; for example, it doesn't explain how thresholds are used or how includeDetails alters the output. With high coverage, the baseline is 3, and the description contributes minimal value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Get Core Web Vitals metrics for a website' clearly identifies the specific metrics (Core Web Vitals) and the resource (a website), using a precise verb. It is specific enough to distinguish it from generic measures like 'get_performance_score', though it could name a specific competitor (e.g., get_performance_score) to further differentiate. The title and description are aligned, with the description adding 'metrics' to clarify the resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance on when to use this tool versus siblings such as 'get_performance_score' or 'compare_mobile_desktop'. However, the purpose is clear enough that an agent can infer it is for Core Web Vitals (LCP, INP, CLS) specifically, which is a subset of performance. There are no exclusions or alternatives mentioned, so the usage context is implied rather than explicit, warranting a mid-range score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_lcp_opportunitiesGet LCP OpportunitiesBRead-only
Get LCP optimization opportunities for a website
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to audit | |
| device | No | Device to emulate (default: desktop) | desktop |
| threshold | No | LCP threshold in seconds (default: 2.5) | |
| includeDetails | No | Include detailed metrics and recommendations |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| summary | Yes | |
| recommendations | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description itself adds little behavioral context, such as whether the tool performs a live network audit or how results are ordered, but it does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler or repetition. It states the essential purpose efficiently, and nothing extraneous is included.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema and complete parameter documentation reduce the need for the description to explain return values or parameters. However, the lack of usage guidance relative to sibling tools and the absence of operational caveats leave the overall context only adequate, not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each parameter is documented with types, defaults, enums, and constraints. The description adds no additional parameter-level meaning beyond what the schema already provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the verb ('Get') and resource ('LCP optimization opportunities for a website'), so an agent understands the tool's core purpose. It does not explicitly distinguish itself from sibling tools such as get_core_web_vitals or get_performance_score, but the LCP-specific focus provides reasonable differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to use this tool versus alternatives like get_core_web_vitals, get_performance_score, or run_audit. There are no stated exclusions, prerequisites, or context cues, leaving the agent to infer selection based solely on the tool name and description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_performance_scoreGet Performance ScoreCRead-only
Get the performance score for a website
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to audit | |
| device | No | Device to emulate (default: desktop) | desktop |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| summary | Yes | |
| recommendations | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds no behavioral information beyond the annotations. It does not state that the tool fetches a live URL, runs a Lighthouse audit, or that it may take time or require network access. With readOnlyHint and openWorldHint already provided, the description contributes nothing extra.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence with no wasted words. It is appropriately concise for the tool's simplicity, though it is not front-loaded with any additional context because there is none.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with an output schema, the description is minimally adequate but lacks key contextual details such as what constitutes a 'performance score' (e.g., Lighthouse metric), prerequisites like URL accessibility, or any potential variability. Given the existence of siblings, it is not sufficiently complete to guide correct selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% as both 'url' and 'device' are described in the input schema. The description adds no additional meaning about the parameters or their usage, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('get') and resource ('performance score for a website'), making the intent clear. However, it does not differentiate from nearby siblings like get_core_web_vitals or get_lcp_opportunities, which also relate to performance metrics, so there is a mild ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as get_core_web_vitals or analyze_resources. No exclusions or recommended contexts are provided, leaving an agent to infer the appropriate choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_security_auditGet Security AuditARead-only
Perform security audit checking HTTPS, CSP, and other security measures
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to audit | |
| checks | No | Specific security checks to perform | |
| device | No | Device to emulate (default: desktop) | desktop |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| summary | Yes | |
| recommendations | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered; the description adds that it checks HTTPS/CSP and 'other security measures', which is useful but thin. It does not mention network behavior toward the target URL or response characteristics, though openWorldHint partially implies external access. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the action ('Perform security audit') and gives concrete examples of check types. The tail 'and other security measures' is slightly vague but functions as a pointer to the schema's enum without bloating the text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, full parameter documentation in the schema, and annotations covering the read-only/open-world safety profile, the description is largely sufficient for correct invocation. The notable gap is the missing relationship to 'run_audit', which is the one sibling that could genuinely confuse tool selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — url, checks, and device are all documented in the input schema, so the description carries no required burden. The mention of 'HTTPS, CSP' marginally reinforces the enum values in the 'checks' parameter, but adds little beyond the schema's own descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource ('security audit') and concrete focus areas (HTTPS, CSP), which cleanly separates it from the nine accessibility/SEO/performance siblings. However, it does not distinguish itself from the overlapping sibling 'run_audit', whose scope is left undefined, so an agent cannot fully tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the security focus and the 'checking HTTPS, CSP' phrasing, which suggests this is the tool for security-related audits. There is no explicit statement of when to prefer it over 'run_audit' or when not to use it, leaving the selection logic to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_seo_analysisGet SEO AnalysisCRead-only
Get SEO analysis and recommendations for a website
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to audit | |
| device | No | Device to emulate (default: desktop) | desktop |
| includeDetails | No | Include detailed metrics and recommendations |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| summary | Yes | |
| recommendations | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds no further behavioral context such as rate limits, time expectations, or the nature of external fetches, offering minimal value beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that efficiently states the core purpose. It is appropriately concise for a tool whose parameters and return format are fully specified in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the large set of specialized audit siblings, the description is thin on context for selection. It doesn't mention that this provides a comprehensive overview or when to prefer it over targeted tools, and it omits any note about output shape (though the output schema covers that). The lack of usage guidance undermines completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides full descriptions for all three parameters at 100% coverage. The description adds no extra meaning, so the baseline of 3 applies. Nothing is lacking in terms of parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves SEO analysis and recommendations for a website, using a specific verb and resource. While it doesn't explicitly contrast with sibling audit tools, the name and resource make it distinct from performance, accessibility, and security-specific tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to choose this tool over alternative audit or metric tools. An agent must infer from the name that it covers general SEO, with no explicit exclusions or references to siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_auditRun Lighthouse AuditBRead-only
Run a comprehensive Lighthouse audit on a website
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to audit | |
| device | No | Device to emulate (default: desktop) | desktop |
| categories | No | ||
| throttling | No | Whether to throttle the audit (default: false) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| summary | Yes | |
| recommendations | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=true, so the agent knows this is a safe read operation. The description adds 'comprehensive' but doesn't disclose behavioral traits like the fact that it runs multiple categories, the time it takes, or that it may be slower than targeted audits. With annotations covering safety, the description adds minimal behavioral context beyond the word 'comprehensive'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no waste. It's front-loaded with the verb and resource. It could be slightly more informative, but it's concise and to the point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema (not shown) and 4 parameters with 75% schema coverage. The description is minimal but the schema and annotations carry some weight. However, given the complexity of a Lighthouse audit (multiple categories, device emulation, throttling), the description could explain what 'comprehensive' means and how it relates to the sibling tools. It's adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, so most parameters are documented in the schema. The description doesn't add any parameter-specific meaning beyond what the schema provides. The 'categories' parameter has an enum with 'agentic-browsing' which is unusual, but the description doesn't explain it. Baseline 3 is appropriate since the schema does most of the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Run') and resource ('Lighthouse audit'), and the title clarifies it's a website audit. It's clear what the tool does, though it doesn't explicitly differentiate from siblings like get_performance_score or get_accessibility_score, which are more specific. The description is broad but not misleading.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for running a comprehensive audit, but it doesn't explicitly state when to use this tool versus the more specific sibling tools (e.g., get_performance_score, get_accessibility_score). It doesn't mention alternatives or exclusions. The context signals show many sibling tools that are more targeted, so the description should guide the agent on when to choose this comprehensive audit over those.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
12 tool updates
v1.0.27- Changed
analyze_resources1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "device": { + "type": "string" + }, + "filters": { + "additionalProperties": false, + "properties": { + "minSizeKB": { + "type": "number" + }, + "resourceTypes": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "resourceTypes", + "minSizeKB" + ], + "type": "object" + }, + "optimization": { + "additionalProperties": false, + "properties": { + "priorities": { + "items": { + "type": "string" + }, + "type": "array" + }, + "recommendations": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "recommendations", + "priorities" + ], + "type": "object" + }, + "resources": { + "items": { + "additionalProperties": false, + "properties": { + "filename": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "sizeKB": { + "type": "number" + }, + "type": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "filename", + "type", + "sizeKB", + "mimeType", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "summary": { + "additionalProperties": false, + "properties": { + "resourceCounts": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "count": { + "type": "number" + }, + "sizeKB": { + "type": "number" + } + }, + "required": [ + "count", + "sizeKB" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "totalResources": { + "type": "number" + }, + "totalSizeKB": { + "type": "number" + } + }, + "required": [ + "totalResources", + "totalSizeKB", + "resourceCounts" + ], + "type": "object" + }, + "timestamp": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "device", + "timestamp", + "filters", + "summary", + "resources", + "optimization" + ], + "type": "object" +}
- Changed
check_performance_budget1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "fetchTime": { + "type": "string" + }, + "overallPassed": { + "type": "boolean" + }, + "results": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "actual": { + "type": "number" + }, + "budget": { + "type": "number" + }, + "difference": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "passed": { + "type": "boolean" + }, + "unit": { + "type": "string" + } + }, + "required": [ + "actual", + "budget", + "unit", + "passed", + "difference" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "overallPassed", + "results", + "fetchTime" + ], + "type": "object" + }, + "recommendations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "summary": { + "type": "string" + } + }, + "required": [ + "summary", + "data" + ], + "type": "object" +}
- Removed
check_pwa_readiness - Changed
compare_mobile_desktop2 fields changed- changed
Input schema / properties / categories / items / enumPrevious value: -[ - "performance", - "accessibility", - "best-practices", - "seo", - "pwa" -]New value: +[ + "performance", + "accessibility", + "best-practices", + "seo", + "agentic-browsing" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "differences": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "better": { + "enum": [ + "mobile", + "desktop" + ], + "type": "string" + }, + "desktop": { + "type": "number" + }, + "difference": { + "type": "number" + }, + "mobile": { + "type": "number" + } + }, + "required": [ + "mobile", + "desktop", + "difference", + "better" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "includeDetails": { + "type": "boolean" + } + }, + "required": [ + "differences" + ], + "type": "object" + }, + "recommendations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "summary": { + "type": "string" + } + }, + "required": [ + "summary", + "data" + ], + "type": "object" +}
- Changed
find_unused_javascript1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "device": { + "type": "string" + }, + "recommendations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "summary": { + "additionalProperties": false, + "properties": { + "hasUnusedCode": { + "type": "boolean" + }, + "totalFilesAnalyzed": { + "type": "number" + }, + "totalUnusedKB": { + "type": "number" + } + }, + "required": [ + "totalUnusedKB", + "totalFilesAnalyzed", + "hasUnusedCode" + ], + "type": "object" + }, + "thresholdBytes": { + "type": "number" + }, + "timestamp": { + "type": "string" + }, + "unusedFiles": { + "items": { + "additionalProperties": false, + "properties": { + "filename": { + "type": "string" + }, + "totalKB": { + "type": "number" + }, + "unusedKB": { + "type": "number" + }, + "unusedPercent": { + "type": "number" + }, + "url": { + "type": "string" + } + }, + "required": [ + "filename", + "totalKB", + "unusedKB", + "unusedPercent", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "device", + "timestamp", + "summary", + "unusedFiles", + "recommendations" + ], + "type": "object" +}
- Changed
get_accessibility_score1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "accessibilityScore": { + "type": "number" + }, + "audits": { + "items": { + "additionalProperties": false, + "properties": { + "description": { + "type": "string" + }, + "displayValue": { + "type": "string" + }, + "score": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "title": { + "type": "string" + } + }, + "required": [ + "title", + "score", + "displayValue" + ], + "type": "object" + }, + "type": "array" + }, + "fetchTime": { + "type": "string" + }, + "includeDetails": { + "type": "boolean" + } + }, + "required": [ + "accessibilityScore", + "fetchTime", + "includeDetails" + ], + "type": "object" + }, + "recommendations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "summary": { + "type": "string" + } + }, + "required": [ + "summary", + "data" + ], + "type": "object" +}
- Changed
get_core_web_vitals3 fields changed- removed
Input schema / properties / threshold / properties / fidRemoved value: -{ - "description": "First Input Delay threshold in milliseconds", - "minimum": 0, - "type": "number" -} - added
Input schema / properties / threshold / properties / inpAdded value: +{ + "description": "Interaction to Next Paint threshold in milliseconds (compared against TBT in lab runs)", + "minimum": 0, + "type": "number" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "coreWebVitals": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "score": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "title": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "title", + "value" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "fetchTime": { + "type": "string" + }, + "includeDetails": { + "type": "boolean" + }, + "thresholdResults": { + "additionalProperties": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "coreWebVitals", + "thresholdResults", + "fetchTime" + ], + "type": "object" + }, + "recommendations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "summary": { + "type": "string" + } + }, + "required": [ + "summary", + "data" + ], + "type": "object" +}
- Changed
get_lcp_opportunities1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "fetchTime": { + "type": "string" + }, + "includeDetails": { + "type": "boolean" + }, + "lcpValue": { + "type": "number" + }, + "needsImprovement": { + "type": "boolean" + }, + "opportunities": { + "items": { + "additionalProperties": false, + "properties": { + "description": { + "type": "string" + }, + "displayValue": { + "type": "string" + }, + "id": { + "type": "string" + }, + "numericValue": { + "type": "number" + }, + "score": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "title": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "type": "array" + }, + "threshold": { + "type": "number" + } + }, + "required": [ + "lcpValue", + "threshold", + "needsImprovement", + "opportunities", + "fetchTime" + ], + "type": "object" + }, + "recommendations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "summary": { + "type": "string" + } + }, + "required": [ + "summary", + "data" + ], + "type": "object" +}
- Changed
get_performance_score1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "fetchTime": { + "type": "string" + }, + "metrics": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "score": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "title": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "title", + "value" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "performanceScore": { + "type": "number" + } + }, + "required": [ + "performanceScore", + "metrics", + "fetchTime" + ], + "type": "object" + }, + "recommendations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "summary": { + "type": "string" + } + }, + "required": [ + "summary", + "data" + ], + "type": "object" +}
- Changed
get_security_audit2 fields changed- changed
Input schema / properties / checks / items / enumPrevious value: -[ - "https", - "mixed-content", - "csp", - "hsts", - "vulnerabilities" -]New value: +[ + "https", + "csp", + "hsts", + "origin-isolation", + "clickjacking", + "trusted-types", + "third-party-cookies", + "deprecations" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "auditCount": { + "type": "number" + }, + "audits": { + "items": { + "additionalProperties": false, + "properties": { + "description": { + "type": "string" + }, + "displayValue": { + "type": "string" + }, + "id": { + "type": "string" + }, + "score": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "pass", + "fail", + "warning" + ], + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "id", + "title", + "description", + "score", + "displayValue", + "status" + ], + "type": "object" + }, + "type": "array" + }, + "failedAudits": { + "type": "number" + }, + "fetchTime": { + "type": "string" + }, + "overallScore": { + "type": "number" + }, + "passedAudits": { + "type": "number" + } + }, + "required": [ + "overallScore", + "audits", + "auditCount", + "passedAudits", + "failedAudits", + "fetchTime" + ], + "type": "object" + }, + "recommendations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "summary": { + "type": "string" + } + }, + "required": [ + "summary", + "data" + ], + "type": "object" +}
- Changed
get_seo_analysis1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "audits": { + "items": { + "additionalProperties": false, + "properties": { + "description": { + "type": "string" + }, + "displayValue": { + "type": "string" + }, + "score": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "title": { + "type": "string" + } + }, + "required": [ + "title", + "score", + "displayValue" + ], + "type": "object" + }, + "type": "array" + }, + "fetchTime": { + "type": "string" + }, + "includeDetails": { + "type": "boolean" + }, + "seoScore": { + "type": "number" + } + }, + "required": [ + "seoScore", + "fetchTime", + "includeDetails" + ], + "type": "object" + }, + "recommendations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "summary": { + "type": "string" + } + }, + "required": [ + "summary", + "data" + ], + "type": "object" +}
- Changed
run_audit2 fields changed- changed
Input schema / properties / categories / items / enumPrevious value: -[ - "performance", - "accessibility", - "best-practices", - "seo", - "pwa" -]New value: +[ + "performance", + "accessibility", + "best-practices", + "seo", + "agentic-browsing" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "categories": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "score": { + "type": "number" + }, + "title": { + "type": "string" + } + }, + "required": [ + "title", + "score" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "fetchTime": { + "type": "string" + }, + "metrics": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "score": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "title": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "title", + "value" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "version": { + "type": "string" + } + }, + "required": [ + "categories", + "metrics", + "version", + "fetchTime" + ], + "type": "object" + }, + "recommendations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "summary": { + "type": "string" + } + }, + "required": [ + "summary", + "data" + ], + "type": "object" +}
12 tool updates
v1.0.26- Added
analyze_resources - Added
check_performance_budget - Added
check_pwa_readiness - Added
compare_mobile_desktop - Added
find_unused_javascript - Added
get_accessibility_score - Added
get_core_web_vitals - Added
get_lcp_opportunities - Added
get_performance_score - Added
get_security_audit - Added
get_seo_analysis - Added
run_audit
TDQS
Scored across 11 tools
There is significant overlap between run_audit and the specific getter tools (accessibility, SEO, performance), as run_audit likely encompasses all of those. Additionally, get_lcp_opportunities, find_unused_javascript, and analyze_resources all target performance optimization with unclear boundaries.
Most tools follow a clear verb_noun pattern (e.g., get_*, run_audit, compare_mobile_desktop, check_performance_budget). Minor deviations include run_audit vs. get_security_audit (both use 'audit' but different verbs) and find_unused_javascript/analyze_resources not using 'get_' prefix, but the overall convention is consistent.
With 11 tools, the set is well-scoped for a website auditing server. Each tool covers a distinct aspect of Lighthouse auditing (performance, SEO, accessibility, security, resources), and the count is within the ideal 3-15 range without feeling bloated.
The tool surface covers major Lighthouse categories (performance, accessibility, SEO, security, Core Web Vitals, resources) and includes useful extras like budget checks and mobile/desktop comparison. However, it lacks explicit best practices and PWA audits, which are standard Lighthouse categories, creating minor gaps.
Maintenance
Related MCP Connectors
MCP server for building and testing AI agents with multi-model experimentation and insights.
- RampifyOAuthdev.rampify
SEO MCP server: crawl your site, find AI-visibility gaps, and ship the fix from your coding agent.
Website QA for your coding agent: audit SEO, performance, security, accessibility over MCP.
Your agent needs to crawl a site and say what is wrong with it — broken tags, duplicate content, pages nothing can index, resources that never load. **What you can ask for** • "Crawl this site and list every page with a duplicate title or missing description." • "Which pages are non-indexable, and why?" • "Run Lighthouse on these URLs and give me the failing audits." • "Show the internal link graph and the orphan pages." • "Give me this page's raw HTML and its microdata." **How to use it** Point any MCP client at https://mcp.aisa.one/seo-onpage/mcp and sign in with OAuth — there is no key to create or paste. 20 tools: submit a crawl and read its summary, pages, resources, links and waterfall; duplicate content and duplicate tags; keyword density; non-indexable and uncrawlable resources; parsed content, raw HTML, microdata, screenshots and Lighthouse. **Why this rather than the source** A crawler you drive from the agent, with the audit results as structured data rather than a PDF. **It is also a door to the rest** The same login reaches 26 sources and 580+ operations. Find the broken pages here, then ask the same agent what those pages used to rank for — without adding a second server. **What it costs** Finding and inspecting an operation is free. Running one is billed per call at API prices, with no seat and no monthly minimum, and every call takes max_price_usd so an agent cannot overspend by accident. **Where else it reaches** https://mcp.aisa.one/seo/mcp for all of it at once — rankings, keywords, backlinks, site health and AI-answer visibility across DataForSEO, Semrush and Ahrefs.
Related MCP Servers
- AlicenseAqualityDmaintenanceA comprehensive MCP server providing 15 web tools including search, scraping, screenshots, SEO audits, and DNS/SSL checks through a single installation. It delivers clean, LLM-optimized outputs so AI agents can focus on reasoning rather than parsing raw HTML.1517 npmMIT
- AlicenseAqualityDmaintenanceEnables AI agents to perform comprehensive SEO audits on web pages, including meta tags, headings, links, images, performance, and more, via a CLI or MCP server.181MIT
- AlicenseNot gradedqualityDmaintenanceA comprehensive MCP server for SEO, performance, GEO, and UX audits with 37 tools covering technical SEO, Lighthouse performance, AI search optimization, content analysis, accessibility, security, and more.1MIT
- FlicenseAqualityDmaintenanceAn MCP server that audits websites for accessibility (WCAG 2.1 AA/EAA), performance, SEO, design quality, and mobile responsiveness, providing actionable scores, grades, and prioritized fixes.6-