@@ -363,3 +363,34 @@ async def elicitation_callback(context: RequestContext[ClientSession, None], par
363363 assert len (result .content ) == 1
364364 assert isinstance (result .content [0 ], TextContent )
365365 assert result .content [0 ].text == "Email: test@example.com"
366+
367+
368+ @pytest .mark .anyio
369+ async def test_ctx_elicit_url_convenience_method ():
370+ """Test the ctx.elicit_url() convenience method (vs ctx.session.elicit_url())."""
371+ mcp = FastMCP (name = "CtxElicitUrlServer" )
372+
373+ @mcp .tool (description = "A tool that uses ctx.elicit_url() directly" )
374+ async def direct_elicit_url (ctx : Context [ServerSession , None ]) -> str :
375+ # Use ctx.elicit_url() directly instead of ctx.session.elicit_url()
376+ result = await ctx .elicit_url (
377+ message = "Test the convenience method" ,
378+ url = "https://example.com/test" ,
379+ elicitation_id = "ctx-test-001" ,
380+ )
381+ return f"Result: { result .action } "
382+
383+ async def elicitation_callback (
384+ context : RequestContext [ClientSession , None ], params : ElicitRequestParams
385+ ):
386+ assert params .mode == "url"
387+ assert params .elicitationId == "ctx-test-001"
388+ return ElicitResult (action = "accept" )
389+
390+ async with create_connected_server_and_client_session (
391+ mcp ._mcp_server , elicitation_callback = elicitation_callback
392+ ) as client_session :
393+ await client_session .initialize ()
394+ result = await client_session .call_tool ("direct_elicit_url" , {})
395+ assert isinstance (result .content [0 ], TextContent )
396+ assert result .content [0 ].text == "Result: accept"
0 commit comments