ragalgo-mcp-server 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,18 +4,18 @@
4
4
  import { z } from 'zod';
5
5
  export declare const ChartStockParamsSchema: z.ZodObject<{
6
6
  ticker: z.ZodOptional<z.ZodString>;
7
- market: z.ZodOptional<z.ZodEnum<["KOSPI", "KOSDAQ"]>>;
7
+ market: z.ZodOptional<z.ZodEnum<["KOSPI", "KOSDAQ", "US", "JP", "UK"]>>;
8
8
  zone: z.ZodOptional<z.ZodEnum<["STRONG_UP", "UP_ZONE", "NEUTRAL", "DOWN_ZONE", "STRONG_DOWN"]>>;
9
9
  limit: z.ZodDefault<z.ZodNumber>;
10
10
  }, "strip", z.ZodTypeAny, {
11
11
  limit: number;
12
+ market?: "KOSPI" | "KOSDAQ" | "US" | "JP" | "UK" | undefined;
12
13
  ticker?: string | undefined;
13
- market?: "KOSPI" | "KOSDAQ" | undefined;
14
14
  zone?: "STRONG_UP" | "UP_ZONE" | "NEUTRAL" | "DOWN_ZONE" | "STRONG_DOWN" | undefined;
15
15
  }, {
16
16
  limit?: number | undefined;
17
+ market?: "KOSPI" | "KOSDAQ" | "US" | "JP" | "UK" | undefined;
17
18
  ticker?: string | undefined;
18
- market?: "KOSPI" | "KOSDAQ" | undefined;
19
19
  zone?: "STRONG_UP" | "UP_ZONE" | "NEUTRAL" | "DOWN_ZONE" | "STRONG_DOWN" | undefined;
20
20
  }>;
21
21
  export declare const ChartCoinParamsSchema: z.ZodObject<{
@@ -48,6 +48,7 @@ export declare function getChartStock(params: ChartStockParams): Promise<{
48
48
  daily_signal: string;
49
49
  };
50
50
  outlook?: string;
51
+ chart_history?: any;
51
52
  last_price: number;
52
53
  updated_at: string;
53
54
  } | Array<{
@@ -72,6 +73,7 @@ export declare function getChartCoin(params: ChartCoinParams): Promise<{
72
73
  daily_signal: string;
73
74
  };
74
75
  outlook?: string;
76
+ chart_history?: any;
75
77
  last_price: number;
76
78
  updated_at: string;
77
79
  } | Array<{
@@ -6,7 +6,7 @@ import { callApi } from '../utils/api.js';
6
6
  // 주식 차트 파라미터 스키마
7
7
  export const ChartStockParamsSchema = z.object({
8
8
  ticker: z.string().optional().describe('종목 코드 (예: 005930)'),
9
- market: z.enum(['KOSPI', 'KOSDAQ']).optional().describe('시장 구분'),
9
+ market: z.enum(['KOSPI', 'KOSDAQ', 'US', 'JP', 'UK']).optional().describe('시장 구분 (KOSPI/KOSDAQ/US/JP/UK)'),
10
10
  zone: z.enum(['STRONG_UP', 'UP_ZONE', 'NEUTRAL', 'DOWN_ZONE', 'STRONG_DOWN']).optional().describe('차트 구간'),
11
11
  limit: z.number().min(1).max(100).default(20).describe('결과 수'),
12
12
  });
@@ -18,15 +18,14 @@ export const ChartCoinParamsSchema = z.object({
18
18
  });
19
19
  // 주식 차트 조회
20
20
  export async function getChartStock(params) {
21
- const endpoint = params.ticker ? `chart-stock/${params.ticker}` : 'chart-stock';
22
- const { ticker, ...queryParams } = params;
23
- const result = await callApi(endpoint, queryParams);
21
+ const endpoint = 'chart-stock';
22
+ // params passes through directly as query params
23
+ const result = await callApi(endpoint, params);
24
24
  return result;
25
25
  }
26
26
  // 코인 차트 조회
27
27
  export async function getChartCoin(params) {
28
- const endpoint = params.ticker ? `chart-coin/${params.ticker}` : 'chart-coin';
29
- const { ticker, ...queryParams } = params;
30
- const result = await callApi(endpoint, queryParams);
28
+ const endpoint = 'chart-coin';
29
+ const result = await callApi(endpoint, params);
31
30
  return result;
32
31
  }
@@ -5,7 +5,7 @@ import { z } from 'zod';
5
5
  export declare const FinancialsParamsSchema: z.ZodObject<{
6
6
  ticker: z.ZodOptional<z.ZodString>;
7
7
  period: z.ZodOptional<z.ZodString>;
8
- market: z.ZodOptional<z.ZodEnum<["KOSPI", "KOSDAQ"]>>;
8
+ market: z.ZodOptional<z.ZodEnum<["KOSPI", "KOSDAQ", "US", "JP", "UK"]>>;
9
9
  periods: z.ZodDefault<z.ZodNumber>;
10
10
  limit: z.ZodDefault<z.ZodNumber>;
11
11
  offset: z.ZodDefault<z.ZodNumber>;
@@ -13,14 +13,14 @@ export declare const FinancialsParamsSchema: z.ZodObject<{
13
13
  limit: number;
14
14
  offset: number;
15
15
  periods: number;
16
+ market?: "KOSPI" | "KOSDAQ" | "US" | "JP" | "UK" | undefined;
16
17
  ticker?: string | undefined;
17
- market?: "KOSPI" | "KOSDAQ" | undefined;
18
18
  period?: string | undefined;
19
19
  }, {
20
20
  limit?: number | undefined;
21
21
  offset?: number | undefined;
22
+ market?: "KOSPI" | "KOSDAQ" | "US" | "JP" | "UK" | undefined;
22
23
  ticker?: string | undefined;
23
- market?: "KOSPI" | "KOSDAQ" | undefined;
24
24
  period?: string | undefined;
25
25
  periods?: number | undefined;
26
26
  }>;
@@ -7,7 +7,7 @@ import { callApi } from '../utils/api.js';
7
7
  export const FinancialsParamsSchema = z.object({
8
8
  ticker: z.string().optional().describe('종목 코드 (예: 005930)'),
9
9
  period: z.string().optional().describe('분기 (예: 2024Q3)'),
10
- market: z.enum(['KOSPI', 'KOSDAQ']).optional().describe('시장 구분'),
10
+ market: z.enum(['KOSPI', 'KOSDAQ', 'US', 'JP', 'UK']).optional().describe('시장 구분 (KOSPI/KOSDAQ/US/JP/UK)'),
11
11
  periods: z.number().min(1).max(8).default(4).describe('최근 N분기 (기본: 4)'),
12
12
  limit: z.number().min(1).max(200).default(50).describe('결과 수'),
13
13
  offset: z.number().min(0).default(0).describe('페이지네이션 오프셋'),
@@ -3,64 +3,79 @@
3
3
  */
4
4
  import { z } from 'zod';
5
5
  export declare const NewsParamsSchema: z.ZodObject<{
6
- tag: z.ZodOptional<z.ZodString>;
6
+ tag_code: z.ZodOptional<z.ZodString>;
7
7
  source: z.ZodOptional<z.ZodString>;
8
8
  search: z.ZodOptional<z.ZodString>;
9
9
  from_date: z.ZodOptional<z.ZodString>;
10
10
  to_date: z.ZodOptional<z.ZodString>;
11
+ start_date: z.ZodOptional<z.ZodString>;
12
+ end_date: z.ZodOptional<z.ZodString>;
11
13
  limit: z.ZodDefault<z.ZodNumber>;
12
14
  offset: z.ZodDefault<z.ZodNumber>;
13
15
  }, "strip", z.ZodTypeAny, {
14
16
  limit: number;
15
17
  offset: number;
16
- tag?: string | undefined;
18
+ tag_code?: string | undefined;
17
19
  source?: string | undefined;
18
20
  search?: string | undefined;
19
21
  from_date?: string | undefined;
20
22
  to_date?: string | undefined;
23
+ start_date?: string | undefined;
24
+ end_date?: string | undefined;
21
25
  }, {
22
- tag?: string | undefined;
26
+ tag_code?: string | undefined;
23
27
  source?: string | undefined;
24
28
  search?: string | undefined;
25
29
  from_date?: string | undefined;
26
30
  to_date?: string | undefined;
31
+ start_date?: string | undefined;
32
+ end_date?: string | undefined;
27
33
  limit?: number | undefined;
28
34
  offset?: number | undefined;
29
35
  }>;
30
36
  export declare const NewsScoredParamsSchema: z.ZodObject<{
31
- tag: z.ZodOptional<z.ZodString>;
37
+ tag_code: z.ZodOptional<z.ZodString>;
32
38
  source: z.ZodOptional<z.ZodString>;
33
39
  search: z.ZodOptional<z.ZodString>;
34
40
  from_date: z.ZodOptional<z.ZodString>;
35
41
  to_date: z.ZodOptional<z.ZodString>;
42
+ start_date: z.ZodOptional<z.ZodString>;
43
+ end_date: z.ZodOptional<z.ZodString>;
36
44
  limit: z.ZodDefault<z.ZodNumber>;
37
45
  offset: z.ZodDefault<z.ZodNumber>;
38
46
  } & {
39
47
  min_score: z.ZodOptional<z.ZodNumber>;
40
48
  max_score: z.ZodOptional<z.ZodNumber>;
41
49
  verdict: z.ZodOptional<z.ZodEnum<["bullish", "bearish", "neutral"]>>;
50
+ market: z.ZodOptional<z.ZodString>;
42
51
  }, "strip", z.ZodTypeAny, {
43
52
  limit: number;
44
53
  offset: number;
45
- tag?: string | undefined;
54
+ tag_code?: string | undefined;
46
55
  source?: string | undefined;
47
56
  search?: string | undefined;
48
57
  from_date?: string | undefined;
49
58
  to_date?: string | undefined;
59
+ start_date?: string | undefined;
60
+ end_date?: string | undefined;
50
61
  min_score?: number | undefined;
51
62
  max_score?: number | undefined;
52
63
  verdict?: "bullish" | "bearish" | "neutral" | undefined;
64
+ market?: string | undefined;
53
65
  }, {
54
- tag?: string | undefined;
66
+ tag_code?: string | undefined;
55
67
  source?: string | undefined;
56
68
  search?: string | undefined;
57
69
  from_date?: string | undefined;
58
70
  to_date?: string | undefined;
71
+ start_date?: string | undefined;
72
+ end_date?: string | undefined;
59
73
  limit?: number | undefined;
60
74
  offset?: number | undefined;
61
75
  min_score?: number | undefined;
62
76
  max_score?: number | undefined;
63
77
  verdict?: "bullish" | "bearish" | "neutral" | undefined;
78
+ market?: string | undefined;
64
79
  }>;
65
80
  export type NewsParams = z.infer<typeof NewsParamsSchema>;
66
81
  export type NewsScoredParams = z.infer<typeof NewsScoredParamsSchema>;
@@ -5,27 +5,46 @@ import { z } from 'zod';
5
5
  import { callApi } from '../utils/api.js';
6
6
  // 뉴스 파라미터 스키마
7
7
  export const NewsParamsSchema = z.object({
8
- tag: z.string().optional().describe('태그 코드 (search_tags 결과값, 예: STK005930, THM001)'),
9
- source: z.string().optional().describe('소스 필터 (예: 한경, 매경)'),
8
+ tag_code: z.string().optional().describe('태그 코드 (search_tags 결과값, 예: STK005930, THM001)'),
9
+ source: z.string().optional().describe('소스 필터 (예: 한경, 매경, WSJ, Bloomberg)'),
10
10
  search: z.string().optional().describe('제목 검색어'),
11
11
  from_date: z.string().optional().describe('시작일 (YYYY-MM-DD)'),
12
12
  to_date: z.string().optional().describe('종료일 (YYYY-MM-DD)'),
13
+ start_date: z.string().optional().describe('시작일 (from_date의 별칭)'), // [FIX] LLM Alias support
14
+ end_date: z.string().optional().describe('종료일 (to_date의 별칭)'), // [FIX] LLM Alias support
13
15
  limit: z.number().min(1).max(100).default(20).describe('결과 수 (기본: 20, 최대: 100)'),
14
16
  offset: z.number().min(0).default(0).describe('페이지네이션 오프셋'),
15
- });
17
+ }); // [MOD] Removed .strict()
16
18
  // 점수 포함 뉴스 파라미터 스키마
17
19
  export const NewsScoredParamsSchema = NewsParamsSchema.extend({
18
20
  min_score: z.number().min(-10).max(10).optional().describe('최소 감정 점수 (-10~10)'),
19
21
  max_score: z.number().min(-10).max(10).optional().describe('최대 감정 점수 (-10~10)'),
20
22
  verdict: z.enum(['bullish', 'bearish', 'neutral']).optional().describe('판정 필터'),
21
- });
23
+ market: z.string().optional().describe('시장 필터 (KR, US 등) - 호환성 유지용'), // [FIX] LLM Compatibility
24
+ }); // [MOD] Removed .strict()
22
25
  // 뉴스 조회 (점수 제외)
23
26
  export async function getNews(params) {
24
- const result = await callApi('news', params);
27
+ console.error(`[getNews] Params: ${JSON.stringify(params)}`); // [DEBUG]
28
+ const { tag_code, start_date, end_date, ...rest } = params;
29
+ // [FIX] Handle Aliases
30
+ const apiParams = { ...rest, tag: tag_code };
31
+ if (start_date && !apiParams.from_date)
32
+ apiParams.from_date = start_date;
33
+ if (end_date && !apiParams.to_date)
34
+ apiParams.to_date = end_date;
35
+ const result = await callApi('news', apiParams);
25
36
  return result;
26
37
  }
27
38
  // 뉴스 조회 (점수 포함)
28
39
  export async function getNewsScored(params) {
29
- const result = await callApi('news-scored', params);
40
+ console.error(`[getNewsScored] Params: ${JSON.stringify(params)}`); // [DEBUG]
41
+ const { tag_code, start_date, end_date, ...rest } = params; // [FIXED] Include 'market' in API call by not destructuring it from rest (it's inside rest now or handled by type)
42
+ // [FIX] Handle Aliases
43
+ const apiParams = { ...rest, tag: tag_code };
44
+ if (start_date && !apiParams.from_date)
45
+ apiParams.from_date = start_date;
46
+ if (end_date && !apiParams.to_date)
47
+ apiParams.to_date = end_date;
48
+ const result = await callApi('news-scored', apiParams);
30
49
  return result;
31
50
  }
@@ -1,34 +1,39 @@
1
1
  /**
2
- * 컨설팅 보고서 관련 MCP Tools
2
+ * Research (보고서) 관련 MCP Tools
3
3
  */
4
4
  import { z } from 'zod';
5
5
  export declare const ResearchParamsSchema: z.ZodObject<{
6
- tag_code: z.ZodString;
7
- limit: z.ZodDefault<z.ZodNumber>;
6
+ tag_code: z.ZodOptional<z.ZodString>;
8
7
  source: z.ZodOptional<z.ZodString>;
8
+ limit: z.ZodDefault<z.ZodNumber>;
9
+ offset: z.ZodDefault<z.ZodNumber>;
9
10
  }, "strip", z.ZodTypeAny, {
10
11
  limit: number;
11
- tag_code: string;
12
+ offset: number;
13
+ tag_code?: string | undefined;
12
14
  source?: string | undefined;
13
15
  }, {
14
- tag_code: string;
16
+ tag_code?: string | undefined;
15
17
  source?: string | undefined;
16
18
  limit?: number | undefined;
19
+ offset?: number | undefined;
17
20
  }>;
18
21
  export type ResearchParams = z.infer<typeof ResearchParamsSchema>;
19
22
  export declare function getResearch(params: ResearchParams): Promise<{
20
- tag_code: string;
21
- tag_name: string | null;
22
- research_count: number;
23
- research: Array<{
23
+ success: boolean;
24
+ data: Array<{
24
25
  id: number;
25
26
  title: string;
27
+ summary: string;
28
+ tag_codes: string[];
29
+ created_at: string;
30
+ processed_at: string;
26
31
  source: string;
27
- content_type: string;
28
- published_at: string | null;
29
- chunks: Array<{
30
- section: string;
31
- content: string;
32
- }>;
32
+ market_outlook?: string;
33
33
  }>;
34
+ meta: {
35
+ count: number;
36
+ limit: number;
37
+ offset: number;
38
+ };
34
39
  }>;
@@ -1,18 +1,18 @@
1
1
  /**
2
- * 컨설팅 보고서 관련 MCP Tools
2
+ * Research (보고서) 관련 MCP Tools
3
3
  */
4
4
  import { z } from 'zod';
5
5
  import { callApi } from '../utils/api.js';
6
- const API_BASE = 'https://ragalgo-research-production.up.railway.app'; // 혹시 몰라 남겨룸, 하지만 callApi 사용시 Supabase Edge Function 호출
7
- // 보고서 조회 파라미터 스키마
6
+ // Research 파라미터 스키마
8
7
  export const ResearchParamsSchema = z.object({
9
- tag_code: z.string().describe('태그 코드 (필수). search_tags로 먼저 조회하세요.'),
10
- limit: z.number().min(1).max(10).default(5).describe('보고서 (기본 5, 최대 10)'),
11
- source: z.string().optional().describe('출처 필터 (선택): mckinsey, goldman, bcg, lg_research 등'),
8
+ tag_code: z.string().optional().describe('Tag code filter (e.g., STK005930, USTK_AAPL)'),
9
+ source: z.string().optional().describe('Source filter (e.g., mckinsey, bcg, ls)'),
10
+ limit: z.number().min(1).max(50).default(10).describe('Result count (default: 10)'),
11
+ offset: z.number().min(0).default(0).describe('Pagination offset'),
12
12
  });
13
- // 보고서 조회
13
+ // Research 보고서 조회
14
14
  export async function getResearch(params) {
15
- // Supabase Edge Function 호출
16
- const result = await callApi('research', params); // 'research' function 호출
15
+ const endpoint = 'research';
16
+ const result = await callApi(endpoint, params);
17
17
  return result;
18
18
  }
@@ -0,0 +1,33 @@
1
+ import { z } from 'zod';
2
+ export declare const RoomsParamsSchema: z.ZodObject<{
3
+ search: z.ZodOptional<z.ZodString>;
4
+ type: z.ZodOptional<z.ZodEnum<["tag", "ticker", "keyword"]>>;
5
+ limit: z.ZodDefault<z.ZodNumber>;
6
+ }, "strip", z.ZodTypeAny, {
7
+ limit: number;
8
+ type?: "ticker" | "tag" | "keyword" | undefined;
9
+ search?: string | undefined;
10
+ }, {
11
+ type?: "ticker" | "tag" | "keyword" | undefined;
12
+ search?: string | undefined;
13
+ limit?: number | undefined;
14
+ }>;
15
+ export type RoomsParams = z.infer<typeof RoomsParamsSchema>;
16
+ export declare const GetAvailableRoomsSchema: z.ZodObject<{
17
+ search: z.ZodOptional<z.ZodString>;
18
+ type: z.ZodOptional<z.ZodEnum<["tag", "ticker", "keyword"]>>;
19
+ limit: z.ZodDefault<z.ZodNumber>;
20
+ }, "strip", z.ZodTypeAny, {
21
+ limit: number;
22
+ type?: "ticker" | "tag" | "keyword" | undefined;
23
+ search?: string | undefined;
24
+ }, {
25
+ type?: "ticker" | "tag" | "keyword" | undefined;
26
+ search?: string | undefined;
27
+ limit?: number | undefined;
28
+ }>;
29
+ export declare function getAvailableRooms(params: RoomsParams): Promise<{
30
+ rooms: any;
31
+ count: any;
32
+ help: string;
33
+ }>;
@@ -0,0 +1,43 @@
1
+ import { z } from 'zod';
2
+ const SUPABASE_PROJECT_URL = 'https://xunrsikkybgxkybjzrgz.supabase.co';
3
+ const SUPABASE_REST_URL = `${SUPABASE_PROJECT_URL}/rest/v1`;
4
+ const SUPABASE_ANON_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Inh1bnJzaWtreWJneGt5Ymp6cmd6Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NjQ0NTExNTgsImV4cCI6MjA4MDAyNzE1OH0.SsXri828-Rf0gHlu4Bls-pewhfMNNII4mbiuLnc9ACs';
5
+ export const RoomsParamsSchema = z.object({
6
+ search: z.string().optional().describe('Search term for rooms (e.g., "Samsung", "Semiconductor")'),
7
+ type: z.enum(['tag', 'ticker', 'keyword']).optional().describe('Filter by room type'),
8
+ limit: z.number().min(1).max(100).default(20).describe('Result count'),
9
+ });
10
+ export const GetAvailableRoomsSchema = RoomsParamsSchema;
11
+ export async function getAvailableRooms(params) {
12
+ const url = new URL(`${SUPABASE_REST_URL}/available_websocket_rooms`);
13
+ // Select specific columns
14
+ url.searchParams.append('select', 'room_id,type,description');
15
+ // Add filters
16
+ if (params.search) {
17
+ // Search in both description and room_id
18
+ url.searchParams.append('or', `(description.ilike.*${params.search}*,room_id.ilike.*${params.search}*)`);
19
+ }
20
+ if (params.type) {
21
+ url.searchParams.append('type', `eq.${params.type}`);
22
+ }
23
+ // Limit
24
+ url.searchParams.append('limit', String(params.limit));
25
+ const response = await fetch(url.toString(), {
26
+ method: 'GET',
27
+ headers: {
28
+ 'Authorization': `Bearer ${SUPABASE_ANON_KEY}`,
29
+ 'apikey': SUPABASE_ANON_KEY,
30
+ 'Content-Type': 'application/json',
31
+ },
32
+ });
33
+ if (!response.ok) {
34
+ const error = await response.text();
35
+ throw new Error(`Failed to fetch rooms: ${response.status} - ${error}`);
36
+ }
37
+ const data = await response.json();
38
+ return {
39
+ rooms: data,
40
+ count: data.length,
41
+ help: "Use these room_ids to subscribe via WebSocket. Example: socket.emit('subscribe', 'tag:STK005930')"
42
+ };
43
+ }
@@ -4,6 +4,7 @@
4
4
  import { z } from 'zod';
5
5
  export declare const SnapshotsParamsSchema: z.ZodObject<{
6
6
  tag_code: z.ZodOptional<z.ZodString>;
7
+ market: z.ZodOptional<z.ZodEnum<["KR", "US", "JP", "UK", "UNIFIED", "CRY", "FUTURES"]>>;
7
8
  date: z.ZodOptional<z.ZodString>;
8
9
  days: z.ZodDefault<z.ZodNumber>;
9
10
  limit: z.ZodDefault<z.ZodNumber>;
@@ -13,11 +14,13 @@ export declare const SnapshotsParamsSchema: z.ZodObject<{
13
14
  offset: number;
14
15
  days: number;
15
16
  tag_code?: string | undefined;
17
+ market?: "US" | "JP" | "UK" | "KR" | "UNIFIED" | "CRY" | "FUTURES" | undefined;
16
18
  date?: string | undefined;
17
19
  }, {
20
+ tag_code?: string | undefined;
18
21
  limit?: number | undefined;
19
22
  offset?: number | undefined;
20
- tag_code?: string | undefined;
23
+ market?: "US" | "JP" | "UK" | "KR" | "UNIFIED" | "CRY" | "FUTURES" | undefined;
21
24
  date?: string | undefined;
22
25
  days?: number | undefined;
23
26
  }>;
@@ -6,9 +6,10 @@ import { callApi } from '../utils/api.js';
6
6
  // 스냅샷 파라미터 스키마
7
7
  export const SnapshotsParamsSchema = z.object({
8
8
  tag_code: z.string().optional().describe('태그 코드 (예: STK005930)'),
9
+ market: z.enum(['KR', 'US', 'JP', 'UK', 'UNIFIED', 'CRY', 'FUTURES']).optional().describe('시장 구분 (KR/US/JP/UK/UNIFIED/CRY/FUTURES)'),
9
10
  date: z.string().optional().describe('날짜 (YYYY-MM-DD)'),
10
- days: z.number().min(1).max(30).default(7).describe('최근 N일 (기본: 7)'),
11
- limit: z.number().min(1).max(100).default(50).describe('결과 수'),
11
+ days: z.number().min(1).default(7).describe('최근 N일 (기본: 7, 무제한)'),
12
+ limit: z.number().min(1).default(50).describe('결과 수 (기본: 50, 무제한)'),
12
13
  offset: z.number().min(0).default(0).describe('페이지네이션 오프셋'),
13
14
  });
14
15
  // 스냅샷 조회
@@ -24,6 +25,9 @@ export async function getSnapshots(params) {
24
25
  if (tag_code) {
25
26
  queryParams.tag_code = tag_code;
26
27
  }
28
+ if (params.market) {
29
+ queryParams.market = params.market;
30
+ }
27
31
  const result = await callApi(endpoint, queryParams);
28
32
  return result;
29
33
  }
@@ -3,25 +3,28 @@
3
3
  */
4
4
  import { z } from 'zod';
5
5
  export declare const TagsSearchParamsSchema: z.ZodObject<{
6
- q: z.ZodString;
6
+ q: z.ZodOptional<z.ZodString>;
7
+ query: z.ZodOptional<z.ZodString>;
7
8
  type: z.ZodOptional<z.ZodEnum<["STOCK", "SECTOR", "THEME", "CRYPTO"]>>;
8
9
  limit: z.ZodDefault<z.ZodNumber>;
9
10
  }, "strip", z.ZodTypeAny, {
10
11
  limit: number;
11
- q: string;
12
12
  type?: "STOCK" | "SECTOR" | "THEME" | "CRYPTO" | undefined;
13
+ q?: string | undefined;
14
+ query?: string | undefined;
13
15
  }, {
14
- q: string;
15
- limit?: number | undefined;
16
16
  type?: "STOCK" | "SECTOR" | "THEME" | "CRYPTO" | undefined;
17
+ limit?: number | undefined;
18
+ q?: string | undefined;
19
+ query?: string | undefined;
17
20
  }>;
18
21
  export declare const TagsMatchParamsSchema: z.ZodObject<{
19
22
  text: z.ZodString;
20
23
  types: z.ZodOptional<z.ZodArray<z.ZodEnum<["STOCK", "SECTOR", "THEME", "CRYPTO"]>, "many">>;
21
24
  limit: z.ZodDefault<z.ZodNumber>;
22
25
  }, "strip", z.ZodTypeAny, {
23
- limit: number;
24
26
  text: string;
27
+ limit: number;
25
28
  types?: ("STOCK" | "SECTOR" | "THEME" | "CRYPTO")[] | undefined;
26
29
  }, {
27
30
  text: string;
@@ -30,7 +33,38 @@ export declare const TagsMatchParamsSchema: z.ZodObject<{
30
33
  }>;
31
34
  export type TagsSearchParams = z.infer<typeof TagsSearchParamsSchema>;
32
35
  export type TagsMatchParams = z.infer<typeof TagsMatchParamsSchema>;
33
- export declare function searchTags(params: TagsSearchParams): Promise<{
36
+ export declare const SearchTagsParamsSchema: z.ZodObject<{
37
+ q: z.ZodOptional<z.ZodString>;
38
+ query: z.ZodOptional<z.ZodString>;
39
+ type: z.ZodOptional<z.ZodEnum<["STOCK", "SECTOR", "THEME", "CRYPTO"]>>;
40
+ limit: z.ZodDefault<z.ZodNumber>;
41
+ }, "strip", z.ZodTypeAny, {
42
+ limit: number;
43
+ type?: "STOCK" | "SECTOR" | "THEME" | "CRYPTO" | undefined;
44
+ q?: string | undefined;
45
+ query?: string | undefined;
46
+ }, {
47
+ type?: "STOCK" | "SECTOR" | "THEME" | "CRYPTO" | undefined;
48
+ limit?: number | undefined;
49
+ q?: string | undefined;
50
+ query?: string | undefined;
51
+ }>;
52
+ export declare const MatchTagsParamsSchema: z.ZodObject<{
53
+ text: z.ZodString;
54
+ types: z.ZodOptional<z.ZodArray<z.ZodEnum<["STOCK", "SECTOR", "THEME", "CRYPTO"]>, "many">>;
55
+ limit: z.ZodDefault<z.ZodNumber>;
56
+ }, "strip", z.ZodTypeAny, {
57
+ text: string;
58
+ limit: number;
59
+ types?: ("STOCK" | "SECTOR" | "THEME" | "CRYPTO")[] | undefined;
60
+ }, {
61
+ text: string;
62
+ limit?: number | undefined;
63
+ types?: ("STOCK" | "SECTOR" | "THEME" | "CRYPTO")[] | undefined;
64
+ }>;
65
+ export declare function searchTags(params: TagsSearchParams & {
66
+ query?: string;
67
+ }): Promise<{
34
68
  success: boolean;
35
69
  data: Array<{
36
70
  tag_code: string;
@@ -5,7 +5,8 @@ import { z } from 'zod';
5
5
  import { callApi, callApiPost } from '../utils/api.js';
6
6
  // 태그 검색 파라미터 스키마
7
7
  export const TagsSearchParamsSchema = z.object({
8
- q: z.string().describe('검색어 (예: 삼성, 반도체)'),
8
+ q: z.string().describe('검색어 (예: 삼성, 반도체)').optional(),
9
+ query: z.string().optional().describe('검색어 alias'), // [FIX] LLM often sends 'query'
9
10
  type: z.enum(['STOCK', 'SECTOR', 'THEME', 'CRYPTO']).optional().describe('태그 타입'),
10
11
  limit: z.number().min(1).max(50).default(20).describe('결과 수'),
11
12
  });
@@ -15,9 +16,19 @@ export const TagsMatchParamsSchema = z.object({
15
16
  types: z.array(z.enum(['STOCK', 'SECTOR', 'THEME', 'CRYPTO'])).optional().describe('태그 타입 필터'),
16
17
  limit: z.number().min(1).max(20).default(10).describe('결과 수'),
17
18
  });
19
+ export const SearchTagsParamsSchema = TagsSearchParamsSchema;
20
+ export const MatchTagsParamsSchema = TagsMatchParamsSchema;
18
21
  // 태그 검색
19
22
  export async function searchTags(params) {
20
- const result = await callApi('tags/search', params);
23
+ // [FIX] Alias mapping: query -> q
24
+ if (!params.q && params.query) {
25
+ params.q = params.query;
26
+ }
27
+ if (!params.q) {
28
+ throw new Error("검색어(q 또는 query)가 필요합니다.");
29
+ }
30
+ const { query, ...apiParams } = params; // Remove 'query' alias from API call
31
+ const result = await callApi('tags/search', apiParams);
21
32
  return result;
22
33
  }
23
34
  // 태그 매칭 (텍스트 → 태그)