Refactor SSE endpoints to /mcp and fix library type errors
All checks were successful
Build and Push Monarch MCP Docker Image / build (push) Successful in 7s

This commit is contained in:
Ben
2025-12-24 01:57:38 +00:00
parent 7444fb9229
commit f17e485612
2 changed files with 25 additions and 9 deletions

View File

@@ -30,7 +30,7 @@ docker-compose up -d
## 🔌 Connection ## 🔌 Connection
The server will be available at: The server will be available at:
- **SSE Endpoint**: `http://localhost:8000/mcp/sse` - **MCP Endpoint**: `http://localhost:8000/mcp`
- **Health Check**: `http://localhost:8000/health` - **Health Check**: `http://localhost:8000/health`
## 🛠️ Tools Included ## 🛠️ Tools Included

View File

@@ -13,7 +13,8 @@ from dotenv import load_dotenv
from fastmcp import FastMCP from fastmcp import FastMCP
from starlette.applications import Starlette from starlette.applications import Starlette
from starlette.responses import JSONResponse from starlette.responses import JSONResponse
from starlette.routing import Route, Mount from starlette.routing import Route
from mcp.server.sse import SseServerTransport
import uvicorn import uvicorn
from monarch_mcp_custom.auth import get_authenticated_client from monarch_mcp_custom.auth import get_authenticated_client
@@ -144,8 +145,8 @@ async def get_account_holdings(account_id: str) -> str:
"""Get investment holdings for a specific account.""" """Get investment holdings for a specific account."""
try: try:
client = await get_authenticated_client() client = await get_authenticated_client()
# Ensure account_id is treated correctly (usually string ID in Monarch) # The library expects an int for account_id
holdings = await client.get_account_holdings(account_id) holdings = await client.get_account_holdings(int(account_id))
return serialize_json(holdings) return serialize_json(holdings)
except Exception as e: except Exception as e:
logger.error(f"Failed to get holdings: {e}") logger.error(f"Failed to get holdings: {e}")
@@ -157,7 +158,8 @@ async def refresh_accounts() -> str:
"""Request a refresh of account data from financial institutions.""" """Request a refresh of account data from financial institutions."""
try: try:
client = await get_authenticated_client() client = await get_authenticated_client()
result = await client.request_accounts_refresh() # Request refresh for all accounts (empty list often means all in this library)
result = await client.request_accounts_refresh([])
return serialize_json(result) return serialize_json(result)
except Exception as e: except Exception as e:
logger.error(f"Failed to refresh accounts: {e}") logger.error(f"Failed to refresh accounts: {e}")
@@ -176,15 +178,29 @@ async def health_check(request):
def create_app(): def create_app():
"""Create the Starlette application with MCP mounted at /mcp.""" """Create the Starlette application with MCP at /mcp."""
mcp_app = mcp.http_app() # SSE Transport following the "newer http-streamable" convention:
# Stream endpoint at /mcp, messages at /mcp/messages
sse = SseServerTransport("/mcp/messages")
async def handle_sse(request):
async with sse.connect_sse(request.scope, request.receive, request._send) as (
read_stream,
write_stream,
):
await mcp.run(
read_stream,
write_stream,
mcp.create_initialization_options(),
)
routes = [ routes = [
Route("/health", health_check, methods=["GET"]), Route("/health", health_check, methods=["GET"]),
Mount("/mcp", app=mcp_app), Route("/mcp", endpoint=handle_sse, methods=["GET"]),
Route("/mcp/messages", endpoint=sse.handle_post_message, methods=["POST"]),
] ]
return Starlette(routes=routes, lifespan=mcp_app.lifespan) return Starlette(routes=routes, lifespan=mcp.lifespan)
app = create_app() app = create_app()