MCP Watch ð
ããŒã«ã«MCP Watch ð ã«ã€ããŠ
MCP Watch ã¯ãMCP ãµãŒããŒå®è£ ã®ã»ãã¥ãªãã£ãæ€æ»ããã¹ãã£ããŒã§ããGitHub ãªããžããªãããŒã«ã«ãããžã§ã¯ãã察象ã«ãèªèšŒæ å ±ã®æŒãããããŒã«ãã€ãºãã³ã°ãããã³ããã€ã³ãžã§ã¯ã·ã§ã³ãªã©ãæ€åºããŸããéçºè ãã»ãã¥ãªãã£æ åœè ãå ¬éåã«ç¢ºèªããçšéãæ³å®ããNode.js ã®ã³ãã³ãã©ã€ã³ããŒã«ãŸã㯠Docker ã§å®è¡ã§ããŸãã
äž»ãªæ©èœ
- 01èªèšŒæ å ±ã®æŒãããšå®å šã§ãªãä¿åã®æ€åº
- 02ããŒã«ãã€ãºãã³ã°ãšé ãããæç€ºã®æ€åº
- 03ãã©ã¡ãŒã¿ããã³ããã³ããã€ã³ãžã§ã¯ã·ã§ã³ã®æ€æ»
- 04ããŒã«ã®å€æŽãš rug-pull ãªã¹ã¯ã®æ€åº
- 05ã³ãã³ãã€ã³ãžã§ã¯ã·ã§ã³ãSSRFããã¹ãã©ããŒãµã«ã®æ€æ»
- 06console ãš json ã®åºåãé倧床ã«ãããã£ã«ã¿ãªã³ã°
掻çšã·ãŒã³
- 01GitHub äžã® MCP ãµãŒããŒãªããžããªã®ã¹ãã£ã³
- 02å ¬éåã®ããŒã«ã« MCP ãããžã§ã¯ãã®ç¢ºèª
- 03é倧床ã®é«ãæ€åºçµæã«åºã¥ã CI ãã«ãã®å€±æ
MCP 察å¿
æ¬ãããžã§ã¯ã㯠MCP ãµãŒããŒå®è£ ã®ã»ãã¥ãªãã£åé¡ãåæãããã®ã§ãããããèªäœã¯ MCP ãµãŒããŒãã¯ã©ã€ã¢ã³ããšããŠåäœããŸããã
èšå®
ããŒã«ã«ãµãŒããŒã®èšå®ã¯ã©ã®ã¯ã©ã€ã¢ã³ãã§ãå ±éã§ããã³ããŒããŠã¯ã©ã€ã¢ã³ãã® MCP èšå®ãã¡ã€ã«ã«è²Œãä»ããŠãã ããã
ãã®ãµãŒããŒã®ããã±ãŒãžããªã¢ãŒããšã³ããã€ã³ãã¯ãŸã ååŸã§ããŠããŸããããããžã§ã¯ãã® README ã®æé ã«åŸã£ãŠãã ããã
ããŒã«
ããŒã«ã«ãµãŒããŒã®ããŒã«ã¯ãã·ã³äžã§èµ·åããŠåããŠååŸã§ããŸããã¡ã³ãããŒã¯ãŸã ããŒã«äžèЧãæäŸããŠããŸããã
詳现
MCP Watch ð
MCP ã®å®è£ ã«ãããè匱æ§ãã»ãã¥ãªãã£äžã®åé¡ãæ€åºãããModel Context ProtocolïŒMCPïŒãµãŒããŒåãã®å æ¬çãªã»ãã¥ãªãã£ã¹ãã£ããŒã§ãã
æ©èœ
- ð èªèšŒæ å ±ã®æ€åº - ããŒãã³ãŒãããã API ããŒãããŒã¯ã³ãå®å šã§ãªãèªèšŒæ å ±ã®ä¿åãæ€åºããŸã
- 𧪠ããŒã«ãã€ãºãã³ã° - ããŒã«ã®èª¬æã«é ãããæªæã®ããæç€ºãæ€åºããŸã
- ð¯ ãã©ã¡ãŒã¿ãŒã€ã³ãžã§ã¯ã·ã§ã³ - æ©å¯æ§ã®é«ã AI ã³ã³ããã¹ããæœåºããããžãã¯ãã©ã¡ãŒã¿ãŒãç¹å®ããŸã
- ð ããã³ããã€ã³ãžã§ã¯ã·ã§ã³ - ããã³ããã®æäœãã€ã³ãžã§ã¯ã·ã§ã³æ»æãã¹ãã£ã³ããŸã
- ð ããŒã«ã®å€æŽ - åçãªããŒã«ã®å€æŽãã©ã°ãã«ã®ãªã¹ã¯ãæ€åºããŸã
- ð¬ äŒè©±ã®æµåº - äŒè©±å±¥æŽãçã¿åºãããªã¬ãŒãæ€åºããŸã
- ðš ANSI ã€ã³ãžã§ã¯ã·ã§ã³ - ãšã¹ã±ãŒãã·ãŒã±ã³ã¹ã䜿ã£ãã¹ãã¬ãã°ã©ãã£ãŒæ»æãæ€åºããŸã
- ð ãããã³ã«éå - MCP ãããã³ã«ã®ã»ãã¥ãªãã£éåãç¹å®ããŸã
- ð¡ïž å ¥åæ€èšŒ - ã³ãã³ãã€ã³ãžã§ã¯ã·ã§ã³ãSSRFããã¹ãã©ããŒãµã«ã®åé¡ãæ€åºããŸã
- ð ãµãŒããŒã®åœè£ - 人æ°ãµãŒãã¹ã«ãªãããŸãããµãŒããŒãæ€åºããŸã
- ð æå®³ãªããŒã¿ãã㌠- å±éºãªããŒã¿ãããŒãã¿ãŒã³ãç¹å®ããŸã
- ð æš©éã®åé¡ - éå°ãªæš©éãã¢ã¯ã»ã¹å¶åŸ¡ã®åé¡ãæ€åºããŸã
ã¯ã€ãã¯ã¹ã¿ãŒã ð
ãªãã·ã§ã³ 1ïŒNPM ããã±ãŒãžïŒæšå¥šïŒ
# Install globally
npm install -g mcp-watch
# Scan any GitHub MCP repository
mcp-watch scan https://github.com/user/mcp-server
# Scan your local MCP project
mcp-watch scan-local /path/to/your/mcp-project
ãªãã·ã§ã³ 2ïŒGitHub ãœãŒã¹ãã
# Clone and use immediately
git clone https://github.com/kapilduraphe/mcp-watch.git
cd mcp-watch
npm install
npm run build
# Scan GitHub repos
npm run scan:github https://github.com/user/mcp-server
# Scan local projects
npm run scan:local /path/to/your/mcp-project
ãªãã·ã§ã³ 3ïŒDockerïŒã€ã³ã¹ããŒã«äžèŠïŒ
# Scan without installing anything
docker run --rm mcp-watch scan https://github.com/user/mcp-server
docker run --rm -v $(pwd):/workspace mcp-watch scan-local /workspace
ã€ã³ã¹ããŒã«
ã°ããŒãã«ã€ã³ã¹ããŒã«
npm install -g mcp-watch
ããŒã«ã«ã€ã³ã¹ããŒã«
npm install mcp-watch
ãœãŒã¹ãã
git clone https://github.com/kapilduraphe/mcp-watch.git
cd mcp-watch
npm install
npm run build
Docker ã®ã€ã³ã¹ããŒã« ð³
Docker ã§ã¯ã€ãã¯ã¹ã¿ãŒã
# Build and run locally
docker build -t mcp-watch .
docker run --rm mcp-watch scan https://github.com/user/mcp-server
# Build from source
git clone https://github.com/kapilduraphe/mcp-watch.git
cd mcp-watch
docker build -t mcp-watch .
Docker ComposeïŒæ¬çªç°å¢ã«æšå¥šïŒ
# Build and run with Docker Compose
docker compose build
docker compose up mcp-watch
# Or run a one-off scan
docker compose run --rm mcp-watch scan https://github.com/user/repo
Docker ã®æ©èœ
- ð ã»ãã¥ãªãã£ïŒé root ãŠãŒã¶ãŒãæå°éã®æ»æå¯Ÿè±¡é å
- ðŠ æé©åïŒãã«ãã¹ããŒãžãã«ããAlpine Linux ããŒã¹
- ð æ¬çªç°å¢å¯Ÿå¿ïŒãããã€ãš CI/CD ã«å¯Ÿå¿
- ð§¹ ã·ã³ãã«ïŒããããçšéã«å¯Ÿå¿ãããæé©åãããåäžã® Dockerfile
äœ¿çšæ¹æ³
ã³ãã³ãã©ã€ã³
GitHub ãªããžããªãã¹ãã£ã³
# Scan a GitHub repository
mcp-watch scan https://github.com/user/mcp-server
# Scan with JSON output
mcp-watch scan https://github.com/user/mcp-server --format json
# Filter by severity
mcp-watch scan https://github.com/user/mcp-server --severity high
# Filter by category
mcp-watch scan https://github.com/user/mcp-server --category credential-leak
ããŒã«ã«ãããžã§ã¯ããã¹ãã£ã³
# Scan current directory
mcp-watch scan-local .
# Scan specific directory (absolute path)
mcp-watch scan-local /path/to/your/mcp-project
# Scan specific directory (relative path)
mcp-watch scan-local ../my-mcp-server
# Local scan with JSON output
mcp-watch scan-local . --format json
# Local scan with severity filter
mcp-watch scan-local . --severity high
ã€ã³ã¹ããŒã«æ¹æ³å¥ã®äœ¿ç𿹿³
NPM ããã±ãŒãžãã
# Global installation (recommended)
npm install -g mcp-watch
mcp-watch scan https://github.com/user/mcp-server
mcp-watch scan-local /path/to/project
GitHub ãœãŒã¹ãã
# Clone and build
git clone https://github.com/kapilduraphe/mcp-watch.git
cd mcp-watch
npm install
npm run build
# Use built version
node dist/main.js scan https://github.com/user/mcp-server
node dist/main.js scan-local /path/to/project
# Or use npm scripts
npm run scan https://github.com/user/mcp-server
npm run scan-local /path/to/project
Docker ã®äœ¿ç𿹿³ ð³
# Production container
docker run --rm mcp-watch scan https://github.com/user/mcp-server
docker run --rm mcp-watch scan https://github.com/user/mcp-server --format json --severity high
# Docker Compose
docker compose run --rm mcp-watch scan https://github.com/user/repo
docker compose run --rm mcp-watch scan https://github.com/user/repo --format json
# Interactive container
docker run -it --rm mcp-watch sh
ãªãã·ã§ã³
--format <type>- åºå圢åŒïŒconsoleïŒããã©ã«ãïŒãŸãã¯json--severity <level>- æå°é倧床ïŒlowãmediumãhighãcritical--category <cat>- è匱æ§ã«ããŽãªã§ãã£ã«ã¿ãŒ
ã«ããŽãª
credential-leak- ããŒãã³ãŒããããèªèšŒæ å ±ãšå®å šã§ãªãä¿åtool-poisoning- æªæã®ããããŒã«ã®èª¬ædata-exfiltration- ããŒã¿çªåãšãã©ã¡ãŒã¿ãŒã€ã³ãžã§ã¯ã·ã§ã³prompt-injection- ããã³ããæäœæ»ætool-mutation- åçãªããŒã«ã®å€æŽsteganographic-attack- ãšã¹ã±ãŒãã·ãŒã±ã³ã¹ã«é ãããã³ã³ãã³ãprotocol-violation- MCP ãããã³ã«ã®ã»ãã¥ãªãã£äžã®åé¡input-validation- ã³ãã³ãã€ã³ãžã§ã¯ã·ã§ã³ãSSRFããã¹ãã©ããŒãµã«server-spoofing- ãµãŒããŒã®åœè£toxic-flow- å±éºãªããŒã¿ãããŒaccess-control- æš©éãšã¢ã¯ã»ã¹ã®åé¡
åºåäŸ
ð Scanning repository: https://github.com/user/mcp-server
ð Based on vulnerablemcp.info, HiddenLayer, Invariant Labs, and Trail of Bits research
ð Scanning for credential vulnerabilities...
𧪠Scanning for tool poisoning vulnerabilities...
ð¯ Scanning for parameter injection vulnerabilities...
ð Scanning for prompt injection vulnerabilities...
ð MCP SECURITY SCAN RESULTS
===============================
ð Summary by Severity:
ðš CRITICAL: 2
â ïž HIGH: 1
â¡ MEDIUM: 3
ð Detailed Results:
--------------------
1. ðš Hardcoded credentials detected
ð ID: HARDCODED_CREDENTIALS
ð¯ Severity: CRITICAL
ð Category: credential-leak
ð Location: src/config.ts:15
ð Evidence: const apiKey = "sk-***REDACTED***"
éçº
ãããžã§ã¯ãæ§æ
mcp-watch/
âââ main.ts # CLI entry point
âââ types/
â âââ Vulnerability.ts # Type definitions
âââ scanner/
â âââ MCPScanner.ts # Main scanner orchestrator
â âââ BaseScanner.ts # Base scanner utilities
â âââ scanners/ # Individual vulnerability scanners
â âââ CredentialScanner.ts
â âââ ParameterInjectionScanner.ts
â âââ ...
âââ utils/
â âââ reportFormatter.ts # Report formatting
âââ Docker/ # Containerization
âââ Dockerfile # Production image
âââ docker-compose.yml # Multi-service orchestration (Docker Compose v2)
âââ .dockerignore # Build optimization
éçºçšã¹ã¯ãªãã
# Build the project
npm run build
# Run in development mode
npm run dev scan https://github.com/user/repo
# Quick scan during development
npm run scan https://github.com/user/repo
# Clean build artifacts
npm run clean
# Type checking
npm run type-check
éçºã¯ãŒã¯ãã㌠ð
ããŒã«ã«éçºïŒæšå¥šïŒ
# Install dependencies
npm install
# Run development server
npm run dev
# Run scans during development
npm run scan https://github.com/user/repo
# Type checking
npm run type-check
Docker éçº ð³
# Build Docker image
docker compose build
# Test the image
docker run --rm mcp-watch scan https://github.com/user/repo
# Test Docker Compose
docker compose run --rm mcp-watch scan --help
æ°ããã¹ãã£ããŒã®è¿œå
scanner/scanners/ã«æ°ããã¹ãã£ããŒãäœæããŸãAbstractScannerãæ¡åŒµããŸãscan()ã¡ãœãããå®è£ ããŸãMCPScanner.tsã«è¿œå ããŸã
äŸïŒ
import { AbstractScanner } from "../BaseScanner";
import { Vulnerability } from "../../types/Vulnerability";
export class MyScanner extends AbstractScanner {
async scan(projectPath: string): Promise<Vulnerability[]> {
console.log("ð Scanning for my vulnerability type...");
const vulnerabilities: Vulnerability[] = [];
// Your scanning logic here
return vulnerabilities;
}
}
ã»ãã¥ãªãã£ç ç©¶
ãã®ããŒã«ã¯ãAI ãšãµã€ããŒã»ãã¥ãªãã£åéããªãŒãããçµç¹ã®ã»ãã¥ãªãã£ç ç©¶ã«åºã¥ããŠãããMCP ç°å¢ã«ç¹æã®æ°ããªæ»æãã¯ãã«ãç¹å®ããŸãããã®å 容ã¯ä»¥äžã®ãšããã§ãã
- æ©å¯æ§ã®é«ã AI ã³ã³ããã¹ããæœåºãããã©ã¡ãŒã¿ãŒã€ã³ãžã§ã¯ã·ã§ã³æ»æ
- é ãããæªæã®ããæç€ºã䜿ã£ãããŒã«ãã€ãºãã³ã°
- ããªã¬ãŒãã¬ãŒãºã䜿ã£ãäŒè©±ã®æµåº
- ANSI ãšã¹ã±ãŒãã·ãŒã±ã³ã¹ãä»ããã¹ãã¬ãã°ã©ãã£ãŒæ»æ
- ãªããžããªã®å¢çãè¶ããæå®³ãªãšãŒãžã§ã³ããããŒ
調æ»è³æ
-
VulnerableMCP Database (vulnerablemcp.info)
- MCP ã®è匱æ§ãç¶²çŸ ããããŒã¿ããŒã¹
- å®éã®æ»æãã¿ãŒã³ãšäºäŸ
- æ°ããªæ»æãã¯ãã«ã«é¢ãã宿çãªæŽæ°
-
HiddenLayer Research (MCP ããŒã«ã®ãã©ã¡ãŒã¿ãŒãæªçšãã)
- æ©å¯ããŒã¿ãæœåºãããã©ã¡ãŒã¿ãŒã€ã³ãžã§ã¯ã·ã§ã³æ»æ
- ããŒã«åŒã³åºãå±¥æŽãšäŒè©±ã®çªå
- ã·ã¹ãã ããã³ããæœåºã®è匱æ§
- æèã®é£éã®æäœ
- ã¢ãã«åã®é瀺ãªã¹ã¯
-
Invariant Labs Research (GitHub MCP ã®è匱æ§)
- ããŒã«ãã€ãºãã³ã°ã®æ€åº
- æå®³ãªãšãŒãžã§ã³ããããŒ
- ãªããžããªéã®ã»ãã¥ãªãã£åé¡
- ããŒã«æ©èœã®ããŒã«ããã¯æŽæ°
- ãµãŒããŒãªãããŸãã®é²æ¢
-
Trail of Bits Research (MCP ã»ãã¥ãªãã£èª¿æ»)
- äŒè©±ã®çªåææ³
- ANSI ã€ã³ãžã§ã¯ã·ã§ã³æ»æ
- ãããã³ã«ã¬ãã«ã®è匱æ§
- å®å šã§ãªãèªèšŒæ å ±ã®ä¿åãã¿ãŒã³
- ãµãŒããŒéã®ã·ã£ããŒã€ã³ã°æ»æ
-
PromptHub Analysis (MCP ã®ã»ãã¥ãªãã£èåŒ±æ§ 5 ä»¶)
- ã³ãã³ãã€ã³ãžã§ã¯ã·ã§ã³ã®ãã¿ãŒã³ïŒå ¬éãããŠãã MCP ãµãŒããŒã® 43% ã圱é¿ãåããŸãïŒ
- SSRF ã®è匱æ§ã«é¢ããçµ±èšïŒ30% ãä»»æã® URL ã®ååŸãèš±å¯ããŠããŸãïŒ
- ãã¹ãã©ããŒãµã«æ»æãã¯ãã«ïŒ22% ãæå³ããããã£ã¬ã¯ããªã®å€éšã«ãããã¡ã€ã«ãæŒããããŸãïŒ
- Retrieval-Agent DeceptionïŒRADEïŒæ»æ
- ããŒã«ãã€ãºãã³ã°ã®é²æ¢ç
çµäºã³ãŒã
0- é倧ãŸãã¯é«æ·±å»åºŠã®è匱æ§ã¯èŠã€ãããŸããã§ãã1- é倧ãŸãã¯é«æ·±å»åºŠã®è匱æ§ãæ€åºãããŸãã1- ã¹ãã£ã³ãšã©ãŒãçºçããŸãã
è²¢ç®
- ãªããžããªããã©ãŒã¯ããŸã
- æ©èœãã©ã³ããäœæããŸã
npm run type-checkã§åãã§ãã¯ãå®è¡ããŸã- 倿Žãæåã§ãã¹ãããŸã
- ãã«ãªã¯ãšã¹ããéä¿¡ããŸã
GitHub Actions ð
ãã®ãªããžããªã§ã¯ãCI/CDãã»ãã¥ãªãã£ã¹ãã£ã³ãäŸåé¢ä¿ã®ç®¡çã«èªååãããã¯ãŒã¯ãããŒã䜿çšããŠããŸãã
- CIïŒããã·ã¥ãŸã㯠PR ããšã«èªåãã¹ããš Docker ã®æ€èšŒãå®è¡
- ã»ãã¥ãªãã£ã¹ãã£ã³ïŒæ¯æ¥ã®ã»ãã¥ãªãã£ç£æ»ãšè匱æ§ãã§ãã¯
- äŸåé¢ä¿ã®æŽæ°ïŒæ¯é±ã®äŸåé¢ä¿ã¡ã³ããã³ã¹ãšã»ãã¥ãªãã£ä¿®æ£
- ãªãªãŒã¹ïŒãªãªãŒã¹ã¢ã»ããã®èªåäœæ
- Docker ãã¹ãïŒDocker åºæã®ãã¹ããšæ€èšŒ
Dependabot ð€
以äžã䜿çšããäŸåé¢ä¿ã®èªå管çïŒ
- npmïŒæ¯é±æŽæ°ãããã€ããŒïŒãããããŒãžã§ã³ã¯èªåããŒãž
- GitHub ActionsïŒã¢ã¯ã·ã§ã³ã®èªåæŽæ°
- DockerïŒããŒã¹ã€ã¡ãŒãžã®æŽæ°
ã¯ãŒã¯ãããŒã®è©³çްã«ã€ããŠã¯ãGITHUB_ACTIONS.md ãåç §ããŠãã ããã
Docker éçºã¯ãŒã¯ãã㌠ð³
# Clone and setup
git clone https://github.com/kapilduraphe/mcp-watch.git
cd mcp-watch
# Build Docker image
docker compose build
# Test the image
docker run --rm mcp-watch --help
# Run a scan
docker compose run --rm mcp-watch scan https://github.com/user/repo
ã©ã€ã»ã³ã¹
MIT License â 詳现ã«ã€ããŠã¯ LICENSE ãã¡ã€ã«ãåç §ããŠãã ããã
ãµããŒã
- ãã°å ±åãæ©èœãªã¯ãšã¹ãã¯ãã€ã·ã¥ãŒãäœæããŠãã ãã
- æ°ããã€ã·ã¥ãŒãäœæããåã«ãæ¢åã®ã€ã·ã¥ãŒã確èªããŠãã ãã
- ã€ã·ã¥ãŒãå ±åããéã¯ãã¹ãã£ã³åºåãšãªããžããªã®è©³çްãå«ããŠãã ãã
Docker ã®ãµããŒã ð³
- ããã¥ã¡ã³ãïŒDOCKER.md ã§ Docker ã®è©³ããäœ¿çšæ¹æ³ã確èªããŠãã ãã
- ã€ã·ã¥ãŒïŒã€ã·ã¥ãŒãå ±åããéã¯ãDocker ã®ããŒãžã§ã³ãš Docker Compose ã®ããŒãžã§ã³ãå«ããŠãã ãã
- ãã¹ãïŒæ¬çªçšã³ã³ãããšéçºçšã³ã³ããã®äž¡æ¹ã§ãã¹ãããŠãã ãã
â ïž ã»ãã¥ãªãã£ã«é¢ããæ³šæïŒãã®ããŒã«ã¯æœåšçãªã»ãã¥ãªãã£åé¡ãç¹å®ããŸãããå¯äžã®ã»ãã¥ãªãã£å¯ŸçãšããŠäœ¿çšãã¹ãã§ã¯ãããŸãããå¿ ãæåã§ã»ãã¥ãªãã£ã¬ãã¥ãŒã宿œããã»ãã¥ãªãã£ã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠãã ããã
ã³ã¡ã³ã
MCP ã¯åããŠã§ããïŒ
ãããã³ã«ã®æŠèŠããæåã®ãµãŒããŒã®å°å ¥ãŸã§ãããããçåã«ãŸãšããŠçããŸãã
AI ã¢ããªã±ãŒã·ã§ã³ãå€éšã®ããŒã«ãããŒã¿ãœãŒã¹ã«çµ±äžçãªæ¹æ³ã§æ¥ç¶ããããã®ãªãŒãã³ãªãããã³ã«ã§ããã¯ã©ã€ã¢ã³ãã¯ã¢ãã«ãšã®å¯Ÿè©±ãæ ããMCP ãµãŒããŒã¯ããŒã«ã»ãªãœãŒã¹ã»ããã³ãããã³ãã¬ãŒããæäŸããŸããæšæºã¡ãã»ãŒãžã§ããåãããããã1 ã€ã®ãµãŒããŒãè€æ°ã®ã¯ã©ã€ã¢ã³ãã§åå©çšã§ããŸãã