Announcing CIMD support for MCP Client registration
Learn more

Scite MCP vs Scite API for AI Agents

TL;DR

  • Scite's hosted MCP server exposes 25 tools for literature, evidence datasets, and DOI-list Collections. Reference Check, the Assistant, bulk tallies, full citation graph traversal, and journal-level metrics are REST-only.
  • MCP authenticates with OAuth 2.1, PKCE, and Dynamic Client Registration, or an mcp-scoped API key. The REST API documents only API keys and Enterprise client credentials.
  • MCP calls spend each user's monthly MCP credits. Self-service REST keys redact citation snippets, and commercial use of Search needs a separate license.
  • Scite enforces plan entitlements on tools/call, not tools/list. Neither path stores, refreshes, or revokes per-user credentials for you.
  • Scalekit's scitemcp connector vaults and refreshes each user's Scite token, scopes tools per user, logs every call by user, and serves all tenants from one Virtual MCP server.

Why Scite forces a real choice

Your agent needs to ground its answers in the scientific literature, and a citation count is not enough. It needs to know whether later papers supported a finding, contradicted it, or were retracted. Scite ships a hosted MCP server and a REST API that read from the same Smart Citation index. They are not interchangeable: different tool coverage, different credentials, different licensing, different metering. Pick wrong and you either rebuild auth mid-project or discover in production that your self-service key returns redacted snippets. Here's how to pick.

What Scite MCP and Scite API actually are

Both surfaces read the same index of papers and Smart Citations. They differ in what they expose and how an agent authenticates.

Scite MCP

Scite MCP is a hosted, stateless JSON-RPC server maintained by Scite, part of Research Solutions. It launched on February 26, 2026, is available to all Scite subscribers, and backs Scite's own ChatGPT plugin and Claude connector; Scite describes all three as ways to reach the same tools. All traffic is POST to /mcp; GET returns 405, and there are no server-initiated SSE streams. It exposes 25 tools across literature, evidence datasets, and Collections, plus four prebuilt research prompts. Interactive clients use OAuth 2.1 with PKCE and Dynamic Client Registration (DCR). Programmatic clients send an API key carrying the mcp scope as a bearer token, and Enterprise customers can use issued client credentials. See Scite's official MCP documentation.

Scite API

The Scite REST API covers papers, Smart Citation tallies, the citation graph, search, evidence datasets, Collections, Reference Check, the Assistant, authors, and journal-level metrics. Papers and Tallies endpoints are public and need no key. Everything else needs one of two credentials: a self-service API key, available on the Pro plan since August 8, 2026, or an Enterprise client_id and client_secret exchanged through client_credentials for an access token that expires after two hours. Keys travel as Authorization: Bearer and carry the scopes you pick in the API Console. Responses expose RateLimit-* headers, and limits vary by endpoint and account. See the Scite API documentation.

Comparing them where it matters for agents

Four dimensions decide this for a Scite agent: what it can do, how it authenticates, what you operate in production, and which workloads fit each path.

What your agent can actually do

The MCP server is built for conversational research: find papers, read open-access excerpts, and pull the citation statements that support or contrast them. The REST API is built for systems: batch lookups, graph traversal, document checks, and dashboards.

Capability
Scite MCP
Scite API
Literature search with Boolean, phrase, and proximity queries
Yes (search_literature, up to 1,000 results per call)
Yes (/api_partner/search, up to 10,000 per request)
Smart Citation statement text
Yes, with a Scite premium subscription
Redacted on self-service keys; full text needs an Enterprise agreement
Retraction and editorial-notice filters
Yes
Yes, plus has_withdrawn
Tallies for a DOI
Inside each hit (tally)
Dedicated endpoint, public, bulk up to 500 DOIs
Section-level tallies
No
Yes (/tallies/cited-by-sections/{doi})
Citation graph traversal
Partial: citing statements attached to each hit
Yes, both directions, paginated
Journal-level Scite Index and tallies
No
Yes
Evidence datasets: patents, trials, grants, FDA drugs and devices, MAUDE, FAERS, MHRA
Yes: 17 search and fetch tools, no patent detail tool
Yes, plus schema, facets, and patent detail
Collections
DOI-list only
DOI-list and saved-search
Reference Check and the Assistant
No
Yes, as async tasks you poll
Paper recommendations, author statistics, search aggregations
No
Yes

Where the MCP ceiling is

The ceiling is document-level and portfolio-level work. An agent that checks every reference in a manuscript needs Reference Check. An agent that ranks journals, walks a citation graph several hops out, or refreshes tallies for 5,000 DOIs a night needs REST. The MCP server also returns deliberately slim search results, and its Evidence tools follow a search-then-fetch pattern so the model pulls full records only when it needs them. That is a feature for context budgets and a cost for throughput. One more gap: MCP Collections can only be DOI lists. Saved-search Collections, whose membership comes from a query, are created in the web app or through REST.

The auth path each one puts you on

Scite gives the two surfaces different credential models, and the difference matters more than the transport.

MCP: OAuth 2.1 for users, scoped keys for programs

Interactive clients run the OAuth 2.1 authorization code flow with PKCE (RFC 7636, S256 required), discover endpoints from the Authorization Server Metadata document (RFC 8414), and obtain a client_id through DCR (RFC 7591). Platforms that ship with PKCE or DCR turned off get invalid_request. The grant carries the mcp scope, and the token endpoint accepts grant_type=refresh_token, so a background agent can keep running after one browser consent. Programmatic clients can skip OAuth and send a Pro API key with the mcp scope. That key shares its owner's MCP quota, which makes it a single-account credential, not a multi-tenant one. Users on SAML SSO must sign in through SSO before authorizing.

REST: API keys or one Enterprise credential

The REST API documents two credential types and no per-user OAuth grant. A self-service API key requires Pro, is shown once, and can be rotated or revoked in the API Console; for a multi-tenant product, that means asking every user to hold Pro and paste a key. The alternative is Enterprise credentials: your company's client_id and client_secret, exchanged for a two-hour access token. That is clean server-to-server auth for headless pipelines, but it is one identity for every tenant. Scite sees your product, not the researcher, and per-user attribution becomes your problem.

Licensing is part of the auth decision

Scite meters and licenses the two surfaces separately. MCP calls draw on the authorizing user's monthly credits, 250 on Basic and 2,500 on Pro, and exhausting them returns -32001 until the calendar month resets. REST limits are enforced separately and vary by endpoint. Basic includes MCP credits but no REST key. A self-service Pro key is for evaluation: Search snippets come back redacted, commercial or research use of Search needs a separate license, and Evidence datasets need dataset-specific scopes. On MCP, an individual Pro account unlocks Evidence tools, while organization licenses need an explicit evidence:<dataset>:mcp entitlement.

Recommended reading: OAuth vs API Keys for AI Agents

What you own in production

Scite hosts both surfaces. The difference is which failure modes land on your team.

On the MCP path

Scite maintains the tool schemas, the access resolver that finds a readable copy of each paper, and protocol negotiation across MCP versions 2024-11-05 through 2025-11-25. You own token storage, refresh, revocation handling, and tenant isolation for every connected user. You also own tool-surface hygiene. search_literature alone carries 30 parameters and a multi-paragraph description, and Scite warns that large limit values produce payloads that consume significant model context. Scite annotates delete_collection and remove_dois_from_collection with destructiveHint, which your client should honor with confirmation or exclusion. Scite points clients to tools/list for the live schema, so treat tool contracts as server-controlled.

On the REST path

You own everything above plus the client: endpoint selection, pagination through citation graphs that can exceed 3,000 records, polling loops for Assistant and Reference Check tasks, and retry policy. Scite's guidance is specific: never retry 401, 403, 404, or 422 unchanged; back off with jitter on 429 and transient 5xx; honor Retry-After; and avoid retrying writes without deduplication. You also map field names yourself, because journal-level tallies use totalSupportingCites where DOI-level tallies use supporting. The upside is control. Batch jobs, bulk tallies, and aggregations run deterministically, with no model choosing tools.

Scite errors your agent must handle

Three MCP errors deserve explicit handling. -32001 means the user's monthly allowance is spent. -32003 means a plan, scope, or entitlement is missing; after an upgrade, entitlements can take up to 15 minutes to reach a live session. -32042 returns an upgrade URL as an elicitation, which a headless agent has no one to show. Because access is enforced on tools/call, not tools/list, a Basic user's agent still sees all 17 Evidence tools and fails on each one. Filter the tool surface to what the user's plan can execute.

When to use MCP, when to use the API

The split follows workload shape more than preference.

Use Scite MCP when

  • You are building an interactive research assistant in Claude, ChatGPT, Cursor, or your own chat UI, where the user completes one OAuth consent and wants cited answers mid-conversation.
  • Your users already pay for Scite, so calls land on their own MCP credits and entitlements with no REST license to negotiate.
  • The agent verifies claims and needs Smart Citation statement text without an Enterprise agreement.
  • Pro users need regulatory and clinical lookups across trials, FAERS, MAUDE, 510(k), and MHRA through slim search-then-fetch tools.
  • Scite is one of several MCP servers in a multi-tool research agent.

Use the Scite API directly when

  • You need REST-only surfaces: Reference Check on manuscripts, Assistant tasks, section-level tallies, the journal-level Scite Index, recommendations, or author statistics.
  • The job is batch work: bulk tallies of 500 DOIs per request, 10,000-result search pages, or aggregations for a dashboard.
  • The pipeline is deterministic, such as a nightly retraction screen of a reference library, and should not depend on a model picking tools.
  • You hold an Enterprise agreement with managed client credentials and higher limits for server-to-server calls.
  • You only need public paper metadata and tallies, which require no key at all.

The credential problem that exists on both paths

Choosing MCP or REST changes the token type. It does not change the infrastructure you need around it.

What Scite gives you

On MCP, Scite gives you a per-user OAuth grant with refresh, and every call runs on that researcher's plan and credits. That is the right posture for a research agent: what the user can't do, the agent can't do. On REST, Scite gives you either per-user API keys or one Enterprise credential. Either way, Scite validates the credential it receives. Neither surface documents a way to notify your agent when a user revokes access, downgrades a plan, or rotates a key; you find out on the next failed call.

What you still have to build

Take a B2B literature-review product with 60 customer organizations and 1,500 researchers. On MCP, that is 1,500 access and refresh token pairs to encrypt, isolate per tenant, refresh before expiry, and invalidate on revocation, plus plan awareness so each tool surface matches its user's entitlements. On REST with per-user keys, it is 1,500 long-lived secrets that users paste and rotate. With one Enterprise credential, it is a single secret whose compromise exposes every tenant, and an audit trail that cannot name the researcher. The token type differs. The infrastructure required does not.

Recommended reading: How Tool Calling Auth Changes When You Move from Single-Tenant to Multi-Tenant

Building Scite agents with Scalekit

Scalekit ships one Scite connector, scitemcp, which routes tool calls to Scite's own MCP server; there is no separate Scite REST connector in the catalog. Each user signs in to Scite once, Scalekit stores and refreshes the token, and your agent never handles it. The examples use Python and the Claude SDK, because the Node.js SDK does not mint Virtual MCP session tokens yet.

Set up the connection

Create a Scite MCP connection in the Scalekit dashboard under AgentKit, then install the SDKs. The examples use scitemcp, the connection name from Scalekit's quickstart; your code must use the exact connection name shown in your dashboard. The Scite MCP connector docs list all 25 tools with their input schemas.

pip install scalekit-sdk-python anthropic python-dotenv # .env (values from the Scalekit dashboard: Developers > API Credentials) SCALEKIT_ENVIRONMENT_URL=<your-environment-url> SCALEKIT_CLIENT_ID=<your-client-id> SCALEKIT_CLIENT_SECRET=<your-client-secret> ANTHROPIC_API_KEY=<your-anthropic-api-key>

Connect a user's Scite account

Authorization happens once per user. get_or_create_connected_account returns the user's connected account; if it is not ACTIVE, the authorization link sends the user through Scite's OAuth 2.1 consent. After that, Scalekit keeps the token fresh and your code passes only the user's identifier.

import os from dotenv import load_dotenv from scalekit import ScalekitClient load_dotenv() scalekit_client = ScalekitClient( env_url=os.environ["SCALEKIT_ENVIRONMENT_URL"], client_id=os.environ["SCALEKIT_CLIENT_ID"], client_secret=os.environ["SCALEKIT_CLIENT_SECRET"], ) actions = scalekit_client.actions CONNECTION_NAME = "scitemcp" # must match the connection name in your Scalekit dashboard exactly USER_ID = "user_123" # your app's stable identifier for this user def ensure_scite_connected(identifier: str) -> None: response = actions.get_or_create_connected_account( connection_name=CONNECTION_NAME, identifier=identifier ) if response.connected_account.status == "ACTIVE": return link = actions.get_authorization_link( connection_name=CONNECTION_NAME, identifier=identifier ) # In production, deliver this link through your app instead of printing it. print("Authorize Scite:", link.link) input("Press Enter after completing the Scite sign-in...") response = actions.get_or_create_connected_account( connection_name=CONNECTION_NAME, identifier=identifier ) if response.connected_account.status != "ACTIVE": raise RuntimeError(f"Scite is {response.connected_account.status}, not ACTIVE") ensure_scite_connected(USER_ID)

Retrieve the tools this user is authorized to call

The agent does not load a flat connector catalog. list_scoped_tools returns the tools this user's connected account is authorized to call, narrowed further by the tool_names you pass. For Scite, that filter carries policy: leave out the two destructive Collection tools, and add Evidence tools only for users whose Scite plan can execute them, since Scite checks entitlements on the call rather than the listing.

from google.protobuf.json_format import MessageToDict LITERATURE_TOOLS = [ "scitemcp_search_literature", "scitemcp_search_collections", "scitemcp_get_collection", ] # Evidence tools need Scite Pro or a dataset scope, checked at call time. EVIDENCE_TOOLS = [ "scitemcp_search_clinical_trials", "scitemcp_get_clinical_trial", ] def scite_tools_for(identifier: str, include_evidence: bool) -> list[dict]: tool_names = LITERATURE_TOOLS + (EVIDENCE_TOOLS if include_evidence else []) scoped_response, _ = actions.tools.list_scoped_tools( identifier=identifier, filter={"connection_names": [CONNECTION_NAME], "tool_names": tool_names}, page_size=100, ) tools = [] for scoped_tool in scoped_response.tools: definition = MessageToDict(scoped_tool.tool.definition) tools.append( { "name": definition["name"], "description": definition.get("description", ""), "input_schema": definition.get("input_schema", {"type": "object"}), } ) return tools

Run the Claude tool-use loop

execute_tool runs each call as the user, with the credential resolved server-side. Provider-side failures raise ScalekitToolException, which the SDK reserves for errors returned by the upstream service. The loop hands those back to Claude as tool errors instead of crashing the run.

import json import anthropic from scalekit.common.exceptions import ScalekitToolException claude = anthropic.Anthropic() # reads ANTHROPIC_API_KEY SYSTEM_PROMPT = ( "You are a research assistant. Ground every claim in Scite results. " "Keep limit between 10 and 50 on scitemcp_search_literature, and report each " "paper's supporting and contrasting citation counts plus any editorial notices." ) def run_research_agent(identifier: str, question: str, include_evidence: bool = False) -> str: tools = scite_tools_for(identifier, include_evidence) messages = [{"role": "user", "content": question}] while True: response = claude.messages.create( model="claude-sonnet-5-5", max_tokens=4096, system=SYSTEM_PROMPT, tools=tools, messages=messages, ) messages.append({"role": "assistant", "content": response.content}) if response.stop_reason != "tool_use": return "".join(block.text for block in response.content if block.type == "text") tool_results = [] for block in response.content: if block.type != "tool_use": continue try: result = actions.execute_tool( tool_name=block.name, tool_input=block.input, identifier=identifier, connection_name=CONNECTION_NAME, ) tool_results.append( { "type": "tool_result", "tool_use_id": block.id, "content": json.dumps(result.data), } ) except ScalekitToolException as exc: tool_results.append( { "type": "tool_result", "tool_use_id": block.id, "content": str(exc), "is_error": True, } ) messages.append({"role": "user", "content": tool_results}) print( run_research_agent( USER_ID, "What is the strongest evidence since 2020 that SGLT2 inhibitors slow CKD " "progression? Flag any retracted or heavily contrasted papers.", ) )

Serve many users from one Virtual MCP server

The direct path suits one agent calling one connector. A research product usually runs several agent roles across several tools for many tenants. A Virtual MCP server is defined once per agent role: which connections and which tools. Each run gets a short-lived session token bound to one user's connected accounts, so one static endpoint serves every tenant with no credential sharing. This example pairs three read-only Scite tools with the Slack connector's slack_send_message for an evidence digest agent.

from scalekit.actions.models.mcp_config import McpConfigConnectionToolMapping # One-time setup per agent role, not per user. vmcp = actions.mcp.create_config( name="scite-evidence-digest", description="Scite literature search plus a Slack digest", connection_tool_mappings=[ McpConfigConnectionToolMapping( connection_name="scitemcp", # must match your dashboard connection name tools=[ "scitemcp_search_literature", "scitemcp_search_collections", "scitemcp_get_collection", ], ), McpConfigConnectionToolMapping( connection_name="slack", # must match your dashboard connection name tools=["slack_send_message"], ), ], ) MCP_CONFIG_ID = vmcp.config.id MCP_SERVER_URL = vmcp.config.mcp_server_url # static: store it with the agent definition

Hand the session to Claude

Before each run, confirm the user's connections are active and mint a session token. The default lifetime is about an hour; set expiry above the expected run time, and remint rather than refresh, since there is no refresh endpoint. Anthropic's MCP connector then calls the Virtual MCP server directly, so there is no tool loop to write.

from datetime import timedelta def mint_session_token(identifier: str) -> str: accounts = actions.mcp.list_mcp_connected_accounts( config_id=MCP_CONFIG_ID, identifier=identifier, include_auth_link=True, ) pending = [ (account.connection_name, account.authentication_link) for account in accounts.connected_accounts if (account.connected_account_status or "").upper() != "ACTIVE" ] if pending: # Surface these links to the user in your app, then retry. raise RuntimeError(f"Re-authorization needed: {pending}") session = actions.mcp.create_session_token( mcp_config_id=MCP_CONFIG_ID, identifier=identifier, expiry=timedelta(minutes=30), ) return session.token response = claude.beta.messages.create( model="claude-sonnet-5-5", max_tokens=4096, betas=["mcp-client-2025-11-20"], mcp_servers=[ { "type": "url", "url": MCP_SERVER_URL, "name": "scalekit", "authorization_token": mint_session_token(USER_ID), } ], tools=[{"type": "mcp_toolset", "mcp_server_name": "scalekit"}], messages=[ { "role": "user", "content": ( "Find 2024 to 2026 papers on GLP-1 receptor agonists in heart failure " "with at least 5 supporting citations, then post a three-bullet digest " "to #cardio-evidence in Slack." ), } ], ) print("".join(block.text for block in response.content if block.type == "text"))

Reach REST-only endpoints through the same model

For recommendations, citation-graph traversal, or Reference Check, add Scite's REST API as a custom connector with BEARER auth; each user supplies their own Pro API key, stored in the same vault. Calls go through Tool Proxy with actions.request(), and paths are relative to the connector's proxy_url. Custom connectors and the API proxy are part of the Growth plan on the pricing page.

# "sciteapi" is the connection name you gave your custom Scite REST connector. response = actions.request( connection_name="sciteapi", identifier=USER_ID, path="/api_partner/citations/citing/10.1038/nature12373", method="GET", query_params={"limit": 100, "offset": 0}, ) response.raise_for_status() citing_statements = response.json()["citations"]

Why the Scalekit path fits Scite agents

Three properties matter most once a Scite agent leaves the demo.

Every Scite call is logged against the researcher

AgentKit records every tool call with timestamp, connection, tool name, user identifier, and latency; the detail view adds connection and account IDs, duration, source, and the full error. The overview separates connector errors, where Scite received the call and rejected it, from API errors, where the call failed before leaving Scalekit, such as an expired token or invalid parameters. For a Scite agent, that split is diagnostic: a spike in connector errors on Evidence tools is a signal to check plan entitlements, while API errors point at your own configuration. Authentication events land in auth logs, with SIEM integrations on Enterprise.

Recommended reading: Agent Tool Observability: Your Agent Is Running. Is It Actually Working?

One Virtual MCP server per research agent role

A literature-review agent, a regulatory-watch agent, and a grant-scouting agent each need a different slice of Scite's 25 tools, often alongside Slack, Notion, or web search through Exa. A Virtual MCP server turns each slice into a static endpoint defined once, with a per-run token bound to one user. search_literature alone ships 30 parameters, so scoping a server from 25 tools to five keeps the decision space small. Surface reduction is the lever. Model upgrades help. They are not the lever. Tenant isolation comes from the token, not from per-user server configuration.

Recommended reading: When to Use a Virtual MCP Server

Credentials that never reach the model

Scite OAuth tokens live in Scalekit's AES-256 vault, namespaced per tenant, resolved at request time, and kept out of prompts, logs, and LLM context. When a user revokes Scite access, their next call fails closed with a clear error while other users in the tenant keep working. Calls run on the authorizing user's Scite entitlement, so usage and rate limits land on the real account, and the audit trail names the researcher whose agent ran the search. See how the model works in the token vault deep dive.

Which one to build against

If your agent is an interactive research assistant whose users hold Scite subscriptions, build on MCP: per-user OAuth, Smart Citation statements without an Enterprise agreement, and tool schemas Scite maintains. If your agent runs Reference Check, walks citation graphs, or refreshes tallies in bulk, build on REST, and expect an Enterprise conversation before production Search use. Many Scite products will run both: MCP for the conversational layer, REST for batch jobs. Either way, the credential lifecycle is the same problem, and that is what needs production-grade infrastructure.

Start building your Scite agent

Browse the Scite MCP connector, fork a pattern from the agent templates such as the competitive intelligence briefing agent, and review AgentKit pricing; the free tier includes 5,000 tool calls a month and unlimited connected accounts. Building a Scite agent and want a second pair of eyes on the auth design? Talk to us for immediate help.

No items found.
Agent
Auth Quickstart
On this page
Share this article
Agent
Auth Quickstart

Acquire enterprise customers with
‍zero upfront cost.

Every feature unlocked. No hidden fees.