@digital-science-dsl/dimensions-analytics-mcp 0.5.3 → 1.0.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.
- package/CHANGELOG.md +4 -56
- package/README.md +1 -5
- package/dist/client/deployment-config.d.ts +20 -2
- package/dist/client/deployment-config.d.ts.map +1 -1
- package/dist/client/deployment-config.js +26 -2
- package/dist/client/deployment-config.js.map +1 -1
- package/dist/client/internal-dsl-client.d.ts +1 -1
- package/dist/client/internal-dsl-client.d.ts.map +1 -1
- package/dist/client/internal-dsl-client.js +2 -5
- package/dist/client/internal-dsl-client.js.map +1 -1
- package/dist/dsl/create-client.d.ts +1 -1
- package/dist/dsl/create-client.js +1 -1
- package/dist/dsl/fluent-query-builder.d.ts +1 -1
- package/dist/dsl/fluent-query-builder.js +1 -1
- package/dist/dsl/schema/cache.d.ts +2 -2
- package/dist/dsl/schema/cache.d.ts.map +1 -1
- package/dist/dsl/schema/cache.js +8 -14
- package/dist/dsl/schema/cache.js.map +1 -1
- package/dist/dsl/schema/load.d.ts +0 -1
- package/dist/dsl/schema/load.d.ts.map +1 -1
- package/dist/dsl/schema/load.js +1 -3
- package/dist/dsl/schema/load.js.map +1 -1
- package/dist/mcp/tools/schema.d.ts +0 -2
- package/dist/mcp/tools/schema.d.ts.map +1 -1
- package/dist/mcp/tools/schema.js.map +1 -1
- package/dist/mcp/utils.d.ts +0 -4
- package/dist/mcp/utils.d.ts.map +1 -1
- package/dist/mcp/utils.js +0 -7
- package/dist/mcp/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/client/deployment-config.ts +39 -2
- package/src/client/internal-dsl-client.ts +2 -6
- package/src/dsl/create-client.ts +1 -1
- package/src/dsl/fluent-query-builder.ts +1 -1
- package/src/dsl/schema/cache.ts +8 -13
- package/src/dsl/schema/load.ts +1 -4
- package/src/mcp/tools/schema.ts +0 -3
- package/src/mcp/utils.ts +0 -12
- package/test/client/deployment-config.test.ts +25 -1
- package/test/client/http-client.test.ts +2 -2
- package/test/client/internal-dsl-client.test.ts +3 -0
- package/test/dsl/schema/cache.test.ts +2 -4
- package/test/helpers/tool-test-harness.ts +2 -19
- package/test/middleware/field-aliases.test.ts +1 -1
- package/test/tools/analytics.test.ts +2 -2
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/examples/dsl-examples.d.ts +0 -11
- package/dist/examples/dsl-examples.d.ts.map +0 -1
- package/dist/examples/dsl-examples.js +0 -49
- package/dist/examples/dsl-examples.js.map +0 -1
- package/dist/examples/usage-scenarios.d.ts +0 -22
- package/dist/examples/usage-scenarios.d.ts.map +0 -1
- package/dist/examples/usage-scenarios.js +0 -173
- package/dist/examples/usage-scenarios.js.map +0 -1
- package/dist/funder-org-names.d.ts +0 -12
- package/dist/funder-org-names.d.ts.map +0 -1
- package/dist/funder-org-names.js +0 -30
- package/dist/funder-org-names.js.map +0 -1
- package/dist/http.d.ts +0 -29
- package/dist/http.d.ts.map +0 -1
- package/dist/http.js +0 -173
- package/dist/http.js.map +0 -1
- package/dist/kwq/build-query.d.ts +0 -26
- package/dist/kwq/build-query.d.ts.map +0 -1
- package/dist/kwq/build-query.js +0 -37
- package/dist/kwq/build-query.js.map +0 -1
- package/dist/kwq/concept-groups.d.ts +0 -49
- package/dist/kwq/concept-groups.d.ts.map +0 -1
- package/dist/kwq/concept-groups.js +0 -55
- package/dist/kwq/concept-groups.js.map +0 -1
- package/dist/kwq/dsl-assembler.d.ts +0 -28
- package/dist/kwq/dsl-assembler.d.ts.map +0 -1
- package/dist/kwq/dsl-assembler.js +0 -124
- package/dist/kwq/dsl-assembler.js.map +0 -1
- package/dist/kwq/ensemble.d.ts +0 -38
- package/dist/kwq/ensemble.d.ts.map +0 -1
- package/dist/kwq/ensemble.js +0 -107
- package/dist/kwq/ensemble.js.map +0 -1
- package/dist/kwq/index.d.ts +0 -16
- package/dist/kwq/index.d.ts.map +0 -1
- package/dist/kwq/index.js +0 -14
- package/dist/kwq/index.js.map +0 -1
- package/dist/kwq/types.d.ts +0 -120
- package/dist/kwq/types.d.ts.map +0 -1
- package/dist/kwq/types.js +0 -11
- package/dist/kwq/types.js.map +0 -1
- package/dist/lambda.d.ts +0 -10
- package/dist/lambda.d.ts.map +0 -1
- package/dist/lambda.js +0 -4
- package/dist/lambda.js.map +0 -1
- package/dist/mcp/tools/concept-profile.d.ts +0 -14
- package/dist/mcp/tools/concept-profile.d.ts.map +0 -1
- package/dist/mcp/tools/concept-profile.js +0 -130
- package/dist/mcp/tools/concept-profile.js.map +0 -1
- package/dist/mcp/tools/dataset-profile.d.ts +0 -15
- package/dist/mcp/tools/dataset-profile.d.ts.map +0 -1
- package/dist/mcp/tools/dataset-profile.js +0 -194
- package/dist/mcp/tools/dataset-profile.js.map +0 -1
- package/dist/mcp/tools/impact-chain.d.ts +0 -15
- package/dist/mcp/tools/impact-chain.d.ts.map +0 -1
- package/dist/mcp/tools/impact-chain.js +0 -96
- package/dist/mcp/tools/impact-chain.js.map +0 -1
- package/dist/mcp/tools/kwq.d.ts +0 -19
- package/dist/mcp/tools/kwq.d.ts.map +0 -1
- package/dist/mcp/tools/kwq.js +0 -156
- package/dist/mcp/tools/kwq.js.map +0 -1
- package/dist/mcp/tools/policy-profile.d.ts +0 -15
- package/dist/mcp/tools/policy-profile.d.ts.map +0 -1
- package/dist/mcp/tools/policy-profile.js +0 -174
- package/dist/mcp/tools/policy-profile.js.map +0 -1
- package/dist/mcp/tools/profile.d.ts +0 -14
- package/dist/mcp/tools/profile.d.ts.map +0 -1
- package/dist/mcp/tools/profile.js +0 -349
- package/dist/mcp/tools/profile.js.map +0 -1
- package/dist/middleware/field-aliases.d.ts +0 -97
- package/dist/middleware/field-aliases.d.ts.map +0 -1
- package/dist/middleware/field-aliases.js +0 -208
- package/dist/middleware/field-aliases.js.map +0 -1
- package/dist/resources/schema.d.ts +0 -13
- package/dist/resources/schema.d.ts.map +0 -1
- package/dist/resources/schema.js +0 -204
- package/dist/resources/schema.js.map +0 -1
- package/dist/schema/context.d.ts +0 -10
- package/dist/schema/context.d.ts.map +0 -1
- package/dist/schema/context.js +0 -6
- package/dist/schema/context.js.map +0 -1
- package/dist/schema/index.d.ts +0 -9
- package/dist/schema/index.d.ts.map +0 -1
- package/dist/schema/index.js +0 -6
- package/dist/schema/index.js.map +0 -1
- package/dist/schema/load.d.ts +0 -43
- package/dist/schema/load.d.ts.map +0 -1
- package/dist/schema/load.js +0 -139
- package/dist/schema/load.js.map +0 -1
- package/dist/schema/store.d.ts +0 -112
- package/dist/schema/store.d.ts.map +0 -1
- package/dist/schema/store.js +0 -173
- package/dist/schema/store.js.map +0 -1
- package/dist/schema/structured-entities.d.ts +0 -21
- package/dist/schema/structured-entities.d.ts.map +0 -1
- package/dist/schema/structured-entities.js +0 -39
- package/dist/schema/structured-entities.js.map +0 -1
- package/dist/schema/types.d.ts +0 -36
- package/dist/schema/types.d.ts.map +0 -1
- package/dist/schema/types.js +0 -6
- package/dist/schema/types.js.map +0 -1
- package/dist/server.d.ts +0 -57
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -144
- package/dist/server.js.map +0 -1
- package/dist/telemetry.d.ts +0 -172
- package/dist/telemetry.d.ts.map +0 -1
- package/dist/telemetry.js +0 -233
- package/dist/telemetry.js.map +0 -1
- package/dist/tools/analytics-filters.d.ts +0 -18
- package/dist/tools/analytics-filters.d.ts.map +0 -1
- package/dist/tools/analytics-filters.js +0 -35
- package/dist/tools/analytics-filters.js.map +0 -1
- package/dist/tools/analytics.d.ts +0 -16
- package/dist/tools/analytics.d.ts.map +0 -1
- package/dist/tools/analytics.js +0 -381
- package/dist/tools/analytics.js.map +0 -1
- package/dist/tools/concept-profile.d.ts +0 -14
- package/dist/tools/concept-profile.d.ts.map +0 -1
- package/dist/tools/concept-profile.js +0 -130
- package/dist/tools/concept-profile.js.map +0 -1
- package/dist/tools/dataset-profile.d.ts +0 -15
- package/dist/tools/dataset-profile.d.ts.map +0 -1
- package/dist/tools/dataset-profile.js +0 -194
- package/dist/tools/dataset-profile.js.map +0 -1
- package/dist/tools/functions.d.ts +0 -14
- package/dist/tools/functions.d.ts.map +0 -1
- package/dist/tools/functions.js +0 -294
- package/dist/tools/functions.js.map +0 -1
- package/dist/tools/impact-chain.d.ts +0 -15
- package/dist/tools/impact-chain.d.ts.map +0 -1
- package/dist/tools/impact-chain.js +0 -96
- package/dist/tools/impact-chain.js.map +0 -1
- package/dist/tools/kwq.d.ts +0 -19
- package/dist/tools/kwq.d.ts.map +0 -1
- package/dist/tools/kwq.js +0 -156
- package/dist/tools/kwq.js.map +0 -1
- package/dist/tools/lookup.d.ts +0 -14
- package/dist/tools/lookup.d.ts.map +0 -1
- package/dist/tools/lookup.js +0 -213
- package/dist/tools/lookup.js.map +0 -1
- package/dist/tools/policy-profile.d.ts +0 -15
- package/dist/tools/policy-profile.d.ts.map +0 -1
- package/dist/tools/policy-profile.js +0 -174
- package/dist/tools/policy-profile.js.map +0 -1
- package/dist/tools/profile.d.ts +0 -14
- package/dist/tools/profile.d.ts.map +0 -1
- package/dist/tools/profile.js +0 -349
- package/dist/tools/profile.js.map +0 -1
- package/dist/tools/query.d.ts +0 -16
- package/dist/tools/query.d.ts.map +0 -1
- package/dist/tools/query.js +0 -53
- package/dist/tools/query.js.map +0 -1
- package/dist/tools/schema.d.ts +0 -23
- package/dist/tools/schema.d.ts.map +0 -1
- package/dist/tools/schema.js +0 -124
- package/dist/tools/schema.js.map +0 -1
- package/dist/tools/search-entity-metadata.d.ts +0 -18
- package/dist/tools/search-entity-metadata.d.ts.map +0 -1
- package/dist/tools/search-entity-metadata.js +0 -221
- package/dist/tools/search-entity-metadata.js.map +0 -1
- package/dist/tools/search.d.ts +0 -23
- package/dist/tools/search.d.ts.map +0 -1
- package/dist/tools/search.js +0 -110
- package/dist/tools/search.js.map +0 -1
- package/dist/tools/solr-fields.d.ts +0 -39
- package/dist/tools/solr-fields.d.ts.map +0 -1
- package/dist/tools/solr-fields.js +0 -40
- package/dist/tools/solr-fields.js.map +0 -1
- package/dist/utils.d.ts +0 -70
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js +0 -104
- package/dist/utils.js.map +0 -1
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Policy document profile tool for the MCP server.
|
|
3
|
-
* Provides deep profiling of policy documents including structural links
|
|
4
|
-
* to cited publications and their supporting grants.
|
|
5
|
-
* @module mcp/tools/policy-profile
|
|
6
|
-
*/
|
|
7
|
-
import { ErrorCode, McpError } from "@modelcontextprotocol/sdk/types.js";
|
|
8
|
-
import { z } from "zod";
|
|
9
|
-
import { asArray, formatErrorResult, formatToolResult, READ_ONLY_API_ANNOTATIONS, } from "../utils.js";
|
|
10
|
-
/**
|
|
11
|
-
* Registers the policy_document_profile tool with the MCP server.
|
|
12
|
-
* @param server - MCP server instance
|
|
13
|
-
* @param client - Dimensions client instance
|
|
14
|
-
*/
|
|
15
|
-
export function registerPolicyProfileTools(server, client) {
|
|
16
|
-
server.registerTool("policy_document_profile", {
|
|
17
|
-
description: "Get a comprehensive profile for a policy document including its cited publications and their supporting grants. Uses structural links (publication_ids) rather than free-text search to trace the evidence chain from policy back to funded research.",
|
|
18
|
-
inputSchema: {
|
|
19
|
-
policyDocId: z.string().optional().describe("Dimensions policy document ID"),
|
|
20
|
-
query: z
|
|
21
|
-
.string()
|
|
22
|
-
.optional()
|
|
23
|
-
.describe("Search term to find policy documents (used when policyDocId is not known)"),
|
|
24
|
-
includeLinkedPublications: z
|
|
25
|
-
.boolean()
|
|
26
|
-
.default(true)
|
|
27
|
-
.describe("Include cited publications and their supporting grants"),
|
|
28
|
-
publicationLimit: z
|
|
29
|
-
.number()
|
|
30
|
-
.int()
|
|
31
|
-
.min(1)
|
|
32
|
-
.max(50)
|
|
33
|
-
.default(20)
|
|
34
|
-
.describe("Max linked publications to return"),
|
|
35
|
-
},
|
|
36
|
-
outputSchema: {
|
|
37
|
-
found: z.boolean().describe("Whether the policy document was found"),
|
|
38
|
-
profile: z
|
|
39
|
-
.record(z.string(), z.unknown())
|
|
40
|
-
.optional()
|
|
41
|
-
.describe("Policy document profile with linked entities"),
|
|
42
|
-
message: z.string().optional().describe("Message when not found"),
|
|
43
|
-
},
|
|
44
|
-
annotations: READ_ONLY_API_ANNOTATIONS,
|
|
45
|
-
}, async (args) => {
|
|
46
|
-
if (!args.policyDocId && !args.query) {
|
|
47
|
-
throw new McpError(ErrorCode.InvalidParams, "Must provide at least one of: policyDocId or query");
|
|
48
|
-
}
|
|
49
|
-
try {
|
|
50
|
-
// Step 1: Find the policy document
|
|
51
|
-
let policyDsl;
|
|
52
|
-
if (args.policyDocId) {
|
|
53
|
-
policyDsl = client
|
|
54
|
-
.createQueryBuilder()
|
|
55
|
-
.search("policy_documents")
|
|
56
|
-
.where("id", "=", args.policyDocId)
|
|
57
|
-
.fields([
|
|
58
|
-
"id",
|
|
59
|
-
"title",
|
|
60
|
-
"year",
|
|
61
|
-
"publisher_org",
|
|
62
|
-
"linkout",
|
|
63
|
-
"publisher_org",
|
|
64
|
-
"publication_ids",
|
|
65
|
-
])
|
|
66
|
-
.limit(1)
|
|
67
|
-
.build();
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
policyDsl = client
|
|
71
|
-
.createQueryBuilder()
|
|
72
|
-
.search("policy_documents")
|
|
73
|
-
.for(args.query)
|
|
74
|
-
.fields([
|
|
75
|
-
"id",
|
|
76
|
-
"title",
|
|
77
|
-
"year",
|
|
78
|
-
"publisher_org",
|
|
79
|
-
"linkout",
|
|
80
|
-
"publisher_org",
|
|
81
|
-
"publication_ids",
|
|
82
|
-
])
|
|
83
|
-
.limit(5)
|
|
84
|
-
.build();
|
|
85
|
-
}
|
|
86
|
-
const policyResponse = await client.rawQuery(policyDsl);
|
|
87
|
-
const policyDocs = asArray(policyResponse.policy_documents);
|
|
88
|
-
if (policyDocs.length === 0) {
|
|
89
|
-
return formatToolResult({
|
|
90
|
-
found: false,
|
|
91
|
-
message: args.policyDocId
|
|
92
|
-
? `No policy document found with ID: ${args.policyDocId}`
|
|
93
|
-
: `No policy document found matching: ${args.query}`,
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
const policyDoc = policyDocs[0];
|
|
97
|
-
const profile = {
|
|
98
|
-
policyDocument: policyDoc,
|
|
99
|
-
matchCount: policyDocs.length,
|
|
100
|
-
};
|
|
101
|
-
// Extract structural link IDs
|
|
102
|
-
const publicationIds = Array.isArray(policyDoc.publication_ids)
|
|
103
|
-
? policyDoc.publication_ids
|
|
104
|
-
: undefined;
|
|
105
|
-
// Step 2: Fetch linked publications
|
|
106
|
-
if (args.includeLinkedPublications !== false &&
|
|
107
|
-
publicationIds &&
|
|
108
|
-
publicationIds.length > 0) {
|
|
109
|
-
const pubSlice = publicationIds.slice(0, args.publicationLimit);
|
|
110
|
-
const pubDsl = client
|
|
111
|
-
.createQueryBuilder()
|
|
112
|
-
.search("publications")
|
|
113
|
-
.whereIn("id", pubSlice)
|
|
114
|
-
.fields([
|
|
115
|
-
"id",
|
|
116
|
-
"title",
|
|
117
|
-
"doi",
|
|
118
|
-
"year",
|
|
119
|
-
"times_cited",
|
|
120
|
-
"journal",
|
|
121
|
-
"authors",
|
|
122
|
-
"research_orgs",
|
|
123
|
-
"funders",
|
|
124
|
-
"supporting_grant_ids",
|
|
125
|
-
])
|
|
126
|
-
.limit(args.publicationLimit)
|
|
127
|
-
.build();
|
|
128
|
-
const pubResponse = await client.rawQuery(pubDsl);
|
|
129
|
-
const publications = asArray(pubResponse.publications);
|
|
130
|
-
profile.linkedPublications = {
|
|
131
|
-
totalLinked: publicationIds.length,
|
|
132
|
-
returnedCount: publications.length,
|
|
133
|
-
items: publications,
|
|
134
|
-
};
|
|
135
|
-
// Second-wave: fetch grants behind the publications
|
|
136
|
-
const allGrantIds = new Set();
|
|
137
|
-
for (const pub of publications) {
|
|
138
|
-
if (Array.isArray(pub.supporting_grant_ids)) {
|
|
139
|
-
for (const gid of pub.supporting_grant_ids) {
|
|
140
|
-
if (typeof gid === "string") {
|
|
141
|
-
allGrantIds.add(gid);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
if (allGrantIds.size > 0) {
|
|
147
|
-
const grantIds = [...allGrantIds].slice(0, 50);
|
|
148
|
-
const grantDsl = client
|
|
149
|
-
.createQueryBuilder()
|
|
150
|
-
.search("grants")
|
|
151
|
-
.whereIn("id", grantIds)
|
|
152
|
-
.fields(["id", "title", "funding_usd", "funder_org_name", "start_year"])
|
|
153
|
-
.limit(50)
|
|
154
|
-
.build();
|
|
155
|
-
const grantResponse = await client.rawQuery(grantDsl);
|
|
156
|
-
const grants = asArray(grantResponse.grants);
|
|
157
|
-
profile.supportingGrants = {
|
|
158
|
-
totalLinked: allGrantIds.size,
|
|
159
|
-
returnedCount: grants.length,
|
|
160
|
-
items: grants,
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
return formatToolResult({
|
|
165
|
-
found: true,
|
|
166
|
-
profile,
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
catch (error) {
|
|
170
|
-
return formatErrorResult(error);
|
|
171
|
-
}
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
//# sourceMappingURL=policy-profile.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"policy-profile.js","sourceRoot":"","sources":["../../../src/mcp/tools/policy-profile.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,OAAO,EACP,iBAAiB,EACjB,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AAErB;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAiB,EAAE,MAAwB;IACpF,MAAM,CAAC,YAAY,CACjB,yBAAyB,EACzB;QACE,WAAW,EACT,uPAAuP;QACzP,WAAW,EAAE;YACX,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;YAC5E,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,2EAA2E,CAAC;YACxF,yBAAyB,EAAE,CAAC;iBACzB,OAAO,EAAE;iBACT,OAAO,CAAC,IAAI,CAAC;iBACb,QAAQ,CAAC,wDAAwD,CAAC;YACrE,gBAAgB,EAAE,CAAC;iBAChB,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,EAAE,CAAC;iBACP,OAAO,CAAC,EAAE,CAAC;iBACX,QAAQ,CAAC,mCAAmC,CAAC;SACjD;QACD,YAAY,EAAE;YACZ,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;YACpE,OAAO,EAAE,CAAC;iBACP,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;iBAC/B,QAAQ,EAAE;iBACV,QAAQ,CAAC,8CAA8C,CAAC;YAC3D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;SAClE;QACD,WAAW,EAAE,yBAAyB;KACvC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACrC,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,aAAa,EACvB,oDAAoD,CACrD,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,mCAAmC;YACnC,IAAI,SAAiB,CAAC;YACtB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,SAAS,GAAG,MAAM;qBACf,kBAAkB,EAAE;qBACpB,MAAM,CAAC,kBAAkB,CAAC;qBAC1B,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC;qBAClC,MAAM,CAAC;oBACN,IAAI;oBACJ,OAAO;oBACP,MAAM;oBACN,eAAe;oBACf,SAAS;oBACT,eAAe;oBACf,iBAAiB;iBAClB,CAAC;qBACD,KAAK,CAAC,CAAC,CAAC;qBACR,KAAK,EAAE,CAAC;YACb,CAAC;iBAAM,CAAC;gBACN,SAAS,GAAG,MAAM;qBACf,kBAAkB,EAAE;qBACpB,MAAM,CAAC,kBAAkB,CAAC;qBAC1B,GAAG,CAAC,IAAI,CAAC,KAAe,CAAC;qBACzB,MAAM,CAAC;oBACN,IAAI;oBACJ,OAAO;oBACP,MAAM;oBACN,eAAe;oBACf,SAAS;oBACT,eAAe;oBACf,iBAAiB;iBAClB,CAAC;qBACD,KAAK,CAAC,CAAC,CAAC;qBACR,KAAK,EAAE,CAAC;YACb,CAAC;YAED,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACxD,MAAM,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;YAE5D,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,OAAO,gBAAgB,CAAC;oBACtB,KAAK,EAAE,KAAK;oBACZ,OAAO,EAAE,IAAI,CAAC,WAAW;wBACvB,CAAC,CAAC,qCAAqC,IAAI,CAAC,WAAW,EAAE;wBACzD,CAAC,CAAC,sCAAsC,IAAI,CAAC,KAAK,EAAE;iBACvD,CAAC,CAAC;YACL,CAAC;YAED,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,OAAO,GAA4B;gBACvC,cAAc,EAAE,SAAS;gBACzB,UAAU,EAAE,UAAU,CAAC,MAAM;aAC9B,CAAC;YAEF,8BAA8B;YAC9B,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC;gBAC7D,CAAC,CAAE,SAAS,CAAC,eAA4B;gBACzC,CAAC,CAAC,SAAS,CAAC;YAEd,oCAAoC;YACpC,IACE,IAAI,CAAC,yBAAyB,KAAK,KAAK;gBACxC,cAAc;gBACd,cAAc,CAAC,MAAM,GAAG,CAAC,EACzB,CAAC;gBACD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAChE,MAAM,MAAM,GAAG,MAAM;qBAClB,kBAAkB,EAAE;qBACpB,MAAM,CAAC,cAAc,CAAC;qBACtB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;qBACvB,MAAM,CAAC;oBACN,IAAI;oBACJ,OAAO;oBACP,KAAK;oBACL,MAAM;oBACN,aAAa;oBACb,SAAS;oBACT,SAAS;oBACT,eAAe;oBACf,SAAS;oBACT,sBAAsB;iBACvB,CAAC;qBACD,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC;qBAC5B,KAAK,EAAE,CAAC;gBACX,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAClD,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;gBAEvD,OAAO,CAAC,kBAAkB,GAAG;oBAC3B,WAAW,EAAE,cAAc,CAAC,MAAM;oBAClC,aAAa,EAAE,YAAY,CAAC,MAAM;oBAClC,KAAK,EAAE,YAAY;iBACpB,CAAC;gBAEF,oDAAoD;gBACpD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;gBACtC,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;oBAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC;wBAC5C,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,oBAAoB,EAAE,CAAC;4BAC3C,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gCAC5B,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;4BACvB,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,IAAI,WAAW,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;oBACzB,MAAM,QAAQ,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC/C,MAAM,QAAQ,GAAG,MAAM;yBACpB,kBAAkB,EAAE;yBACpB,MAAM,CAAC,QAAQ,CAAC;yBAChB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;yBACvB,MAAM,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAC;yBACvE,KAAK,CAAC,EAAE,CAAC;yBACT,KAAK,EAAE,CAAC;oBACX,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBACtD,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;oBAE7C,OAAO,CAAC,gBAAgB,GAAG;wBACzB,WAAW,EAAE,WAAW,CAAC,IAAI;wBAC7B,aAAa,EAAE,MAAM,CAAC,MAAM;wBAC5B,KAAK,EAAE,MAAM;qBACd,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,OAAO,gBAAgB,CAAC;gBACtB,KAAK,EAAE,IAAI;gBACX,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Profile tools for the MCP server.
|
|
3
|
-
* Provides researcher and organization profile aggregation.
|
|
4
|
-
* @module mcp/tools/profile
|
|
5
|
-
*/
|
|
6
|
-
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
7
|
-
import type { DimensionsClient } from "../../dsl/index.js";
|
|
8
|
-
/**
|
|
9
|
-
* Registers all profile tools with the MCP server.
|
|
10
|
-
* @param server - MCP server instance
|
|
11
|
-
* @param client - Dimensions client instance
|
|
12
|
-
*/
|
|
13
|
-
export declare function registerProfileTools(server: McpServer, client: DimensionsClient): void;
|
|
14
|
-
//# sourceMappingURL=profile.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/profile.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAQ3D;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAwYtF"}
|
|
@@ -1,349 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Profile tools for the MCP server.
|
|
3
|
-
* Provides researcher and organization profile aggregation.
|
|
4
|
-
* @module mcp/tools/profile
|
|
5
|
-
*/
|
|
6
|
-
import { ErrorCode, McpError } from "@modelcontextprotocol/sdk/types.js";
|
|
7
|
-
import { z } from "zod";
|
|
8
|
-
import { asArray, formatErrorResult, formatToolResult, READ_ONLY_API_ANNOTATIONS, } from "../utils.js";
|
|
9
|
-
/**
|
|
10
|
-
* Registers all profile tools with the MCP server.
|
|
11
|
-
* @param server - MCP server instance
|
|
12
|
-
* @param client - Dimensions client instance
|
|
13
|
-
*/
|
|
14
|
-
export function registerProfileTools(server, client) {
|
|
15
|
-
// Author/Researcher Profile
|
|
16
|
-
server.registerTool("author_profile", {
|
|
17
|
-
description: "Get a comprehensive profile for a researcher including their publications, grants, and institutional affiliations. Search by name or ORCID.",
|
|
18
|
-
inputSchema: {
|
|
19
|
-
researcherId: z.string().optional().describe("Dimensions researcher ID (if known)"),
|
|
20
|
-
orcid: z.string().optional().describe("ORCID identifier (e.g., '0000-0001-2345-6789')"),
|
|
21
|
-
name: z
|
|
22
|
-
.string()
|
|
23
|
-
.optional()
|
|
24
|
-
.describe("Researcher name to search for (e.g., 'Jennifer Doudna')"),
|
|
25
|
-
includePublications: z
|
|
26
|
-
.boolean()
|
|
27
|
-
.default(true)
|
|
28
|
-
.describe("Include recent publications in profile"),
|
|
29
|
-
includeGrants: z.boolean().default(true).describe("Include grants in profile"),
|
|
30
|
-
publicationLimit: z
|
|
31
|
-
.number()
|
|
32
|
-
.int()
|
|
33
|
-
.min(1)
|
|
34
|
-
.max(100)
|
|
35
|
-
.default(20)
|
|
36
|
-
.describe("Max publications to return"),
|
|
37
|
-
grantLimit: z.number().int().min(1).max(100).default(10).describe("Max grants to return"),
|
|
38
|
-
},
|
|
39
|
-
outputSchema: {
|
|
40
|
-
found: z.boolean().describe("Whether the researcher was found"),
|
|
41
|
-
profile: z
|
|
42
|
-
.record(z.string(), z.unknown())
|
|
43
|
-
.optional()
|
|
44
|
-
.describe("Aggregated researcher profile"),
|
|
45
|
-
message: z.string().optional().describe("Message when not found"),
|
|
46
|
-
},
|
|
47
|
-
annotations: READ_ONLY_API_ANNOTATIONS,
|
|
48
|
-
}, async (args) => {
|
|
49
|
-
// Validate that at least one identifier is provided
|
|
50
|
-
if (!args.researcherId && !args.orcid && !args.name) {
|
|
51
|
-
throw new McpError(ErrorCode.InvalidParams, "Must provide at least one of: researcherId, orcid, or name");
|
|
52
|
-
}
|
|
53
|
-
try {
|
|
54
|
-
// Step 1: Find the researcher
|
|
55
|
-
let researcherDsl;
|
|
56
|
-
if (args.researcherId) {
|
|
57
|
-
researcherDsl = client
|
|
58
|
-
.createQueryBuilder()
|
|
59
|
-
.search("researchers")
|
|
60
|
-
.where("id", "=", args.researcherId)
|
|
61
|
-
.limit(1)
|
|
62
|
-
.build();
|
|
63
|
-
}
|
|
64
|
-
else if (args.orcid) {
|
|
65
|
-
researcherDsl = client
|
|
66
|
-
.createQueryBuilder()
|
|
67
|
-
.search("researchers")
|
|
68
|
-
.where("orcid_id", "=", args.orcid)
|
|
69
|
-
.limit(1)
|
|
70
|
-
.build();
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
const name = args.name;
|
|
74
|
-
if (!name) {
|
|
75
|
-
throw new McpError(ErrorCode.InvalidParams, "Must provide at least one of: researcherId, orcid, or name");
|
|
76
|
-
}
|
|
77
|
-
researcherDsl = client
|
|
78
|
-
.createQueryBuilder()
|
|
79
|
-
.search("researchers")
|
|
80
|
-
.for(name)
|
|
81
|
-
.limit(5)
|
|
82
|
-
.build();
|
|
83
|
-
}
|
|
84
|
-
const researcherResponse = await client.rawQuery(researcherDsl);
|
|
85
|
-
const researchers = asArray(researcherResponse.researchers);
|
|
86
|
-
if (researchers.length === 0) {
|
|
87
|
-
return formatToolResult({
|
|
88
|
-
found: false,
|
|
89
|
-
message: args.name
|
|
90
|
-
? `No researcher found matching: ${args.name}`
|
|
91
|
-
: `No researcher found with provided identifier`,
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
// Use the first/best match
|
|
95
|
-
const researcher = researchers[0];
|
|
96
|
-
if (typeof researcher.id !== "string") {
|
|
97
|
-
return formatErrorResult(new Error("API returned researcher record without a valid id field"));
|
|
98
|
-
}
|
|
99
|
-
const researcherId = researcher.id;
|
|
100
|
-
const profile = {
|
|
101
|
-
researcher,
|
|
102
|
-
matchCount: researchers.length,
|
|
103
|
-
};
|
|
104
|
-
// Steps 2 & 3: Get publications and grants concurrently
|
|
105
|
-
const queries = [];
|
|
106
|
-
if (args.includePublications) {
|
|
107
|
-
queries.push((async () => {
|
|
108
|
-
const pubDsl = client
|
|
109
|
-
.createQueryBuilder()
|
|
110
|
-
.search("publications")
|
|
111
|
-
.where("researchers.id", "=", researcherId)
|
|
112
|
-
.fields(["id", "title", "doi", "year", "times_cited", "journal", "type"])
|
|
113
|
-
.sort("year", "desc")
|
|
114
|
-
.limit(args.publicationLimit)
|
|
115
|
-
.build();
|
|
116
|
-
const pubResponse = await client.rawQuery(pubDsl);
|
|
117
|
-
const publications = asArray(pubResponse.publications);
|
|
118
|
-
profile.publications = {
|
|
119
|
-
totalCount: pubResponse._stats?.total_count ?? publications.length,
|
|
120
|
-
returnedCount: publications.length,
|
|
121
|
-
items: publications,
|
|
122
|
-
};
|
|
123
|
-
})());
|
|
124
|
-
}
|
|
125
|
-
if (args.includeGrants) {
|
|
126
|
-
queries.push((async () => {
|
|
127
|
-
const grantDsl = client
|
|
128
|
-
.createQueryBuilder()
|
|
129
|
-
.search("grants")
|
|
130
|
-
.where("researchers.id", "=", researcherId)
|
|
131
|
-
.fields(["id", "title", "funding_usd", "funder_org_name", "start_year"])
|
|
132
|
-
.sort("start_year", "desc")
|
|
133
|
-
.limit(args.grantLimit)
|
|
134
|
-
.build();
|
|
135
|
-
const grantResponse = await client.rawQuery(grantDsl);
|
|
136
|
-
const grants = asArray(grantResponse.grants);
|
|
137
|
-
profile.grants = {
|
|
138
|
-
totalCount: grantResponse._stats?.total_count ?? grants.length,
|
|
139
|
-
returnedCount: grants.length,
|
|
140
|
-
items: grants,
|
|
141
|
-
};
|
|
142
|
-
})());
|
|
143
|
-
}
|
|
144
|
-
await Promise.all(queries);
|
|
145
|
-
return formatToolResult({
|
|
146
|
-
found: true,
|
|
147
|
-
profile,
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
catch (error) {
|
|
151
|
-
return formatErrorResult(error);
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
// Organization Profile
|
|
155
|
-
server.registerTool("org_profile", {
|
|
156
|
-
description: "Get a comprehensive profile for a research organization including publication output, funding received, and top researchers. " +
|
|
157
|
-
"Prefer organizationId (GRID id) when known — common names can match multiple organizations.",
|
|
158
|
-
inputSchema: {
|
|
159
|
-
organizationId: z
|
|
160
|
-
.string()
|
|
161
|
-
.optional()
|
|
162
|
-
.describe("Dimensions organization GRID id (preferred, e.g. grid.168010.e for Stanford University)"),
|
|
163
|
-
name: z
|
|
164
|
-
.string()
|
|
165
|
-
.optional()
|
|
166
|
-
.describe("Organization name to search for (e.g., 'Stanford University', 'MIT')"),
|
|
167
|
-
includePublications: z.boolean().default(true).describe("Include recent publications"),
|
|
168
|
-
includeGrants: z.boolean().default(true).describe("Include grants received"),
|
|
169
|
-
includeTopResearchers: z
|
|
170
|
-
.boolean()
|
|
171
|
-
.default(true)
|
|
172
|
-
.describe("Include top researchers by publication count"),
|
|
173
|
-
publicationLimit: z
|
|
174
|
-
.number()
|
|
175
|
-
.int()
|
|
176
|
-
.min(1)
|
|
177
|
-
.max(100)
|
|
178
|
-
.default(20)
|
|
179
|
-
.describe("Max publications to return"),
|
|
180
|
-
grantLimit: z.number().int().min(1).max(100).default(10).describe("Max grants to return"),
|
|
181
|
-
researcherLimit: z
|
|
182
|
-
.number()
|
|
183
|
-
.int()
|
|
184
|
-
.min(1)
|
|
185
|
-
.max(50)
|
|
186
|
-
.default(10)
|
|
187
|
-
.describe("Max researchers to return"),
|
|
188
|
-
},
|
|
189
|
-
outputSchema: {
|
|
190
|
-
found: z.boolean().describe("Whether the organization was found"),
|
|
191
|
-
ambiguous: z
|
|
192
|
-
.boolean()
|
|
193
|
-
.optional()
|
|
194
|
-
.describe("True when name search matched multiple organizations"),
|
|
195
|
-
matchCount: z.number().optional().describe("Number of name matches returned"),
|
|
196
|
-
candidates: z
|
|
197
|
-
.array(z.record(z.string(), z.unknown()))
|
|
198
|
-
.optional()
|
|
199
|
-
.describe("Matching organizations when ambiguous (id and name)"),
|
|
200
|
-
profile: z
|
|
201
|
-
.record(z.string(), z.unknown())
|
|
202
|
-
.optional()
|
|
203
|
-
.describe("Aggregated organization profile"),
|
|
204
|
-
message: z.string().optional().describe("Message when not found or ambiguous"),
|
|
205
|
-
},
|
|
206
|
-
annotations: READ_ONLY_API_ANNOTATIONS,
|
|
207
|
-
}, async (args) => {
|
|
208
|
-
// Validate that at least one identifier is provided
|
|
209
|
-
if (!args.organizationId && !args.name) {
|
|
210
|
-
throw new McpError(ErrorCode.InvalidParams, "Must provide either organizationId or name");
|
|
211
|
-
}
|
|
212
|
-
try {
|
|
213
|
-
// Step 1: Find the organization
|
|
214
|
-
let orgDsl;
|
|
215
|
-
if (args.organizationId) {
|
|
216
|
-
orgDsl = client
|
|
217
|
-
.createQueryBuilder()
|
|
218
|
-
.search("organizations")
|
|
219
|
-
.where("id", "=", args.organizationId)
|
|
220
|
-
.limit(1)
|
|
221
|
-
.build();
|
|
222
|
-
}
|
|
223
|
-
else {
|
|
224
|
-
const name = args.name;
|
|
225
|
-
if (!name) {
|
|
226
|
-
throw new McpError(ErrorCode.InvalidParams, "Must provide either organizationId or name");
|
|
227
|
-
}
|
|
228
|
-
orgDsl = client.createQueryBuilder().search("organizations").for(name).limit(5).build();
|
|
229
|
-
}
|
|
230
|
-
const orgResponse = await client.rawQuery(orgDsl);
|
|
231
|
-
const organizations = asArray(orgResponse.organizations);
|
|
232
|
-
if (organizations.length === 0) {
|
|
233
|
-
return formatToolResult({
|
|
234
|
-
found: false,
|
|
235
|
-
message: args.name
|
|
236
|
-
? `No organization found matching: ${args.name}`
|
|
237
|
-
: `No organization found with provided ID`,
|
|
238
|
-
});
|
|
239
|
-
}
|
|
240
|
-
if (!args.organizationId && organizations.length > 1) {
|
|
241
|
-
const candidates = organizations.map((org) => ({
|
|
242
|
-
id: org.id,
|
|
243
|
-
name: org.name,
|
|
244
|
-
}));
|
|
245
|
-
return formatToolResult({
|
|
246
|
-
found: false,
|
|
247
|
-
ambiguous: true,
|
|
248
|
-
matchCount: organizations.length,
|
|
249
|
-
candidates,
|
|
250
|
-
message: `Name "${args.name}" matched ${organizations.length} organizations. ` +
|
|
251
|
-
"Pass organizationId (GRID id) to disambiguate.",
|
|
252
|
-
});
|
|
253
|
-
}
|
|
254
|
-
const organization = organizations[0];
|
|
255
|
-
if (typeof organization.id !== "string") {
|
|
256
|
-
return formatErrorResult(new Error("API returned organization record without a valid id field"));
|
|
257
|
-
}
|
|
258
|
-
const orgId = organization.id;
|
|
259
|
-
const profile = {
|
|
260
|
-
organization,
|
|
261
|
-
matchCount: organizations.length,
|
|
262
|
-
};
|
|
263
|
-
// Steps 2, 3 & 4: Get publications, grants, and top researchers concurrently
|
|
264
|
-
const orgQueries = [];
|
|
265
|
-
if (args.includePublications) {
|
|
266
|
-
orgQueries.push((async () => {
|
|
267
|
-
const pubDsl = client
|
|
268
|
-
.createQueryBuilder()
|
|
269
|
-
.search("publications")
|
|
270
|
-
.where("research_orgs.id", "=", orgId)
|
|
271
|
-
.fields(["id", "title", "doi", "year", "times_cited", "authors"])
|
|
272
|
-
.sort("year", "desc")
|
|
273
|
-
.limit(args.publicationLimit)
|
|
274
|
-
.build();
|
|
275
|
-
const pubResponse = await client.rawQuery(pubDsl);
|
|
276
|
-
const publications = asArray(pubResponse.publications);
|
|
277
|
-
profile.publications = {
|
|
278
|
-
totalCount: pubResponse._stats?.total_count ?? publications.length,
|
|
279
|
-
returnedCount: publications.length,
|
|
280
|
-
items: publications,
|
|
281
|
-
};
|
|
282
|
-
})());
|
|
283
|
-
}
|
|
284
|
-
if (args.includeGrants) {
|
|
285
|
-
orgQueries.push((async () => {
|
|
286
|
-
const grantDsl = client
|
|
287
|
-
.createQueryBuilder()
|
|
288
|
-
.search("grants")
|
|
289
|
-
.where("research_orgs.id", "=", orgId)
|
|
290
|
-
.fields(["id", "title", "funding_usd", "funder_org_name", "start_year"])
|
|
291
|
-
.sort("start_year", "desc")
|
|
292
|
-
.limit(args.grantLimit)
|
|
293
|
-
.build();
|
|
294
|
-
const grantResponse = await client.rawQuery(grantDsl);
|
|
295
|
-
const grants = asArray(grantResponse.grants);
|
|
296
|
-
// Calculate total funding if available
|
|
297
|
-
let totalFunding = 0;
|
|
298
|
-
for (const grant of grants) {
|
|
299
|
-
const funding = typeof grant.funding_usd === "number" ? grant.funding_usd : 0;
|
|
300
|
-
if (funding > 0) {
|
|
301
|
-
totalFunding += funding;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
profile.grants = {
|
|
305
|
-
totalCount: grantResponse._stats?.total_count ?? grants.length,
|
|
306
|
-
returnedCount: grants.length,
|
|
307
|
-
totalFundingUsd: totalFunding,
|
|
308
|
-
items: grants,
|
|
309
|
-
};
|
|
310
|
-
})());
|
|
311
|
-
}
|
|
312
|
-
if (args.includeTopResearchers) {
|
|
313
|
-
orgQueries.push((async () => {
|
|
314
|
-
const resDsl = client
|
|
315
|
-
.createQueryBuilder()
|
|
316
|
-
.search("researchers")
|
|
317
|
-
.where("research_orgs.id", "=", orgId)
|
|
318
|
-
.fields([
|
|
319
|
-
"id",
|
|
320
|
-
"first_name",
|
|
321
|
-
"last_name",
|
|
322
|
-
"orcid_id",
|
|
323
|
-
"total_publications",
|
|
324
|
-
"total_grants",
|
|
325
|
-
])
|
|
326
|
-
.sort("total_publications", "desc")
|
|
327
|
-
.limit(args.researcherLimit)
|
|
328
|
-
.build();
|
|
329
|
-
const resResponse = await client.rawQuery(resDsl);
|
|
330
|
-
const researchers = asArray(resResponse.researchers);
|
|
331
|
-
profile.topResearchers = {
|
|
332
|
-
totalCount: resResponse._stats?.total_count ?? researchers.length,
|
|
333
|
-
returnedCount: researchers.length,
|
|
334
|
-
items: researchers,
|
|
335
|
-
};
|
|
336
|
-
})());
|
|
337
|
-
}
|
|
338
|
-
await Promise.all(orgQueries);
|
|
339
|
-
return formatToolResult({
|
|
340
|
-
found: true,
|
|
341
|
-
profile,
|
|
342
|
-
});
|
|
343
|
-
}
|
|
344
|
-
catch (error) {
|
|
345
|
-
return formatErrorResult(error);
|
|
346
|
-
}
|
|
347
|
-
});
|
|
348
|
-
}
|
|
349
|
-
//# sourceMappingURL=profile.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../../src/mcp/tools/profile.ts"],"names":[],"mappings":"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"}
|