Compuute MCP Security Scanner
Scan any public GitHub MCP-server repo for security issues. 37 MCP-specific L1 rules, 8 languages.
Open source Repository Open in the app JSON README (API)
About
Scan any public GitHub MCP-server repo for security issues. 37 MCP-specific L1 rules, 8 languages.
Details
- Kind
- MCP servers
- Topic
- Security & identity
- Publisher
- compuute
- Origin
- official
- Category
- ferramentas
- Transport
- http
- Version
- 0.3.0
- Last push
- 2026-08-25T21:57:30Z
- Repository state
- ativo
- Language
- Python
- License
- MIT
- Added
- 2026-08-29 03:01:48
- Updated
- 2026-08-29 03:01:48
- Origin id
io.github.Compuute/compuute-scan-api
README
# compuute-scan-api
**Scan-as-a-Service for MCP servers.** HTTP + MCP wrapper around [compuute-scan](https://github.com/Compuute/compuute-scan) — the MCP-specific static security scanner. Designed for agent-callable consumption.
POST a public GitHub repo URL → get a structured security report scored against 38 MCP-specific rules across 8 languages (TS/JS, Python, Go, Rust, C#, Java, Kotlin).
> **Honesty note (read first):** compuute-scan is a **pattern-breadth detector**, not an exploitability oracle. Historic false-positive rate after manual validation is **~90% on raw output** (verified against [modelcontextprotocol/servers](https://github.com/modelcontextprotocol/servers): 138 raw findings → 13 confirmed). Every response carries a `_disclaimer` field stating this explicitly. Use findings as a triage queue, not as a list of confirmed vulnerabilities. See [docs/FP-RATES.md](docs/FP-RATES.md) for per-rule transparency.
Live at <https://scan.compuute.se>. Service version reported by `/v1/health`.
---
## Endpoints
### Core scan
| Method | Path | Purpose | Auth |
|--------|------|---------|------|
| POST | `/v1/scan` | Scan a public GitHub MCP-server repo (free tier, rate-limited) | none |
| POST | `/v1/scan/pay` | Same as above via [x402](https://www.x402.org/) micropayment ($0.10 USDC on Base L2) | `X-Payment` header |
POST `/v1/scan/pay` with no body to read the payment requirements without paying — the request body is optional precisely so discovery probes reach the 402 instead of body validation. Verify with the Coinbase Agentic Wallet CLI:
```bash
npx awal x402 details https://scan.compuute.se/v1/scan/pay
```
| GET | `/v1/scan/info` | Scanner version + limits + supported ecosystems | none |
| GET | `/v1/health` | Liveness + scanner-binary availability | none |
### Machine-readable contracts
| Method | Path | Purpose |
|--------|------|---------|
| GET | `/openapi.json` | OpenAPI v3 spec with per-field descriptions |
| GET | `/docs` | Swagger UI for the OpenAPI spec |
### MCP server (live)
| Endpoint | Tool | Transport |
|----------|------|-----------|
| `/mcp/` | `scan_mcp_server(github_url)` | Streamable HTTP |
Install in Claude Code: `claude mcp add compuute-scan --transport http --url https://scan.compuute.se/mcp/`
### Discovery (`/.well-known/`)
| Path | Format | Consumer |
|------|--------|----------|
| `/.well-known/agent-card.json` | A2A v1.0 Agent Card (canonical) | A2A protocol clients |
| `/.well-known/agent.json` | A2A Agent Card (alias) | pre-1.0 A2A clients/crawlers |
| `/.well-known/ai-plugin.json` | OpenAI plugin manifest | ChatGPT / OpenAI tools |
| `/.well-known/x402.json` | x402 payment manifest | Coinbase Agent.market crawlers, x402 aggregators |
| `/.well-known/x402` | Alias of `x402.json` | x402 probes without `.json` suffix |
| `/llms.txt` | markdown summary | LLM-driven agent-search crawlers (Exa, Perplexity-style) per [llmstxt.org](https://llmstxt.org) |
| `/robots.txt` | crawler policy | search engines |
| `/sitemap.xml` | URL index | search engines |
### Example
```bash
curl -X POST https://scan.compuute.se/v1/scan \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: 00000000-0000-0000-0000-000000000001' \
-d '{"repo_url": "https://github.com/modelcontextprotocol/servers"}'
```
Response (truncated):
```json
{
"repo_url": "https://github.com/modelcontextprotocol/servers",
"scanner": {"name": "compuute-scan", "version": "0.6.2", "layers_covered": ["L0", "L1"]},
"summary": {"critical": 1, "high": 94, "medium": 22, "low": 0, "files_scanned": 77},
"score": 0,
"recommendation": "AVOID — 1 critical and 94 high finding(s)...",
"top_findings": [...],
"performance": {"clone_seconds": 1.2, "scan_seconds": 0.5, "repo_size_bytes": 41234},
"_disclaimer": "PATTERN MATCH — compuute-scan is a static analyzer..."
}
```
## Agent-shaped API features
| Feature | How |
|---------|-----|
| Idempotent retries (24h cache) | `Idempotency-Key` header |
| HTTP cache | `ETag` + `Cache-Control: public, max-age=1800` |
| Conditional GET | `If-None-Match` → 304 Not Modified |
| Rate-limit headers | `X-RateLimit-Limit/Remaining/Reset` |
| Strict input validation | Pydantic `extra="forbid"`, GitHub-HTTPS-only |
| OWASP security headers | HSTS / X-Frame-Options / X-Content-Type-Options / CSP / Referrer-Policy / Permissions-Policy |
| OpenAPI for discovery | `GET /openapi.json` with descriptions on every field |
| MCP for agent discovery | `/mcp/` exposes `scan_mcp_server` tool |
| x402 for autonomous purchase | `/v1/scan/pay` returns 402 with USDC/Base payment requirements |
| Honest framing | Every response carries `_disclaimer` — pattern match, not exploitability claim |
## Pricing
| Tier | Audience | Price |
|------|----------|-------|
| Open Source CLI | Indie devs, agent builders | $0 — `npx compuute-scan ./repo` |
| Hosted API (free) | Agent operators evaluating MCP servers | $0 — `POST /v1/scan`, rate-limited |
| Hosted API (x402) | Autonomous agents in Agent.market ecosystem | $0.10 USDC/scan — `POST /v1/scan/pay` |
| MCP Security Audit | Enterprises shipping MCP to production | $5K–$30K SoW |
| AI Procurement Risk Audit | CFO/CTO/CISO buying enterprise AI capacity | $5K–$15K SoW |
Full breakdown with JSON-LD: <https://compuute.se/pricing>.
## Local development
```bash
python3 -m venv venv && source venv/bin/activate
pip install -r requirements.txt
export COMPUUTE_SCAN_PATH=$HOME/compuute-scan/compuute-scan.js
uvicorn main:app --reload
```
x402 payment env vars (all optional locally; `/v1/scan/pay` returns 503 until the wallet is set):
| Var | Purpose | Default |
|-----|---------|---------|
| `X402_WALLET_ADDRESS` | Base L2 address receiving USDC | unset (x402 disabled) |
| `X402_NETWORK` | CAIP-2 network id — `eip155:8453` (Base mainnet) or `eip155:84532` (Base Sepolia) | `eip155:8453` |
| `X402_PRICE_USD` | Price per scan | `0.10` |
| `X402_FACILITATOR_URL` | Facilitator base URL | CDP facilitator (serves both networks) |
| `CDP_API_KEY_ID` / `CDP_API_KEY_SECRET` | CDP API key for facilitator verify/settle auth | unset (verify will be rejected) |
### Rehearsing payments on testnet
Set `X402_NETWORK=eip155:84532` to quote prices in Base Sepolia USDC, which is
free from a faucet. The CDP facilitator serves Sepolia too, so a testnet
payment exercises the real verify/settle path and your real CDP API keys —
without moving real money.
Asset address and EIP-712 domain are selected together per network: Base
mainnet USDC signs as `"USD Coin"`, Base Sepolia as `"USDC"`. Mixing them
fails every signature with an error that looks like a bad API key, which is
why they live in one `NETWORKS` table rather than separate env vars.
Mainnet is the default and an unknown value falls back to it, so a typo can
never silently ask real agents to pay in worthless testnet USDC. Check which
mode is live with `curl -s https://scan.compuute.se/v1/health` — the `x402`
block reports `network` and `testnet`.
## Tests
```bash
pytest tests/ -v
# 34 tests covering scan, x402, MCP, discovery, OpenAPI
```
## Scripts
| Script | What it does |
|--------|-------------|
| `scripts/precheck.sh` | Start-of-session check: branch, working tree, tests, live state, next backlog item |
| `scripts/postcheck.sh` | End-of-session check: committer hygiene, tests, append to `docs/PROGRESS.md` |
| `scripts/status.sh` | 30-second live-state check against scan.compuute.se (4 probes) |
| `scripts/sbom.sh` | Generate CycloneDX SBOM, optionally upload to a GitHub Release |
| `scripts/prospect-research.sh` | Pull qualified prospects from GitHub + Anthropic Registry, draft DM angles |
| `scripts/measure-tiers.sh` | T0/T1/T2 distribution snapshot per [docs/agent-economy-strategy.md](docs/agent-economy-strategy.md) §5 — reach, engagement, conversion measured against Railway logs + Base RPC + GitHub stars |
## Architecture
- `api/services/scan.py` — clone + sandbox + scan + parse. Pure functions.
- `api/services/x402_service.py` — x402 v2 verify / settle on the official `x402` SDK; CDP facilitator (Base mainnet) by default; Bazaar discovery extension in 402 bodies.
- `api/services/cdp_auth.py` — minimal CDP API-key JWT auth for the facilitator (PyJWT + cryptography; avoids the full cdp-sdk).
- `api/serializers/scan_serializer.py` — Pydantic models, strict validation.
- `api/routes/scan.py` — HTTP layer for `/v1/scan`: idempotency, cache, ETag.
- `api/routes/scan_x402.py` — HTTP layer for `/v1/scan/pay`.
- `api/routes/discovery.py` — `/.well-known/*`, `/robots.txt`, `/sitemap.xml`.
- `api/mcp_server.py` — FastMCP server exposing `scan_mcp_server`.
- `main.py` — FastAPI wiring + middleware (security headers, CORS).
Bundled compuute-scan version is pinned in the Dockerfile (`ARG COMPUUTE_SCAN_REF=v0.6.2`).
## Documentation
| Doc | For |
|-----|-----|
| [docs/agent-economy-strategy.md](docs/agent-economy-strategy.md) | The strategic doc — a16z-verified data, the 11-signal buyer-agent model, two-track strategy, 30-day pivot trigger. Read first if you're trying to understand the company. |
| [docs/STRATEGY.md](docs/STRATEGY.md) | Position, pricing tiers, roadmap, decision log |
| [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) | Component diagram, request flow, threat model, deployment topology |
| [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) | Local setup, layout, code style, common pitfalls — onboard a new dev in 30 min |
| [docs/MONITORING.md](docs/MONITORING.md) | Endpoints to watch, automated checks, runbook for failures |
| [docs/FP-RATES.md](docs/FP-RATES.md) | Per-rule false-positive transparency |
| [docs/scan-self-triage.md](docs/scan-self-triage.md) | What this scanner reports when run against its own code |
| [docs/whitepaper/](docs/whitepaper/) | MCP Security Methodology v1.0 (Markdown + PDF) |
| [docs/case-studies/](docs/case-studies/) | Three anonymized engagement reports from the May 2026 batch |
| [docs/advisories/](docs/advisories/) | Public advisories under the `COMPUUTE-YYYY-NNN` numbering |
| [docs/security/](docs/security/) | Self-pentest reports (90-day cadence) |
| [docs/audits/](docs/audits/) | The AI Procurement Risk Audit checklist (lead magnet) |
| [docs/compliance/](docs/compliance/) | SOC 2 Type I readiness statement, TSC control mapping |
| [docs/submissions/](docs/submissions/) | LangChain + CrewAI tool wrappers ready for PR/marketplace |
| [skills/compuute-scan/](skills/compuute-scan/) | Claude Skill package (SKILL.md + scan.sh) — submitted to [anthropics/skills#1346](https://github.com/anthropics/skills/pull/1346) |
| [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) | Contributor Covenant 2.1 |
| [docs/launches/](docs/launches/) | Show HN draft + posting checklist |
| [docs/setup/](docs/setup/) | Status page (BetterStack) + analytics (PostHog) setup guides |
| [docs/agentic-market-submission.md](docs/agentic-market-submission.md) | Three paths to Coinbase Agent.market listing |
| [BACKLOG.md](BACKLOG.md) | GitHub Issues + Project board roadmap |
| [IDEAS.md](IDEAS.md) | Composted product hypotheses with gating rules |
| [CONTRIBUTING.md](CONTRIBUTING.md) | How to contribute |
| [SECURITY.md](SECURITY.md) | Vulnerability disclosure policy (90-day window) |
## Security
Found a vulnerability? See [SECURITY.md](SECURITY.md) — email `security@compuute.se`. We follow a 90-day coordinated disclosure window.
## License
MIT (matches compuute-scan).
## Author
Compuute AB — `daniel@compuute.se`