# Panda Research MCP: Stop Your Agent Citing Fake Papers (`pandadad0214/panda-research-mcp`) Actor

MCP server for AI agents: verify citations, catch fake and retracted papers, find real ones in OpenAlex and PubMed, and format references in APA, MLA, IEEE or Vancouver.

- **URL**: https://apify.com/pandadad0214/panda-research-mcp.md
- **Developed by:** [Panda Federation](https://apify.com/pandadad0214) (community)
- **Categories:** AI, MCP servers, Education
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event + usage

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Panda Research MCP: stop your agent citing fake papers

**One MCP server that lets Claude, Cursor or any AI agent check its citations, catch retracted papers, find real sources and format references, before it answers.**

Language models invent references. They look right, with plausible authors, a real journal and a DOI, and they don't exist. Panda Research MCP gives your agent four tools that look everything up in Crossref, OpenAlex, Unpaywall and PubMed, and answer with the status every Panda Federation tool uses:

| Status | Meaning | What the agent should do |
|---|---|---|
| **OK** | Verified against a real record | Safe to cite |
| **CHECK** | Real, but details differ, or there's a correction, expression of concern or preprint flag | Read the note first |
| **FIX** | Not found, wrong paper, or retracted | Don't cite it as written |

### What the agent gets

| Tool | What it does | Per call |
|---|---|---|
| `check_references` | Verifies up to 10 references (full citations, DOIs or titles). Flags fabricated, mismatched and retracted papers, with the matched DOI and each difference | $0.01 |
| `format_citations` | Turns up to 10 DOIs, arXiv IDs, PMIDs, ISBNs, titles or messy references into APA 7, MLA 9, Chicago, Harvard, IEEE or Vancouver, plus optional BibTeX | $0.01 |
| `search_literature` | Finds up to 20 real papers in 250M+ OpenAlex works, with citation counts, free PDF links from Unpaywall and retraction flags | $0.02 |
| `pubmed_evidence_table` | Searches PubMed and returns up to 20 articles with study design, sample size (only when it can be quoted from the abstract), retraction status, PRISMA counts and optional RIS | $0.02 |

You pay only for calls that succeed. Calls with bad input, failed lookups, or searches that find nothing are free. There are no other per-item fees.

### Connect it

**MCP URL:** `https://pandadad0214--panda-research-mcp.apify.actor/mcp`

Authenticate with your [Apify API token](https://console.apify.com/settings/integrations) as a Bearer token. Charges go to your Apify account.

**Claude Desktop / Claude Code / Cursor** (`claude_desktop_config.json`, `.cursor/mcp.json`, or `~/.cursor/mcp.json`):

```json
{
  "mcpServers": {
    "panda-research": {
      "url": "https://pandadad0214--panda-research-mcp.apify.actor/mcp",
      "headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
    }
  }
}
```

If your client only speaks stdio (older Claude Desktop builds), bridge it with `mcp-remote`:

```json
{
  "mcpServers": {
    "panda-research": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://pandadad0214--panda-research-mcp.apify.actor/mcp",
               "--header", "Authorization:${AUTH_HEADER}"],
      "env": { "AUTH_HEADER": "Bearer YOUR_APIFY_TOKEN" }
    }
  }
}
```

**Claude Code CLI:**

```bash
claude mcp add --transport http panda-research https://pandadad0214--panda-research-mcp.apify.actor/mcp \
  --header "Authorization: Bearer YOUR_APIFY_TOKEN"
```

**Python (FastMCP client):**

```python
from fastmcp import Client
from fastmcp.client.transports import StreamableHttpTransport

url = "https://pandadad0214--panda-research-mcp.apify.actor/mcp"
async with Client(StreamableHttpTransport(url, headers={"Authorization": f"Bearer {token}"})) as c:
    r = await c.call_tool("check_references", {"references": ["LeCun Y, Bengio Y, Hinton G. Deep learning. Nature. 2015;521:436-444."]})
    print(r.structured_content["results"][0]["status"])   # OK
```

A tip for system prompts: *"Before you give any citation, call check_references on it. Never show a reference with status FIX."*

### Example: `check_references`

Input:

```json
{"references": [
  "Wakefield AJ, et al. Ileal-lymphoid-nodular hyperplasia, non-specific colitis, and pervasive developmental disorder in children. Lancet. 1998;351:637-41.",
  "Smith J, Patel R. Quantum transformers cure seasonal allergies in toddlers. Journal of Imaginary Medicine. 2021;12(3):45-67.",
  "10.1056/NEJMoa2307563"
]}
```

Output (shortened):

```json
{
  "summary": {"checked": 3, "OK": 1, "CHECK": 0, "FIX": 2},
  "results": [
    {"index": 1, "status": "FIX", "verdict": "verified", "note": "RETRACTED. Do not cite it as supporting evidence. Matches a real record.",
     "doi": "10.1016/s0140-6736(97)11096-0", "integrity": {"status": "retracted", "notices": [{"type": "retraction", "date": "2010-02-06"}]}},
    {"index": 2, "status": "FIX", "verdict": "not-found", "note": "No matching record in Crossref or OpenAlex. It may be fabricated, or too obscure to index."},
    {"index": 3, "status": "OK", "verdict": "verified", "doi": "10.1056/nejmoa2307563",
     "matched": {"title": "Semaglutide and Cardiovascular Outcomes in Obesity without Diabetes", "year": 2023, "journal": "New England Journal of Medicine"}}
  ]
}
```

### Example: `pubmed_evidence_table`

```json
{"query": "semaglutide cardiovascular outcomes", "study_designs": ["rct"], "max_results": 5}
```

Returns each article's Vancouver citation, study design (from PubMed publication types), sample size with the quoted sentence and a confidence level (for example `17604 patients, high: "A total of 17,604 patients were enrolled"`), retraction status and PubMed/DOI/PMC links, plus PRISMA counts such as *1008 identified, 929 excluded by the RCT filter, 79 after filters, 5 returned*.

### Limits, honestly

- **"Not found" isn't proof of fabrication.** Very new, local or grey-literature items may not be indexed. The note says so.
- **Sample size is left blank unless it can be quoted.** Outcomes, effect sizes and risk of bias are never extracted. A human reviewer does that.
- **Per call:** 10 references, or 20 search results. For bulk jobs (hundreds of references or thousands of papers, with Excel, BibTeX and RIS files), use the standalone Actors below.
- Retraction data comes from Crossref (including Retraction Watch), OpenAlex and PubMed. It's as current as those sources.
- Not for writing coursework or ghostwriting. It checks and finds sources. It doesn't write papers for anyone.

### Pricing

Pay per event, charged only for successful calls:

- **$0.01** per `check_references` or `format_citations` call (up to 10 references)
- **$0.02** per `search_literature` or `pubmed_evidence_table` call that returns results (up to 20 papers)

Example: an agent that checks 5 citations in one call and runs 2 searches pays **$0.05** in tool fees. As with every Standby Actor, Apify can also bill normal platform usage while the server run is up (it stops 2 minutes after the last call). See [Apify's Standby billing notes](https://docs.apify.com/platform/actors/running/standby#billing).

### FAQ

**Is my data stored?** No. Tool calls aren't written to datasets. References are sent only to the public scholarly APIs listed below.

**Does it call other Actors?** No. The four tools run the same code as the standalone Panda Federation Actors inside this server, so there are no second runs and no extra per-item charges.

**Which clients work?** Any MCP client with Streamable HTTP and custom headers: Claude Desktop, Claude Code, Cursor, VS Code, Windsurf, the OpenAI Agents SDK, LangChain and others. Clients that only speak stdio can use `mcp-remote`.

### Data sources and credits

- [Crossref](https://www.crossref.org) metadata and notices, including [Retraction Watch](https://retractionwatch.com) data
- [OpenAlex](https://openalex.org) (CC0) for search, matching and citation counts
- [Unpaywall](https://unpaywall.org) for legal open-access PDFs
- [PubMed / MEDLINE](https://pubmed.ncbi.nlm.nih.gov) via [NCBI E-utilities](https://www.ncbi.nlm.nih.gov/books/NBK25501/). Not affiliated with or endorsed by NLM/NCBI
- [DataCite](https://datacite.org) and [Open Library](https://openlibrary.org) for datasets, preprints and books
- [citeproc-js](https://github.com/Juris-M/citeproc-js) and the [CSL project](https://citationstyles.org) styles (CC BY-SA 3.0)

***

#### Built by Panda Federation

**Self-healing, local-first AI systems and data tools that run themselves.**

The Panda Federation research toolkit:

- **[Panda Research MCP](https://apify.com/pandadad0214/panda-research-mcp)**: all four tools for AI agents, over MCP
- **[Reference Checker](https://apify.com/pandadad0214/reference-checker)**: fake citations and retracted papers, found
- **[Citation Formatter](https://apify.com/pandadad0214/citation-formatter)**: DOIs, ISBNs and messy references to APA, MLA, Chicago, Harvard, IEEE, Vancouver, BibTeX and RIS
- **[Literature Search](https://apify.com/pandadad0214/literature-search)**: a Google Scholar alternative across 250M+ papers, with retraction screening
- **[PubMed Evidence Table](https://apify.com/pandadad0214/pubmed-evidence-table)**: screening-ready evidence tables from PubMed

[More from Panda Federation on Apify](https://apify.com/pandadad0214) · [GitHub](https://github.com/pandadad0214)

*Build slow. Build steady. Build sovereign.*

# Actor input Schema

## `note` (type: `string`):

Leave empty. Tools are called over MCP, not through this form. A normal run only prints the connection URL and stops.

## Actor input object example

```json
{}
```

# Actor output Schema

## `mcpUrl` (type: `string`):

Add this URL to Claude, Cursor or any MCP client, with your Apify token as a Bearer token.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("pandadad0214/panda-research-mcp").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("pandadad0214/panda-research-mcp").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call pandadad0214/panda-research-mcp --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,pandadad0214/panda-research-mcp"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/KSqc1wFhg72K9EuBA/builds/byOsdf7AF0rC7nRJj/openapi.json
