Stock-Market Research Assistant MCP Server
MCP server that provides stock market research tools including real-time quotes, news search, semantic context retrieval, watchlist management, and saving research notes/reports.
README
🧠 Stock-Market Research Assistant
<div align="center">
Databricks AI Bootcamp Capstone — Stock-Market Research Assistant
Implementação profissional do projeto final do treinamento DataExpert.io
</div>
🎓 Conclusão do Treinamento
Este repositório contém a entrega final do projeto do Databricks AI Bootcamp, desenvolvido como parte do treinamento oficial da DataExpert.io.
🔗 Treinamento Original
- Bootcamp: Rise of the AI Data Engineer
- Repository: EcZachly/databricks-ai-bootcamp-capstone
- NotebookLM: Databricks AI Boot Camp
📌 Project Highlights
| Feature | Status | Description |
|---|---|---|
| Pipeline Spark | ✅ | Ingestão distribuída com Spark e Delta Lake |
| API Externa | ✅ | Massive API para preços e notícias de ações |
| Conteúdo Não Estruturado | ✅ | HTML → texto → chunks com trafilatura |
| Databricks App | ✅ | Main App + Dashboard separados |
| Agente Leitura/Escrita | ✅ | MCP Server com tools de pesquisa e persistência |
| RAG com pgvector | ✅ | Embeddings e busca semântica HNSW |
| Wiki Completa | ✅ | Documentação técnica e arquitetural |
🏛️ Architecture & Tech Stack
Camadas da Arquitetura
┌─────────────────────────────────────────────────────────────────────────────────┐
│ Databricks Workspace │
│ │
│ ┌──────────────────────┐ ┌──────────────────────┐ │
│ │ Databricks App │ │ Databricks App │ │
│ │ (Main App) │ │ (Dashboard) │ │
│ │ │ │ │ │
│ │ - Massive API │ │ - Read-only Flask │ │
│ │ - Lakebase (PG) │ │ - Watchlist/Quotes │ │
│ │ - Sync endpoint │ │ - News viewer │ │
│ └──────────┬───────────┘ └──────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ Lakebase (Postgres) │ │
│ │ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────────┐ │ │
│ │ │ watchlists │ │ ticker_news_ │ │ ticker_news_ │ │ │
│ │ │ (ticker lists) │ │ documents │ │ embeddings │ │ │
│ │ └──────────────────┘ │ (news articles) │ │ (title+description) │ │ │
│ │ └──────────────────┘ └──────────────────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌────────────────┐ │ │
│ │ │ pgvector HNSW │ │ │
│ │ │ index (cosine) │ │ │
│ │ └────────────────┘ │ │
│ │ ┌──────────────────┐ ┌──────────────────┐ │ │
│ │ │ research_notes │ │ analysis_ │ │ │
│ │ │ (agent writes) │ │ reports │ │ │
│ │ └──────────────────┘ └──────────────────┘ │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ MCP Server App │ │
│ │ ┌───────────────────────────────────────────────────────────────┐ │ │
│ │ │ Massive Broker (stock data) │ │ │
│ │ └───────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌───────────────────────────────────────────────────────────────┐ │ │
│ │ │ FastMCP Server (tools exposed to Agent Bricks) │ │ │
│ │ │ - get_quote(symbol) │ │ │
│ │ │ - search_news(symbol, query, limit) │ │ │
│ │ │ - search_research_context(query, symbol) │ │ │
│ │ │ - get_watchlist() │ │ │
│ │ │ - add_to_watchlist(symbol) │ │ │
│ │ │ - remove_from_watchlist(symbol) │ │ │
│ │ │ - save_research_note(symbol, title, content) │ │ │
│ │ │ - save_analysis_report(symbol, report, sources) │ │ │
│ │ └───────────────────────────────────────────────────────────────┘ │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────────┘
Stack Tecnológica
| Camada | Tecnologia | Versão | Uso |
|---|---|---|---|
| Data Warehouse | Databricks Lakebase | Postgres | Banco transacional integrado |
| Processing | Apache Spark | 3.5+ | Pipelines distribuídos |
| Embeddings | sentence-transformers | all-MiniLM-L6-v2 | Similaridade semântica |
| Vector Search | pgvector | 0.5+ | Índice HNSW cosine |
| APIs | Massive.com | v2 | Preços e notícias de ações |
| Agent Framework | FastMCP | 1.0+ | Ferramentas para agente |
| Frontend | Flask | 2.0+ | API e Dashboard |
🗺️ Architecture Diagram
Pipeline de Dados
flowchart LR
subgraph "Ingestão"
A[Watchlist Lakebase] -->|tickers| B[Massive API]
B -->|notícias| C[ticker_news_documents]
end
subgraph "Processamento"
C -->|HTML| D[trafilatura]
D -->|texto| E[Chunking]
E -->|chunks| F[Embeddings Spark]
end
subgraph "Armazenamento"
F -->|embeddings| G[ticker_news_embeddings]
E -->|chunks| H[ticker_news_chunk_embeddings]
G & H -->|HNSW| I[pgvector Index]
end
subgraph "Consulta RAG"
J[User Query] -->|embedding| I
I -->|top-k| K[Context Retrieval]
K -->|prompt| L[LLM Response]
end
Fluxo de Consulta RAG
flowchart LR
A[Query do Usuário] --> B[Embedding da Query]
B --> C[Busca Vetorial pgvector]
C --> D[Top-k Chunks]
D --> E[Contexto Formatado]
E --> F[Prompt com Citações]
F --> G[Resposta Fundamentada]
📊 Resultados
| Métrica | Resultado | Observação |
|---|---|---|
| Dimensionalidade Embeddings | 384 | all-MiniLM-L6-v2 |
| Métrica Similaridade | Cosine | Otimizada com pgvector |
| Index Vector | HNSW | Busca O(log n) aproximada |
| Latência Query RAG | < 500ms | Com índice HNSW |
| Throughput Embeddings | Batch ~100 | Parallel Spark |
🚀 Quick Start & Setup
Pré-requisitos
- Acesso ao Databricks Workspace
- Massive API Key (grátis em https://www.massive.com)
- Lakebase URL configurado no workspace
Configuração
# 1. Criar secret scopes
python setup_secrets.py
# 2. Executar SQLs no Lakebase
psql $LAKEBASE_URL -f sql/01_setup_news_table.sql
psql $LAKEBASE_URL -f sql/02_setup_embeddings_table.sql
psql $LAKEBASE_URL -f sql/03_setup_chunk_embeddings_table.sql
psql $LAKEBASE_URL -f sql/04_cast_arrays_to_vectors.sql
psql $LAKEBASE_URL -f sql/05_setup_research_tables.sql
# 3. Executar notebook de ingestão
# (via Databricks UI: importar notebooks/ingest_ticker_news_embeddings.py)
# 4. Testar RAG
python3 test_rag.py --ticker AAPL --limit 5
# 5. Deploy dos Apps
databricks bundle deploy -t dev
Endpoints da API
| Método | Endpoint | Descrição |
|---|---|---|
| GET | /watchlist |
Lista tickers |
| GET | /price/<symbol> |
Preço atual |
| GET | /news/<symbol> |
Notícias recentes |
| POST | /news/sync |
Sincronizar notícias |
| POST | /search/context |
Busca semântica (RAG) |
Tools do MCP Server
Leitura:
get_quote(symbol)- Preço atualsearch_news(symbol, query, limit)- Busca notíciassearch_research_context(query, symbol)- Busca contextoget_watchlist()- Lista tickersadd_to_watchlist(symbol)- Adicionar tickerremove_from_watchlist(symbol)- Remover ticker
Escrita (Agente):
save_research_note(symbol, title, content)- Salvar notasave_analysis_report(symbol, report, sources)- Salvar relatório
🌳 Estrutura do Projeto
databricks-capstone-delivery/
├── app.py # Main Flask API (Day 1/2)
├── lakebase.py # Lakebase connection helper
├── massive_client.py # Massive API client
├── setup_secrets.py # Secret scope setup
├── requirements.txt # Python dependencies
├── pyproject.toml # Project metadata
├── test_rag.py # Script de validação RAG
│
├── dashboard/
│ ├── app.py # Dashboard Flask
│ └── templates/index.html # Dashboard UI
│
├── mcp_server/
│ ├── alpaca_mcp_server.py # FastMCP server (com writing tools)
│ ├── lakebase.py # Lakebase helper (novas funções)
│ └── massive_broker.py # Massive broker
│
├── notebooks/
│ └── ingest_ticker_news_embeddings.py # Spark pipeline
│
├── sql/
│ ├── 01_setup_news_table.sql
│ ├── 02_setup_embeddings_table.sql
│ ├── 03_setup_chunk_embeddings_table.sql
│ ├── 04_cast_arrays_to_vectors.sql
│ └── 05_setup_research_tables.sql
│
└── resources/
├── dashboard.yml
├── ingest_ticker_news_embeddings_job.yml
└── mcp_server.yml
🧠 Methodology & Quality Gates
Este projeto incorpora um sistema heurístico robusto para garantir qualidade e evitar erros comuns de engenharia de dados:
Data Contract Gate
Valida tabelas Silver/Gold antes da execução:
| Verificação | Implementada | Estado |
|---|---|---|
| Schema esperado (colunas, tipos, nullability) | ✅ | Documentado em SQLs |
| Regras de qualidade (cardinalidade, unicidade) | ✅ | Tabelas com constraints |
| SLA de volume e latência | ✅ | Documentado no schema |
| Contrato versionado | ✅ | sql/*.sql com versionamento |
Idempotency Gate
Garante reexecução segura do pipeline:
| Verificação | Implementada | Estado |
|---|---|---|
| UPSERT ou FULL REFRESH definido | ✅ | Tabelas com ON CONFLICT |
| Nenhum append cego sem verificação | ✅ | Chaves primárias definidas |
| Custo de reprocessamento estimado | ✅ | Log de contagem de linhas |
Heurísticas Aplicadas
| Heurística | Descrição | Aplicação |
|---|---|---|
| Check antes de escrita | Validação de entrada antes de persistência | lakebase.py + alpaca_broker.py |
| Rastreabilidade de evidência | Toda conclusão indica SOURCE/INFERENCE/IMPLEMENTED/VALIDATED | PRD_E_PLANO_EXECUCAO.md |
| Gates antes de deploy | Dois checklists obrigatórios antes de considerar pronto | Este README |
| Falsos positivos vs falsos negativos | Avaliação balanceada de RAG | Teste RAG com test_rag.py |
📚 Documentation Resources
PRD_E_PLANO_EXECUCAO.md- Requisitos e plano completoTECHNICAL.md- Documentação técnica para tech leadsCHANGELOG.md- Histórico de versõesCONTRIBUTING.md- Guia de contribuição
📄 License
Este projeto foi desenvolvido como parte do treinamento do Databricks AI Bootcamp.
Copyright (c) 2026 Roberto
Todos os direitos reservados.
Este código pode ser utilizado como portfolio para demonstrar competências técnicas em Engenharia de Dados, RAG e Agentes de IA.
⚠️ Notas Importantes
- Este não é um sistema de trading em produção. Não deve ser usado para decisões financeiras reais.
- A API do Massive tem limites de rate. O pipeline respeita esses limites.
- Secrets nunca devem ser commitados. O
setup_secrets.pygarante isso.
<div align="center">
Este projeto foi desenvolvido para demonstrar as habilidades técnicas adquiridas durante o Databricks AI Bootcamp.
Author: Roberto
LinkedIn: https://www.linkedin.com/in/roberton003/
GitHub: https://github.com/Roberton003
</div>
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。