Community plugin to control Blender 3D with any LLM of your choice. Not affiliated with the official Blender Foundation.
This report summarizes scanner evidence for MCPBlender/blender-mcp, a Python project with 30,472 GitHub stars. SynthScan examined 30,943 lines of code across 61 source files, recording 954 pattern matches distributed across 14 syntactic categories. The legacy adjusted pattern signal is 35.1 (High pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 513 finding(s).
Are imports declared and package/API names verified? 32 finding(s).
Are wrappers, guards, and repeated structures necessary? 830 finding(s).
Which changes need focused human review? 954 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 954 distinct pattern matches across 14 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | addon.py | 1070 | def _blendermcp_depsgraph_post(scene, depsgraph=None): | CODE |
| LOW⚡ | addon.py | 1074 | def _telemetry_consent_enabled(): | CODE |
| LOW⚡ | addon.py | 1085 | def _register_edit_capture_handlers(): | CODE |
| LOW⚡ | addon.py | 1102 | def sync_edit_capture_handlers(): | CODE |
| LOW⚡ | addon.py | 1118 | def _unregister_edit_capture_handlers(): | CODE |
| LOW⚡ | addon.py | 1486 | def _execute_command_internal(self, command): | CODE |
| LOW⚡ | addon.py | 4878 | def poll_hunyuan_job_status_ai(self, job_id: str): | CODE |
| LOW⚡ | addon.py | 6102 | def _redraw_when_update_checked(): | CODE |
| LOW⚡ | addon.py | 6112 | def _start_addon_update_check(): | CODE |
| LOW⚡ | addon.py | 6121 | def _addon_update_check_on_startup(): | CODE |
| LOW | addon.py | 65 | def _blendermcp_port_has_listener(host, port): | CODE |
| LOW | addon.py | 75 | def _blendermcp_ensure_server_running(): | CODE |
| LOW | addon.py | 113 | def _blendermcp_schedule_auto_start(delay=0.5): | CODE |
| LOW | addon.py | 129 | def _blendermcp_register_auto_start(): | CODE |
| LOW | addon.py | 138 | def _blendermcp_unregister_auto_start(): | CODE |
| LOW | addon.py | 205 | def _polypizza_summarize_model(model): | CODE |
| LOW | addon.py | 501 | def _polyhaven_uncompress_head(raw): | CODE |
| LOW | addon.py | 556 | def _polyhaven_category_paths(nodes, depth=None, _level=1): | CODE |
| LOW | addon.py | 628 | def _polyhaven_summarize_asset(slug, record): | CODE |
| LOW | addon.py | 698 | def _polyhaven_resolution_rank(resolution): | CODE |
| LOW | addon.py | 706 | def _polyhaven_sorted_resolutions(resolutions): | CODE |
| LOW | addon.py | 740 | def _polyhaven_select_texture_maps(files_data, resolution, file_format): | CODE |
| LOW | addon.py | 772 | def _polyhaven_set_colorspace(image, is_color_data): | CODE |
| LOW | addon.py | 945 | def _resync_operator_baseline(self): | CODE |
| LOW | addon.py | 1130 | def get_blendermcp_addon_preferences(context=None): | CODE |
| LOW | addon.py | 2780 | def get_polyhaven_asset_preview(self, asset_id): | CODE |
| LOW | addon.py | 2945 | def _polyhaven_build_material(self, asset_id, maps): | CODE |
| LOW | addon.py | 3030 | def _polyhaven_import_texture(self, asset_id, files_data, resolution, file_format): | CODE |
| LOW | addon.py | 3103 | def _polyhaven_fetch_model_files(self, files_data, resolution, file_format, dest_dir): | CODE |
| LOW | addon.py | 3492 | def create_rodin_job_main_site( | CODE |
| LOW | addon.py | 3572 | def poll_rodin_job_status_main_site(self, subscription_key: str): | CODE |
| LOW | addon.py | 3592 | def poll_rodin_job_status_fal_ai(self, request_id: str): | CODE |
| LOW | addon.py | 3685 | def import_generated_asset_main_site(self, task_uuid: str, name: str): | CODE |
| LOW | addon.py | 3755 | def import_generated_asset_fal_ai(self, request_id: str, name: str): | CODE |
| LOW | addon.py | 3943 | def get_sketchfab_model_preview(self, uid): | CODE |
| LOW | addon.py | 4629 | def get_tencent_cloud_sign_headers( | CODE |
| LOW | addon.py | 4721 | def create_hunyuan_job_main_site( | CODE |
| LOW | addon.py | 4791 | def create_hunyuan_job_local_site( | CODE |
| LOW | addon.py | 4925 | def import_generated_asset_hunyuan(self, *args, **kwargs): | CODE |
| LOW | addon.py | 4961 | def import_generated_asset_hunyuan_ai(self, name: str, zip_file_url: str): | CODE |
| LOW | addon.py | 5229 | def premium_enabled_generators(): | CODE |
| LOW | addon.py | 5361 | def premium_integration_status(integration, enabled): | CODE |
| LOW | addon.py | 5527 | def premium_create_hunyuan_job(text_prompt=None, image=None, quality=None): | CODE |
| LOW | addon.py | 5535 | def premium_poll_hunyuan_job_status(job_id=None): | CODE |
| LOW | addon.py | 5552 | def premium_import_generated_asset_hunyuan(name, zip_file_url): | CODE |
| LOW | addon.py | 5717 | def _on_telemetry_consent_changed(self, context): | CODE |
| LOW | tests/test_hunyuan_import_security.py | 92 | def test_hunyuan_import_prefers_glb_urls(monkeypatch): | CODE |
| LOW | tests/test_hunyuan_import_security.py | 127 | def test_hunyuan_zip_rejects_path_traversal(monkeypatch): | CODE |
| LOW | tests/test_sketchfab_status.py | 69 | def test_disabled_sketchfab_does_not_report_a_saved_key_as_ready(monkeypatch): | CODE |
| LOW | tests/test_sketchfab_status.py | 92 | def test_enabled_sketchfab_reports_a_valid_key_as_ready(monkeypatch): | CODE |
| LOW | tests/test_setup_cli.py | 50 | def test_adds_entry_and_keeps_other_servers(tmp_path): | CODE |
| LOW | tests/test_setup_cli.py | 64 | def test_creates_missing_file_without_backup(tmp_path): | CODE |
| LOW | tests/test_setup_cli.py | 71 | def test_vscode_and_opencode_formats(tmp_path): | CODE |
| LOW | tests/test_setup_cli.py | 85 | def test_does_not_take_over_an_unrelated_blender_entry(tmp_path): | CODE |
| LOW | tests/test_setup_cli.py | 94 | def test_update_replaces_old_package_and_keeps_env(tmp_path): | CODE |
| LOW | tests/test_setup_cli.py | 109 | def test_jsonc_is_read_and_invalid_json_left_alone(tmp_path): | CODE |
| LOW | tests/test_setup_cli.py | 123 | def test_strip_jsonc_keeps_strings(): | CODE |
| LOW | tests/test_setup_cli.py | 139 | def test_codex_state_reads_config_toml(tmp_path): | CODE |
| LOW⚡ | tests/test_setup_cli.py | 154 | def test_codex_plugin_counts_as_configured(tmp_path): | CODE |
| LOW⚡ | tests/test_setup_cli.py | 160 | def test_codex_commands_carry_plugin_env(): | CODE |
| 354 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | addon.py | 1382 | print(f"Error accepting connection: {str(e)}") | CODE |
| MEDIUM⚡ | addon.py | 1385 | print(f"Error in server loop: {str(e)}") | CODE |
| MEDIUM⚡ | addon.py | 1411 | print(f"Error executing command: {str(e)}") | CODE |
| MEDIUM⚡ | addon.py | 1462 | print(f"Error receiving data: {str(e)}") | CODE |
| MEDIUM⚡ | addon.py | 1465 | print(f"Error in client handler: {str(e)}") | CODE |
| MEDIUM⚡ | addon.py | 1482 | print(f"Error executing command: {str(e)}") | CODE |
| MEDIUM⚡ | addon.py | 3653 | print("Error: Child is not a mesh object.") | CODE |
| MEDIUM⚡ | addon.py | 3656 | print("Error: Expected an empty node with one mesh child or a single mesh object.") | CODE |
| MEDIUM⚡ | addon.py | 3659 | print("Error: Expected an empty node with one mesh child or a single mesh object.") | CODE |
| MEDIUM⚡ | addon.py | 4869 | print(f"An error occurred: {e}") | CODE |
| MEDIUM | addon.py | 1581 | print(f"Error in handler: {str(e)}") | CODE |
| MEDIUM | addon.py | 1644 | print(f"Error in get_scene_info: {str(e)}") | CODE |
| MEDIUM | addon.py | 1701 | print(f"Error draining manual edits: {str(e)}") | CODE |
| MEDIUM | addon.py | 2006 | print(f"Error in get_world_state_snapshot: {str(e)}") | CODE |
| MEDIUM | addon.py | 3389 | print(f"Error in set_texture: {str(e)}") | CODE |
| MEDIUM | addon.py | 3623 | print("Error: No objects were imported.") | CODE |
| MEDIUM | addon.py | 3636 | print("Error: Expected an empty node with one mesh child or a single mesh object.") | CODE |
| MEDIUM | addon.py | 939 | def _operator_stack(self): | CODE |
| MEDIUM | addon.py | 978 | def _record_operator(self, op): | CODE |
| MEDIUM | addon.py | 2821 | def download_polyhaven_asset(self, asset_id, asset_type, resolution="1k", file_f | CODE |
| MEDIUM | addon.py | 5195 | def _premium_prefs(): | CODE |
| MEDIUM | addon.py | 5247 | def _premium_tag_redraw(): | CODE |
| MEDIUM | addon.py | 5300 | def _premium_format_date(value): | CODE |
| LOW⚡ | addon.py | 994 | except Exception as e: | CODE |
| LOW⚡ | addon.py | 1003 | except Exception: | CODE |
| LOW⚡ | addon.py | 1012 | except Exception: | CODE |
| LOW⚡ | addon.py | 1081 | except Exception: | CODE |
| LOW⚡ | addon.py | 1109 | except Exception: | CODE |
| LOW⚡ | addon.py | 1381 | except Exception as e: | CODE |
| LOW⚡ | addon.py | 1384 | except Exception as e: | CODE |
| LOW⚡ | addon.py | 1410 | except Exception as e: | CODE |
| LOW⚡ | addon.py | 1417 | except Exception: | CODE |
| LOW⚡ | addon.py | 1461 | except Exception as e: | CODE |
| LOW⚡ | addon.py | 1464 | except Exception as e: | CODE |
| LOW⚡ | addon.py | 1481 | except Exception as e: | CODE |
| LOW⚡ | addon.py | 2294 | except Exception: | CODE |
| LOW⚡ | addon.py | 2298 | except Exception: | CODE |
| LOW⚡ | addon.py | 2305 | except Exception: | CODE |
| LOW⚡ | addon.py | 2314 | except Exception: | CODE |
| LOW⚡ | addon.py | 2319 | except Exception: | CODE |
| LOW⚡ | addon.py | 3669 | except Exception as e: | CODE |
| LOW⚡ | addon.py | 4868 | except Exception as e: | CODE |
| LOW⚡ | addon.py | 6098 | except Exception as e: | CODE |
| LOW | addon.py | 783 | except Exception: | CODE |
| LOW | addon.py | 942 | except Exception: | CODE |
| LOW | addon.py | 1027 | except Exception: | CODE |
| LOW | addon.py | 1300 | except Exception as e: | CODE |
| LOW | addon.py | 1313 | except Exception: | CODE |
| LOW | addon.py | 1334 | except Exception: | CODE |
| LOW | addon.py | 1338 | except Exception: | CODE |
| LOW | addon.py | 1580 | except Exception as e: | CODE |
| LOW | addon.py | 1643 | except Exception as e: | CODE |
| LOW | addon.py | 1700 | except Exception as e: | CODE |
| LOW | addon.py | 1733 | except Exception: | CODE |
| LOW | addon.py | 1826 | except Exception: | CODE |
| LOW | addon.py | 1860 | except Exception: | CODE |
| LOW | addon.py | 1871 | except Exception: | CODE |
| LOW | addon.py | 2005 | except Exception as e: | CODE |
| LOW | addon.py | 2146 | except Exception as offscreen_err: | CODE |
| LOW | addon.py | 2175 | except Exception as e: | CODE |
| 288 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | addon.py | 5253 | except Exception: | CODE |
| HIGH | addon.py | 1313 | except Exception: | CODE |
| HIGH | addon.py | 2612 | except Exception: | CODE |
| HIGH | addon.py | 1320 | except: | CODE |
| HIGH | addon.py | 1334 | except Exception: | CODE |
| HIGH | addon.py | 1338 | except Exception: | CODE |
| HIGH | addon.py | 1353 | except: | CODE |
| HIGH | addon.py | 1471 | except: | CODE |
| HIGH | addon.py | 2294 | except Exception: | CODE |
| HIGH | addon.py | 2298 | except Exception: | CODE |
| HIGH | addon.py | 2450 | except Exception: | CODE |
| HIGH | addon.py | 2305 | except Exception: | CODE |
| HIGH | addon.py | 1452 | except (json.JSONDecodeError, UnicodeDecodeError): | CODE |
| HIGH | addon.py | 2314 | except Exception: | CODE |
| HIGH | addon.py | 2319 | except Exception: | CODE |
| HIGH | addon.py | 2379 | except Exception: | CODE |
| HIGH | addon.py | 2423 | except Exception: | CODE |
| HIGH | tests/test_polypizza.py | 193 | except ValueError: | CODE |
| HIGH | tests/test_polypizza.py | 383 | except ValueError: | CODE |
| HIGH | tests/test_polypizza.py | 391 | except ValueError: | CODE |
| HIGH | tests/test_server_threading.py | 207 | except OSError: | CODE |
| HIGH | src/blender_mcp/server.py | 678 | except Exception: | CODE |
| HIGH | src/blender_mcp/server.py | 735 | except Exception: | CODE |
| HIGH | src/blender_mcp/server.py | 769 | except Exception: | CODE |
| HIGH | src/blender_mcp/server.py | 784 | except Exception: | CODE |
| HIGH | src/blender_mcp/telemetry_decorator.py | 138 | except Exception: | CODE |
| HIGH | src/blender_mcp/generation.py | 345 | except Exception: | CODE |
| HIGH | src/blender_mcp/context_log.py | 86 | except Exception: | CODE |
| HIGH | src/blender_mcp/openai_apps.py | 177 | except Exception: | CODE |
| HIGH | src/blender_mcp/bundled/addon.py | 5253 | except Exception: | CODE |
| HIGH | src/blender_mcp/bundled/addon.py | 1313 | except Exception: | CODE |
| HIGH | src/blender_mcp/bundled/addon.py | 2612 | except Exception: | CODE |
| HIGH | src/blender_mcp/bundled/addon.py | 1320 | except: | CODE |
| HIGH | src/blender_mcp/bundled/addon.py | 1334 | except Exception: | CODE |
| HIGH | src/blender_mcp/bundled/addon.py | 1338 | except Exception: | CODE |
| HIGH | src/blender_mcp/bundled/addon.py | 1353 | except: | CODE |
| HIGH | src/blender_mcp/bundled/addon.py | 1471 | except: | CODE |
| HIGH | src/blender_mcp/bundled/addon.py | 2294 | except Exception: | CODE |
| HIGH | src/blender_mcp/bundled/addon.py | 2298 | except Exception: | CODE |
| HIGH | src/blender_mcp/bundled/addon.py | 2450 | except Exception: | CODE |
| HIGH | src/blender_mcp/bundled/addon.py | 2305 | except Exception: | CODE |
| HIGH | src/blender_mcp/bundled/addon.py | 1452 | except (json.JSONDecodeError, UnicodeDecodeError): | CODE |
| HIGH | src/blender_mcp/bundled/addon.py | 2314 | except Exception: | CODE |
| HIGH | src/blender_mcp/bundled/addon.py | 2319 | except Exception: | CODE |
| HIGH | src/blender_mcp/bundled/addon.py | 2379 | except Exception: | CODE |
| HIGH | src/blender_mcp/bundled/addon.py | 2423 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | addon.py | 2397 | base_props = set(bpy.types.Node.bl_rna.properties.keys()) | CODE |
| CRITICAL | addon.py | 3158 | bpy.context.scene.collection.children.link(collection) | CODE |
| CRITICAL | tests/test_safe_mode.py | 64 | "bpy.context.active_object.data.materials.append(mat)\n" | CODE |
| CRITICAL | tests/test_safe_mode.py | 195 | "sd = bpy.context.preferences.filepaths.script_directories.new()\n" | CODE |
| CRITICAL⚡ | tests/test_polyhaven.py | 1784 | addon.bpy.context.scene.collection.children.link(mine) | CODE |
| CRITICAL | src/blender_mcp/bundled/addon.py | 2397 | base_props = set(bpy.types.Node.bl_rna.properties.keys()) | CODE |
| CRITICAL | src/blender_mcp/bundled/addon.py | 3158 | bpy.context.scene.collection.children.link(collection) | CODE |
| CRITICAL | src/blender_mcp/guides/rigging.md | 37 | bpy.context.scene.collection.objects.link(rig) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | addon.py | 821 | CODE | |
| LOW | addon.py | 5054 | CODE | |
| LOW | addon.py | 5247 | CODE | |
| LOW | addon.py | 5601 | CODE | |
| LOW | addon.py | 998 | CODE | |
| LOW | addon.py | 1422 | CODE | |
| LOW | addon.py | 1771 | CODE | |
| LOW | addon.py | 1830 | CODE | |
| LOW | addon.py | 2278 | CODE | |
| LOW | addon.py | 2334 | CODE | |
| LOW | addon.py | 2569 | CODE | |
| LOW | addon.py | 2659 | CODE | |
| LOW | addon.py | 2945 | CODE | |
| LOW | addon.py | 3166 | CODE | |
| LOW | addon.py | 3608 | CODE | |
| LOW | addon.py | 3685 | CODE | |
| LOW | addon.py | 4029 | CODE | |
| LOW | addon.py | 4373 | CODE | |
| LOW | addon.py | 4721 | CODE | |
| LOW | addon.py | 4791 | CODE | |
| LOW | addon.py | 4961 | CODE | |
| LOW | addon.py | 5864 | CODE | |
| LOW | addon.py | 2404 | CODE | |
| LOW | tests/test_compat_matrix.py | 66 | CODE | |
| LOW | tests/test_compat_matrix.py | 80 | CODE | |
| LOW | tests/test_compat_matrix.py | 265 | CODE | |
| LOW | tests/test_server_threading.py | 169 | CODE | |
| LOW | src/blender_mcp/server.py | 270 | CODE | |
| LOW | src/blender_mcp/server.py | 979 | CODE | |
| LOW | src/blender_mcp/server.py | 1028 | CODE | |
| LOW | src/blender_mcp/server.py | 1818 | CODE | |
| LOW | src/blender_mcp/server.py | 1931 | CODE | |
| LOW | src/blender_mcp/server.py | 142 | CODE | |
| LOW | src/blender_mcp/update_cli.py | 101 | CODE | |
| LOW | src/blender_mcp/update_cli.py | 141 | CODE | |
| LOW | src/blender_mcp/trajectory.py | 452 | CODE | |
| LOW | src/blender_mcp/trajectory.py | 646 | CODE | |
| LOW | src/blender_mcp/trajectory.py | 1071 | CODE | |
| LOW | src/blender_mcp/trajectory.py | 1144 | CODE | |
| LOW | src/blender_mcp/trajectory.py | 1218 | CODE | |
| LOW | src/blender_mcp/safe_mode.py | 507 | CODE | |
| LOW | src/blender_mcp/safe_mode.py | 939 | CODE | |
| LOW | src/blender_mcp/addon_manager.py | 250 | CODE | |
| LOW | src/blender_mcp/setup_cli.py | 246 | CODE | |
| LOW | src/blender_mcp/setup_cli.py | 555 | CODE | |
| LOW | src/blender_mcp/bundled/addon.py | 821 | CODE | |
| LOW | src/blender_mcp/bundled/addon.py | 5054 | CODE | |
| LOW | src/blender_mcp/bundled/addon.py | 5247 | CODE | |
| LOW | src/blender_mcp/bundled/addon.py | 5601 | CODE | |
| LOW | src/blender_mcp/bundled/addon.py | 998 | CODE | |
| LOW | src/blender_mcp/bundled/addon.py | 1422 | CODE | |
| LOW | src/blender_mcp/bundled/addon.py | 1771 | CODE | |
| LOW | src/blender_mcp/bundled/addon.py | 1830 | CODE | |
| LOW | src/blender_mcp/bundled/addon.py | 2278 | CODE | |
| LOW | src/blender_mcp/bundled/addon.py | 2334 | CODE | |
| LOW | src/blender_mcp/bundled/addon.py | 2569 | CODE | |
| LOW | src/blender_mcp/bundled/addon.py | 2659 | CODE | |
| LOW | src/blender_mcp/bundled/addon.py | 2945 | CODE | |
| LOW | src/blender_mcp/bundled/addon.py | 3166 | CODE | |
| LOW | src/blender_mcp/bundled/addon.py | 3608 | CODE | |
| 8 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | addon.py | 2266 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | addon.py | 2275 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/blender_mcp/setup_cli.py | 77 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | src/blender_mcp/setup_cli.py | 79 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | src/blender_mcp/setup_cli.py | 237 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | src/blender_mcp/setup_cli.py | 239 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | src/blender_mcp/setup_cli.py | 386 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | src/blender_mcp/setup_cli.py | 388 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | src/blender_mcp/setup_cli.py | 523 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | src/blender_mcp/setup_cli.py | 525 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | src/blender_mcp/setup_cli.py | 719 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | src/blender_mcp/setup_cli.py | 721 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | src/blender_mcp/bundled/addon.py | 2266 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/blender_mcp/bundled/addon.py | 2275 | # ------------------------------------------------------------------ | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/conftest.py | 6 | CODE | |
| LOW | tests/test_setup_cli.py | 3 | CODE | |
| LOW | tests/test_export_scene.py | 2 | CODE | |
| LOW | tests/test_export_scene.py | 4 | CODE | |
| LOW | tests/test_safe_mode.py | 9 | CODE | |
| LOW | tests/test_addon_manager.py | 3 | CODE | |
| LOW | tests/test_addon_manager.py | 8 | CODE | |
| LOW | tests/test_addon_autostart.py | 7 | CODE | |
| LOW | tests/test_context_log.py | 3 | CODE | |
| LOW | tests/test_socket_unicode.py | 20 | CODE | |
| LOW | tests/test_server_threading.py | 13 | CODE | |
| LOW | tests/test_server_threading.py | 18 | CODE | |
| LOW | tests/test_update_cli.py | 3 | CODE | |
| LOW | src/blender_mcp/update_cli.py | 12 | CODE | |
| LOW | src/blender_mcp/__init__.py | 17 | CODE | |
| LOW | src/blender_mcp/__init__.py | 17 | CODE | |
| LOW | src/blender_mcp/trajectory.py | 8 | CODE | |
| LOW | src/blender_mcp/safe_mode.py | 56 | CODE | |
| LOW | src/blender_mcp/addon_manager.py | 10 | CODE | |
| LOW | src/blender_mcp/setup_cli.py | 13 | CODE | |
| LOW | src/blender_mcp/openai_apps.py | 20 | CODE | |
| LOW | src/blender_mcp/consent_prompt.py | 17 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | addon.py | 2242 | # Create a local namespace for execution | COMMENT |
| MEDIUM | addon.py | 6015 | # Create a new server instance | COMMENT |
| MEDIUM | src/blender_mcp/server.py | 353 | # Create the MCP server with lifespan support | COMMENT |
| MEDIUM | src/blender_mcp/server.py | 414 | # Create a new connection if needed | COMMENT |
| MEDIUM | src/blender_mcp/bundled/addon.py | 2242 | # Create a local namespace for execution | COMMENT |
| MEDIUM | src/blender_mcp/bundled/addon.py | 6015 | # Create a new server instance | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | addon.py | 281 | COMMENT | |
| LOW | addon.py | 301 | # _polyhaven_blend_version. | COMMENT |
| LOW | install.sh | 1 | #!/bin/sh | COMMENT |
| LOW | src/blender_mcp/server.py | 521 | ) | COMMENT |
| LOW | src/blender_mcp/trajectory.py | 21 | import httpx | COMMENT |
| LOW | src/blender_mcp/trajectory.py | 41 | # last row, and snapshots include mesh counts, material/world fingerprints and | COMMENT |
| LOW | src/blender_mcp/trajectory.py | 61 | IDLE_EPISODE_TIMEOUT = 600.0 | COMMENT |
| LOW | src/blender_mcp/trajectory.py | 81 | # that shifts as objects are created, so before/after kept *different* arbitrary | COMMENT |
| LOW | src/blender_mcp/safe_mode.py | 681 | # Writing to a stored-expression attribute is what arms a driver. | COMMENT |
| LOW | src/blender_mcp/bundled/addon.py | 281 | COMMENT | |
| LOW | src/blender_mcp/bundled/addon.py | 301 | # _polyhaven_blend_version. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | addon.py | 3719 | # Close the file | COMMENT |
| LOW | addon.py | 3785 | # Close the file | COMMENT |
| LOW | src/blender_mcp/server.py | 160 | # Check if we've received a complete JSON object | COMMENT |
| LOW | src/blender_mcp/telemetry.py | 81 | # Check if disabled via environment variables | COMMENT |
| LOW | src/blender_mcp/bundled/addon.py | 3719 | # Close the file | COMMENT |
| LOW | src/blender_mcp/bundled/addon.py | 3785 | # Close the file | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_tool_schemas.py | 4 | "default": null}, and a client that sends that default explicitly (some | STRING |
| HIGH | tests/test_tool_schemas.py | 5 | agent frameworks fill every optional field with null) gets a validation | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | addon.py | 3605 | CODE | |
| LOW | src/blender_mcp/server.py | 1561 | CODE | |
| LOW | src/blender_mcp/server.py | 1715 | CODE | |
| LOW | src/blender_mcp/server.py | 1818 | CODE | |
| LOW | src/blender_mcp/trajectory.py | 955 | CODE | |
| LOW | src/blender_mcp/trajectory.py | 1071 | CODE | |
| LOW | src/blender_mcp/bundled/addon.py | 3605 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/blender_mcp/server.py | 1018 | # an agentic session nobody opens the sidebar - the chat is the only | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/blender_mcp/safe_mode.py | 62 | __all__ = [ | CODE |