KanseiLink collects aggregated, anonymized usage data through the report_outcome tool. This data helps agents make informed decisions about MCP service quality.
- Service ID and success/failure status
- Response latency (optional)
- Error category (optional, predefined types only)
- Context text (optional, PII auto-masked before storage)
- Agent identity (hashed to anonymous ID)
- User personal information (auto-masked)
- Authentication credentials
- Request/response payloads from MCP services
- IP addresses of calling agents
All text submitted via context field is processed through PII masking before storage:
| Pattern | Replaced With |
|---|---|
| Email addresses | [EMAIL] |
| Japanese phone numbers (03-xxxx-xxxx, 090-xxxx-xxxx) | [PHONE] |
| International phone numbers (+81-x-xxxx-xxxx) | [PHONE] |
| IP addresses | [IP] |
| Japanese kanji names with honorific (〇〇さん/様/氏) | [NAME] |
| Japanese full names with space (田中 太郎) | [NAME] |
| Common Japanese surnames + given name (50 surnames) | [NAME] |
| Katakana full names | [NAME] |
Policy: Raw text with PII is never persisted to disk. Masking occurs in-memory before any database write.
agent_id(e.g. onsubmit_feedback) is normalized to an agent family (claude/gpt/gemini/ …) oranonymous— an arbitrary identifier (email, username) can never be stored through it.- Auto-captured error responses (
kansei-link-report-hook) are PII-masked before classification; only the resulting error category is ever transmitted, never the raw response.
- The npm package (
@kansei-link/mcp-server, stdio server) makes no outbound network calls by default — it serves a local bundled SQLite dataset. The single exception is opt-in: if you setKANSEI_API_KEY, the server validates that key againstGET /api/validate-key(tier check only, cached 10 min; no usage data is sent). - The hosted HTTP facade (Railway) exposes the dashboard read APIs, Stripe billing, auth/entitlements, and the opt-in
report-outcome/telemetrysinks.
- Stripe webhooks (
/webhooks/stripe) are verified withstripe.webhooks.constructEvent(HMAC signature) over the raw request body. /api/checkoutaccepts only price IDs configured viaSTRIPE_PRICE_*(a client cannot substitute an arbitrary or different valid price)./api/accessis a low-stakes tier/expiry read keyed by email (no payment data, no content). Actual premium content is never unlockable by email alone — see/api/premiumbelow.- Magic-link email login (
/api/auth/request-link→ emailed one-time code →/api/auth/verify) issues the per-email access token by proving inbox control. Codes are stored hashed, expire in 15 minutes, are single-use, and the request endpoint answers identically for customers and non-customers (no enumeration). Outbound mail goes through Resend only whenRESEND_API_KEYis configured. /api/portal(manage/cancel billing — high-impact) is token-gated: it requires the per-emailHMAC(email, secret)token, so it cannot be used to take over or enumerate billing. The same token gates/api/keys(API key create/list/revoke)./api/premiumserves gated article sections to (email + access token) or a valid API key of sufficient tier. The premium HTML lives only in the server DB — the public repo and the static GitHub Pages HTML do not contain it.- API keys (
kl_…) entitle MCP/HTTP clients to paid tiers. Only SHA-256 hashes are stored; the plaintext is shown once at issue time. Tier is resolved live from the subscription, so cancellation downgrades keys automatically.GET /api/validate-keyreturns tier only — never the owning email. /admin/*endpoints (includingpremium-contentupload) require aCRAWLER_SECRETbearer token.- CORS is scoped to a single configured origin; credentials are not exposed.
Server secrets are environment variables only (never committed): STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, STRIPE_PRICE_*, CRAWLER_SECRET, ACCESS_TOKEN_SECRET (optional — falls back to STRIPE_WEBHOOK_SECRET), RESEND_API_KEY (magic-link email delivery), EMAIL_FROM, ANTHROPIC_API_KEY, GITHUB_TOKEN. See .env.example.
- Initial score: 0.5 (neutral)
- Adjusted based on: namespace verification, community outcomes, manual review
- Scores below 0.3 trigger a warning in search results
Calculated from:
- Unique agent count (40% weight): More independent agents = more trustworthy
- Total call volume (30% weight): More data points = more reliable
- Data recency (30% weight): Fresher data = more relevant
- Structural validation (MVP): Input schema validation via Zod
- Statistical anomaly detection (MVP): Basic outlier detection on latency/success patterns
- Cross-validation (planned): 3+ independent agent confirmations boost confidence
- Human review (planned): Flagged anomalies reviewed by maintainers
Contact: security@synapsearrows.com (or open a GitHub security advisory)
KanseiLink uses io.github.kansei-link/* namespace, verified via GitHub OIDC. We do not claim domain-based namespaces until DNS ownership is confirmed.