Skip to main content

Raisin skill risk scanner

Project description

Raisin

Raisin is a local scanner for SKILL.md-defined agent skills.

It performs static analysis only (no execution) and writes deterministic JSON reports.

Requirements

  • Python 3.12+
  • uv (recommended for development workflows)

Install

Development install:

uv sync --dev

Run via uv:

uv run raisin --help

Usage

Basic scan:

uv run raisin scan --root . --output-dir output/

Custom rules directory:

uv run raisin scan --root . --rules-dir ./enterprise-rules --output-dir output/

Single rule file:

uv run raisin scan --root . --rule-file ./enterprise-rules/net_unknown_domain.yaml --output-dir output/

Specific rule files:

uv run raisin scan --root . \
  --rule-file ./enterprise-rules/net_unknown_domain.yaml \
  --rule-file ./enterprise-rules/mcp_endpoint.yaml \
  --output-dir output/

CLI flags:

  • --root <path>: workspace root to scan
  • --output-dir <path>: output root for findings and summaries
  • --config <file>: optional config file path (defaults to <root>/raisin.yaml)
  • --mcp-allowlist <domain-or-url>: optional repeatable MCP endpoint/domain allowlist override
  • --engine <dsl>: detector engine (dsl only; removed values: legacy, optionc, default)
  • --rules-dir <path>: load all custom *.yaml DSL rules from this directory
  • --rule-file <path>: load specific custom *.yaml DSL rule file (repeatable)
  • --no-cache: disable cache reads/writes
  • --max-file-mb <n>: skip files larger than n MB
  • --output-format json: reserved for future formats (currently only json)

Rules source behavior:

  • Default mode (no custom flags): bundled rules under src/raisin/dsl/rules/
  • Custom directory mode: --rules-dir replaces bundled rules for that scan
  • Custom file mode: one or more --rule-file values replace bundled rules for that scan
  • --rules-dir and --rule-file are mutually exclusive
  • Invalid path, invalid extension, duplicate rule_id, and invalid YAML fail fast

Config File

Create raisin.yaml in scan root (or pass with --config):

allowlist_domains:
  - api.openai.com
denylist_domains:
  - "*"
mcp_allowlist_domains:
  - rube.app
mcp_denylist_domains:
  - blocked.example.com
tool_prefixes:
  - RUBE_
  - MCP_
detectors:
  enabled:
    - NET_RAW_IP
    - NET_UNKNOWN_DOMAIN
    - SECRET_REF
    - EXEC_FIELDS
    - OPAQUE_BLOB
    - TYPOSQUAT
    - BUNDLED_SCRIPTS
    - MCP_REQUIRED
    - MCP_ENDPOINT
    - MCP_DENYLIST
    - TOOL_INVOCATION
    - DYNAMIC_SCHEMA
    - AUTH_CONNECTION
    - EXTERNAL_URLS
  disabled: []
typosquat:
  baseline:
    - openai-helper
skill_globs:
  - "**/SKILL.md"
max_file_mb: 2

Outputs

Per skill, Raisin writes:

  • output/<skill-name>/findings.json
  • output/<skill-name>/summary.json

Cache file:

  • output/.raisin-cache.json

Skill name derivation precedence:

  1. Frontmatter name (if present)
  2. Nearest folder containing SKILL.md
  3. Sanitized relative path from scan root

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

razin-0.1.0.tar.gz (84.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

razin-0.1.0-py3-none-any.whl (73.0 kB view details)

Uploaded Python 3

File details

Details for the file razin-0.1.0.tar.gz.

File metadata

  • Download URL: razin-0.1.0.tar.gz
  • Upload date:
  • Size: 84.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.7.19

File hashes

Hashes for razin-0.1.0.tar.gz
Algorithm Hash digest
SHA256 6b33281f7163092081588eebfd9d0a04b2d6882fd9d2d5b0e64fd1beb65de504
MD5 1996a42df2e6f7bb2201f0674115ecdf
BLAKE2b-256 1ad72d2ada816b8e371dc08956f867a11539ee931a5a57e6b0d9b209728e813d

See more details on using hashes here.

File details

Details for the file razin-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: razin-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 73.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.7.19

File hashes

Hashes for razin-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 35ed3c54cb2a0cf9efb4e2d2d029840a8a5d8e76dda3d6aac9c9866f7e7938f9
MD5 e557572abab2e0231e6d7f7233d56346
BLAKE2b-256 f024b2ea08ed9a52cc9bcd3218adde5060cf846f0b3da239cd7def2111b29e5b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page