eulerian-marketing-platform 0.2.2__tar.gz → 0.2.4__tar.gz
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.
- {eulerian_marketing_platform-0.2.2 → eulerian_marketing_platform-0.2.4}/PKG-INFO +4 -1
- {eulerian_marketing_platform-0.2.2 → eulerian_marketing_platform-0.2.4}/README.md +3 -0
- {eulerian_marketing_platform-0.2.2 → eulerian_marketing_platform-0.2.4}/pyproject.toml +1 -1
- {eulerian_marketing_platform-0.2.2 → eulerian_marketing_platform-0.2.4}/setup.cfg +1 -1
- {eulerian_marketing_platform-0.2.2 → eulerian_marketing_platform-0.2.4}/src/eulerian_marketing_platform/__init__.py +1 -1
- {eulerian_marketing_platform-0.2.2 → eulerian_marketing_platform-0.2.4}/src/eulerian_marketing_platform/server.py +45 -8
- {eulerian_marketing_platform-0.2.2 → eulerian_marketing_platform-0.2.4}/src/eulerian_marketing_platform.egg-info/PKG-INFO +4 -1
- {eulerian_marketing_platform-0.2.2 → eulerian_marketing_platform-0.2.4}/.env.example +0 -0
- {eulerian_marketing_platform-0.2.2 → eulerian_marketing_platform-0.2.4}/LICENSE +0 -0
- {eulerian_marketing_platform-0.2.2 → eulerian_marketing_platform-0.2.4}/MANIFEST.in +0 -0
- {eulerian_marketing_platform-0.2.2 → eulerian_marketing_platform-0.2.4}/requirements.txt +0 -0
- {eulerian_marketing_platform-0.2.2 → eulerian_marketing_platform-0.2.4}/src/eulerian_marketing_platform.egg-info/SOURCES.txt +0 -0
- {eulerian_marketing_platform-0.2.2 → eulerian_marketing_platform-0.2.4}/src/eulerian_marketing_platform.egg-info/dependency_links.txt +0 -0
- {eulerian_marketing_platform-0.2.2 → eulerian_marketing_platform-0.2.4}/src/eulerian_marketing_platform.egg-info/entry_points.txt +0 -0
- {eulerian_marketing_platform-0.2.2 → eulerian_marketing_platform-0.2.4}/src/eulerian_marketing_platform.egg-info/requires.txt +0 -0
- {eulerian_marketing_platform-0.2.2 → eulerian_marketing_platform-0.2.4}/src/eulerian_marketing_platform.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: eulerian_marketing_platform
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.4
|
|
4
4
|
Summary: MCP server for Eulerian Marketing Platform - enables AI assistants to interact with Eulerian's marketing analytics and campaign management APIs
|
|
5
5
|
Author-email: Eulerian Technologies <mathieu@eulerian.com>
|
|
6
6
|
License: MIT
|
|
@@ -377,6 +377,9 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
|
|
|
377
377
|
|
|
378
378
|
## Changelog
|
|
379
379
|
|
|
380
|
+
### 0.2.3
|
|
381
|
+
- fixes disconnection issue with notifications
|
|
382
|
+
|
|
380
383
|
### 0.2.0
|
|
381
384
|
- Move to full Proxy mode
|
|
382
385
|
- Remove instructions for uvx deployment
|
|
@@ -349,6 +349,9 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
|
|
|
349
349
|
|
|
350
350
|
## Changelog
|
|
351
351
|
|
|
352
|
+
### 0.2.3
|
|
353
|
+
- fixes disconnection issue with notifications
|
|
354
|
+
|
|
352
355
|
### 0.2.0
|
|
353
356
|
- Move to full Proxy mode
|
|
354
357
|
- Remove instructions for uvx deployment
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "eulerian_marketing_platform"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.4"
|
|
8
8
|
description = "MCP server for Eulerian Marketing Platform - enables AI assistants to interact with Eulerian's marketing analytics and campaign management APIs"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
authors = [
|
|
@@ -74,12 +74,13 @@ def forward_request(request_data: dict) -> dict:
|
|
|
74
74
|
request_data: The JSON-RPC request to forward
|
|
75
75
|
|
|
76
76
|
Returns:
|
|
77
|
-
The JSON-RPC response from the remote server
|
|
77
|
+
The JSON-RPC response from the remote server, or None for notifications
|
|
78
78
|
"""
|
|
79
79
|
timeout = float(os.environ.get("EMP_TIMEOUT", "300"))
|
|
80
80
|
|
|
81
81
|
request_id = request_data.get("id")
|
|
82
82
|
method = request_data.get("method")
|
|
83
|
+
is_notification = request_id is None
|
|
83
84
|
|
|
84
85
|
logger.info(f">>> REQUEST: {method} (id: {request_id})")
|
|
85
86
|
logger.debug(f" Full request: {json.dumps(request_data)[:200]}...")
|
|
@@ -104,6 +105,11 @@ def forward_request(request_data: dict) -> dict:
|
|
|
104
105
|
error_msg = f"HTTP {response.status_code}: {response.reason_phrase}"
|
|
105
106
|
logger.error(f" Error: {response.text[:200]}")
|
|
106
107
|
|
|
108
|
+
# For notifications, don't return error responses
|
|
109
|
+
if is_notification:
|
|
110
|
+
logger.info(" Notification error - no response sent")
|
|
111
|
+
return None
|
|
112
|
+
|
|
107
113
|
return {
|
|
108
114
|
"jsonrpc": "2.0",
|
|
109
115
|
"id": request_id,
|
|
@@ -118,6 +124,11 @@ def forward_request(request_data: dict) -> dict:
|
|
|
118
124
|
response_data = response.json()
|
|
119
125
|
logger.debug(f" Response: {json.dumps(response_data)[:200]}...")
|
|
120
126
|
|
|
127
|
+
# For notifications, we should not send back any response, regardless of what the remote server returns
|
|
128
|
+
if is_notification:
|
|
129
|
+
logger.info(" Notification processed - no response sent")
|
|
130
|
+
return None
|
|
131
|
+
|
|
121
132
|
# Validate JSON-RPC response
|
|
122
133
|
if "jsonrpc" not in response_data:
|
|
123
134
|
logger.warning(" WARNING: Missing 'jsonrpc' field")
|
|
@@ -131,6 +142,12 @@ def forward_request(request_data: dict) -> dict:
|
|
|
131
142
|
|
|
132
143
|
except json.JSONDecodeError as e:
|
|
133
144
|
logger.error(f" ERROR: Invalid JSON - {e}")
|
|
145
|
+
|
|
146
|
+
# For notifications, don't return error responses
|
|
147
|
+
if is_notification:
|
|
148
|
+
logger.info(" Notification JSON error - no response sent")
|
|
149
|
+
return None
|
|
150
|
+
|
|
134
151
|
return {
|
|
135
152
|
"jsonrpc": "2.0",
|
|
136
153
|
"id": request_id,
|
|
@@ -142,6 +159,12 @@ def forward_request(request_data: dict) -> dict:
|
|
|
142
159
|
|
|
143
160
|
except httpx.TimeoutException:
|
|
144
161
|
logger.error("ERROR: Request timeout")
|
|
162
|
+
|
|
163
|
+
# For notifications, don't return error responses
|
|
164
|
+
if is_notification:
|
|
165
|
+
logger.info(" Notification timeout - no response sent")
|
|
166
|
+
return None
|
|
167
|
+
|
|
145
168
|
return {
|
|
146
169
|
"jsonrpc": "2.0",
|
|
147
170
|
"id": request_id,
|
|
@@ -153,6 +176,12 @@ def forward_request(request_data: dict) -> dict:
|
|
|
153
176
|
|
|
154
177
|
except httpx.RequestError as e:
|
|
155
178
|
logger.error(f"ERROR: Request failed - {str(e)}")
|
|
179
|
+
|
|
180
|
+
# For notifications, don't return error responses
|
|
181
|
+
if is_notification:
|
|
182
|
+
logger.info(" Notification request error - no response sent")
|
|
183
|
+
return None
|
|
184
|
+
|
|
156
185
|
return {
|
|
157
186
|
"jsonrpc": "2.0",
|
|
158
187
|
"id": request_id,
|
|
@@ -166,6 +195,12 @@ def forward_request(request_data: dict) -> dict:
|
|
|
166
195
|
logger.error(f"ERROR: Unexpected error - {str(e)}")
|
|
167
196
|
import traceback
|
|
168
197
|
logger.error(f"Traceback: {traceback.format_exc()}")
|
|
198
|
+
|
|
199
|
+
# For notifications, don't return error responses
|
|
200
|
+
if is_notification:
|
|
201
|
+
logger.info(" Notification unexpected error - no response sent")
|
|
202
|
+
return None
|
|
203
|
+
|
|
169
204
|
return {
|
|
170
205
|
"jsonrpc": "2.0",
|
|
171
206
|
"id": request_id,
|
|
@@ -216,12 +251,15 @@ def main() -> None:
|
|
|
216
251
|
# Forward to remote server
|
|
217
252
|
response_data = forward_request(request_data)
|
|
218
253
|
|
|
219
|
-
#
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
254
|
+
# Only send response for non-notifications (when response_data is not None)
|
|
255
|
+
if response_data is not None:
|
|
256
|
+
response_json = json.dumps(response_data)
|
|
257
|
+
print(response_json, flush=True)
|
|
258
|
+
sys.stdout.flush()
|
|
259
|
+
logger.info(" Response forwarded [OK]")
|
|
260
|
+
else:
|
|
261
|
+
logger.info(" Notification processed (no response sent)")
|
|
262
|
+
|
|
225
263
|
except json.JSONDecodeError as e:
|
|
226
264
|
logger.error(f"ERROR: Invalid JSON in request - {e}")
|
|
227
265
|
logger.error(f" Problematic line: {line[:200]}")
|
|
@@ -277,4 +315,3 @@ def main() -> None:
|
|
|
277
315
|
|
|
278
316
|
if __name__ == "__main__":
|
|
279
317
|
main()
|
|
280
|
-
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: eulerian-marketing-platform
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.4
|
|
4
4
|
Summary: MCP server for Eulerian Marketing Platform - enables AI assistants to interact with Eulerian's marketing analytics and campaign management APIs
|
|
5
5
|
Author-email: Eulerian Technologies <mathieu@eulerian.com>
|
|
6
6
|
License: MIT
|
|
@@ -377,6 +377,9 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
|
|
|
377
377
|
|
|
378
378
|
## Changelog
|
|
379
379
|
|
|
380
|
+
### 0.2.3
|
|
381
|
+
- fixes disconnection issue with notifications
|
|
382
|
+
|
|
380
383
|
### 0.2.0
|
|
381
384
|
- Move to full Proxy mode
|
|
382
385
|
- Remove instructions for uvx deployment
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|