{
  "markdown": "# @kajaril/sovereignty-scan-mcp\n\nMCP server for EU AI Act vendor sovereignty scanning. MIT-licensed free tier.\n\n[![npm](https://img.shields.io/npm/v/@kajaril/sovereignty-scan-mcp)](https://www.npmjs.com/package/@kajaril/sovereignty-scan-mcp)\n[![npm downloads](https://img.shields.io/npm/dw/@kajaril/sovereignty-scan-mcp)](https://www.npmjs.com/package/@kajaril/sovereignty-scan-mcp)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![sovereignty-scan-mcp MCP server](https://glama.ai/mcp/servers/kajaril/sovereignty-scan-mcp/badges/score.svg)](https://glama.ai/mcp/servers/kajaril/sovereignty-scan-mcp)\n\nKnow where your stack processes data before the enforcer does. Covers **55 providers across 12 categories**.\n\n## Install\n\n**1. Get a free API key**\n\n```sh\ncurl -s -X POST https://sovereignty-scan.kajaril.com/register \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"email\":\"you@example.com\"}' | jq .api_key\n```\n\nSave the returned key — it cannot be recovered.\n\n**2. Add to `claude_desktop_config.json`**\n\n```json\n{\n  \"mcpServers\": {\n    \"sovereignty-scan\": {\n      \"type\": \"http\",\n      \"url\": \"https://sovereignty-scan.kajaril.com/mcp\",\n      \"headers\": {\n        \"Authorization\": \"Bearer ks_free_YOUR_KEY\"\n      }\n    }\n  }\n}\n```\n\nRestart Claude Desktop.\n\n**Client compatibility**\n\n| Client | Status |\n|--------|--------|\n| Claude Desktop | ✓ Supported |\n| Cursor / Windsurf | ✓ Supported (HTTP MCP) |\n| claude.ai web | ✗ Not supported (no HTTP MCP) |\n\n## Quick test\n\nVerify the endpoint is live:\n\n```sh\ncurl -s https://sovereignty-scan.kajaril.com/health | jq .\n```\n\nCall a tool with your key:\n\n```sh\ncurl -s -X POST https://sovereignty-scan.kajaril.com/mcp \\\n  -H \"Authorization: Bearer ks_free_YOUR_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"scan_provider\",\"arguments\":{\"name\":\"cloudflare\"}}}' \\\n  | jq .\n```\n\n## Tools\n\n**`scan_provider`** — Full jurisdictional profile for a single vendor: headquarters country, data residency regions, EU residency option, US CLOUD Act exposure, GDPR DPA availability, and legal framework.\n- `name` — string, case-insensitive\n\nExample response:\n\n```json\n{\n  \"name\": \"Cloudflare\",\n  \"hq_country\": \"US\",\n  \"data_residency_regions\": [\"US\", \"EU\", \"APAC\"],\n  \"eu_residency_option\": true,\n  \"us_cloud_act_subject\": true,\n  \"gdpr_dpa_available\": true,\n  \"legal_framework\": \"GDPR+SCC\"\n}\n```\n\n**`scan_stack`** — Aggregate jurisdictional summary for a list of vendors: CLOUD Act exposure count, EU residency coverage, missing DPAs. Maximum 50 providers per call.\n- `providers` — string[], max 50\n\n**`list_providers`** — List all tracked providers. Optional category filter.\n- `category?` — AI · Hosting · Database · Auth · Analytics · Observability · CI/CD · Communications · Payments · Search · Sandbox · Cache\n\n**`get_us_cloud_act_providers`** — All providers subject to US CLOUD Act compelled disclosure (18 U.S.C. § 2713). No parameters.\n\n**`suggest_eu_alternatives`** — EU/EEA/UK/CH-based alternatives in the same category as a given provider. Deterministic ordering: EU/EEA first, then UK/CH. Capped at 10.\n- `provider_name` — string, case-insensitive\n\n## Pricing\n\n| | Free | Paid |\n|---|---|---|\n| Price | — | €39–149 / mo |\n| License | MIT | Subscription |\n| Status | Live | Coming soon |\n| Output | Jurisdiction, residency, legal framework, CLOUD Act | + Proprietary risk score + Remediation guidance |\n| Auth | API key (free registration) | API key |\n| Rate limit | 100 req / day / IP | Extended |\n\nPaid tier notifications: [studio@kajaril.com](mailto:studio@kajaril.com)\n\n## Self-hosting\n\nRequires a Cloudflare account (Workers + D1 + KV).\n\n**1. Clone and install**\n\n```sh\ngit clone https://github.com/mightbesaad/sovereignty-scan-mcp\ncd sovereignty-scan-mcp\nnpm install\n```\n\n**2. Create infrastructure**\n\n```sh\nnpx wrangler d1 create sovereignty-db-free\nnpx wrangler kv namespace create CACHE_KV\nnpx wrangler kv namespace create KEYS_KV\nnpx wrangler rate-limit:namespace create RATE_LIMITER\nnpx wrangler rate-limit:namespace create BURST_LIMITER\n```\n\nCopy the IDs printed by each command into `wrangler.jsonc` under `d1_databases`, `kv_namespaces`, and `unsafe.bindings`.\n\n**3. Apply schema and seed data**\n\n```sh\nnpx wrangler d1 execute sovereignty-db-free --remote --file=migrations/0001_providers.sql\nnode --input-type=module -e \"\n  import { generateSeedSQL } from './src/seed.js';\n  process.stdout.write(generateSeedSQL());\n\" | npx wrangler d1 execute sovereignty-db-free --remote --command=-\n```\n\n**4. Deploy**\n\n```sh\nnpx wrangler deploy\n```\n\nThe custom domain (`sovereignty-scan.kajaril.com`) in the default config is owned by kajaril — remove or replace the `routes` entry with your own domain or use the default `*.workers.dev` URL.\n\n## Health\n\n```\nGET https://sovereignty-scan.kajaril.com/health\n```\n\nReturns a structured payload (HTTP 200):\n\n```json\n{\n  \"status\": \"ok\",\n  \"provider_count\": 55,\n  \"anthropic_path_count\": 3,\n  \"last_kv_refresh\": \"2026-05-11T00:00:00.000Z\",\n  \"cache_age_seconds\": 86400,\n  \"schema_version\": \"0001\"\n}\n```\n\n`status` is `\"ok\"` when D1 is reachable, `\"degraded\"` otherwise. `cache_age_seconds` is `null` if the KV cache has never been warmed.\n\n## License\n\nMIT — see [LICENSE](./LICENSE).\n",
  "bytes": 5276,
  "sha": "4537e25024ebcd0fc3aa5ba8ef5d8131ca82894d813fc120de38ac2e4fb197fb",
  "repo_slug": "kajaril/sovereignty-scan-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_kajaril_sovereignty_scan_mcp_7022b4b1/readme"
}