Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 48 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,9 +106,14 @@ RABBITMQ_PORT=5672
RABBITMQ_USERNAME=guest
RABBITMQ_PASSWORD=guest
RABBITMQ_VIRTUAL_HOST=/
RABBITMQ_EXCHANGE=llmLogger

# Message Queue Routing (Design Specification)
RABBITMQ_EXCHANGE=pkms
RABBITMQ_ROUTING_KEY=llm_logger
RABBITMQ_QUEUE_NAME=llm_logger

# Source Configuration (Required)
MCP_SOURCE=claude
```

#### Docker命令
Expand Down Expand Up @@ -153,10 +158,15 @@ RABBITMQ_PORT=5672
RABBITMQ_USERNAME=your-username
RABBITMQ_PASSWORD=your-password
RABBITMQ_VIRTUAL_HOST=your-vhost
RABBITMQ_EXCHANGE=llmLogger

# Message Queue Routing (Design Specification)
RABBITMQ_EXCHANGE=pkms
RABBITMQ_ROUTING_KEY=llm_logger
RABBITMQ_QUEUE_NAME=llm_logger

# Source Configuration (Required)
MCP_SOURCE=claude

# 可选连接设置
RABBITMQ_CONNECTION_TIMEOUT=30
RABBITMQ_HEARTBEAT=600
Expand All @@ -173,13 +183,41 @@ RABBITMQ_BLOCKED_CONNECTION_TIMEOUT=300
- 🛠️ **环境变量**:通过`.env`文件进行配置管理
- ☁️ **多环境支持**:支持开发环境(Docker)和生产环境(CloudAMQP)

### Exchange设计
### Message Queue设计

- **Exchange名称**:`llmLogger`
- **Exchange名称**:`pkms`
- **Exchange类型**:`direct`
- **路由键**:`llm_logger`
- **队列名称**:`llm_logger`
- **绑定**:队列`llm_logger`通过路由键`llm_logger`绑定到Exchange `llmLogger`
- **绑定**:队列`llm_logger`通过路由键`llm_logger`绑定到Exchange `pkms`

### 消息结构

```json
{
"source": "claude",
"type": "chat" | "analysis",
"conversation_id": "str",
"sending_at": "YYYYmmdd HHMMSS",
"contents": [],
"metadata": {}
}
```

### 文件格式

```markdown
# Chat History
Conversation ID: 20250618_000500_001
Date: 2025-06-18 00:06:02
Source: claude

### User - 2025-06-18 00:06:02
...

### Assistant - 2025-06-18 00:06:02
...
```

### 可用的MCP工具

Expand All @@ -202,6 +240,7 @@ RABBITMQ_BLOCKED_CONNECTION_TIMEOUT=300
"chat_logger.py"
],
"env": {
"MCP_SOURCE": "claude",
"RABBITMQ_HOST": "your-rabbitmq-host",
"RABBITMQ_PORT": "5672",
"RABBITMQ_USERNAME": "your-username",
Expand All @@ -224,7 +263,10 @@ RABBITMQ_BLOCKED_CONNECTION_TIMEOUT=300
"/path/to/MCP_Chat_Logger",
"run",
"chat_logger.py"
]
],
"env": {
"MCP_SOURCE": "claude"
}
}
}
```
Expand Down
54 changes: 48 additions & 6 deletions README_en.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,9 +106,14 @@ RABBITMQ_PORT=5672
RABBITMQ_USERNAME=guest
RABBITMQ_PASSWORD=guest
RABBITMQ_VIRTUAL_HOST=/
RABBITMQ_EXCHANGE=llmLogger

# Message Queue Routing (Design Specification)
RABBITMQ_EXCHANGE=pkms
RABBITMQ_ROUTING_KEY=llm_logger
RABBITMQ_QUEUE_NAME=llm_logger

# Source Configuration (Required)
MCP_SOURCE=claude
```

#### Docker Commands
Expand Down Expand Up @@ -153,10 +158,15 @@ RABBITMQ_PORT=5672
RABBITMQ_USERNAME=your-username
RABBITMQ_PASSWORD=your-password
RABBITMQ_VIRTUAL_HOST=your-vhost
RABBITMQ_EXCHANGE=llmLogger

# Message Queue Routing (Design Specification)
RABBITMQ_EXCHANGE=pkms
RABBITMQ_ROUTING_KEY=llm_logger
RABBITMQ_QUEUE_NAME=llm_logger

# Source Configuration (Required)
MCP_SOURCE=claude

# Optional connection settings
RABBITMQ_CONNECTION_TIMEOUT=30
RABBITMQ_HEARTBEAT=600
Expand All @@ -173,13 +183,41 @@ RABBITMQ_BLOCKED_CONNECTION_TIMEOUT=300
- 🛠️ **Environment Variables**: Configuration management through `.env` files
- ☁️ **Multi-Environment Support**: Support for development (Docker) and production (CloudAMQP) environments

### Exchange Design
### Message Queue Design

- **Exchange Name**: `llmLogger`
- **Exchange Name**: `pkms`
- **Exchange Type**: `direct`
- **Routing Key**: `llm_logger`
- **Queue Name**: `llm_logger`
- **Binding**: Queue `llm_logger` bound to Exchange `llmLogger` with Routing Key `llm_logger`
- **Binding**: Queue `llm_logger` bound to Exchange `pkms` with Routing Key `llm_logger`

### Message Structure

```json
{
"source": "claude",
"type": "chat" | "analysis",
"conversation_id": "str",
"sending_at": "YYYYmmdd HHMMSS",
"contents": [],
"metadata": {}
}
```

### File Format

```markdown
# Chat History
Conversation ID: 20250618_000500_001
Date: 2025-06-18 00:06:02
Source: claude

### User - 2025-06-18 00:06:02
...

### Assistant - 2025-06-18 00:06:02
...
```

### Available MCP Tool

Expand All @@ -202,6 +240,7 @@ RABBITMQ_BLOCKED_CONNECTION_TIMEOUT=300
"chat_logger.py"
],
"env": {
"MCP_SOURCE": "claude",
"RABBITMQ_HOST": "your-rabbitmq-host",
"RABBITMQ_PORT": "5672",
"RABBITMQ_USERNAME": "your-username",
Expand All @@ -224,7 +263,10 @@ RABBITMQ_BLOCKED_CONNECTION_TIMEOUT=300
"/path/to/MCP_Chat_Logger",
"run",
"chat_logger.py"
]
],
"env": {
"MCP_SOURCE": "claude"
}
}
}
```
Expand Down
54 changes: 48 additions & 6 deletions README_ko.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,9 +106,14 @@ RABBITMQ_PORT=5672
RABBITMQ_USERNAME=guest
RABBITMQ_PASSWORD=guest
RABBITMQ_VIRTUAL_HOST=/
RABBITMQ_EXCHANGE=llmLogger

# Message Queue Routing (Design Specification)
RABBITMQ_EXCHANGE=pkms
RABBITMQ_ROUTING_KEY=llm_logger
RABBITMQ_QUEUE_NAME=llm_logger

# Source Configuration (Required)
MCP_SOURCE=claude
```

#### Docker 명령어
Expand Down Expand Up @@ -153,10 +158,15 @@ RABBITMQ_PORT=5672
RABBITMQ_USERNAME=your-username
RABBITMQ_PASSWORD=your-password
RABBITMQ_VIRTUAL_HOST=your-vhost
RABBITMQ_EXCHANGE=llmLogger

# Message Queue Routing (Design Specification)
RABBITMQ_EXCHANGE=pkms
RABBITMQ_ROUTING_KEY=llm_logger
RABBITMQ_QUEUE_NAME=llm_logger

# Source Configuration (Required)
MCP_SOURCE=claude

# 선택적 연결 설정
RABBITMQ_CONNECTION_TIMEOUT=30
RABBITMQ_HEARTBEAT=600
Expand All @@ -173,13 +183,41 @@ RABBITMQ_BLOCKED_CONNECTION_TIMEOUT=300
- 🛠️ **환경변수**: `.env` 파일을 통한 설정 관리
- ☁️ **다중 환경**: 개발환경(Docker)과 운영환경(CloudAMQP) 지원

### Exchange 설계
### Message Queue 설계

- **Exchange 이름**: `llmLogger`
- **Exchange 이름**: `pkms`
- **Exchange 타입**: `direct`
- **라우팅 키**: `llm_logger`
- **큐 이름**: `llm_logger`
- **바인딩**: 큐 `llm_logger`가 Exchange `llmLogger`에 라우팅 키 `llm_logger`로 바인딩됨
- **바인딩**: 큐 `llm_logger`가 Exchange `pkms`에 라우팅 키 `llm_logger`로 바인딩됨

### 메시지 구조

```json
{
"source": "claude",
"type": "chat" | "analysis",
"conversation_id": "str",
"sending_at": "YYYYmmdd HHMMSS",
"contents": [],
"metadata": {}
}
```

### 파일 형식

```markdown
# Chat History
Conversation ID: 20250618_000500_001
Date: 2025-06-18 00:06:02
Source: claude

### User - 2025-06-18 00:06:02
...

### Assistant - 2025-06-18 00:06:02
...
```

### 사용 가능한 MCP 도구

Expand All @@ -202,6 +240,7 @@ RABBITMQ_BLOCKED_CONNECTION_TIMEOUT=300
"chat_logger.py"
],
"env": {
"MCP_SOURCE": "claude",
"RABBITMQ_HOST": "your-rabbitmq-host",
"RABBITMQ_PORT": "5672",
"RABBITMQ_USERNAME": "your-username",
Expand All @@ -224,7 +263,10 @@ RABBITMQ_BLOCKED_CONNECTION_TIMEOUT=300
"/path/to/MCP_Chat_Logger",
"run",
"chat_logger.py"
]
],
"env": {
"MCP_SOURCE": "claude",
}
}
}
```
Expand Down
29 changes: 20 additions & 9 deletions chat_logger.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from typing import List, Dict, Any
from typing import List, Dict, Any, Optional
import os
import re
from datetime import datetime
from dotenv import load_dotenv
from mcp.server.fastmcp import FastMCP
Expand Down Expand Up @@ -69,10 +70,15 @@ async def save_chat_history(messages: List[Dict[str, Any]], conversation_id: str
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"chat_logs/chat_{conversation_id}_{timestamp}.md" if conversation_id else f"chat_logs/chat_{timestamp}.md"

# Format all messages
# Get source from environment variable
source = os.getenv('MCP_SOURCE', 'claude')

# Format content according to design specification
formatted_content = "# Chat History\n\n"
formatted_content += f"Conversation ID: {conversation_id}\n" if conversation_id else ""
formatted_content += f"Date: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n"
if conversation_id:
formatted_content += f"Conversation ID: {conversation_id}\n"
formatted_content += f"Date: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n"
formatted_content += f"Source: {source}\n\n"

for message in messages:
formatted_content += format_message(message)
Expand All @@ -90,33 +96,38 @@ async def save_chat_history(messages: List[Dict[str, Any]], conversation_id: str
"filename": filename,
"file_size": os.path.getsize(filename),
"message_count": len(messages),
"save_timestamp": timestamp
"save_timestamp": timestamp,
"source": source
}

publish_success = publish_chat_message(
messages=messages,
conversation_id=conversation_id,
message_type="chat",
additional_metadata=additional_metadata
)

if publish_success:
result_message += "\n✓ RabbitMQ message published successfully"
result_message += f"\n✓ RabbitMQ message published successfully (source: {source})"
else:
result_message += "\n⚠ RabbitMQ message publish failed (file saved successfully)"

except Exception as e:
result_message += f"\n⚠ RabbitMQ publish error: {str(e)} (file saved successfully)"
else:
result_message += "\nℹ RabbitMQ not configured - file-only mode"
result_message += f"\nℹ RabbitMQ not configured - file-only mode (source: {source})"

return result_message

if __name__ == "__main__":
# Get source for startup message
source = os.getenv('MCP_SOURCE', 'claude')

# Print startup message based on AMQP configuration
if USE_AMQP:
print("🔧 MCP Chat Logger starting with RabbitMQ enabled")
print(f"🔧 MCP Chat Logger starting with RabbitMQ enabled (source: {source})")
else:
print("🔧 MCP Chat Logger starting in file-only mode (RabbitMQ not configured)")
print(f"🔧 MCP Chat Logger starting in file-only mode (source: {source})")

# Initialize and run the server
mcp.run(transport='stdio')
2 changes: 1 addition & 1 deletion dev-tools/test_rabbitmq.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import os
import sys
from dotenv import load_dotenv
from rabbitmq_publisher import RabbitMQPublisher
from MCP_Chat_Logger.utils.rabbitmq_publisher import RabbitMQPublisher

def main():
"""Main function"""
Expand Down
Loading