@cyanheads/openalex-mcp-server 0.3.1 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +2 -2
- package/README.md +6 -3
- package/dist/mcp-server/tools/definitions/analyze-trends.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/analyze-trends.tool.js +5 -6
- package/dist/mcp-server/tools/definitions/analyze-trends.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-entities.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-entities.tool.js +56 -143
- package/dist/mcp-server/tools/definitions/search-entities.tool.js.map +1 -1
- package/dist/services/openalex/openalex-service.d.ts +2 -0
- package/dist/services/openalex/openalex-service.d.ts.map +1 -1
- package/dist/services/openalex/openalex-service.js +160 -73
- package/dist/services/openalex/openalex-service.js.map +1 -1
- package/package.json +5 -5
- package/server.json +3 -3
package/CLAUDE.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Agent Protocol
|
|
2
2
|
|
|
3
3
|
**Server:** openalex-mcp-server
|
|
4
|
-
**Version:** 0.3.
|
|
4
|
+
**Version:** 0.3.3
|
|
5
5
|
**Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core)
|
|
6
6
|
|
|
7
7
|
> **Read the framework docs first:** `node_modules/@cyanheads/mcp-ts-core/CLAUDE.md` contains the full API reference — builders, Context, error codes, exports, patterns. This file covers server-specific conventions only.
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
**Critical workflow:** Names are ambiguous, IDs are not. Always resolve names to IDs first via `openalex_resolve_name` before using them in filters.
|
|
18
18
|
|
|
19
|
-
**
|
|
19
|
+
**Reference docs:** `README.md` covers the current tool and prompt surface; `docs/tree.md` shows the current repository layout.
|
|
20
20
|
|
|
21
21
|
### MCP Surface
|
|
22
22
|
|
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
<div align="center">
|
|
8
8
|
|
|
9
|
-
[](./CHANGELOG.md) [](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) [](https://modelcontextprotocol.io/) [](./LICENSE) [](https://www.typescriptlang.org/)
|
|
10
10
|
|
|
11
11
|
</div>
|
|
12
12
|
|
|
@@ -37,6 +37,8 @@ Primary discovery and lookup tool. Covers all OpenAlex entity types (works, auth
|
|
|
37
37
|
- Exact and AI semantic search modes
|
|
38
38
|
- Rich filter syntax: AND across fields, OR within fields (`us|gb`), NOT (`!us`), ranges (`2020-2024`), comparisons (`>100`)
|
|
39
39
|
- Sensible default field selection per entity type — prevents oversized responses; pass `select` to override
|
|
40
|
+
- Invalid `select` field names produce an error listing the valid fields for that entity type
|
|
41
|
+
- Formatted MCP output is a generic markdown renderer — every returned field is surfaced without per-entity-type hard-coding
|
|
40
42
|
- Cursor pagination, sorting, up to 100 results per page
|
|
41
43
|
|
|
42
44
|
---
|
|
@@ -82,8 +84,9 @@ Built on [`@cyanheads/mcp-ts-core`](https://github.com/cyanheads/mcp-ts-core):
|
|
|
82
84
|
OpenAlex-specific:
|
|
83
85
|
|
|
84
86
|
- Typed API client with automatic ID normalization (DOI, ORCID, ROR, PMID, PMCID, ISSN, OpenAlex URLs)
|
|
85
|
-
- Abstract reconstruction from inverted indices
|
|
86
|
-
-
|
|
87
|
+
- Abstract reconstruction from inverted indices — plaintext instead of OpenAlex's position-keyed encoding
|
|
88
|
+
- HTTP status codes mapped to specific MCP error classes (400/422 → InvalidParams, 429 → RateLimited, etc.) with upstream messages surfaced
|
|
89
|
+
- Timeout-aware request retries and cancellation support via `AbortSignal`
|
|
87
90
|
|
|
88
91
|
## Getting Started
|
|
89
92
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze-trends.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/analyze-trends.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAIjD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"analyze-trends.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/analyze-trends.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAIjD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;kBA8F5B,CAAC"}
|
|
@@ -66,18 +66,17 @@ export const analyzeTrendsTool = tool('openalex_analyze_trends', {
|
|
|
66
66
|
if (result.groups.length === 0) {
|
|
67
67
|
return [{ type: 'text', text: 'No groups found.' }];
|
|
68
68
|
}
|
|
69
|
-
const
|
|
70
|
-
const MAX_DISPLAY = 50;
|
|
71
|
-
const display = sorted.slice(0, MAX_DISPLAY);
|
|
72
|
-
const lines = display.map((g) => {
|
|
69
|
+
const lines = result.groups.map((g) => {
|
|
73
70
|
const label = g.key === g.key_display_name ? g.key_display_name : `${g.key_display_name} (${g.key})`;
|
|
74
71
|
return `${label}: ${g.count.toLocaleString()}`;
|
|
75
72
|
});
|
|
76
|
-
const
|
|
73
|
+
const footer = result.meta.next_cursor
|
|
74
|
+
? '\n\n*More groups available — pass cursor to paginate.*'
|
|
75
|
+
: '';
|
|
77
76
|
return [
|
|
78
77
|
{
|
|
79
78
|
type: 'text',
|
|
80
|
-
text: `${result.meta.count.toLocaleString()} total entities across ${result.groups.length} groups:\n\n${lines.join('\n')}${
|
|
79
|
+
text: `${result.meta.count.toLocaleString()} total entities across ${result.groups.length} groups on this page:\n\n${lines.join('\n')}${footer}`,
|
|
81
80
|
},
|
|
82
81
|
];
|
|
83
82
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze-trends.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/analyze-trends.tool.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"analyze-trends.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/analyze-trends.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-entities.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-entities.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"search-entities.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-entities.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AA8DjD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA+H7B,CAAC"}
|
|
@@ -5,6 +5,50 @@
|
|
|
5
5
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
6
|
import { getOpenAlexService } from '../../../services/openalex/openalex-service.js';
|
|
7
7
|
import { ENTITY_TYPES } from '../../../services/openalex/types.js';
|
|
8
|
+
function toFieldLabel(field) {
|
|
9
|
+
return field
|
|
10
|
+
.split(/[_\-.]/g)
|
|
11
|
+
.filter(Boolean)
|
|
12
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
13
|
+
.join(' ');
|
|
14
|
+
}
|
|
15
|
+
function isScalar(value) {
|
|
16
|
+
return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
|
|
17
|
+
}
|
|
18
|
+
function isScalarOrNull(value) {
|
|
19
|
+
return value === null || isScalar(value);
|
|
20
|
+
}
|
|
21
|
+
function formatScalar(value) {
|
|
22
|
+
return typeof value === 'number' && Number.isInteger(value)
|
|
23
|
+
? value.toLocaleString()
|
|
24
|
+
: String(value);
|
|
25
|
+
}
|
|
26
|
+
function renderJsonField(label, value) {
|
|
27
|
+
return `**${label}:**\n\`\`\`json\n${JSON.stringify(value, null, 2)}\n\`\`\``;
|
|
28
|
+
}
|
|
29
|
+
function renderField(field, value) {
|
|
30
|
+
const label = toFieldLabel(field);
|
|
31
|
+
if (value == null)
|
|
32
|
+
return `**${label}:** —`;
|
|
33
|
+
if (isScalar(value))
|
|
34
|
+
return `**${label}:** ${formatScalar(value)}`;
|
|
35
|
+
if (Array.isArray(value)) {
|
|
36
|
+
if (value.length === 0)
|
|
37
|
+
return `**${label}:** (empty)`;
|
|
38
|
+
if (value.every(isScalarOrNull)) {
|
|
39
|
+
return `**${label}:** ${value.map((item) => (item === null ? '—' : formatScalar(item))).join(', ')}`;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return renderJsonField(label, value);
|
|
43
|
+
}
|
|
44
|
+
function renderRecord(record) {
|
|
45
|
+
const { id, display_name, ...rest } = record;
|
|
46
|
+
const lines = ['', `### ${display_name || id}`, `**ID:** ${id}`];
|
|
47
|
+
for (const [field, value] of Object.entries(rest)) {
|
|
48
|
+
lines.push(renderField(field, value));
|
|
49
|
+
}
|
|
50
|
+
return lines;
|
|
51
|
+
}
|
|
8
52
|
export const searchEntitiesTool = tool('openalex_search_entities', {
|
|
9
53
|
description: 'Search, filter, sort, or retrieve by ID. Covers all OpenAlex entity types (works, authors, sources, institutions, topics, keywords, publishers, funders). Pass `id` to retrieve a single entity (free, unlimited API calls). Otherwise, use `query` and/or `filters` for discovery. Supports keyword search with boolean operators, exact phrase matching, and AI semantic search. Use openalex_resolve_name to resolve names to IDs before filtering. Searches return a curated set of fields by default; pass `select` to override with specific fields.',
|
|
10
54
|
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
@@ -33,7 +77,7 @@ export const searchEntitiesTool = tool('openalex_search_entities', {
|
|
|
33
77
|
select: z
|
|
34
78
|
.array(z.string())
|
|
35
79
|
.optional()
|
|
36
|
-
.describe('
|
|
80
|
+
.describe('OpenAlex top-level field names to return. Searches apply a curated default per entity type; pass to override. Single-entity lookups (by `id`) return the full record unless set. Invalid field names produce an error listing the valid ones. Example: ["id", "doi", "display_name", "authorships", "primary_topic"].'),
|
|
37
81
|
per_page: z
|
|
38
82
|
.number()
|
|
39
83
|
.int()
|
|
@@ -64,7 +108,7 @@ export const searchEntitiesTool = tool('openalex_search_entities', {
|
|
|
64
108
|
display_name: z.string().describe('Entity name or work title.'),
|
|
65
109
|
})
|
|
66
110
|
.passthrough())
|
|
67
|
-
.describe('
|
|
111
|
+
.describe('OpenAlex entity objects passed through unchanged. Additional fields depend on entity_type and select.'),
|
|
68
112
|
}),
|
|
69
113
|
async handler(input, ctx) {
|
|
70
114
|
const service = getOpenAlexService();
|
|
@@ -89,150 +133,19 @@ export const searchEntitiesTool = tool('openalex_search_entities', {
|
|
|
89
133
|
return result;
|
|
90
134
|
},
|
|
91
135
|
format: (result) => {
|
|
136
|
+
const lines = [];
|
|
137
|
+
const countLabel = `${result.meta.count.toLocaleString()} result(s)`;
|
|
138
|
+
lines.push(result.meta.next_cursor
|
|
139
|
+
? `**${countLabel}** — next cursor: \`${result.meta.next_cursor}\``
|
|
140
|
+
: `**${countLabel}**`);
|
|
92
141
|
if (result.results.length === 0) {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const lines = [`**${result.meta.count.toLocaleString()} result(s)**`, ''];
|
|
96
|
-
for (const r of result.results) {
|
|
97
|
-
const rec = r;
|
|
98
|
-
lines.push(`## ${r.display_name}`);
|
|
99
|
-
lines.push(`**ID:** ${r.id}`);
|
|
100
|
-
// Identifiers
|
|
101
|
-
if (rec.doi)
|
|
102
|
-
lines.push(`**DOI:** ${rec.doi}`);
|
|
103
|
-
if (rec.orcid)
|
|
104
|
-
lines.push(`**ORCID:** ${rec.orcid}`);
|
|
105
|
-
if (rec.ror)
|
|
106
|
-
lines.push(`**ROR:** ${rec.ror}`);
|
|
107
|
-
if (rec.issn_l)
|
|
108
|
-
lines.push(`**ISSN:** ${rec.issn_l}`);
|
|
109
|
-
// Classification
|
|
110
|
-
if (rec.publication_year)
|
|
111
|
-
lines.push(`**Year:** ${rec.publication_year}`);
|
|
112
|
-
if (rec.type)
|
|
113
|
-
lines.push(`**Type:** ${rec.type}`);
|
|
114
|
-
if (rec.country_code)
|
|
115
|
-
lines.push(`**Country:** ${rec.country_code}`);
|
|
116
|
-
if (Array.isArray(rec.country_codes) && rec.country_codes.length)
|
|
117
|
-
lines.push(`**Countries:** ${rec.country_codes.join(', ')}`);
|
|
118
|
-
// Metrics
|
|
119
|
-
const metrics = [];
|
|
120
|
-
if (typeof rec.cited_by_count === 'number')
|
|
121
|
-
metrics.push(`Citations: ${rec.cited_by_count.toLocaleString()}`);
|
|
122
|
-
if (typeof rec.works_count === 'number')
|
|
123
|
-
metrics.push(`Works: ${rec.works_count.toLocaleString()}`);
|
|
124
|
-
if (metrics.length)
|
|
125
|
-
lines.push(`**Metrics:** ${metrics.join(' | ')}`);
|
|
126
|
-
// Open access
|
|
127
|
-
if (rec.open_access && typeof rec.open_access === 'object') {
|
|
128
|
-
const oa = rec.open_access;
|
|
129
|
-
const parts = [];
|
|
130
|
-
if (oa.oa_status)
|
|
131
|
-
parts.push(String(oa.oa_status));
|
|
132
|
-
else if (typeof oa.is_oa === 'boolean')
|
|
133
|
-
parts.push(oa.is_oa ? 'open' : 'closed');
|
|
134
|
-
if (oa.oa_url)
|
|
135
|
-
parts.push(String(oa.oa_url));
|
|
136
|
-
if (parts.length)
|
|
137
|
-
lines.push(`**Open Access:** ${parts.join(' — ')}`);
|
|
138
|
-
}
|
|
139
|
-
if (typeof rec.is_oa === 'boolean')
|
|
140
|
-
lines.push(`**Open Access:** ${rec.is_oa ? 'Yes' : 'No'}`);
|
|
141
|
-
// Location / source
|
|
142
|
-
if (rec.primary_location && typeof rec.primary_location === 'object') {
|
|
143
|
-
const loc = rec.primary_location;
|
|
144
|
-
const source = loc.source;
|
|
145
|
-
if (source?.display_name)
|
|
146
|
-
lines.push(`**Source:** ${source.display_name}`);
|
|
147
|
-
}
|
|
148
|
-
if (rec.host_organization_name)
|
|
149
|
-
lines.push(`**Publisher:** ${rec.host_organization_name}`);
|
|
150
|
-
// Topic hierarchy (works)
|
|
151
|
-
if (rec.primary_topic && typeof rec.primary_topic === 'object') {
|
|
152
|
-
const t = rec.primary_topic;
|
|
153
|
-
const hierarchy = [
|
|
154
|
-
t.domain?.display_name,
|
|
155
|
-
t.field?.display_name,
|
|
156
|
-
t.subfield?.display_name,
|
|
157
|
-
t.display_name,
|
|
158
|
-
].filter(Boolean);
|
|
159
|
-
if (hierarchy.length)
|
|
160
|
-
lines.push(`**Topic:** ${hierarchy.join(' > ')}`);
|
|
161
|
-
}
|
|
162
|
-
// Topic entity fields (domain/field/subfield at top level)
|
|
163
|
-
if (rec.domain && typeof rec.domain === 'object') {
|
|
164
|
-
const d = rec.domain;
|
|
165
|
-
if (d.display_name)
|
|
166
|
-
lines.push(`**Domain:** ${d.display_name}`);
|
|
167
|
-
}
|
|
168
|
-
if (rec.field && typeof rec.field === 'object') {
|
|
169
|
-
const f = rec.field;
|
|
170
|
-
if (f.display_name)
|
|
171
|
-
lines.push(`**Field:** ${f.display_name}`);
|
|
172
|
-
}
|
|
173
|
-
if (rec.subfield && typeof rec.subfield === 'object') {
|
|
174
|
-
const s = rec.subfield;
|
|
175
|
-
if (s.display_name)
|
|
176
|
-
lines.push(`**Subfield:** ${s.display_name}`);
|
|
177
|
-
}
|
|
178
|
-
if (typeof rec.description === 'string')
|
|
179
|
-
lines.push(`**Description:** ${rec.description}`);
|
|
180
|
-
if (Array.isArray(rec.keywords) && rec.keywords.length > 0) {
|
|
181
|
-
const kws = rec.keywords
|
|
182
|
-
.map((k) => (typeof k === 'string' ? k : k.display_name))
|
|
183
|
-
.filter(Boolean);
|
|
184
|
-
if (kws.length)
|
|
185
|
-
lines.push(`**Keywords:** ${kws.join(', ')}`);
|
|
186
|
-
}
|
|
187
|
-
// Author affiliations
|
|
188
|
-
if (Array.isArray(rec.last_known_institutions) && rec.last_known_institutions.length > 0) {
|
|
189
|
-
const insts = rec.last_known_institutions
|
|
190
|
-
.map((i) => i.display_name)
|
|
191
|
-
.filter(Boolean);
|
|
192
|
-
if (insts.length)
|
|
193
|
-
lines.push(`**Institution(s):** ${insts.join(', ')}`);
|
|
194
|
-
}
|
|
195
|
-
// Author summary stats
|
|
196
|
-
if (rec.summary_stats && typeof rec.summary_stats === 'object') {
|
|
197
|
-
const stats = rec.summary_stats;
|
|
198
|
-
const parts = [];
|
|
199
|
-
if (typeof stats.h_index === 'number')
|
|
200
|
-
parts.push(`h-index: ${stats.h_index}`);
|
|
201
|
-
if (typeof stats.i10_index === 'number')
|
|
202
|
-
parts.push(`i10-index: ${stats.i10_index}`);
|
|
203
|
-
if (typeof stats['2yr_mean_citedness'] === 'number')
|
|
204
|
-
parts.push(`2yr mean citedness: ${stats['2yr_mean_citedness'].toFixed(2)}`);
|
|
205
|
-
if (parts.length)
|
|
206
|
-
lines.push(`**Stats:** ${parts.join(' | ')}`);
|
|
207
|
-
}
|
|
208
|
-
// Author top topics
|
|
209
|
-
if (Array.isArray(rec.topics) && rec.topics.length > 0) {
|
|
210
|
-
const topTopics = rec.topics
|
|
211
|
-
.slice(0, 5)
|
|
212
|
-
.map((t) => t.display_name)
|
|
213
|
-
.filter(Boolean);
|
|
214
|
-
if (topTopics.length)
|
|
215
|
-
lines.push(`**Top Topics:** ${topTopics.join(', ')}`);
|
|
216
|
-
}
|
|
217
|
-
// Full-record fields (single entity lookups)
|
|
218
|
-
if (typeof rec.abstract === 'string')
|
|
219
|
-
lines.push(`**Abstract:** ${rec.abstract}`);
|
|
220
|
-
if (Array.isArray(rec.authorships) && rec.authorships.length > 0) {
|
|
221
|
-
const authors = rec.authorships.map((a) => {
|
|
222
|
-
const author = a.author;
|
|
223
|
-
const name = author?.display_name ?? 'Unknown';
|
|
224
|
-
const insts = a.institutions;
|
|
225
|
-
const inst = insts?.[0]?.display_name;
|
|
226
|
-
return inst ? `${name} (${inst})` : String(name);
|
|
227
|
-
});
|
|
228
|
-
lines.push(`**Authors:** ${authors.join('; ')}`);
|
|
229
|
-
}
|
|
230
|
-
lines.push('');
|
|
142
|
+
lines.push('', 'No matches.');
|
|
143
|
+
return [{ type: 'text', text: lines.join('\n') }];
|
|
231
144
|
}
|
|
232
|
-
|
|
233
|
-
lines.push(
|
|
145
|
+
for (const record of result.results) {
|
|
146
|
+
lines.push(...renderRecord(record));
|
|
234
147
|
}
|
|
235
|
-
return [{ type: 'text', text: lines.join('\n')
|
|
148
|
+
return [{ type: 'text', text: lines.join('\n') }];
|
|
236
149
|
},
|
|
237
150
|
});
|
|
238
151
|
//# sourceMappingURL=search-entities.tool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-entities.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-entities.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"search-entities.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-entities.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,8 @@ declare class OpenAlexService {
|
|
|
10
10
|
constructor();
|
|
11
11
|
/** Execute an HTTP request against the OpenAlex API with retry on transient failures. */
|
|
12
12
|
private request;
|
|
13
|
+
private throwNormalizedRequestError;
|
|
14
|
+
private parseResponse;
|
|
13
15
|
/** Search/filter/sort entities, or retrieve a single entity by ID. */
|
|
14
16
|
search(params: SearchParams, ctx: Context): Promise<SearchResult>;
|
|
15
17
|
/** Group-by aggregation. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openalex-service.d.ts","sourceRoot":"","sources":["../../../src/services/openalex/openalex-service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"openalex-service.d.ts","sourceRoot":"","sources":["../../../src/services/openalex/openalex-service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAiBtD,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EAIvB,KAAK,YAAY,EACjB,KAAK,YAAY,EAClB,MAAM,YAAY,CAAC;AAqKpB,cAAM,eAAe;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;;IAQhC,yFAAyF;IACzF,OAAO,CAAC,OAAO;IAkCf,OAAO,CAAC,2BAA2B;IA0CnC,OAAO,CAAC,aAAa;IA6BrB,sEAAsE;IAChE,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC;IA6DvE,4BAA4B;IACtB,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC;IAgC1E,oCAAoC;IAC9B,YAAY,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAuB1F;AAID,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED,wBAAgB,kBAAkB,IAAI,eAAe,CAIpD"}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* @fileoverview OpenAlex API client service. Handles all communication with the OpenAlex REST API.
|
|
3
3
|
* @module services/openalex/openalex-service
|
|
4
4
|
*/
|
|
5
|
-
import { notFound, serviceUnavailable } from '@cyanheads/mcp-ts-core/errors';
|
|
5
|
+
import { conflict, forbidden, invalidParams, McpError, notFound, rateLimited, serviceUnavailable, timeout, unauthorized, } from '@cyanheads/mcp-ts-core/errors';
|
|
6
|
+
import { fetchWithTimeout, withRetry } from '@cyanheads/mcp-ts-core/utils';
|
|
6
7
|
import { getServerConfig } from '../../config/server-config.js';
|
|
7
8
|
import { DEFAULT_SELECT, ENTITY_TYPES, } from './types.js';
|
|
8
9
|
/**
|
|
@@ -64,6 +65,8 @@ function normalizeId(id) {
|
|
|
64
65
|
/**
|
|
65
66
|
* Reconstruct abstract text from OpenAlex's inverted index format.
|
|
66
67
|
* The API stores abstracts as { word: [position, ...] } — we reverse this to plaintext.
|
|
68
|
+
* Inverted indices are ~2x the token cost of plaintext for the same information, so
|
|
69
|
+
* we collapse them when present and drop the raw index to keep responses lean.
|
|
67
70
|
*/
|
|
68
71
|
function reconstructAbstract(invertedIndex) {
|
|
69
72
|
const words = [];
|
|
@@ -75,24 +78,72 @@ function reconstructAbstract(invertedIndex) {
|
|
|
75
78
|
words.sort((a, b) => a[0] - b[0]);
|
|
76
79
|
return words.map(([, word]) => word).join(' ');
|
|
77
80
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
*/
|
|
81
|
-
function processResults(results) {
|
|
82
|
-
for (const record of results) {
|
|
83
|
-
if (record.abstract_inverted_index &&
|
|
84
|
-
typeof record.abstract_inverted_index === 'object' &&
|
|
85
|
-
!Array.isArray(record.abstract_inverted_index)) {
|
|
86
|
-
record.abstract = reconstructAbstract(record.abstract_inverted_index);
|
|
87
|
-
delete record.abstract_inverted_index;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
return results;
|
|
81
|
+
function isRecord(value) {
|
|
82
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
91
83
|
}
|
|
92
|
-
|
|
84
|
+
function hasAbstractInvertedIndex(record) {
|
|
85
|
+
return isRecord(record.abstract_inverted_index);
|
|
86
|
+
}
|
|
87
|
+
function normalizeEntityRecord(record) {
|
|
88
|
+
if (!hasAbstractInvertedIndex(record))
|
|
89
|
+
return record;
|
|
90
|
+
const { abstract_inverted_index, ...rest } = record;
|
|
91
|
+
return {
|
|
92
|
+
...rest,
|
|
93
|
+
abstract: reconstructAbstract(abstract_inverted_index),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function normalizeEntityRecords(results) {
|
|
97
|
+
return results.map(normalizeEntityRecord);
|
|
98
|
+
}
|
|
99
|
+
const MAX_ATTEMPTS = 3;
|
|
93
100
|
const BASE_BACKOFF_MS = 1000;
|
|
94
|
-
|
|
95
|
-
|
|
101
|
+
const REQUEST_TIMEOUT_MS = 10_000;
|
|
102
|
+
const KNOWN_AUTOCOMPLETE_TYPES = new Set(ENTITY_TYPES.map((type) => type.replace(/s$/, '')));
|
|
103
|
+
function hasEntries(record) {
|
|
104
|
+
return record !== undefined && Object.keys(record).length > 0;
|
|
105
|
+
}
|
|
106
|
+
function parseOpenAlexErrorBody(responseBody) {
|
|
107
|
+
if (typeof responseBody !== 'string')
|
|
108
|
+
return null;
|
|
109
|
+
try {
|
|
110
|
+
const parsed = JSON.parse(responseBody);
|
|
111
|
+
if (!isRecord(parsed))
|
|
112
|
+
return null;
|
|
113
|
+
return {
|
|
114
|
+
error: typeof parsed.error === 'string' ? parsed.error : undefined,
|
|
115
|
+
message: typeof parsed.message === 'string' ? parsed.message : undefined,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function getSearchParamKey(searchMode) {
|
|
123
|
+
switch (searchMode) {
|
|
124
|
+
case 'exact':
|
|
125
|
+
return 'search.exact';
|
|
126
|
+
case 'semantic':
|
|
127
|
+
return 'search.semantic';
|
|
128
|
+
default:
|
|
129
|
+
return 'search';
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function normalizeSort(sort) {
|
|
133
|
+
if (!sort)
|
|
134
|
+
return;
|
|
135
|
+
return sort.startsWith('-') ? `${sort.slice(1)}:desc` : sort;
|
|
136
|
+
}
|
|
137
|
+
function toRequestContext(ctx, operation) {
|
|
138
|
+
return {
|
|
139
|
+
requestId: ctx.requestId,
|
|
140
|
+
timestamp: ctx.timestamp,
|
|
141
|
+
operation,
|
|
142
|
+
...(ctx.auth !== undefined && { auth: ctx.auth }),
|
|
143
|
+
...(ctx.spanId !== undefined && { spanId: ctx.spanId }),
|
|
144
|
+
...(ctx.tenantId !== undefined && { tenantId: ctx.tenantId }),
|
|
145
|
+
...(ctx.traceId !== undefined && { traceId: ctx.traceId }),
|
|
146
|
+
};
|
|
96
147
|
}
|
|
97
148
|
class OpenAlexService {
|
|
98
149
|
baseUrl;
|
|
@@ -103,7 +154,9 @@ class OpenAlexService {
|
|
|
103
154
|
this.apiKey = config.apiKey;
|
|
104
155
|
}
|
|
105
156
|
/** Execute an HTTP request against the OpenAlex API with retry on transient failures. */
|
|
106
|
-
|
|
157
|
+
request(path, params, ctx) {
|
|
158
|
+
const operation = `OpenAlex ${path}`;
|
|
159
|
+
const requestContext = toRequestContext(ctx, operation);
|
|
107
160
|
const url = new URL(`${this.baseUrl}${path}`);
|
|
108
161
|
url.searchParams.set('mailto', this.apiKey);
|
|
109
162
|
for (const [key, value] of Object.entries(params)) {
|
|
@@ -111,79 +164,114 @@ class OpenAlexService {
|
|
|
111
164
|
url.searchParams.set(key, value);
|
|
112
165
|
}
|
|
113
166
|
ctx.log.debug('OpenAlex request', { path, params: Object.keys(params) });
|
|
114
|
-
|
|
115
|
-
const response = await fetch(url.toString(), {
|
|
116
|
-
headers: { Accept: 'application/json' },
|
|
117
|
-
signal: ctx.signal,
|
|
118
|
-
});
|
|
119
|
-
if (response.ok)
|
|
120
|
-
return response.json();
|
|
121
|
-
if (response.status === 404) {
|
|
122
|
-
throw notFound(`Entity not found at ${path}`, { path, status: 404 });
|
|
123
|
-
}
|
|
124
|
-
const retryable = response.status === 429 ||
|
|
125
|
-
response.status === 500 ||
|
|
126
|
-
response.status === 502 ||
|
|
127
|
-
response.status === 503 ||
|
|
128
|
-
response.status === 504;
|
|
129
|
-
if (retryable && attempt < MAX_RETRIES - 1) {
|
|
130
|
-
await sleep(BASE_BACKOFF_MS * 2 ** attempt);
|
|
131
|
-
continue;
|
|
132
|
-
}
|
|
133
|
-
const body = await response.text().catch(() => '');
|
|
134
|
-
let detail = '';
|
|
167
|
+
return withRetry(async () => {
|
|
135
168
|
try {
|
|
136
|
-
const
|
|
137
|
-
|
|
169
|
+
const response = await fetchWithTimeout(url, REQUEST_TIMEOUT_MS, requestContext, {
|
|
170
|
+
headers: { Accept: 'application/json' },
|
|
171
|
+
signal: ctx.signal,
|
|
172
|
+
});
|
|
173
|
+
const text = await response.text();
|
|
174
|
+
return this.parseResponse(text, path);
|
|
138
175
|
}
|
|
139
|
-
catch {
|
|
140
|
-
|
|
141
|
-
.replace(/<[^>]*>/g, '')
|
|
142
|
-
.trim()
|
|
143
|
-
.slice(0, 200);
|
|
176
|
+
catch (error) {
|
|
177
|
+
this.throwNormalizedRequestError(error, path);
|
|
144
178
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
179
|
+
}, {
|
|
180
|
+
operation,
|
|
181
|
+
context: requestContext,
|
|
182
|
+
baseDelayMs: BASE_BACKOFF_MS,
|
|
183
|
+
maxRetries: MAX_ATTEMPTS - 1,
|
|
184
|
+
signal: ctx.signal,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
throwNormalizedRequestError(error, path) {
|
|
188
|
+
if (!(error instanceof McpError) || typeof error.data?.statusCode !== 'number') {
|
|
189
|
+
throw error;
|
|
190
|
+
}
|
|
191
|
+
const statusCode = error.data.statusCode;
|
|
192
|
+
const upstream = parseOpenAlexErrorBody(error.data.responseBody);
|
|
193
|
+
const message = upstream?.message ?? error.message;
|
|
194
|
+
const data = {
|
|
195
|
+
...error.data,
|
|
196
|
+
path,
|
|
197
|
+
...(upstream?.error ? { upstreamError: upstream.error } : {}),
|
|
198
|
+
...(upstream?.message ? { upstreamMessage: upstream.message } : {}),
|
|
199
|
+
};
|
|
200
|
+
const rethrow = (factory, nextMessage = message) => {
|
|
201
|
+
throw factory(nextMessage, data, { cause: error });
|
|
202
|
+
};
|
|
203
|
+
switch (statusCode) {
|
|
204
|
+
case 400:
|
|
205
|
+
case 422:
|
|
206
|
+
return rethrow(invalidParams);
|
|
207
|
+
case 401:
|
|
208
|
+
return rethrow(unauthorized);
|
|
209
|
+
case 403:
|
|
210
|
+
return rethrow(forbidden);
|
|
211
|
+
case 404:
|
|
212
|
+
return rethrow(notFound, upstream?.message ?? `Entity not found at ${path}`);
|
|
213
|
+
case 408:
|
|
214
|
+
return rethrow(timeout);
|
|
215
|
+
case 409:
|
|
216
|
+
return rethrow(conflict);
|
|
217
|
+
case 429:
|
|
218
|
+
return rethrow(rateLimited);
|
|
219
|
+
default:
|
|
220
|
+
if (statusCode >= 400 && statusCode < 500) {
|
|
221
|
+
return rethrow(invalidParams);
|
|
222
|
+
}
|
|
223
|
+
throw error;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
parseResponse(text, path) {
|
|
227
|
+
const trimmed = text.trim();
|
|
228
|
+
const responsePreview = trimmed.slice(0, 200);
|
|
229
|
+
if (!trimmed) {
|
|
230
|
+
throw serviceUnavailable(`OpenAlex API returned an empty response for ${path}`, { path });
|
|
231
|
+
}
|
|
232
|
+
if (/^<(!DOCTYPE\s+html|html[\s>])/i.test(trimmed)) {
|
|
233
|
+
throw serviceUnavailable(`OpenAlex API returned HTML instead of JSON for ${path}`, {
|
|
234
|
+
path,
|
|
235
|
+
responsePreview,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
try {
|
|
239
|
+
return JSON.parse(trimmed);
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
throw serviceUnavailable(`OpenAlex API returned invalid JSON for ${path}`, {
|
|
243
|
+
path,
|
|
244
|
+
responsePreview,
|
|
245
|
+
}, { cause: error });
|
|
149
246
|
}
|
|
150
|
-
throw serviceUnavailable(`OpenAlex API request failed after ${MAX_RETRIES} attempts`, { path });
|
|
151
247
|
}
|
|
152
248
|
/** Search/filter/sort entities, or retrieve a single entity by ID. */
|
|
153
249
|
async search(params, ctx) {
|
|
154
250
|
// Singleton lookup by ID
|
|
155
251
|
if (params.id) {
|
|
156
252
|
const normalizedId = normalizeId(params.id);
|
|
157
|
-
const queryParams = {};
|
|
158
|
-
if (params.select?.length) {
|
|
159
|
-
queryParams.select = params.select.join(',');
|
|
160
|
-
}
|
|
253
|
+
const queryParams = params.select?.length ? { select: params.select.join(',') } : {};
|
|
161
254
|
const data = (await this.request(`/${params.entityType}/${normalizedId}`, queryParams, ctx));
|
|
162
|
-
const results = processResults([data]);
|
|
163
255
|
return {
|
|
164
256
|
meta: { count: 1, per_page: 1, next_cursor: null },
|
|
165
|
-
results,
|
|
257
|
+
results: normalizeEntityRecords([data]),
|
|
166
258
|
};
|
|
167
259
|
}
|
|
168
260
|
// Search/filter/list
|
|
169
261
|
const queryParams = {};
|
|
170
262
|
if (params.query) {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
? 'search.semantic'
|
|
175
|
-
: 'search';
|
|
176
|
-
queryParams[searchKey] = params.query;
|
|
177
|
-
}
|
|
178
|
-
if (params.filters && Object.keys(params.filters).length > 0) {
|
|
263
|
+
queryParams[getSearchParamKey(params.searchMode)] = params.query;
|
|
264
|
+
}
|
|
265
|
+
if (hasEntries(params.filters)) {
|
|
179
266
|
queryParams.filter = buildFilterString(params.filters);
|
|
180
267
|
}
|
|
181
|
-
|
|
268
|
+
const sort = normalizeSort(params.sort);
|
|
269
|
+
if (sort) {
|
|
182
270
|
// Translate "-field" prefix to "field:desc" (OpenAlex API syntax)
|
|
183
|
-
queryParams.sort =
|
|
271
|
+
queryParams.sort = sort;
|
|
184
272
|
}
|
|
185
273
|
const select = params.select?.length ? params.select : DEFAULT_SELECT[params.entityType];
|
|
186
|
-
if (select
|
|
274
|
+
if (select.length > 0) {
|
|
187
275
|
queryParams.select = select.join(',');
|
|
188
276
|
}
|
|
189
277
|
queryParams.per_page = String(params.perPage ?? 25);
|
|
@@ -197,7 +285,7 @@ class OpenAlexService {
|
|
|
197
285
|
...data.meta,
|
|
198
286
|
next_cursor: data.meta.next_cursor ?? null,
|
|
199
287
|
},
|
|
200
|
-
results:
|
|
288
|
+
results: normalizeEntityRecords(data.results),
|
|
201
289
|
};
|
|
202
290
|
}
|
|
203
291
|
/** Group-by aggregation. */
|
|
@@ -206,7 +294,7 @@ class OpenAlexService {
|
|
|
206
294
|
queryParams.group_by = params.includeUnknown
|
|
207
295
|
? `${params.groupBy}:include_unknown`
|
|
208
296
|
: params.groupBy;
|
|
209
|
-
if (
|
|
297
|
+
if (hasEntries(params.filters)) {
|
|
210
298
|
queryParams.filter = buildFilterString(params.filters);
|
|
211
299
|
}
|
|
212
300
|
// Only send cursor when explicitly provided — boolean group_by fields
|
|
@@ -230,16 +318,15 @@ class OpenAlexService {
|
|
|
230
318
|
const queryParams = {
|
|
231
319
|
q: params.query,
|
|
232
320
|
};
|
|
233
|
-
if (
|
|
321
|
+
if (hasEntries(params.filters)) {
|
|
234
322
|
queryParams.filter = buildFilterString(params.filters);
|
|
235
323
|
}
|
|
236
324
|
const data = (await this.request(path, queryParams, ctx));
|
|
237
325
|
// Cross-entity autocomplete can return types not in our enum (country, license, etc.).
|
|
238
326
|
// Filter to known entity types so callers can use results in other tools directly.
|
|
239
|
-
const knownTypes = new Set(ENTITY_TYPES.map((t) => t.replace(/s$/, '')));
|
|
240
327
|
const results = params.entityType
|
|
241
328
|
? data.results
|
|
242
|
-
: data.results.filter((r) =>
|
|
329
|
+
: data.results.filter((r) => KNOWN_AUTOCOMPLETE_TYPES.has(r.entity_type));
|
|
243
330
|
return { results };
|
|
244
331
|
}
|
|
245
332
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openalex-service.js","sourceRoot":"","sources":["../../../src/services/openalex/openalex-service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"openalex-service.js","sourceRoot":"","sources":["../../../src/services/openalex/openalex-service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cyanheads/openalex-mcp-server",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.3",
|
|
4
4
|
"description": "Access the OpenAlex academic research catalog - 270M+ publications through MCP. STDIO & Streamable HTTP.",
|
|
5
5
|
"mcpName": "io.github.cyanheads/openalex-mcp-server",
|
|
6
6
|
"type": "module",
|
|
@@ -67,17 +67,17 @@
|
|
|
67
67
|
"access": "public"
|
|
68
68
|
},
|
|
69
69
|
"dependencies": {
|
|
70
|
-
"@cyanheads/mcp-ts-core": "^0.
|
|
70
|
+
"@cyanheads/mcp-ts-core": "^0.3.5",
|
|
71
71
|
"pino-pretty": "^13.1.3"
|
|
72
72
|
},
|
|
73
73
|
"devDependencies": {
|
|
74
|
-
"@biomejs/biome": "^2.4.
|
|
75
|
-
"@types/node": "^25.
|
|
74
|
+
"@biomejs/biome": "^2.4.12",
|
|
75
|
+
"@types/node": "^25.6.0",
|
|
76
76
|
"depcheck": "^1.4.7",
|
|
77
77
|
"ignore": "^7.0.5",
|
|
78
78
|
"tsc-alias": "^1.8.16",
|
|
79
79
|
"tsx": "^4.21.0",
|
|
80
80
|
"typescript": "^6.0.2",
|
|
81
|
-
"vitest": "^4.1.
|
|
81
|
+
"vitest": "^4.1.4"
|
|
82
82
|
}
|
|
83
83
|
}
|
package/server.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"url": "https://github.com/cyanheads/openalex-mcp-server",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "0.3.
|
|
9
|
+
"version": "0.3.3",
|
|
10
10
|
"remotes": [
|
|
11
11
|
{
|
|
12
12
|
"type": "streamable-http",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
20
20
|
"identifier": "@cyanheads/openalex-mcp-server",
|
|
21
21
|
"runtimeHint": "node",
|
|
22
|
-
"version": "0.3.
|
|
22
|
+
"version": "0.3.3",
|
|
23
23
|
"packageArguments": [
|
|
24
24
|
{
|
|
25
25
|
"type": "positional",
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
62
62
|
"identifier": "@cyanheads/openalex-mcp-server",
|
|
63
63
|
"runtimeHint": "node",
|
|
64
|
-
"version": "0.3.
|
|
64
|
+
"version": "0.3.3",
|
|
65
65
|
"packageArguments": [
|
|
66
66
|
{
|
|
67
67
|
"type": "positional",
|