Trust & Security

Security at PropRaven

We publish every SDK and MCP package with cryptographic provenance, verified by GitHub Actions OIDC trusted publishing. Anyone installing PropRaven can prove the build came from a specific git commit on our public repos — no trust required, just signature verification.

Provenance verification

Every published version of @propraven/sdk, @propraven/mcp, and propraven (PyPI) carries an SLSA provenance attestation signed by GitHub Actions and recorded in the public Sigstore transparency log.

Verify any npm install:

npm install @propraven/sdk
npm audit signatures
# expect: 1 package has a verified registry signature

Verify any PyPI install:

pip install propraven
# Provenance is auto-verified by uv:
uv pip install propraven --verify-hashes --provenance

Each attestation pins to a specific git commit on jdw2111/propraven-typescript (TypeScript SDK), jdw2111/propraven-python (Python SDK), or jdw2111/propraven-mcp (MCP server). You can audit the source for any release.

No long-lived publish credentials

PropRaven publishes via PyPI Trusted Publishing and npm Trusted Publishing — both use short-lived GitHub Actions OIDC tokens issued at workflow runtime. There is no long-lived NPM_TOKEN or PYPI_TOKEN stored anywhere in our infrastructure.

This means a compromise of any PropRaven account or CI secret store cannot result in a malicious release. The only credential authorized to publish is the OIDC token issued by GitHub Actions to a specific workflow file in a specific repo — and that token only exists for the seconds-long duration of the publish job.

API key + webhook security

API keys

Keys are scoped per-user, support self-serve rotation, and never appear in logs. Keys prefixed pz_ identify themselves as PropRaven tokens for easy detection in secret scanners (GitHub Push Protection, gitleaks, etc.).

Webhook signing

Every outgoing webhook delivery is signed with HMAC-SHA256 over <unix_ms>.<raw_body>. Verify with propraven.webhooks.verify(...) in Python or verifyWebhook(...) in TypeScript. Both helpers use constant-time compares and enforce a 5-minute replay window. See the Python and TypeScript docs for examples.

Hosted MCP server

The MCP server at mcp.propraven.com is stateless — every request carries the caller's API key in the Authorization header and is re-passed to internal /api/v1/* routes, where the existing rate limit, metering, and tier-gating apply. No customer state is stored at the MCP layer.

CORS is enabled (Access-Control-Allow-Origin: *) so any MCP client — Claude Desktop, Cursor, ChatGPT, a browser-based agent — can connect with the user's bearer token.

Source-of-truth links

Report a vulnerability

Email security@propraven.com with reproduction details. We respond within one business day and credit reporters in the changelog (with their permission) when fixes ship.