|
|
|
|
|
|
|
|
import json |
|
|
import uuid |
|
|
from datetime import datetime |
|
|
from aiohttp import web |
|
|
|
|
|
class EmailServer: |
|
|
"""Email MCP server""" |
|
|
|
|
|
def __init__(self): |
|
|
self.threads = {} |
|
|
self.messages = [] |
|
|
|
|
|
async def handle_rpc(self, request): |
|
|
data = await request.json() |
|
|
method = data.get("method") |
|
|
params = data.get("params", {}) |
|
|
|
|
|
if method == "health": |
|
|
return web.json_response({"result": "ok"}) |
|
|
|
|
|
elif method == "email.send": |
|
|
|
|
|
thread_id = str(uuid.uuid4()) |
|
|
message_id = str(uuid.uuid4()) |
|
|
|
|
|
|
|
|
prospect_id = params.get("prospect_id", "unknown") |
|
|
|
|
|
message = { |
|
|
"id": message_id, |
|
|
"thread_id": thread_id, |
|
|
"prospect_id": prospect_id, |
|
|
"direction": "outbound", |
|
|
"to": params["to"], |
|
|
"subject": params["subject"], |
|
|
"body": params["body"], |
|
|
"sent_at": datetime.utcnow().isoformat() |
|
|
} |
|
|
|
|
|
self.messages.append(message) |
|
|
|
|
|
if thread_id not in self.threads: |
|
|
self.threads[thread_id] = { |
|
|
"id": thread_id, |
|
|
"prospect_id": prospect_id, |
|
|
"messages": [] |
|
|
} |
|
|
self.threads[thread_id]["messages"].append(message) |
|
|
|
|
|
return web.json_response({ |
|
|
"result": { |
|
|
"thread_id": thread_id, |
|
|
"message_id": message_id, |
|
|
"prospect_id": prospect_id |
|
|
} |
|
|
}) |
|
|
|
|
|
elif method == "email.thread": |
|
|
prospect_id = params.get("prospect_id") |
|
|
|
|
|
|
|
|
for thread_id, thread_data in self.threads.items(): |
|
|
if thread_data.get("prospect_id") == prospect_id: |
|
|
return web.json_response({ |
|
|
"result": { |
|
|
"id": thread_id, |
|
|
"prospect_id": prospect_id, |
|
|
"messages": thread_data["messages"] |
|
|
} |
|
|
}) |
|
|
|
|
|
|
|
|
prospect_messages = [ |
|
|
m for m in self.messages |
|
|
if m.get("prospect_id") == prospect_id |
|
|
] |
|
|
|
|
|
if prospect_messages: |
|
|
thread_id = prospect_messages[0]["thread_id"] |
|
|
return web.json_response({ |
|
|
"result": { |
|
|
"id": thread_id, |
|
|
"prospect_id": prospect_id, |
|
|
"messages": prospect_messages |
|
|
} |
|
|
}) |
|
|
|
|
|
return web.json_response({"result": None}) |
|
|
|
|
|
return web.json_response({"error": "Unknown method"}, status=400) |
|
|
|
|
|
app = web.Application() |
|
|
server = EmailServer() |
|
|
app.router.add_post("/rpc", server.handle_rpc) |
|
|
|
|
|
if __name__ == "__main__": |
|
|
web.run_app(app, port=9002) |