@cyanheads/who-gho-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 (57) hide show
  1. package/CLAUDE.md +391 -0
  2. package/Dockerfile +98 -0
  3. package/LICENSE +201 -0
  4. package/README.md +294 -0
  5. package/changelog/0.1.x/0.1.0.md +20 -0
  6. package/changelog/0.1.x/0.1.1.md +23 -0
  7. package/changelog/template.md +119 -0
  8. package/dist/config/server-config.d.ts +9 -0
  9. package/dist/config/server-config.d.ts.map +1 -0
  10. package/dist/config/server-config.js +28 -0
  11. package/dist/config/server-config.js.map +1 -0
  12. package/dist/index.d.ts +7 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +36 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/mcp-server/resources/definitions/who-dimension-values.resource.d.ts +18 -0
  17. package/dist/mcp-server/resources/definitions/who-dimension-values.resource.d.ts.map +1 -0
  18. package/dist/mcp-server/resources/definitions/who-dimension-values.resource.js +41 -0
  19. package/dist/mcp-server/resources/definitions/who-dimension-values.resource.js.map +1 -0
  20. package/dist/mcp-server/resources/definitions/who-indicator-metadata.resource.d.ts +16 -0
  21. package/dist/mcp-server/resources/definitions/who-indicator-metadata.resource.d.ts.map +1 -0
  22. package/dist/mcp-server/resources/definitions/who-indicator-metadata.resource.js +44 -0
  23. package/dist/mcp-server/resources/definitions/who-indicator-metadata.resource.js.map +1 -0
  24. package/dist/mcp-server/tools/definitions/who-get-indicator-metadata.tool.d.ts +25 -0
  25. package/dist/mcp-server/tools/definitions/who-get-indicator-metadata.tool.d.ts.map +1 -0
  26. package/dist/mcp-server/tools/definitions/who-get-indicator-metadata.tool.js +112 -0
  27. package/dist/mcp-server/tools/definitions/who-get-indicator-metadata.tool.js.map +1 -0
  28. package/dist/mcp-server/tools/definitions/who-list-dimension-values.tool.d.ts +24 -0
  29. package/dist/mcp-server/tools/definitions/who-list-dimension-values.tool.d.ts.map +1 -0
  30. package/dist/mcp-server/tools/definitions/who-list-dimension-values.tool.js +76 -0
  31. package/dist/mcp-server/tools/definitions/who-list-dimension-values.tool.js.map +1 -0
  32. package/dist/mcp-server/tools/definitions/who-list-dimensions.tool.d.ts +12 -0
  33. package/dist/mcp-server/tools/definitions/who-list-dimensions.tool.d.ts.map +1 -0
  34. package/dist/mcp-server/tools/definitions/who-list-dimensions.tool.js +38 -0
  35. package/dist/mcp-server/tools/definitions/who-list-dimensions.tool.js.map +1 -0
  36. package/dist/mcp-server/tools/definitions/who-list-indicators.tool.d.ts +17 -0
  37. package/dist/mcp-server/tools/definitions/who-list-indicators.tool.d.ts.map +1 -0
  38. package/dist/mcp-server/tools/definitions/who-list-indicators.tool.js +64 -0
  39. package/dist/mcp-server/tools/definitions/who-list-indicators.tool.js.map +1 -0
  40. package/dist/mcp-server/tools/definitions/who-query-indicator-data.tool.d.ts +58 -0
  41. package/dist/mcp-server/tools/definitions/who-query-indicator-data.tool.d.ts.map +1 -0
  42. package/dist/mcp-server/tools/definitions/who-query-indicator-data.tool.js +215 -0
  43. package/dist/mcp-server/tools/definitions/who-query-indicator-data.tool.js.map +1 -0
  44. package/dist/mcp-server/tools/definitions/who-search-indicators.tool.d.ts +23 -0
  45. package/dist/mcp-server/tools/definitions/who-search-indicators.tool.d.ts.map +1 -0
  46. package/dist/mcp-server/tools/definitions/who-search-indicators.tool.js +89 -0
  47. package/dist/mcp-server/tools/definitions/who-search-indicators.tool.js.map +1 -0
  48. package/dist/services/gho/gho-service.d.ts +50 -0
  49. package/dist/services/gho/gho-service.d.ts.map +1 -0
  50. package/dist/services/gho/gho-service.js +263 -0
  51. package/dist/services/gho/gho-service.js.map +1 -0
  52. package/dist/services/gho/types.d.ts +113 -0
  53. package/dist/services/gho/types.d.ts.map +1 -0
  54. package/dist/services/gho/types.js +6 -0
  55. package/dist/services/gho/types.js.map +1 -0
  56. package/package.json +79 -0
  57. package/server.json +99 -0
@@ -0,0 +1,263 @@
1
+ /**
2
+ * @fileoverview GHO OData API client for the WHO Global Health Observatory.
3
+ * @module services/gho/gho-service
4
+ */
5
+ import { notFound, serviceUnavailable } from '@cyanheads/mcp-ts-core/errors';
6
+ import { withRetry } from '@cyanheads/mcp-ts-core/utils';
7
+ import { getServerConfig } from '../../config/server-config.js';
8
+ /** Dimensions that are internal publishing workflow states, not user-filterable data dimensions. */
9
+ const INTERNAL_DIMENSIONS = new Set(['PUBLISHSTATE']);
10
+ export class GhoService {
11
+ baseUrl;
12
+ timeoutMs;
13
+ constructor(_config, _storage) {
14
+ const serverCfg = getServerConfig();
15
+ // Ensure base URL has no trailing slash for consistent concatenation
16
+ this.baseUrl = serverCfg.baseUrl.replace(/\/$/, '');
17
+ this.timeoutMs = serverCfg.requestTimeoutMs;
18
+ }
19
+ /** Fetch the indicator catalog with optional keyword search. */
20
+ listIndicators(params, ctx) {
21
+ return withRetry(async () => {
22
+ const qs = new URLSearchParams({
23
+ $top: String(params.limit),
24
+ $skip: String(params.offset),
25
+ $count: 'true',
26
+ });
27
+ if (params.query) {
28
+ qs.set('$filter', `contains(IndicatorName,'${this.escapeODataString(params.query)}')`);
29
+ }
30
+ const url = `${this.baseUrl}/Indicator?${qs}`;
31
+ const data = await this.getJson(url, ctx);
32
+ return {
33
+ indicators: data.value.map((r) => ({
34
+ indicatorCode: r.IndicatorCode,
35
+ indicatorName: r.IndicatorName,
36
+ })),
37
+ total: data['@odata.count'] ?? data.value.length,
38
+ };
39
+ }, { operation: 'GhoService.listIndicators', signal: ctx.signal });
40
+ }
41
+ /** Fetch all dimension type codes and titles. */
42
+ listDimensions(ctx) {
43
+ return withRetry(async () => {
44
+ const url = `${this.baseUrl}/DIMENSION`;
45
+ const data = await this.getJson(url, ctx);
46
+ return data.value.map((d) => ({ code: d.Code, title: d.Title }));
47
+ }, { operation: 'GhoService.listDimensions', signal: ctx.signal });
48
+ }
49
+ /** Fetch valid values for a dimension type. Returns empty array if unknown code. */
50
+ listDimensionValues(dimensionCode, ctx) {
51
+ return withRetry(async () => {
52
+ const url = `${this.baseUrl}/DIMENSION/${encodeURIComponent(dimensionCode)}/DimensionValues`;
53
+ const data = await this.getJson(url, ctx);
54
+ return data.value.map((v) => {
55
+ const entry = { code: v.Code, label: v.Title };
56
+ if (v.ParentCode)
57
+ entry.parentCode = v.ParentCode;
58
+ if (v.ParentTitle)
59
+ entry.parentLabel = v.ParentTitle;
60
+ if (v.ParentDimension)
61
+ entry.parentDimension = v.ParentDimension;
62
+ return entry;
63
+ });
64
+ }, { operation: 'GhoService.listDimensionValues', signal: ctx.signal });
65
+ }
66
+ /**
67
+ * Fetch dimension metadata for multiple indicator codes in parallel.
68
+ * Returns a map of code → dimensions. Codes with empty metadata are absent from the map.
69
+ */
70
+ async getIndicatorDimensions(indicatorCodes, ctx) {
71
+ const results = await Promise.all(indicatorCodes.map(async (code) => {
72
+ const dims = await withRetry(async () => {
73
+ const qs = new URLSearchParams({
74
+ $filter: `IndicatorCode eq '${this.escapeODataString(code)}'`,
75
+ });
76
+ const url = `${this.baseUrl}/IndicatorDimension?${qs}`;
77
+ const data = await this.getJson(url, ctx);
78
+ return data.value
79
+ .filter((d) => !INTERNAL_DIMENSIONS.has(d.Dimension))
80
+ .map((d) => ({ dimension: d.Dimension, dimensionName: d.DimensionName }));
81
+ }, {
82
+ operation: `GhoService.getIndicatorDimensions(${code})`,
83
+ signal: ctx.signal,
84
+ });
85
+ return [code, dims];
86
+ }));
87
+ const map = new Map();
88
+ for (const [code, dims] of results) {
89
+ if (dims.length > 0)
90
+ map.set(code, dims);
91
+ }
92
+ return map;
93
+ }
94
+ /** Query data rows for an indicator with optional OData filters. */
95
+ queryData(params, ctx) {
96
+ return withRetry(async () => {
97
+ const filterParts = [];
98
+ // Spatial filter: at most one of country/region/income group
99
+ if (params.countryCodes?.length) {
100
+ const codes = params.countryCodes.map((c) => `'${this.escapeODataString(c)}'`).join(',');
101
+ filterParts.push(`SpatialDimType eq 'COUNTRY' and SpatialDim in (${codes})`);
102
+ }
103
+ else if (params.regionCodes?.length) {
104
+ const codes = params.regionCodes.map((c) => `'${this.escapeODataString(c)}'`).join(',');
105
+ filterParts.push(`SpatialDimType eq 'REGION' and SpatialDim in (${codes})`);
106
+ }
107
+ else if (params.incomeGroupCodes?.length) {
108
+ const codes = params.incomeGroupCodes
109
+ .map((c) => `'${this.escapeODataString(c)}'`)
110
+ .join(',');
111
+ filterParts.push(`SpatialDimType eq 'WORLDBANKINCOMEGROUP' and SpatialDim in (${codes})`);
112
+ }
113
+ // Year range
114
+ if (params.yearFrom != null)
115
+ filterParts.push(`TimeDim ge ${params.yearFrom}`);
116
+ if (params.yearTo != null)
117
+ filterParts.push(`TimeDim le ${params.yearTo}`);
118
+ // Dim1 filter: sex takes precedence, then arbitrary dim1_value
119
+ if (params.sex) {
120
+ filterParts.push(`Dim1Type eq 'SEX' and Dim1 eq '${this.escapeODataString(params.sex)}'`);
121
+ }
122
+ else if (params.dim1Value) {
123
+ filterParts.push(`Dim1 eq '${this.escapeODataString(params.dim1Value)}'`);
124
+ }
125
+ // Field selection
126
+ const selectFields = [
127
+ 'IndicatorCode',
128
+ 'SpatialDimType',
129
+ 'SpatialDim',
130
+ 'TimeDim',
131
+ 'ParentLocation',
132
+ 'Dim1Type',
133
+ 'Dim1',
134
+ 'Dim2Type',
135
+ 'Dim2',
136
+ 'NumericValue',
137
+ 'Value',
138
+ 'Comments',
139
+ ...(params.includeUncertainty ? ['Low', 'High'] : []),
140
+ ];
141
+ const qs = new URLSearchParams({
142
+ $top: String(params.limit),
143
+ $count: 'true',
144
+ $select: selectFields.join(','),
145
+ });
146
+ if (filterParts.length > 0) {
147
+ qs.set('$filter', filterParts.join(' and '));
148
+ }
149
+ const url = `${this.baseUrl}/${encodeURIComponent(params.indicatorCode)}?${qs}`;
150
+ const response = await this.fetchRaw(url, ctx);
151
+ // 404 means unknown indicator code
152
+ if (response.status === 404) {
153
+ throw notFound(`Indicator code "${params.indicatorCode}" not found in the GHO catalog.`, {
154
+ reason: 'indicator_not_found',
155
+ indicatorCode: params.indicatorCode,
156
+ });
157
+ }
158
+ const text = await response.text();
159
+ if (/^\s*<(!DOCTYPE\s+html|html[\s>])/i.test(text)) {
160
+ throw serviceUnavailable('GHO API returned HTML instead of JSON — possibly rate-limited or temporarily unavailable.');
161
+ }
162
+ let data;
163
+ try {
164
+ data = JSON.parse(text);
165
+ }
166
+ catch {
167
+ throw serviceUnavailable('GHO API returned unparseable response.');
168
+ }
169
+ const totalRows = data['@odata.count'] ?? data.value.length;
170
+ const rows = data.value.map((r) => this.normalizeRow(r, params.includeUncertainty));
171
+ return { rows, totalRows, truncated: totalRows > params.limit };
172
+ }, { operation: 'GhoService.queryData', signal: ctx.signal });
173
+ }
174
+ normalizeRow(r, includeUncertainty) {
175
+ const row = {
176
+ indicatorCode: r.IndicatorCode,
177
+ year: r.TimeDim ?? 0,
178
+ };
179
+ if (r.SpatialDimType)
180
+ row.spatialDimType = r.SpatialDimType;
181
+ if (r.SpatialDim)
182
+ row.spatialDim = r.SpatialDim;
183
+ if (r.ParentLocation)
184
+ row.spatialLabel = r.ParentLocation;
185
+ if (r.Dim1Type)
186
+ row.dim1Type = r.Dim1Type;
187
+ if (r.Dim1)
188
+ row.dim1 = r.Dim1;
189
+ if (r.Dim2Type)
190
+ row.dim2Type = r.Dim2Type;
191
+ if (r.Dim2)
192
+ row.dim2 = r.Dim2;
193
+ if (r.NumericValue != null)
194
+ row.numericValue = r.NumericValue;
195
+ if (includeUncertainty) {
196
+ if (r.Low != null)
197
+ row.low = r.Low;
198
+ if (r.High != null)
199
+ row.high = r.High;
200
+ }
201
+ if (r.Value)
202
+ row.displayValue = r.Value;
203
+ if (r.Comments)
204
+ row.comments = r.Comments;
205
+ return row;
206
+ }
207
+ /**
208
+ * Raw fetch with composed timeout + cancellation signal.
209
+ * Does not throw on non-2xx — callers inspect `response.status` as needed.
210
+ */
211
+ async fetchRaw(url, ctx) {
212
+ const controller = new AbortController();
213
+ const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);
214
+ const onAbort = () => controller.abort();
215
+ ctx.signal.addEventListener('abort', onAbort, { once: true });
216
+ try {
217
+ return await fetch(url, { signal: controller.signal });
218
+ }
219
+ catch (err) {
220
+ if (ctx.signal.aborted) {
221
+ throw serviceUnavailable('Request cancelled.', { url });
222
+ }
223
+ throw serviceUnavailable(`Network error fetching ${url}`, { url }, { cause: err });
224
+ }
225
+ finally {
226
+ clearTimeout(timeoutId);
227
+ ctx.signal.removeEventListener('abort', onAbort);
228
+ }
229
+ }
230
+ /** Internal: fetch JSON from a URL and parse the OData envelope. Throws ServiceUnavailable on non-2xx. */
231
+ async getJson(url, ctx) {
232
+ const response = await this.fetchRaw(url, ctx);
233
+ if (!response.ok) {
234
+ throw serviceUnavailable(`GHO API returned HTTP ${response.status} for ${url}.`);
235
+ }
236
+ const text = await response.text();
237
+ if (/^\s*<(!DOCTYPE\s+html|html[\s>])/i.test(text)) {
238
+ throw serviceUnavailable('GHO API returned HTML instead of JSON — possibly rate-limited or temporarily unavailable.');
239
+ }
240
+ try {
241
+ return JSON.parse(text);
242
+ }
243
+ catch {
244
+ throw serviceUnavailable('GHO API returned unparseable response.');
245
+ }
246
+ }
247
+ /** Escape single quotes in OData string values. */
248
+ escapeODataString(value) {
249
+ return value.replace(/'/g, "''");
250
+ }
251
+ }
252
+ // --- Init/accessor pattern ---
253
+ let _service;
254
+ export function initGhoService(config, storage) {
255
+ _service = new GhoService(config, storage);
256
+ }
257
+ export function getGhoService() {
258
+ if (!_service) {
259
+ throw new Error('GhoService not initialized — call initGhoService() in setup()');
260
+ }
261
+ return _service;
262
+ }
263
+ //# sourceMappingURL=gho-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gho-service.js","sourceRoot":"","sources":["../../../src/services/gho/gho-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * @fileoverview Domain types for the WHO GHO OData API.
3
+ * @module services/gho/types
4
+ */
5
+ /** Raw OData indicator entry from GET /Indicator */
6
+ export interface RawIndicator {
7
+ IndicatorCode: string;
8
+ IndicatorName: string;
9
+ Language?: string;
10
+ }
11
+ /** Raw OData dimension type entry from GET /DIMENSION */
12
+ export interface RawDimension {
13
+ Code: string;
14
+ Title: string;
15
+ }
16
+ /** Raw OData dimension value entry from GET /DIMENSION/{code}/DimensionValues */
17
+ export interface RawDimensionValue {
18
+ Code: string;
19
+ Dimension?: string;
20
+ ParentCode?: string;
21
+ ParentDimension?: string;
22
+ ParentTitle?: string;
23
+ Title: string;
24
+ }
25
+ /** Raw OData IndicatorDimension entry from GET /IndicatorDimension */
26
+ export interface RawIndicatorDimension {
27
+ Dimension: string;
28
+ DimensionName: string;
29
+ IndicatorCode: string;
30
+ Language?: string;
31
+ }
32
+ /** Raw OData data row from GET /{IndicatorCode} */
33
+ export interface RawDataRow {
34
+ Comments?: string | null;
35
+ Date?: string;
36
+ Dim1?: string;
37
+ Dim1Type?: string;
38
+ Dim2?: string;
39
+ Dim2Type?: string;
40
+ Dim3?: string;
41
+ Dim3Type?: string;
42
+ High?: number | null;
43
+ Id?: number;
44
+ IndicatorCode: string;
45
+ Low?: number | null;
46
+ NumericValue?: number | null;
47
+ ParentLocation?: string;
48
+ ParentLocationCode?: string;
49
+ SpatialDim?: string;
50
+ SpatialDimType?: string;
51
+ TimeDim?: number;
52
+ TimeDimType?: string;
53
+ Value?: string | null;
54
+ }
55
+ /** OData envelope with an optional count */
56
+ export interface ODataEnvelope<T> {
57
+ '@odata.count'?: number;
58
+ value: T[];
59
+ }
60
+ /** Normalized indicator entry */
61
+ export interface Indicator {
62
+ indicatorCode: string;
63
+ indicatorName: string;
64
+ }
65
+ /** Normalized dimension type */
66
+ export interface Dimension {
67
+ code: string;
68
+ title: string;
69
+ }
70
+ /** Normalized dimension value */
71
+ export interface DimensionValue {
72
+ code: string;
73
+ label: string;
74
+ parentCode?: string;
75
+ parentDimension?: string;
76
+ parentLabel?: string;
77
+ }
78
+ /** Normalized indicator-dimension cross-reference entry */
79
+ export interface IndicatorDimensionEntry {
80
+ dimension: string;
81
+ dimensionName: string;
82
+ }
83
+ /** Normalized data row */
84
+ export interface DataRow {
85
+ comments?: string;
86
+ dim1?: string;
87
+ dim1Type?: string;
88
+ dim2?: string;
89
+ dim2Type?: string;
90
+ displayValue?: string;
91
+ high?: number;
92
+ indicatorCode: string;
93
+ low?: number;
94
+ numericValue?: number;
95
+ spatialDim?: string;
96
+ spatialDimType?: string;
97
+ spatialLabel?: string;
98
+ year: number;
99
+ }
100
+ /** Parameters for querying indicator data */
101
+ export interface DataQueryParams {
102
+ countryCodes?: string[];
103
+ dim1Value?: string;
104
+ includeUncertainty: boolean;
105
+ incomeGroupCodes?: string[];
106
+ indicatorCode: string;
107
+ limit: number;
108
+ regionCodes?: string[];
109
+ sex?: string;
110
+ yearFrom?: number;
111
+ yearTo?: number;
112
+ }
113
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/gho/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @fileoverview Domain types for the WHO GHO OData API.
3
+ * @module services/gho/types
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/gho/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
package/package.json ADDED
@@ -0,0 +1,79 @@
1
+ {
2
+ "name": "@cyanheads/who-gho-mcp-server",
3
+ "version": "0.1.1",
4
+ "description": "MCP server for the WHO Global Health Observatory — 3,059 global health indicators across 194 member states with country, region, year, and sex filters.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "who-gho-mcp-server": "dist/index.js"
10
+ },
11
+ "files": [
12
+ "changelog/",
13
+ "dist/",
14
+ "README.md",
15
+ "LICENSE",
16
+ "CLAUDE.md",
17
+ "AGENTS.md",
18
+ "Dockerfile",
19
+ "server.json"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsx scripts/build.ts",
23
+ "rebuild": "tsx scripts/clean.ts && tsx scripts/build.ts",
24
+ "clean": "tsx scripts/clean.ts",
25
+ "devcheck": "tsx scripts/devcheck.ts",
26
+ "audit:refresh": "rm -f bun.lock && bun install && bun audit",
27
+ "tree": "tsx scripts/tree.ts",
28
+ "list-skills": "tsx scripts/list-skills.ts",
29
+ "format": "biome check --write --unsafe .",
30
+ "lint:mcp": "tsx scripts/lint-mcp.ts",
31
+ "lint:packaging": "tsx scripts/lint-packaging.ts",
32
+ "bundle": "npm run build && npx -y @anthropic-ai/mcpb pack . dist/who-gho-mcp-server.mcpb",
33
+ "changelog:build": "tsx scripts/build-changelog.ts",
34
+ "changelog:check": "tsx scripts/build-changelog.ts --check",
35
+ "test": "vitest run",
36
+ "start": "node dist/index.js",
37
+ "start:stdio": "MCP_TRANSPORT_TYPE=stdio node dist/index.js",
38
+ "start:http": "MCP_TRANSPORT_TYPE=http node dist/index.js"
39
+ },
40
+ "keywords": [
41
+ "mcp",
42
+ "mcp-server",
43
+ "model-context-protocol",
44
+ "who",
45
+ "gho",
46
+ "global-health",
47
+ "health-data",
48
+ "global-health-observatory",
49
+ "odata",
50
+ "public-health"
51
+ ],
52
+ "repository": {
53
+ "type": "git",
54
+ "url": "https://github.com/cyanheads/who-gho-mcp-server"
55
+ },
56
+ "license": "Apache-2.0",
57
+ "engines": {
58
+ "bun": ">=1.3.0",
59
+ "node": ">=24.0.0"
60
+ },
61
+ "publishConfig": {
62
+ "access": "public"
63
+ },
64
+ "dependencies": {
65
+ "@cyanheads/mcp-ts-core": "^0.9.7",
66
+ "pino-pretty": "^13.1.3",
67
+ "zod": "^4.4.3"
68
+ },
69
+ "devDependencies": {
70
+ "@biomejs/biome": "^2.4.15",
71
+ "@types/node": "^25.9.1",
72
+ "depcheck": "^1.4.7",
73
+ "ignore": "^7.0.5",
74
+ "tsc-alias": "^1.8.17",
75
+ "tsx": "^4.22.3",
76
+ "typescript": "^6.0.3",
77
+ "vitest": "^4.1.7"
78
+ }
79
+ }
package/server.json ADDED
@@ -0,0 +1,99 @@
1
+ {
2
+ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
+ "name": "cyanheads/who-gho-mcp-server",
4
+ "description": "WHO Global Health Observatory MCP server — 3,059 health indicators across 194 member states.",
5
+ "repository": {
6
+ "url": "https://github.com/cyanheads/who-gho-mcp-server",
7
+ "source": "github"
8
+ },
9
+ "version": "0.1.1",
10
+ "packages": [
11
+ {
12
+ "registryType": "npm",
13
+ "registryBaseUrl": "https://registry.npmjs.org",
14
+ "identifier": "@cyanheads/who-gho-mcp-server",
15
+ "runtimeHint": "node",
16
+ "version": "0.1.1",
17
+ "packageArguments": [
18
+ {
19
+ "type": "positional",
20
+ "value": "run"
21
+ },
22
+ {
23
+ "type": "positional",
24
+ "value": "start:stdio"
25
+ }
26
+ ],
27
+ "environmentVariables": [
28
+ {
29
+ "name": "MCP_LOG_LEVEL",
30
+ "description": "Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').",
31
+ "format": "string",
32
+ "isRequired": false,
33
+ "default": "info"
34
+ }
35
+ ],
36
+ "transport": {
37
+ "type": "stdio"
38
+ }
39
+ },
40
+ {
41
+ "registryType": "npm",
42
+ "registryBaseUrl": "https://registry.npmjs.org",
43
+ "identifier": "@cyanheads/who-gho-mcp-server",
44
+ "runtimeHint": "node",
45
+ "version": "0.1.1",
46
+ "packageArguments": [
47
+ {
48
+ "type": "positional",
49
+ "value": "run"
50
+ },
51
+ {
52
+ "type": "positional",
53
+ "value": "start:http"
54
+ }
55
+ ],
56
+ "environmentVariables": [
57
+ {
58
+ "name": "MCP_HTTP_HOST",
59
+ "description": "The hostname for the HTTP server.",
60
+ "format": "string",
61
+ "isRequired": false,
62
+ "default": "127.0.0.1"
63
+ },
64
+ {
65
+ "name": "MCP_HTTP_PORT",
66
+ "description": "The port to run the HTTP server on.",
67
+ "format": "string",
68
+ "isRequired": false,
69
+ "default": "3010"
70
+ },
71
+ {
72
+ "name": "MCP_HTTP_ENDPOINT_PATH",
73
+ "description": "The endpoint path for the MCP server.",
74
+ "format": "string",
75
+ "isRequired": false,
76
+ "default": "/mcp"
77
+ },
78
+ {
79
+ "name": "MCP_AUTH_MODE",
80
+ "description": "Authentication mode to use: 'none', 'jwt', or 'oauth'.",
81
+ "format": "string",
82
+ "isRequired": false,
83
+ "default": "none"
84
+ },
85
+ {
86
+ "name": "MCP_LOG_LEVEL",
87
+ "description": "Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').",
88
+ "format": "string",
89
+ "isRequired": false,
90
+ "default": "info"
91
+ }
92
+ ],
93
+ "transport": {
94
+ "type": "streamable-http",
95
+ "url": "http://localhost:3010/mcp"
96
+ }
97
+ }
98
+ ]
99
+ }