pryscraper/ai_plugin.py
cryptorugmunch bb77eb5f35 chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth)
Re-license Pry from full Proprietary to a dual-license model:

- Core engine, extraction, templates (80+), MCP server, x402 payment rail,
  CLI, SDK, browser extension, WordPress plugin, Shopify app, and
  llm_providers: MIT (see LICENSE)
- Anti-detection / stealth subset (15 files): BSL 1.1 with Change Date
  2029-01-01 (see LICENSE-BSL-STEALTH)

BSL files (anti-detection moat):
  ultimate_scraper.py, stealth_engine.py, stealth_scripts/*.js (6),
  camoufox_integration.py, tls_fingerprint.py, cookie_warmer.py,
  behavioral_biometrics.py, adaptive.py, browser_pool.py, network.py,
  captcha_solver.py, shadow_dom.py, lazy_load.py, signup_automator.py,
  auth_connector.py

This enables community contributions to the core engine (templates,
integrations, MCP tools) while protecting the anti-detection techniques
that constitute the actual competitive moat. BSL Additional Use Grant
permits free non-production use; production deployment requires a
commercial license from enterprise@rugmunch.io.

Changes:
- Replace proprietary LICENSE with MIT LICENSE + new LICENSE-BSL-STEALTH
- Add SPDX-License-Identifier headers to 300+ source files
- Add docs/adr/0002-dual-licensing.md (ADR documenting the decision)
- Update README.md: new License section with BSL Additional Use Grant
- Update LICENSING_PRICING_STRATEGY.md: Section 3 (PryScraper) for dual license
- Update AGENTS.md: license line in header + new rule 8 (PRs touching BSL rejected)
- Update pyproject.toml: license = "MIT AND BSL-1.1" + classifiers + license-files
- Update DECISIONS.md index with ADR-0002
- Update STATUS.md (2026-07-03) and PLAN.md sprint goals

Refs: ADR-0002
2026-07-02 19:49:21 +02:00

61 lines
2.1 KiB
Python

"""Pry — AI Agent Plugin.
OpenAPI spec server, MCP server wrapper, and GPT Action helper."""
# SPDX-License-Identifier: MIT
# Copyright (c) 2026 Rug Munch Media LLC
#
# Part of Pry — https://git.rugmunch.io/RugMunchMedia/pryscraper
# Licensed under MIT. See LICENSE.
import json
import logging
from pathlib import Path
from typing import Any, cast
logger = logging.getLogger(__name__)
OPENAPI_SPEC_PATH = Path(__file__).parent / "openapi.json"
def get_openapi_spec() -> dict[str, Any]:
"""Get the OpenAPI spec for AI agent integration."""
if OPENAPI_SPEC_PATH.exists():
try:
spec = cast(dict[str, Any], json.loads(OPENAPI_SPEC_PATH.read_text()))
return spec
except json.JSONDecodeError as e:
logger.error("openapi_spec_parse_failed", extra={"error": str(e)})
return {"error": "OpenAPI spec not found"}
def get_gpt_action_manifest() -> dict[str, Any]:
"""Get the GPT Action manifest for ChatGPT integration.
This manifest configures ChatGPT to use Pry as a custom GPT Action.
"""
return {
"schema_version": "v1",
"name_for_human": "Pry Web Scraper",
"name_for_model": "pry_scraper",
"description_for_human": "Scrape, crawl, and extract data from any website. Get clean markdown, structured JSON, and monitor changes.",
"description_for_model": "Plugin for scraping websites. Use it to extract content from URLs, crawl sites, extract structured data with CSS selectors, check legal compliance, monitor changes, and more.",
"auth": {"type": "none"},
"api": {"type": "openapi", "url": "/openapi.json"},
"contact_email": "support@pry.dev",
"legal_info_url": "https://pry.dev/terms",
}
def get_mcp_server_config() -> dict[str, Any]:
"""Get the MCP server config for Claude/Cursor integration.
This can be added to the AI tool's MCP configuration.
"""
return {
"pry_scraper": {
"type": "local",
"command": ["python3", "-m", "mcp_server"],
"description": "Scrape, crawl, and extract data from any website",
"enabled": True,
}
}