README.mdβ’7.1 kB
# π° MCP News Collector
> **νκ΅ μ£Όμμμ₯ λ΄μ€ μ€μκ° μμ§ λ° λΆμμ μν MCP μλ²**
[](https://python.org)
[](https://fastapi.tiangolo.com)
[](LICENSE)
[](tests/)
## π― νλ‘μ νΈ κ°μ
MCP News Collectorλ νκ΅ μ£Όμμμ₯ κ΄λ ¨ λ΄μ€λ₯Ό μ€μκ°μΌλ‘ μμ§, λΆμνμ¬ ν¬μ μΈμ¬μ΄νΈλ₯Ό μ 곡νλ MCP(Model Context Protocol) μλ²μ
λλ€.
### β¨ μ£Όμ κΈ°λ₯
- π **μ€μκ° λ΄μ€ μμ§**: λ€μ΄λ², λ€μ, RSS νΌλ λ± λ€μν μμ€
- π§ **AI κΈ°λ° λΆμ**: κ°μ λΆμ, μμ₯ μν₯λ μμΈ‘, 루머 νμ§
- π **μ€μκ° λͺ¨λν°λ§**: WebSocket κΈ°λ° μ€μκ° λ°μ΄ν° μ€νΈλ¦¬λ°
- π **REST API**: FastAPI κΈ°λ° RESTful μλν¬μΈνΈ
- π§ **MCP ν΅ν©**: Claude λ± AI μ΄μμ€ν΄νΈμ μνν μ°λ
### ποΈ μν€ν
μ²
```
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β Data Sources β β MCP Server β β AI Assistant β
β β β β β β
β β’ λ€μ΄λ² λ΄μ€ ββββββΆβ β’ μμ§ μμ§ ββββββ β’ Claude β
β β’ λ€μ λ΄μ€ β β β’ λΆμ μμ§ β β β’ ChatGPT β
β β’ RSS νΌλ β β β’ REST API β β β’ κΈ°ν β
β β’ λΉ
μΉ΄μΈμ¦ β β β’ WebSocket β β β
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
```
## π λΉ λ₯Έ μμ
### μ¬μ μꡬμ¬ν
- Python 3.11+
- PostgreSQL 13+
- Redis 6+
### μ€μΉ
```bash
# 1. μ μ₯μ ν΄λ‘
git clone https://github.com/YOUR_USERNAME/mcp-news-collector.git
cd mcp-news-collector
# 2. κ°μνκ²½ μμ± λ° νμ±ν
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 3. μμ‘΄μ± μ€μΉ
pip install -e .
# 4. νκ²½λ³μ μ€μ
cp .env.example .env
# .env νμΌμ νΈμ§νμ¬ λ°μ΄ν°λ² μ΄μ€ λ° API μ€μ
# 5. λ°μ΄ν°λ² μ΄μ€ λ§μ΄κ·Έλ μ΄μ
alembic upgrade head
# 6. μλ² μ€ν
python -m src.server.main
```
### MCP ν΄λΌμ΄μΈνΈ μ°κ²°
```python
from mcp import Client
# MCP μλ² μ°κ²°
client = Client("stdio", ["python", "-m", "src.server.main"])
# λ΄μ€ μμ§
result = await client.call_tool("get_recent_news", {
"keyword": "μΌμ±μ μ",
"limit": 10
})
```
## π API λ¬Έμ
### MCP Tools
| Tool | μ€λͺ
| νλΌλ―Έν° |
|------|------|----------|
| `get_recent_news` | μ΅κ·Ό λ΄μ€ μ‘°ν | keyword, source, limit, hours |
| `analyze_news_sentiment` | λ΄μ€ κ°μ λΆμ | news_id, text, detail_level |
| `analyze_news_impact` | μμ₯ μν₯λ λΆμ | news_id, company, timeframe |
| `detect_market_rumors` | 루머 νμ§ | news_id, threshold |
| `monitor_news_stream` | μ€μκ° λ΄μ€ λͺ¨λν°λ§ | topics, filters |
### REST API
API λ¬Έμλ μλ² μ€ν ν λ€μ URLμμ νμΈν μ μμ΅λλ€:
- Swagger UI: `http://localhost:8000/api/docs`
- ReDoc: `http://localhost:8000/api/redoc`
#### μ£Όμ μλν¬μΈνΈ
```bash
# λ΄μ€ μ‘°ν
GET /api/v1/news?query=μΌμ±μ μ&limit=10
# κ°μ λΆμ
POST /api/v1/analysis/sentiment
{
"news_ids": ["news_1", "news_2"],
"options": {"include_confidence": true}
}
# μ€μκ° λͺ¨λν°λ§ μν
GET /api/v1/monitoring/status
```
## π§ͺ ν
μ€νΈ
```bash
# μ 체 ν
μ€νΈ μ€ν
pytest
# νΉμ λͺ¨λ ν
μ€νΈ
pytest tests/unit/test_sentiment_analyzer.py
# 컀λ²λ¦¬μ§ νμΈ
pytest --cov=src --cov-report=html
```
### ν
μ€νΈ νν©
- **μ 체 ν
μ€νΈ**: 169κ° ν΅κ³Ό
- **컀λ²λ¦¬μ§**:
- κ°μ λΆμκΈ°: 92%
- μμ₯ μν₯ λΆμκΈ°: 85%
- μ€μκ° λͺ¨λν°λ§: 76%
- 루머 νμ§: 89%
- λ΄μ€ μμ½: 90%
## π κ°λ° νν©
### Phase λ³ μ§ν μν©
- β
**Phase 1**: κΈ°μ΄ μΈνλΌ κ΅¬μΆ (μλ£)
- β
**Phase 2**: ν΅μ¬ μμ§ μμ€ν
(μλ£)
- β
**Phase 3**: λΆμ μμ§ κ΅¬ν (μλ£)
- π **Phase 4**: API λ° ν΅ν© μμ€ν
(75% μλ£)
- β³ **Phase 5**: μ΅μ ν λ° λ°°ν¬ (μμ )
μμΈν κ°λ° κ³νμ [detailed-development-plan.md](detailed-development-plan.md)λ₯Ό μ°Έμ‘°νμΈμ.
## ποΈ νλ‘μ νΈ κ΅¬μ‘°
```
mcp-news-collector/
βββ src/ # λ©μΈ μμ€ μ½λ
β βββ analysis/ # λΆμ μμ§ (κ°μ , μν₯λ, 루머 νμ§ λ±)
β βββ collectors/ # λ΄μ€ μμ§κΈ° (λ€μ΄λ², λ€μ, RSS)
β βββ monitoring/ # μ€μκ° λͺ¨λν°λ§ μμ€ν
β βββ server/ # MCP μλ² λ° REST API
β βββ utils/ # κ³΅ν΅ μ νΈλ¦¬ν°
βββ tests/ # ν
μ€νΈ μ½λ
β βββ unit/ # λ¨μ ν
μ€νΈ
β βββ integration/ # ν΅ν© ν
μ€νΈ
βββ docs/ # λ¬Έμ
βββ configs/ # μ€μ νμΌ
βββ scripts/ # μ νΈλ¦¬ν° μ€ν¬λ¦½νΈ
```
## π§ κ°λ° λꡬ
### μ½λ νμ§
```bash
# μ½λ ν¬λ§·ν
black src/ tests/
# νμ
체νΉ
mypy src/
# λ¦°ν
pylint src/
# 보μ μ€μΊ
bandit -r src/
```
### TDD κ°λ° νλ‘μΈμ€
μ΄ νλ‘μ νΈλ **μ격ν TDD(Test-Driven Development)** λ°©λ²λ‘ μ λ°λ¦
λλ€:
1. **Red**: μ€ν¨νλ ν
μ€νΈ μμ±
2. **Green**: ν
μ€νΈλ₯Ό ν΅κ³Όμν€λ μ΅μνμ μ½λ μμ±
3. **Refactor**: μ½λ κ°μ λ° μ΅μ ν
## π€ κΈ°μ¬νκΈ°
1. Fork the repository
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add some amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request
### κ°λ° κ°μ΄λλΌμΈ
- λͺ¨λ μλ‘μ΄ κΈ°λ₯μ ν
μ€νΈμ ν¨κ» κ°λ°
- μ½λ 컀λ²λ¦¬μ§ 80% μ΄μ μ μ§
- νμ
ννΈ μ¬μ© νμ
- λ¬Έμν μ² μ ν
## π λΌμ΄μ μ€
μ΄ νλ‘μ νΈλ MIT λΌμ΄μ μ€ νμ λ°°ν¬λ©λλ€. μμΈν λ΄μ©μ [LICENSE](LICENSE) νμΌμ μ°Έμ‘°νμΈμ.
## π λ¬Έμ
- **κ°λ°μ**: [Your Name](mailto:your.email@example.com)
- **μ΄μ νΈλ컀**: [GitHub Issues](https://github.com/YOUR_USERNAME/mcp-news-collector/issues)
- **νλ‘μ νΈ μν€**: [GitHub Wiki](https://github.com/YOUR_USERNAME/mcp-news-collector/wiki)
## π κ°μ¬μ λ§
- [MCP (Model Context Protocol)](https://github.com/anthropics/mcp) - Anthropic
- [FastAPI](https://fastapi.tiangolo.com/) - SebastiΓ‘n Ramirez
- [KoBERT](https://github.com/SKTBrain/KoBERT) - SKT Brain
---
β μ΄ νλ‘μ νΈκ° λμμ΄ λμ
¨λ€λ©΄ Starλ₯Ό λλ¬μ£ΌμΈμ!