99from typing import AsyncGenerator
1010
1111import pytest
12+ import requests
13+ from bs4 import BeautifulSoup
1214from mcp import StdioServerParameters , stdio_client , ClientSession
1315from mcp .types import TextContent
1416from youtube_transcript_api import YouTubeTranscriptApi
1517
1618params = StdioServerParameters (command = "uv" , args = ["run" , "mcp-youtube-transcript" ])
1719
1820
21+ def fetch_title (url : str , lang : str ) -> str :
22+ res = requests .get (f"https://www.youtube.com/watch?v={ url } " , headers = {"Accept-Language" : lang })
23+ soup = BeautifulSoup (res .text , "html.parser" )
24+ return soup .title .string or "" if soup .title else ""
25+
26+
1927@pytest .fixture (scope = "module" )
2028def anyio_backend () -> str :
2129 return "asyncio"
@@ -40,7 +48,8 @@ async def test_list_tools(mcp_client_session: ClientSession) -> None:
4048async def test_get_transcript (mcp_client_session : ClientSession ) -> None :
4149 video_id = "LPZh9BOjkQs"
4250
43- expect = "\n " .join ((item .text for item in YouTubeTranscriptApi ().fetch (video_id )))
51+ title = fetch_title (video_id , "en" )
52+ expect = f"# { title } \n " + "\n " .join ((item .text for item in YouTubeTranscriptApi ().fetch (video_id )))
4453
4554 res = await mcp_client_session .call_tool (
4655 "get_transcript" ,
@@ -56,7 +65,8 @@ async def test_get_transcript(mcp_client_session: ClientSession) -> None:
5665async def test_get_transcript_with_language (mcp_client_session : ClientSession ) -> None :
5766 video_id = "WjAXZkQSE2U"
5867
59- expect = "\n " .join ((item .text for item in YouTubeTranscriptApi ().fetch (video_id , ["ja" ])))
68+ title = fetch_title (video_id , "ja" )
69+ expect = f"# { title } \n " + "\n " .join ((item .text for item in YouTubeTranscriptApi ().fetch (video_id , ["ja" ])))
6070
6171 res = await mcp_client_session .call_tool (
6272 "get_transcript" ,
@@ -74,7 +84,8 @@ async def test_get_transcript_fallback_language(
7484) -> None :
7585 video_id = "LPZh9BOjkQs"
7686
77- expect = "\n " .join ((item .text for item in YouTubeTranscriptApi ().fetch (video_id )))
87+ title = fetch_title (video_id , "en" )
88+ expect = f"# { title } \n " + "\n " .join ((item .text for item in YouTubeTranscriptApi ().fetch (video_id )))
7889
7990 res = await mcp_client_session .call_tool (
8091 "get_transcript" ,
@@ -108,7 +119,8 @@ async def test_get_transcript_not_found(mcp_client_session: ClientSession) -> No
108119async def test_get_transcript_with_short_url (mcp_client_session : ClientSession ) -> None :
109120 video_id = "LPZh9BOjkQs"
110121
111- expect = "\n " .join ((item .text for item in YouTubeTranscriptApi ().fetch (video_id )))
122+ title = fetch_title (video_id , "en" )
123+ expect = f"# { title } \n " + "\n " .join ((item .text for item in YouTubeTranscriptApi ().fetch (video_id )))
112124
113125 res = await mcp_client_session .call_tool (
114126 "get_transcript" ,
0 commit comments