pyobfus-mcp
pyobfus-mcp is a local, no-API-key MCP server that lets an agent scan, configure, obfuscate, verify, ship-check, and debug Python projects end-to-end.
Protect end-to-end (
protect_project): scans risks, picks a framework-aware preset, obfuscates, then byte-compiles and import-smoke-tests the output in isolated subprocesses, returningverified: true/false; writes a private de-obfuscation mapping next to (not inside) the output.Scan for obfuscation risks (
check_obfuscation_risks): finds eval/exec, dynamic attribute access, framework reflection, unsafe model loading; returns severity counts, detected frameworks (FastAPI/Django/Flask/Pydantic/Click/SQLAlchemy/ML) and a suggested preset; locatesrequirements*.txt/pyproject.tomland optionally (opt-in) flags hallucinated packages against PyPI.Generate config (
generate_pyobfus_config): auto-detects frameworks and producespyobfus.yamltext, optionally writing it to disk.Explore presets (
list_presets,explain_preset): list presets by tier (community/framework-aware/Pro) and describe what a preset changes (exclude names/patterns,preserve_param_names, docstring handling), including Pro unlock metadata.Reverse tracebacks (
unmap_stack_trace): restore obfuscated identifiers in a pasted stack trace using amapping.jsonfrom--save-mapping.Pre-ship delivery check (
check_delivery): fails on leaked mapping files, private keys, or original source in an output dir/.whl, warns on unexpected or skipped files; read-only (hashes only, never executes or returns contents).Tier guidance (
recommend_tier,start_pro_trial): recommends Community vs Pro with reasons and next-step commands, and returns guidance for the 5-day Pro trial without triggering it.Local-first and private: no API key, no source upload, no outbound network calls unless explicitly opted in.
Provides a preset for Django projects, automatically detecting Django and generating configuration to obfuscate Django code while properly handling dispatch methods, decorators, ORM fields, and migrations.
Provides a preset for FastAPI projects, automatically detecting FastAPI and generating configuration to obfuscate FastAPI code while preserving endpoint handlers, dependency injection, and Pydantic models.
Provides a preset for Flask projects, automatically detecting Flask and generating configuration to obfuscate Flask code while preserving route decorators, blueprints, and other framework-specific patterns.
Provides a preset for Pydantic projects, automatically detecting Pydantic and generating configuration to obfuscate Pydantic models while preserving field validators and serialization methods.
Provides a preset for SQLAlchemy projects, automatically detecting SQLAlchemy and generating configuration to obfuscate ORM models while preserving column definitions, relationships, and query methods.
pyobfus: the Python obfuscator
pyobfus is a local-first, AST-based Python obfuscator for Python 3.9–3.14. It
obfuscates multi-file projects and packages as a whole: names are renamed
consistently across modules and imports are rewritten to match, so the output
is still ordinary .py that runs without pyobfus installed. It can also
reverse-map protected production tracebacks for developers and AI coding
agents. Community is Apache-2.0, has no file or line limits, and requires no
trial.
What's new in v0.7.3: directory builds keep
enum.global_enummembers (such ascalendar.JANUARYorre.IGNORECASE) under their original names, so they no longer break at runtime, and a module that re-exports another project module withfrom .core import *now works when other modules import from it. Enums that cannot be analysed statically keep that module's names with a warning instead of failing the build. Rebuild and rerun your tests; see the changelog.
Why pyobfus
Advantage | What it means in practice |
Complete Community edition | Obfuscate real projects without a file/line cap or trial clock. Optional limits are your CI safety rails, not an upgrade gate. |
Diagnosable protection | Keep the private mapping and restore identifiers in production tracebacks without giving customers the original source. |
Evidence, not a black box | Scan, preview, verify syntax, retain provenance and compare reproducible build reports. |
Portable and local-first | Source stays local and there is no telemetry (what goes over the network); Community emits ordinary cross-platform Python without a native build matrix. |
Explicit security claims | Tested, verified-once and advisory-only claims are separated; deterrents are not presented as irreversible security. |
Related MCP server: MCP Python Toolbox
Quick start
pip install pyobfus
# Check compatibility, preview, then build
pyobfus --check src/
pyobfus src/ -o dist/ --dry-run --json
pyobfus src/ -o dist/ --save-mapping mapping.json --verify-syntax
# --verify-syntax only compiles the output; run your own tests against dist/
# Restore names when a production traceback arrives
pyobfus --unmap --trace error.log --mapping mapping.jsonSince 0.7.1, add opt-in --verify-names to check newly unbound globals
without execution. Success JSON reports partial coverage explicitly; see
name verification
for usage and limits. Check the final directory or wheel with
pyobfus --check-delivery dist/ --json before shipping.
For framework presets, configuration discovery, packaging and verification, start at the task-oriented documentation.
Minimal example
Input:
def greet(name):
message = f"Hello, {name}!"
return message
print(greet("world"))Run pyobfus input.py -o output.py. Representative Community output:
def I0(I1):
I2 = f"Hello, {I1}!"
return I2
print(I0("world"))Both print Hello, world!. Generated identifiers can differ with input and
configuration; verify the exact output with your own tests. Keep a mapping when
you need to restore names from a shipped traceback.
Parameter names are preserved by default in every preset. Explicit
--no-preserve-param-names or YAML preserve_param_names: false keeps legacy
renaming with a warning: keyword calls may raise TypeError or silently bind
incorrectly. Rebuild from original source and keep the new mapping with the
new artifact; mapping numbers can change and old mappings cannot decode
rebuilt output. Cross-file directory builds (the default) still preserve parameters; legacy
--no-cross-file directory builds follow the option.
Features at a glance
Community includes name mangling with import rewriting across a project (directories also rename function locals; parameters and methods remain unchanged there; single files also rename methods and preserve parameters by default, see the guide), string and numeric transforms, framework-aware presets, config-aware pre-flight scanning (including coarse hardcoded-secret screening without displaying values), SARIF, structured dry-run, reverse traceback mapping, syntax verification, provenance, reproducible output and verifiable build reports.
Professional adds four kinds of commercial value:
Protection strength: AES encryption, control-flow flattening, dead-code injection, anti-debugging, Selective Opacity and sealing.
Protected assets: import strings, embedded data, Runtime String Vault and protected tracebacks.
Distribution control: device, expiry, run-count, platform and application-supplied-key policies.
Accountability: forensic watermarking and buyer-specific builds.
The durable classification rule is documented in the Community / Pro boundary policy.
🔌 Companion MCP server: pyobfus-mcp
Install the MCP server with no API key and no source upload:
uvx pyobfus-mcp
# or: pip install pyobfus-mcpIt exposes structured tools for scanning, configuration, protection, verification, preset explanation, tier recommendations and traceback mapping. See the MCP package guide and its registration in the official MCP Registry.
Agent and editor integrations
pyobfus-reviewandpyobfus-protectskills separate read-only review from build-producing work. See skills.The VS Code extension provides inline risk diagnostics and traceback reversal; it is also on Open VSX.
zhurong2020/pyobfus-action@v1runs scans or verified builds in GitHub Actions with SARIF support.The stable JSON CLI includes reason codes and an
ai_hintnext action.Agent-readable project facts are published in
llms.txt, while contributor instructions live inAGENTS.md.
All Agent guidance is public and human-auditable. pyobfus does not serve hidden instructions or different facts based on User-Agent.
Configuration
Generate a starting configuration or use a named preset:
pyobfus --init src/
pyobfus src/ -o dist/ --preset django
pyobfus --list-presetsCommunity presets include safe, balanced, aggressive, fastapi, django,
flask, pydantic, click, sqlalchemy and ml. See the
documentation home and
pyobfus --help
for current options. Optional max_files and max_total_loc values are
user-selected safety limits at every tier.
How do I debug an obfuscated crash with an AI assistant?
Build with --save-mapping mapping.json, keep that file private, then run:
pyobfus --unmap --trace error.log --mapping mapping.jsonThe restored identifiers can be read by you or an AI assistant without giving
the customer your mapping or original source. --trace-marker can also stamp
generated files with the exact recovery command.
Purchase Professional Edition
Professional Edition is $45 USD, one time—not a subscription. A five-day trial requires no registration or card:
pyobfus-trial startThe trial is an honor-system convenience control, not a security boundary. Visit the product and purchase page for current payment methods, refund terms and purchase steps. After purchase, use the license activation guide.
Runtime-backed Pro artifacts depend on the separately redistributable,
pure-Python pyobfus-runtime package. Target machines do not need the complete
proprietary builder or a licence key.
Security and limitations
Obfuscation raises the cost of inspection; it does not make client-side Python irreversible. Runtime-decrypted material can be observed by a determined attacker. Keep credentials and authorization decisions behind environment, secret-manager or server boundaries.
Comparison and deployment guides
Architecture and development
The product line separates the Apache-2.0 Core, proprietary Pro builder, redistributable runtime, MCP package, editor extension and GitHub Action. See:
Community and citation
Use GitHub Issues for bugs and
Discussions for questions
and ideas. Citation metadata is in
CITATION.cff,
with archival DOI 10.5281/zenodo.20846053.
Core is Apache-2.0; Professional implementation is proprietary. See
LICENSE-NOTICE.md.
Available Tools
9 toolscheck_deliveryA
Check an output directory or .whl right before shipping: fails on a pyobfus mapping file, a private key or an original source file inside it, and warns about Python files the build did not produce or Pro options the build skipped. Pass the build's --build-report and --provenance-manifest JSON for the full check. Read-only: files are hashed, never imported or executed, and contents are not returned.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| build_report | No | ||
| provenance_manifest | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it declares read-only semantics, that files are hashed and never imported or executed, that contents are not returned, and it distinguishes hard failures from warnings. That is exactly the safety and outcome profile an agent needs before invoking an artifact-inspection tool on shipping output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, front-loaded with what the tool checks, then how to enable the full check, then the safety profile. Every clause carries information, though the middle sentence is heavily comma-loaded and could be marginally tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description covers purpose, trigger timing, optional inputs and safety. The remaining gap is behavior when the optional report/manifest is absent or malformed, which matters for a gating pre-ship check.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it largely does: 'path' is clarified as an output directory or a .whl, and build_report / provenance_manifest are tied to the build's --build-report and --provenance-manifest JSON artifacts. It stops short of specifying whether these are file paths or inline JSON, and any format expectations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (check) plus resource (output directory or .whl) with an explicit temporal scope ('right before shipping') and concrete failure/warning conditions (pyobfus mapping file, private key, original source, unreported Python files, skipped Pro options). This distinguishes it from the adjacent pre-build sibling check_obfuscation_risks, which audits risks rather than validating a finished artifact.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States when to use it ('right before shipping') and how to get the most out of it ('Pass the build's --build-report and --provenance-manifest JSON for the full check'), implying the no-report path is a degraded check. It does not name an alternative tool or an explicit when-not-to-use, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_obfuscation_risksA
Scan a Python project for patterns that may break obfuscation (eval/exec, dynamic attribute access, framework reflection, unsafe model loading). Returns severity counts, detected frameworks (FastAPI/Django/Flask/Pydantic/Click/SQLAlchemy/ML), and a suggested preset. Also locates requirements*.txt / pyproject.toml and, only if verify_dependencies_online=true, checks each declared dependency against public PyPI to flag AI-hallucinated ('slopsquatting') package names -- off by default, this tool makes no outbound network calls unless you opt in. By default the scan honors the project's pyobfus config; set use_project_config=false for the legacy config-free scan.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| use_project_config | No | ||
| verify_dependencies_online | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the burden of behavioral disclosure. It explicitly states that no outbound network calls occur unless verify_dependencies_online=true, it explains the default config-honoring behavior and the legacy fallback, and it describes the returned data. This is unusually transparent for a scan tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but information-dense, and the core purpose is front-loaded. The caveats about network calls and config behavior earn their place. It could be broken into shorter sentences for easier parsing, but it does not waste words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no annotations, but the description covers the main purpose, parameter semantics, side-effect profile, and output summary (severity counts, frameworks, suggested preset). An output schema is present for exact return structure, so the description need not repeat that detail. This is fully adequate for an agent to decide whether to invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description compensates thoroughly. It explains that path points to the Python project, use_project_config controls whether the project's pyobfus config is honored versus the legacy config-free scan, and verify_dependencies_online gates the PyPI check and clarifies the offline default. Every parameter gains meaning beyond its name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Scan') and a clear resource ('a Python project'), then enumerates exactly what patterns are checked (eval/exec, dynamic attribute access, framework reflection, unsafe model loading). It also names distinguishable outputs (severity counts, detected frameworks, suggested preset), which differentiates it sharply from sibling tools like protect_project or generate_pyobfus_config.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear sense of when this tool is relevant: before obfuscation, to identify risk patterns and decide a preset. It also explains behavioral brancks like use_project_config and verify_dependencies_online. However, it does not explicitly contrast this tool with siblings or state when to prefer an alternative, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explain_presetA
Describe what a named preset changes: exclude names count, exclude patterns, preserve_param_names, docstring handling. For Pro presets, returns full pro_unlock metadata (trial command, checkout URL, price, money-back guarantee).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It adds useful context by specifying that Pro presets return 'full pro_unlock metadata (trial command, checkout URL, price, money-back guarantee)', which goes beyond the bare tool name. It does not explicitly state read-only behavior, but the term 'explain' and the nature of the described outputs make non-mutation apparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The first sentence front-loads the primary purpose and key covered aspects, while the second adds a meaningful conditional detail about Pro presets. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core purpose, key features, and special behavior for Pro presets, which is sufficient given a single simple parameter and the presence of an output schema. It could mention a usage workflow (e.g., 'use after list_presets') but is not incomplete without it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It implicitly identifies the sole 'name' parameter as a preset name through the phrase 'named preset' and adds meaning by distinguishing Pro presets. However, it does not provide explicit parameter documentation, such as example names or format, leaving some room for interpretation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Describe' and the resource 'a named preset', and lists specific aspects ('exclude names count, exclude patterns, preserve_param_names, docstring handling') that differentiate it from siblings like list_presets. It is immediately clear what this tool accomplishes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides enough context to infer the tool is used for explaining preset details, and the presence of list_presets implies an alternative for listing. However, there is no explicit 'when to use' or 'when not to use' guidance, nor a direct reference to sibling tools, leaving it to the agent to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_pyobfus_configA
Generate a pyobfus.yaml for a Python project. Auto-detects frameworks and applies the matching preset. By default returns the YAML text without writing to disk; set write=true to persist.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| write | No | ||
| preset_override | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It discloses that it auto-detects frameworks and the default vs. write behavior, which is important for a generation tool, though it doesn't specify error handling or file overwrite policy.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loading the purpose and then providing key behavioral details without unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the description covers the main action and default behavior, it omits details on the 'preset_override' parameter and error scenarios, making it adequate but not thorough for a tool with auto-detection logic.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description only explains the 'write' parameter; 'path' and 'preset_override' are not described despite 0% schema coverage, leaving the agent unclear on expected values and semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool generates a pyobfus.yaml for a Python project, which is specific and distinguishes it from siblings like protect_project or recommend_tier.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the default behavior (returns YAML text) and when to use the write parameter, but does not explicitly state when not to use it or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_presetsA
List every pyobfus preset available, grouped by tier (community / framework-aware / Pro).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden. It discloses the listing behavior and the grouping structure via 'grouped by tier'. The verb 'List' implies a read-only operation, and since an output schema exists, the return format need not be detailed further.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that front-loads the verb 'List' and directly states the scope and grouping. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with no params and an output schema, the description fully answers what the tool does. It covers the listing and the grouping, and there are no preconditions or side effects to mention.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so schema coverage is trivially 100%. The description adds no parameter information because none is needed; the baseline for 0 params is 4, and there is nothing to compensate for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists every pyobfus preset and groups them by tier (community / framework-aware / Pro). This is a specific verb+resource+scope, and it differentiates from siblings like explain_preset and recommend_tier.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case of discovering all available presets, which is clear enough from 'List every'. It does not explicitly name alternatives or exclusions, but the context of sibling tools (e.g., explain_preset) makes it obvious when this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_projectA
One call to protect a Python project end-to-end AND verify it still works: scans risks, picks a framework-aware preset, obfuscates, then byte-compiles + import-smoke-tests the output in isolated subprocesses and returns verified:true/false. Writes a private de-obfuscation mapping alongside (not inside) the output. Use this when the user wants to 'protect/obfuscate before shipping' and expects a green check, not just a transform.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| preset | No | ||
| verify | No | ||
| timeout | No | ||
| output_dir | No | dist | |
| verify_cmd | No | ||
| save_mapping | No | ||
| trace_marker | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It details the entire workflow: scans risks, picks a preset, obfuscates, byte-compiles, runs import-smoke-tests in isolated subprocesses, and returns verified:true/false. It also mentions writing a private de-obfuscation mapping alongside the output. It does not specify permissions or failure modes, which is a minor gap, but overall it provides substantial behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences long with no filler. The first sentence is a dense, front-loaded summary of the entire workflow. The second adds a key behavioral detail (mapping placement). The third provides concise usage guidance. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (8 params, 1 required, output schema present) and 0% schema coverage, the description covers the core workflow and usage well. It explains the main steps and expected outcome. It does not detail the output schema or all parameter behaviors, but the output schema likely handles return value documentation. Slight gap in parameter descriptions, but overall complete enough for an AI to determine appropriate invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It provides high-level context for some parameters (e.g., 'path' as project path, 'preset' as framework-aware, 'verify' as the verification step, 'save_mapping' for the mapping file), but it does not explicitly detail all 8 parameters. For example, 'timeout', 'output_dir', 'verify_cmd', and 'trace_marker' are only briefly implied. This is minimally adequate but not thorough.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'protect a Python project end-to-end AND verify it still works'. It distinguishes itself from sibling tools by emphasizing it is a combined protect+verify operation that 'returns verified:true/false', not just a transform. The context of sibling tools like check_obfuscation_risks and generate_pyobfus_config reinforces that this is a higher-level, end-to-end tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises when to use: 'Use this when the user wants to protect/obfuscate before shipping and expects a green check, not just a transform.' While it doesn't name specific alternatives, the sibling list implies that other tools are for more granular steps (e.g., risk scanning or preset generation). The guidance is clear but could be more explicit about when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recommend_tierB
Analyze a Python project and recommend pyobfus tier (community vs Pro) with reasons. Combines a preflight scan with a sensitive-string-literal heuristic. Returns free_action and pro_action with concrete next-step commands.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses it combines a preflight scan with a sensitive-string-literal heuristic and returns concrete actions. No annotations exist, so description carries the burden; it could mention if it modifies anything or prerequisites.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, front-loaded with purpose, method, and output. Efficient but could be more structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, method, and output types (free_action, pro_action), but lacks usage guidelines and parameter details. Adequate for a simple tool with one parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The sole parameter 'path' has no description in the schema (0% coverage) and the tool description only implies it's the project path without explicit semantics or format details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it analyzes a Python project and recommends a tier (community vs Pro) with reasons, using a heuristic. However, it does not explicitly differentiate from sibling tools like check_obfuscation_risks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage when a tier recommendation is needed, but no explicit when-not or alternatives to sibling tools are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_pro_trialA
Return structured guidance for starting the 5-day pyobfus Pro trial. Does NOT invoke the side effect — the user runs pyobfus-trial start in their shell. Detects whether a trial is already active and surfaces the appropriate next step plus post-trial purchase URL.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully conveys behavioral traits: it returns structured guidance, does not invoke side effects, detects active trials, and surfaces next steps plus purchase URL. This is transparent and leaves no ambiguity about what the tool does or does not do.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words. The first sentence states purpose and critical side-effect disclaimer; the second adds behavioral detail. Highly efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, no annotations, and the presence of an output schema, the description is complete. It covers purpose, non-side-effect nature, detection capability, and what guidance is returned. No missing information for an agent to correctly select and invoke this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema coverage is 100%, so baseline is 4. The description does not need to add parameter information; it implicitly covers the lack of parameters by describing the tool's function without mentioning inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: return structured guidance for starting the 5-day Pro trial. It specifies the resource ('pyobfus Pro trial') and action ('return structured guidance'), and distinguishes itself from sibling tools by noting it does not invoke the side effect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: it is for guidance only, not for actual trial activation, as the user must run `pyobfus-trial start` in their shell. It also mentions detecting active trial status, which helps an agent decide whether to call this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unmap_stack_traceA
Reverse obfuscated identifiers in a stack trace using a pyobfus mapping.json. Accepts the trace as plain text and the path to a mapping file produced by --save-mapping.
| Name | Required | Description | Default |
|---|---|---|---|
| trace | Yes | ||
| mapping_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden for behavioral transparency. It does not disclose whether the tool is read-only, requires any permissions, has side effects, or error handling behavior. The description only states the action and inputs, leaving gaps about what happens internally or under failure conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, consisting of two sentences that deliver all necessary information without fluff. It is front-loaded with the action and efficiently explains inputs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has two simple parameters and an output schema, the description is fairly complete. It explains the purpose, inputs, and the origin of the mapping file. It could briefly mention what the output looks like (e.g., unmapped trace), but the output schema handles that. Overall, it provides sufficient context for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description effectively compensates by naming both parameters and providing context: 'trace' is described as 'plain text', and 'mapping_path' is described as 'the path to a mapping file produced by --save-mapping.' This adds meaningful usage guidance beyond the bare schema titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Reverse obfuscated identifiers in a stack trace using a pyobfus mapping.json.' It specifies the verb (reverse), resource (stack trace), and method (mapping file), which distinguishes it from sibling tools like check_obfuscation_risks and generate_pyobfus_config.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by stating what it does and what inputs are needed (trace as plain text, mapping file path). However, it does not explicitly state when to use this tool versus alternatives, nor does it provide exclusions or when-not-to-use guidance. Given the sibling tools, usage context is implied but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.7.1- Added
check_delivery
TDQS
Scored across 9 tools
Most tools target distinct stages of the obfuscation lifecycle (scan, config, protect, ship, debug), but three tools — check_obfuscation_risks, recommend_tier, and protect_project — all perform project scans, and list_presets vs explain_preset sit close together, creating mild boundary ambiguity.
Every tool follows a clean verb_noun snake_case pattern (start_pro_trial, list_presets, protect_project, check_delivery, unmap_stack_trace), with no mixed conventions or vague verbs.
Nine tools is well-scoped for a Python obfuscation server, with each tool earning its place across the protect-scan-config-verify-ship-debug workflow without redundancy.
The lifecycle is well covered end-to-end: risk scanning, config generation, protection, delivery checks, stack-trace unmapping, and tier recommendation. Minor gaps exist around Pro license activation (only trial-start guidance) and a standalone obfuscate-without-verify path.
Maintenance
Related MCP Connectors
Enable secure connectivity between Sentry issues and debugging data, and LLM clients, using a Model Context Protocol (MCP) server.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Ovanek MCP: Model Context Protocol server for Ovanek platform tools; writes are dry-run by default.
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
Related MCP Servers
- AlicenseAqualityCmaintenanceModel Context Protocol server for fetching web content and processing images. This allows Claude Desktop (or any MCP client) to fetch web content and handle images appropriately.1715 npm41MIT
- AlicenseNot gradedqualityCmaintenanceA Model Context Protocol server that enables AI assistants like Claude to perform Python development tasks through file operations, code analysis, project management, and safe code execution.9MIT
- AlicenseNot gradedqualityDmaintenanceA custom Model Context Protocol server that gives Claude Desktop and other LLMs access to file system operations and command execution capabilities through standardized tool interfaces.23Apache 2.0
- FlicenseBqualityDmaintenanceA Model Context Protocol server that enables Claude users to access specialized OpenAI agents (web search, file search, computer actions) and a multi-agent orchestrator through the MCP protocol.410-