OpenAlex MCP server for AI agents

Live

BEARER TOKEN

SCHOLARLY RESEARCH

Search

OpenAlex gives your agent scholarly research across the OpenAlex catalog: search works by text or meaning, follow citations and references, and look up authors, institutions, sources, funders, and topics.

  • Per-user credentials: each call uses the actual user's access token, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
OpenAlex
agent · Acme Q3
Run
Find 2024 papers on retrieval-augmented generation.
S
openalex_search_works
117ms
Research agent
I found 1,240 works from 2024. The top match is an open access survey with 312 citations.
Sources: OpenAlex works, 1,240 matches
openalex
1,240 works
18:29
Message Claude...

Tools your research agent reaches for on OpenAlex, scoped per user.

CALL ANY TOOL
31 tools for scholarly research in OpenAlex: search, list, and fetch works, follow citing works and references, look up authors, institutions, sources, publishers, funders, topics, and keywords, and group or sample results.
openalex_autocomplete
Autocomplete
Suggest OpenAlex entities of one type whose names match a partial string, for type-ahead look-ups. Returns up to 10 matches with id, display_name, hint (authors for a work, institution for an author, host for a source, location for an institution), external_id (DOI, ORCID, ROR, ISSN), entity_type, works_count and cited_by_count. Use openalex_autocomplete to turn a name or partial title into an ID quickly, or to match an ID such as an ORCID or DOI. Use the openalex_search_* tools for full ranked results with paging.
Parameters
Name
Type
Required
Description
entity_type
string
Required
Which entity type to suggest: works, authors, sources, institutions, topics, publishers, funders or keywords. Example: institutions. One of: `works`, `authors`, `sources`, `institutions`, `topics`, `publishers`, `funders`, `keywords`.
q
string
Required
The partial name, title or ID to complete. External IDs such as an ORCID URL, DOI or OpenAlex ID are matched directly. Example: flori.
filter
string
Optional
Optional OpenAlex filter string applied before suggesting. Join attribute:value pairs with commas (AND). Use | between values for OR within one attribute (up to 100 values), ! before a value to negate it, > or < for numbers, and a dash for ranges (publication_year:2020-2024). Filter by OpenAlex IDs, not names: resolve a name to an ID with openalex_autocomplete or a search tool first. Example: country_code:us.
search
string
Optional
Optional full-text search applied before suggesting, to narrow the candidates. Example: medical.
openalex_get_author
Get author
openalex_get_funder
Get funder
openalex_get_institution
Get institution
openalex_get_keyword
Get keyword
openalex_get_publisher
Get publisher
openalex_get_rate_limit
Get rate limit
openalex_get_source
Get source
openalex_get_topic
Get topic
openalex_get_work
Get work
openalex_group_entities
Group entities
openalex_list_authors
List authors
openalex_list_citing_works
List citing works
openalex_list_funders
List funders
openalex_list_institutions
List institutions
openalex_list_keywords
List keywords
openalex_list_publishers
List publishers
openalex_list_sources
List sources
openalex_list_topics
List topics
openalex_list_work_references
List work references
openalex_sample_entities
Sample entities
openalex_search_authors
Search authors
openalex_search_funders
Search funders
openalex_search_institutions
Search institutions
openalex_search_keywords
Search keywords
openalex_search_publishers
Search publishers
openalex_search_sources
Search sources
openalex_search_topics
Search topics
openalex_search_works
Search works
openalex_semantic_search_works
Semantic search works

For more tools, view docs.

Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// OpenAlex tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["openalex"], toolNames: [
    "openalex_search_works",
    "openalex_get_author",
    "openalex_list_citing_works"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Find 2024 papers on retrieval-augmented generation and list the works that cite the top result" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["openalex"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Find 2024 papers on retrieval-augmented generation and list the works that cite the top result" }],
  tools,
});

// Execute the tool call with the user's vaulted OpenAlex access token
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["openalex"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Find 2024 papers on retrieval-augmented generation and list the works that cite the top result" }],
  tools,
});

// Tool call runs with the user's vaulted OpenAlex access token
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["openalex"] }, pageSize: 100,
});

const agent = new Agent({
  name: "research_agent",
  model: "gemini-2.5-pro",
  instruction: "OpenAlex tools scoped to this user",
  tools,
});

await agent.run("Find 2024 papers on retrieval-augmented generation and list the works that cite the top result");
Try these prompts
Copy any prompt into your agent. Each maps directly to a OpenAlex tool. Click to copy, paste into your agent, done.
Works and citations
Copy the prompt
Copied
Search for papers on protein folding published since 2023.
Copy the prompt
Copied
List the works that cite this paper.
Copy the prompt
Copied
Find papers closest in meaning to this abstract.
Authors and institutions
Copy the prompt
Copied
Look up this author's h-index and last known institution.
Copy the prompt
Copied
Search for institutions named Max Planck.
Copy the prompt
Copied
List the most cited authors at this university.
Trends and sources
Copy the prompt
Copied
Count works on CRISPR grouped by publication year.
Copy the prompt
Copied
Search for open access journals in machine learning.
Copy the prompt
Copied
How much of today's OpenAlex budget is left?
SEE HOW AUTH WORKS
Each user connects their own OpenAlex access token once, and Scalekit sends it with every call. Tokens stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
OpenAlex
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
OpenAlex
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
OpenAlex
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
OpenAlex
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
See the same per-user auth pattern across other search and analytics 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.
Test other agents
See the same per-user auth pattern across other search and analytics connectors.
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.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared OpenAlex access token looks fine in a demo. In production every query looks like one service account, and you cannot tell which user triggered it. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared token
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
OpenAlex today. Ten connectors 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 access OpenAlex as the user or through a shared token?
As the user. Each user connects their own OpenAlex access token once, and Scalekit sends it with every call. Audit logs attribute every search and lookup to that user, not a shared service account.
Where is the OpenAlex access token stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. To rotate it, the user reconnects with a new access token. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in OpenAlex?
Yes. All 31 OpenAlex tools are read-only, so the agent can search and read catalog data but cannot change anything. Filter by tool name in listScopedTools to narrow it further, for example to openalex_search_works and openalex_get_work. Scalekit also enforces scope checks before every API call.
What happens when a user revokes OpenAlex access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.
What can the agent look up in OpenAlex?
Scholarly works such as articles, books, datasets, preprints, and dissertations, plus the authors, institutions, sources, publishers, funders, topics, and keywords linked to them. openalex_list_citing_works and openalex_list_work_references follow a work's citations in both directions, and openalex_semantic_search_works returns up to 50 works closest in meaning to a query.
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"": {
""openalex"": {
""url"": ""https://mcp.scalekit.com/openalex"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.openalex]
url = ""https://mcp.scalekit.com/openalex""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""openalex"": {
""url"": ""https://mcp.scalekit.com/openalex"",
""type"": ""http""
}
}
}