@cyanheads/orcid-mcp-server 0.2.5 → 0.2.7
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 +49 -42
- package/Dockerfile +10 -6
- package/LICENSE +201 -0
- package/README.md +5 -3
- package/changelog/0.2.x/0.2.6.md +19 -0
- package/changelog/0.2.x/0.2.7.md +34 -0
- package/changelog/template.md +5 -3
- package/dist/mcp-server/resources/definitions/researcher-profile.resource.d.ts.map +1 -1
- package/dist/mcp-server/resources/definitions/researcher-profile.resource.js +9 -5
- package/dist/mcp-server/resources/definitions/researcher-profile.resource.js.map +1 -1
- package/dist/mcp-server/resources/definitions/researcher-works.resource.d.ts +3 -1
- package/dist/mcp-server/resources/definitions/researcher-works.resource.d.ts.map +1 -1
- package/dist/mcp-server/resources/definitions/researcher-works.resource.js +27 -10
- package/dist/mcp-server/resources/definitions/researcher-works.resource.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-affiliations.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-affiliations.tool.js +2 -4
- package/dist/mcp-server/tools/definitions/get-affiliations.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-funding.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-funding.tool.js +2 -4
- package/dist/mcp-server/tools/definitions/get-funding.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-peer-reviews.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-peer-reviews.tool.js +2 -4
- package/dist/mcp-server/tools/definitions/get-peer-reviews.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-profile.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-profile.tool.js +2 -4
- package/dist/mcp-server/tools/definitions/get-profile.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-research-resources.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-research-resources.tool.js +2 -4
- package/dist/mcp-server/tools/definitions/get-research-resources.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-work-detail.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-work-detail.tool.js +2 -4
- package/dist/mcp-server/tools/definitions/get-work-detail.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-works.tool.d.ts +11 -3
- package/dist/mcp-server/tools/definitions/get-works.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-works.tool.js +73 -16
- package/dist/mcp-server/tools/definitions/get-works.tool.js.map +1 -1
- package/dist/services/orcid/orcid-id.d.ts +33 -0
- package/dist/services/orcid/orcid-id.d.ts.map +1 -0
- package/dist/services/orcid/orcid-id.js +64 -0
- package/dist/services/orcid/orcid-id.js.map +1 -0
- package/dist/services/orcid/orcid-service.d.ts +3 -2
- package/dist/services/orcid/orcid-service.d.ts.map +1 -1
- package/dist/services/orcid/orcid-service.js +3 -4
- package/dist/services/orcid/orcid-service.js.map +1 -1
- package/package.json +11 -9
- package/server.json +3 -3
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview Retrieve works (publications, datasets, software, preprints, etc.)
|
|
3
3
|
* associated with an ORCID iD. Returns titles, types, dates, journal names, and
|
|
4
|
-
* external identifiers ready for chaining to Crossref, PubMed, or arXiv.
|
|
4
|
+
* external identifiers ready for chaining to Crossref, PubMed, or arXiv. Prolific
|
|
5
|
+
* records are sliced locally via offset/limit so default payloads stay compact.
|
|
5
6
|
* @module mcp-server/tools/definitions/get-works.tool
|
|
6
7
|
*/
|
|
7
8
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
8
9
|
import { JsonRpcErrorCode, McpError } from '@cyanheads/mcp-ts-core/errors';
|
|
10
|
+
import { orcidIdSchema } from '../../../services/orcid/orcid-id.js';
|
|
9
11
|
import { getOrcidService, normalizeOrcidId } from '../../../services/orcid/orcid-service.js';
|
|
10
12
|
const ExternalIdSchema = z
|
|
11
13
|
.object({
|
|
@@ -17,18 +19,47 @@ const ExternalIdSchema = z
|
|
|
17
19
|
.describe('External identifier for a work.');
|
|
18
20
|
export const orcidGetWorks = tool('orcid_get_works', {
|
|
19
21
|
title: 'Get ORCID Researcher Works',
|
|
20
|
-
description: 'Retrieve works associated with an ORCID iD — publications, datasets, software, preprints, and more. Returns work summaries with put-codes, titles, types, publication dates, journal names, and all external identifiers (DOIs, PMIDs, arXiv IDs, ISBNs). Pass the put_code from each work to orcid_get_work_detail to retrieve the full record including abstract and contributors. External IDs are ready for chaining to Crossref, PubMed, or arXiv servers. Works are self-reported; a researcher may not have linked all their publications.',
|
|
22
|
+
description: 'Retrieve works associated with an ORCID iD — publications, datasets, software, preprints, and more. Returns work summaries with put-codes, titles, types, publication dates, journal names, and all external identifiers (DOIs, PMIDs, arXiv IDs, ISBNs). The first 50 works are returned by default; workCount reports the total available, and prolific records are paged with offset and the returned nextOffset (or raise limit). Set include_external_ids to false to omit identifier lists for a lighter payload. Pass the put_code from each work to orcid_get_work_detail to retrieve the full record including abstract and contributors. External IDs are ready for chaining to Crossref, PubMed, or arXiv servers. Works are self-reported; a researcher may not have linked all their publications.',
|
|
21
23
|
annotations: { readOnlyHint: true, openWorldHint: false, idempotentHint: true },
|
|
22
24
|
input: z.object({
|
|
23
|
-
orcid_id:
|
|
24
|
-
|
|
25
|
-
.
|
|
26
|
-
.
|
|
25
|
+
orcid_id: orcidIdSchema,
|
|
26
|
+
limit: z
|
|
27
|
+
.number()
|
|
28
|
+
.int()
|
|
29
|
+
.min(1)
|
|
30
|
+
.max(1000)
|
|
31
|
+
.default(50)
|
|
32
|
+
.describe('Maximum works to return in this response (default 50, max 1000). The full list is sliced locally — page prolific records with offset and the returned nextOffset.'),
|
|
33
|
+
offset: z
|
|
34
|
+
.number()
|
|
35
|
+
.int()
|
|
36
|
+
.min(0)
|
|
37
|
+
.default(0)
|
|
38
|
+
.describe('Zero-based index of the first work to return (default 0). Combine with limit to page through the full works list.'),
|
|
39
|
+
include_external_ids: z
|
|
40
|
+
.boolean()
|
|
41
|
+
.default(true)
|
|
42
|
+
.describe('When true (default), each work carries its external identifiers (DOIs, PMIDs, arXiv IDs, ISBNs). Set false to omit them for a lighter payload when only titles, types, and dates are needed.'),
|
|
27
43
|
}),
|
|
28
44
|
output: z.object({
|
|
29
45
|
orcidId: z.string().describe('Normalized ORCID iD (bare format).'),
|
|
30
46
|
orcidUri: z.string().describe('Full ORCID URI.'),
|
|
31
|
-
workCount: z
|
|
47
|
+
workCount: z
|
|
48
|
+
.number()
|
|
49
|
+
.describe('Total works available for this ORCID iD, before offset and limit are applied.'),
|
|
50
|
+
returnedCount: z
|
|
51
|
+
.number()
|
|
52
|
+
.describe('Number of works returned in this response, after applying offset and limit.'),
|
|
53
|
+
offset: z
|
|
54
|
+
.number()
|
|
55
|
+
.describe('Zero-based offset applied to the full works list for this response.'),
|
|
56
|
+
nextOffset: z
|
|
57
|
+
.number()
|
|
58
|
+
.optional()
|
|
59
|
+
.describe('Offset to pass on the next call to continue paging. Omitted when this response includes the final work.'),
|
|
60
|
+
truncated: z
|
|
61
|
+
.boolean()
|
|
62
|
+
.describe('True when more works are available beyond this response — fetch them with nextOffset.'),
|
|
32
63
|
works: z
|
|
33
64
|
.array(z
|
|
34
65
|
.object({
|
|
@@ -49,10 +80,11 @@ export const orcidGetWorks = tool('orcid_get_works', {
|
|
|
49
80
|
url: z.string().optional().describe('URL for the work, if available.'),
|
|
50
81
|
externalIds: z
|
|
51
82
|
.array(ExternalIdSchema)
|
|
52
|
-
.
|
|
83
|
+
.optional()
|
|
84
|
+
.describe('External identifiers (DOIs, PMIDs, arXiv IDs, ISBNs, etc.). Omitted when include_external_ids is false.'),
|
|
53
85
|
})
|
|
54
86
|
.describe('Work summary record.'))
|
|
55
|
-
.describe('Works
|
|
87
|
+
.describe('Works for this ORCID iD, sliced to the requested offset and limit.'),
|
|
56
88
|
}),
|
|
57
89
|
// Agent-facing context: empty-result notice surfaces in structuredContent and content[]
|
|
58
90
|
// without occupying the domain return.
|
|
@@ -72,10 +104,14 @@ export const orcidGetWorks = tool('orcid_get_works', {
|
|
|
72
104
|
],
|
|
73
105
|
async handler(input, ctx) {
|
|
74
106
|
const service = getOrcidService();
|
|
75
|
-
ctx.log.info('orcid_get_works', {
|
|
76
|
-
|
|
107
|
+
ctx.log.info('orcid_get_works', {
|
|
108
|
+
orcidId: input.orcid_id,
|
|
109
|
+
limit: input.limit,
|
|
110
|
+
offset: input.offset,
|
|
111
|
+
});
|
|
112
|
+
let allWorks;
|
|
77
113
|
try {
|
|
78
|
-
|
|
114
|
+
allWorks = await service.getWorks(input.orcid_id, ctx);
|
|
79
115
|
}
|
|
80
116
|
catch (err) {
|
|
81
117
|
if (err instanceof McpError && err.code === JsonRpcErrorCode.NotFound) {
|
|
@@ -84,14 +120,31 @@ export const orcidGetWorks = tool('orcid_get_works', {
|
|
|
84
120
|
throw err;
|
|
85
121
|
}
|
|
86
122
|
const bareId = normalizeOrcidId(input.orcid_id);
|
|
87
|
-
|
|
88
|
-
|
|
123
|
+
const workCount = allWorks.length;
|
|
124
|
+
const works = allWorks.slice(input.offset, input.offset + input.limit).map((w) => {
|
|
125
|
+
const { externalIds, ...rest } = w;
|
|
126
|
+
return input.include_external_ids ? { ...rest, externalIds } : rest;
|
|
127
|
+
});
|
|
128
|
+
const returnedCount = works.length;
|
|
129
|
+
const endOffset = input.offset + returnedCount;
|
|
130
|
+
const truncated = endOffset < workCount;
|
|
131
|
+
ctx.log.info('orcid_get_works completed', {
|
|
132
|
+
orcidId: bareId,
|
|
133
|
+
workCount,
|
|
134
|
+
returnedCount,
|
|
135
|
+
truncated,
|
|
136
|
+
});
|
|
137
|
+
if (workCount === 0) {
|
|
89
138
|
ctx.enrich.notice('No works found. The researcher may not have linked works to their ORCID record, or works may be set to private visibility.');
|
|
90
139
|
}
|
|
91
140
|
return {
|
|
92
141
|
orcidId: bareId,
|
|
93
142
|
orcidUri: `https://orcid.org/${bareId}`,
|
|
94
|
-
workCount
|
|
143
|
+
workCount,
|
|
144
|
+
returnedCount,
|
|
145
|
+
offset: input.offset,
|
|
146
|
+
...(truncated && { nextOffset: endOffset }),
|
|
147
|
+
truncated,
|
|
95
148
|
works,
|
|
96
149
|
};
|
|
97
150
|
},
|
|
@@ -100,7 +153,11 @@ export const orcidGetWorks = tool('orcid_get_works', {
|
|
|
100
153
|
`## Works for ORCID ${result.orcidId}`,
|
|
101
154
|
`**URI:** ${result.orcidUri}`,
|
|
102
155
|
`**Total Works:** ${result.workCount}`,
|
|
156
|
+
`**Returned:** ${result.returnedCount} (offset ${result.offset})`,
|
|
157
|
+
`**Truncated:** ${result.truncated ? 'Yes' : 'No'}`,
|
|
103
158
|
];
|
|
159
|
+
if (result.nextOffset != null)
|
|
160
|
+
lines.push(`**Next Offset:** ${result.nextOffset}`);
|
|
104
161
|
if (result.works.length === 0) {
|
|
105
162
|
return [{ type: 'text', text: lines.join('\n') }];
|
|
106
163
|
}
|
|
@@ -117,7 +174,7 @@ export const orcidGetWorks = tool('orcid_get_works', {
|
|
|
117
174
|
lines.push(`**Journal:** ${w.journalTitle}`);
|
|
118
175
|
if (w.url)
|
|
119
176
|
lines.push(`**URL:** ${w.url}`);
|
|
120
|
-
if (w.externalIds
|
|
177
|
+
if (w.externalIds?.length) {
|
|
121
178
|
const idParts = w.externalIds.map((id) => {
|
|
122
179
|
const rel = id.relationship ? ` [${id.relationship}]` : '';
|
|
123
180
|
const urlPart = id.url ? ` (${id.url})` : '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-works.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-works.tool.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"get-works.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-works.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Shared ORCID iD parsing and validation. Combines the visible-shape
|
|
3
|
+
* regex, ISO/IEC 7064:2003 MOD 11-2 check-digit verification, and URI-prefix
|
|
4
|
+
* normalization in one place so every tool and resource validates an ORCID iD
|
|
5
|
+
* identically — and rejects a checksum-invalid iD locally, before any upstream call.
|
|
6
|
+
* @module services/orcid/orcid-id
|
|
7
|
+
*/
|
|
8
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
9
|
+
/** Strip the https://orcid.org/ prefix to get the bare 0000-0000-0000-0000 form. */
|
|
10
|
+
export declare function normalizeOrcidId(id: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* True when `id` is a well-shaped ORCID iD (bare or full URI) whose ISO 7064
|
|
13
|
+
* check digit matches. Rejects checksum-invalid iDs such as `0000-0000-0000-0000`.
|
|
14
|
+
*/
|
|
15
|
+
export declare function isValidOrcidId(id: string): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Reusable Zod schema for an `orcid_id` input/param. The regex rejects malformed
|
|
18
|
+
* strings (and emits a JSON-Schema `pattern`); the refine rejects well-shaped iDs
|
|
19
|
+
* with an invalid ISO 7064 check digit. Both run at parse time, so a bad iD fails
|
|
20
|
+
* local validation before any handler or upstream request.
|
|
21
|
+
*/
|
|
22
|
+
export declare const orcidIdSchema: z.ZodString;
|
|
23
|
+
/**
|
|
24
|
+
* Regex-only variant of {@link orcidIdSchema} for resource URI params: validates the
|
|
25
|
+
* visible shape (and emits a JSON-Schema `pattern`) but omits the check-digit refine.
|
|
26
|
+
* A resource param carries no place to attach the refine's custom message — so handlers
|
|
27
|
+
* pair this with an explicit `isValidOrcidId(params.orcid_id)` check that throws a clear
|
|
28
|
+
* `InvalidParams` naming the iD, matching the tool route and running before any upstream
|
|
29
|
+
* call. Tools keep {@link orcidIdSchema}: the SDK validates their full schema (refine
|
|
30
|
+
* included) and rejects a bad check digit as `InvalidParams` before the handler runs.
|
|
31
|
+
*/
|
|
32
|
+
export declare const orcidIdParamSchema: z.ZodString;
|
|
33
|
+
//# sourceMappingURL=orcid-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orcid-id.d.ts","sourceRoot":"","sources":["../../../src/services/orcid/orcid-id.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAK3C,oFAAoF;AACpF,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEnD;AAgBD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAIlD;AAED;;;;;GAKG;AACH,eAAO,MAAM,aAAa,aASvB,CAAC;AAEJ;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,aAK5B,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Shared ORCID iD parsing and validation. Combines the visible-shape
|
|
3
|
+
* regex, ISO/IEC 7064:2003 MOD 11-2 check-digit verification, and URI-prefix
|
|
4
|
+
* normalization in one place so every tool and resource validates an ORCID iD
|
|
5
|
+
* identically — and rejects a checksum-invalid iD locally, before any upstream call.
|
|
6
|
+
* @module services/orcid/orcid-id
|
|
7
|
+
*/
|
|
8
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
9
|
+
/** Bare or full-URI ORCID iD shape. Check digit is verified separately. */
|
|
10
|
+
const ORCID_ID_PATTERN = /^(https?:\/\/orcid\.org\/)?\d{4}-\d{4}-\d{4}-\d{3}[\dX]$/;
|
|
11
|
+
/** Strip the https://orcid.org/ prefix to get the bare 0000-0000-0000-0000 form. */
|
|
12
|
+
export function normalizeOrcidId(id) {
|
|
13
|
+
return id.replace(/^https?:\/\/orcid\.org\//, '').trim();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Compute the ISO/IEC 7064:2003 MOD 11-2 check character over the first 15 digits
|
|
17
|
+
* of a bare ORCID iD. Returns the expected final character ('0'–'9', or 'X' for 10).
|
|
18
|
+
*/
|
|
19
|
+
function computeCheckDigit(bareId) {
|
|
20
|
+
const base = bareId.replace(/-/g, '').slice(0, 15);
|
|
21
|
+
let total = 0;
|
|
22
|
+
for (const char of base) {
|
|
23
|
+
total = (total + Number(char)) * 2;
|
|
24
|
+
}
|
|
25
|
+
const result = (12 - (total % 11)) % 11;
|
|
26
|
+
return result === 10 ? 'X' : String(result);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* True when `id` is a well-shaped ORCID iD (bare or full URI) whose ISO 7064
|
|
30
|
+
* check digit matches. Rejects checksum-invalid iDs such as `0000-0000-0000-0000`.
|
|
31
|
+
*/
|
|
32
|
+
export function isValidOrcidId(id) {
|
|
33
|
+
if (!ORCID_ID_PATTERN.test(id))
|
|
34
|
+
return false;
|
|
35
|
+
const bare = normalizeOrcidId(id);
|
|
36
|
+
return bare.slice(-1) === computeCheckDigit(bare);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Reusable Zod schema for an `orcid_id` input/param. The regex rejects malformed
|
|
40
|
+
* strings (and emits a JSON-Schema `pattern`); the refine rejects well-shaped iDs
|
|
41
|
+
* with an invalid ISO 7064 check digit. Both run at parse time, so a bad iD fails
|
|
42
|
+
* local validation before any handler or upstream request.
|
|
43
|
+
*/
|
|
44
|
+
export const orcidIdSchema = z
|
|
45
|
+
.string()
|
|
46
|
+
.regex(ORCID_ID_PATTERN, 'Must be a valid ORCID iD (e.g. 0000-0001-2345-6789) or full ORCID URI.')
|
|
47
|
+
.refine(isValidOrcidId, {
|
|
48
|
+
message: 'The ORCID iD is invalid — its ISO 7064 check digit does not match. Verify the iD and try again.',
|
|
49
|
+
})
|
|
50
|
+
.describe('ORCID iD — bare format (0000-0001-2345-6789) or full URI (https://orcid.org/0000-0001-2345-6789).');
|
|
51
|
+
/**
|
|
52
|
+
* Regex-only variant of {@link orcidIdSchema} for resource URI params: validates the
|
|
53
|
+
* visible shape (and emits a JSON-Schema `pattern`) but omits the check-digit refine.
|
|
54
|
+
* A resource param carries no place to attach the refine's custom message — so handlers
|
|
55
|
+
* pair this with an explicit `isValidOrcidId(params.orcid_id)` check that throws a clear
|
|
56
|
+
* `InvalidParams` naming the iD, matching the tool route and running before any upstream
|
|
57
|
+
* call. Tools keep {@link orcidIdSchema}: the SDK validates their full schema (refine
|
|
58
|
+
* included) and rejects a bad check digit as `InvalidParams` before the handler runs.
|
|
59
|
+
*/
|
|
60
|
+
export const orcidIdParamSchema = z
|
|
61
|
+
.string()
|
|
62
|
+
.regex(ORCID_ID_PATTERN, 'Must be a valid ORCID iD (e.g. 0000-0001-2345-6789) or full ORCID URI.')
|
|
63
|
+
.describe('ORCID iD — bare format (0000-0001-2345-6789) or full URI (https://orcid.org/0000-0001-2345-6789).');
|
|
64
|
+
//# sourceMappingURL=orcid-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orcid-id.js","sourceRoot":"","sources":["../../../src/services/orcid/orcid-id.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAE3C,2EAA2E;AAC3E,MAAM,gBAAgB,GAAG,0DAA0D,CAAC;AAEpF,oFAAoF;AACpF,MAAM,UAAU,gBAAgB,CAAC,EAAU;IACzC,OAAO,EAAE,CAAC,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,MAAc;IACvC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,KAAK,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,EAAE,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;IACxC,OAAO,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7C,MAAM,IAAI,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAClC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,iBAAiB,CAAC,IAAI,CAAC,CAAC;AACpD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC;KAC3B,MAAM,EAAE;KACR,KAAK,CAAC,gBAAgB,EAAE,wEAAwE,CAAC;KACjG,MAAM,CAAC,cAAc,EAAE;IACtB,OAAO,EACL,iGAAiG;CACpG,CAAC;KACD,QAAQ,CACP,mGAAmG,CACpG,CAAC;AAEJ;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC;KAChC,MAAM,EAAE;KACR,KAAK,CAAC,gBAAgB,EAAE,wEAAwE,CAAC;KACjG,QAAQ,CACP,mGAAmG,CACpG,CAAC"}
|
|
@@ -7,9 +7,10 @@ import type { Context } from '@cyanheads/mcp-ts-core';
|
|
|
7
7
|
import type { AppConfig } from '@cyanheads/mcp-ts-core/config';
|
|
8
8
|
import type { StorageService } from '@cyanheads/mcp-ts-core/storage';
|
|
9
9
|
import type { NormalizedPerson } from './normalizers.js';
|
|
10
|
+
import { normalizeOrcidId } from './orcid-id.js';
|
|
10
11
|
import type { Affiliation, BulkWorkResult, ExpandedSearchResponse, FundingRecord, PeerReview, ResearchResource, Work, WorkDetail } from './types.js';
|
|
11
|
-
/**
|
|
12
|
-
export
|
|
12
|
+
/** Re-exported from the shared ORCID iD parser/validator (`./orcid-id.js`). */
|
|
13
|
+
export { normalizeOrcidId };
|
|
13
14
|
/** The accepted affiliation types as a union for type-safety. */
|
|
14
15
|
export type AffiliationType = 'employment' | 'education' | 'invited-positions' | 'distinctions' | 'memberships' | 'qualifications' | 'services' | 'all';
|
|
15
16
|
/** Common fetch options forwarded to network layer. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orcid-service.d.ts","sourceRoot":"","sources":["../../../src/services/orcid/orcid-service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAOrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAYzD,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,UAAU,EAUV,gBAAgB,EAChB,IAAI,EACJ,UAAU,EACX,MAAM,YAAY,CAAC;AAEpB
|
|
1
|
+
{"version":3,"file":"orcid-service.d.ts","sourceRoot":"","sources":["../../../src/services/orcid/orcid-service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAOrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAYzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,UAAU,EAUV,gBAAgB,EAChB,IAAI,EACJ,UAAU,EACX,MAAM,YAAY,CAAC;AAEpB,+EAA+E;AAC/E,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B,iEAAiE;AACjE,MAAM,MAAM,eAAe,GACvB,YAAY,GACZ,WAAW,GACX,mBAAmB,GACnB,cAAc,GACd,aAAa,GACb,gBAAgB,GAChB,UAAU,GACV,KAAK,CAAC;AAEV,uDAAuD;AACvD,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,sDAAsD;AACtD,MAAM,MAAM,YAAY,GAAG;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc;IAIxD,mEAAmE;IACnE,OAAO,CAAC,OAAO;IAOf,gGAAgG;IAChG,OAAO,CAAC,aAAa;IAQrB,iEAAiE;IACjE,OAAO,CAAC,SAAS;IA6BjB;;;OAGG;IACG,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAUzF;;;OAGG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAQzE;;;OAGG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAQ9D;;;OAGG;IACG,eAAe,CACnB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,eAAe,EAAE,EACxB,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,WAAW,EAAE,CAAC;IAQzB;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAQ1E;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAQ1E;;;OAGG;IACG,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IAQxF;;;;;OAKG;IACG,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAAE,EAClB,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,cAAc,EAAE,CAAC;IAS5B;;;OAGG;IACG,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;CAOvF;AAQD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAEjF;AAED,wBAAgB,eAAe,IAAI,YAAY,CAK9C"}
|
|
@@ -7,10 +7,9 @@ import { serviceUnavailable } from '@cyanheads/mcp-ts-core/errors';
|
|
|
7
7
|
import { httpErrorFromResponse, requestContextService, withRetry, } from '@cyanheads/mcp-ts-core/utils';
|
|
8
8
|
import { getServerConfig } from '../../config/server-config.js';
|
|
9
9
|
import { normalizeActivities, normalizeBulkWorks, normalizeExpandedSearch, normalizeFundings, normalizePeerReviews, normalizePerson, normalizeResearchResources, normalizeWorkDetail, normalizeWorks, } from './normalizers.js';
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
10
|
+
import { normalizeOrcidId } from './orcid-id.js';
|
|
11
|
+
/** Re-exported from the shared ORCID iD parser/validator (`./orcid-id.js`). */
|
|
12
|
+
export { normalizeOrcidId };
|
|
14
13
|
export class OrcidService {
|
|
15
14
|
baseUrl;
|
|
16
15
|
constructor(_config, _storage) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orcid-service.js","sourceRoot":"","sources":["../../../src/services/orcid/orcid-service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,SAAS,GACV,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,0BAA0B,EAC1B,mBAAmB,EACnB,cAAc,GACf,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"orcid-service.js","sourceRoot":"","sources":["../../../src/services/orcid/orcid-service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cyanheads/orcid-mcp-server",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.7",
|
|
4
4
|
"mcpName": "io.github.cyanheads/orcid-mcp-server",
|
|
5
5
|
"description": "Search and retrieve researcher profiles, works, affiliations, funding, and peer review records from the ORCID registry via MCP. STDIO or Streamable HTTP.",
|
|
6
6
|
"type": "module",
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"url": "https://github.com/cyanheads/orcid-mcp-server/issues"
|
|
65
65
|
},
|
|
66
66
|
"homepage": "https://github.com/cyanheads/orcid-mcp-server#readme",
|
|
67
|
-
"author": "
|
|
67
|
+
"author": "Casey Hand <casey@caseyjhand.com> (https://caseyjhand.com)",
|
|
68
68
|
"funding": [
|
|
69
69
|
{
|
|
70
70
|
"type": "github",
|
|
@@ -76,7 +76,7 @@
|
|
|
76
76
|
}
|
|
77
77
|
],
|
|
78
78
|
"license": "Apache-2.0",
|
|
79
|
-
"packageManager": "bun@1.3.
|
|
79
|
+
"packageManager": "bun@1.3.14",
|
|
80
80
|
"engines": {
|
|
81
81
|
"bun": ">=1.3.0",
|
|
82
82
|
"node": ">=24.0.0"
|
|
@@ -84,18 +84,20 @@
|
|
|
84
84
|
"publishConfig": {
|
|
85
85
|
"access": "public"
|
|
86
86
|
},
|
|
87
|
+
"trustedDependencies": ["@socketsecurity/bun-security-scanner"],
|
|
87
88
|
"dependencies": {
|
|
88
|
-
"@cyanheads/mcp-ts-core": "^0.10.
|
|
89
|
+
"@cyanheads/mcp-ts-core": "^0.10.14",
|
|
89
90
|
"pino-pretty": "^13.1.3",
|
|
90
91
|
"zod": "^4.4.3"
|
|
91
92
|
},
|
|
92
93
|
"devDependencies": {
|
|
93
|
-
"@biomejs/biome": "^2.5.
|
|
94
|
-
"@
|
|
94
|
+
"@biomejs/biome": "^2.5.3",
|
|
95
|
+
"@socketsecurity/bun-security-scanner": "^1.1.2",
|
|
96
|
+
"@types/node": "^26.1.1",
|
|
95
97
|
"depcheck": "^1.4.7",
|
|
96
|
-
"ignore": "^7.0.
|
|
97
|
-
"tsc-alias": "^1.
|
|
98
|
+
"ignore": "^7.0.6",
|
|
99
|
+
"tsc-alias": "^1.9.0",
|
|
98
100
|
"typescript": "^6.0.3",
|
|
99
|
-
"vitest": "^4.1.
|
|
101
|
+
"vitest": "^4.1.10"
|
|
100
102
|
}
|
|
101
103
|
}
|
package/server.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"url": "https://github.com/cyanheads/orcid-mcp-server",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "0.2.
|
|
9
|
+
"version": "0.2.7",
|
|
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/orcid-mcp-server",
|
|
21
21
|
"runtimeHint": "node",
|
|
22
|
-
"version": "0.2.
|
|
22
|
+
"version": "0.2.7",
|
|
23
23
|
"packageArguments": [
|
|
24
24
|
{
|
|
25
25
|
"type": "positional",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
49
49
|
"identifier": "@cyanheads/orcid-mcp-server",
|
|
50
50
|
"runtimeHint": "node",
|
|
51
|
-
"version": "0.2.
|
|
51
|
+
"version": "0.2.7",
|
|
52
52
|
"packageArguments": [
|
|
53
53
|
{
|
|
54
54
|
"type": "positional",
|