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_ecbiesek_mcp-1.3.0.dist-info → sienge_ecbiesek_mcp-1.5.1.dist-info}/METADATA +2 -2
- sienge_ecbiesek_mcp-1.5.1.dist-info/RECORD +11 -0
- sienge_mcp/__init__.py +1 -1
- sienge_mcp/server.py +3955 -2568
- sienge_mcp/server2.py +11 -1
- sienge_mcp/utils/logger.py +173 -168
- sienge_ecbiesek_mcp-1.3.0.dist-info/RECORD +0 -11
- {sienge_ecbiesek_mcp-1.3.0.dist-info → sienge_ecbiesek_mcp-1.5.1.dist-info}/WHEEL +0 -0
- {sienge_ecbiesek_mcp-1.3.0.dist-info → sienge_ecbiesek_mcp-1.5.1.dist-info}/entry_points.txt +0 -0
- {sienge_ecbiesek_mcp-1.3.0.dist-info → sienge_ecbiesek_mcp-1.5.1.dist-info}/licenses/LICENSE +0 -0
- {sienge_ecbiesek_mcp-1.3.0.dist-info → sienge_ecbiesek_mcp-1.5.1.dist-info}/top_level.txt +0 -0
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,
|
sienge_mcp/utils/logger.py
CHANGED
|
@@ -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
|
|
111
|
-
"""Log
|
|
112
|
-
log_message = message + (self._format_data(data) if data else "")
|
|
113
|
-
self.logger.
|
|
114
|
-
|
|
115
|
-
def
|
|
116
|
-
"""Log
|
|
117
|
-
self.
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
def
|
|
152
|
-
"""Log
|
|
153
|
-
get_logger().
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
def
|
|
157
|
-
"""Log
|
|
158
|
-
get_logger().
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
def
|
|
162
|
-
"""Log
|
|
163
|
-
get_logger().
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
def
|
|
167
|
-
"""Log
|
|
168
|
-
get_logger().
|
|
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,,
|
|
File without changes
|
{sienge_ecbiesek_mcp-1.3.0.dist-info → sienge_ecbiesek_mcp-1.5.1.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{sienge_ecbiesek_mcp-1.3.0.dist-info → sienge_ecbiesek_mcp-1.5.1.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
|
File without changes
|