요즘 장이 좋고 투자에 관심을 가지기 시작하고 AI 발전에 따라서 여러 기술들이 들어오고 LLM 또한 똑똑해지는 상황에서 LLM을 통해 주식 트랜드를 분석하고 이에 대한 데이터를 추천 받을 수 있으면 좋겠다 생각하여 기획하게 되었다.
생각하는 기획은 다음과 같다.
1. 투자 소스들을 수입한다.
2. 해당 부분에 대한 정보를 수집하여 확인한다.
3. 해당 투자 정보중 실제 차트, 투자 데이터들을 분석한다.
4. 주식을 추천하고 이를 기록한다.
5. 기록된 데이터를 통해 실제 성공률 (% 증가 감소 등)을 누적하여 추후 추천시에 반영한다.
--> 이러한 플로우를 LLM을 통해 진행하는 프로젝트이다.
현재 이중 1,2 번에 대한 기능을 구현하고 테스트하였다.
Trend Scraper MCP — 유튜브 & 네이버 뉴스 데이터 수집 MCP 서버 구현
MCP(Model Context Protocol)를 활용하여 유튜브와 네이버 뉴스 데이터를 수집하는 서버를 구현해보고자 한다. 해당 서버는 주식 종목 관련 트렌드를 파악하기 위한 "데이터 수집기" 역할을 하며, 최종 종목 판단이나 스코어링은 전부 LLM(Claude)에 위임하는 구조이다.
핵심 포인트는 이 서버가 직접 "호재/악재" 판단을 하지 않는다는 것이다. 데이터만 수집하고, 해석은 LLM이 한다. 이런 구조를 택한 이유는 뉴스나 영상의 맥락을 이해하고 종합적으로 판단하는 건 LLM이 훨씬 잘하기 때문이다.
구현 스택은 다음과 같다.
- 언어/런타임: Python + FastMCP (mcp.server.fastmcp)
- 외부 API: YouTube Data API v3, 네이버 검색 API
- 자막 수집: youtube-transcript-api
프로젝트 구조
mcp-trend-scraper/
├── main.py # MCP 서버 엔트리, 도구 등록
├── config.py # .env로부터 API 키/채널 목록 로드
├── services/
│ ├── youtube_service.py # 유튜브 메타데이터 + 자막 수집, 키워드 카운트
│ └── naver_news_service.py # 네이버 뉴스 검색
├── requirements.txt # 의존성
├── .env # 환경 변수 (실제 키 값)
└── .env.example # 환경 변수 템플릿
각 파일의 역할을 하나씩 살펴보자.
MCP 서버 (main.py)
MCP 서버의 핵심이 되는 파일이다. FastMCP를 사용하여 서버를 정의하고, 두 가지 도구를 등록한다.
mcp = FastMCP("trend-scraper", json_response=True)
서버는 mcp.run()으로 실행되며, stdio 방식으로 대기한다. 직접 터미널에서 입력하는 게 아니라 MCP 클라이언트(Claude Desktop 등)가 붙어서 사용하는 구조이다.
제공 도구 1: search_youtube_keywords
지정한 유튜브 채널들에서 최근 N시간 이내 업로드된 영상을 스캔하고, 주어진 키워드가 제목/설명/자막에서 얼마나 자주 언급되는지 집계하는 도구이다.
파라미터:
| keywords | list[str] | (필수) | 관심 키워드 목록 (예: ["알테오젠", "에코프로"]) |
| hours_back | int | 24 | 최근 N시간 이내 영상만 대상 |
| max_videos_per_channel | int | 10 | 채널당 최대 영상 개수 |
| include_transcript | bool | True | 자막까지 수집할지 여부 |
| channel_ids | list[str] | None | None | 명시하면 해당 채널만 사용, None이면 config 기본값 사용 |
반환 형식:
{
"scan_config": { ... },
"videos": [
{
"title": "영상 제목",
"description": "영상 설명",
"published_at": "2025-02-28T10:00:00Z",
"url": "https://youtube.com/watch?v=...",
"view_count": 15000,
"like_count": 500,
"transcript_text": "자막 내용..."
}
],
"keyword_summary": {
"keywords": [
{
"keyword": "알테오젠",
"total_mentions": 12,
"videos": [
{
"video_id": "...",
"title": "...",
"url": "...",
"keyword_counts": { "알테오젠": 5 }
}
]
}
]
}
}
중요한 점은 이 도구가 "어떤 종목이 좋다"는 판단을 하지 않는다는 것이다. 키워드 언급 횟수만 집계하고, 그 의미 해석은 LLM에게 맡긴다.
제공 도구 2: search_news_for_trend_keywords
지정한 키워드에 대해 네이버 뉴스 검색을 수행하고, 최근 N일 이내 기사 목록을 키워드별로 반환하는 도구이다.
파라미터:
| keywords | list[str] | (필수) | 관심 키워드 목록 |
| days_back | int | 1 | 최근 N일 이내 기사만 포함 |
| max_articles_per_keyword | int | 30 | 키워드별 최대 기사 수 |
반환 형식:
{
"search_config": { ... },
"results": {
"알테오젠": {
"articles": [
{
"title": "기사 제목",
"description": "기사 요약",
"link": "https://...",
"pubDate_iso": "2025-02-28T09:00:00+09:00"
}
]
}
}
}
마찬가지로 호재/악재 라벨링은 하지 않는다. 기사 메타데이터만 넘기고 LLM이 기사 내용을 보고 직접 해석하는 구조이다.
설정/환경 변수 (config.py)
python-dotenv를 사용하여 .env 파일에서 API 키와 채널 목록을 로드한다.
from dotenv import load_dotenv
load_dotenv()
필요한 환경 변수는 다음과 같다.
| YOUTUBE_API_KEY | YouTube Data API v3 키 | Google Cloud Console |
| NAVER_CLIENT_ID | 네이버 검색 API Client ID | developers.naver.com |
| NAVER_CLIENT_SECRET | 네이버 검색 API Client Secret | developers.naver.com |
| YOUTUBE_CHANNELS | 모니터링할 채널 목록 (JSON 배열) | 직접 설정 |
YOUTUBE_CHANNELS는 JSON 배열 문자열로 작성한다.
YOUTUBE_CHANNELS=[{"id":"UCxxxxxx","name":"채널명1"}, {"id":"UCyyyyyy","name":"채널명2"}]
config.py에서 위 배열의 id만 뽑아 YOUTUBE_CHANNEL_IDS 리스트를 만들고, MCP 도구의 기본 채널 목록으로 사용한다.
유튜브 서비스 (services/youtube_service.py)
유튜브 데이터 수집의 핵심 로직을 담당하는 파일이다.
영상 수집 과정:
- YouTube Data API v3의 search.list로 채널별 최근 영상 메타데이터를 가져온다.
- videos.list로 조회수, 좋아요 수 등 통계 정보를 추가로 수집한다.
자막 수집:
youtube_transcript_api 라이브러리를 사용한다.
from youtube_transcript_api import YouTubeTranscriptApi
transcript = YouTubeTranscriptApi().fetch(video_id, languages=['ko', 'en'])
자막이 없거나 IP 차단, 자막 비활성화 등의 경우에는 None을 반환하도록 처리한다. 자막 수집이 실패해도 제목과 설명만으로 키워드 카운트가 동작하기 때문에 문제가 없다.
키워드 카운트:
count_keyword_mentions(videos, keywords) 함수에서 제목 + 설명 + (자막이 있으면 자막) 텍스트를 합쳐서, 각 키워드가 몇 번 등장하는지 단순 포함 횟수로 집계한다.
네이버 뉴스 서비스 (services/naver_news_service.py)
네이버 검색 API를 활용한 뉴스 수집을 담당한다.
구조는 단순하다.
- search_news_for_keyword(keyword, days_back, display): 단일 키워드 검색
- search_news_for_keywords(keywords, ...): 여러 키워드를 한 번에 처리하는 래퍼 함수
기사 원문을 가져오는 것이 아니라 메타데이터(제목, 요약, 링크, 날짜)만 수집한다. LLM이 메타데이터만으로도 충분히 트렌드를 파악할 수 있고, 원문 크롤링은 법적 이슈와 성능 문제가 있기 때문이다.
설치 및 실행
의존성 설치
cd c:\Users\{사용자}\Desktop\mcp_for_finding_stocks\mcp-trend-scraper
python -m venv .venv
.venv\Scripts\pip install -r requirements.txt
requirements.txt에는 python-dotenv, httpx, youtube-transcript-api, mcp 등이 포함된다.
.env 파일 설정
.env.example을 .env로 복사한 뒤, 실제 API 키 값을 채워 넣는다.
YOUTUBE_API_KEY=AIzaSy...
NAVER_CLIENT_ID=abcdef...
NAVER_CLIENT_SECRET=ghijk...
YOUTUBE_CHANNELS=[{"id":"UCxxxxxx","name":"채널명"}]
Claude Desktop 연동 (Windows)
설정 파일 경로: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"trend-scraper": {
"command": "c:/Users/{사용자}/Desktop/mcp_for_finding_stocks/mcp-trend-scraper/.venv/Scripts/python.exe",
"args": [
"c:/Users/{사용자}/Desktop/mcp_for_finding_stocks/mcp-trend-scraper/main.py"
],
"cwd": "c:/Users/{사용자}/Desktop/mcp_for_finding_stocks/mcp-trend-scraper"
}
}
}
.env에 이미 키를 넣었다면 위 설정만으로 동작한다. 만약 키를 config에만 넣고 싶다면 "env": { "YOUTUBE_API_KEY": "...", ... }를 추가하면 된다.
이번에 구현한 mcp-trend-scraper의 핵심 설계 철학을 정리하면 다음과 같다.
- 데이터 수집과 판단의 분리: MCP 서버는 순수하게 데이터만 수집한다. "이 종목이 좋다/나쁘다"는 판단은 LLM이 한다.
- 자막 실패에 대한 내결함성: 자막을 못 가져와도 제목/설명만으로 동작한다.
- 메타데이터 기반 경량 수집: 기사 원문이 아닌 메타데이터만 수집하여 성능과 법적 리스크를 최소화한다.
이러한 구조 덕분에 LLM이 유튜브 트렌드와 뉴스 흐름을 종합적으로 분석하여 종목 판단에 활용할 수 있게 된다.
이렇게 다 마치면 다음과 같이 결과를 확인할 수 있다.

-> 유튜브 채널 소스의 경우에는 블러처리를 하였다.
현재 자막 부분이 ip block 등으로 나타나지 않아 해당 부분을 개선을 해야하지만, 현재 mcp 기능이 잘 작동하걸 확인하였다.
관련 소스 코드는 깃허브에서 확인가능하다.
https://github.com/SeongUk18/mcp_for_finding_stocks
GitHub - SeongUk18/mcp_for_finding_stocks
Contribute to SeongUk18/mcp_for_finding_stocks development by creating an account on GitHub.
github.com
'Project > Hot stocks' 카테고리의 다른 글
| 주식 추천 mcp 프로젝트 - 한국투자증권 API 기반 시세/수급 데이터 수집 MCP 서버 구현 (0) | 2026.03.01 |
|---|