LinkedIn profiles in Flowise: a LinkedIn tool through MCP or a Custom Tool
You're building an agentflow in Flowise, and its Agent node should read a LinkedIn profile from its URL: the job title, company, location and headline. Flowise's docs say "Flowise is an open source generative AI development platform for building AI Agents and LLM workflows." None of its tools reads a LinkedIn profile from its URL.
Flowise's team archived its GitHub repository on August 13, 2026. Version 3.1.4, from July 29, is its last release, and the one we tested. Their announcement says "the Apache 2.0 licensed code is yours to keep building on."
Datacircle is a data co-op. Step 1: Query your favorite B2B data APIs through us. Same request, same price, no markup. Step 2: You're DONE. Every morning, you get the flat file of your data plus everyone else's. Add $50 to your account: you get $50 of API PLUS the flat file. Right now we have 3 live LinkedIn profile APIs that we trust: Up2Data, HarvestAPI and Fetchin.
You can add our MCP server to the Agent node as a Custom MCP tool: no code. Or you can save one Custom Tool, a JavaScript function, and decide what the agent reads. Both call Up2Data first. Up2Data costs $2.375 per 1,000 profiles it finds, and nothing for a profile it can't find. Fetchin is cheaper at $1.485 per 1,000, but it charges for a profile it can't find, and all our customers share its rate limit. Both switch to Fetchin only when Up2Data hits its daily limit and returns a 429. Flowise sends each call once. But the Agent node has no cap on tool calls: the agent calls the tool as often as the model asks. To cap them, build it as a chatflow with a Tool Agent node, shown below.
We built both agentflows in Flowise 3.1.4 on Node.js 22.18.0 and ran them with a script in place of OpenAI's model and a test server in place of our API. We ran both against api.datacircle.dev with a wrong key: each got a 401, at no charge. We haven't run either with a real key or a real model.
Flowise has no tool that reads a LinkedIn profile URL
In an agentflow, a Flowise agent uses the tools in its Agent node's Tools list (Flowise's Tools & MCP page). A Custom MCP tool gives the agent an MCP server's tools, and a Custom Tool is a JavaScript function you save in Flowise. No tool reads a LinkedIn profile from its URL.
On October 12, 2026, we searched Flowise's code, its other repositories and its npm package. "linkedin" appears in none of its 64 marketplace templates, and in one tool's options: Exa Search, whose Category option "linkedin profile" narrows a web search. The Composio tool loads its list of apps from Composio, LinkedIn among them. Composio's LinkedIn tools use your LinkedIn login: they post as you and read your own profile. Their person profile tool takes a member's person ID, not a profile URL.
Before you start
- Flowise, on Node.js. We ran it on Node.js 22.18.0, though npm warned that the flowise 3.1.4 package asks for Node.js 24. Flowise's docs list 18.15.0, or 20 and above.Then open http://localhost:3000 and create the admin account Flowise asks for. In our test, npm installed 3,206 packages.
npm install -g flowise npx flowise start - A Datacircle API key: Sign up at datacircle.dev with your work email: a $5 credit, that's 2,105 LinkedIn profiles at $2.375 per 1,000. Log in at datacircle.dev/login with your work email. Your API key is on the page once you're in.
- Your key in a Flowise variable, so it stays out of the flow. In Variables, click Add Variable: Variable Name
datacircleApiKey, Type Static, Value your key. The MCP config and the Custom Tool below both read it. - A language model for the Agent. We picked OpenAI and gpt-5.4-mini in the Agent node's Model, with an OpenAI credential. We tested with a script that answers like OpenAI's API in place of a real model, and tried no other provider.
The MCP way: our MCP server as a Custom MCP tool
Our MCP server is at https://. It gets a LinkedIn profile from its URL, through Up2Data, HarvestAPI or Fetchin. Per Flowise's Tools & MCP page, add a Custom MCP tool to the Agent node and give it the server's URL and headers. Create an agentflow, connect a Start node to an Agent node, and set:
| Node | Setting | Value |
|---|---|---|
| Start | Input Type | Chat Input |
| Agent | Model | OpenAI, with your credential and a model such as gpt-5.4-mini |
| Agent | Messages | a System message with the line below |
| Agent | Tools | Custom MCP, its MCP Server Config below |
| Custom MCP | Available Actions | GET_LINKEDIN_PROFILE only, after you refresh the list |
The MCP Server Config, where {{$vars. is the variable with your API key:
{
"url": "https://api.datacircle.dev/mcp",
"headers": {
"Authorization": "Bearer {{$vars.datacircleApiKey}}"
}
}The System message:
If get_linkedin_profile says up2data's daily limit is reached, call it again with provider fetchin.Save the agentflow, open its chat and ask:
Read the LinkedIn profile at https://www.linkedin.com/in/example-profile: the job title, company, location and headline.Flowise gives the model our whole answer, as JSON text
The model got our tool's name, its whole description and its two inputs, url and provider, but not its output schema or our server's instructions. Flowise cuts a tool's description at 1,024 characters by default, and ours is 804. The first request to the model was 1,879 bytes with only get_ picked, and 3,993 with all our tools.
Our server sends each answer as text and as structuredContent. Flowise gives the model the text, inside MCP's content list, as JSON: the provider's JSON, plus datacircle_meta, what the call cost and your balance after it.
[{"type":"text","text":"{\"data\": {…}, \"meta\": {…}, \"datacircle_meta\": {…}}"}]Up2Data's example answer reached the model as 1,390 characters. A saved Fetchin answer of 65,229 characters reached it whole, 68,885 with the list around it.
Flowise doesn't retry a call, and the model reads our errors
The tool takes url, and provider: up2data (the default), harvestapi or fetchin. At Up2Data's limit, the server tells your agent to call again through Fetchin or HarvestAPI. HarvestAPI costs more per 1,000 profiles than the other two, so we name Fetchin in the System message.
Flowise passes our errors to the model like any answer, and sends each call once. At Up2Data's limit, the model reads:
[{"type":"text","text":"{\"error\": \"daily up2data limit reached for your account …\"}"}]Our 429 was free, and our scripted model called again with fetchin and got the profile. Every other error reached our server once too, and the model read our JSON. If Fetchin can't find the profile, we bill one lookup. Our MCP server docs list every tool.
With a wrong key, the flow stops before any model call
With a wrong key in datacircleApiKey, Custom MCP's Available Actions showed No Available Actions, with "No available actions, please check your API key and refresh". On api.datacircle.dev, Flowise tried MCP's Streamable HTTP and then its older SSE transport, got a 401 from each, and answered HTTP 500:
Error: predictionsServices.buildChatflow - Error in Agent node: Invalid MCP Server Config:
Error: SSE error: Non-200 status code (401)Set the right key in datacircleApiKey.
Flowise waits 60 seconds for an MCP tool
Flowise's MCP client waits up to 60 seconds for a tool call, above the 45 seconds our API waits for a provider. Our stand-in server answered after 50 seconds, and the model got the profile. We then delayed its answer to 65 seconds, and Flowise stopped the run at 60 seconds with HTTP 500 and:
Error in Agent node: MCP error -32001: Request timed outOn api.datacircle.dev, we answer 503, at no charge, when a provider hasn't answered within 45 seconds, before Flowise stops waiting.
The Custom Tool way: one JavaScript function that calls our API
You send the provider's own request to api.datacircle.dev, with your Datacircle key. That's the only change. The function sends Up2Data's and Fetchin's own requests, with X-Data-Provider naming the provider. Up2Data's request is in our API reference. In Tools, click Create and fill in:
| Field | Value |
|---|---|
| Tool Name | get_ |
| Tool description | the text below |
| Input Schema | one property, in the table below |
| Javascript Function | the code below |
Get the current job title, company, location and headline on a LinkedIn profile, from the profile's URL, like https://www.linkedin.com/in/example-profile. Returns the keys job_title, company, location and headline, or one key, error, when the profile can't be read. Each call asks the provider live and may be billed to the Datacircle balance.| Property | Type | Description | Required |
|---|---|---|---|
url | string | The LinkedIn profile URL | on |
const fetch = require("node-fetch");
const api = $vars.datacircleApiUrl || "https://api.datacircle.dev";
// One call to Datacircle's API through one provider. Fetchin's 429 is its rate limit: wait a second and send it again.
async function send(provider, path, request) {
let answer;
for (const wait of [0, 1, 2]) {
await new Promise((resolve) => setTimeout(resolve, wait * 1000));
answer = await fetch(api + path, {
...request,
headers: { "Authorization": "Token " + $vars.datacircleApiKey, "X-Data-Provider": provider, "Content-Type": "application/json" },
timeout: 60000,
});
if (provider !== "fetchin" || answer.status !== 429) return answer;
}
return answer;
}
let answer = await send("up2data", "/v1/profiles/enrich", { method: "POST", body: JSON.stringify({ url: $url }) });
if (answer.status === 200) {
const profile = (await answer.json()).data;
const company = profile.current_company || {};
return JSON.stringify({ job_title: company.title, company: company.name, location: (profile.location || {}).raw, headline: profile.headline });
}
if (answer.status === 429) { // Up2Data's daily limit: Fetchin answers instead
answer = await send("fetchin", "/api/v1/profile?profileUrlOrUrn=" + encodeURIComponent($url), { method: "GET" });
if (answer.status === 200) {
const profile = await answer.json();
return JSON.stringify({ job_title: profile.jobTitle, company: profile.companyName, location: profile.location, headline: profile.title });
}
}
if (answer.status === 404 || answer.status === 422) return JSON.stringify({ error: "This LinkedIn profile is private or deleted." });
if (answer.status === 400) return JSON.stringify({ error: "This is not a LinkedIn profile URL. Send one like https://www.linkedin.com/in/example-profile" });
if (answer.status === 402) return JSON.stringify({ error: "The Datacircle balance is too low for this call. Tell the user to add funds on their Datacircle dashboard." });
if ([429, 500, 502, 503, 504].includes(answer.status)) return JSON.stringify({ error: "The provider didn't answer (" + answer.status + "), and the call wasn't charged. Try again in a minute." });
throw new Error("Datacircle answered " + answer.status + ": " + (await answer.text())); // 401: the datacircleApiKey variable is wrong
Save it. Then build the same agentflow as above, with no System message, and in the Agent node's Tools pick Custom Tool and, in its Select Tool, get_.
The model gets the tool's name, its description, which names the answer's keys, and url with its description. The function reads the URL as $url and your key as $vars., as Flowise's Custom Tool page shows.
It sends the URL to Up2Data. At Up2Data's daily limit (its 429), it sends the same URL to Fetchin. Fetchin takes 5 requests a second across all our customers, and returns a 429 past that: the function waits one second and sends it again, then waits two seconds and sends it once more.
The function returns JSON text, and Flowise gives it to the model unchanged:
{"job_title": …, "company": …, "location": …, "headline": …}For a private or deleted profile, a URL that isn't a profile, a low balance or a provider error, it returns one key, error, so the agent can tell the user and go on. In our tests, Flowise sent each of these calls to our API once. Each field comes from the same JSON path as in our Python post:
| Field | Up2Data's answer | Fetchin's answer |
|---|---|---|
job_ | data. | jobTitle |
company | data. | companyName |
location | data. | location |
headline | data. | title |
With a wrong key (401), the function throws, and Flowise stops the agentflow. We tried a wrong key on api.datacircle.dev: after one model call, Flowise answered HTTP 500 with:
Error: predictionsServices.buildChatflow - Error in Agent node: NodeVM Execution Error:
Error: Datacircle answered 401: {"error": "invalid api key"}Set the right key in datacircleApiKey. The function waits up to 60 seconds for our answer: our stand-in server answered after 50 seconds, and the model got the profile. We then delayed its answer to 65 seconds, and Flowise stopped the run at 60 seconds with a network timeout.
A second variable, datacircleApiUrl, is for tests: when it exists, the function calls that address in place of api.datacircle.dev, so you can run the flow against a stand-in for our API without spending your balance. Flowise blocks calls to 127.0.0.1 and private addresses unless you start it with HTTP_SECURITY_CHECK=false.
The Agent node has no cap on tool calls
Flowise sends each tool call to our API. We bill each call that gets a profile, and each call for a profile Fetchin or HarvestAPI can't find, at the price on our pricing page. The function sends up to four requests per call, and we bill at most one of them: Up2Data's 429 and Fetchin's 429 are free.
The agentflow's Agent node calls a tool each time the model asks, with no limit. A scripted model that asked for the tool at every turn made more than 1,000 calls to a stand-in for our API in 15 seconds, through either tool, until we stopped the script. At each turn, Flowise sends the model every tool result so far: through Custom MCP, the last request was more than 2,000,000 bytes.
For a cap, build the agent as a chatflow: an OpenAI chat model node, a Buffer Memory node and the same Custom MCP or Custom Tool, all connected to a Tool Agent node:
| Node | Setting | Value |
|---|---|---|
| OpenAI | Model Name | your model, such as gpt-5.4-mini |
| Tool Agent | Tool Calling Chat Model | the OpenAI node |
| Tool Agent | Memory | the Buffer Memory node |
| Tool Agent | Tools | Custom MCP or Custom Tool, set as above |
| Tool Agent | System Message | for Custom MCP, add the line above at the end |
| Tool Agent | Max Iterations | 4, under Additional Parameters: at most 4 tool calls |
With Max Iterations empty, our scripted model made 15 calls. With 4, it made 4. At the limit, the agent answers with this line, and no profile:
Agent stopped due to max iterations.With the long Fetchin answer at each turn, the requests grew from 1,911 bytes to 78,352, 154,793 and 231,234. With a wrong key in Custom MCP, Flowise stopped the chatflow before any model call. The Custom Tool's 401 didn't stop it: the model read the error and answered.
The Agent node has a Require Human Input setting on each tool, and Flowise's Agentflow page says "Agents can also be configured to request permission before executing tools". We set it on our tool and ran the flow through Flowise's prediction API. The run stopped with the tool call and two actions, Proceed and Reject, and our server got no call. We sent Proceed back on the same chat, as the Human In The Loop tutorial's flow does, and the agent made one call and answered with the profile. With Reject, our server got no call.
Flowise keeps a Custom MCP server's tools in memory, and Require Human Input stays on them. After we ran a flow with the setting on, Flowise asked for approval in another flow with the same MCP Server Config and the setting off, until we restarted Flowise.
API answers: cost and what the tool returns
| Answer | Meaning | Cost | The tool returns |
|---|---|---|---|
| Up2Data 200 | the profile | $2.375 per 1,000 | the four fields |
| Up2Data 422 | the profile is private or deleted | free | error: "This LinkedIn profile is private or deleted." |
| Up2Data 400 | not a LinkedIn profile URL | free | error: "This is not a LinkedIn profile URL." |
| Up2Data 429 | your account, or all our customers together, hit Up2Data's daily limit | free | Fetchin's answer |
| Fetchin 200 | the profile | $1.485 per 1,000 | the four fields |
Fetchin 404 with PROFILE_ | the profile is private or deleted | $1.485 per 1,000: Fetchin bills the lookup | error: "This LinkedIn profile is private or deleted." |
| Fetchin 429 | our customers together hit Fetchin's rate limit | free | Fetchin's answer after up to two retries, or error: "Try again in a minute" |
| 402 | your balance can't cover the call | free | error: "The Datacircle balance is too low for this call." |
| 500, 502, 503 or 504 | the provider failed, or didn't answer within 45 seconds | free | error: "Try again in a minute" |
| 401 | your key is wrong | free | nothing: an agentflow stops with the error, a chatflow's model reads it |
Through Custom MCP, the model reads our JSON for every answer but the 401, error or not: a wrong key stops the flow before any model call. Up2Data takes $1 a day per account (421 profiles), with a shared daily limit for all customers, then answers 429 until 00:00 UTC. HarvestAPI has no daily limit. Fetchin has no daily limit either.
The tests we ran
- We tested on October 12, 2026, with
flowise3.1.4 (flowise-components3.1.4) on Node.js 22.18.0, the TypeScript MCP SDK 1.29.0,@langchain/1.2.5 andopenai node-fetch2.7.0. - We ran Flowise without a browser and built each flow through its REST API: the Custom Tool from the fields and code above, unchanged, and Custom MCP with the config above. We ran each flow through Flowise's prediction API, with the OpenAI node's Base Path pointed at a scripted stand-in for OpenAI's API.
- We tested the Custom Tool against a stand-in for our API that returned each answer in the table. We ran the MCP flow against a stand-in for our MCP server with the tools our live server lists, and tried each error, a 50 and a 65 second answer, the long answer, Require Human Input, and both agent nodes with a model that never stops.
- We didn't try a real Datacircle key or a real model, and didn't open Flowise's canvas or chat window: the Available Actions texts above are what Flowise's REST API sent for that list.
Cost per 1,000 profiles
We charge your balance the prices on our pricing page, with no markup:
| Up2Data | HarvestAPI | Fetchin | |
|---|---|---|---|
| Per 1,000 found | $2.375 | $3.70 | $1.485 |
| Per 1,000 not found | free | $2.30 | $1.485 |
| Daily limit | 421 profiles per account | none | none |
Say your agent looks up 1,000 profiles in a day, one call each, and the providers find every one. You pay us at most $1.86: $1.00 for 421 through Up2Data and $0.86 for the other 579 through Fetchin. Through Fetchin alone, the same 1,000 would cost less: $1.485. Both tools call Up2Data first because it bills nothing for a profile it can't find, and all our customers share Fetchin's rate limit. Your agent may call the tool more than once per question. Your model's provider bills you for its tokens.
The same agent in Langflow's visual editor: LinkedIn profiles in Langflow. In Dify: LinkedIn profiles in Dify. The same call as an n8n workflow, without an agent: LinkedIn profiles in n8n. In code, as a tool for an agent: LinkedIn profiles in LangChain and other frameworks on our blog. The same call from a script: get LinkedIn profile data with Node.js. In Claude, ChatGPT or Cursor: our LinkedIn MCP server. Other vendors' prices per 1,000: LinkedIn profile API pricing compared.
Questions
Does Flowise have a LinkedIn tool?
Not one that reads a profile from its URL. Its Exa Search tool can narrow a web search to LinkedIn profiles, and its Composio tool can load Composio's LinkedIn tools, which use your LinkedIn login and take a member's person ID, not a URL. To read a profile from its URL, add our MCP server at https://
How do I send an API key to a remote MCP server in Flowise?
In Custom MCP's MCP Server Config, add a headers object with "Authorization": "Bearer <your key>". To keep the key out of the flow, save it in Variables and write {{$vars.<the variable's name>}} in its place, as Flowise's docs show.
Does Flowise's Agent node have a max iterations setting?
Not in Flowise 3.1.4's agentflow Agent node: it calls tools as long as the model asks. The Tool Agent node, in a chatflow, has Max Iterations, 15 when you leave it empty. At the limit, the agent answers "Agent stopped due to max iterations."
Why does my Flowise agent still ask for approval after I turned Require Human Input off?
Flowise keeps a Custom MCP server's tools in memory, and Require Human Input stays on them. In our test, after we ran a flow with Require Human Input on, Flowise asked for approval in another flow with the same MCP Server Config, until we restarted Flowise.
Is Flowise still maintained?
No. Its team froze the code on July 29, 2026, the day it shipped version 3.1.4, archived the GitHub repository on August 13, 2026, and left Flowise's Discord and GitHub on August 31, 2026. The code stays on GitHub under the Apache 2.0 license.
How much does a LinkedIn profile cost?
$2.375 per 1,000 through Up2Data (a profile it can't find is free), $3.70 per 1,000 through HarvestAPI. $1.485 per 1,000 through Fetchin, a profile it can't find billed the same. HarvestAPI bills a profile it can't find at $2.30 per 1,000.
Is there a daily limit?
Up2Data takes $1 a day per account (421 profiles), with a shared daily limit for all customers, then answers 429 until 00:00 UTC. HarvestAPI has no daily limit. Fetchin has no daily limit either.
Is each request live, or cached?
Live. Each request goes to the provider and gets the profile as it is today.
Do I need a LinkedIn account?
No. You send the profile's URL with your Datacircle key: no LinkedIn login, no cookies, no browser.
What happens when my balance runs out?
A call your balance can't cover answers 402. Add funds, from $5, on your dashboard.
Get started
Sign up at datacircle.dev with your work email: a $5 credit, that's 2,105 LinkedIn profiles at $2.375 per 1,000.
Sign up