n8n-nodes-stocklake community node — typed dropdowns and a credential test button, not raw MCP JSONn8n-nodes-stocklake is a community node published on npm that turns Stocklake's market-data API into regular n8n building blocks: a Resource dropdown (Stock, Screener, Market, Signals, Earnings, News, Watchlist), an Operation dropdown per resource, autocomplete-friendly symbol fields, and a credential type with a working Test button. Because the node is marked usableAsTool, n8n also generates a second version of it automatically — Stocklake Tool — that an AI Agent node can call with parameters the model fills in itself.
One thing worth being upfront about, since it explains the "self-hosted only" framing of everything below: this is a community node, not a verified one. n8n's own review team looked at it and made a fair point — every operation the node exposes round-trips through the same public MCP server that n8n's built-in MCP Client node can already call directly, so from their side it doesn't add a capability their own node doesn't already reach. They're building a dedicated registry for MCP-shaped integrations like this one rather than accepting them into the general community-node catalog. Until that exists, the node installs and runs perfectly well on self-hosted n8n via npm — it just isn't (yet) something n8n Cloud will let you install, since Cloud restricts community installs to the verified catalog. Nothing below is locked behind the node either way: the built-in MCP Client and MCP Client Tool nodes reach the exact same data, pointed at the same endpoint, with zero installation.
usableAsTool node — same operations, but callable by an AI Agent via $fromAI() instead of manually-set parameters.This works on self-hosted n8n only — Cloud restricts community-node installs to n8n's verified catalog, and this one isn't in it (see the FAQ below for why). If you're on Cloud, skip ahead to No install? Use the built-in MCP Client.
n8n-nodes-stocklakeN8N_COMMUNITY_PACKAGES_ENABLED=true (community nodes at all) and N8N_UNVERIFIED_PACKAGES_ENABLED=true (unverified ones specifically, which n8n-nodes-stocklake currently is). If Install a community node doesn't appear as an option at all, one of those two is set to false in your instance's environment.Package: npmjs.com/package/n8n-nodes-stocklake
Everything in the three workflows below still works with zero installation, on Cloud or self-hosted: point n8n's built-in MCP Client node (or MCP Client Tool, for the agent workflow) at https://api.stocklake.dev/mcp, authentication set to None for the guest tier or a Bearer token for a Free/Pro key. You lose the typed dropdowns and the credential test button; you don't lose any data or any tool — it's the same MCP server either way.
The node ships two credential types. Neither is required — every operation works unauthenticated, as a guest, on n8n's own request.
| Credential | What it needs | Notes |
|---|---|---|
| Stocklake API | An API key (optional) | Leave it blank to call as a guest (25/day). Paste a Free or Pro key to raise the limit and unlock Pro-only fields. Has a Test button that calls get_stock(AAPL) and reports back which tier resolved. |
| Stocklake OAuth2 API | Nothing to paste | Connect my account opens Stocklake's real login/consent screen. Uses Dynamic Client Registration — n8n registers itself with Stocklake automatically on first connect, since every self-hosted instance has a different callback URL and there's no single client ID to hardcode. |
| n8n-nodes-stocklake | Built-in MCP Client | |
|---|---|---|
| Choosing an operation | Typed Resource + Operation dropdowns | A tool name picked from a list, plus a raw JSON arguments field |
| Credential | Dedicated credential type with a Test button | Manual header/auth config per node |
| Agent-ready variant | Automatic (Stocklake Tool) | A separate MCP Client Tool node, same raw JSON args |
| Works on | Self-hosted only, today | Anywhere — Cloud and self-hosted |
Ctrl+V. No import dialog needed. Credentials are deliberately left unset in the JSON: n8n auto-selects a matching credential on paste only when exactly one of that type exists. If you have both a Stocklake API and a Stocklake OAuth2 API credential saved, open each node afterward and pick the one you want.One execution, three independent Stocklake nodes running in parallel off the same trigger
The simplest shape: a Manual Trigger fanning out into three Stocklake nodes with no dependency between them — Stock → Get for one symbol, Screener → Screen with the oversold preset, and Market → Get Pulse. Every operation here works on the free tier, including with no credential attached at all (guest, 25 calls/day). This is the workflow to paste in first just to confirm the node installed correctly and your credential (if you set one) resolves to the tier you expect.
{
"name": "Stocklake — Common Actions",
"nodes": [
{
"parameters": {},
"id": "a1000000-0000-4000-8000-000000000001",
"name": "When clicking 'Execute workflow'",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
-40,
300
]
},
{
"parameters": {
"resource": "stock",
"operation": "get",
"symbol": {
"__rl": true,
"value": "AAPL",
"mode": "id"
}
},
"id": "a1000000-0000-4000-8000-000000000002",
"name": "Get Stock — AAPL",
"type": "n8n-nodes-stocklake.stocklake",
"typeVersion": 1,
"position": [
220,
100
]
},
{
"parameters": {
"resource": "screener",
"operation": "screen",
"preset": "oversold",
"limit": 10,
"additionalFields": {
"sortBy": "rsi",
"sortDir": "asc"
}
},
"id": "a1000000-0000-4000-8000-000000000003",
"name": "Screener — Oversold",
"type": "n8n-nodes-stocklake.stocklake",
"typeVersion": 1,
"position": [
220,
300
]
},
{
"parameters": {
"resource": "market",
"operation": "getPulse"
},
"id": "a1000000-0000-4000-8000-000000000004",
"name": "Market Pulse",
"type": "n8n-nodes-stocklake.stocklake",
"typeVersion": 1,
"position": [
220,
500
]
}
],
"connections": {
"When clicking 'Execute workflow'": {
"main": [
[
{
"node": "Get Stock — AAPL",
"type": "main",
"index": 0
},
{
"node": "Screener — Oversold",
"type": "main",
"index": 0
},
{
"node": "Market Pulse",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
},
"pinData": {}
}
The auto-generated Stocklake Tool node, wired to an AI Agent’s tool list
This is the Stocklake Tool variant — the node's automatically-generated second form, attached to an AI Agent node's tool input instead of running as a linear step. The symbol field is set to {{ $fromAI('symbol', 'The stock ticker symbol, e.g. NVDA', 'string') }}, so the model extracts the ticker from whatever the user actually asked ("what's the RSI on NVDA?") rather than it being hardcoded. The Agent's system message explicitly tells it to always call the tool for real numbers rather than answer from memory — worth keeping in any agent you attach this to, since an LLM asked for a stock price without a tool will happily make one up.
You'll need a chat model attached to the Agent (the example workflow points at an OpenAI-compatible endpoint — set the model name and base URL to whatever you run). Any tool-calling model works; the node is only useful to an agent that can actually invoke it.
{
"name": "Stocklake — AI Agent",
"nodes": [
{
"parameters": {
"options": {}
},
"id": "b2000000-0000-4000-8000-000000000001",
"name": "When chat message received",
"type": "@n8n/n8n-nodes-langchain.chatTrigger",
"typeVersion": 1.1,
"position": [
-40,
300
],
"webhookId": "b2000000-0000-4000-8000-0000000000ff"
},
{
"parameters": {
"options": {
"systemMessage": "You are a market research assistant with live access to Stocklake.\n\nAlways call the Stocklake tool to get real numbers before answering — never answer a price, RSI or indicator question from memory. Quote the figures you get back and say what they imply. Keep answers to a few sentences."
}
},
"id": "b2000000-0000-4000-8000-000000000002",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 1.7,
"position": [
220,
300
]
},
{
"parameters": {
"model": "mistral-small-4-openrouter-1",
"options": {
"temperature": 0.2
}
},
"id": "b2000000-0000-4000-8000-000000000003",
"name": "Chat Model (LiteLLM)",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.1,
"position": [
140,
520
]
},
{
"parameters": {
"descriptionType": "manual",
"toolDescription": "Live stock market data from Stocklake. Use for a single stock's price, fundamentals and technical indicators (RSI, MACD, Bollinger, moving averages). Pass the ticker symbol, e.g. NVDA or AAPL.",
"resource": "stock",
"operation": "get",
"symbol": {
"__rl": true,
"value": "={{ $fromAI('symbol', 'The stock ticker symbol, e.g. NVDA', 'string') }}",
"mode": "id"
}
},
"id": "b2000000-0000-4000-8000-000000000004",
"name": "Stocklake",
"type": "n8n-nodes-stocklake.stocklakeTool",
"typeVersion": 1,
"position": [
360,
520
]
}
],
"connections": {
"When chat message received": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Chat Model (LiteLLM)": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Stocklake": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
},
"pinData": {}
}
A scheduled screen that hands off into per-stock AI research — add your own delivery step (email, Slack, a sheet) after the last node
A weekday screen for a real signal, not a demo toy: Market → Get Assessment for regime context, then Screener → Screen for stocks under RSI 30 above a $2B market cap, split into one item per result, and Stock → Get Research on each hit for an AI-synthesized summary, catalysts, and risks. Get Research is Pro-only; everything upstream of it works on free.
This workflow stops at the per-stock research call by design — add whatever delivery step fits your setup after it (a Merge node to compile results, then Slack, email, or a row appended to a sheet).
{
"name": "Stocklake — Daily Oversold Briefing",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 15 * * 1-5"
}
]
}
},
"id": "c3000000-0000-4000-8000-000000000001",
"name": "Weekdays 15:00",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
-40,
300
]
},
{
"parameters": {
"resource": "market",
"operation": "getAssessment",
"historyCount": 0
},
"id": "c3000000-0000-4000-8000-000000000002",
"name": "Market Assessment",
"type": "n8n-nodes-stocklake.stocklake",
"typeVersion": 1,
"position": [
200,
300
]
},
{
"parameters": {
"resource": "screener",
"operation": "screen",
"preset": "",
"limit": 5,
"additionalFields": {
"maxRsi": 30,
"minMarketCapB": 2,
"sortBy": "rsi",
"sortDir": "asc"
}
},
"id": "c3000000-0000-4000-8000-000000000003",
"name": "Oversold, >$2B",
"type": "n8n-nodes-stocklake.stocklake",
"typeVersion": 1,
"position": [
420,
300
]
},
{
"parameters": {
"fieldToSplitOut": "results",
"options": {}
},
"id": "c3000000-0000-4000-8000-000000000004",
"name": "One Item Per Stock",
"type": "n8n-nodes-base.splitOut",
"typeVersion": 1,
"position": [
640,
300
]
},
{
"parameters": {
"resource": "stock",
"operation": "getResearch",
"symbol": {
"__rl": true,
"value": "={{ $json.symbol }}",
"mode": "id"
}
},
"id": "c3000000-0000-4000-8000-000000000005",
"name": "AI Research (Pro)",
"type": "n8n-nodes-stocklake.stocklake",
"typeVersion": 1,
"position": [
860,
300
]
}
],
"connections": {
"Weekdays 15:00": {
"main": [
[
{
"node": "Market Assessment",
"type": "main",
"index": 0
}
]
]
},
"Market Assessment": {
"main": [
[
{
"node": "Oversold, >$2B",
"type": "main",
"index": 0
}
]
]
},
"Oversold, >$2B": {
"main": [
[
{
"node": "One Item Per Stock",
"type": "main",
"index": 0
}
]
]
},
"One Item Per Stock": {
"main": [
[
{
"node": "AI Research (Pro)",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
},
"pinData": {}
}
| Setup time | Needs | Best for | |
|---|---|---|---|
| 1. Run several lookups | ~5 minutes | Nothing — guest tier works | Confirming the node installed and your credential resolves correctly |
| 2. Agent tool | ~10 minutes | An AI Agent node with a chat model attached | Adding real market data to a bot you already run |
| 3. Screener → research | ~15 minutes | A Pro key, and a delivery step of your choosing | A standing daily watchlist you actually read |
One shared limitation across all three, worth knowing before you rely on any of them: on the guest tier, rate limiting is by IP address, not by identity — fine for a single self-hosted instance calling once a day, less fine if your n8n runs behind a shared or rotating IP alongside other guest traffic. If a scheduled run ever comes back empty with no error, check for a 429 in the node's output before assuming Stocklake genuinely found nothing.
Not yet. n8n-nodes-stocklake is a community node, installable today on any self-hosted n8n instance via npm. It hasn't gone through n8n's verified-node review — their reviewers pointed out, correctly, that every operation in the node round-trips through the same public MCP server n8n's own built-in MCP Client node can already call directly, and they're building a dedicated registry for that class of integration rather than accepting it into the general community-node catalog. Nothing here is locked behind the community node either way — the built-in MCP Client and MCP Client Tool nodes reach the identical data and tools with zero installation, on Cloud or self-hosted.
Not the community node — Cloud only allows nodes that have passed n8n's verified review, and this one hasn't yet. On Cloud, point the built-in MCP Client node at https://api.stocklake.dev/mcp instead; every operation the community node exposes is reachable that way too, just addressed by tool name and raw JSON arguments instead of typed dropdowns.
No. Leave the node's credential unset and it calls Stocklake as a guest — 25 calls a day, rate-limited by IP. A free API key raises that to 200 calls/day with a stable identity instead of an IP limit. A Pro key (5,000/day) unlocks AI research, insider activity, and the live signals feed, and adds a second credential type — OAuth2 — that connects with one click via Dynamic Client Registration, with no client ID or secret to paste in.
n8n auto-generates a Tool variant for any node marked usableAsTool — n8n-nodes-stocklake.stocklakeTool here. Same operations, same credential, but its parameters can be filled by an AI Agent at runtime via $fromAI() instead of being set by hand, so it plugs straight into an Agent node's tool list. This comes for free once the node is installed; no separate MCP Client Tool node needed.
Yes — use code N8N-20OFF at checkout for 20% off Stocklake Pro, applied for 24 months. It unlocks the AI verdict/score fields, insider activity, and the live signals feed used in workflow 3 above, on top of a higher daily rate limit than free or guest.
{
"name": "Stocklake — Common Actions",
"nodes": [
{
"parameters": {},
"id": "a1000000-0000-4000-8000-000000000001",
"name": "When clicking 'Execute workflow'",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
-40,
300
]
},
{
"parameters": {
"resource": "stock",
"operation": "get",
"symbol": {
"__rl": true,
"value": "AAPL",
"mode": "id"
}
},
"id": "a1000000-0000-4000-8000-000000000002",
"name": "Get Stock — AAPL",
"type": "n8n-nodes-stocklake.stocklake",
"typeVersion": 1,
"position": [
220,
100
]
},
{
"parameters": {
"resource": "screener",
"operation": "screen",
"preset": "oversold",
"limit": 10,
"additionalFields": {
"sortBy": "rsi",
"sortDir": "asc"
}
},
"id": "a1000000-0000-4000-8000-000000000003",
"name": "Screener — Oversold",
"type": "n8n-nodes-stocklake.stocklake",
"typeVersion": 1,
"position": [
220,
300
]
},
{
"parameters": {
"resource": "market",
"operation": "getPulse"
},
"id": "a1000000-0000-4000-8000-000000000004",
"name": "Market Pulse",
"type": "n8n-nodes-stocklake.stocklake",
"typeVersion": 1,
"position": [
220,
500
]
}
],
"connections": {
"When clicking 'Execute workflow'": {
"main": [
[
{
"node": "Get Stock — AAPL",
"type": "main",
"index": 0
},
{
"node": "Screener — Oversold",
"type": "main",
"index": 0
},
{
"node": "Market Pulse",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
},
"pinData": {}
}
{
"name": "Stocklake — AI Agent",
"nodes": [
{
"parameters": {
"options": {}
},
"id": "b2000000-0000-4000-8000-000000000001",
"name": "When chat message received",
"type": "@n8n/n8n-nodes-langchain.chatTrigger",
"typeVersion": 1.1,
"position": [
-40,
300
],
"webhookId": "b2000000-0000-4000-8000-0000000000ff"
},
{
"parameters": {
"options": {
"systemMessage": "You are a market research assistant with live access to Stocklake.\n\nAlways call the Stocklake tool to get real numbers before answering — never answer a price, RSI or indicator question from memory. Quote the figures you get back and say what they imply. Keep answers to a few sentences."
}
},
"id": "b2000000-0000-4000-8000-000000000002",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 1.7,
"position": [
220,
300
]
},
{
"parameters": {
"model": "mistral-small-4-openrouter-1",
"options": {
"temperature": 0.2
}
},
"id": "b2000000-0000-4000-8000-000000000003",
"name": "Chat Model (LiteLLM)",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.1,
"position": [
140,
520
]
},
{
"parameters": {
"descriptionType": "manual",
"toolDescription": "Live stock market data from Stocklake. Use for a single stock's price, fundamentals and technical indicators (RSI, MACD, Bollinger, moving averages). Pass the ticker symbol, e.g. NVDA or AAPL.",
"resource": "stock",
"operation": "get",
"symbol": {
"__rl": true,
"value": "={{ $fromAI('symbol', 'The stock ticker symbol, e.g. NVDA', 'string') }}",
"mode": "id"
}
},
"id": "b2000000-0000-4000-8000-000000000004",
"name": "Stocklake",
"type": "n8n-nodes-stocklake.stocklakeTool",
"typeVersion": 1,
"position": [
360,
520
]
}
],
"connections": {
"When chat message received": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Chat Model (LiteLLM)": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Stocklake": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
},
"pinData": {}
}
{
"name": "Stocklake — Daily Oversold Briefing",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 15 * * 1-5"
}
]
}
},
"id": "c3000000-0000-4000-8000-000000000001",
"name": "Weekdays 15:00",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
-40,
300
]
},
{
"parameters": {
"resource": "market",
"operation": "getAssessment",
"historyCount": 0
},
"id": "c3000000-0000-4000-8000-000000000002",
"name": "Market Assessment",
"type": "n8n-nodes-stocklake.stocklake",
"typeVersion": 1,
"position": [
200,
300
]
},
{
"parameters": {
"resource": "screener",
"operation": "screen",
"preset": "",
"limit": 5,
"additionalFields": {
"maxRsi": 30,
"minMarketCapB": 2,
"sortBy": "rsi",
"sortDir": "asc"
}
},
"id": "c3000000-0000-4000-8000-000000000003",
"name": "Oversold, >$2B",
"type": "n8n-nodes-stocklake.stocklake",
"typeVersion": 1,
"position": [
420,
300
]
},
{
"parameters": {
"fieldToSplitOut": "results",
"options": {}
},
"id": "c3000000-0000-4000-8000-000000000004",
"name": "One Item Per Stock",
"type": "n8n-nodes-base.splitOut",
"typeVersion": 1,
"position": [
640,
300
]
},
{
"parameters": {
"resource": "stock",
"operation": "getResearch",
"symbol": {
"__rl": true,
"value": "={{ $json.symbol }}",
"mode": "id"
}
},
"id": "c3000000-0000-4000-8000-000000000005",
"name": "AI Research (Pro)",
"type": "n8n-nodes-stocklake.stocklake",
"typeVersion": 1,
"position": [
860,
300
]
}
],
"connections": {
"Weekdays 15:00": {
"main": [
[
{
"node": "Market Assessment",
"type": "main",
"index": 0
}
]
]
},
"Market Assessment": {
"main": [
[
{
"node": "Oversold, >$2B",
"type": "main",
"index": 0
}
]
]
},
"Oversold, >$2B": {
"main": [
[
{
"node": "One Item Per Stock",
"type": "main",
"index": 0
}
]
]
},
"One Item Per Stock": {
"main": [
[
{
"node": "AI Research (Pro)",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
},
"pinData": {}
}
Node types, versions, and field names above are copied directly from real exported n8n workflows against n8n-nodes-stocklake@0.1.1 at the time of writing, not guessed. If a newer version has renamed a field, the node panel itself is the source of truth; reconfigure that one field and the rest of the import still holds.