@cyanheads/openalex-mcp-server 0.7.16 → 0.8.0

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.
Files changed (43) hide show
  1. package/AGENTS.md +32 -30
  2. package/CLAUDE.md +32 -30
  3. package/Dockerfile +88 -32
  4. package/README.md +6 -2
  5. package/changelog/0.8.x/0.8.0.md +38 -0
  6. package/dist/index.js +1 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/mcp-server/prompts/definitions/literature-review.prompt.js +1 -1
  9. package/dist/mcp-server/tools/definitions/analyze-trends.tool.d.ts +1 -1
  10. package/dist/mcp-server/tools/definitions/analyze-trends.tool.d.ts.map +1 -1
  11. package/dist/mcp-server/tools/definitions/analyze-trends.tool.js +23 -6
  12. package/dist/mcp-server/tools/definitions/analyze-trends.tool.js.map +1 -1
  13. package/dist/mcp-server/tools/definitions/citation-graph.tool.d.ts +21 -1
  14. package/dist/mcp-server/tools/definitions/citation-graph.tool.d.ts.map +1 -1
  15. package/dist/mcp-server/tools/definitions/citation-graph.tool.js +42 -42
  16. package/dist/mcp-server/tools/definitions/citation-graph.tool.js.map +1 -1
  17. package/dist/mcp-server/tools/definitions/resolve-name.tool.d.ts +1 -1
  18. package/dist/mcp-server/tools/definitions/resolve-name.tool.js +1 -1
  19. package/dist/mcp-server/tools/definitions/resolve-name.tool.js.map +1 -1
  20. package/dist/mcp-server/tools/definitions/search-entities.tool.d.ts +35 -1
  21. package/dist/mcp-server/tools/definitions/search-entities.tool.d.ts.map +1 -1
  22. package/dist/mcp-server/tools/definitions/search-entities.tool.js +110 -62
  23. package/dist/mcp-server/tools/definitions/search-entities.tool.js.map +1 -1
  24. package/dist/mcp-server/tools/render-entity-record.d.ts +12 -1
  25. package/dist/mcp-server/tools/render-entity-record.d.ts.map +1 -1
  26. package/dist/mcp-server/tools/render-entity-record.js +23 -8
  27. package/dist/mcp-server/tools/render-entity-record.js.map +1 -1
  28. package/dist/mcp-server/tools/response-budget.d.ts +159 -0
  29. package/dist/mcp-server/tools/response-budget.d.ts.map +1 -0
  30. package/dist/mcp-server/tools/response-budget.js +480 -0
  31. package/dist/mcp-server/tools/response-budget.js.map +1 -0
  32. package/dist/services/openalex/openalex-service.d.ts +13 -0
  33. package/dist/services/openalex/openalex-service.d.ts.map +1 -1
  34. package/dist/services/openalex/openalex-service.js +46 -34
  35. package/dist/services/openalex/openalex-service.js.map +1 -1
  36. package/dist/services/openalex/provider-text.d.ts +12 -5
  37. package/dist/services/openalex/provider-text.d.ts.map +1 -1
  38. package/dist/services/openalex/provider-text.js +357 -33
  39. package/dist/services/openalex/provider-text.js.map +1 -1
  40. package/dist/services/openalex/types.d.ts +1 -1
  41. package/dist/services/openalex/types.js +1 -1
  42. package/package.json +8 -7
  43. package/server.json +3 -3
@@ -1,10 +1,14 @@
1
1
  /**
2
2
  * @fileoverview Normalization of provider text — the titles, abstracts, names, and affiliation
3
3
  * strings OpenAlex passes through from its sources unsanitized. Decodes HTML character
4
- * references against the full WHATWG table in one pass, then removes HTML comments and unwraps
5
- * a small allowlist of HTML/JATS/MathML elements. Everything else stays literal, so text such as
6
- * `A < B`, `Fish <Actinopterygii>`, or a SICI DOI survives untouched. Output is plain text;
7
- * Markdown escaping for `content[]` happens at the render boundary, never here.
4
+ * references against the full WHATWG table in one pass, then, in a second single pass, removes
5
+ * HTML comments, unwraps a small allowlist of HTML/JATS/MathML elements, unwraps CDATA sections
6
+ * and IOP's `<?CDATA …?>` instructions, drops the `<?MML …?>` instructions that restate them, and
7
+ * turns a double-escaped line break (a literal backslash + `n`) into a space. Everything else
8
+ * stays literal, so text such as `A < B`, `Fish <Actinopterygii>`, a SICI DOI, or TeX like `\nu`
9
+ * survives untouched. Output is plain text; Markdown escaping for `content[]` happens at the
10
+ * render boundary, never here. Identifier and URL fields of a record are not provider text and
11
+ * pass through byte-identical, so each one resolves when passed back.
8
12
  * @module services/openalex/provider-text
9
13
  */
10
14
  import entityTable from './html-entities.json' with { type: 'json' };
@@ -146,6 +150,12 @@ const SCRIPT_OPENERS = new Map([
146
150
  ]);
147
151
  /** A complete tag, checked against one `<…>` candidate that holds no other `<` or `>`. */
148
152
  const TAG = /^<(\/?)([A-Za-z][\w:.-]*)(?:\s[^<>]*)?\/?>$/;
153
+ function isAllowlistedElement(name) {
154
+ return (INLINE_ELEMENTS.has(name) ||
155
+ name.startsWith('mml:') ||
156
+ BLOCK_ELEMENTS.has(name) ||
157
+ SCRIPT_OPENERS.has(name));
158
+ }
149
159
  /**
150
160
  * What an allowlisted tag becomes, or `undefined` for any other `<…>` span, which stays literal.
151
161
  * Matching a whole tag name — never a prefix — is what keeps `i1<i2<` and `<Actinopterygii>`.
@@ -170,6 +180,35 @@ function replaceTag(candidate) {
170
180
  const COMMENT_OPEN = '<!--';
171
181
  /** `<!---->` — the shortest span that closes a comment it opened. */
172
182
  const MIN_COMMENT_LENGTH = 7;
183
+ /**
184
+ * `<!--inline-formula>`: an A&A/JATS formula opener written as a comment opener that never
185
+ * closes. An allowlisted name straight after `<!--` makes it a tag to remove, not a comment —
186
+ * left open, it would delete everything up to the next `-->`, which math text supplies as an
187
+ * arrow (`--->`). A space after `<!--`, as every real comment in the corpus has, keeps it a
188
+ * comment. The length cap bounds the check to the one `>` that can end such a name.
189
+ */
190
+ const FORMULA_OPENER = /^<!--([A-Za-z][\w:.-]*)>$/;
191
+ const MAX_FORMULA_OPENER_LENGTH = 64;
192
+ const CDATA_OPEN = '<![CDATA[';
193
+ const CDATA_CLOSE = ']]>';
194
+ /** The closer without its `>`, which some sources end a section with. */
195
+ const CDATA_BARE_CLOSE = ']]';
196
+ /**
197
+ * Processing instructions IOP wraps inline math in: `<?CDATA x?>` carries the TeX and is
198
+ * unwrapped; the `<?MML y?>` that always follows restates it flattened (`10^4` reads `10 4`) and
199
+ * is removed whole. Only these two targets — a generic `<?name` rule would eat `<?php` text.
200
+ */
201
+ const INSTRUCTION_CDATA = '<?CDATA';
202
+ const INSTRUCTION_MML = '<?MML';
203
+ const INSTRUCTION_CLOSE = '?>';
204
+ /**
205
+ * The longest `<?MML … ?>` removed, `<?MML` through `?>`. Every one in a 3,543-record sample
206
+ * spans at most 64 characters; one that runs longer lost its `?>` and stays literal rather than
207
+ * deleting prose up to some later `?>`.
208
+ */
209
+ const MAX_MML_SPAN = 128;
210
+ /** A double-escaped line break: the two characters `\` and `n`, not a newline. */
211
+ const LITERAL_NEWLINE = '\\n';
173
212
  function endsWith(out, suffix) {
174
213
  if (out.length < suffix.length)
175
214
  return false;
@@ -179,50 +218,284 @@ function endsWith(out, suffix) {
179
218
  }
180
219
  return true;
181
220
  }
221
+ const isBlank = (ch) => ch === ' ' || ch === '\t';
222
+ const isAsciiLetter = (ch) => ch !== undefined && ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'));
223
+ /** Characters that end a processing-instruction target. */
224
+ const endsInstructionTarget = (ch) => ch === ' ' || ch === '\t' || ch === '\n' || ch === '\r' || ch === '?';
225
+ /** Whether `out` ends with a formula opener whose `<` sits at `start`. */
226
+ function isFormulaOpener(out, start) {
227
+ if (out.length - start > MAX_FORMULA_OPENER_LENGTH)
228
+ return false;
229
+ if (out[start + 1] !== '!' || !isAsciiLetter(out[start + COMMENT_OPEN.length]))
230
+ return false;
231
+ const name = FORMULA_OPENER.exec(out.slice(start).join(''))?.[1];
232
+ return name !== undefined && isAllowlistedElement(name.toLowerCase());
233
+ }
182
234
  /**
183
- * Remove HTML comments and rewrite allowlisted tags in one left-to-right pass, reaching the
184
- * result that repeating a regex replacement until nothing changes would reach — no allowlisted
185
- * tag can re-form in the output — in linear time. A replace-until-stable loop costs one full
186
- * pass per nesting level, which is quadratic on nested input such as `<<<i>i>i>`.
235
+ * Handle markup in one left-to-right pass, reaching the result that repeating a regex
236
+ * replacement until nothing changes would reach — no allowlisted tag, comment, or delimiter can
237
+ * re-form in the output — in linear time. A replace-until-stable loop costs one full pass per
238
+ * nesting level, which is quadratic on nested input such as `<<<i>i>i>`.
239
+ *
240
+ * Characters are copied to `out`. Removing a tag, comment, or delimiter can join the text on
241
+ * either side into a new one (`<<i>i>`, `<!-<!---->- x -->`, `<![CDA<i></i>TA[`), so every
242
+ * removal truncates `out` and scanning simply continues, and every delimiter is recognized by
243
+ * how `out` ends rather than by the input: `opens` holds the positions of each `<` that could
244
+ * still begin a tag, and `commentStart` the earliest unclosed `<!--`. A tag ends at the first `>`
245
+ * after its `<`, so a `>` settles the innermost open `<`: kept as text, it also blocks every `<`
246
+ * below it, except those before an unclosed comment, which come back into play if that comment
247
+ * closes. Each character is examined a bounded number of times.
248
+ *
249
+ * CDATA: the `<![CDATA[` opener is dropped where it forms and `cdataStart` marks where the
250
+ * section's text begins. `]]>` closes it. Sources also drop the `>`, so a bare `]]` followed by
251
+ * anything but `>` or `]` — the end of the text included — closes it as well, unless the text
252
+ * still holds a `]]>` before its next opener: then the `]]` belongs to the section, as in TeX's
253
+ * `k[[x]]`. A bare `]]` at most one space before an opener closed a section whose opener was
254
+ * lost, and goes with it. With no open section, `]]` and `]]>` are text.
187
255
  *
188
- * Characters are copied to `out`. Removing a tag or comment can join the text on either side
189
- * into a new one (`<<i>i>`, `<!-<!---->- x -->`), so every removal truncates `out` and scanning
190
- * simply continues: `opens` holds the positions of each `<` that could still begin a tag, and
191
- * `commentStart` the earliest unclosed `<!--`. A tag ends at the first `>` after its `<`, so a
192
- * `>` settles the innermost open `<`: kept as text, it also blocks every `<` below it, except
193
- * those before an unclosed comment, which come back into play if that comment closes. Each
194
- * character is examined a bounded number of times.
256
+ * `<?MML`: a pending instruction closes at the next `?>` unless another `<?` forms first or the
257
+ * span passes `MAX_MML_SPAN`; either way it stays literal, since its `?>` was lost. A `?>` that
258
+ * closes nothing is dropped when another pass would pair it with such a literal `<?MML` — no
259
+ * `<?` between them, within the cap — so the output stays a fixed point.
260
+ *
261
+ * Literal `\n`: sources that double-escaped their line breaks leave a backslash and an `n`. One
262
+ * whose backslash is not itself escaped and which no ASCII letter follows becomes a single
263
+ * space, merged with the spaces around it and dropped at either end of the text. Most wrap
264
+ * mid-sentence, so it is never a paragraph break. A letter after it reads as TeX (`\nu`,
265
+ * `\neq`, `\nabla`, a custom `\np`), and no local rule tells those from a glued `\nand`, so
266
+ * those stay. A backslash just before a removed opener forms one with the `n` after it; the
267
+ * section or instruction that opener began stays open.
195
268
  */
196
269
  function stripMarkup(text) {
197
- if (!text.includes('<'))
270
+ if (!text.includes('<') && !text.includes(LITERAL_NEWLINE))
198
271
  return text;
199
272
  const out = [];
200
273
  const opens = [];
274
+ const instructions = [];
201
275
  let commentStart = -1;
276
+ let cdataStart = -1;
277
+ /** A space standing where text was removed, dropped if nothing follows it. */
278
+ let softSpace = -1;
279
+ /** Swallow spaces and tabs up to the next other character. */
280
+ let skipBlanks = false;
281
+ /** An unescaped `\n` was just copied; the next character decides what it is. */
282
+ let newlinePending = false;
283
+ /** A pending `<?MML` was left literal, so a stray `?>` may pair with it on another pass. */
284
+ let literalMml = false;
285
+ /**
286
+ * Where the next `]]>` and `<![CDATA[` start in `text`, -1 for none. The scan position only
287
+ * advances, so each is searched again only once passed, and every search covers new ground.
288
+ */
289
+ let nextSectionClose = -2;
290
+ let nextSectionOpen = -2;
291
+ /** Whether `text` holds a `]]>` at or after `from`, before any further section opener. */
292
+ const sectionCloseAhead = (from) => {
293
+ if (nextSectionClose !== -1 && nextSectionClose < from) {
294
+ nextSectionClose = text.indexOf(CDATA_CLOSE, from);
295
+ }
296
+ if (nextSectionClose < 0)
297
+ return false;
298
+ if (nextSectionOpen !== -1 && nextSectionOpen < from) {
299
+ nextSectionOpen = text.indexOf(CDATA_OPEN, from);
300
+ }
301
+ return nextSectionOpen < 0 || nextSectionClose < nextSectionOpen;
302
+ };
303
+ const truncate = (length) => {
304
+ out.length = length;
305
+ while (opens.length > 0 && opens.at(-1) >= length)
306
+ opens.pop();
307
+ if (commentStart >= length)
308
+ commentStart = -1;
309
+ if (cdataStart > length)
310
+ cdataStart = -1;
311
+ while (instructions.length > 0) {
312
+ const { kind, start } = instructions.at(-1);
313
+ if (kind === 'mml' ? start < length : start <= length)
314
+ break;
315
+ instructions.pop();
316
+ }
317
+ if (softSpace >= length)
318
+ softSpace = -1;
319
+ };
320
+ /**
321
+ * Open a processing instruction when `out` ends with its target and `separator` ends that
322
+ * target — whitespace, a `?`, or the space or break a removal leaves. Returns whether the
323
+ * separator is consumed: the whitespace after a CDATA target only separates it from the content.
324
+ */
325
+ const openInstruction = (separator) => {
326
+ if (endsWith(out, INSTRUCTION_CDATA)) {
327
+ truncate(out.length - INSTRUCTION_CDATA.length);
328
+ instructions.push({ kind: 'cdata', start: out.length });
329
+ return separator !== '?';
330
+ }
331
+ if (endsWith(out, INSTRUCTION_MML)) {
332
+ instructions.push({ kind: 'mml', start: out.length - INSTRUCTION_MML.length });
333
+ }
334
+ return false;
335
+ };
336
+ /** Replace the `\n` that ends `out` with one space, merging the blanks before it. */
337
+ const replaceNewline = () => {
338
+ // Blanks before a section or instruction opener stay, so the opener keeps its position.
339
+ const instruction = instructions.at(-1);
340
+ const floor = Math.max(cdataStart, instruction?.start ?? -1);
341
+ let length = out.length - LITERAL_NEWLINE.length;
342
+ while (length > floor && length > 0 && isBlank(out[length - 1]))
343
+ length--;
344
+ // The backslash sits before a removed opener whose section or instruction the `n` began.
345
+ const reopenSection = cdataStart > length;
346
+ const reopenInstruction = instruction?.kind === 'cdata' && instruction.start > length;
347
+ truncate(length);
348
+ if (reopenSection)
349
+ cdataStart = length;
350
+ if (reopenInstruction)
351
+ instructions.push({ kind: 'cdata', start: length });
352
+ skipBlanks = true;
353
+ if (!openInstruction(' ') && length > 0 && !isBlank(out[length - 1])) {
354
+ out.push(' ');
355
+ softSpace = length;
356
+ }
357
+ };
358
+ /**
359
+ * Whether the `?>` ending `out` would close a literal `<?MML` on another pass: the nearest `<?`
360
+ * before it, within `MAX_MML_SPAN` of its end, begins one.
361
+ */
362
+ const pairsWithLiteralMml = () => {
363
+ const floor = Math.max(0, out.length - MAX_MML_SPAN);
364
+ for (let at = out.length - INSTRUCTION_CLOSE.length - 1; at >= floor; at--) {
365
+ if (out[at] !== '<' || out[at + 1] !== '?')
366
+ continue;
367
+ for (let i = 2; i < INSTRUCTION_MML.length; i++) {
368
+ if (out[at + i] !== INSTRUCTION_MML[i])
369
+ return false;
370
+ }
371
+ const separator = out[at + INSTRUCTION_MML.length];
372
+ return separator !== undefined && endsInstructionTarget(separator);
373
+ }
374
+ return false;
375
+ };
376
+ /** After removing a span: merge the blanks around it, and drop it cleanly at either end. */
377
+ const settleRemoval = () => {
378
+ if (out.length === 0) {
379
+ skipBlanks = true;
380
+ }
381
+ else if (isBlank(out.at(-1))) {
382
+ skipBlanks = true;
383
+ softSpace = out.length - 1;
384
+ }
385
+ };
386
+ const openSection = () => {
387
+ let start = out.length - CDATA_OPEN.length;
388
+ const gap = out[start - 1] === ' ' ? 1 : 0;
389
+ const lostClose = out[start - 1 - gap] === ']' && out[start - 2 - gap] === ']';
390
+ if (lostClose)
391
+ start -= CDATA_BARE_CLOSE.length + gap;
392
+ truncate(start);
393
+ if (lostClose && gap > 0 && out.length > 0 && !isBlank(out.at(-1)) && !openInstruction(' ')) {
394
+ out.push(' ');
395
+ }
396
+ // Sections do not nest; a second opener inside one only goes.
397
+ if (cdataStart < 0)
398
+ cdataStart = out.length;
399
+ };
400
+ let offset = 0;
202
401
  for (const ch of text) {
402
+ const at = offset;
403
+ offset += ch.length;
404
+ if (newlinePending) {
405
+ newlinePending = false;
406
+ if (!isAsciiLetter(ch))
407
+ replaceNewline();
408
+ }
409
+ if (skipBlanks) {
410
+ if (isBlank(ch))
411
+ continue;
412
+ skipBlanks = false;
413
+ }
414
+ if (cdataStart >= 0 &&
415
+ ch !== '>' &&
416
+ ch !== ']' &&
417
+ out.length - CDATA_BARE_CLOSE.length >= cdataStart &&
418
+ endsWith(out, CDATA_BARE_CLOSE) &&
419
+ !sectionCloseAhead(at)) {
420
+ truncate(out.length - CDATA_BARE_CLOSE.length);
421
+ cdataStart = -1;
422
+ // `x ]] y` leaves one space, not two.
423
+ if (isBlank(ch) && isBlank(out.at(-1)))
424
+ continue;
425
+ }
426
+ if (endsInstructionTarget(ch) && openInstruction(ch))
427
+ continue;
203
428
  out.push(ch);
429
+ if (ch === 'n' && out.at(-2) === '\\' && out.at(-3) !== '\\') {
430
+ newlinePending = true;
431
+ continue;
432
+ }
204
433
  if (ch === '<') {
205
434
  opens.push(out.length - 1);
206
435
  continue;
207
436
  }
437
+ if (ch === '[') {
438
+ if (endsWith(out, CDATA_OPEN))
439
+ openSection();
440
+ continue;
441
+ }
208
442
  if (ch === '-') {
209
443
  if (commentStart < 0 && endsWith(out, COMMENT_OPEN))
210
444
  commentStart = out.length - 4;
211
445
  continue;
212
446
  }
447
+ if (ch === '?') {
448
+ if (out.at(-2) === '<' && instructions.at(-1)?.kind === 'mml') {
449
+ instructions.pop();
450
+ literalMml = true;
451
+ }
452
+ continue;
453
+ }
213
454
  if (ch !== '>')
214
455
  continue;
456
+ if (cdataStart >= 0 &&
457
+ out.length - CDATA_CLOSE.length >= cdataStart &&
458
+ endsWith(out, CDATA_CLOSE)) {
459
+ truncate(out.length - CDATA_CLOSE.length);
460
+ cdataStart = -1;
461
+ continue;
462
+ }
463
+ if (endsWith(out, INSTRUCTION_CLOSE)) {
464
+ let instruction = instructions.at(-1);
465
+ if (instruction?.kind === 'mml' && out.length - instruction.start > MAX_MML_SPAN) {
466
+ instructions.pop();
467
+ instruction = instructions.at(-1);
468
+ }
469
+ if (instruction) {
470
+ instructions.pop();
471
+ if (instruction.kind === 'cdata') {
472
+ truncate(out.length - INSTRUCTION_CLOSE.length);
473
+ }
474
+ else {
475
+ truncate(instruction.start);
476
+ settleRemoval();
477
+ }
478
+ continue;
479
+ }
480
+ if (literalMml && pairsWithLiteralMml()) {
481
+ truncate(out.length - INSTRUCTION_CLOSE.length);
482
+ settleRemoval();
483
+ continue;
484
+ }
485
+ }
215
486
  if (commentStart >= 0 &&
216
487
  out.length - commentStart >= MIN_COMMENT_LENGTH &&
217
488
  endsWith(out, '-->')) {
218
- out.length = commentStart;
219
- commentStart = -1;
220
- while (opens.length > 0 && opens.at(-1) >= out.length)
221
- opens.pop();
489
+ truncate(commentStart);
222
490
  continue;
223
491
  }
224
- // Inside an unclosed comment, only a `<` opened after it can form a tag.
492
+ // Like a tag, a formula opener goes even inside an unclosed comment.
225
493
  const top = opens.at(-1);
494
+ if (top !== undefined && isFormulaOpener(out, top)) {
495
+ truncate(top);
496
+ continue;
497
+ }
498
+ // Inside an unclosed comment, only a `<` opened after it can form a tag.
226
499
  if (top === undefined || top <= commentStart)
227
500
  continue;
228
501
  opens.pop();
@@ -232,10 +505,21 @@ function stripMarkup(text) {
232
505
  opens.pop();
233
506
  continue;
234
507
  }
235
- out.length = top;
508
+ truncate(top);
509
+ if (replacement === PARAGRAPH_BREAK && openInstruction(replacement))
510
+ continue;
236
511
  if (replacement)
237
512
  out.push(replacement);
238
513
  }
514
+ if (newlinePending)
515
+ replaceNewline();
516
+ if (cdataStart >= 0 &&
517
+ out.length - CDATA_BARE_CLOSE.length >= cdataStart &&
518
+ endsWith(out, CDATA_BARE_CLOSE)) {
519
+ truncate(out.length - CDATA_BARE_CLOSE.length);
520
+ }
521
+ if (softSpace >= 0 && softSpace === out.length - 1)
522
+ out.length = softSpace;
239
523
  // A break element can only come from a block tag (input is copied one character at a time),
240
524
  // and one inside a comment was truncated with it.
241
525
  const stripped = out.join('');
@@ -259,18 +543,58 @@ export function normalizeProviderText(text) {
259
543
  function isRecord(value) {
260
544
  return value !== null && typeof value === 'object' && !Array.isArray(value);
261
545
  }
262
- /** Normalize every string leaf of a JSON value; keys, numbers, booleans, and nulls pass through. */
263
- export function normalizeProviderValue(value) {
546
+ /**
547
+ * Keys holding identifiers and URLs — what a caller passes back to look a record up, filter on,
548
+ * or open. Their strings stay byte-identical to upstream: OpenAlex stores some DOIs with a
549
+ * literal `&amp;`, and only that spelling resolves. Named by the key holding the string or the
550
+ * array of strings, at any depth: these, and any key ending in `_id`, `_ids`, `_url`, or
551
+ * `_lineage`. No display-text field (`title`, `display_name`, `abstract`, `raw_*`,
552
+ * `host_organization_name`, `description`, `hint`, …) matches.
553
+ */
554
+ const IDENTIFIER_KEYS = new Set([
555
+ 'doi',
556
+ 'host_organization',
557
+ 'id',
558
+ 'issn',
559
+ 'issn_l',
560
+ 'lineage',
561
+ 'orcid',
562
+ 'parent_publisher',
563
+ 'raw_orcid',
564
+ 'referenced_works',
565
+ 'related_works',
566
+ 'ror',
567
+ 'url',
568
+ 'wikidata',
569
+ ]);
570
+ const IDENTIFIER_SUFFIX = /_(?:id|ids|url|lineage)$/;
571
+ /** Objects whose every value is an identifier or URL (`ids.doi`, `content_urls.pdf`). */
572
+ const IDENTIFIER_MAPS = new Set(['content_urls', 'ids']);
573
+ function isIdentifierKey(key) {
574
+ return IDENTIFIER_KEYS.has(key) || IDENTIFIER_SUFFIX.test(key);
575
+ }
576
+ function normalizeLeaves(value, identifier) {
264
577
  if (typeof value === 'string')
265
- return normalizeProviderText(value);
578
+ return identifier ? value : normalizeProviderText(value);
266
579
  if (Array.isArray(value))
267
- return value.map(normalizeProviderValue);
268
- if (isRecord(value)) {
269
- const next = {};
270
- for (const [k, v] of Object.entries(value))
271
- next[k] = normalizeProviderValue(v);
272
- return next;
273
- }
274
- return value;
580
+ return value.map((item) => normalizeLeaves(item, identifier));
581
+ if (!isRecord(value))
582
+ return value;
583
+ // `fromEntries` defines each key as an own data property; assigning an own `__proto__` key
584
+ // onto an object literal would run the inherited setter and drop it. An object under an
585
+ // identifier key is still walked by its own keys, so a `display_name` inside it is normalized.
586
+ return Object.fromEntries(Object.entries(value).map(([key, item]) => [
587
+ key,
588
+ IDENTIFIER_MAPS.has(key) && isRecord(item)
589
+ ? item
590
+ : normalizeLeaves(item, isIdentifierKey(key)),
591
+ ]));
592
+ }
593
+ /**
594
+ * Normalize every string leaf of a JSON value except identifiers and URLs, which pass through
595
+ * byte-identical; keys, numbers, booleans, and nulls pass through too.
596
+ */
597
+ export function normalizeProviderValue(value) {
598
+ return normalizeLeaves(value, false);
275
599
  }
276
600
  //# sourceMappingURL=provider-text.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider-text.js","sourceRoot":"","sources":["../../../src/services/openalex/provider-text.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider-text.js","sourceRoot":"","sources":["../../../src/services/openalex/provider-text.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@
5
5
  export declare const ENTITY_TYPES: readonly ['works', 'authors', 'sources', 'institutions', 'topics', 'keywords', 'publishers', 'funders'];
6
6
  export type EntityType = (typeof ENTITY_TYPES)[number];
7
7
  /**
8
- * Default `select` fields applied to search queries (not single-entity lookups) when the caller
8
+ * Default `select` fields applied to searches and single-entity lookups alike when the caller
9
9
  * doesn't specify `select`. Prevents 20-70KB-per-record responses from blowing up context windows.
10
10
  *
11
11
  * `best_oa_location` earns its place on works despite the payload it adds (~36% on a 25-record
@@ -13,7 +13,7 @@ export const ENTITY_TYPES = [
13
13
  'funders',
14
14
  ];
15
15
  /**
16
- * Default `select` fields applied to search queries (not single-entity lookups) when the caller
16
+ * Default `select` fields applied to searches and single-entity lookups alike when the caller
17
17
  * doesn't specify `select`. Prevents 20-70KB-per-record responses from blowing up context windows.
18
18
  *
19
19
  * `best_oa_location` earns its place on works despite the payload it adds (~36% on a 25-record
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyanheads/openalex-mcp-server",
3
- "version": "0.7.16",
3
+ "version": "0.8.0",
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",
@@ -12,6 +12,7 @@
12
12
  "files": [
13
13
  "changelog/",
14
14
  "dist/",
15
+ "!dist/*.mcpb",
15
16
  "README.md",
16
17
  "LICENSE",
17
18
  "CLAUDE.md",
@@ -83,27 +84,27 @@
83
84
  "node": ">=24.0.0",
84
85
  "bun": ">=1.4.0"
85
86
  },
86
- "packageManager": "bun@1.4.0",
87
+ "packageManager": "bun@1.4.2",
87
88
  "publishConfig": {
88
89
  "access": "public"
89
90
  },
90
91
  "trustedDependencies": ["@socketsecurity/bun-security-scanner"],
91
92
  "dependencies": {
92
- "@cyanheads/mcp-ts-core": "^0.13.6",
93
+ "@cyanheads/mcp-ts-core": "^0.13.10",
93
94
  "pino-pretty": "^13.1.3",
94
95
  "zod": "^4.6.5"
95
96
  },
96
97
  "devDependencies": {
97
98
  "@biomejs/biome": "^2.5.14",
98
- "@socketsecurity/bun-security-scanner": "^1.1.2",
99
- "@types/node": "^26.6.2",
99
+ "@socketsecurity/bun-security-scanner": "^1.1.3",
100
+ "@types/node": "^26.6.3",
100
101
  "depcheck": "^1.4.7",
101
- "ignore": "^7.0.9",
102
+ "ignore": "^7.0.10",
102
103
  "mdast-util-from-markdown": "^2.0.3",
103
104
  "mdast-util-gfm": "^3.1.0",
104
105
  "micromark-extension-gfm": "^3.0.0",
105
106
  "tsc-alias": "^1.9.5",
106
107
  "typescript": "^7.0.2",
107
- "vitest": "^5.0.1"
108
+ "vitest": "^5.0.2"
108
109
  }
109
110
  }
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.7.16",
9
+ "version": "0.8.0",
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.7.16",
22
+ "version": "0.8.0",
23
23
  "packageArguments": [
24
24
  {
25
25
  "type": "positional",
@@ -67,7 +67,7 @@
67
67
  "registryBaseUrl": "https://registry.npmjs.org",
68
68
  "identifier": "@cyanheads/openalex-mcp-server",
69
69
  "runtimeHint": "node",
70
- "version": "0.7.16",
70
+ "version": "0.8.0",
71
71
  "packageArguments": [
72
72
  {
73
73
  "type": "positional",