competlab-agent-adoption — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited competlab-agent-adoption (Agent Skill) and scored it 45/100 (orange). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 1 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.
*.sig, SIGNATURES) outside the documentation.Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
You measure first-party AI-agent infrastructure for each monitored competitor: MCP server, agent endpoints, Claude Skills, agent toolkit. This skill is a thin wrapper around CompetLab's existing platform scan + a value-add verification pass.
The platform's start_agent_adoption_scan(domain) runs 25 checks across 4 categories per the open Agent-Adoption Specification:
The platform handles the breadth probing. This skill should NOT reinvent that.
PATTERN-url-verification.md § MCP-server-claim verification.check_ai_crawlers for related-but-distinct signal (how the vendor's robots.txt + meta tags treat AI bots — GPTBot, ClaudeBot, Google-Extended, PerplexityBot)list_projects → confirm project context
list_competitors → get monitored domain listFor each monitored competitor domain:
mcp__competlab__start_agent_adoption_scan(domain) → scanIdOptionally also start ai-crawler scan for richer context (related but distinct):
mcp__competlab__check_ai_crawlers(domain, industry: "saas-tech" | "other") → per-bot verdictmcp__competlab__get_agent_adoption_scan(scanId) → status / resultsContinue until status === "completed". Collect the 25-check report per competitor.
The platform's "agent endpoints" check category will surface any declared MCP URLs (e.g., from /.well-known/mcp discovery, sitemap detection, or content-readability cues like links to a documented MCP server). Collect these URLs per competitor.
Categorical-zero — CHECK DISCOVERY-VS-CAPABILITY FIRST (banked from real-world validation):
If the platform's well-known-path scan returns ZERO MCP Server Cards across ALL competitors, DO NOT immediately skip Steps 5-6. Per PATTERN-url-verification.md § Categorical-zero case, the absence is on DISCOVERY surface only — capability may still exist via alternative channels. Check FIRST:
*/mcp-server/*, */mcp/*, */developers/ai/*, */agent-toolkit/*?@{vendor}/mcp-server, {vendor}-mcp, mcp-{vendor} packages?{vendor}-mcp or mcp-{vendor} repos?If ANY vendor has alt-channel signal → proceed to Steps 5-6 to probe their api.{domain}/v1/mcp, mcp.{domain} etc. via JSON-RPC POST. Real MCP servers often live at API endpoints without /.well-known/mcp mount.
Only after the alt-channel check returns genuinely ZERO signal everywhere → skip Steps 5-6 and record finding as: "Categorical zero MCP adoption in [category]. No JSON-RPC verification needed. First-mover whitespace open."
This is itself the strategic signal — surface in output as "first-mover whitespace" recommendation. Skip to Step 7 (synthesis).
Empirical basis: in a real-world validation run, the well-known-path scan returned 0 MCP Server Cards across 8 vendors (categorical-zero on discovery). One vendor's content dashboard surfaced a documentation page URL pattern. Probing the corresponding api.{vendor}.com/v1/mcp endpoint via JSON-RPC POST returned a JSON-RPC error response (HTTP 401, "Authorization required") — REAL MCP server, auth-gated, not discoverable via well-known path. Without this check, the briefing would have shipped a false categorical-zero claim AND missed the canonical convergence paragraph competitor finding.
This is non-negotiable. Browser GET 200 does NOT prove MCP exists — the URL could be a placeholder, parking page, or real MCP returning HTML to non-protocol clients.
For each candidate MCP URL, use Bash:
curl -sS -X POST "<candidate-url>" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
--max-time 15 \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"competlab-verify","version":"1.0"}}}'Interpret per PATTERN-url-verification.md § Step M2:
| Response | Verdict |
|---|---|
200 + JSON body with "jsonrpc":"2.0" + "result" | REAL MCP server (no-auth) |
401/403 + JSON-RPC error body (e.g., "Authorization required", code -32xxx) | REAL MCP server (auth-gated) |
| 404 + HTML "Cannot POST /" | NOT MCP (Express server, no MCP routing) |
| 403 + CDN error ("method not allowed" / "cacheable only") | NOT MCP (CDN config prohibits POST) |
| 405 Method Not Allowed | INCONCLUSIVE — flag for manual review |
| Network error / timeout | URL doesn't actually serve — drop |
curl -sS -X POST "<verified-mcp-url>" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'If auth-gated, the response will say "Authorization required" — that's fine; use mcp__competlab__fetch_url (cleanHtml:true) to read the documentation page (typically at /developers/.../mcp-server/ or mcp.{domain}/docs) and extract the tool list.
Per vendor (informed by both the platform's 25-check scan + your JSON-RPC verification):
Cross-vendor:
# Agent Adoption — [Category / Project]
> Generated [date] | Source: CompetLab platform 25-check Agent-Adoption Scan + JSON-RPC POST MCP verification
## Summary
[X of N vendors have JSON-RPC-verified MCP servers; trajectory context]
## Per-competitor
### [Competitor Name]
- **Agent-Adoption Score (platform):** [N/100, breakdown by 4 categories]
- **MCP server:** [REAL — URL + tools + auth] / [NOT — verification reason] / [NOT TESTED — no candidate URL detected]
- **AI crawler access:** [GPTBot allowed/blocked, ClaudeBot allowed/blocked, etc.]
- **Other agent surfaces:** [Claude Skills, agent-toolkit repos, etc. from platform scan]
- **Verdict:** [Production / Beta / Reserved / None]
## Cross-competitor patterns
[Adoption ranking, strategic gap, first-mover identification]
## Verification methodology note
[Platform's 25-check scan was Stage 1; JSON-RPC POST verification was Stage 2 value-add]llms.txt is an AI-CRAWLER preference declaration (similar to robots.txt for LLMs), NOT an agent endpoint. Different concept. If /llms.txt is interesting for the briefing, it belongs in the AI-crawler readiness signal via check_ai_crawlers, not agent-adoption.Internal validation runs demonstrated this skill's methodology against real vendor URLs:
{domain}/developers/ai/mcp-server/; JSON-RPC POST initialize against the actual API endpoint api.{domain}/v1/mcp returned {"jsonrpc":"2.0","error":{"code":-32000,"message":"Authorization required"}} (HTTP 401) — JSON-RPC error body proves the server speaks the protocol.mcp.{domain} subdomain (GET returned 200 + "Domain not found" HTML); JSON-RPC POST returned 404 + "Cannot POST /" (Express error) → NOT MCP.developers.{domain}/mcp URL (GET returned 200 + empty HTML); JSON-RPC POST returned 403 + CloudFront "method not allowed" → NOT MCP (CDN-fronted cache-only path).Without the JSON-RPC verification step, 2 of 3 MCP claims would have shipped to customer briefings as false positives. The skill's value-add is real.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.