sienge-ecbiesek-mcp 1.3.0__py3-none-any.whl → 1.5.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of sienge-ecbiesek-mcp might be problematic. Click here for more details.

sienge_mcp/server2.py CHANGED
@@ -248,8 +248,18 @@ async def make_sienge_request(
248
248
  latency = time.time() - start_time
249
249
  _log_request(method, endpoint, response.status_code, latency, req_id)
250
250
 
251
- if response.status_code in [200, 201]:
251
+ if response.status_code in [200, 201, 204]:
252
252
  try:
253
+ # HTTP 204 No Content não tem body
254
+ if response.status_code == 204:
255
+ return {
256
+ "success": True,
257
+ "data": None,
258
+ "status_code": response.status_code,
259
+ "request_id": req_id,
260
+ "latency_ms": round(latency * 1000, 2)
261
+ }
262
+
253
263
  data = response.json()
254
264
  result = {
255
265
  "success": True,
@@ -1,168 +1,173 @@
1
- """
2
- SPDX-FileCopyrightText: © 2025 Moizes Silva
3
- SPDX-License-Identifier: MIT
4
-
5
- Logger module for Sienge MCP Server
6
-
7
- This module provides logging functionality for the server,
8
- writing logs to a file to avoid interfering with MCP communication.
9
- """
10
-
11
- import logging
12
- import os
13
- from enum import Enum
14
- from pathlib import Path
15
- from typing import Any, Optional, Dict
16
-
17
-
18
- class LogLevel(Enum):
19
- """Log levels enum"""
20
-
21
- TRACE = 5
22
- DEBUG = 10
23
- INFO = 20
24
- WARN = 30
25
- ERROR = 40
26
-
27
-
28
- class SiengeLogger:
29
- """
30
- Professional logging system for Sienge MCP Server
31
- Based on ClickUp MCP logging patterns
32
- """
33
-
34
- def __init__(self, name: str = "SiengeMCP"):
35
- self.name = name
36
- self.pid = os.getpid()
37
- self.logger = self._setup_logger()
38
-
39
- def _setup_logger(self) -> logging.Logger:
40
- """Setup logger with file output only"""
41
- logger = logging.getLogger(self.name)
42
- logger.setLevel(logging.DEBUG)
43
-
44
- # Prevent duplicate handlers
45
- if logger.handlers:
46
- return logger
47
-
48
- # Create logs directory if it doesn't exist
49
- log_dir = Path(__file__).parent.parent.parent.parent / "logs"
50
- log_dir.mkdir(exist_ok=True)
51
-
52
- # Create file handler
53
- log_file = log_dir / "sienge-mcp.log"
54
- file_handler = logging.FileHandler(log_file, mode="w", encoding="utf-8")
55
-
56
- # Create formatter
57
- formatter = logging.Formatter(
58
- "[%(asctime)s] [PID:%(process)d] %(levelname)s [%(name)s]: %(message)s", datefmt="%Y-%m-%d %H:%M:%S"
59
- )
60
- file_handler.setFormatter(formatter)
61
-
62
- logger.addHandler(file_handler)
63
-
64
- # Log initialization
65
- logger.info(f"Logger initialized for {self.name}")
66
-
67
- return logger
68
-
69
- def _format_data(self, data: Any) -> str:
70
- """Format data for logging"""
71
- if data is None:
72
- return ""
73
-
74
- if isinstance(data, dict):
75
- if len(data) <= 4 and all(not isinstance(v, (dict, list)) or v is None for v in data.values()):
76
- # Simple object with few properties - format inline
77
- items = [f"{k}={v}" for k, v in data.items()]
78
- return f" | {' | '.join(items)}"
79
- else:
80
- # Complex object - format as JSON
81
- import json
82
-
83
- try:
84
- return f" | {json.dumps(data, indent=2, ensure_ascii=False)}"
85
- except (TypeError, ValueError):
86
- return f" | {str(data)}"
87
-
88
- return f" | {str(data)}"
89
-
90
- def trace(self, message: str, data: Optional[Dict[str, Any]] = None):
91
- """Log trace level message"""
92
- log_message = message + (self._format_data(data) if data else "")
93
- self.logger.log(LogLevel.TRACE.value, log_message)
94
-
95
- def debug(self, message: str, data: Optional[Dict[str, Any]] = None):
96
- """Log debug level message"""
97
- log_message = message + (self._format_data(data) if data else "")
98
- self.logger.debug(log_message)
99
-
100
- def info(self, message: str, data: Optional[Dict[str, Any]] = None):
101
- """Log info level message"""
102
- log_message = message + (self._format_data(data) if data else "")
103
- self.logger.info(log_message)
104
-
105
- def warn(self, message: str, data: Optional[Dict[str, Any]] = None):
106
- """Log warning level message"""
107
- log_message = message + (self._format_data(data) if data else "")
108
- self.logger.warning(log_message)
109
-
110
- def error(self, message: str, data: Optional[Dict[str, Any]] = None):
111
- """Log error level message"""
112
- log_message = message + (self._format_data(data) if data else "")
113
- self.logger.error(log_message)
114
-
115
- def log_operation(self, operation: str, data: Optional[Dict[str, Any]] = None):
116
- """Log API operation with data"""
117
- self.debug(f"Operation: {operation}", data)
118
-
119
- def log_request(self, method: str, url: str, data: Optional[Dict[str, Any]] = None):
120
- """Log HTTP request"""
121
- request_data = {"method": method, "url": url}
122
- if data:
123
- request_data["data"] = data
124
- self.debug("HTTP Request", request_data)
125
-
126
- def log_response(self, status_code: int, url: str, data: Optional[Dict[str, Any]] = None):
127
- """Log HTTP response"""
128
- response_data = {"status": status_code, "url": url}
129
- if data:
130
- response_data["response"] = data
131
- self.debug("HTTP Response", response_data)
132
-
133
-
134
- # Global logger instances
135
- _loggers: Dict[str, SiengeLogger] = {}
136
-
137
-
138
- def get_logger(name: str = "SiengeMCP") -> SiengeLogger:
139
- """Get or create a logger instance"""
140
- if name not in _loggers:
141
- _loggers[name] = SiengeLogger(name)
142
- return _loggers[name]
143
-
144
-
145
- # Convenience functions for default logger
146
- def trace(message: str, data: Optional[Dict[str, Any]] = None):
147
- """Log trace level message using default logger"""
148
- get_logger().trace(message, data)
149
-
150
-
151
- def debug(message: str, data: Optional[Dict[str, Any]] = None):
152
- """Log debug level message using default logger"""
153
- get_logger().debug(message, data)
154
-
155
-
156
- def info(message: str, data: Optional[Dict[str, Any]] = None):
157
- """Log info level message using default logger"""
158
- get_logger().info(message, data)
159
-
160
-
161
- def warn(message: str, data: Optional[Dict[str, Any]] = None):
162
- """Log warning level message using default logger"""
163
- get_logger().warn(message, data)
164
-
165
-
166
- def error(message: str, data: Optional[Dict[str, Any]] = None):
167
- """Log error level message using default logger"""
168
- get_logger().error(message, data)
1
+ """
2
+ SPDX-FileCopyrightText: © 2025 Moizes Silva
3
+ SPDX-License-Identifier: MIT
4
+
5
+ Logger module for Sienge MCP Server
6
+
7
+ This module provides logging functionality for the server,
8
+ writing logs to a file to avoid interfering with MCP communication.
9
+ """
10
+
11
+ import logging
12
+ import os
13
+ from enum import Enum
14
+ from pathlib import Path
15
+ from typing import Any, Optional, Dict
16
+
17
+
18
+ class LogLevel(Enum):
19
+ """Log levels enum"""
20
+
21
+ TRACE = 5
22
+ DEBUG = 10
23
+ INFO = 20
24
+ WARN = 30
25
+ ERROR = 40
26
+
27
+
28
+ class SiengeLogger:
29
+ """
30
+ Professional logging system for Sienge MCP Server
31
+ Based on ClickUp MCP logging patterns
32
+ """
33
+
34
+ def __init__(self, name: str = "SiengeMCP"):
35
+ self.name = name
36
+ self.pid = os.getpid()
37
+ self.logger = self._setup_logger()
38
+
39
+ def _setup_logger(self) -> logging.Logger:
40
+ """Setup logger with file output only"""
41
+ logger = logging.getLogger(self.name)
42
+ logger.setLevel(logging.DEBUG)
43
+
44
+ # Prevent duplicate handlers
45
+ if logger.handlers:
46
+ return logger
47
+
48
+ # Create logs directory if it doesn't exist
49
+ log_dir = Path(__file__).parent.parent.parent.parent / "logs"
50
+ log_dir.mkdir(exist_ok=True)
51
+
52
+ # Create file handler
53
+ log_file = log_dir / "sienge-mcp.log"
54
+ file_handler = logging.FileHandler(log_file, mode="w", encoding="utf-8")
55
+
56
+ # Create formatter
57
+ formatter = logging.Formatter(
58
+ "[%(asctime)s] [PID:%(process)d] %(levelname)s [%(name)s]: %(message)s", datefmt="%Y-%m-%d %H:%M:%S"
59
+ )
60
+ file_handler.setFormatter(formatter)
61
+
62
+ logger.addHandler(file_handler)
63
+
64
+ # Log initialization
65
+ logger.info(f"Logger initialized for {self.name}")
66
+
67
+ return logger
68
+
69
+ def _format_data(self, data: Any) -> str:
70
+ """Format data for logging"""
71
+ if data is None:
72
+ return ""
73
+
74
+ if isinstance(data, dict):
75
+ if len(data) <= 4 and all(not isinstance(v, (dict, list)) or v is None for v in data.values()):
76
+ # Simple object with few properties - format inline
77
+ items = [f"{k}={v}" for k, v in data.items()]
78
+ return f" | {' | '.join(items)}"
79
+ else:
80
+ # Complex object - format as JSON
81
+ import json
82
+
83
+ try:
84
+ return f" | {json.dumps(data, indent=2, ensure_ascii=False)}"
85
+ except (TypeError, ValueError):
86
+ return f" | {str(data)}"
87
+
88
+ return f" | {str(data)}"
89
+
90
+ def trace(self, message: str, data: Optional[Dict[str, Any]] = None):
91
+ """Log trace level message"""
92
+ log_message = message + (self._format_data(data) if data else "")
93
+ self.logger.log(LogLevel.TRACE.value, log_message)
94
+
95
+ def debug(self, message: str, data: Optional[Dict[str, Any]] = None):
96
+ """Log debug level message"""
97
+ log_message = message + (self._format_data(data) if data else "")
98
+ self.logger.debug(log_message)
99
+
100
+ def info(self, message: str, data: Optional[Dict[str, Any]] = None):
101
+ """Log info level message"""
102
+ log_message = message + (self._format_data(data) if data else "")
103
+ self.logger.info(log_message)
104
+
105
+ def warn(self, message: str, data: Optional[Dict[str, Any]] = None):
106
+ """Log warning level message"""
107
+ log_message = message + (self._format_data(data) if data else "")
108
+ self.logger.warning(log_message)
109
+
110
+ def warning(self, message: str, data: Optional[Dict[str, Any]] = None, exc_info: bool = False):
111
+ """Log warning level message (alias for warn, compatible with standard logging)"""
112
+ log_message = message + (self._format_data(data) if data else "")
113
+ self.logger.warning(log_message, exc_info=exc_info)
114
+
115
+ def error(self, message: str, data: Optional[Dict[str, Any]] = None, exc_info: bool = False):
116
+ """Log error level message"""
117
+ log_message = message + (self._format_data(data) if data else "")
118
+ self.logger.error(log_message, exc_info=exc_info)
119
+
120
+ def log_operation(self, operation: str, data: Optional[Dict[str, Any]] = None):
121
+ """Log API operation with data"""
122
+ self.debug(f"Operation: {operation}", data)
123
+
124
+ def log_request(self, method: str, url: str, data: Optional[Dict[str, Any]] = None):
125
+ """Log HTTP request"""
126
+ request_data = {"method": method, "url": url}
127
+ if data:
128
+ request_data["data"] = data
129
+ self.debug("HTTP Request", request_data)
130
+
131
+ def log_response(self, status_code: int, url: str, data: Optional[Dict[str, Any]] = None):
132
+ """Log HTTP response"""
133
+ response_data = {"status": status_code, "url": url}
134
+ if data:
135
+ response_data["response"] = data
136
+ self.debug("HTTP Response", response_data)
137
+
138
+
139
+ # Global logger instances
140
+ _loggers: Dict[str, SiengeLogger] = {}
141
+
142
+
143
+ def get_logger(name: str = "SiengeMCP") -> SiengeLogger:
144
+ """Get or create a logger instance"""
145
+ if name not in _loggers:
146
+ _loggers[name] = SiengeLogger(name)
147
+ return _loggers[name]
148
+
149
+
150
+ # Convenience functions for default logger
151
+ def trace(message: str, data: Optional[Dict[str, Any]] = None):
152
+ """Log trace level message using default logger"""
153
+ get_logger().trace(message, data)
154
+
155
+
156
+ def debug(message: str, data: Optional[Dict[str, Any]] = None):
157
+ """Log debug level message using default logger"""
158
+ get_logger().debug(message, data)
159
+
160
+
161
+ def info(message: str, data: Optional[Dict[str, Any]] = None):
162
+ """Log info level message using default logger"""
163
+ get_logger().info(message, data)
164
+
165
+
166
+ def warn(message: str, data: Optional[Dict[str, Any]] = None):
167
+ """Log warning level message using default logger"""
168
+ get_logger().warn(message, data)
169
+
170
+
171
+ def error(message: str, data: Optional[Dict[str, Any]] = None):
172
+ """Log error level message using default logger"""
173
+ get_logger().error(message, data)
@@ -1,11 +0,0 @@
1
- sienge_ecbiesek_mcp-1.3.0.dist-info/licenses/LICENSE,sha256=leWD46QLXsQ43M8fE_KgOo5Sf0YB9_X8EVqGdV0Dsc0,1101
2
- sienge_mcp/__init__.py,sha256=OOMLod2KVJXmT8myT7rtGLUjQHiSTFWn_46Gf98MJvw,297
3
- sienge_mcp/metadata.py,sha256=wN_XSjUkHJ0QA38CaCtAR7ImsYndSvBPrTmRe8gSLdM,1109
4
- sienge_mcp/server.py,sha256=-f-hd6zd4A_lP0MnFvg1EteHiKpmG5Jy3AbNmVK5d7E,96545
5
- sienge_mcp/server2.py,sha256=2pAJcpF29bjOM4rd6rc-yzWYIdGWjYr5BlVc3pxsD8E,102160
6
- sienge_mcp/utils/logger.py,sha256=SkykSLbb_qajZ1FZlEbq-D99zvBlJRGrB9_i3QAngjg,5708
7
- sienge_ecbiesek_mcp-1.3.0.dist-info/METADATA,sha256=VFaqYvtqO_L73KZM24B7-FNg5uQoFDd48o7bVkjgW44,12879
8
- sienge_ecbiesek_mcp-1.3.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
9
- sienge_ecbiesek_mcp-1.3.0.dist-info/entry_points.txt,sha256=jxEu6gvTw3ci0mjDfqbi0rBLRpeuscwwRk9-H-UOnO8,63
10
- sienge_ecbiesek_mcp-1.3.0.dist-info/top_level.txt,sha256=FCvuhB9JQPKGY0Q8aKoVc7akqG5htoJyfj-eJvVUmWM,11
11
- sienge_ecbiesek_mcp-1.3.0.dist-info/RECORD,,