@cyanheads/orcid-mcp-server 0.1.1

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 (64) hide show
  1. package/CLAUDE.md +405 -0
  2. package/Dockerfile +98 -0
  3. package/README.md +321 -0
  4. package/changelog/0.1.x/0.1.0.md +20 -0
  5. package/changelog/0.1.x/0.1.1.md +13 -0
  6. package/changelog/template.md +119 -0
  7. package/dist/config/server-config.d.ts +12 -0
  8. package/dist/config/server-config.d.ts.map +1 -0
  9. package/dist/config/server-config.js +22 -0
  10. package/dist/config/server-config.js.map +1 -0
  11. package/dist/index.d.ts +8 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +35 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/mcp-server/resources/definitions/researcher-profile.resource.d.ts +24 -0
  16. package/dist/mcp-server/resources/definitions/researcher-profile.resource.d.ts.map +1 -0
  17. package/dist/mcp-server/resources/definitions/researcher-profile.resource.js +62 -0
  18. package/dist/mcp-server/resources/definitions/researcher-profile.resource.js.map +1 -0
  19. package/dist/mcp-server/resources/definitions/researcher-works.resource.d.ts +24 -0
  20. package/dist/mcp-server/resources/definitions/researcher-works.resource.d.ts.map +1 -0
  21. package/dist/mcp-server/resources/definitions/researcher-works.resource.js +60 -0
  22. package/dist/mcp-server/resources/definitions/researcher-works.resource.js.map +1 -0
  23. package/dist/mcp-server/tools/definitions/get-affiliations.tool.d.ts +47 -0
  24. package/dist/mcp-server/tools/definitions/get-affiliations.tool.d.ts.map +1 -0
  25. package/dist/mcp-server/tools/definitions/get-affiliations.tool.js +170 -0
  26. package/dist/mcp-server/tools/definitions/get-affiliations.tool.js.map +1 -0
  27. package/dist/mcp-server/tools/definitions/get-funding.tool.d.ts +36 -0
  28. package/dist/mcp-server/tools/definitions/get-funding.tool.d.ts.map +1 -0
  29. package/dist/mcp-server/tools/definitions/get-funding.tool.js +140 -0
  30. package/dist/mcp-server/tools/definitions/get-funding.tool.js.map +1 -0
  31. package/dist/mcp-server/tools/definitions/get-peer-reviews.tool.d.ts +35 -0
  32. package/dist/mcp-server/tools/definitions/get-peer-reviews.tool.d.ts.map +1 -0
  33. package/dist/mcp-server/tools/definitions/get-peer-reviews.tool.js +146 -0
  34. package/dist/mcp-server/tools/definitions/get-peer-reviews.tool.js.map +1 -0
  35. package/dist/mcp-server/tools/definitions/get-profile.tool.d.ts +39 -0
  36. package/dist/mcp-server/tools/definitions/get-profile.tool.d.ts.map +1 -0
  37. package/dist/mcp-server/tools/definitions/get-profile.tool.js +146 -0
  38. package/dist/mcp-server/tools/definitions/get-profile.tool.js.map +1 -0
  39. package/dist/mcp-server/tools/definitions/get-works.tool.d.ts +35 -0
  40. package/dist/mcp-server/tools/definitions/get-works.tool.d.ts.map +1 -0
  41. package/dist/mcp-server/tools/definitions/get-works.tool.js +127 -0
  42. package/dist/mcp-server/tools/definitions/get-works.tool.js.map +1 -0
  43. package/dist/mcp-server/tools/definitions/resolve-researcher.tool.d.ts +46 -0
  44. package/dist/mcp-server/tools/definitions/resolve-researcher.tool.d.ts.map +1 -0
  45. package/dist/mcp-server/tools/definitions/resolve-researcher.tool.js +250 -0
  46. package/dist/mcp-server/tools/definitions/resolve-researcher.tool.js.map +1 -0
  47. package/dist/mcp-server/tools/definitions/search-researchers.tool.d.ts +40 -0
  48. package/dist/mcp-server/tools/definitions/search-researchers.tool.d.ts.map +1 -0
  49. package/dist/mcp-server/tools/definitions/search-researchers.tool.js +192 -0
  50. package/dist/mcp-server/tools/definitions/search-researchers.tool.js.map +1 -0
  51. package/dist/services/orcid/normalizers.d.ts +32 -0
  52. package/dist/services/orcid/normalizers.d.ts.map +1 -0
  53. package/dist/services/orcid/normalizers.js +256 -0
  54. package/dist/services/orcid/normalizers.js.map +1 -0
  55. package/dist/services/orcid/orcid-service.d.ts +65 -0
  56. package/dist/services/orcid/orcid-service.d.ts.map +1 -0
  57. package/dist/services/orcid/orcid-service.js +140 -0
  58. package/dist/services/orcid/orcid-service.js.map +1 -0
  59. package/dist/services/orcid/types.d.ts +335 -0
  60. package/dist/services/orcid/types.d.ts.map +1 -0
  61. package/dist/services/orcid/types.js +6 -0
  62. package/dist/services/orcid/types.js.map +1 -0
  63. package/package.json +79 -0
  64. package/server.json +99 -0
@@ -0,0 +1,250 @@
1
+ /**
2
+ * @fileoverview Disambiguate an author name to a verified ORCID iD. Returns a
3
+ * ranked candidate list with transparent disambiguation signals: name match type,
4
+ * institution overlap, and anchor type (doi/pmid/none).
5
+ * @module mcp-server/tools/definitions/resolve-researcher.tool
6
+ */
7
+ import { tool, z } from '@cyanheads/mcp-ts-core';
8
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
9
+ import { getOrcidService } from '../../../services/orcid/orcid-service.js';
10
+ function computeNameMatch(candidate, inputName) {
11
+ const normalize = (s) => s
12
+ .toLowerCase()
13
+ .replace(/[^a-z0-9\s]/g, '')
14
+ .trim();
15
+ const normalizedInput = normalize(inputName);
16
+ // Build full names from candidate
17
+ const fullName = [candidate.givenNames, candidate.familyNames].filter(Boolean).join(' ');
18
+ const creditName = candidate.creditName ?? '';
19
+ if (normalize(fullName) === normalizedInput || normalize(creditName) === normalizedInput) {
20
+ return 'exact';
21
+ }
22
+ const inputTokens = normalizedInput.split(/\s+/).filter(Boolean);
23
+ const candidateTokens = normalize(fullName).split(/\s+/).filter(Boolean);
24
+ const overlap = inputTokens.filter((t) => candidateTokens.includes(t));
25
+ if (overlap.length >= Math.min(2, inputTokens.length)) {
26
+ return 'partial';
27
+ }
28
+ // Check other-names
29
+ for (const otherName of candidate.otherNames) {
30
+ if (normalize(otherName) === normalizedInput)
31
+ return 'other-name';
32
+ const otherTokens = normalize(otherName).split(/\s+/).filter(Boolean);
33
+ const otherOverlap = inputTokens.filter((t) => otherTokens.includes(t));
34
+ if (otherOverlap.length >= Math.min(2, inputTokens.length))
35
+ return 'other-name';
36
+ }
37
+ return 'none';
38
+ }
39
+ function computeInstitutionOverlap(candidate, inputAffiliation) {
40
+ if (!inputAffiliation?.trim())
41
+ return false;
42
+ const normalizeAff = (s) => s.toLowerCase().replace(/[^a-z0-9\s]/g, '');
43
+ const inputTokens = normalizeAff(inputAffiliation)
44
+ .split(/\s+/)
45
+ .filter((t) => t.length > 3); // skip short tokens (of, the, etc.)
46
+ return candidate.institutionNames.some((inst) => {
47
+ const instNorm = normalizeAff(inst);
48
+ return inputTokens.some((t) => instNorm.includes(t));
49
+ });
50
+ }
51
+ export const orcidResolveResearcher = tool('orcid_resolve_researcher', {
52
+ title: 'Resolve ORCID Researcher',
53
+ description: 'Disambiguate an author name to a verified ORCID iD. Returns up to 5 ranked candidates with transparent disambiguation signals: name match type (exact/partial/other-name/none), institution overlap flag, and whether a DOI or PMID anchor was used in the query. A DOI or PMID anchor is near-deterministic — it filters to researchers who have linked that specific work to their ORCID record. Use this tool (not orcid_search_researchers) when the input is an ambiguous name that needs ranked disambiguation. No synthetic scores are used — raw signals only.',
54
+ annotations: { readOnlyHint: true, openWorldHint: true, idempotentHint: true },
55
+ input: z.object({
56
+ name: z
57
+ .string()
58
+ .min(1)
59
+ .describe('Author name to disambiguate (full name preferred, e.g. "Jennifer Doudna" or "J. Doudna").'),
60
+ affiliation: z
61
+ .string()
62
+ .optional()
63
+ .describe("Researcher's institution or organization name. Used for institution overlap scoring and optionally as a search constraint."),
64
+ doi: z
65
+ .string()
66
+ .optional()
67
+ .describe('DOI of a work authored by this researcher. Acts as a near-deterministic anchor — filters to researchers who linked this DOI to their ORCID record.'),
68
+ pmid: z
69
+ .string()
70
+ .optional()
71
+ .describe('PubMed ID of a work authored by this researcher. Acts as a near-deterministic anchor — filters to researchers who linked this PMID to their ORCID record.'),
72
+ rows: z
73
+ .number()
74
+ .int()
75
+ .min(1)
76
+ .max(20)
77
+ .default(5)
78
+ .describe('Maximum candidate count to return (1–20). Defaults to 5.'),
79
+ }),
80
+ output: z.object({
81
+ candidates: z
82
+ .array(z
83
+ .object({
84
+ orcidId: z.string().describe('Candidate ORCID iD (bare format).'),
85
+ orcidUri: z.string().describe('Full ORCID URI.'),
86
+ givenNames: z.string().optional().describe('Given names from the ORCID record.'),
87
+ familyNames: z.string().optional().describe('Family name from the ORCID record.'),
88
+ creditName: z.string().optional().describe('Published credit name, if set.'),
89
+ institutionNames: z
90
+ .array(z.string().describe('Institution name.'))
91
+ .describe('Affiliated institutions from the ORCID record.'),
92
+ nameMatchType: z
93
+ .enum(['exact', 'partial', 'other-name', 'none'])
94
+ .describe('How closely the candidate name matches the input name: exact (full match), partial (token overlap), other-name (match on alternate name), or none.'),
95
+ institutionOverlap: z
96
+ .boolean()
97
+ .describe("True when at least one of the candidate's institutions matches tokens from the provided affiliation parameter."),
98
+ anchorType: z
99
+ .enum(['doi', 'pmid', 'none'])
100
+ .describe('Type of identifier anchor used in the query: doi, pmid, or none. A doi or pmid anchor means the candidate has linked that work to their ORCID record.'),
101
+ })
102
+ .describe('Disambiguation candidate with transparency signals.'))
103
+ .describe('Ranked candidates, ordered by name match quality then institution overlap.'),
104
+ queryUsed: z.string().describe('Solr query sent to ORCID for the primary search.'),
105
+ relaxedQuery: z
106
+ .string()
107
+ .optional()
108
+ .describe('Solr query used in a secondary relaxed search, if the primary returned no results.'),
109
+ totalFound: z.number().describe('Total ORCID records matching the primary query.'),
110
+ notice: z
111
+ .string()
112
+ .optional()
113
+ .describe('Recovery hint when no candidates are found or when the anchor query failed to match.'),
114
+ }),
115
+ errors: [
116
+ {
117
+ reason: 'no_candidates',
118
+ code: JsonRpcErrorCode.NotFound,
119
+ when: 'No ORCID records matched even the relaxed query for this name.',
120
+ recovery: 'Try a different name spelling, use orcid_search_researchers with broader parameters, or verify the DOI/PMID is correct.',
121
+ },
122
+ ],
123
+ async handler(input, ctx) {
124
+ const service = getOrcidService();
125
+ ctx.log.info('orcid_resolve_researcher', {
126
+ name: input.name,
127
+ hasAffiliation: !!input.affiliation,
128
+ hasDoi: !!input.doi,
129
+ hasPmid: !!input.pmid,
130
+ });
131
+ const anchorType = input.doi ? 'doi' : input.pmid ? 'pmid' : 'none';
132
+ // Build primary query: name + optional anchor + optional affiliation
133
+ const primaryClauses = [];
134
+ primaryClauses.push(`given-and-family-names:${input.name.trim()}`);
135
+ if (input.doi?.trim())
136
+ primaryClauses.push(`doi-self:${input.doi.trim()}`);
137
+ if (input.pmid?.trim())
138
+ primaryClauses.push(`pmid-self:${input.pmid.trim()}`);
139
+ if (input.affiliation?.trim()) {
140
+ primaryClauses.push(`affiliation-org-name:"${input.affiliation.trim()}"`);
141
+ }
142
+ const primaryQuery = primaryClauses.join(' AND ');
143
+ const primaryResponse = await service.expandedSearch({ q: primaryQuery, rows: input.rows }, ctx);
144
+ let relaxedQuery;
145
+ let finalResponse = primaryResponse;
146
+ // Relaxed fallback: drop affiliation constraint if primary returned nothing
147
+ if (primaryResponse.numFound === 0 && input.affiliation?.trim()) {
148
+ const relaxedClauses = primaryClauses.filter((c) => !c.startsWith('affiliation-org-name:'));
149
+ relaxedQuery = relaxedClauses.join(' AND ');
150
+ finalResponse = await service.expandedSearch({ q: relaxedQuery, rows: input.rows }, ctx);
151
+ }
152
+ // Second relaxed pass: if DOI/PMID anchor + affiliation both failed, try just DOI/PMID anchor
153
+ if (finalResponse.numFound === 0 && anchorType !== 'none') {
154
+ const prefix = anchorType === 'doi' ? 'doi-self:' : 'pmid-self:';
155
+ const anchorOnly = primaryClauses.find((c) => c.startsWith(prefix)) ?? '';
156
+ relaxedQuery = anchorOnly;
157
+ finalResponse = await service.expandedSearch({ q: anchorOnly, rows: input.rows }, ctx);
158
+ }
159
+ ctx.log.info('orcid_resolve_researcher completed', {
160
+ primaryFound: primaryResponse.numFound,
161
+ finalFound: finalResponse.numFound,
162
+ candidateCount: finalResponse.results.length,
163
+ });
164
+ // Score and sort candidates
165
+ const scored = finalResponse.results.map((r) => ({
166
+ candidate: r,
167
+ nameMatch: computeNameMatch(r, input.name),
168
+ instOverlap: computeInstitutionOverlap(r, input.affiliation),
169
+ }));
170
+ // Sort: exact > partial > other-name > none, then institution overlap within each tier
171
+ const matchOrder = ['exact', 'partial', 'other-name', 'none'];
172
+ scored.sort((a, b) => {
173
+ const aOrder = matchOrder.indexOf(a.nameMatch);
174
+ const bOrder = matchOrder.indexOf(b.nameMatch);
175
+ if (aOrder !== bOrder)
176
+ return aOrder - bOrder;
177
+ // Within same tier, institution overlap comes first
178
+ if (a.instOverlap !== b.instOverlap)
179
+ return a.instOverlap ? -1 : 1;
180
+ return 0;
181
+ });
182
+ const candidates = scored.map(({ candidate, nameMatch, instOverlap }) => ({
183
+ orcidId: candidate.orcidId,
184
+ orcidUri: `https://orcid.org/${candidate.orcidId}`,
185
+ ...(candidate.givenNames && { givenNames: candidate.givenNames }),
186
+ ...(candidate.familyNames && { familyNames: candidate.familyNames }),
187
+ ...(candidate.creditName && { creditName: candidate.creditName }),
188
+ institutionNames: candidate.institutionNames,
189
+ nameMatchType: nameMatch,
190
+ institutionOverlap: instOverlap,
191
+ anchorType,
192
+ }));
193
+ let notice;
194
+ if (candidates.length === 0) {
195
+ if (anchorType !== 'none') {
196
+ notice = `No ORCID records found matching "${input.name}" with the provided ${anchorType.toUpperCase()} anchor. Verify the ${anchorType.toUpperCase()} is correct or try without the anchor using orcid_search_researchers.`;
197
+ }
198
+ else {
199
+ notice = `No ORCID records found matching "${input.name}". Try a different spelling or use orcid_search_researchers with a broader query.`;
200
+ }
201
+ }
202
+ return {
203
+ candidates,
204
+ queryUsed: primaryQuery,
205
+ ...(relaxedQuery && { relaxedQuery }),
206
+ totalFound: finalResponse.numFound,
207
+ ...(notice && { notice }),
208
+ };
209
+ },
210
+ format: (result) => {
211
+ const lines = [
212
+ `## ORCID Disambiguation Results`,
213
+ `**Query:** \`${result.queryUsed}\``,
214
+ `**Total Matched:** ${result.totalFound}`,
215
+ ];
216
+ if (result.relaxedQuery) {
217
+ lines.push(`**Relaxed Query:** \`${result.relaxedQuery}\``);
218
+ }
219
+ if (result.notice) {
220
+ lines.push('', `> ${result.notice}`);
221
+ }
222
+ if (result.candidates.length === 0) {
223
+ lines.push('', 'No candidates found.');
224
+ return [{ type: 'text', text: lines.join('\n') }];
225
+ }
226
+ lines.push('', `**Candidates (${result.candidates.length}):**`);
227
+ result.candidates.forEach((c, i) => {
228
+ const nameParts = [c.givenNames, c.familyNames].filter(Boolean);
229
+ const displayName = c.creditName ?? (nameParts.length ? nameParts.join(' ') : c.orcidId);
230
+ lines.push('');
231
+ lines.push(`### ${i + 1}. ${displayName}`);
232
+ lines.push(`**ORCID iD:** ${c.orcidId}`);
233
+ lines.push(`**ORCID URI:** ${c.orcidUri}`);
234
+ if (c.givenNames)
235
+ lines.push(`**Given Names:** ${c.givenNames}`);
236
+ if (c.familyNames)
237
+ lines.push(`**Family Names:** ${c.familyNames}`);
238
+ if (c.creditName)
239
+ lines.push(`**Credit Name:** ${c.creditName}`);
240
+ lines.push(`**Name Match:** ${c.nameMatchType}`);
241
+ lines.push(`**Institution Overlap:** ${c.institutionOverlap ? 'Yes' : 'No'}`);
242
+ lines.push(`**Anchor Type:** ${c.anchorType}`);
243
+ if (c.institutionNames.length) {
244
+ lines.push(`**Institutions:** ${c.institutionNames.join('; ')}`);
245
+ }
246
+ });
247
+ return [{ type: 'text', text: lines.join('\n') }];
248
+ },
249
+ });
250
+ //# sourceMappingURL=resolve-researcher.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-researcher.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/resolve-researcher.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @fileoverview Search the ORCID registry using structured field parameters or
3
+ * raw Solr syntax. Returns ORCID iDs with inline name and institution data.
4
+ * @module mcp-server/tools/definitions/search-researchers.tool
5
+ */
6
+ import { z } from '@cyanheads/mcp-ts-core';
7
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
8
+ export declare const orcidSearchResearchers: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
9
+ given_name: z.ZodOptional<z.ZodString>;
10
+ family_name: z.ZodOptional<z.ZodString>;
11
+ affiliation: z.ZodOptional<z.ZodString>;
12
+ keyword: z.ZodOptional<z.ZodString>;
13
+ ror_id: z.ZodOptional<z.ZodString>;
14
+ doi: z.ZodOptional<z.ZodString>;
15
+ pmid: z.ZodOptional<z.ZodString>;
16
+ query: z.ZodOptional<z.ZodString>;
17
+ rows: z.ZodDefault<z.ZodNumber>;
18
+ start: z.ZodDefault<z.ZodNumber>;
19
+ }, z.core.$strip>, z.ZodObject<{
20
+ results: z.ZodArray<z.ZodObject<{
21
+ orcidId: z.ZodString;
22
+ orcidUri: z.ZodString;
23
+ givenNames: z.ZodOptional<z.ZodString>;
24
+ familyNames: z.ZodOptional<z.ZodString>;
25
+ creditName: z.ZodOptional<z.ZodString>;
26
+ otherNames: z.ZodArray<z.ZodString>;
27
+ institutionNames: z.ZodArray<z.ZodString>;
28
+ }, z.core.$strip>>;
29
+ numFound: z.ZodNumber;
30
+ rows: z.ZodNumber;
31
+ start: z.ZodNumber;
32
+ effectiveQuery: z.ZodString;
33
+ notice: z.ZodOptional<z.ZodString>;
34
+ }, z.core.$strip>, readonly [{
35
+ readonly reason: "no_results";
36
+ readonly code: JsonRpcErrorCode.NotFound;
37
+ readonly when: "No ORCID records matched the search query.";
38
+ readonly recovery: "Broaden the query — try fewer constraints, check spelling, or use the query field with Solr syntax.";
39
+ }]>;
40
+ //# sourceMappingURL=search-researchers.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-researchers.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-researchers.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AA6CjE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoLjC,CAAC"}
@@ -0,0 +1,192 @@
1
+ /**
2
+ * @fileoverview Search the ORCID registry using structured field parameters or
3
+ * raw Solr syntax. Returns ORCID iDs with inline name and institution data.
4
+ * @module mcp-server/tools/definitions/search-researchers.tool
5
+ */
6
+ import { tool, z } from '@cyanheads/mcp-ts-core';
7
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
8
+ import { getOrcidService } from '../../../services/orcid/orcid-service.js';
9
+ /** Build a Solr query string from structured search parameters. */
10
+ function buildSolrQuery(input) {
11
+ const clauses = [];
12
+ if (input.given_name?.trim()) {
13
+ clauses.push(`given-names:${input.given_name.trim()}`);
14
+ }
15
+ if (input.family_name?.trim()) {
16
+ clauses.push(`family-name:${input.family_name.trim()}`);
17
+ }
18
+ if (input.affiliation?.trim()) {
19
+ clauses.push(`affiliation-org-name:"${input.affiliation.trim()}"`);
20
+ }
21
+ if (input.keyword?.trim()) {
22
+ clauses.push(`keyword:"${input.keyword.trim()}"`);
23
+ }
24
+ if (input.ror_id?.trim()) {
25
+ // ROR IDs contain colons and must be quoted in Solr
26
+ clauses.push(`ror-org-id:"${input.ror_id.trim()}"`);
27
+ }
28
+ if (input.doi?.trim()) {
29
+ clauses.push(`doi-self:${input.doi.trim()}`);
30
+ }
31
+ if (input.pmid?.trim()) {
32
+ clauses.push(`pmid-self:${input.pmid.trim()}`);
33
+ }
34
+ if (input.query?.trim()) {
35
+ clauses.push(input.query.trim());
36
+ }
37
+ return clauses.join(' AND ') || '*:*';
38
+ }
39
+ export const orcidSearchResearchers = tool('orcid_search_researchers', {
40
+ title: 'Search ORCID Researchers',
41
+ description: 'Search the ORCID registry using structured field parameters or raw Solr syntax. All provided structured params are ANDed together. The `query` field appends raw Solr syntax to the generated clause. Returns ORCID iDs with inline name and institution data — no follow-up profile fetches needed for basic disambiguation. For ranked disambiguation of an ambiguous author name, use orcid_resolve_researcher instead. The ORCID Public API caps results at 10,000 — use pagination for large result sets.',
42
+ annotations: { readOnlyHint: true, openWorldHint: true, idempotentHint: true },
43
+ input: z.object({
44
+ given_name: z.string().optional().describe("Researcher's given (first) name."),
45
+ family_name: z.string().optional().describe("Researcher's family (last) name."),
46
+ affiliation: z.string().optional().describe('Organization name to filter by. Phrase match.'),
47
+ keyword: z
48
+ .string()
49
+ .optional()
50
+ .describe("Keyword to search in the researcher's keyword fields. Phrase match."),
51
+ ror_id: z
52
+ .string()
53
+ .optional()
54
+ .describe('ROR organization ID to filter by (full URL, e.g. https://ror.org/00f54p054). Returns researchers affiliated with this organization.'),
55
+ doi: z
56
+ .string()
57
+ .optional()
58
+ .describe('DOI to anchor the search. Returns researchers who have linked this DOI to their ORCID record.'),
59
+ pmid: z
60
+ .string()
61
+ .optional()
62
+ .describe('PubMed ID to anchor the search. Returns researchers who have linked this PMID to their ORCID record.'),
63
+ query: z
64
+ .string()
65
+ .optional()
66
+ .describe('Raw Solr query string appended to the generated clause with AND. Supports all ORCID Solr fields and boolean operators.'),
67
+ rows: z
68
+ .number()
69
+ .int()
70
+ .min(1)
71
+ .max(1000)
72
+ .default(20)
73
+ .describe('Maximum results to return (1–1000).'),
74
+ start: z
75
+ .number()
76
+ .int()
77
+ .min(0)
78
+ .default(0)
79
+ .describe('Pagination offset (0-based). ORCID Public API caps at 10,000 total results.'),
80
+ }),
81
+ output: z.object({
82
+ results: z
83
+ .array(z
84
+ .object({
85
+ orcidId: z.string().describe('ORCID iD (bare format).'),
86
+ orcidUri: z.string().describe('Full ORCID URI.'),
87
+ givenNames: z.string().optional().describe('Given names from the ORCID record.'),
88
+ familyNames: z.string().optional().describe('Family name from the ORCID record.'),
89
+ creditName: z.string().optional().describe('Published credit name, if set.'),
90
+ otherNames: z
91
+ .array(z.string().describe('Alternative name.'))
92
+ .describe('Other names listed on the ORCID record.'),
93
+ institutionNames: z
94
+ .array(z.string().describe('Institution name.'))
95
+ .describe('Affiliated institution names returned by expanded-search.'),
96
+ })
97
+ .describe('Expanded search result for one researcher.'))
98
+ .describe('Matching researchers with inline name and institution data.'),
99
+ numFound: z.number().describe('Total number of matching records in ORCID (before pagination).'),
100
+ rows: z.number().describe('Number of results returned in this response.'),
101
+ start: z.number().describe('Pagination offset used for this response.'),
102
+ effectiveQuery: z.string().describe('Solr query sent to the ORCID API.'),
103
+ notice: z
104
+ .string()
105
+ .optional()
106
+ .describe('Recovery hint when results are empty or pagination overshoots the total. Absent on successful pages.'),
107
+ }),
108
+ errors: [
109
+ {
110
+ reason: 'no_results',
111
+ code: JsonRpcErrorCode.NotFound,
112
+ when: 'No ORCID records matched the search query.',
113
+ recovery: 'Broaden the query — try fewer constraints, check spelling, or use the query field with Solr syntax.',
114
+ },
115
+ ],
116
+ async handler(input, ctx) {
117
+ const service = getOrcidService();
118
+ const effectiveQuery = buildSolrQuery(input);
119
+ ctx.log.info('orcid_search_researchers', {
120
+ effectiveQuery,
121
+ rows: input.rows,
122
+ start: input.start,
123
+ });
124
+ const response = await service.expandedSearch({ q: effectiveQuery, rows: input.rows, start: input.start }, ctx);
125
+ ctx.log.info('orcid_search_researchers completed', {
126
+ numFound: response.numFound,
127
+ returned: response.results.length,
128
+ });
129
+ let notice;
130
+ if (response.numFound === 0) {
131
+ notice =
132
+ 'No results found. Try fewer constraints, verify spelling, or use the query field with Solr syntax.';
133
+ }
134
+ else if (response.results.length === 0 &&
135
+ input.start > 0 &&
136
+ input.start >= response.numFound) {
137
+ notice = `Offset ${input.start} exceeds numFound (${response.numFound}). Reduce start to page through results.`;
138
+ }
139
+ return {
140
+ results: response.results.map((r) => ({
141
+ orcidId: r.orcidId,
142
+ orcidUri: `https://orcid.org/${r.orcidId}`,
143
+ ...(r.givenNames && { givenNames: r.givenNames }),
144
+ ...(r.familyNames && { familyNames: r.familyNames }),
145
+ ...(r.creditName && { creditName: r.creditName }),
146
+ otherNames: r.otherNames,
147
+ institutionNames: r.institutionNames,
148
+ })),
149
+ numFound: response.numFound,
150
+ rows: response.results.length,
151
+ start: input.start,
152
+ effectiveQuery,
153
+ ...(notice && { notice }),
154
+ };
155
+ },
156
+ format: (result) => {
157
+ const lines = [
158
+ `## ORCID Search Results`,
159
+ `**Query:** \`${result.effectiveQuery}\``,
160
+ `**Total Found:** ${result.numFound} | **Returned:** ${result.rows} | **Offset:** ${result.start}`,
161
+ ];
162
+ if (result.notice) {
163
+ lines.push('', `> ${result.notice}`);
164
+ }
165
+ if (result.results.length === 0) {
166
+ lines.push('', 'No results.');
167
+ }
168
+ else {
169
+ lines.push('');
170
+ for (const r of result.results) {
171
+ const nameParts = [r.givenNames, r.familyNames].filter(Boolean);
172
+ const displayName = r.creditName ?? (nameParts.length ? nameParts.join(' ') : r.orcidId);
173
+ lines.push(`### ${displayName}`);
174
+ lines.push(`**ORCID iD:** ${r.orcidId}`);
175
+ lines.push(`**ORCID URI:** ${r.orcidUri}`);
176
+ if (r.givenNames || r.familyNames) {
177
+ lines.push(`**Name:** ${[r.givenNames, r.familyNames].filter(Boolean).join(' ')}`);
178
+ }
179
+ if (r.creditName)
180
+ lines.push(`**Credit Name:** ${r.creditName}`);
181
+ if (r.otherNames.length)
182
+ lines.push(`**Other Names:** ${r.otherNames.join(', ')}`);
183
+ if (r.institutionNames.length) {
184
+ lines.push(`**Institutions:** ${r.institutionNames.join('; ')}`);
185
+ }
186
+ lines.push('');
187
+ }
188
+ }
189
+ return [{ type: 'text', text: lines.join('\n') }];
190
+ },
191
+ });
192
+ //# sourceMappingURL=search-researchers.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-researchers.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-researchers.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @fileoverview Normalization functions that convert raw ORCID API shapes to
3
+ * typed domain objects. Preserves absence as unknown rather than inventing defaults.
4
+ * @module services/orcid/normalizers
5
+ */
6
+ import type { AffiliationType } from './orcid-service.js';
7
+ import type { Affiliation, ExpandedSearchResponse, ExternalIdentifier, FundingRecord, PeerReview, RawActivities, RawExpandedSearchResponse, RawFundingsResponse, RawPeerReviewsResponse, RawPerson, RawWorksResponse, Work } from './types.js';
8
+ /** Normalized person fields returned from /person endpoint. */
9
+ export type NormalizedPerson = {
10
+ givenNames?: string;
11
+ familyName?: string;
12
+ creditName?: string;
13
+ biography?: string;
14
+ keywords: string[];
15
+ researcherUrls: Array<{
16
+ name?: string;
17
+ url: string;
18
+ }>;
19
+ externalIdentifiers: ExternalIdentifier[];
20
+ emails: Array<{
21
+ email: string;
22
+ primary?: boolean;
23
+ }>;
24
+ countries: string[];
25
+ };
26
+ export declare function normalizePerson(raw: RawPerson): NormalizedPerson;
27
+ export declare function normalizeWorks(raw: RawWorksResponse): Work[];
28
+ export declare function normalizeActivities(raw: RawActivities, types: AffiliationType[]): Affiliation[];
29
+ export declare function normalizeFundings(raw: RawFundingsResponse): FundingRecord[];
30
+ export declare function normalizePeerReviews(raw: RawPeerReviewsResponse): PeerReview[];
31
+ export declare function normalizeExpandedSearch(raw: RawExpandedSearchResponse): ExpandedSearchResponse;
32
+ //# sourceMappingURL=normalizers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizers.d.ts","sourceRoot":"","sources":["../../../src/services/orcid/normalizers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EACV,WAAW,EACX,sBAAsB,EAEtB,kBAAkB,EAClB,aAAa,EAIb,UAAU,EACV,aAAa,EAGb,yBAAyB,EAIzB,mBAAmB,EAGnB,sBAAsB,EACtB,SAAS,EAIT,gBAAgB,EAChB,IAAI,EACL,MAAM,YAAY,CAAC;AAiFpB,+DAA+D;AAC/D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,EAAE,KAAK,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtD,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;IAC1C,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACpD,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC;AAEF,wBAAgB,eAAe,CAAC,GAAG,EAAE,SAAS,GAAG,gBAAgB,CAiDhE;AAeD,wBAAgB,cAAc,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,EAAE,CAO5D;AAwBD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,WAAW,EAAE,CAY/F;AAmBD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,mBAAmB,GAAG,aAAa,EAAE,CAI3E;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,sBAAsB,GAAG,UAAU,EAAE,CAsB9E;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,yBAAyB,GAAG,sBAAsB,CAkB9F"}