vndirect-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@vndirect-mcpDetect MACD divergence for HPG"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
vndirect-mcp
MCP server cá nhân cung cấp dữ liệu chứng khoán Việt Nam từ API công khai của VNDIRECT (không cần đăng nhập/API key), để dùng cho bot phân tích kỹ thuật trong VISSOFT AI Team Manager (hoặc bất kỳ Claude Code / MCP client nào khác).
Tool cung cấp
get_ohlc(symbol, resolution, count)
Lấy dữ liệu nến OHLCV lịch sử.
symbol: mã cổ phiếu, ví dụHPG,VNM,FPTresolution:"1H"|"4H"|"1D"count: số nến muốn lấy (1–500, mặc định 100)
Đã kiểm chứng hoạt động thật (test trực tiếp qua stdio JSON-RPC lúc build) cho cả 3 khung thời gian. Lưu ý:
1Hvà1Dgọi thẳng APIdchart-api.vndirect.com.vn(resolution60/D).4Hkhông có sẵn ở VNDIRECT — server tự gộp mỗi 4 nến 1H liên tiếp thành 1 nến 4H (gộp theo thứ tự nến trả về, không theo mốc giờ tường minh, vì phiên giao dịch VN chỉ ~4.25h/ngày và ngắt quãng nghỉ trưa nên gộp theo giờ cố định dễ lệch hơn gộp tuần tự).
get_fundamentals(symbol)
Lấy chỉ số/thông tin cơ bản qua api-finfo.vndirect.com.vn (lưu ý: đúng là
api-finfo, KHÔNG PHẢI finfo-api — dễ gõ nhầm thứ tự, bản đầu tiên của tool này bị
đúng lỗi này).
Đã kiểm chứng hoạt động thật với bộ 6 chỉ số curated (P/E, P/B, EPS 4 quý gần nhất, ROE, ROA, tỷ suất cổ tức) — test với HPG ra số hợp lý (P/E=8.02, P/B=1.32, EPS=2750đ, ROE=17.5%, ROA=9%).
Lịch sử debug endpoint (đáng đọc nếu endpoint VNDIRECT đổi lần nữa):
/v4/ratios/latest(bản đầu tiên dùng) hoạt động như 1 feed "bản ghi cập nhật gần nhất" — luôn trả đúng 1 dòng NGẪU NHIÊN theoorder, bỏ qua hoàn toàn filterratioCode— KHÔNG dùng được để lấy 1 chỉ số cụ thể.Endpoint ĐÚNG là
/v4/ratios(không có/latest), query paramq(không phảifilter), sort paramsort=reportDate:desc(không phảiorder=reportDate) — mỗi ratioCode phải gọi RIÊNG 1 request (size=1&sort=reportDate:desc), vì danh sách nhiềuratioCodecách nhau dấu phẩy trong 1 lần gọi bị trộn không đáng tin (chỉ số cập nhật hàng ngày như P/E lấn át chỉ số cập nhật theo quý như ROAE trong cùng 1 trang kết quả).Mã ratioCode xác nhận đúng:
PRICE_TO_EARNINGS,PRICE_TO_BOOK,EPS_TR(EPS 4 quý liền kề — không phảiEARNING_PER_SHARE/BASIC_EPS_TRnhư đoán ban đầu),ROAE_TR_AVG5Q,ROAA_TR_AVG5Q,DIVIDEND_YIELD.
Cảnh báo dữ liệu: dividendYield trả về giá trị cực nhỏ bất thường cho HPG (~1.8e-7,
gần như 0) — có thể do công ty trả cổ tức chủ yếu bằng cổ phiếu (không phải tiền mặt) nên
tỷ lệ tiền mặt/thị giá gần 0 là hợp lý thật, hoặc do cách VNDIRECT tính/đơn vị của field
này khác kỳ vọng — CHƯA xác minh được nguyên nhân chính xác, dùng số này thận trọng,
đối chiếu nguồn khác nếu user hỏi cụ thể về cổ tức.
render_chart(symbol, resolution, count, outputPath, smaPeriods?, showVolume?, showMacd?)
Vẽ biểu đồ nến kỹ thuật ra file PNG: candlestick + đường SMA chồng lên giá, panel MACD
(12,26,9) với histogram + đường tín hiệu, panel khối lượng. Tự vẽ bằng
@napi-rs/canvas (Canvas 2D API thô, không phụ thuộc Chart.js hay canvas
gốc — xem "Ghi chú kỹ thuật" bên dưới).
outputPath: đường dẫn file.pngsẽ ghi ra. Muốn bot gửi ảnh này qua Telegram trong lượt trả lời chat trực tiếp, path phải nằm trong thư mụcscratch/của bot (userData/bots/<botId>/scratch/) và bot phải in marker__BOT_SEND_FILE__{"kind":"photo","path":"..."}__BOT_SEND_FILE_END__trong câu trả lời (cơ chế có sẵn của app, xem TASK-123). Cronjob tự động (cảnh báo watchlist) hiện CHƯA gửi được ảnh — đây là giới hạn ở tầngCronjobEngine/DeliveryServicecủa app, đang track ở TASK-128 (docs/tasks/TASK-128trong workspace-ai-team-central).smaPeriods: mảng chu kỳ SMA muốn vẽ, tối đa 4 đường, mặc định[20, 50].showVolume/showMacd: bật/tắt từng panel, mặc địnhtrue.
Đã kiểm chứng hoạt động thật — render thành công cả khung 1D và 1H với dữ liệu
HPG/VNM thật, ảnh PNG hợp lệ, không lỗi. Layout 3-panel (giá/MACD/volume) tham khảo từ
bot-trading-agent/scheduler/chart.py (dự án cũ của user, xem Notes).
Ghi chú kỹ thuật: ban đầu định dùng chart.js + chartjs-node-canvas +
chartjs-chart-financial, nhưng package canvas (native, dependency của
chartjs-node-canvas) không có prebuilt binary cho Node 24 trên Windows và build từ
source cần Visual Studio Build Tools (không có sẵn trên máy). Đã chuyển sang
@napi-rs/canvas (có prebuilt binary Windows x64) + tự vẽ chart thủ công bằng Canvas 2D
API (candlestick = wick line + fillRect body, không dùng chart lib nào).
detect_macd_divergence(symbol, resolution, count)
Port TOÀN BỘ từ hệ thống alert engine cá nhân của user (D:\Projects\bot-trading\ bot-trading-agent, Python — indicators/extrema.py's find_lobe_extrema() +
alerts/{divergence,confirmation,engine,config}.py), đã backtest + tune trên dữ liệu
VNDIRECT thật (HPG/MBB). Đây là method THUẦN TÍNH TOÁN, không có bước "tự kết luận" mơ hồ
như Wyckoff/VSA/SMC — nên port TOÀN BỘ (không tách lớp AI-diễn-giải), giữ nguyên mọi
ngưỡng đã tune (alerts/config.py): cửa sổ xác nhận 7 phiên, thân nến ≥60% biên độ,
volume ≥1.5x TB 10 phiên, tối thiểu 1 phiên "đi đúng hướng" để phân biệt weak-confirmation
vs inconclusive.
Khác bản gốc: bản gốc là state machine PERSISTENT (lưu DB qua nhiều lần scheduler
chạy). MCP tool không có state lưu trữ giữa các lần gọi — detect_macd_divergence()
REPLAY lại toàn bộ lịch sử trong 1 lần gọi (walk-forward candle-by-candle, y hệt cách
production xử lý từng nến mới) để tự tái tạo trạng thái hiện tại. Trả về: currentState
(NEUTRAL/PENDING_CONFIRMATION), freshAlert (tín hiệu phát sinh ĐÚNG tại nến cuối — dùng
để quyết định có cần cảnh báo ngay không), allAlerts (lịch sử đầy đủ trong khoảng dữ
liệu, phục vụ ngữ cảnh).
Đã kiểm chứng hoạt động thật — test với HPG/MBB (đúng 2 mã bản gốc backtest), chuỗi early_divergence → failed_divergence/successful_reversal hợp lý, ngưỡng bucket đúng thiết kế (weak_confirmation_sessions chỉ xuất hiện khi pending_sessions đạt 7).
count mặc định 250, tối thiểu 60 — cần đủ lớn để thuật toán tìm được đủ lobe MACD trước
đó (khuyến nghị giữ >= 200).
compute_bar_metrics(symbol, resolution, count) + find_trading_range(symbol, resolution, count) + analyze_smc_structure(symbol, resolution, count)
3 tool này port phần KHÁCH QUAN của Wyckoff/VSA/SMC từ 2 dự án cũ của user
(D:\Projects\ai-factory\apps\wyckoffviet, Python — vsa_analysis.py,
wyckoff_phase.py, smc_analysis_1h.py). Quyết định kiến trúc đã chốt: KHÔNG port
bước "tự động gán nhãn kết luận" (vd code cũ: if volume≥2.5x avg và body≥50% range và close gần low: return "Selling Climax" — đây là DIỄN GIẢI theo phương pháp luận, tại
sao 2.5x cụ thể chứ không phải 2.3x/2.7x là quyết định tuỳ ý của tác giả, không phải sự
thật khách quan). Ranh giới áp dụng nhất quán cho cả 3 tool:
Port (sự thật hình học/số học, không có ngưỡng phương pháp luận tự đặt): swing high/low (pivot), trading range (vùng đi ngang), volume/spread ratio so với median, close position trong nến, BOS/CHoCH (giá phá đỉnh/đáy cũ — nhị phân, không % tự đặt), Fair Value Gap (định nghĩa hình học 3 nến, không tham số), Liquidity Sweep (wick xuyên rồi close quay lại — nhị phân).
KHÔNG port (diễn giải theo phương pháp luận, có ngưỡng tự đặt): gán nhãn signal VSA cụ thể (No Demand/Climax/Up-thrust/...), gán nhãn event Wyckoff cụ thể (SC/AR/ST/ Spring/SOS/LPS), phase classification (A→E), Order Block (ngưỡng
body×1.5tự đặt), bias/score tổng hợp, và đề xuất entry/SL/TP (tư vấn giao dịch cụ thể — phải do AI cân nhắc theo phong cách/khẩu vị rủi ro của user, không hard-code công thức chung).
AI (Claude) đọc dữ kiện khách quan từ 3 tool này + ảnh chart (render_chart) + skill mô
tả phương pháp (xem skills/, đã viết), rồi tự diễn giải/kết luận — phần "phân tích" thật
sự nằm ở đó.
Đã kiểm chứng hoạt động thật — test với HPG, cả 3 tool trả kết quả hợp lý (trading range 30 nến 16.23% biên độ, 10 swing highs/lows xen kẽ hợp lý, 4 FVG active, bar metrics với close_position/body_ratio đúng khoảng [0,1]).
Bug fix sau khi user báo lỗi thật (TCB): ban đầu find_trading_range trả null bất
cứ khi nào KHÔNG có vùng nào đạt cả 2 ngưỡng (18% biên độ / 6% std) — với TCB (biên độ
thật 21.79%, chỉ nhỉnh hơn ngưỡng chút), bot chỉ nói được "không tìm thấy", không có gì để
phân tích tiếp dù dữ liệu thực ra khá gần đạt. Đã sửa: giờ LUÔN trả về 1 object (trừ khi
<30 nến) — nếu không có vùng nào đạt cả 2 ngưỡng, trả về ứng viên GẦN NHẤT kèm
qualifies: false + rangePct/stdPct thật để bot vẫn giải thích được "gần giống đi
ngang nhưng chưa đủ chặt" thay vì im lặng. Verify lại: TCB → qualifies: false, rangePct: 21.79; HPG → vẫn qualifies: true như cũ (không regression).
compute_bar_metrics yêu cầu count >= 70 (median rolling 50 nến cần warm-up).
list_covered_warrants(underlyingSymbol, limit?) + analyze_covered_warrant(cwSymbol)
Tìm/so sánh chứng quyền có bảo đảm (covered warrant) cho 1 mã cơ sở — VNDIRECT chỉ niêm yết CW mua (call), chưa có CW bán.
list_covered_warrants: liệt kê CW còn niêm yết cho 1 mã cơ sở (mã CW, tổ chức phát hành, giá thực hiện, tỷ lệ chuyển đổi, ngày đáo hạn, số ngày còn lại) — dữ kiện TĨNH, chưa có giá thị trường. Endpoint/v4/derivatives?q=underlyingAsset:X~status:LISTED(endpoint/v4/covered_warrantscũ dùng trongwyckoffvietđã KHÔNG còn tồn tại — trả 404 khi test — phải tìm endpoint thay thế).analyze_covered_warrant: phân tích 1 mã CW cụ thể — lấy giá CW + giá mã cơ sở hiện tại (tái dùngfetchCandles/dchart, hoạt động luôn cho mã CW vì CW cũng là 1 mã niêm yết giao dịch như cổ phiếu thường), tính breakeven/premium%/moneyness%/gearing lý thuyết — công thức tài chính chuẩn, đầy đủ, KHÔNG có ngưỡng "kết luận tốt/xấu" tự đặt nên port toàn bộ (giốngdetect_macd_divergence), không cần tách lớp AI-diễn-giải cho phần TÍNH TOÁN — nhưng việc chọn CW nào phù hợp vẫn cần AI cân nhắc khẩu vị rủi ro user (xem skillcovered-warrant-method).
Đã kiểm chứng hoạt động thật — test với HPG (69 CW đang niêm yết), số liệu breakeven/ premium/moneyness/gearing đối chiếu tay đúng công thức.
Related MCP server: VNStock MCP Server
Skill cho bot
skills/ chứa 6 skill (đúng format SKILL.md app dùng — id/name/description/
source: user/createdAt + nội dung markdown) — copy nội dung vào bot qua UI "Kỹ năng"
(tạo skill riêng, dán nội dung), hoặc copy thẳng cả thư mục vào
userData/bots/<botId>/.claude/skills/<id>/:
Skill | Nội dung |
| Định hướng chung — tool nào dùng khi nào, quy trình phân tích, cách gửi ảnh chart qua Telegram |
| Định nghĩa SC/AR/ST/Spring/SOS/LPS + cách suy ra phase A-E từ |
| Định nghĩa các tín hiệu VSA (No Demand, Climax, Up-thrust...) + cảnh báo đọc trong strong trend |
| Cách đọc |
| MA/MACD cổ điển, cách dùng |
| Cách lọc/so sánh chứng quyền qua |
Nên bật cả 6 nếu muốn bot phân tích đầy đủ theo yêu cầu ban đầu (MA, MACD, Wyckoff, VSA, SMC, Price Action, chứng quyền) — hoặc chỉ bật vài skill nếu chỉ quan tâm 1-2 phương pháp.
Cài đặt & build
npm install
npm run buildOutput nằm ở dist/index.js.
Cách wire vào app VISSOFT AI Team Manager
Đã publish lên npm — không cần clone/build thủ công nữa. Trong app, vào bot bạn muốn dùng
(hoặc 📂 Tài nguyên của tôi > tab mcp), thêm 1 MCP server mới (loại command):
Command:
npxArgs:
["-y", "vndirect-mcp"]
(-y để npx tự tải bản mới nhất không hỏi xác nhận — lần chạy đầu sẽ chậm hơn vài giây vì
phải tải về, các lần sau dùng cache.)
Sau đó vào tab "Công cụ hỗ trợ (MCP)" của bot, tick chọn server này.
Chạy từ source (dev/debug): nếu muốn sửa code rồi test ngay không qua npm, dùng cấu hình cũ trỏ thẳng vào file build local:
Command:
nodeArgs:
["<đường-dẫn-tuyệt-đối-tới-repo>/dist/index.js"]
Test thủ công (không qua app)
node dist/index.jsServer chạy stdio, chờ JSON-RPC trên stdin — dùng để debug tay hoặc tích hợp vào MCP client khác ngoài app này.
Available Tools
9 toolsanalyze_covered_warrantA
Phân tích chi tiết 1 mã chứng quyền (covered warrant) cụ thể — giá CW hiện tại, giá mã cơ sở hiện tại, giá hoà vốn (breakeven), % cần tăng thêm để hoà vốn (premium), % ITM/OTM (moneyness), đòn bẩy lý thuyết, thanh khoản gần đây. Đây là dữ kiện tính toán khách quan (công thức tài chính chuẩn) — việc CW nào 'tốt' để mua vẫn cần cân nhắc thêm khẩu vị rủi ro/view thị trường của user, tool không tự kết luận nên mua hay không.
| Name | Required | Description | Default |
|---|---|---|---|
| cwSymbol | Yes | Mã chứng quyền, ví dụ CHPG2629 (lấy từ list_covered_warrants) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that calculations are objective, based on standard financial formulas, and that no buy/sell recommendation is given. It does not cover potential errors or data assumptions, but the core behavioral limits are transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single substantive paragraph with no filler. The first sentence efficiently lists the output metrics, and the second adds an important caveat. It is longer than some descriptions, but the length is justified by the tool's complexity and the need to set expectations about no buy/sell conclusions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description lists all key output metrics and explains the tool's objective nature. It connects to the sibling list tool via the parameter example. It lacks details on calculation formulas or data freshness, but for the described purpose it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides a clear description for cwSymbol with an example and source ('lấy từ list_covered_warrants'), covering 100% of the parameter. The tool description does not add additional meaning about the parameter beyond context already present in the schema, so it meets the baseline but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool analyzes one specific covered warrant in detail, listing the exact metrics it computes (current price, breakeven, premium, moneyness, leverage, liquidity). It is easily distinguished from sibling tools like get_ohlc or list_covered_warrants, as it focuses on warrant-specific financial calculations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides strong context for when to use the tool: when a user needs detailed objective metrics for a specific covered warrant. It explicitly notes that the tool does not conclude whether to buy, setting expectations about its scope. However, it does not explicitly reference alternatives or state when not to use it compared with sibling tools, so it misses the top tier.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_smc_structureA
Phân tích cấu trúc Smart Money Concepts (SMC) cho 1 mã cổ phiếu Việt Nam: swing high/low, xu hướng (HH/HL hoặc LH/LL), BOS/CHoCH, Fair Value Gap còn active, Liquidity Sweep gần nhất. Đây là dữ kiện cấu trúc/hình học khách quan — tool KHÔNG tự tính bias bullish/bearish hay đề xuất entry/SL/TP (việc đó cần bạn (Claude) tự cân nhắc dựa trên các dữ kiện này + skill phương pháp SMC + bối cảnh/khẩu vị rủi ro của user).
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Số nến dùng để phân tích cấu trúc | |
| symbol | Yes | Mã cổ phiếu, ví dụ HPG, VNM, FPT | |
| resolution | Yes | Khung thời gian nến |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It transparently discloses that the tool returns only objective structural/geometric information and does not generate trade recommendations. It also specifies the scope (one Vietnamese stock) and mentions dynamic conditions like 'còn active' and 'gần nhất', giving a clear behavioral picture. Missing are aspects like rate limits or permissions, but for a read-only analysis tool these are minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, consisting of two sentences. The first sentence front-loads the purpose with a clear list of outputs, and the second sentence adds essential limitation context. Every phrase contributes value, with no redundant language.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must explain what the tool returns. It does this by listing the core SMC elements (swing points, trend labels, BOS/CHoCH, active FVG, liquidity sweep), which is sufficient for a model to understand the output. It also addresses how the results should be interpreted (as objective data, not signals). It could be more detailed about the exact structure or type of the returned data, but the list covers the essentials.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides 100% coverage, with descriptions for all three parameters (symbol, resolution, count). The tool description does not add additional meaning about parameters beyond what the schema already provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool's purpose: 'Phân tích cấu trúc Smart Money Concepts' for a Vietnamese stock, listing specific outputs like swing high/low, trend (HH/HL or LH/LL), BOS/CHoCH, active FVG, and nearest liquidity sweep. This distinguishes it from sibling tools such as detect_macd_divergence or compute_bar_metrics, which focus on other technical aspects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states what the tool does NOT do: it does not compute bullish/bearish bias or suggest entry/SL/TP, clarifying when not to rely on it for those decisions. It frames the output as objective structural data for Claude's own reasoning, implying when to use it, but it does not explicitly mention alternative tools for other use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compute_bar_metricsA
Tính chỉ số THÔ theo từng nến (volume_ratio, spread_ratio, close_position, body_ratio) + trend % — nền tảng khách quan để tự nhận diện tín hiệu VSA (No Demand, Climax, Up-thrust, Stopping Volume...) hoặc sự kiện Wyckoff (SC, AR, ST, Spring, SOS, LPS) theo đúng ngưỡng mô tả trong skill phương pháp. Tool này KHÔNG tự gán nhãn signal — chỉ trả số liệu, việc đọc/kết luận là của bạn (Claude), dựa trên skill hướng dẫn phương pháp cụ thể.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Số nến lấy về — cần >= 70 để chỉ số volume/spread ratio có đủ dữ liệu warm-up (median 50 nến) | |
| symbol | Yes | Mã cổ phiếu, ví dụ HPG, VNM, FPT | |
| resolution | Yes | Khung thời gian nến |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden and clearly discloses the key behavioral trait that the tool does not assign signal labels and only returns numeric data. It also mentions it follows threshold descriptions in the skill, adding context about how the data relates to methodologies. It does not mention rate limits or side effects, but for a compute-only tool these are less critical.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loading the core function with a specific metric list, then a valuable clarification about non-labeling. It is concise with no filler, and each sentence serves a distinct purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's modest complexity, the description is complete: it lists the outputs (metric names and trend %), explains its role in VSA/Wyckoff analysis, and clarifies its non-labeling behavior. It does not describe the return format or exact trend % computation, but the absence of an output schema makes this a minor gap, and the reference to the skill fills some context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters (symbol, resolution, count) are fully described in the schema with types, defaults, ranges, and purpose (e.g., count warm-up requirement). The description adds context about the computed metrics but does not enrich parameter semantics beyond what the schema already provides, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool computes raw per-candle metrics (volume_ratio, spread_ratio, close_position, body_ratio) plus trend %, with a specific verb 'Tính' (calculate). It explicitly distinguishes itself from signal-detection siblings by stating it does NOT auto-label signals, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: it is the objective foundation for identifying VSA/Wyckoff events, and it explicitly says conclusions are left to Claude based on the methodology skill. This implies when to use it (raw data needed) versus signal-labeling tools, though it does not explicitly name alternatives or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detect_macd_divergenceA
Phát hiện phân kỳ MACD (lobe-based) + trạng thái xác nhận đảo chiều cho 1 mã cổ phiếu Việt Nam — port từ hệ thống alert engine cá nhân đã backtest/tune trên dữ liệu VNDIRECT thật. Trả về trạng thái hiện tại (đang chờ xác nhận hay không), tín hiệu MỚI PHÁT SINH tại nến gần nhất (dùng để quyết định có cần cảnh báo ngay không), và lịch sử tín hiệu trong khoảng dữ liệu.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Số nến dùng để phân tích — cần đủ lớn để tìm đủ lobe MACD trước đó, khuyến nghị >= 200 | |
| symbol | Yes | Mã cổ phiếu, ví dụ HPG, VNM, FPT | |
| resolution | Yes | Khung thời gian nến — 1D cho tín hiệu swing, 1H/4H cho tín hiệu ngắn hạn hơn |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It discloses that the tool is a port of a personal alert engine backtested on real VNDIRECT data, and that it returns current status, newly generated signals at the latest candle, and signal history. However, it does not discuss limitations, potential false positives, data sensitivity (e.g., needing enough candles), or any side effects. This is moderate transparency but lacks important behavioral caveats for a detection tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, information-dense sentence that covers purpose, origin, and return values with reasonable efficiency. It is not overly long, but the multiple clauses make it slightly less scannable. A short list or second sentence would improve structure, but it is still appropriately compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must explain what the tool returns. It does mention three types of return data (current status, new signal at latest candle, signal history) but does not describe the structure or format of these outputs (e.g., boolean, object, or array). For a specialized analysis tool, this is a notable gap. The description also omits any details about the 'lobe-based' algorithm, leaving the agent to infer the input–output behavior. It is adequate for a high-level understanding but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters (symbol, resolution, count) are fully documented in the schema. The tool description itself adds no additional parameter meaning beyond restating the purpose; for example, the note about 'count' needing to be large is in the schema, not the description. Therefore, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool detects MACD divergence (lobe-based) and reversal confirmation status for a Vietnamese stock, which is a specific verb+resource+scope. It is distinct from all sibling tools, none of which mention MACD or divergence detection. The mention of 'alert engine' and 'backtested' reinforces its specialized purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides usage context by explaining the return values are meant for deciding whether to alert immediately ('dùng để quyết định có cần cảnh báo ngay không'). It also implies appropriate use through the resolution guidance in the schema ('1D cho tín hiệu swing, 1H/4H cho tín hiệu ngắn hạn hơn'), though this is in the parameter schema, not the tool description. It does not explicitly state when not to use this tool or name alternatives, but no sibling is a direct alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_trading_rangeA
Tìm vùng giá đi ngang (trading range) gần nhất của 1 mã cổ phiếu Việt Nam — biên trên/dưới, độ dài, mức độ 'phẳng'. Đây là dữ kiện cấu trúc khách quan để tự nhận diện phase Wyckoff (Accumulation A-E) — kết hợp với compute_bar_metrics để tự xác định SC/AR/ST/Spring/SOS/LPS theo đúng định nghĩa trong skill phương pháp Wyckoff. Trả về null CHỈ KHI không đủ dữ liệu (<30 nến); nếu có đủ dữ liệu nhưng không có vùng nào đủ chặt, vẫn trả về ứng viên GẦN NHẤT kèm qualifies:false (đọc kỹ field này — false nghĩa là chỉ 'gần giống' đi ngang, chưa đủ tiêu chuẩn để áp Wyckoff Accumulation, đừng coi ngang với qualifies:true).
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Số nến dùng để tìm trading range | |
| symbol | Yes | Mã cổ phiếu, ví dụ HPG, VNM, FPT | |
| resolution | Yes | Khung thời gian nến |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, this description fully carries the behavioral transparency burden and does so exceptionally well. It explicitly states the null return condition (fewer than 30 candles), and explains that when no tight range exists it still returns the nearest candidate with qualifies:false, including a warning not to misread that flag as true. This directly prevents a common misinterpretation and discloses edge-case behavior comprehensively.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with an action-focused opening, a context sentence about Wyckoff usage, and a detailed edge-case explanation. Each section serves a purpose, though the Wyckoff sentence is somewhat long and could be tightened. Overall, it is well-organized and not verbose for the amount of critical behavioral information it conveys.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the description outlines the key return fields (upper/lower band, length, flatness), the qualifies flag, and the null behavior. It also connects the tool to a concrete workflow with compute_bar_metrics. It stops short of specifying the exact JSON response shape, but for tool selection and invocation it provides sufficient operational context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides complete descriptions for all three parameters (symbol, resolution, count), including default, min, and max values. The description adds no significant parameter-level detail beyond referencing the 30-candle minimum, which is already present in the schema. Given the high schema coverage, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the specific verb 'Tìm' (find) and a clearly defined resource: the nearest sideways price range (trading range) of a Vietnamese stock, including upper/lower boundaries, length, and flatness. It differentiates itself from sibling tools by explicitly positioning the result as objective structural data for Wyckoff phase identification and referencing compute_bar_metrics as a complementary tool for event-level analysis.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear contextual guidance: it is intended for identifying Wyckoff Accumulation phases and should be combined with compute_bar_metrics for SC/AR/ST/Spring/SOS/LPS detection. It does not enumerate when not to use it or alternative sibling tools, but the primary use case is explicit and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fundamentalsA
Lấy chỉ số tài chính cơ bản (P/E, P/B, EPS 4 quý gần nhất, ROE, ROA, tỷ suất cổ tức) của 1 mã cổ phiếu Việt Nam từ VNDIRECT — mỗi chỉ số là giá trị cập nhật gần nhất VNDIRECT có. Một số mã có thể thiếu vài chỉ số (vd không trả cổ tức thì dividendYield rỗng) — trường 'error' báo rõ lý do.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Mã cổ phiếu, ví dụ HPG, VNM, FPT |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full transparency burden. It discloses that each indicator is the latest value from VNDIRECT, acknowledges that some indicators may be missing (e.g., dividendYield for non-dividend stocks), and mentions an 'error' field that explains failures. This is meaningful behavioral context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The entire description consists of two concise sentences in Vietnamese: the first states the tool's purpose and data source, the second addresses data availability and error reporting. Every clause adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool without an output schema, the description explains the data source, the list of indicators, the behavior when data is missing, and the existence of an 'error' field. It does not detail the exact return structure (e.g., JSON keys) but covers the essential information an agent needs. This makes it largely complete, though a formal output schema would eliminate ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully documents the single 'symbol' parameter with examples (HPG, VNM, FPT), so the description does not need to add parameter details. The description adds no additional semantics beyond the schema, warranting the baseline score for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the verb 'Lấy' (get) with a specific resource: fundamental indicators (P/E, P/B, EPS, ROE, ROA, dividend yield) for a Vietnamese stock from VNDIRECT. This clearly distinguishes it from sibling technical analysis tools like get_ohlc or detect_macd_divergence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for retrieving fundamental data, in contrast to the technical indicators provided by sibling tools. However, it does not explicitly state when to choose this over alternatives or mention exclusions. The context of the sibling list makes the differentiation clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ohlcA
Lấy dữ liệu nến (OHLCV) lịch sử của 1 mã cổ phiếu Việt Nam từ VNDIRECT, theo khung 1H, 4H hoặc 1D. Khung 4H được tự tổng hợp từ nến 1H vì VNDIRECT không có sẵn khung này.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Số nến muốn lấy, tối đa 500 | |
| symbol | Yes | Mã cổ phiếu, ví dụ HPG, VNM, FPT | |
| resolution | Yes | Khung thời gian nến |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full transparency burden and credibly discloses the VNDIRECT source and the 4H aggregation from 1H candles. This goes beyond a simple 'get data' statement, though it omits return format and error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loaded with the action and resource, and each clause adds distinct information. It is appropriately sized for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple data retrieval tool without an output schema, the description gives sufficient context: it identifies OHLCV as the data type, names the source, and explains the 4H anomaly. The absence of explicit return structure is mitigated by the well-known OHLCV format and comprehensive parameter schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides full parameter descriptions, so baseline is 3. The description adds meaningful context by explaining that the 4H resolution is synthesized from 1H, which is not evident from the schema alone, and provides example symbols.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: fetching historical OHLCV data for a Vietnamese stock from VNDIRECT, with specific timeframes. It distinguishes itself from sibling tools by specifying the data type and source, making it unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool by defining its data scope (historical OHLCV) and available timeframes, but it does not explicitly mention alternatives or exclusion criteria. The note about 4H synthesis adds contextual guidance for that resolution.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_covered_warrantsA
Liệt kê các mã chứng quyền (covered warrant, CW) đang niêm yết cho 1 mã cơ sở tại VNDIRECT — mã CW, tổ chức phát hành, giá thực hiện, tỷ lệ chuyển đổi, ngày đáo hạn, số ngày còn lại. Chỉ trả dữ kiện tĩnh (không có giá thị trường) — dùng để lọc sơ bộ trước khi gọi analyze_covered_warrant cho từng mã cụ thể muốn xem chi tiết.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Số CW tối đa trả về, sắp xếp theo ngày đáo hạn gần nhất trước | |
| underlyingSymbol | Yes | Mã cổ phiếu cơ sở, ví dụ HPG, VNM, FPT |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description takes on the full burden of behavioral disclosure. It clearly states that only static data is returned (no market price), which is a key behavioral trait. It does not mention pagination or potential errors, but for a simple listing tool this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core action and data fields, followed by a useful clarification about static data and the intended pre-filter usage. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a simple listing operation with two parameters and no output schema. The description lists the returned fields, notes the lack of market price, and connects to the sibling analysis tool, providing enough context for an agent to select and invoke it. Minor omission: does not mention the default limit/sorting in the main text, but that is captured in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides full descriptions for both underlyingSymbol and limit, including the sorting behavior for limit. The description adds no extra parameter-level detail, but since schema coverage is 100%, a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists covered warrants for a specific underlying stock at VNDIRECT, enumerates the returned fields (CW code, issuer, exercise price, conversion ratio, maturity date, days remaining), and explicitly distinguishes it from the sibling tool analyze_covered_warrant by positioning it as a pre-filtering step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this for preliminary filtering before calling analyze_covered_warrant for detailed analysis, naming the alternative tool. This gives clear guidance on when to use this tool and how it fits in a workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_chartA
Vẽ biểu đồ nến kỹ thuật cho 1 mã cổ phiếu Việt Nam (candlestick + đường SMA, panel MACD, panel khối lượng), xuất ra file PNG tại đường dẫn chỉ định. Muốn gửi ảnh này qua Telegram thì outputPath phải nằm trong thư mục scratch/ của bot (xem BOT_SEND_FILE marker).
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Số nến dùng để vẽ | |
| symbol | Yes | Mã cổ phiếu, ví dụ HPG, VNM, FPT | |
| showMacd | No | Có vẽ panel MACD(12,26,9) không | |
| outputPath | Yes | Đường dẫn file .png sẽ ghi ra. Dùng ĐƯỜNG DẪN TUYỆT ĐỐI (không dùng tên file tương đối trần trụi) — path tương đối resolve theo cwd của chính tiến trình MCP server này, có thể KHÔNG khớp với nơi bot/kênh gửi tin đang tìm file. | |
| resolution | Yes | Khung thời gian nến | |
| showVolume | No | Có vẽ panel khối lượng không | |
| smaPeriods | No | Danh sách chu kỳ SMA muốn vẽ chồng lên giá, tối đa 4 đường |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description takes full responsibility for behavioral disclosure. It warns that relative paths resolve to the MCP server's cwd, not the bot's, and gives a Telegram-specific requirement. It doesn't mention file overwriting or permissions, but for a chart renderer this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: the first states the core functionality and output, the second adds practical path guidance. Both sentences carry necessary information with no redundancy, making it concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter chart tool with no output schema, the description covers purpose, output format (PNG), file path constraints, and a specific use case (Telegram). Combined with complete schema descriptions, an agent has all needed information to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the baseline is 3. The description references SMA, MACD, and volume panels, but the schema already explains all parameters in detail, so the description adds no unique semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it draws a technical candlestick chart for one Vietnamese stock, listing components (SMA, MACD, volume) and output as PNG. This distinguishes it from sibling tools focused on data retrieval or analysis, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides context on when to use the tool (when a PNG chart is needed) and a specific condition for sending via Telegram. However, it doesn't explicitly compare with alternatives or state exclusions, so it falls short of the highest bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool serves a clearly distinct purpose: raw data retrieval, fundamentals, charting, technical signal detection, bars metrics, range detection, SMC analysis, and warrant listing/analysis. The only mild overlap is between compute_bar_metrics and find_trading_range, but one provides per-candle metrics while the other identifies ranges, so they are not confusable.
All tool names follow a consistent verb_noun snake_case pattern (get_, render_, detect_, compute_, find_, analyze_, list_). The verbs are descriptive and match the action, making the API predictable and easy to navigate.
9 tools is well-scoped for a stock analysis MCP server covering historical data, fundamentals, technical analysis, charting, and covered warrants. Every tool addresses a distinct need without unnecessary bloat.
The tool surface covers the core needs for Vietnam stock analysis: OHLC data, key fundamentals, technical analysis tools (MACD, VSA/Wyckoff, SMC), charting, and covered warrant analysis. Minor gaps exist, such as no direct real-time quote tool or a stock screener, but these are not critical for the server's evident purpose.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Vietnam stock market data & portfolios via Finhay Securities OpenAPI.
Twelve Data MCP: real-time & historical market data (stocks, crypto, forex, etc).
The financial MCP for AI agents - 90+ financial tables, SEC filings, signals, alt-data.
Real SEC, 13F, insider, congress & macro data your AI agent can cite. Hosted MCP, 24 tools.
Related MCP Servers
- FlicenseBqualityDmaintenanceProvides access to Vietnamese stock market data and APIs from VNDirect, FireAnt, and SSI, including real-time stock prices, market news from CafeF, technical analysis (Doji patterns), and comprehensive stock listings.73
- AlicenseBqualityDmaintenanceProvides access to Vietnam stock market data including real-time quotes, historical prices, company financials, trading statistics, mutual fund information, and exchange rates through the vnstock library.332MIT
- AlicenseNot gradedqualityDmaintenanceProvides seamless access to Vietnamese stock market data, enabling real-time prices, historical data, company fundamentals, and market analysis through natural language queries.21MIT
- AlicenseNot gradedqualityFmaintenanceProvides comprehensive stock market data and technical analysis tools via the MCP protocol, enabling real-time quotes, historical data, and professional indicators like RSI and MACD for Claude Desktop and other clients.5Apache 2.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/vinhndq/vndirect-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server