BioRender MCP server for AI agents

Live

OAUTH 2.1

RESEARCH

AI

Scientific illustration templates, biological pathway diagrams, and publication-ready figures live in BioRender. Bio Render MCP gives your research agent per-user API access, credentials vaulted, scoped, never in the prompt.

  • Acts as the user: Each researcher's BioRender token is scoped to their licensed templates and assets.
  • Credentials stay vaulted: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: User permissions enforced. 90-day audit trail on every search.
BioRender MCP
agent · Acme Q3
Run
Find a T-cell activation pathway template and list matching icons for the Nature submission.
S
biorendermcp_search-templates
98ms
Research agent
Found 3 T-cell activation templates. Top match: TCR Signaling Cascade v2, plus 12 related icons for the journal figure.
Sources: BioRender template library, lab palette
biorendermcp
3
18:29
Message Claude...

Tools your research agent reaches for on BioRender, scoped per lab member.

CALL ANY TOOL
OAuth token scoped per researcher. Icon and template searches attributed to the authorizing lab member.
biorendermcp_search-icons
Search-icons
Search BioRender's scientific icon library by keyword. Returns icon names, asset types, and placeability status for use in figures.
Parameters
Name
Type
Required
Description
query
string
Required
No description.
page
number
Optional
No description.
perPage
number
Optional
No description.
biorendermcp_search-templates
Search-templates
Build your Agent
Drop the toolkit in, point it at the authorized researcher, and your agent can create and export BioRender figures from the first run.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { DynamicStructuredTool } from "@langchain/core/tools";
import { createReactAgent } from "@langchain/langgraph/prebuilt";
import { z } from "zod";

const sk = new ScalekitClient(envUrl, clientId, clientSecret);

const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["biorendermcp"], toolNames: ["biorendermcp_search-templates", "biorendermcp_search-templates", "biorendermcp_search-templates"] },
pageSize: 100,
});

const lcTools = tools.map((t) => new DynamicStructuredTool({
name: t.tool.definition.name,
description: t.tool.definition.description,
schema: z.object({}).passthrough(),
func: async (args) => {
const { data } = await sk.tools.executeTool({
toolName: t.tool.definition.name,
identifier: "user_123",
params: args,
});
return JSON.stringify(data);
},
}));

const agent = createReactAgent({ llm, tools: lcTools });
import { ScalekitClient } from "@scalekit-sdk/node";
import OpenAI from "openai";

const sk = new ScalekitClient(envUrl, clientId, clientSecret);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["biorendermcp"], toolNames: ["biorendermcp_search-templates", "biorendermcp_search-templates", "biorendermcp_search-templates"] },
pageSize: 100,
});

const llmTools = tools.map((t) => ({
type: "function",
function: {
name: t.tool.definition.name,
description: t.tool.definition.description,
parameters: t.tool.definition.input_schema,
},
}));

const resp = await openai.responses.create({
model: "gpt-4o", input: prompt, tools: llmTools,
});
import { ScalekitClient } from "@scalekit-sdk/node";
import Anthropic from "@anthropic-ai/sdk";

const sk = new ScalekitClient(envUrl, clientId, clientSecret);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["biorendermcp"], toolNames: ["biorendermcp_search-templates", "biorendermcp_search-templates", "biorendermcp_search-templates"] },
pageSize: 100,
});

const llmTools = tools.map((t) => ({
name: t.tool.definition.name,
description: t.tool.definition.description,
input_schema: t.tool.definition.input_schema,
}));

const msg = await anthropic.messages.create({
model: "claude-sonnet-4-6", max_tokens: 1024,
tools: llmTools,
messages: [{ role: "user", content: prompt }],
});
import { Agent } from "@google/adk/agents";
import {
MCPToolset, StreamableHTTPConnectionParams,
} from "@google/adk/tools/mcp";

const toolset = new MCPToolset({
connectionParams: new StreamableHTTPConnectionParams({
url: "https://mcp.scalekit.com/biorendermcp",
headers: { Authorization: `Bearer ${userScopedToken}` },
}),
});

const agent = new Agent({
name: "agent", model: "gemini-2.0-flash",
tools: await toolset.getTools(),
});
Try these prompts
Paste any prompt into your scientific illustration agent to start creating figures in BioRender.
Search & recall
Copy the prompt
Copied
List all figure templates available in my BioRender account.
Copy the prompt
Copied
Search templates matching [topic] and list their names.
Copy the prompt
Copied
Search for BioRender icons matching [keyword] for use in my pathway diagram.
Create & export
Copy the prompt
Copied
Find templates for a [biological process] pathway diagram.
Copy the prompt
Copied
Search icons for [cell type] to use in my publication figure.
Copy the prompt
Copied
Find templates similar to [template name] for [experiment condition].
SEE HOW AUTH WORKS
Researchers authorize BioRender once. Their OAuth token stays vaulted, every icon and template search is scoped to their license, and every action is logged.
1
Authorize
Your user connects
BioRender MCP
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
BioRender MCP
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
BioRender MCP
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
BioRender MCP
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
Same per-user auth pattern across other scientific and life sciences tool connectors.
GTM and RevOps Teams
Competitive intelligence briefing agent
Scans Gong calls for competitor mentions, matches each one to its Notion battlecard, and DMs every affected rep a single Slack digest per cycle. Every call runs as the PMM who owns the briefing, never a shared bot.
GTM and RevOps Teams
Outbound prospecting agent
Searches Apollo for prospects matching your ICP, scores and ranks them, drafts personalized outreach in Gmail, and logs every send to Google Sheets. Mail goes out as the rep, not from a shared inbox.
GTM and RevOps Teams
Deal intelligence agent
Pulls recent Gong calls, scores deal risk with an LLM, cross-references the record in Attio, and DMs each owner their at-risk deals in Slack. Every read is scoped to that rep's own access.
Support and Ops Teams
Support triage agent
Fetches new Zendesk tickets, classifies them by type and urgency, searches the Notion knowledge base for an answer, and routes what it cannot resolve to Slack. Every call runs on the support agent's own delegated OAuth.
Test other agents
Same per-user auth pattern across other scientific and life sciences tool connectors.
SUPPORT
Support triage agent
Classify new Zendesk tickets, search the Notion knowledge base for an answer, and route what it cannot resolve to Slack.
GTM
Competitive intelligence briefing agent
Scan Gong calls for competitor mentions, match each one to its Notion battlecard, and DM every affected rep a single Slack digest.
SALES
Outbound prospecting agent
Search Apollo for ICP matches, rank them, draft personalised Gmail outreach, and log every send to Google Sheets.
SALES
Deal intelligence agent
Score Gong call risk with an LLM, cross-reference the Attio record, and DM each owner their at-risk deals in Slack.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared token looks fine in a demo. In production every call looks like a service account. Scalekit resolves the real user credential so attribution, audit, and scope stay accurate.
// shared token
 audit → bot_service_account
 user_filter → broken

 // scalekit
 audit → user_abc
 scope → enforced ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Bio Render MCP today. Others tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent use a shared BioRender license or per-user licenses?
Per-user licenses. Each researcher's BioRender OAuth token is vaulted under their identity. Icon and template searches are attributed to that researcher's license, not a shared account.
Where is the BioRender OAuth token stored?
In Scalekit's AES-256 vault, namespaced per tenant. Keys resolve at request time and never appear in prompts, logs, or LLM completions.
Can I control what figure operations the agent performs?
Yes. Use listScopedTools to allow only template search or only icon search. Both BioRender tools are read-only searches.
What happens when a researcher revokes BioRender access?
The next tool call fails closed for that user. Other lab members remain unaffected. The revocation event is logged with timestamp for audit.
Does the agent respect BioRender institutional license limits?
Yes. Each call runs under the authorizing user's BioRender license tier. Export limits and premium template access are enforced by BioRender's own permission layer. Scalekit does not expand user entitlements.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""biorendermcp"": {
""url"": ""https://mcp.scalekit.com/biorendermcp"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.biorendermcp]
url = ""https://mcp.scalekit.com/biorendermcp""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""biorendermcp"": {
""url"": ""https://mcp.scalekit.com/biorendermcp"",
""type"": ""http""
}
}
}