Naver Finance Crawl MCP
# Naver Finance Crawl MCP
[](https://www.npmjs.com/package/naver-finance-crawl-mcp)
[](https://opensource.org/licenses/MIT)
[](https://nodejs.org/)
[](https://www.typescriptlang.org/)
MCP (Model Context Protocol) server for crawling Korean stock market data from Naver Finance.
A Node.js-based web crawler built with TypeScript, Axios, and Cheerio, with MCP server support for AI assistants.
## Features
- **crawl-top-stocks**: Fetch the most searched stocks from Naver Finance with real-time data
- **crawl-stock-detail**: Get comprehensive stock information by 6-digit stock code
- **MCP Server Support**: Full integration with AI assistants via Model Context Protocol
- **HTTP & STDIO Transports**: Flexible transport options for different use cases
- **Korean Encoding Support**: Proper handling of Korean characters (EUC-KR)
- **TypeScript Support**: Fully typed with strict mode enabled
- **Modular Architecture**: Extensible base crawler class for custom implementations
- **HTML Parsing**: Cheerio-based HTML parsing with helper utilities
- **HTTP Requests**: Axios-based HTTP client with retry logic
- **Testing**: Vitest with unit, integration, and E2E tests
- **Code Quality**: ESLint and Prettier for code consistency
## Project Structure
```
src/
├── crawlers/ # Crawler implementations
│ ├── baseCrawler.ts # Base class for all crawlers
│ ├── exampleCrawler.ts # Example crawler implementation
│ └── index.ts
├── utils/ # Utility functions
│ ├── request.ts # HTTP client with retry logic
│ ├── parser.ts # HTML parsing helper
│ └── index.ts
├── types/ # TypeScript type definitions
│ └── index.ts
└── index.ts # Main entry point
tests/
├── unit/ # Unit tests
├── integration/ # Integration tests
└── e2e/ # E2E tests
```
## Installation
### NPM
```bash
npm install -g naver-finance-crawl-mcp
```
### Smithery
To install Naver Finance Crawl MCP Server for any client automatically via [Smithery](https://smithery.ai):
```bash
npx -y @smithery/cli@latest install naver-finance-crawl-mcp --client <CLIENT_NAME>
```
Available clients: `cursor`, `claude`, `vscode`, `windsurf`, `cline`, `zed`, etc.
**Example for Cursor:**
```bash
npx -y @smithery/cli@latest install naver-finance-crawl-mcp --client cursor
```
This will automatically configure the MCP server in your chosen client.
### Development Setup
```bash
pnpm install
```
## MCP Client Integration
Naver Finance Crawl MCP can be integrated with various AI coding assistants and IDEs that support the Model Context Protocol (MCP).
### Requirements
- Node.js >= v18.0.0
- An MCP-compatible client (Cursor, Claude Code, VS Code, Windsurf, etc.)
<details>
<summary><b>Install in Cursor</b></summary>
Go to: `Settings` -> `Cursor Settings` -> `MCP` -> `Add new global MCP server`
Add the following configuration to your `~/.cursor/mcp.json` file:
```json
{
"mcpServers": {
"naver-finance": {
"command": "npx",
"args": ["-y", "naver-finance-crawl-mcp"]
}
}
}
```
**With HTTP transport:**
```json
{
"mcpServers": {
"naver-finance": {
"command": "npx",
"args": ["-y", "naver-finance-crawl-mcp", "--transport", "http", "--port", "5000"]
}
}
}
```
</details>
<details>
<summary><b>Install in Claude Code</b></summary>
Run this command:
```sh
claude mcp add naver-finance -- npx -y naver-finance-crawl-mcp
```
Or with HTTP transport:
```sh
claude mcp add naver-finance -- npx -y naver-finance-crawl-mcp --transport http --port 5000
```
</details>
<details>
<summary><b>Install in VS Code</b></summary>
Add this to your VS Code MCP config file. See [VS Code MCP docs](https://code.visualstudio.com/docs/copilot/chat/mcp-servers) for more info.
```json
"mcp": {
"servers": {
"naver-finance": {
"type": "stdio",
"command": "npx",
"args": ["-y", "naver-finance-crawl-mcp"]
}
}
}
```
</details>
<details>
<summary><b>Install in Windsurf</b></summary>
Add this to your Windsurf MCP config file:
```json
{
"mcpServers": {
"naver-finance": {
"command": "npx",
"args": ["-y", "naver-finance-crawl-mcp"]
}
}
}
```
</details>
<details>
<summary><b>Install in Cline</b></summary>
1. Open **Cline**
2. Click the hamburger menu icon (☰) to enter the **MCP Servers** section
3. Choose **Remote Servers** tab
4. Click the **Edit Configuration** button
5. Add naver-finance to `mcpServers`:
```json
{
"mcpServers": {
"naver-finance": {
"command": "npx",
"args": ["-y", "naver-finance-crawl-mcp"]
}
}
}
```
</details>
<details>
<summary><b>Install in Claude Desktop</b></summary>
Open Claude Desktop developer settings and edit your `claude_desktop_config.json` file:
```json
{
"mcpServers": {
"naver-finance": {
"command": "npx",
"args": ["-y", "naver-finance-crawl-mcp"]
}
}
}
```
</details>
<details>
<summary><b>Install in Zed</b></summary>
Add this to your Zed `settings.json`:
```json
{
"context_servers": {
"naver-finance": {
"source": "custom",
"command": "npx",
"args": ["-y", "naver-finance-crawl-mcp"]
}
}
}
```
</details>
<details>
<summary><b>Install in Roo Code</b></summary>
Add this to your Roo Code MCP configuration file:
```json
{
"mcpServers": {
"naver-finance": {
"command": "npx",
"args": ["-y", "naver-finance-crawl-mcp"]
}
}
}
```
</details>
<details>
<summary><b>Using with Bun</b></summary>
```json
{
"mcpServers": {
"naver-finance": {
"command": "bunx",
"args": ["-y", "naver-finance-crawl-mcp"]
}
}
}
```
</details>
## Available Scripts
### Development & Build
```bash
# Type check
pnpm typecheck
# Lint code
pnpm lint
pnpm lint:fix
# Run tests
pnpm test
pnpm test:ui # UI mode
pnpm test:coverage # With coverage report
# Build project
pnpm build
# Watch mode
pnpm dev
# Start MCP server (STDIO transport)
pnpm start
# Start MCP server (HTTP transport)
pnpm start --transport http --port 5000
# Start HTTP REST API server
pnpm start:http
```
## Usage
### Running the MCP Server
**STDIO Transport (default):**
```bash
naver-finance-crawl-mcp
```
**HTTP Transport:**
```bash
naver-finance-crawl-mcp --transport http --port 5000
```
The server provides two MCP tools that can be used by LLMs:
- `crawl_top_stocks`: Fetches the most searched stocks from Naver Finance
- `crawl_stock_detail`: Fetches detailed information for a specific stock by its 6-digit code
### Available Tools
Naver Finance Crawl MCP provides the following tools that can be used by LLMs:
#### crawl_top_stocks
Crawl top searched stocks from Naver Finance. Returns a list of the most searched stocks with their codes, names, current prices, and change rates.
**Parameters:** None
**Example Response:**
```json
{
"success": true,
"count": 10,
"data": [
{
"code": "005930",
"name": "삼성전자",
"currentPrice": "71,000",
"changeRate": "+2.50%"
}
],
"timestamp": "2025-01-29T12:00:00.000Z"
}
```
#### crawl_stock_detail
Crawl detailed information for a specific stock by its 6-digit code. Returns comprehensive data including company info, stock prices, trading volume, and financial metrics.
**Parameters:**
- `stockCode` (string, required): 6-digit stock code (e.g., "005930" for Samsung Electronics)
**Example Request:**
```json
{
"stockCode": "005930"
}
```
**Example Response:**
```json
{
"success": true,
"stockCode": "005930",
"data": {
"companyName": "삼성전자",
"currentPrice": "71,000",
"changeRate": "+2.50%",
"tradingVolume": "1,234,567",
"marketCap": "423조원"
},
"metadata": {
"url": "https://finance.naver.com/item/main.naver?code=005930",
"statusCode": 200,
"timestamp": "2025-01-29T12:00:00.000Z"
}
}
```
### Usage Examples
#### Example 1: Get top searched stocks
**In Cursor/Claude Code:**
```
Get the top searched stocks from Naver Finance
```
**The tool will return:**
- List of most searched stocks
- Stock codes, names, current prices
- Price change rates
- Timestamp of the data
#### Example 2: Get detailed stock information
**In Cursor/Claude Code:**
```
Get detailed information for Samsung Electronics (stock code: 005930)
```
**The tool will return:**
- Company name and stock code
- Current price and change rate
- Trading volume
- Market capitalization
- Additional financial metrics
#### Example 3: Analyze stock trends
**In Cursor/Claude Code:**
```
First, show me the top searched stocks.
Then, fetch detailed information for the top 3 stocks.
Analyze which stocks show the most significant price changes.
```
### Using as a Library
You can also use the crawlers directly in your Node.js applications:
### Basic Crawler Example
```typescript
import { ExampleCrawler } from './src/crawlers/exampleCrawler.js';
const crawler = new ExampleCrawler({
timeout: 10000,
retries: 3,
});
const result = await crawler.crawl('https://example.com');
console.log(result);
```
### Create Custom Crawler
```typescript
import { BaseCrawler } from './src/crawlers/baseCrawler.js';
import { CrawlResult } from './src/types/index.js';
class MyCrawler extends BaseCrawler {
async crawl(url: string): Promise<CrawlResult> {
const html = await this.fetchHtml(url);
const parser = this.parseHtml(html);
const data = parser.parseStructure('div.item', {
title: 'h2',
price: 'span.price',
});
return {
url,
data,
timestamp: new Date(),
statusCode: 200,
};
}
}
```
### HTML Parsing
```typescript
import { HtmlParser } from './src/utils/parser.js';
const html = '<h1>Hello</h1><p>World</p>';
const parser = new HtmlParser(html);
// Get text from elements
const title = parser.getFirstText('h1');
console.log(title); // "Hello"
// Get attributes
const links = parser.getAttributes('a[href]', 'href');
// Parse structured data
const items = parser.parseStructure('div.item', {
name: 'h2',
description: 'p',
});
```
## Configuration Files
- **tsconfig.json**: TypeScript compiler options
- **vitest.config.ts**: Vitest test runner configuration
- **.eslintrc.json**: ESLint rules configuration
- **.prettierrc.json**: Prettier formatting rules
## Dependencies
### Production
- `axios`: HTTP client library
- `cheerio`: jQuery-like HTML parsing
### Development
- `typescript`: TypeScript compiler
- `vitest`: Unit testing framework
- `@typescript-eslint/*`: TypeScript linting
- `eslint`: Code linting
- `prettier`: Code formatting
- `tsx`: TypeScript executor
## Testing
The project includes comprehensive tests covering:
- Unit tests for utilities and base classes
- Integration tests for crawler functionality
- E2E tests for complete workflows
Run tests with:
```bash
pnpm test # Run all tests
pnpm test:ui # Interactive UI
pnpm test:coverage # With coverage report
```
## Docker Usage
### Build Docker Image
```bash
docker build -t naver-finance-crawl-mcp .
```
### Run with Docker
**With STDIO transport:**
```bash
docker run -i --rm naver-finance-crawl-mcp
```
**With HTTP transport:**
```bash
docker run -d -p 5000:5000 \
--name naver-finance \
naver-finance-crawl-mcp \
node dist/mcp-server.js --transport http --port 5000
```
### Docker Compose Example
Create a `docker-compose.yml`:
```yaml
version: '3.8'
services:
naver-finance-crawl-mcp:
build: .
ports:
- "5000:5000"
environment:
- PORT=5000
- NODE_ENV=production
command: ["node", "dist/mcp-server.js", "--transport", "http", "--port", "5000"]
restart: unless-stopped
healthcheck:
test: ["CMD", "node", "-e", "require('http').get('http://localhost:5000/mcp', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})"]
interval: 30s
timeout: 3s
retries: 3
start_period: 5s
```
Run with Docker Compose:
```bash
docker-compose up -d
```
### Use Docker Image in MCP Clients
Configure your MCP client to use the Docker container:
```json
{
"mcpServers": {
"naver-finance": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"naver-finance-crawl-mcp"
]
}
}
}
```
## Architecture
The project follows a modular architecture:
- **crawlers/**: Crawler implementations
- `baseCrawler.ts`: Base class for all crawlers
- `naverFinanceCrawler.ts`: Naver Finance stock detail crawler
- `TopStocksCrawler.ts`: Top searched stocks crawler
- `exampleCrawler.ts`: Example crawler implementation
- **tools/**: MCP tool implementations
- `crawl-top-stocks.ts`: MCP tool for top stocks
- `crawl-stock-detail.ts`: MCP tool for stock details
- **utils/**: Utility functions
- `request.ts`: HTTP client with retry logic
- `parser.ts`: HTML parsing helpers
- **types/**: TypeScript type definitions
- **mcp-server.ts**: MCP server entry point (STDIO/HTTP)
- **http-server.ts**: REST API server entry point
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
## Author
greatsumini
## License
MIT
TDQS
Scored across 2 tools
The two tools have clearly distinct purposes: crawl_stock_detail focuses on retrieving detailed information for a specific stock by its code, while crawl_top_stocks retrieves a list of top searched stocks. There is no overlap or ambiguity between these functions, making it easy for an agent to select the appropriate tool.
Both tool names follow a consistent verb_noun pattern with 'crawl_' as the prefix, followed by descriptive nouns (stock_detail and top_stocks). This uniformity enhances readability and predictability, adhering to a clear naming convention throughout the set.
With only 2 tools, the server feels thin for a finance crawling domain, as it lacks operations for broader data retrieval, such as market indices, sector analysis, or historical data. While the tools are well-defined, the limited count may restrict agent capabilities in handling more complex financial queries.
The tool set is significantly incomplete for a finance crawling server. It covers specific stock details and top searches but misses essential operations like crawling market summaries, financial news, historical price data, or sector performance. These gaps will likely cause agent failures when broader financial information is needed.