Closed
Description
Description
I would like to validate user IDs and scopes during some requests.
Right now, this is doable with code that looks something like this:
# current
from mcp.server.auth.middleware.bearer_auth import AuthenticatedUser, BearerAuthBackend
from mcp.server.fastmcp import Context, FastMCP
# This is an instance of OAuthAuthorizationServerProvider
from app.auth import oauth_provider
async def get_user(ctx: Context) -> AuthenticatedUser:
backend = BearerAuthBackend(ctx.fastmcp._auth_server_provider)
_, user = await backend.authenticate(ctx.request_context.request)
return user
mcp = FastMCP("Demo app")
# set auth here as well
@mcp.tool()
async def example_tool(ctx: Context):
user = await get_user(ctx)
print("Username (client id)", user.username)
print("User access token", user.access_token)
print("User scopes", user.scopes)
return "validated"
This is simple enough to figure out if you know how to navigate through the internals of the code, but it would be much more user friendly if it was already available in the Context object, and I also believe it is a sensible place for it to be:
# proposal
@mcp.tool()
async def example_tool(ctx: Context):
user = ctx.user
print("Username (client id)", user.username)
print("User access token", user.access_token)
print("User scopes", user.scopes)
return "validated"
It would be fairly trivial to implement this as an async call, e.g. await ctx.get_user()
, but implementing as a @property
is a little trickier.
References
No response
Metadata
Metadata
Assignees
Labels
No labels