Coverage for src/mcp_atlassian/confluence/client.py: 100%

1"""Base client module for Confluence API interactions."""

2

3 import logging

4

5 from atlassian import Confluence

6

7 from .config import ConfluenceConfig

8

9# Configure logging

10 logger = logging.getLogger("mcp-atlassian")

11

12

13 class ConfluenceClient:

14 """Base client for Confluence API interactions."""

15

16 def __init__(self, config: ConfluenceConfig | None = None) -> None:

17 """Initialize the Confluence client with given or environment config.

18

19 Args:

20 config: Configuration for Confluence client. If None, will load from

21 environment.

22

23 Raises:

24 ValueError: If configuration is invalid or environment variables are missing

25 """

26 self.config = config or ConfluenceConfig.from_env()

27 self.confluence = Confluence(

28 url=self.config.url,

29 username=self.config.username,

30 password=self.config.api_token, # API token is used as password

31 cloud=True,

32 )

33 # Import here to avoid circular imports

34 from ..preprocessing import TextPreprocessor

35

36 self.preprocessor = TextPreprocessor(

37 base_url=self.config.url, confluence_client=self.confluence

38 )

39

40 def _process_html_content(

41 self, html_content: str, space_key: str

42 ) -> tuple[str, str]:

43 """Process HTML content into both HTML and markdown formats.

44

45 Args:

46 html_content: Raw HTML content from Confluence

47 space_key: The key of the space containing the content

48

49 Returns:

50 Tuple of (processed_html, processed_markdown)

51 """

52 return self.preprocessor.process_html_content(html_content, space_key)