MCP server for Atlassian tools (Confluence, Jira)
This report summarizes scanner evidence for sooperset/mcp-atlassian, a Python project with 5,985 GitHub stars. SynthScan examined 128,939 lines of code across 375 source files, recording 4166 pattern matches distributed across 21 syntactic categories. The legacy adjusted pattern signal is 40.8 (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? 3285 finding(s).
Are imports declared and package/API names verified? 309 finding(s).
Are wrappers, guards, and repeated structures necessary? 3375 finding(s).
Which changes need focused human review? 4166 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 4166 distinct pattern matches across 21 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⚡ | tests/conftest.py | 334 | def validate_test_environment(): | CODE |
| LOW | tests/README.md | 131 | def test_existing_functionality(jira_issue_data, confluence_page_data): | CODE |
| LOW | tests/README.md | 179 | def test_issue_key_validation(make_jira_issue): | CODE |
| LOW | tests/README.md | 184 | def test_issue_key_validation(complete_jira_issue_data): | CODE |
| LOW | tests/README.md | 271 | def test_real_api_integration( | CODE |
| LOW | tests/unit/test_truststore_env.py | 13 | def _should_inject_truststore(env_value: str | None, dotenv_value: str | None) -> bool: | CODE |
| LOW | tests/unit/test_truststore_env.py | 100 | def test_none_dotenv_value_does_not_crash(self) -> None: | CODE |
| LOW | tests/unit/test_truststore_env.py | 112 | def test_import_time_with_env_false(self) -> None: | CODE |
| LOW | tests/unit/test_truststore_env.py | 150 | def test_import_time_with_env_no(self) -> None: | CODE |
| LOW | tests/unit/test_truststore_env.py | 167 | def test_import_time_default_enables_truststore(self) -> None: | CODE |
| LOW | tests/unit/test_truststore_env.py | 186 | def test_import_time_dotenv_none_does_not_crash(self) -> None: | CODE |
| LOW | tests/unit/test_mcp_wire_probe.py | 41 | def test_staging_profile_rejects_invalid_rate(value: str) -> None: | CODE |
| LOW | tests/unit/test_mcp_wire_probe.py | 49 | def test_staging_profile_requires_values_without_echoing_secrets() -> None: | CODE |
| LOW | tests/unit/test_mcp_wire_probe.py | 61 | def test_staging_profile_passes_only_approved_environment() -> None: | CODE |
| LOW | tests/unit/test_mcp_wire_probe.py | 85 | def test_staging_tool_gate_requires_exact_read_allowlist() -> None: | CODE |
| LOW⚡ | tests/unit/test_mcp_wire_probe.py | 118 | def test_expected_protocol_version_accepts_matching_lane() -> None: | CODE |
| LOW⚡ | tests/unit/test_mcp_wire_probe.py | 124 | def test_expected_protocol_version_rejects_mismatch() -> None: | CODE |
| LOW⚡ | tests/unit/test_mcp_wire_probe.py | 130 | def test_tool_expectations_accept_matching_listing() -> None: | CODE |
| LOW⚡ | tests/unit/test_mcp_wire_probe.py | 139 | def test_tool_expectations_reject_missing_expected_tool() -> None: | CODE |
| LOW⚡ | tests/unit/test_mcp_wire_probe.py | 149 | def test_tool_expectations_reject_visible_hidden_tool() -> None: | CODE |
| LOW⚡ | tests/unit/test_mcp_wire_probe.py | 159 | def test_tool_expectations_reject_contradictory_configuration() -> None: | CODE |
| LOW⚡ | tests/unit/test_mcp_wire_probe.py | 169 | def test_installed_versions_are_sanitized_and_tolerate_missing_package() -> None: | CODE |
| LOW | tests/unit/test_mcp_wire_probe.py | 194 | def test_result_record_omits_response_content() -> None: | CODE |
| LOW⚡ | tests/unit/test_exceptions.py | 15 | def test_instantiation_without_message(self): | CODE |
| LOW⚡ | tests/unit/test_exceptions.py | 24 | def test_instantiation_with_message(self): | CODE |
| LOW⚡ | tests/unit/test_exceptions.py | 34 | def test_instantiation_with_multiple_args(self): | CODE |
| LOW | tests/unit/test_exceptions.py | 46 | def test_inheritance_hierarchy(self): | CODE |
| LOW | tests/unit/test_exceptions.py | 56 | def test_string_representation(self): | CODE |
| LOW⚡ | tests/unit/test_exceptions.py | 74 | def test_exception_raising_and_catching(self): | CODE |
| LOW⚡ | tests/unit/test_exceptions.py | 84 | def test_exception_catching_as_base_exception(self): | CODE |
| LOW⚡ | tests/unit/test_exceptions.py | 94 | def test_exception_chaining_with_cause(self): | CODE |
| LOW | tests/unit/test_exceptions.py | 110 | def test_exception_chaining_with_context(self): | CODE |
| LOW | tests/unit/test_exceptions.py | 125 | def test_exception_suppressed_context(self): | CODE |
| LOW | tests/unit/test_exceptions.py | 141 | def test_serialization_with_pickle(self): | CODE |
| LOW | tests/unit/test_exceptions.py | 156 | def test_exception_attributes_access(self): | CODE |
| LOW | tests/unit/test_exceptions.py | 184 | def test_realistic_authentication_scenarios(self): | CODE |
| LOW | tests/unit/test_docker_versioning.py | 6 | def test_dockerfile_injects_version_before_project_install() -> None: | CODE |
| LOW | tests/unit/test_docker_versioning.py | 21 | def test_docker_workflow_passes_version_and_guards_manual_tag() -> None: | CODE |
| LOW⚡ | tests/unit/test_generate_tool_docs.py | 46 | def test_escape_mdx_in_table_handles_json_braces( | CODE |
| LOW⚡ | tests/unit/test_generate_tool_docs.py | 54 | def test_upload_attachment_override_matches_tool_parameter() -> None: | CODE |
| LOW⚡ | tests/unit/test_generate_tool_docs.py | 64 | def test_tool_override_preserves_legacy_positional_fields() -> None: | CODE |
| LOW | tests/unit/test_generate_tool_docs.py | 81 | def test_attachment_and_jira_guidance_are_preserved_in_overrides() -> None: | CODE |
| LOW | tests/unit/test_generate_tool_docs.py | 97 | def _render_override_category( | CODE |
| LOW | tests/unit/test_generate_tool_docs.py | 138 | def test_jira_create_metadata_guidance_survives_page_regeneration( | CODE |
| LOW | tests/unit/test_generate_tool_docs.py | 157 | def test_upload_attachment_examples_survive_page_regeneration( | CODE |
| LOW | tests/unit/test_generate_tool_docs.py | 229 | def test_restored_examples_survive_page_regeneration( | CODE |
| LOW | tests/unit/test_generate_tool_docs.py | 261 | def test_cloud_only_guidance_survives_page_regeneration( | CODE |
| LOW | tests/unit/test_generate_tool_docs.py | 307 | def test_category_template_renders_notes_and_safe_nested_json() -> None: | CODE |
| LOW | tests/unit/test_generate_tool_docs.py | 406 | def test_check_counts_rejects_valid_number_in_wrong_context( | CODE |
| LOW | tests/unit/test_generate_tool_docs.py | 439 | def test_check_mode_rejects_stale_warning_core_toolset_count( | CODE |
| LOW | tests/unit/test_generate_tool_docs.py | 484 | def test_check_generated_pages_detects_stale_toolset_membership( | CODE |
| LOW | tests/unit/test_main_transport_selection.py | 30 | def test_http_transports_use_direct_execution( | CODE |
| LOW | tests/unit/test_main_transport_selection.py | 55 | def test_stdio_transport_uses_stdin_guard(self, mock_server, mock_asyncio_run): | CODE |
| LOW | tests/unit/test_main_transport_selection.py | 96 | def test_stateless_rejects_non_streamable_http(self, mock_asyncio_run, transport): | CODE |
| LOW | tests/unit/test_main_transport_selection.py | 106 | def test_cli_overrides_env_transport(self, mock_server, mock_asyncio_run): | CODE |
| LOW | tests/unit/test_main_transport_selection.py | 122 | async def test_stdio_guard_cancels_server_when_parent_exits(self): | CODE |
| LOW | tests/unit/test_main_transport_selection.py | 148 | def test_signal_handlers_always_setup(self, mock_server): | CODE |
| LOW | tests/unit/test_main_transport_selection.py | 164 | def test_error_handling_preserved(self, mock_server): | CODE |
| LOW | tests/unit/test_stdin_monitoring_fix.py | 15 | def test_streamable_http_starts_without_hanging(self): | CODE |
| LOW | tests/unit/test_stdin_monitoring_fix.py | 65 | def test_code_structure_validates_fix(self): | STRING |
| 2734 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | CONTRIBUTING.md | 111 | Summary of function purpose. More detailed description if needed. Args: param1 | STRING |
| HIGH | src/mcp_atlassian/utils/env.py | 144 | Parse custom headers from environment variable containing comma-separated key=value pairs. Args: env_var_na | STRING |
| HIGH | src/mcp_atlassian/utils/io.py | 27 | Validate that a path does not escape the base directory. Resolves symlinks and normalizes the path to prevent path | STRING |
| HIGH | src/mcp_atlassian/models/base.py | 32 | Convert an API response to a model instance. Args: data: The API response data | STRING |
| HIGH | src/mcp_atlassian/jira/issues.py | 91 | Get a Jira issue by key. Args: issue_key: The issue key (e.g., PROJECT-123) ex | STRING |
| HIGH | src/mcp_atlassian/jira/issues.py | 608 | Create a new Jira issue. Args: project_key: The key of the project summary: Th | STRING |
| HIGH | src/mcp_atlassian/jira/issues.py | 1230 | Update a Jira issue. Args: issue_key: The key of the issue to update fields: D | STRING |
| HIGH | src/mcp_atlassian/jira/issues.py | 1454 | Assign a Jira issue to a user using the dedicated assignment endpoint. Unlike update_issue (which sets | STRING |
| HIGH | src/mcp_atlassian/jira/issues.py | 1520 | Update an issue with a status change. Args: issue_key: The key of the issue to update | STRING |
| HIGH | src/mcp_atlassian/jira/issues.py | 1658 | Delete a Jira issue. Args: issue_key: The key of the issue to delete Returns: | STRING |
| HIGH | src/mcp_atlassian/jira/issues.py | 1679 | Move a Jira issue to a different project. Uses Jira Cloud's bulk move API. The issue can be assigned a | STRING |
| HIGH | src/mcp_atlassian/jira/issues.py | 1916 | Get raw transition data from the Jira API. This is an internal method that returns unprocessed transit | STRING |
| HIGH | src/mcp_atlassian/jira/issues.py | 1942 | Transition an issue to a new status. Args: issue_key: The key of the issue tra | STRING |
| HIGH | src/mcp_atlassian/jira/issues.py | 1969 | Create multiple Jira issues in a batch. Args: issues: List of issue dictionaries, each containing: | STRING |
| HIGH | src/mcp_atlassian/jira/metrics.py | 35 | Get raw date information for a single Jira issue. Args: issue_key: The issue key (e.g., PR | STRING |
| HIGH | src/mcp_atlassian/jira/metrics.py | 373 | Format minutes into human-readable string. Examples: - 90 -> "1h 30m" - 1500 -> "1d 1h | STRING |
| HIGH | src/mcp_atlassian/jira/sprints.py | 134 | Add issues to a sprint. Args: sprint_id: The sprint ID to add issues to. issue_keys: Li | STRING |
| HIGH | src/mcp_atlassian/jira/sprints.py | 153 | Move issues to the backlog (removes them from any sprint). Args: issue_keys: List of issue keys to | STRING |
| HIGH | src/mcp_atlassian/jira/field_options.py | 61 | Get allowed option values for a custom field. Cloud: Uses the Field Context Option API with pagination. | STRING |
| HIGH | src/mcp_atlassian/jira/field_options.py | 152 | Get field options via Server/DC createmeta. Uses the new createmeta endpoint introduced in Jira 9.x+: ` | STRING |
| HIGH | src/mcp_atlassian/jira/epics.py | 320 | Link an existing issue to an epic. Args: issue_key: The key of the issue to link (e.g. 'PR | STRING |
| HIGH | src/mcp_atlassian/jira/epics.py | 457 | Get all issues linked to a specific epic. Args: epic_key: The key of the epic (e.g. 'PROJ- | STRING |
| HIGH | src/mcp_atlassian/jira/epics.py | 872 | Update Epic-specific fields after Epic creation. This method implements the second step of the two-ste | STRING |
| HIGH | src/mcp_atlassian/jira/forms_api.py | 56 | Make a request to the Forms API. Supports all authentication types: OAuth, PAT, and Basic Auth. Args: | STRING |
| HIGH | src/mcp_atlassian/jira/forms_api.py | 170 | Get all forms associated with an issue. Args: issue_key: The issue key (e.g. 'PROJ-123') R | STRING |
| HIGH | src/mcp_atlassian/jira/forms_api.py | 215 | Get detailed information about a specific form. Args: issue_key: The issue key (e.g. 'PROJ-123') | STRING |
| HIGH | src/mcp_atlassian/jira/forms_api.py | 251 | Update form field answers directly via the Forms API. **Known Limitation - DATETIME fields:** The Jira | STRING |
| HIGH | src/mcp_atlassian/jira/forms_api.py | 331 | Add a form template to an issue. Args: issue_key: The issue key (e.g. 'PROJ-123') templ | STRING |
| HIGH | src/mcp_atlassian/jira/forms_api.py | 379 | Get attachment metadata for a form. Args: issue_key: The issue key (e.g. 'PROJ-123') fo | STRING |
| HIGH | src/mcp_atlassian/jira/worklog.py | 74 | Add a worklog entry to a Jira issue. Args: issue_key: The issue key (e.g. 'PROJ-123') | STRING |
| HIGH | src/mcp_atlassian/jira/worklog.py | 205 | Get all worklog entries for an issue. Args: issue_key: The issue key (e.g. 'PROJ-123') | STRING |
| HIGH | src/mcp_atlassian/jira/project_analysis.py | 86 | Group a project's epics under their cross-project parent issues. Fetches all epics in *project_key*, inspects t | STRING |
| HIGH | src/mcp_atlassian/jira/project_analysis.py | 167 | Find all cross-project issue links for a project. Scans issues in *project_key*, extracts every issue link whos | STRING |
| HIGH | src/mcp_atlassian/jira/users.py | 122 | Get the account ID for a username or account ID. Args: assignee: Username, display name, e | STRING |
| HIGH | src/mcp_atlassian/jira/users.py | 380 | Determines the correct API parameter and value for the jira.user() call based on the identifier and instance ty | STRING |
| HIGH | src/mcp_atlassian/jira/users.py | 482 | Search Jira users assignable in a given project or issue. Uses GET /rest/api/2/user/assignable/search | STRING |
| HIGH | src/mcp_atlassian/jira/users.py | 554 | Retrieve Jira user profile information by identifier. Args: identifier: User identifier (a | STRING |
| HIGH | src/mcp_atlassian/jira/protocols.py | 129 | Update Epic-specific fields after Epic creation. This method implements the second step of the two-ste | STRING |
| HIGH | src/mcp_atlassian/jira/protocols.py | 273 | Get the account ID for a username. Args: assignee: Username or account ID issue_key: Op | STRING |
| HIGH | src/mcp_atlassian/jira/client.py | 406 | Repeatly fetch paged data from Jira API using `nextPageToken` to paginate. Args: method: T | STRING |
| HIGH | src/mcp_atlassian/jira/watchers.py | 75 | Remove a user from watching an issue. Args: issue_key: The issue key (e.g. 'PROJ-123'). | STRING |
| HIGH | src/mcp_atlassian/jira/forms_common.py | 21 | Convert HTTPError to appropriate exception for form operations. Args: error: The HTTPError to handle | STRING |
| HIGH | src/mcp_atlassian/jira/forms_common.py | 52 | Convert ISO 8601 datetime strings to Unix timestamps in milliseconds for ProForma forms. This function automat | STRING |
| HIGH | src/mcp_atlassian/jira/links.py | 92 | Create a link between two issues. Args: data: A dictionary containing the link data with t | STRING |
| HIGH | src/mcp_atlassian/jira/links.py | 163 | Create a remote issue link (web link or Confluence link). Args: issue_key: The key of the | STRING |
| HIGH | src/mcp_atlassian/jira/links.py | 229 | Get remote links (web links, Confluence links) for an issue. Args: issue_key: The issue key (e.g., | STRING |
| HIGH | src/mcp_atlassian/jira/links.py | 264 | Remove a link between two issues. Args: link_id: The ID of the link to remove Ret | STRING |
| HIGH | src/mcp_atlassian/jira/development.py | 25 | Get development information (PRs, commits, branches) for a Jira issue. This uses the /rest/dev-status/ | STRING |
| HIGH | src/mcp_atlassian/jira/forms.py | 19 | Get all ProForma forms associated with an issue. Args: issue_key: The issue key (e.g. 'PRO | STRING |
| HIGH | src/mcp_atlassian/jira/forms.py | 67 | Get detailed information about a specific ProForma form. Args: issue_key: The issue key (e | STRING |
| HIGH | src/mcp_atlassian/jira/forms.py | 114 | Reopen a submitted ProForma form to allow editing. Args: issue_key: The issue key (e.g. 'P | STRING |
| HIGH | src/mcp_atlassian/jira/forms.py | 152 | Submit a ProForma form after making changes. Args: issue_key: The issue key (e.g. 'PROJ-12 | STRING |
| HIGH | src/mcp_atlassian/jira/forms.py | 188 | Update a field in a ProForma form by updating the associated Jira field. This method works by updating | STRING |
| HIGH | src/mcp_atlassian/jira/transitions.py | 21 | Get the available status transitions for an issue. Args: issue_key: The issue key (e.g. 'P | STRING |
| HIGH | src/mcp_atlassian/jira/transitions.py | 127 | Transition a Jira issue to a new status. Note on Jira Cloud comments: On Jira Cloud, comme | STRING |
| HIGH | src/mcp_atlassian/jira/sla.py | 52 | Calculate SLA metrics for a single Jira issue. Args: issue_key: The issue key (e.g., PROJE | STRING |
| HIGH | src/mcp_atlassian/jira/search.py | 86 | Search for issues using JQL (Jira Query Language). Args: jql: JQL query string | STRING |
| HIGH | src/mcp_atlassian/jira/search.py | 232 | Get all issues linked to a specific board. Args: board_id: The ID of the board | STRING |
| HIGH | src/mcp_atlassian/jira/search.py | 301 | Get all issues linked to a specific sprint. Args: sprint_id: The ID of the sprint | STRING |
| HIGH | src/mcp_atlassian/jira/boards.py | 25 | Get boards from Jira by name, project key, or type. Args: board_name: The name of board, s | STRING |
| 106 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/conftest.py | 39 | # ============================================================================ | COMMENT |
| MEDIUM | tests/conftest.py | 41 | # ============================================================================ | COMMENT |
| MEDIUM | tests/conftest.py | 101 | # ============================================================================ | COMMENT |
| MEDIUM | tests/conftest.py | 103 | # ============================================================================ | COMMENT |
| MEDIUM | tests/conftest.py | 140 | # ============================================================================ | COMMENT |
| MEDIUM | tests/conftest.py | 142 | # ============================================================================ | COMMENT |
| MEDIUM | tests/conftest.py | 214 | # ============================================================================ | COMMENT |
| MEDIUM | tests/conftest.py | 216 | # ============================================================================ | COMMENT |
| MEDIUM | tests/conftest.py | 247 | # ============================================================================ | COMMENT |
| MEDIUM | tests/conftest.py | 249 | # ============================================================================ | COMMENT |
| MEDIUM | tests/conftest.py | 276 | # ============================================================================ | COMMENT |
| MEDIUM | tests/conftest.py | 278 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/conftest.py | 328 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/conftest.py | 330 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/unit/test_external_auth.py | 21 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_external_auth.py | 23 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_external_auth.py | 99 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_external_auth.py | 101 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_external_auth.py | 157 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_external_auth.py | 159 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_external_auth.py | 211 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_external_auth.py | 213 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_external_auth.py | 265 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_external_auth.py | 267 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_external_auth.py | 305 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_external_auth.py | 307 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/models/conftest.py | 384 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/unit/models/conftest.py | 386 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/unit/models/conftest.py | 445 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/unit/models/conftest.py | 447 | # ============================================================================ | COMMENT |
| MEDIUM | tests/unit/models/conftest.py | 35 | # ============================================================================ | COMMENT |
| MEDIUM | tests/unit/models/conftest.py | 37 | # ============================================================================ | COMMENT |
| MEDIUM | tests/unit/models/conftest.py | 153 | # ============================================================================ | COMMENT |
| MEDIUM | tests/unit/models/conftest.py | 155 | # ============================================================================ | COMMENT |
| MEDIUM | tests/unit/models/conftest.py | 220 | # ============================================================================ | COMMENT |
| MEDIUM | tests/unit/models/conftest.py | 222 | # ============================================================================ | COMMENT |
| MEDIUM | tests/unit/models/conftest.py | 332 | # ============================================================================ | COMMENT |
| MEDIUM | tests/unit/models/conftest.py | 334 | # ============================================================================ | COMMENT |
| MEDIUM | tests/unit/models/conftest.py | 480 | # ============================================================================ | COMMENT |
| MEDIUM | tests/unit/models/conftest.py | 482 | # ============================================================================ | COMMENT |
| MEDIUM | tests/unit/models/conftest.py | 513 | # ============================================================================ | COMMENT |
| MEDIUM | tests/unit/models/conftest.py | 515 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/unit/jira/conftest.py | 24 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/unit/jira/conftest.py | 26 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/unit/jira/conftest.py | 287 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/unit/jira/conftest.py | 289 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/unit/jira/conftest.py | 405 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/unit/jira/conftest.py | 407 | # ============================================================================ | COMMENT |
| MEDIUM | tests/unit/jira/conftest.py | 65 | # ============================================================================ | COMMENT |
| MEDIUM | tests/unit/jira/conftest.py | 67 | # ============================================================================ | COMMENT |
| MEDIUM | tests/unit/jira/conftest.py | 111 | # ============================================================================ | COMMENT |
| MEDIUM | tests/unit/jira/conftest.py | 113 | # ============================================================================ | COMMENT |
| MEDIUM | tests/unit/jira/conftest.py | 135 | # ============================================================================ | COMMENT |
| MEDIUM | tests/unit/jira/conftest.py | 137 | # ============================================================================ | COMMENT |
| MEDIUM | tests/unit/jira/conftest.py | 233 | # ============================================================================ | COMMENT |
| MEDIUM | tests/unit/jira/conftest.py | 235 | # ============================================================================ | COMMENT |
| MEDIUM | tests/unit/jira/conftest.py | 371 | # ============================================================================ | COMMENT |
| MEDIUM | tests/unit/jira/conftest.py | 373 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/unit/jira/test_field_options.py | 179 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/unit/jira/test_field_options.py | 181 | # ============================================================================ | COMMENT |
| 99 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/unit/test_stdin_monitoring_fix.py | 21 | # Create a test script that simulates the issue | COMMENT |
| MEDIUM | tests/unit/utils/test_ssl.py | 44 | # Create a mock for PoolManager that will be returned by constructor | COMMENT |
| MEDIUM | tests/unit/utils/test_proxy.py | 35 | # Create a proper proxies dictionary that can be updated | COMMENT |
| MEDIUM | tests/unit/utils/test_proxy.py | 66 | # Create a proper proxies dictionary that can be updated | COMMENT |
| MEDIUM | tests/unit/utils/test_proxy.py | 168 | # Create a proper proxies dictionary that can be updated | COMMENT |
| MEDIUM | tests/unit/utils/test_proxy.py | 257 | # Create a proper proxies dictionary that can be updated | COMMENT |
| MEDIUM | tests/unit/models/conftest.py | 530 | # Define the factory functions once for reuse | COMMENT |
| MEDIUM⚡ | tests/unit/models/test_base_models.py | 24 | # Create a test subclass with some fields | COMMENT |
| MEDIUM | tests/unit/jira/test_issues.py | 1628 | # Create the issue with fixVersions in additional_fields | COMMENT |
| MEDIUM | tests/unit/jira/test_issues.py | 2311 | # Create the issue with labels as a list | COMMENT |
| MEDIUM | tests/unit/jira/test_issues.py | 2345 | # Create the issue with labels as a comma-separated string | COMMENT |
| MEDIUM⚡ | tests/unit/jira/test_epics.py | 182 | # Create the fields dict and call the method | COMMENT |
| MEDIUM | tests/unit/jira/test_epics.py | 202 | # Create the fields dict and call the method with basic values | COMMENT |
| MEDIUM | tests/unit/jira/test_epics.py | 450 | # Create a fields dict and call prepare_epic_fields | COMMENT |
| MEDIUM | tests/unit/jira/test_epics.py | 655 | # Create a mock search result object with issues attribute | COMMENT |
| MEDIUM | tests/unit/jira/test_epics.py | 661 | # Create a mock object with an issues attribute | COMMENT |
| MEDIUM | tests/unit/jira/test_epics.py | 812 | # Create a mock class for SearchResult | COMMENT |
| MEDIUM⚡ | tests/unit/jira/test_client_oauth.py | 85 | # Create a mock OAuth config without cloud_id | COMMENT |
| MEDIUM⚡ | tests/unit/jira/test_client_oauth.py | 95 | # Create a Jira config with OAuth | COMMENT |
| MEDIUM⚡ | tests/unit/jira/test_client_oauth.py | 163 | # Create a mock BYO OAuth config | COMMENT |
| MEDIUM⚡ | tests/unit/jira/test_client_oauth.py | 168 | # Create a Jira config with OAuth | COMMENT |
| MEDIUM⚡ | tests/unit/jira/test_client_oauth.py | 213 | # Create a mock BYO OAuth config with an empty cloud_id | COMMENT |
| MEDIUM⚡ | tests/unit/jira/test_client_oauth.py | 218 | # Create a Jira config with OAuth | COMMENT |
| MEDIUM⚡ | tests/unit/jira/test_client_oauth.py | 233 | # Create a mock BYO OAuth config | COMMENT |
| MEDIUM⚡ | tests/unit/jira/test_client_oauth.py | 238 | # Create a Jira config with OAuth | COMMENT |
| MEDIUM⚡ | tests/unit/jira/test_client_oauth.py | 265 | # Create a mock BYO OAuth config with an empty token | COMMENT |
| MEDIUM⚡ | tests/unit/jira/test_client_oauth.py | 271 | # Create a Jira config with OAuth | COMMENT |
| MEDIUM | tests/unit/jira/test_client_oauth.py | 19 | # Create a mock OAuth config with both access and refresh tokens | COMMENT |
| MEDIUM | tests/unit/jira/test_client_oauth.py | 31 | # Create a Jira config with OAuth | COMMENT |
| MEDIUM | tests/unit/jira/test_client_oauth.py | 110 | # Create a mock OAuth config | COMMENT |
| MEDIUM | tests/unit/jira/test_client_oauth.py | 121 | # Create a Jira config with OAuth | COMMENT |
| MEDIUM | tests/unit/jira/test_formatting.py | 15 | # Create the mixin without calling its __init__ to avoid config dependencies | COMMENT |
| MEDIUM | tests/unit/jira/test_attachments.py | 56 | # Create a mock Jira client | COMMENT |
| MEDIUM | tests/unit/jira/test_transitions.py | 25 | # Create a get_issue method to allow returning JiraIssue | COMMENT |
| MEDIUM | tests/unit/confluence/conftest.py | 377 | # Create the mock Confluence instance | COMMENT |
| MEDIUM | tests/unit/confluence/conftest.py | 398 | # Create the client with OAuth config | COMMENT |
| MEDIUM | tests/unit/confluence/conftest.py | 422 | # Create a client with a mocked configuration | COMMENT |
| MEDIUM | tests/unit/confluence/test_pages.py | 1727 | # Create a mock HTTP error response with 401 | COMMENT |
| MEDIUM | tests/unit/confluence/test_pages.py | 1750 | # Create a mock HTTP error response with 500 | COMMENT |
| MEDIUM⚡ | tests/unit/confluence/test_client_oauth.py | 91 | # Create a mock BYO OAuth config | COMMENT |
| MEDIUM⚡ | tests/unit/confluence/test_client_oauth.py | 97 | # Create a Confluence config with BYO OAuth | COMMENT |
| MEDIUM⚡ | tests/unit/confluence/test_client_oauth.py | 148 | # Create a mock BYO OAuth config without cloud_id | COMMENT |
| MEDIUM⚡ | tests/unit/confluence/test_client_oauth.py | 154 | # Create a Confluence config with BYO OAuth | COMMENT |
| MEDIUM⚡ | tests/unit/confluence/test_client_oauth.py | 169 | # Create a mock BYO OAuth config | COMMENT |
| MEDIUM⚡ | tests/unit/confluence/test_client_oauth.py | 175 | # Create a Confluence config with BYO OAuth | COMMENT |
| MEDIUM⚡ | tests/unit/confluence/test_client_oauth.py | 198 | # Create a mock BYO OAuth config | COMMENT |
| MEDIUM⚡ | tests/unit/confluence/test_client_oauth.py | 204 | # Create a Confluence config with BYO OAuth | COMMENT |
| MEDIUM⚡ | tests/unit/confluence/test_client_oauth.py | 230 | # Create a mock OAuth config without cloud_id | COMMENT |
| MEDIUM⚡ | tests/unit/confluence/test_client_oauth.py | 240 | # Create a Confluence config with OAuth | COMMENT |
| MEDIUM | tests/unit/confluence/test_client_oauth.py | 19 | # Create a mock OAuth config | COMMENT |
| MEDIUM | tests/unit/confluence/test_client_oauth.py | 31 | # Create a Confluence config with OAuth | COMMENT |
| MEDIUM | tests/unit/confluence/test_client_oauth.py | 255 | # Create a mock OAuth config | COMMENT |
| MEDIUM | tests/unit/confluence/test_client_oauth.py | 266 | # Create a Confluence config with OAuth | COMMENT |
| MEDIUM⚡ | tests/unit/servers/test_dependencies.py | 2464 | # Create a mock response that simulates a redirect | COMMENT |
| MEDIUM | tests/unit/servers/test_dependencies.py | 599 | # Create a special state mock that controls hasattr() behavior | COMMENT |
| MEDIUM | tests/unit/servers/test_dependencies.py | 852 | # Create a special state mock that controls hasattr() behavior | COMMENT |
| MEDIUM | tests/unit/servers/test_dependencies.py | 1267 | # Create a special state mock that controls hasattr() behavior | COMMENT |
| MEDIUM | tests/unit/servers/test_dependencies.py | 1450 | # Create a special state mock that controls hasattr() behavior | COMMENT |
| MEDIUM | tests/unit/servers/test_main_server.py | 185 | # Create a mock MCP server to avoid warnings | COMMENT |
| MEDIUM | tests/unit/servers/test_jira_server.py | 1355 | # Define the specific fields we expect for this test case | COMMENT |
| 27 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit/test_stdin_monitoring_fix.py | 132 | except Exception as e: | CODE |
| LOW | tests/unit/models/test_confluence_real_data.py | 77 | except Exception as e: | CODE |
| LOW | tests/unit/models/test_confluence_real_data.py | 85 | except Exception as e: | CODE |
| LOW | tests/unit/models/test_jira_real_data.py | 121 | except Exception as e: | CODE |
| LOW | tests/unit/models/test_jira_real_data.py | 157 | except Exception as e: | CODE |
| LOW | tests/unit/models/test_jira_real_data.py | 215 | except Exception as e: | CODE |
| LOW | tests/unit/models/test_jira_real_data.py | 255 | except Exception as e: | CODE |
| MEDIUM | tests/unit/models/test_jira_real_data.py | 32 | def _get_client(self) -> IssuesMixin | None: | CODE |
| LOW | tests/unit/jira/test_issues.py | 282 | except Exception as e: | CODE |
| LOW⚡ | tests/integration/test_real_api.py | 277 | except Exception: # noqa: BLE001 | CODE |
| LOW⚡ | tests/integration/test_real_api.py | 288 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | tests/integration/test_real_api.py | 141 | except Exception: # noqa: BLE001 | CODE |
| LOW | tests/integration/test_real_api.py | 246 | except Exception: # noqa: BLE001 | CODE |
| LOW | tests/integration/test_real_api.py | 448 | except Exception: # noqa: BLE001 | CODE |
| LOW | tests/integration/test_real_api.py | 486 | except Exception: # noqa: BLE001 | CODE |
| LOW | tests/integration/test_real_api.py | 492 | except Exception: # noqa: BLE001 | CODE |
| LOW | tests/integration/test_real_api.py | 698 | except Exception: # noqa: BLE001 | CODE |
| LOW | tests/integration/test_real_api.py | 704 | except Exception: # noqa: BLE001 | CODE |
| LOW | tests/e2e/conftest.py | 153 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | tests/e2e/conftest.py | 159 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | tests/e2e/conftest.py | 328 | except Exception: # noqa: BLE001 | CODE |
| LOW | tests/e2e/conftest.py | 379 | except Exception: # noqa: BLE001 | CODE |
| LOW⚡ | tests/e2e/conftest.py | 484 | except Exception as e: # noqa: BLE001 | CODE |
| LOW⚡ | tests/e2e/conftest.py | 489 | except Exception as e: # noqa: BLE001 | CODE |
| LOW⚡ | tests/e2e/conftest.py | 493 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | tests/e2e/conftest.py | 642 | except Exception as exc: # noqa: BLE001 | CODE |
| LOW | tests/e2e/conftest.py | 655 | except Exception as exc: # noqa: BLE001 | CODE |
| LOW | tests/e2e/cloud/conftest.py | 107 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | tests/e2e/cloud/conftest.py | 113 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | tests/e2e/cloud/conftest.py | 273 | except Exception: # noqa: BLE001 | CODE |
| LOW | tests/e2e/cloud/conftest.py | 324 | except Exception: # noqa: BLE001 | CODE |
| LOW | tests/e2e/cloud/conftest.py | 476 | except Exception as exc: # noqa: BLE001 | CODE |
| LOW | tests/e2e/cloud/conftest.py | 489 | except Exception as exc: # noqa: BLE001 | CODE |
| LOW | src/mcp_atlassian/__init__.py | 24 | except Exception: | CODE |
| LOW | src/mcp_atlassian/__init__.py | 473 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/utils/media.py | 106 | except Exception: | CODE |
| LOW | src/mcp_atlassian/utils/proxy.py | 203 | except Exception as e: # pragma: no cover - defensive wrapper around pypac | CODE |
| LOW | src/mcp_atlassian/utils/http.py | 389 | except Exception: | CODE |
| LOW | src/mcp_atlassian/utils/urls.py | 106 | except Exception: | CODE |
| LOW | src/mcp_atlassian/utils/oauth.py | 254 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/utils/oauth.py | 292 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/utils/oauth.py | 332 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/utils/oauth.py | 388 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/utils/oauth.py | 426 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/utils/oauth.py | 447 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/utils/oauth.py | 477 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/utils/decorators.py | 106 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/utils/decorators.py | 238 | except Exception as e: # noqa: BLE001 - Intentional fallback with logging | CODE |
| LOW⚡ | src/mcp_atlassian/jira/issues.py | 745 | except Exception as e: | CODE |
| LOW⚡ | src/mcp_atlassian/jira/issues.py | 760 | except Exception as update_error: | CODE |
| LOW | src/mcp_atlassian/jira/issues.py | 251 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/jira/issues.py | 275 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/jira/issues.py | 322 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/jira/issues.py | 381 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/jira/issues.py | 411 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/jira/issues.py | 454 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/jira/issues.py | 458 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/jira/issues.py | 776 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/jira/issues.py | 851 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/jira/issues.py | 895 | except Exception as e: | CODE |
| 268 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit/test_external_auth.py | 3 | CODE | |
| LOW | tests/unit/utils/test_oauth_dcr_harness.py | 3 | CODE | |
| LOW | tests/unit/utils/test_token_verifier.py | 3 | CODE | |
| LOW | tests/unit/servers/test_oauth_proxy_dcr_e2e.py | 3 | CODE | |
| LOW | tests/unit/servers/test_dependencies.py | 3 | CODE | |
| LOW | tests/unit/servers/test_oauth_proxy_build.py | 3 | CODE | |
| LOW | tests/unit/servers/test_async_utils.py | 3 | CODE | |
| LOW | tests/unit/servers/test_client_storage.py | 3 | CODE | |
| LOW | tests/utils/oauth_dcr_harness.py | 3 | CODE | |
| LOW | tests/e2e/conftest.py | 7 | CODE | |
| LOW | tests/e2e/test_jira_dc_operations.py | 3 | CODE | |
| LOW | tests/e2e/test_images_dc.py | 7 | CODE | |
| LOW | tests/e2e/test_confluence_auth_matrix.py | 3 | CODE | |
| LOW | tests/e2e/test_mcp_tools_dc.py | 3 | CODE | |
| LOW | tests/e2e/test_confluence_dc_operations.py | 3 | CODE | |
| LOW | tests/e2e/test_jira_auth_matrix.py | 3 | CODE | |
| LOW | tests/e2e/test_user_lookup_dc.py | 7 | CODE | |
| LOW | tests/e2e/cloud/test_mcp_tools_cloud.py | 3 | CODE | |
| LOW | tests/e2e/cloud/conftest.py | 11 | CODE | |
| LOW | tests/e2e/cloud/test_confluence_dates.py | 3 | CODE | |
| LOW | tests/e2e/cloud/test_jira_watchers.py | 3 | CODE | |
| LOW | tests/e2e/cloud/test_jira_issue_creation_workflow.py | 6 | CODE | |
| LOW | tests/e2e/cloud/test_confluence_page_metadata.py | 3 | CODE | |
| LOW | tests/e2e/cloud/test_confluence_auth_matrix.py | 3 | CODE | |
| LOW | tests/e2e/cloud/test_adf_write.py | 7 | CODE | |
| LOW | tests/e2e/cloud/test_jira_issue_include.py | 7 | CODE | |
| LOW | tests/e2e/cloud/test_images_cloud.py | 7 | CODE | |
| LOW | tests/e2e/cloud/test_jira_auth_matrix.py | 3 | CODE | |
| LOW | tests/e2e/cloud/test_jira_cloud_operations.py | 3 | CODE | |
| LOW | tests/e2e/cloud/test_confluence_cloud_operations.py | 3 | CODE | |
| LOW | tests/e2e/cloud/test_jira_user_profile_me.py | 3 | CODE | |
| LOW | tests/e2e/cloud/test_confluence_space_search.py | 3 | CODE | |
| LOW | scripts/mcp_wire_probe.py | 4 | CODE | |
| LOW | src/mcp_atlassian/utils/proxy.py | 3 | CODE | |
| LOW | src/mcp_atlassian/utils/__init__.py | 6 | CODE | |
| LOW | src/mcp_atlassian/utils/__init__.py | 7 | CODE | |
| LOW | src/mcp_atlassian/utils/__init__.py | 7 | CODE | |
| LOW | src/mcp_atlassian/utils/__init__.py | 10 | CODE | |
| LOW | src/mcp_atlassian/utils/__init__.py | 10 | CODE | |
| LOW | src/mcp_atlassian/utils/__init__.py | 14 | CODE | |
| LOW | src/mcp_atlassian/utils/__init__.py | 15 | CODE | |
| LOW | src/mcp_atlassian/utils/__init__.py | 15 | CODE | |
| LOW | src/mcp_atlassian/utils/__init__.py | 15 | CODE | |
| LOW | src/mcp_atlassian/utils/__init__.py | 22 | CODE | |
| LOW | src/mcp_atlassian/utils/__init__.py | 22 | CODE | |
| LOW | src/mcp_atlassian/utils/__init__.py | 23 | CODE | |
| LOW | src/mcp_atlassian/utils/__init__.py | 23 | CODE | |
| LOW | src/mcp_atlassian/utils/__init__.py | 23 | CODE | |
| LOW | src/mcp_atlassian/utils/__init__.py | 23 | CODE | |
| LOW | src/mcp_atlassian/utils/__init__.py | 29 | CODE | |
| LOW | src/mcp_atlassian/utils/__init__.py | 29 | CODE | |
| LOW | src/mcp_atlassian/utils/__init__.py | 29 | CODE | |
| LOW | src/mcp_atlassian/utils/token_verifier.py | 9 | CODE | |
| LOW | src/mcp_atlassian/models/__init__.py | 10 | CODE | |
| LOW | src/mcp_atlassian/models/__init__.py | 10 | CODE | |
| LOW | src/mcp_atlassian/models/__init__.py | 13 | CODE | |
| LOW | src/mcp_atlassian/models/__init__.py | 13 | CODE | |
| LOW | src/mcp_atlassian/models/__init__.py | 13 | CODE | |
| LOW | src/mcp_atlassian/models/__init__.py | 13 | CODE | |
| LOW | src/mcp_atlassian/models/__init__.py | 13 | CODE | |
| 111 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/unit/test_main_transport_selection.py | 42 | except SystemExit: | CODE |
| HIGH | tests/unit/test_main_transport_selection.py | 61 | except SystemExit: | CODE |
| HIGH | tests/unit/test_main_transport_selection.py | 84 | except SystemExit: | CODE |
| HIGH | tests/unit/test_main_transport_selection.py | 114 | except SystemExit: | CODE |
| HIGH | tests/unit/test_main_transport_selection.py | 158 | except SystemExit: | CODE |
| HIGH | tests/unit/servers/test_transport_lifecycle.py | 227 | except SystemExit: | CODE |
| HIGH | tests/unit/servers/test_transport_lifecycle.py | 264 | except SystemExit: | CODE |
| HIGH | tests/unit/servers/test_transport_lifecycle.py | 63 | except SystemExit: | CODE |
| HIGH | tests/unit/servers/test_transport_lifecycle.py | 167 | except SystemExit: | CODE |
| HIGH | tests/integration/test_real_api.py | 141 | except Exception: # noqa: BLE001 | CODE |
| HIGH | tests/integration/test_real_api.py | 246 | except Exception: # noqa: BLE001 | CODE |
| HIGH | tests/integration/test_real_api.py | 277 | except Exception: # noqa: BLE001 | CODE |
| HIGH | tests/integration/test_real_api.py | 448 | except Exception: # noqa: BLE001 | CODE |
| HIGH | tests/integration/test_real_api.py | 486 | except Exception: # noqa: BLE001 | CODE |
| HIGH | tests/integration/test_real_api.py | 492 | except Exception: # noqa: BLE001 | CODE |
| HIGH | tests/integration/test_real_api.py | 698 | except Exception: # noqa: BLE001 | CODE |
| HIGH | tests/integration/test_real_api.py | 704 | except Exception: # noqa: BLE001 | CODE |
| HIGH | tests/e2e/test_jira_dc_operations.py | 23 | except requests.RequestException: | CODE |
| HIGH | tests/e2e/cloud/test_jira_cloud_operations.py | 23 | except requests.RequestException: | CODE |
| HIGH | src/mcp_atlassian/models/jira/issue.py | 118 | except AttributeError: | CODE |
| HIGH | src/mcp_atlassian/jira/worklog.py | 32 | except ValueError: | CODE |
| HIGH | src/mcp_atlassian/jira/transitions.py | 320 | except (StopIteration, AttributeError): | CODE |
| HIGH | src/mcp_atlassian/confluence/pages.py | 408 | except Exception: # noqa: S110 | CODE |
| HIGH | src/mcp_atlassian/confluence/analytics.py | 89 | except (ValueError, AttributeError): | CODE |
| HIGH | src/mcp_atlassian/servers/oauth_proxy.py | 58 | except ValueError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit/test_stdio_lifecycle.py | 29 | "JIRA_USERNAME": "user@example.com", | CODE |
| LOW⚡ | tests/unit/auth/test_authentication.py | 486 | "JIRA_USERNAME": "user@example.com", | CODE |
| LOW⚡ | tests/unit/auth/test_authentication.py | 501 | "JIRA_USERNAME": "user@example.com", | CODE |
| LOW | tests/unit/auth/test_authentication.py | 250 | "JIRA_USERNAME": "user@example.com", | CODE |
| LOW | tests/unit/auth/test_authentication.py | 281 | "JIRA_USERNAME": "user@example.com", | CODE |
| LOW | tests/unit/auth/test_authentication.py | 459 | "JIRA_USERNAME": "user@example.com", | CODE |
| LOW | tests/unit/auth/test_authentication.py | 473 | "JIRA_USERNAME": "user@example.com", | CODE |
| LOW | tests/unit/auth/test_authentication.py | 514 | "JIRA_USERNAME": "user@example.com", | CODE |
| LOW | tests/unit/auth/test_authentication.py | 630 | "JIRA_USERNAME": "user@example.com", | CODE |
| LOW | tests/unit/auth/test_authentication.py | 645 | username="user@example.com", | CODE |
| LOW⚡ | tests/unit/models/test_confluence_common_models.py | 377 | assert comment.author.display_name == "John Doe" | CODE |
| LOW | tests/unit/models/test_confluence_common_models.py | 52 | "by": {"accountId": "user123", "displayName": "John Doe"}, | CODE |
| LOW | tests/unit/models/test_confluence_common_models.py | 69 | assert attachment.author_display_name == "John Doe" | CODE |
| LOW | tests/unit/models/test_confluence_common_models.py | 157 | author_display_name="John Doe", | CODE |
| LOW | tests/unit/models/test_confluence_common_models.py | 168 | assert simplified["author_display_name"] == "John Doe" | CODE |
| LOW | tests/unit/models/test_jira_worklog_model.py | 88 | "displayName": "John Doe", | CODE |
| LOW | tests/unit/models/test_jira_worklog_model.py | 101 | assert worklog.author.display_name == "John Doe" | CODE |
| LOW | tests/unit/models/test_jira_worklog_model.py | 127 | "displayName": "John Doe", | CODE |
| LOW | tests/unit/models/test_jira_worklog_model.py | 142 | assert simplified["author"]["display_name"] == "John Doe" | CODE |
| LOW | tests/unit/models/test_jira_project_model.py | 27 | "displayName": "John Doe", | CODE |
| LOW | tests/unit/models/test_jira_project_model.py | 47 | assert project.lead.display_name == "John Doe" | CODE |
| LOW | tests/unit/models/test_jira_project_model.py | 76 | "displayName": "John Doe", | CODE |
| LOW | tests/unit/models/test_jira_project_model.py | 90 | assert simplified["lead"]["display_name"] == "John Doe" | CODE |
| LOW⚡ | tests/unit/models/test_jira_common_models.py | 93 | display_name="John Doe", | CODE |
| LOW⚡ | tests/unit/models/test_jira_common_models.py | 108 | "displayName": "John Doe", | CODE |
| LOW⚡ | tests/unit/models/test_jira_common_models.py | 116 | assert user.display_name == "John Doe" | CODE |
| LOW⚡ | tests/unit/models/test_jira_common_models.py | 122 | "displayName": "John Doe", | CODE |
| LOW⚡ | tests/unit/models/test_jira_common_models.py | 129 | assert user.display_name == "John Doe" | CODE |
| LOW⚡ | tests/unit/models/test_jira_common_models.py | 136 | "displayName": "John Doe", | CODE |
| LOW⚡ | tests/unit/models/test_jira_common_models.py | 142 | assert user.display_name == "John Doe" | CODE |
| LOW⚡ | tests/unit/models/test_jira_common_models.py | 147 | display_name="John Doe", | CODE |
| LOW⚡ | tests/unit/models/test_jira_common_models.py | 154 | assert simplified["display_name"] == "John Doe" | CODE |
| LOW⚡ | tests/unit/models/test_jira_common_models.py | 161 | display_name="John Doe", | CODE |
| LOW⚡ | tests/unit/models/test_jira_common_models.py | 165 | assert simplified["name"] == "John Doe" | CODE |
| LOW⚡ | tests/unit/models/test_jira_common_models.py | 166 | assert simplified["display_name"] == "John Doe" | CODE |
| LOW | tests/unit/jira/test_development.py | 42 | "author": {"name": "John Doe"}, | CODE |
| LOW | tests/unit/jira/test_development.py | 81 | "author": {"name": "John Doe"}, | CODE |
| LOW | tests/unit/jira/test_development.py | 116 | assert result["pullRequests"][0]["author"] == "John Doe" | CODE |
| LOW | tests/unit/jira/test_development.py | 141 | assert result["commits"][0]["author"] == "John Doe" | CODE |
| LOW⚡ | tests/unit/jira/test_issues.py | 117 | "author": {"displayName": "John Doe"}, | CODE |
| LOW⚡ | tests/unit/jira/test_issues.py | 124 | "author": {"displayName": "Jane Doe"}, | CODE |
| LOW⚡ | tests/unit/jira/test_issues.py | 1144 | issue_key="TEST-123", assignee="user@example.com" | CODE |
| LOW⚡ | tests/unit/jira/test_issues.py | 1148 | "user@example.com", issue_key="TEST-123" | CODE |
| LOW | tests/unit/jira/test_issues.py | 74 | "author": {"displayName": "John Doe"}, | CODE |
| LOW | tests/unit/jira/test_issues.py | 161 | "author": {"displayName": "Jane Doe"}, | CODE |
| LOW | tests/unit/jira/test_issues.py | 1232 | issues_mixin.assign_issue(issue_key="TEST-123", assignee="user@example.com") | CODE |
| LOW | tests/unit/jira/test_formatting.py | 176 | "assignee": {"displayName": "John Doe", "name": "jdoe"}, | CODE |
| LOW | tests/unit/jira/test_formatting.py | 190 | assert result["assignee"] == "John Doe" | CODE |
| LOW | tests/unit/jira/test_users.py | 822 | "emailAddress": "user@example.com", | CODE |
| LOW⚡ | tests/unit/jira/test_comments.py | 55 | assert result[0]["author"] == "John Doe" | CODE |
| LOW⚡ | tests/unit/jira/test_comments.py | 66 | "author": {"displayName": "John Doe"}, | CODE |
| LOW⚡ | tests/unit/jira/test_comments.py | 235 | assert result["author"] == "John Doe" | CODE |
| LOW⚡ | tests/unit/jira/test_comments.py | 244 | "author": {"displayName": "John Doe"}, | CODE |
| LOW⚡ | tests/unit/jira/test_comments.py | 397 | assert result["author"] == "John Doe" | CODE |
| LOW⚡ | tests/unit/jira/test_comments.py | 406 | "author": {"displayName": "John Doe"}, | CODE |
| LOW⚡ | tests/unit/jira/test_comments.py | 475 | assert result["author"] == "John Doe" | CODE |
| LOW⚡ | tests/unit/jira/test_comments.py | 673 | "author": {"displayName": "John Doe"}, | CODE |
| LOW | tests/unit/jira/test_comments.py | 41 | "author": {"displayName": "John Doe"}, | CODE |
| LOW | tests/unit/jira/test_comments.py | 184 | "author": {"displayName": "John Doe"}, | CODE |
| LOW | tests/unit/jira/test_comments.py | 215 | "author": {"displayName": "John Doe"}, | CODE |
| 63 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/conftest.py | 299 | CODE | |
| LOW | tests/unit/test_main_transport_selection.py | 30 | CODE | |
| LOW | tests/unit/test_main_transport_selection.py | 55 | CODE | |
| LOW | tests/unit/test_main_transport_selection.py | 70 | CODE | |
| LOW | tests/unit/test_main_transport_selection.py | 106 | CODE | |
| LOW | tests/unit/test_main_transport_selection.py | 148 | CODE | |
| LOW | tests/unit/test_main_transport_selection.py | 164 | CODE | |
| LOW | tests/unit/auth/test_authentication.py | 162 | CODE | |
| LOW | tests/unit/auth/test_authentication.py | 263 | CODE | |
| LOW | tests/unit/utils/test_oauth_setup.py | 245 | CODE | |
| LOW | tests/unit/utils/test_environment.py | 118 | CODE | |
| LOW | tests/unit/servers/test_dependencies.py | 1182 | CODE | |
| LOW | tests/unit/servers/test_dependencies.py | 1722 | CODE | |
| LOW | tests/unit/servers/test_transport_lifecycle.py | 27 | CODE | |
| LOW | tests/unit/servers/test_transport_lifecycle.py | 124 | CODE | |
| LOW | tests/unit/servers/test_transport_lifecycle.py | 196 | CODE | |
| LOW | tests/unit/servers/test_transport_lifecycle.py | 256 | CODE | |
| LOW | scripts/generate_tool_docs.py | 539 | CODE | |
| LOW | scripts/generate_tool_docs.py | 550 | CODE | |
| LOW | scripts/mcp_wire_probe.py | 189 | CODE | |
| LOW | src/mcp_atlassian/__init__.py | 235 | CODE | |
| LOW | src/mcp_atlassian/utils/logging.py | 71 | CODE | |
| LOW | src/mcp_atlassian/utils/toolsets.py | 172 | CODE | |
| LOW | src/mcp_atlassian/utils/ssrf_adapter.py | 51 | CODE | |
| LOW | src/mcp_atlassian/models/jira/search.py | 30 | CODE | |
| LOW | src/mcp_atlassian/models/jira/issue.py | 138 | CODE | |
| LOW | src/mcp_atlassian/models/jira/issue.py | 522 | CODE | |
| LOW | src/mcp_atlassian/models/jira/issue.py | 725 | CODE | |
| LOW | src/mcp_atlassian/models/jira/adf.py | 69 | CODE | |
| LOW | src/mcp_atlassian/models/jira/adf.py | 242 | CODE | |
| LOW | src/mcp_atlassian/models/jira/adf.py | 554 | CODE | |
| LOW | src/mcp_atlassian/models/confluence/comment.py | 40 | CODE | |
| LOW | src/mcp_atlassian/models/confluence/page.py | 119 | CODE | |
| LOW | src/mcp_atlassian/models/confluence/search.py | 90 | CODE | |
| LOW | src/mcp_atlassian/jira/issues.py | 82 | CODE | |
| LOW | src/mcp_atlassian/jira/issues.py | 386 | CODE | |
| LOW | src/mcp_atlassian/jira/issues.py | 463 | CODE | |
| LOW | src/mcp_atlassian/jira/issues.py | 598 | CODE | |
| LOW | src/mcp_atlassian/jira/issues.py | 806 | CODE | |
| LOW | src/mcp_atlassian/jira/issues.py | 1047 | CODE | |
| LOW | src/mcp_atlassian/jira/issues.py | 1223 | CODE | |
| LOW | src/mcp_atlassian/jira/issues.py | 1449 | CODE | |
| LOW | src/mcp_atlassian/jira/issues.py | 1514 | CODE | |
| LOW | src/mcp_atlassian/jira/issues.py | 1678 | CODE | |
| LOW | src/mcp_atlassian/jira/issues.py | 1883 | CODE | |
| LOW | src/mcp_atlassian/jira/issues.py | 1964 | CODE | |
| LOW | src/mcp_atlassian/jira/metrics.py | 25 | CODE | |
| LOW | src/mcp_atlassian/jira/metrics.py | 199 | CODE | |
| LOW | src/mcp_atlassian/jira/field_options.py | 86 | CODE | |
| LOW | src/mcp_atlassian/jira/field_options.py | 146 | CODE | |
| LOW | src/mcp_atlassian/jira/queues.py | 27 | CODE | |
| LOW | src/mcp_atlassian/jira/epics.py | 27 | CODE | |
| LOW | src/mcp_atlassian/jira/epics.py | 113 | CODE | |
| LOW | src/mcp_atlassian/jira/epics.py | 319 | CODE | |
| LOW | src/mcp_atlassian/jira/epics.py | 454 | CODE | |
| LOW | src/mcp_atlassian/jira/epics.py | 673 | CODE | |
| LOW | src/mcp_atlassian/jira/epics.py | 817 | CODE | |
| LOW | src/mcp_atlassian/jira/epics.py | 871 | CODE | |
| LOW | src/mcp_atlassian/jira/forms_api.py | 50 | CODE | |
| LOW | src/mcp_atlassian/jira/config.py | 234 | CODE | |
| 62 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/e2e/test_images_dc.py | 0 | environment variables for configuring mcp server against dc. | STRING |
| HIGH | tests/e2e/test_mcp_tools_dc.py | 0 | environment variables for configuring mcp server against dc. | STRING |
| HIGH | tests/e2e/test_user_lookup_dc.py | 0 | environment variables for configuring mcp server against dc. | STRING |
| HIGH | tests/e2e/test_images_dc.py | 0 | mcp client connected to the server configured for dc. | STRING |
| HIGH | tests/e2e/test_mcp_tools_dc.py | 0 | mcp client connected to the server configured for dc. | STRING |
| HIGH | tests/e2e/test_user_lookup_dc.py | 0 | mcp client connected to the server configured for dc. | STRING |
| HIGH | tests/e2e/cloud/test_mcp_tools_cloud.py | 0 | environment variables for configuring mcp server against cloud. | STRING |
| HIGH | tests/e2e/cloud/test_adf_write.py | 0 | environment variables for configuring mcp server against cloud. | STRING |
| HIGH | tests/e2e/cloud/test_jira_issue_include.py | 0 | environment variables for configuring mcp server against cloud. | STRING |
| HIGH | tests/e2e/cloud/test_images_cloud.py | 0 | environment variables for configuring mcp server against cloud. | STRING |
| HIGH | tests/e2e/cloud/test_mcp_tools_cloud.py | 0 | mcp client connected to the server configured for cloud. | STRING |
| HIGH | tests/e2e/cloud/test_adf_write.py | 0 | mcp client connected to the server configured for cloud. | STRING |
| HIGH | tests/e2e/cloud/test_jira_issue_include.py | 0 | mcp client connected to the server configured for cloud. | STRING |
| HIGH | tests/e2e/cloud/test_images_cloud.py | 0 | mcp client connected to the server configured for cloud. | STRING |
| HIGH | src/mcp_atlassian/jira/attachments.py | 0 | download a confluence attachment to the specified path. args: url: the url of the attachment to download target_path: th | STRING |
| HIGH | src/mcp_atlassian/confluence/protocols.py | 0 | download a confluence attachment to the specified path. args: url: the url of the attachment to download target_path: th | STRING |
| HIGH | src/mcp_atlassian/confluence/attachments.py | 0 | download a confluence attachment to the specified path. args: url: the url of the attachment to download target_path: th | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/conftest.py | 345 | # Check if modules can be imported | COMMENT |
| LOW | tests/unit/jira/conftest.py | 390 | # Check if integration test environment variables are set | COMMENT |
| LOW | tests/unit/jira/test_protocols.py | 169 | # Check if instance has all required methods | COMMENT |
| LOW | tests/unit/confluence/conftest.py | 610 | # Check if integration test environment variables are set | COMMENT |
| LOW | tests/e2e/docker/setup-test-data.sh | 57 | # Check if any issue exists in E2E project | COMMENT |
| LOW | scripts/test_with_real_data.sh | 74 | # Check if .env file exists | COMMENT |
| LOW | src/mcp_atlassian/utils/ssl.py | 77 | # Check if we should bypass proxies for this URL. Prefer the value | COMMENT |
| LOW | src/mcp_atlassian/utils/urls.py | 128 | # Check if hostname is an IP address | COMMENT |
| LOW | src/mcp_atlassian/utils/date.py | 34 | # Check if timestamp is within valid range to avoid OSError | COMMENT |
| LOW | src/mcp_atlassian/utils/oauth.py | 76 | # Check if base_url is a Cloud URL — if so, cloud_id takes precedence | COMMENT |
| LOW | src/mcp_atlassian/utils/oauth.py | 192 | # Check if required tokens are present | COMMENT |
| LOW | src/mcp_atlassian/utils/oauth.py | 497 | # Check if OAuth is explicitly enabled (allows minimal config) | COMMENT |
| LOW | src/mcp_atlassian/models/jira/issue.py | 166 | # Check if fields has a names fields | COMMENT |
| LOW | src/mcp_atlassian/models/jira/issue.py | 776 | # Check if fields has a names() method (some implementations have this) | COMMENT |
| LOW⚡ | src/mcp_atlassian/models/jira/adf.py | 582 | # Check if this is a text node | COMMENT |
| LOW⚡ | src/mcp_atlassian/models/jira/adf.py | 586 | # Check if this is a hardBreak node | COMMENT |
| LOW⚡ | src/mcp_atlassian/models/jira/adf.py | 590 | # Check if this is a mention node | COMMENT |
| LOW⚡ | src/mcp_atlassian/models/jira/adf.py | 595 | # Check if this is an emoji node | COMMENT |
| LOW⚡ | src/mcp_atlassian/models/jira/adf.py | 600 | # Check if this is a date node | COMMENT |
| LOW⚡ | src/mcp_atlassian/models/jira/adf.py | 612 | # Check if this is a status node | COMMENT |
| LOW⚡ | src/mcp_atlassian/models/jira/adf.py | 617 | # Check if this is an inlineCard node | COMMENT |
| LOW⚡ | src/mcp_atlassian/models/jira/adf.py | 626 | # Check if this is a codeBlock node | COMMENT |
| LOW⚡ | src/mcp_atlassian/jira/issues.py | 752 | # Check if we have any stored Epic fields to update | COMMENT |
| LOW | src/mcp_atlassian/jira/issues.py | 415 | # Check if this is an epic | COMMENT |
| LOW | src/mcp_atlassian/jira/epics.py | 156 | # Check if this field is required | COMMENT |
| LOW | src/mcp_atlassian/jira/epics.py | 181 | # Check if this field is required | COMMENT |
| LOW | src/mcp_atlassian/jira/epics.py | 202 | # Check if this field is required | COMMENT |
| LOW | src/mcp_atlassian/jira/epics.py | 351 | # Check if the epic key corresponds to an actual epic | COMMENT |
| LOW | src/mcp_atlassian/jira/epics.py | 483 | # Check if the issue is an Epic | COMMENT |
| LOW | src/mcp_atlassian/jira/epics.py | 720 | # Check if any of these known fields exist in our field IDs values | COMMENT |
| LOW | src/mcp_atlassian/jira/fields.py | 289 | if not fields: # Check if get_fields failed or returned empty | CODE |
| LOW | src/mcp_atlassian/jira/client.py | 448 | # Check if this is the last page | COMMENT |
| LOW | src/mcp_atlassian/jira/formatting.py | 210 | # Check if the issue has fields | STRING |
| LOW | src/mcp_atlassian/jira/attachments.py | 65 | # Write the file to disk | COMMENT |
| LOW | src/mcp_atlassian/jira/attachments.py | 389 | # Check if file exists | COMMENT |
| LOW | src/mcp_atlassian/jira/transitions.py | 178 | # Check if normalized_transition_id is valid | COMMENT |
| LOW⚡ | src/mcp_atlassian/jira/transitions.py | 356 | # Check if _get_account_id is available (from UsersMixin) | COMMENT |
| LOW | src/mcp_atlassian/jira/sla.py | 664 | # Check if it's a working day (isoweekday: 1=Mon, 7=Sun) | COMMENT |
| LOW | src/mcp_atlassian/jira/projects.py | 648 | # Check if user has browse permission for this project | COMMENT |
| LOW | src/mcp_atlassian/confluence/attachments.py | 154 | # Check if file exists | COMMENT |
| LOW | src/mcp_atlassian/confluence/attachments.py | 399 | # Write the file to disk | COMMENT |
| LOW⚡ | src/mcp_atlassian/confluence/pages.py | 402 | # Check if the property already exists (need version for update) | COMMENT |
| LOW | src/mcp_atlassian/confluence/pages.py | 224 | # Check if API returned an error string | COMMENT |
| LOW | src/mcp_atlassian/confluence/pages.py | 1381 | # Check if we got a response object | COMMENT |
| LOW | src/mcp_atlassian/confluence/pages.py | 1383 | # Check if status code indicates success (2xx) | COMMENT |
| LOW | src/mcp_atlassian/confluence/v2_adapter.py | 480 | # Check if status code indicates success (204 No Content is typical for deletes) | COMMENT |
| LOW | src/mcp_atlassian/confluence/v2_adapter.py | 1077 | # Check if the property already exists | COMMENT |
| LOW | src/mcp_atlassian/preprocessing/jira.py | 185 | # Check if it's a Confluence wiki link | COMMENT |
| LOW | src/mcp_atlassian/preprocessing/base.py | 419 | # Check if this references a different page | COMMENT |
| LOW | src/mcp_atlassian/servers/confluence.py | 252 | # Check if the query is a simple search term or already a CQL query | COMMENT |
| LOW | src/mcp_atlassian/servers/dependencies.py | 646 | # Check if global config has OAuth set up | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/unit/jira/test_issues.py | 1459 | """Server/DC rejects a JSON ``{"parent": null}`` field update early.""" | STRING |
| HIGH | tests/unit/jira/test_format_conversion.py | 39 | "description": "h2. Summary\n\nThis is *bold* text.\n\n|| Header 1 || Header 2 ||\n| Cell 1 | Cell 2 |", | CODE |
| HIGH | tests/unit/preprocessing/test_content_processing.py | 259 | if (x > 0 && y < 10) { | CODE |
| HIGH | tests/unit/preprocessing/test_content_processing.py | 277 | assert "x > 0 && y < 10" in jira_result | CODE |
| HIGH | tests/unit/servers/test_jira_server.py | 2588 | "additional_fields": '{"parent": null}', | CODE |
| HIGH | src/mcp_atlassian/jira/issues.py | 1025 | '{"parent": null} is supported only on Jira Cloud. Jira ' | CODE |
| HIGH | src/mcp_atlassian/jira/issues.py | 1028 | 'directly, for example {"customfield_10014": null}, using ' | CODE |
| HIGH | src/mcp_atlassian/jira/issues.py | 1012 | Jira Cloud accepts ``{"parent": null}`` for clearing a parent. Jira | STRING |
| HIGH⚡ | src/mcp_atlassian/jira/comments.py | 295 | # internal. Treat missing, null, string, and numeric values as | COMMENT |
| HIGH | src/mcp_atlassian/servers/jira.py | 2092 | 'directly, such as {"customfield_10014": null}. ' | CODE |
| HIGH | src/mcp_atlassian/servers/jira.py | 2106 | 'clear it with {"parent": null}. On Server/DC, clear an Epic Link ' | CODE |
| HIGH | src/mcp_atlassian/servers/jira.py | 2108 | '{"customfield_10014": null}.' | CODE |
| HIGH | src/mcp_atlassian/servers/jira.py | 2218 | ``{"parent": null}`` to clear an issue's parent. On Server/DC, | STRING |
| HIGH | src/mcp_atlassian/servers/jira.py | 2220 | ``{"customfield_10014": null}``. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit/servers/test_oauth_proxy_build.py | 12 | def _set_required_oauth_env(monkeypatch, *, redirect_uri: str) -> None: | CODE |
| LOW | tests/unit/servers/test_jira_server.py | 37 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/unit/servers/test_mcp_protocol.py | 37 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/unit/servers/test_confluence_server.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/utils/oauth_dcr_harness.py | 461 | __all__ = [ | CODE |
| LOW | tests/e2e/conftest.py | 28 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/e2e/cloud/conftest.py | 30 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/__init__.py | 480 | __all__ = ["main", "__version__"] | CODE |
| LOW | src/mcp_atlassian/utils/media.py | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/utils/tools.py | 6 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/utils/toolsets.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/utils/__init__.py | 32 | __all__ = [ | CODE |
| LOW | src/mcp_atlassian/utils/decorators.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/models/__init__.py | 62 | __all__ = [ | CODE |
| LOW | src/mcp_atlassian/models/jira/link.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/models/jira/agile.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/models/jira/comment.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/models/jira/worklog.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/models/jira/__init__.py | 66 | __all__ = [ | CODE |
| LOW | src/mcp_atlassian/models/jira/forms.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/models/jira/common.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/models/jira/search.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/models/jira/workflow.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/models/jira/issue.py | 34 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/models/jira/project.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/models/confluence/user_search.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/models/confluence/comment.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/models/confluence/__init__.py | 24 | __all__ = [ | CODE |
| LOW | src/mcp_atlassian/models/confluence/page.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/models/confluence/common.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/models/confluence/label.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/models/confluence/search.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/models/confluence/space.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/jira/__init__.py | 93 | __all__ = [ | CODE |
| LOW | src/mcp_atlassian/jira/utils.py | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/confluence/__init__.py | 56 | __all__ = [ | CODE |
| LOW | src/mcp_atlassian/confluence/utils.py | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/preprocessing/__init__.py | 10 | __all__ = [ | CODE |
| LOW | src/mcp_atlassian/servers/confluence.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/servers/__init__.py | 5 | __all__ = ["main_mcp"] | CODE |
| LOW | src/mcp_atlassian/servers/jira.py | 32 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/servers/helpers.py | 7 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/servers/oauth_proxy.py | 131 | __all__ = ["HardenedOAuthProxy", "parse_env_list"] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/e2e/cloud/test_jira_issue_creation_workflow.py | 75 | # Step 1: Discover issue types | COMMENT |
| LOW⚡ | tests/e2e/cloud/test_jira_issue_creation_workflow.py | 79 | # Step 2: Pick Task | COMMENT |
| LOW⚡ | tests/e2e/cloud/test_jira_issue_creation_workflow.py | 82 | # Step 3: Discover fields | COMMENT |
| LOW⚡ | tests/e2e/cloud/test_jira_issue_creation_workflow.py | 91 | # Step 4: Create issue using discovered metadata | COMMENT |
| LOW | src/mcp_atlassian/jira/field_options.py | 178 | # Step 1: Resolve issue type name to ID | COMMENT |
| LOW | src/mcp_atlassian/jira/field_options.py | 199 | # Step 2: Paginate through createmeta fields | COMMENT |
| LOW⚡ | src/mcp_atlassian/jira/worklog.py | 99 | # Step 1: Update original estimate if provided (separate API call) | COMMENT |
| LOW⚡ | src/mcp_atlassian/jira/worklog.py | 114 | # Step 2: Prepare worklog data | COMMENT |
| LOW⚡ | src/mcp_atlassian/jira/worklog.py | 121 | # Step 3: Prepare query parameters for remaining estimate | COMMENT |
| LOW⚡ | src/mcp_atlassian/jira/worklog.py | 129 | # Step 4: Add the worklog with remaining estimate adjustment | COMMENT |
| LOW⚡ | src/mcp_atlassian/jira/fields.py | 230 | # Step 2: Call the correct API method to get field metadata | COMMENT |
| LOW⚡ | src/mcp_atlassian/jira/fields.py | 236 | # Step 3: Parse the response and extract required fields | COMMENT |
| LOW | src/mcp_atlassian/jira/fields.py | 205 | # Step 1: Resolve the issue type by stable ID or display name. | COMMENT |
| LOW | src/mcp_atlassian/confluence/v2_adapter.py | 1236 | # Step 1: Get all versions to find the version ID | COMMENT |
| LOW | src/mcp_atlassian/confluence/v2_adapter.py | 1249 | # Step 2: Fetch the specific version using its version ID | COMMENT |
| LOW | src/mcp_atlassian/preprocessing/jira.py | 30 | # Step 1: Jira Server/Data Center source-code formatter tags. | COMMENT |
| LOW | src/mcp_atlassian/preprocessing/jira.py | 70 | # Step 2: Mapping for unsupported languages to closest valid JIRA alternative | COMMENT |
| LOW⚡ | src/mcp_atlassian/preprocessing/jira.py | 410 | # Step 1: Check if already valid JIRA language | COMMENT |
| LOW⚡ | src/mcp_atlassian/preprocessing/jira.py | 414 | # Step 2: Check language mapping | COMMENT |
| LOW⚡ | src/mcp_atlassian/preprocessing/jira.py | 418 | # Step 3: Default - unmapped language returns None for plain {code} | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/e2e/cloud/test_jira_issue_creation_workflow.py | 75 | # Step 1: Discover issue types | COMMENT |
| LOW⚡ | tests/e2e/cloud/test_jira_issue_creation_workflow.py | 79 | # Step 2: Pick Task | COMMENT |
| LOW⚡ | tests/e2e/cloud/test_jira_issue_creation_workflow.py | 82 | # Step 3: Discover fields | COMMENT |
| LOW⚡ | tests/e2e/cloud/test_jira_issue_creation_workflow.py | 91 | # Step 4: Create issue using discovered metadata | COMMENT |
| LOW | src/mcp_atlassian/jira/field_options.py | 178 | # Step 1: Resolve issue type name to ID | COMMENT |
| LOW | src/mcp_atlassian/jira/field_options.py | 199 | # Step 2: Paginate through createmeta fields | COMMENT |
| LOW⚡ | src/mcp_atlassian/jira/worklog.py | 99 | # Step 1: Update original estimate if provided (separate API call) | COMMENT |
| LOW⚡ | src/mcp_atlassian/jira/worklog.py | 114 | # Step 2: Prepare worklog data | COMMENT |
| LOW⚡ | src/mcp_atlassian/jira/worklog.py | 121 | # Step 3: Prepare query parameters for remaining estimate | COMMENT |
| LOW⚡ | src/mcp_atlassian/jira/worklog.py | 129 | # Step 4: Add the worklog with remaining estimate adjustment | COMMENT |
| LOW⚡ | src/mcp_atlassian/jira/fields.py | 230 | # Step 2: Call the correct API method to get field metadata | COMMENT |
| LOW⚡ | src/mcp_atlassian/jira/fields.py | 236 | # Step 3: Parse the response and extract required fields | COMMENT |
| LOW | src/mcp_atlassian/jira/fields.py | 205 | # Step 1: Resolve the issue type by stable ID or display name. | COMMENT |
| LOW | src/mcp_atlassian/confluence/v2_adapter.py | 1236 | # Step 1: Get all versions to find the version ID | COMMENT |
| LOW | src/mcp_atlassian/confluence/v2_adapter.py | 1249 | # Step 2: Fetch the specific version using its version ID | COMMENT |
| LOW | src/mcp_atlassian/preprocessing/jira.py | 30 | # Step 1: Jira Server/Data Center source-code formatter tags. | COMMENT |
| LOW | src/mcp_atlassian/preprocessing/jira.py | 70 | # Step 2: Mapping for unsupported languages to closest valid JIRA alternative | COMMENT |
| LOW⚡ | src/mcp_atlassian/preprocessing/jira.py | 410 | # Step 1: Check if already valid JIRA language | COMMENT |
| LOW⚡ | src/mcp_atlassian/preprocessing/jira.py | 414 | # Step 2: Check language mapping | COMMENT |
| LOW⚡ | src/mcp_atlassian/preprocessing/jira.py | 418 | # Step 3: Default - unmapped language returns None for plain {code} | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | tests/unit/jira/test_search.py | 1300 | sent_jql = search_mixin.jira.get_issues_for_board.call_args.kwargs.get( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit/jira/test_attachments.py | 21 | # | COMMENT |
| LOW | tests/unit/confluence/test_attachments.py | 21 | # - Error cases: | COMMENT |
| LOW | tests/unit/confluence/test_attachments.py | 41 | # - File not created after write operation | COMMENT |
| LOW | helm/values.yaml | 261 | # mountPath: /etc/secrets | COMMENT |
| LOW | src/mcp_atlassian/jira/issues.py | 1301 | # Note both are skipped entirely when a "status" kwarg | COMMENT |
| LOW | src/mcp_atlassian/jira/client.py | 181 | client_key=self.config.client_key, | COMMENT |
| LOW | src/mcp_atlassian/jira/constants.py | 201 | "where", | COMMENT |
| LOW | src/mcp_atlassian/jira/constants.py | 221 | # ───────────────────────────── ───────────────────────────── | COMMENT |
| LOW | src/mcp_atlassian/preprocessing/jira.py | 221 | return input_text | COMMENT |
| LOW | src/mcp_atlassian/servers/dependencies.py | 61 | validate_fn: Callable[[Any], Any] # fetcher → validation data | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/mcp_atlassian/models/confluence/label.py | 62 | CODE | |
| LOW | src/mcp_atlassian/confluence/pages.py | 707 | CODE | |
| LOW | src/mcp_atlassian/confluence/pages.py | 828 | CODE | |
| LOW | src/mcp_atlassian/preprocessing/jira.py | 391 | CODE | |
| LOW | src/mcp_atlassian/preprocessing/jira.py | 661 | CODE | |
| LOW | src/mcp_atlassian/servers/confluence.py | 692 | CODE | |
| LOW | src/mcp_atlassian/servers/confluence.py | 879 | CODE | |
| LOW | src/mcp_atlassian/servers/jira.py | 2071 | CODE | |
| LOW | src/mcp_atlassian/servers/main.py | 406 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit/jira/test_issues.py | 253 | # Call the method - just use get_issue without the include_epic_info parameter | COMMENT |
| LOW⚡ | tests/unit/jira/test_format_conversion.py | 22 | # JiraFetcher already has a real preprocessor, so we just return it | COMMENT |
| LOW⚡ | src/mcp_atlassian/preprocessing/base.py | 314 | # Fallback: just use the account ID | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/mcp_atlassian/jira/development.py | 150 | # TODO: Consider caching results to reduce API calls (up to 12 per issue) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit/preprocessing/test_content_processing.py | 96 | def process_data(items): | CODE |
| LOW | tests/unit/preprocessing/test_content_processing.py | 155 | assert "def process_data(items):" in jira_result | CODE |