MCP Scholarly Server
[](https://mseep.ai/app/adityak74-mcp-scholarly)
# mcp-scholarly MCP server
[](https://smithery.ai/server/mcp-scholarly)
A MCP server to search for accurate academic articles. More scholarly vendors will be added soon.
## Search tools
- `search-arxiv` — arXiv search (no key needed)
- `search-google-scholar` — Google Scholar via the `scholarly` library (free proxy pool)
- `search-google-web` — Google web search via the [SerpBase API](https://serpbase.dev). Optional; only registered when `SERPBASE_API_KEY` is set. Get a key at https://serpbase.dev/dashboard/api-keys (free tier available).


<a href="https://glama.ai/mcp/servers/aq05b2p0ql"><img width="380" height="200" src="https://glama.ai/mcp/servers/aq05b2p0ql/badge" alt="Scholarly Server MCP server" /></a>

## Components
### Tools
The server implements one tool:
- search-arxiv: Search arxiv for articles related to the given keyword.
- Takes "keyword" as required string arguments
## Quickstart
### Install
#### Claude Desktop
On MacOS: `~/Library/Application\ Support/Claude/claude_desktop_config.json`
On Windows: `%APPDATA%/Claude/claude_desktop_config.json`
<details>
<summary>Development/Unpublished Servers Configuration</summary>
```
"mcpServers": {
"mcp-scholarly": {
"command": "uv",
"args": [
"--directory",
"/Users/adityakarnam/PycharmProjects/mcp-scholarly/mcp-scholarly",
"run",
"mcp-scholarly"
]
}
}
```
</details>
<details>
<summary>Published Servers Configuration</summary>
```
"mcpServers": {
"mcp-scholarly": {
"command": "uvx",
"args": [
"mcp-scholarly"
]
}
}
```
</details>
or if you are using Docker
<details>
<summary>Published Docker Servers Configuration</summary>
```
"mcpServers": {
"mcp-scholarly": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"mcp/scholarly"
]
}
}
```
</details>
### Installing via Smithery
To install mcp-scholarly for Claude Desktop automatically via [Smithery](https://smithery.ai/server/mcp-scholarly):
```bash
npx -y @smithery/cli install mcp-scholarly --client claude
```
## Development
### Building and Publishing
To prepare the package for distribution:
1. Sync dependencies and update lockfile:
```bash
uv sync
```
2. Build package distributions:
```bash
uv build
```
This will create source and wheel distributions in the `dist/` directory.
3. Publish to PyPI:
```bash
uv publish
```
Note: You'll need to set PyPI credentials via environment variables or command flags:
- Token: `--token` or `UV_PUBLISH_TOKEN`
- Or username/password: `--username`/`UV_PUBLISH_USERNAME` and `--password`/`UV_PUBLISH_PASSWORD`
### Debugging
Since MCP servers run over stdio, debugging can be challenging. For the best debugging
experience, we strongly recommend using the [MCP Inspector](https://github.com/modelcontextprotocol/inspector).
You can launch the MCP Inspector via [`npm`](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) with this command:
```bash
npx @modelcontextprotocol/inspector uv --directory /Users/adityakarnam/PycharmProjects/mcp-scholarly/mcp-scholarly run mcp-scholarly
```
Upon launching, the Inspector will display a URL that you can access in your browser to begin debugging.
## Using with zorp
[zorp](https://github.com/aviskaar/zorp) needs a search-capable MCP tool
before `validate` will run. This server satisfies that check, because zorp
matches on a search verb in the tool name and these tools are called
`search-arxiv` and `search-google-scholar`.
```bash
zorp-agent --yes \
--mcp "stdio:scholarly:uv:run:mcp-scholarly" \
validate "<your research question>"
```
Or configure it once, so every run picks it up:
```toml
# .zorp/mcp.toml
[[server]]
name = "scholarly"
transport = "stdio"
command = "uv"
args = ["run", "mcp-scholarly"]
trust = "sandbox"
timeout_secs = 60
```
Notes measured against zorp's transport, not assumed:
- `search-arxiv` answers in about 1 second. zorp's default stdio read
budget is 30 seconds, so the default is comfortable. `timeout_secs = 60`
above is headroom for `search-google-scholar`, which goes through
`scholarly` and a free proxy pool and is far less predictable.
- Logging goes to stderr. Nothing but JSON-RPC reaches stdout, which is
what zorp's newline-delimited framing requires.
- An empty keyword comes back as an MCP tool error rather than an empty
result set. zorp cares about that distinction: a failed search that
looks like "no prior work" would put a wrong novelty score into an
evidence record.
- arxiv returns best-effort matches for any query, including nonsense, so
a non-empty result set is not by itself evidence that prior work exists.
The tool description says so, since that is the text the model reads.
TDQS
Scored across 2 tools
The two tools have clearly distinct purposes: one searches ArXiv specifically, while the other searches Google Scholar. There is no overlap in their functionality, and an agent can easily choose the appropriate tool based on the desired academic database.
Both tools follow a consistent verb_noun pattern with 'search' as the verb and the database name as the noun (arxiv, google-scholar). The naming is uniform and predictable across the set.
With only 2 tools, the server feels thin for a 'Scholarly Server' that might be expected to handle broader academic tasks. While search is a core function, typical scholarly workflows could benefit from additional tools like fetching article details, citations, or managing references.
The server is severely incomplete for a scholarly domain, as it only provides search functionality without any tools for retrieving full articles, accessing metadata, or performing follow-up actions like citation analysis. This leaves significant gaps that could hinder agent workflows.