MCP server for Atlassian tools (Confluence, Jira)
This report presents the forensic synthetic code analysis of sooperset/mcp-atlassian, a Python project with 5,551 GitHub stars. SynthScan v2.0 examined 118,249 lines of code across 342 source files, recording 3801 pattern matches distributed across 20 syntactic categories. The overall adjusted score of 40.9 places this repository in the Strong AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 3801 distinct pattern matches across 20 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| 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_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_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 |
| LOW | tests/unit/test_stdin_monitoring_fix.py | 116 | def test_lifecycle_module_supports_http_transports(self): | CODE |
| LOW⚡ | tests/unit/test_external_auth.py | 27 | def test_from_env_with_url_creates_external_auth_type(self): | CODE |
| LOW⚡ | tests/unit/test_external_auth.py | 77 | def test_is_cloud_with_external_auth_and_cloud_url(self): | CODE |
| LOW⚡ | tests/unit/test_external_auth.py | 85 | def test_is_cloud_with_external_auth_and_server_url(self): | CODE |
| LOW⚡ | tests/unit/test_external_auth.py | 93 | def test_is_cloud_with_external_auth_and_no_url(self): | CODE |
| LOW⚡ | tests/unit/test_external_auth.py | 105 | def test_from_env_with_url_creates_external_auth_type(self): | CODE |
| LOW⚡ | tests/unit/test_external_auth.py | 163 | def test_init_external_auth_no_authorization_header(self): | CODE |
| LOW⚡ | tests/unit/test_external_auth.py | 217 | def test_init_external_auth_no_authorization_header(self): | CODE |
| LOW⚡ | tests/unit/test_external_auth.py | 271 | def test_both_services_available_with_only_flag(self): | CODE |
| LOW⚡ | tests/unit/test_external_auth.py | 297 | def test_flag_absent_services_not_available(self): | CODE |
| LOW | tests/unit/test_external_auth.py | 45 | def test_from_env_without_url_creates_external_auth_type(self): | CODE |
| LOW | tests/unit/test_external_auth.py | 56 | def test_is_auth_configured_returns_true_for_external(self): | CODE |
| LOW | tests/unit/test_external_auth.py | 61 | def test_external_auth_ignored_when_credentials_present(self): | CODE |
| LOW | tests/unit/test_external_auth.py | 123 | def test_from_env_without_url_creates_external_auth_type(self): | CODE |
| LOW | tests/unit/test_external_auth.py | 134 | def test_is_auth_configured_returns_true_for_external(self): | CODE |
| LOW | tests/unit/test_external_auth.py | 141 | def test_external_auth_ignored_when_credentials_present(self): | CODE |
| LOW | tests/unit/test_external_auth.py | 189 | def test_init_external_auth_skips_validation(self): | CODE |
| LOW | tests/unit/test_external_auth.py | 241 | def test_init_external_auth_skips_validation(self): | CODE |
| LOW | tests/unit/test_external_auth.py | 282 | def test_flag_with_urls_marks_services_available(self): | CODE |
| LOW | tests/unit/test_external_auth.py | 354 | async def test_url_from_header_used_when_config_url_empty(self): | CODE |
| LOW | tests/unit/test_external_auth.py | 387 | async def test_url_from_header_requires_domain_allowlist(self): | CODE |
| LOW | tests/unit/test_external_auth.py | 407 | async def test_url_from_env_used_when_config_url_set(self): | CODE |
| LOW | tests/unit/test_external_auth.py | 435 | async def test_missing_url_header_raises_value_error(self): | CODE |
| LOW | tests/unit/test_external_auth.py | 452 | async def test_passthrough_header_forwarded_to_fetcher(self): | CODE |
| LOW | tests/unit/test_external_auth.py | 482 | async def test_ssrf_blocked_url_raises_value_error(self): | CODE |
| LOW | tests/unit/test_stdio_lifecycle.py | 24 | def test_stdio_homebrew_probe_exits_after_stdin_close() -> None: | CODE |
| LOW | tests/unit/test_project_dependencies.py | 7 | def test_fastmcp_minimum_version_includes_event_store() -> None: | CODE |
| 2451 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | CONTRIBUTING.md | 109 | Summary of function purpose. More detailed description if needed. Args: param1 | STRING |
| HIGH | src/mcp_atlassian/utils/env.py | 108 | 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 | 86 | 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 | 603 | Create a new Jira issue. Args: project_key: The key of the project summary: Th | STRING |
| HIGH | src/mcp_atlassian/jira/issues.py | 1109 | Update a Jira issue. Args: issue_key: The key of the issue to update fields: D | STRING |
| HIGH | src/mcp_atlassian/jira/issues.py | 1286 | 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 | 1349 | 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 | 1478 | Delete a Jira issue. Args: issue_key: The key of the issue to delete Returns: | STRING |
| HIGH | src/mcp_atlassian/jira/issues.py | 1499 | 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 | 1736 | 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 | 1762 | Transition an issue to a new status. Args: issue_key: The key of the issue tra | STRING |
| HIGH | src/mcp_atlassian/jira/issues.py | 1789 | 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 | 294 | 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 | 434 | 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 | 850 | 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 | 111 | Get the account ID for a username or account ID. Args: assignee (str): Username or account | STRING |
| HIGH | src/mcp_atlassian/jira/users.py | 284 | 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 | 386 | 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 | 458 | Retrieve Jira user profile information by identifier. Args: identifier: User identifier (a | STRING |
| HIGH | src/mcp_atlassian/jira/protocols.py | 106 | 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 | 244 | Get the account ID for a username. Args: assignee: Username or account ID Returns: | STRING |
| HIGH | src/mcp_atlassian/jira/client.py | 378 | 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. Args: issue_key: The key of the issue to transiti | 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 |
| 103 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 |
| 89 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 | 1282 | # Create the issue with fixVersions in additional_fields | COMMENT |
| MEDIUM | tests/unit/jira/test_issues.py | 1923 | # Create the issue with labels as a list | COMMENT |
| MEDIUM | tests/unit/jira/test_issues.py | 1957 | # 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 | 449 | # Create a fields dict and call prepare_epic_fields | COMMENT |
| MEDIUM | tests/unit/jira/test_epics.py | 632 | # Create a mock search result object with issues attribute | COMMENT |
| MEDIUM | tests/unit/jira/test_epics.py | 638 | # Create a mock object with an issues attribute | COMMENT |
| MEDIUM | tests/unit/jira/test_epics.py | 714 | # 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 | 1486 | # Create a mock HTTP error response with 401 | COMMENT |
| MEDIUM | tests/unit/confluence/test_pages.py | 1509 | # 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 | 2029 | # Create a mock response that simulates a redirect | COMMENT |
| MEDIUM | tests/unit/servers/test_dependencies.py | 578 | # Create a special state mock that controls hasattr() behavior | COMMENT |
| MEDIUM | tests/unit/servers/test_dependencies.py | 827 | # Create a special state mock that controls hasattr() behavior | COMMENT |
| MEDIUM | tests/unit/servers/test_dependencies.py | 1242 | # Create a special state mock that controls hasattr() behavior | COMMENT |
| MEDIUM | tests/unit/servers/test_dependencies.py | 1419 | # Create a special state mock that controls hasattr() behavior | COMMENT |
| MEDIUM | tests/unit/servers/test_main_server.py | 181 | # Create a mock MCP server to avoid warnings | COMMENT |
| MEDIUM | tests/unit/servers/test_jira_server.py | 1311 | # 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 | 277 | except Exception as e: | 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 | 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 | 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 | 96 | 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 | 377 | 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 | 35 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/utils/decorators.py | 167 | except Exception as e: # noqa: BLE001 - Intentional fallback with logging | CODE |
| LOW⚡ | src/mcp_atlassian/jira/issues.py | 740 | except Exception as e: | CODE |
| LOW⚡ | src/mcp_atlassian/jira/issues.py | 755 | except Exception as update_error: | CODE |
| LOW | src/mcp_atlassian/jira/issues.py | 246 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/jira/issues.py | 270 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/jira/issues.py | 317 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/jira/issues.py | 376 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/jira/issues.py | 406 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/jira/issues.py | 449 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/jira/issues.py | 453 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/jira/issues.py | 771 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/jira/issues.py | 824 | except Exception as e: | CODE |
| LOW | src/mcp_atlassian/jira/issues.py | 868 | except Exception as e: | CODE |
| 257 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit/test_external_auth.py | 3 | CODE | |
| LOW | tests/unit/utils/test_token_verifier.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/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 | 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 | |
| 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 | 23 | CODE | |
| 107 more matches not shown… | ||||
| 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 | 629 | "JIRA_USERNAME": "user@example.com", | CODE |
| LOW | tests/unit/auth/test_authentication.py | 644 | 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 | 113 | "author": {"displayName": "John Doe"}, | CODE |
| LOW⚡ | tests/unit/jira/test_issues.py | 120 | "author": {"displayName": "Jane Doe"}, | CODE |
| LOW⚡ | tests/unit/jira/test_issues.py | 943 | issue_key="TEST-123", assignee="user@example.com" | CODE |
| LOW⚡ | tests/unit/jira/test_issues.py | 946 | issues_mixin._get_account_id.assert_called_once_with("user@example.com") | CODE |
| LOW | tests/unit/jira/test_issues.py | 70 | "author": {"displayName": "John Doe"}, | CODE |
| LOW | tests/unit/jira/test_issues.py | 157 | "author": {"displayName": "Jane Doe"}, | CODE |
| LOW | tests/unit/jira/test_issues.py | 1029 | 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 | 743 | "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 |
| 59 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 | 109 | CODE | |
| LOW | tests/unit/servers/test_dependencies.py | 1157 | CODE | |
| LOW | tests/unit/servers/test_dependencies.py | 1691 | 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 | src/mcp_atlassian/__init__.py | 235 | CODE | |
| LOW | src/mcp_atlassian/utils/logging.py | 71 | CODE | |
| LOW | src/mcp_atlassian/utils/toolsets.py | 167 | 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 | 137 | CODE | |
| LOW | src/mcp_atlassian/models/jira/issue.py | 512 | CODE | |
| LOW | src/mcp_atlassian/models/jira/issue.py | 711 | CODE | |
| LOW | src/mcp_atlassian/models/jira/adf.py | 66 | CODE | |
| LOW | src/mcp_atlassian/models/jira/adf.py | 217 | CODE | |
| LOW | src/mcp_atlassian/models/jira/adf.py | 517 | 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 | 77 | CODE | |
| LOW | src/mcp_atlassian/jira/issues.py | 381 | CODE | |
| LOW | src/mcp_atlassian/jira/issues.py | 458 | CODE | |
| LOW | src/mcp_atlassian/jira/issues.py | 593 | CODE | |
| LOW | src/mcp_atlassian/jira/issues.py | 997 | CODE | |
| LOW | src/mcp_atlassian/jira/issues.py | 1103 | CODE | |
| LOW | src/mcp_atlassian/jira/issues.py | 1281 | CODE | |
| LOW | src/mcp_atlassian/jira/issues.py | 1346 | CODE | |
| LOW | src/mcp_atlassian/jira/issues.py | 1498 | CODE | |
| LOW | src/mcp_atlassian/jira/issues.py | 1703 | CODE | |
| LOW | src/mcp_atlassian/jira/issues.py | 1784 | 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 | 293 | CODE | |
| LOW | src/mcp_atlassian/jira/epics.py | 431 | CODE | |
| LOW | src/mcp_atlassian/jira/epics.py | 651 | CODE | |
| LOW | src/mcp_atlassian/jira/epics.py | 795 | CODE | |
| LOW | src/mcp_atlassian/jira/epics.py | 849 | CODE | |
| LOW | src/mcp_atlassian/jira/forms_api.py | 50 | CODE | |
| LOW | src/mcp_atlassian/jira/config.py | 232 | CODE | |
| LOW | src/mcp_atlassian/jira/config.py | 381 | CODE | |
| LOW | src/mcp_atlassian/jira/fields.py | 181 | CODE | |
| LOW | src/mcp_atlassian/jira/fields.py | 268 | CODE | |
| LOW | src/mcp_atlassian/jira/fields.py | 552 | CODE | |
| LOW | src/mcp_atlassian/jira/fields.py | 783 | CODE | |
| 52 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 | 165 | # Check if fields has a names fields | COMMENT |
| LOW | src/mcp_atlassian/models/jira/issue.py | 762 | # Check if fields has a names() method (some implementations have this) | COMMENT |
| LOW⚡ | src/mcp_atlassian/models/jira/adf.py | 545 | # Check if this is a text node | COMMENT |
| LOW⚡ | src/mcp_atlassian/models/jira/adf.py | 549 | # Check if this is a hardBreak node | COMMENT |
| LOW⚡ | src/mcp_atlassian/models/jira/adf.py | 553 | # Check if this is a mention node | COMMENT |
| LOW⚡ | src/mcp_atlassian/models/jira/adf.py | 558 | # Check if this is an emoji node | COMMENT |
| LOW⚡ | src/mcp_atlassian/models/jira/adf.py | 563 | # Check if this is a date node | COMMENT |
| LOW⚡ | src/mcp_atlassian/models/jira/adf.py | 575 | # Check if this is a status node | COMMENT |
| LOW⚡ | src/mcp_atlassian/models/jira/adf.py | 580 | # Check if this is an inlineCard node | COMMENT |
| LOW⚡ | src/mcp_atlassian/models/jira/adf.py | 589 | # Check if this is a codeBlock node | COMMENT |
| LOW⚡ | src/mcp_atlassian/jira/issues.py | 747 | # Check if we have any stored Epic fields to update | COMMENT |
| LOW | src/mcp_atlassian/jira/issues.py | 410 | # Check if this is an epic | COMMENT |
| LOW | src/mcp_atlassian/jira/epics.py | 153 | # Check if this field is required | COMMENT |
| LOW | src/mcp_atlassian/jira/epics.py | 178 | # Check if this field is required | COMMENT |
| LOW | src/mcp_atlassian/jira/epics.py | 199 | # Check if this field is required | COMMENT |
| LOW | src/mcp_atlassian/jira/epics.py | 325 | # Check if the epic key corresponds to an actual epic | COMMENT |
| LOW | src/mcp_atlassian/jira/epics.py | 460 | # Check if the issue is an Epic | COMMENT |
| LOW | src/mcp_atlassian/jira/epics.py | 464 | # Check if it's an Epic by looking for "epic" in the name (case-insensitive) | COMMENT |
| LOW | src/mcp_atlassian/jira/epics.py | 698 | # Check if any of these known fields exist in our field IDs values | COMMENT |
| LOW | src/mcp_atlassian/jira/fields.py | 284 | if not fields: # Check if get_fields failed or returned empty | CODE |
| LOW | src/mcp_atlassian/jira/client.py | 420 | # 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 | 172 | # Check if normalized_transition_id is valid | COMMENT |
| LOW⚡ | src/mcp_atlassian/jira/transitions.py | 350 | # 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 | 157 | # Check if file exists | COMMENT |
| LOW | src/mcp_atlassian/confluence/attachments.py | 402 | # Write the file to disk | COMMENT |
| LOW⚡ | src/mcp_atlassian/confluence/pages.py | 371 | # Check if the property already exists (need version for update) | COMMENT |
| LOW | src/mcp_atlassian/confluence/pages.py | 223 | # Check if API returned an error string | COMMENT |
| LOW | src/mcp_atlassian/confluence/pages.py | 1320 | # Check if we got a response object | COMMENT |
| LOW | src/mcp_atlassian/confluence/pages.py | 1322 | # Check if status code indicates success (2xx) | COMMENT |
| LOW | src/mcp_atlassian/confluence/v2_adapter.py | 479 | # Check if status code indicates success (204 No Content is typical for deletes) | COMMENT |
| LOW | src/mcp_atlassian/confluence/v2_adapter.py | 973 | # Check if the property already exists | COMMENT |
| LOW | src/mcp_atlassian/preprocessing/jira.py | 189 | # 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 | 430 | # Check if global config has OAuth set up | COMMENT |
| 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 | 34 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/unit/servers/test_mcp_protocol.py | 36 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/unit/servers/test_confluence_server.py | 24 | logger = logging.getLogger(__name__) | 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 | 13 | 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 | 29 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/mcp_atlassian/servers/oauth_proxy.py | 73 | __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 | 225 | # Step 2: Call the correct API method to get field metadata | COMMENT |
| LOW⚡ | src/mcp_atlassian/jira/fields.py | 231 | # Step 3: Parse the response and extract required fields | COMMENT |
| LOW | src/mcp_atlassian/jira/fields.py | 205 | # Step 1: Get the ID for the given issue type name within the project | COMMENT |
| LOW | src/mcp_atlassian/confluence/v2_adapter.py | 1132 | # Step 1: Get all versions to find the version ID | COMMENT |
| LOW | src/mcp_atlassian/confluence/v2_adapter.py | 1145 | # Step 2: Fetch the specific version using its version ID | COMMENT |
| LOW | src/mcp_atlassian/preprocessing/jira.py | 30 | # Step 1: Valid JIRA languages (official list) | COMMENT |
| LOW | src/mcp_atlassian/preprocessing/jira.py | 91 | # 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 | 225 | # Step 2: Call the correct API method to get field metadata | COMMENT |
| LOW⚡ | src/mcp_atlassian/jira/fields.py | 231 | # Step 3: Parse the response and extract required fields | COMMENT |
| LOW | src/mcp_atlassian/jira/fields.py | 205 | # Step 1: Get the ID for the given issue type name within the project | COMMENT |
| LOW | src/mcp_atlassian/confluence/v2_adapter.py | 1132 | # Step 1: Get all versions to find the version ID | COMMENT |
| LOW | src/mcp_atlassian/confluence/v2_adapter.py | 1145 | # Step 2: Fetch the specific version using its version ID | COMMENT |
| LOW | src/mcp_atlassian/preprocessing/jira.py | 30 | # Step 1: Valid JIRA languages (official list) | COMMENT |
| LOW | src/mcp_atlassian/preprocessing/jira.py | 91 | # 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 |
|---|---|---|---|---|
| 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⚡ | src/mcp_atlassian/jira/comments.py | 157 | # internal. Treat missing, null, string, and numeric values as | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | tests/unit/jira/test_search.py | 1289 | 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 | # - No content ID provided | COMMENT |
| LOW | tests/unit/confluence/test_attachments.py | 41 | # | COMMENT |
| LOW | helm/values.yaml | 261 | # mountPath: /etc/secrets | COMMENT |
| LOW | src/mcp_atlassian/jira/constants.py | 201 | "where", | COMMENT |
| LOW | src/mcp_atlassian/jira/constants.py | 221 | # ───────────────────────────── ───────────────────────────── | COMMENT |
| LOW | src/mcp_atlassian/confluence/comments.py | 401 | # inlineProperties that the frontend editor normally supplies | COMMENT |
| LOW | src/mcp_atlassian/preprocessing/jira.py | 221 | if not input_text: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit/jira/test_issues.py | 248 | # 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/models/confluence/label.py | 62 | CODE | |
| LOW | src/mcp_atlassian/confluence/pages.py | 670 | CODE | |
| LOW | src/mcp_atlassian/confluence/pages.py | 779 | CODE | |
| LOW | src/mcp_atlassian/preprocessing/jira.py | 391 | CODE | |
| LOW | src/mcp_atlassian/preprocessing/jira.py | 658 | CODE | |
| LOW | src/mcp_atlassian/servers/confluence.py | 684 | CODE | |
| LOW | src/mcp_atlassian/servers/confluence.py | 871 | CODE |
| 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 |