Skip to content

Type error when using Lifespan context #355

Closed
@jkawamoto

Description

@jkawamoto

Describe the bug
I attempted to use AppContext in my project by utilizing the sample code provided in the README.md. However, it raised the following type error:

error: Cannot access attribute "db" for class "None"

To Reproduce
Below is the sample code taken from the README.md.

from contextlib import asynccontextmanager
from collections.abc import AsyncIterator
from dataclasses import dataclass

from mcp.server.fastmcp import Context, FastMCP


class Database:   # Replace with your actual DB type
    @classmethod
    async def connect(cls):
        return cls()

    async def disconnect(self):
        pass

    def query(self):
        return "Hello, World!"


# Create a named server
mcp = FastMCP("My App")


@dataclass
class AppContext:
    db: Database


@asynccontextmanager
async def app_lifespan(server: FastMCP) -> AsyncIterator[AppContext]:
    """Manage application lifecycle with type-safe context"""
    # Initialize on startup
    db = await Database.connect()
    try:
        yield AppContext(db=db)
    finally:
        # Cleanup on shutdown
        await db.disconnect()


# Pass lifespan to server
mcp = FastMCP("My App", lifespan=app_lifespan)


# Access type-safe lifespan context in tools
@mcp.tool()
def query_db(ctx: Context) -> str:
    """Tool that uses initialized resources"""
    db = ctx.request_context.lifespan_context.db
    return db.query()

Store the code above in a file named readme.py and run the following command:

uv run pyright readme.py

Expected behavior
The type check should pass without any errors.

Desktop (please complete the following information):

  • OS: macOS 15.3.2
  • Browser N/A
  • Version N/A

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions