Security Policy

Urchin is a Model Context Protocol (MCP) server library. It implements the transport and protocol; the surrounding deployment (network exposure, TLS, an authorization server, rate limiting) is the operator's responsibility. This document describes what Urchin does and does not protect against, and what you must add before exposing a server publicly.

What Urchin provides

What you must add before public exposure

Urchin does not yet provide these; supply them in your deployment:

  1. TLS. Terminate HTTPS at a reverse proxy or the endpoint. OAuth requires HTTPS in production.
  2. Authorization. Set :auth (or front the transport with Urchin.Auth.Plug). An unauthenticated server bound to a public interface exposes every tool to anyone.
  3. Rate limiting / per-session concurrency limits. Per IP, per session, and for initialize and long-running tools. (Session count and lifetime are covered by the built-in limits above; request-rate and in-flight caps are not yet built in.)
  4. Per-tool authorization beyond scopes. Declarative scopes: covers scope checks; add app-specific authorization (ownership, tenancy, row-level access) in handlers via ctx.auth.
  5. Full input validation. Structural checks against input_schema run automatically, but validate unsupported JSON Schema keywords, business rules and output_schema in your handler — Urchin.Schema is a minimal subset.

Deployment checklist

Reporting a vulnerability

Please report security issues privately rather than opening a public issue. Use GitHub's private vulnerability reporting for this repository, or contact the maintainers at Urth Inc. We aim to acknowledge reports promptly and will coordinate a fix and disclosure timeline with you.