#
tokens: 1488/50000 5/5 files
lines: off (toggle) GitHub
raw markdown copy
# Directory Structure

```
├── mcp-server.py
├── mcp.json
├── README.md
├── requirements.txt
└── test_client.py
```

# Files

--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------

```markdown
# confluence-chat-mcp-service
```

--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------

```
python-dotenv==1.0.0
requests==2.31.0 
```

--------------------------------------------------------------------------------
/test_client.py:
--------------------------------------------------------------------------------

```python
import json
import sys

def send_request():
    request = {
        "jsonrpc": "2.0",
        "method": "expand_content_tool",
        "params": {
            "header": "Understanding Animal Food Chains",
            "content": "Create a comprehensive guide about animal food chains."
        }
    }
    print(json.dumps(request))
    sys.stdout.flush()

if __name__ == "__main__":
    send_request() 
```

--------------------------------------------------------------------------------
/mcp.json:
--------------------------------------------------------------------------------

```json
{
  "name": "MyServer",
  "version": "1.0.0",
  "description": "A simple MCP server",
  "args": ["mcp-server.py"],
  "tools": [
    {
      "name": "expand_content_tool",
      "description": "Expands content and updates Confluence page",
      "parameters": {
        "type": "object",
        "properties": {
          "header": {
            "type": "string",
            "description": "The header for the content section"
          },
          "original_content": {
            "type": "string",
            "description": "The original content to be expanded"
          },
          "expanded_content": {
            "type": "string",
            "description": "The expanded content"
          }
        },
        "required": ["header", "original_content", "expanded_content"]
      }
    }
  ]
}
```

--------------------------------------------------------------------------------
/mcp-server.py:
--------------------------------------------------------------------------------

```python
import json
import sys
import os
from dotenv import load_dotenv
import requests
import logging

# Configure logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)

# Load environment variables
load_dotenv()

# Confluence API configuration
CONFLUENCE_URL = os.getenv("CONFLUENCE_URL")
CONFLUENCE_USERNAME = os.getenv("CONFLUENCE_USERNAME")
CONFLUENCE_API_TOKEN = os.getenv("CONFLUENCE_API_TOKEN")
PAGE_ID = os.getenv("PAGE_ID")

def generate_auth_header():
    """Generate the authentication header for Confluence API."""
    return f"Basic {CONFLUENCE_USERNAME}:{CONFLUENCE_API_TOKEN}"

def expand_content(header, content):
    """Expand the content and update Confluence page."""
    try:
        # Generate authentication header
        auth_header = generate_auth_header()
        logger.debug("Generated authentication header")

        # Create new content
        new_content = f"""
h1. {header}

{content}

h2. Key Concepts

* Food Chain Definition
* Producers and Consumers
* Energy Flow
* Trophic Levels

h2. Examples

h3. Terrestrial Food Chain
* Grass → Grasshopper → Frog → Snake → Hawk

h3. Marine Food Chain
* Phytoplankton → Zooplankton → Small Fish → Large Fish → Shark

h2. Impact on Ecosystems

* Balance in Nature
* Environmental Factors
* Human Impact
"""
        logger.debug("Created new content")

        # Update Confluence page
        update_url = f"{CONFLUENCE_URL}/rest/api/content/{PAGE_ID}"
        headers = {
            "Authorization": auth_header,
            "Content-Type": "application/json"
        }
        
        # Get current version
        response = requests.get(update_url, headers=headers)
        if response.status_code != 200:
            logger.error(f"Failed to get current version: {response.text}")
            return False
            
        current_version = response.json()["version"]["number"]
        logger.debug(f"Current version: {current_version}")

        # Update content
        update_data = {
            "version": {"number": current_version + 1},
            "title": header,
            "type": "page",
            "body": {
                "storage": {
                    "value": new_content,
                    "representation": "wiki"
                }
            }
        }

        response = requests.put(update_url, headers=headers, json=update_data)
        if response.status_code != 200:
            logger.error(f"Failed to update page: {response.text}")
            return False

        logger.info("Successfully updated Confluence page")
        return True

    except Exception as e:
        logger.error(f"Error expanding content: {str(e)}")
        return False

def handle_request(request):
    """Handle incoming JSON-RPC requests."""
    try:
        method = request.get("method")
        params = request.get("params", {})

        if method == "expand_content_tool":
            header = params.get("header")
            content = params.get("content")
            
            if not header or not content:
                return {
                    "jsonrpc": "2.0",
                    "error": {
                        "code": -32602,
                        "message": "Invalid parameters"
                    }
                }

            success = expand_content(header, content)
            
            return {
                "jsonrpc": "2.0",
                "result": {
                    "success": success,
                    "message": "Content expanded and updated successfully" if success else "Failed to expand content"
                }
            }

        else:
            return {
                "jsonrpc": "2.0",
                "error": {
                    "code": -32601,
                    "message": "Method not found"
                }
            }

    except Exception as e:
        return {
            "jsonrpc": "2.0",
            "error": {
                "code": -32000,
                "message": str(e)
            }
        }

def main():
    """Main server loop."""
    logger.info("Starting MCP server...")
    
    # Verify environment variables
    required_vars = ["CONFLUENCE_URL", "CONFLUENCE_USERNAME", "CONFLUENCE_API_TOKEN", "PAGE_ID"]
    missing_vars = [var for var in required_vars if not os.getenv(var)]
    
    if missing_vars:
        logger.error(f"Missing required environment variables: {', '.join(missing_vars)}")
        return

    logger.info("Environment check passed")

    while True:
        try:
            # Read request from stdin
            request_line = sys.stdin.readline()
            if not request_line:
                break

            request = json.loads(request_line)
            logger.debug(f"Received request: {request}")

            # Handle request
            response = handle_request(request)
            
            # Send response to stdout
            print(json.dumps(response))
            sys.stdout.flush()

        except json.JSONDecodeError:
            logger.error("Invalid JSON received")
            continue
        except Exception as e:
            logger.error(f"Error processing request: {str(e)}")
            continue

if __name__ == "__main__":
    main() 
```