Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions marimo/_mcp/server/lifespan.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
# Copyright 2025 Marimo. All rights reserved.
import contextlib
from collections.abc import AsyncIterator

from starlette.applications import Starlette
from typing import TYPE_CHECKING

from marimo._loggers import marimo_logger
from marimo._mcp.server.main import setup_mcp_server

LOGGER = marimo_logger()

if TYPE_CHECKING:
from starlette.applications import Starlette


@contextlib.asynccontextmanager
async def mcp_server_lifespan(app: Starlette) -> AsyncIterator[None]:
async def mcp_server_lifespan(app: "Starlette") -> AsyncIterator[None]:
"""Lifespan for MCP server functionality (exposing marimo as MCP server)."""

try:
Expand Down
2 changes: 1 addition & 1 deletion marimo/_mcp/server/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
from typing import TYPE_CHECKING

from mcp.server.fastmcp import FastMCP
from starlette.routing import Mount

from marimo._ai._tools.base import ToolContext
from marimo._ai._tools.tools_registry import SUPPORTED_BACKEND_AND_MCP_TOOLS
Expand All @@ -34,6 +33,7 @@ def setup_mcp_server(app: "Starlette") -> "StreamableHTTPSessionManager":
Returns:
StreamableHTTPSessionManager: MCP session manager
"""
from starlette.routing import Mount

mcp = FastMCP(
"marimo-mcp-server",
Expand Down
42 changes: 20 additions & 22 deletions marimo/_plugins/stateless/mpl/_mpl.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@
from pathlib import Path
from typing import TYPE_CHECKING, Any, Optional, Union

from starlette.responses import HTMLResponse, Response

from marimo import _loggers
from marimo._output.builder import h
from marimo._output.formatting import as_html
Expand All @@ -42,6 +40,7 @@
from matplotlib.figure import Figure, SubFigure
from starlette.applications import Starlette
from starlette.requests import Request
from starlette.responses import HTMLResponse, Response
from starlette.websockets import WebSocket


Expand Down Expand Up @@ -222,39 +221,38 @@ def _template(fig_id: str, port: int) -> str:
}


async def mpl_js(request: Request) -> Response:
from matplotlib.backends.backend_webagg_core import (
FigureManagerWebAgg,
)

del request
return Response(
content=patch_javascript(FigureManagerWebAgg.get_javascript()), # type: ignore[no-untyped-call]
media_type="application/javascript",
)


async def mpl_custom_css(request: Request) -> Response:
del request
return Response(
content=css_content,
media_type="text/css",
)


def create_application() -> Starlette:
import matplotlib as mpl
from matplotlib.backends.backend_webagg_core import (
FigureManagerWebAgg,
)
from starlette.applications import Starlette
from starlette.responses import HTMLResponse, Response
from starlette.routing import Mount, Route, WebSocketRoute
from starlette.staticfiles import StaticFiles
from starlette.websockets import (
WebSocketDisconnect,
WebSocketState,
)

async def mpl_js(request: Request) -> Response:
from matplotlib.backends.backend_webagg_core import (
FigureManagerWebAgg,
)

del request
return Response(
content=patch_javascript(FigureManagerWebAgg.get_javascript()), # type: ignore[no-untyped-call]
media_type="application/javascript",
)

async def mpl_custom_css(request: Request) -> Response:
del request
return Response(
content=css_content,
media_type="text/css",
)

async def main_page(request: Request) -> HTMLResponse:
figure_id = request.query_params.get("figure")
assert figure_id is not None
Expand Down
Loading