An MCP server for searching academic papers, authors, and institutions using the OpenAlex API. Provides tools to retrieve scholarly content with full-text access and filtering capabilities.
Server has 4 clearly defined search tools with consistent naming patterns (search_*, papers_by_author). All tools have descriptions and explicit input schemas with proper type definitions. However, descriptions lack depth and actionability. Parameter descriptions are minimal (under 30 chars for most). Output schema (PageResult) is documented in return types but field-level details are not visible in the provided code. Error handling uses ToolError but lacks recovery guidance. The code shows proper input validation (sanitization) and logging, but tool compositions could be better optimized.
Searches for academic papers by a particular author using the OpenAlex API.
Searches for authors using the OpenAlex API. Args: query: The search name to look for the authors. sort_by: The sorting criteria ("relevance_score" or "cited_by_count"). institution_id: An optional institution id to filter search results. e.g., "https://openalex.org/I123456789" page: The page number of the results to retrieve (default: 1). Returns: A JSON object containing a list of authors+ids, or an error message if the search fails.
Searches for institutions using the OpenAlex API. Args: query: The search name to look for the institutions. sort_by: The sorting criteria ("relevance_score" or "cited_by_count"). page: The page number of the results to retrieve (default: 1). Returns: A JSON object containing a list of institutions+ids, or an error message if the search fails.
Searches for academic papers using the OpenAlex API. Args: query: The search term or keywords to look for in the papers. search_by: The field to search in ("default", "title", or "title_and_abstract"). sort_by: The sorting criteria ("relevance_score", "cited_by_count", or "publication_date"). institution_name: An optional institution or affiliation name to filter search results. author_id: An optional OpenAlex Author ID to filter search results. e.g., "https://openalex.org/A123456789" page: The page number of the results to retrieve (default: 1). Returns: A JSON object containing a list of searched papers+ids, or an error message if the search fails.
Minimal parameter descriptions. Most parameters have descriptions under 30 characters (e.g., 'The search name to look for the authors'). This violates the 10-1024 character guideline for actionable context. LLMs cannot infer expected format, constraints, or dependencies from such brief text.
papers_by_author lacks a complete description. The docstring 'Searches for academic papers by a particular author using the OpenAlex API.' is vague and does not explain WHEN to use this vs search_papers with author_id filter, what the return structure contains, or unique capabilities. This violates the requirement that descriptions answer 'what does it do, when to use it, what does it return'.
Output schema (PageResult) is declared as return type but field definitions are not visible in the provided code. The rubric requires documenting the output schema so LLMs know what fields to expect for downstream tool chaining. Without visible schema details (e.g., structure of 'data', meaning of 'has_next', format of IDs), LLMs cannot reliably extract and reuse values.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 65 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Error responses do not provide recovery guidance. Code raises ToolError with messages like 'No works found with the query' or 'Request failed with status: 404', but does not suggest what the LLM should do next (e.g., 'Try broadening the search term' or 'Check if the author_id is valid'). This violates the recovery-guide pattern.
Tools accept optional parameters like author_id and institution_id that require opaque OpenAlex URLs (e.g., 'https://openalex.org/A123456789'). While the descriptions mention this format, users typically operate with author names or institution names, not internal IDs. The tools should accept human-friendly identifiers (names) alongside or instead of IDs to match the chat data model.
search_papers and papers_by_author overlap in functionality. Both can search papers; the distinction is unclear. An LLM must reason about when to use search_papers with author_id vs papers_by_author. This violates the principle that tools should not duplicate functionality under different names.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are visible in the code. All four tools are read-only and idempotent, which should be declared to enable smarter LLM scheduling and retry logic.