@omophub/omophub-mcp 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +301 -0
  3. package/dist/client/api.d.ts +10 -0
  4. package/dist/client/api.d.ts.map +1 -0
  5. package/dist/client/api.js +168 -0
  6. package/dist/client/api.js.map +1 -0
  7. package/dist/client/types.d.ts +86 -0
  8. package/dist/client/types.d.ts.map +1 -0
  9. package/dist/client/types.js +2 -0
  10. package/dist/client/types.js.map +1 -0
  11. package/dist/formatters/index.d.ts +26 -0
  12. package/dist/formatters/index.d.ts.map +1 -0
  13. package/dist/formatters/index.js +197 -0
  14. package/dist/formatters/index.js.map +1 -0
  15. package/dist/health.d.ts +4 -0
  16. package/dist/health.d.ts.map +1 -0
  17. package/dist/health.js +39 -0
  18. package/dist/health.js.map +1 -0
  19. package/dist/index.d.ts +14 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +118 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/prompts/index.d.ts +3 -0
  24. package/dist/prompts/index.d.ts.map +1 -0
  25. package/dist/prompts/index.js +56 -0
  26. package/dist/prompts/index.js.map +1 -0
  27. package/dist/resources/index.d.ts +4 -0
  28. package/dist/resources/index.d.ts.map +1 -0
  29. package/dist/resources/index.js +86 -0
  30. package/dist/resources/index.js.map +1 -0
  31. package/dist/server.d.ts +3 -0
  32. package/dist/server.d.ts.map +1 -0
  33. package/dist/server.js +31 -0
  34. package/dist/server.js.map +1 -0
  35. package/dist/tools/concepts.d.ts +4 -0
  36. package/dist/tools/concepts.d.ts.map +1 -0
  37. package/dist/tools/concepts.js +89 -0
  38. package/dist/tools/concepts.js.map +1 -0
  39. package/dist/tools/hierarchy.d.ts +4 -0
  40. package/dist/tools/hierarchy.d.ts.map +1 -0
  41. package/dist/tools/hierarchy.js +98 -0
  42. package/dist/tools/hierarchy.js.map +1 -0
  43. package/dist/tools/index.d.ts +6 -0
  44. package/dist/tools/index.d.ts.map +1 -0
  45. package/dist/tools/index.js +6 -0
  46. package/dist/tools/index.js.map +1 -0
  47. package/dist/tools/mappings.d.ts +4 -0
  48. package/dist/tools/mappings.d.ts.map +1 -0
  49. package/dist/tools/mappings.js +39 -0
  50. package/dist/tools/mappings.js.map +1 -0
  51. package/dist/tools/search.d.ts +4 -0
  52. package/dist/tools/search.d.ts.map +1 -0
  53. package/dist/tools/search.js +68 -0
  54. package/dist/tools/search.js.map +1 -0
  55. package/dist/tools/vocabularies.d.ts +4 -0
  56. package/dist/tools/vocabularies.d.ts.map +1 -0
  57. package/dist/tools/vocabularies.js +45 -0
  58. package/dist/tools/vocabularies.js.map +1 -0
  59. package/dist/transports/http.d.ts +8 -0
  60. package/dist/transports/http.d.ts.map +1 -0
  61. package/dist/transports/http.js +66 -0
  62. package/dist/transports/http.js.map +1 -0
  63. package/dist/utils/auth.d.ts +2 -0
  64. package/dist/utils/auth.d.ts.map +1 -0
  65. package/dist/utils/auth.js +9 -0
  66. package/dist/utils/auth.js.map +1 -0
  67. package/dist/utils/cache.d.ts +15 -0
  68. package/dist/utils/cache.d.ts.map +1 -0
  69. package/dist/utils/cache.js +52 -0
  70. package/dist/utils/cache.js.map +1 -0
  71. package/dist/utils/errors.d.ts +10 -0
  72. package/dist/utils/errors.d.ts.map +1 -0
  73. package/dist/utils/errors.js +95 -0
  74. package/dist/utils/errors.js.map +1 -0
  75. package/dist/utils/logger.d.ts +18 -0
  76. package/dist/utils/logger.d.ts.map +1 -0
  77. package/dist/utils/logger.js +24 -0
  78. package/dist/utils/logger.js.map +1 -0
  79. package/dist/version.d.ts +2 -0
  80. package/dist/version.d.ts.map +1 -0
  81. package/dist/version.js +5 -0
  82. package/dist/version.js.map +1 -0
  83. package/package.json +72 -0
@@ -0,0 +1,10 @@
1
+ export declare class OmopHubApiError extends Error {
2
+ readonly status: number;
3
+ readonly path: string;
4
+ constructor(status: number, message: string, path: string);
5
+ }
6
+ export declare function formatErrorForMcp(error: unknown, toolName: string): {
7
+ text: string;
8
+ json: string;
9
+ };
10
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAgB,SAAQ,KAAK;aAEtB,MAAM,EAAE,MAAM;aAEd,IAAI,EAAE,MAAM;gBAFZ,MAAM,EAAE,MAAM,EAC9B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM;CAK/B;AAKD,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,MAAM,GACf;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAsFhC"}
@@ -0,0 +1,95 @@
1
+ export class OmopHubApiError extends Error {
2
+ status;
3
+ path;
4
+ constructor(status, message, path) {
5
+ super(message);
6
+ this.status = status;
7
+ this.path = path;
8
+ this.name = 'OmopHubApiError';
9
+ }
10
+ }
11
+ const UPGRADE_URL = 'https://omophub.com/dashboard/billing';
12
+ const API_KEYS_URL = 'https://omophub.com/dashboard/api-keys';
13
+ export function formatErrorForMcp(error, toolName) {
14
+ if (error instanceof OmopHubApiError) {
15
+ switch (error.status) {
16
+ case 401:
17
+ return {
18
+ text: `Authentication failed for ${toolName}. ` +
19
+ 'Check that your OMOPHUB_API_KEY is valid. ' +
20
+ `Get a new key at: ${API_KEYS_URL}`,
21
+ json: JSON.stringify({ error_code: 'AUTH_FAILED' }),
22
+ };
23
+ case 403:
24
+ return {
25
+ text: `Access denied for ${toolName}. ` +
26
+ 'Your API key may not have permission for this endpoint. ' +
27
+ `Check your plan at: ${UPGRADE_URL}`,
28
+ json: JSON.stringify({
29
+ error_code: 'ACCESS_DENIED',
30
+ upgrade_url: UPGRADE_URL,
31
+ }),
32
+ };
33
+ case 404: {
34
+ const conceptIdMatch = error.path.match(/\/concepts\/(\d+)/);
35
+ const conceptId = conceptIdMatch ? parseInt(conceptIdMatch[1], 10) : undefined;
36
+ return {
37
+ text: `Not found: ${error.message}. Try using search_concepts to find the correct concept_id, or get_concept_by_code if you have a vocabulary-specific code.`,
38
+ json: JSON.stringify({
39
+ error_code: 'NOT_FOUND',
40
+ path: error.path,
41
+ ...(conceptId !== undefined && { concept_id: conceptId }),
42
+ }),
43
+ };
44
+ }
45
+ case 429:
46
+ return {
47
+ text: `Rate limit exceeded for ${toolName}. ` +
48
+ `Wait a moment and try again, or upgrade your plan at: ${UPGRADE_URL}`,
49
+ json: JSON.stringify({
50
+ error_code: 'RATE_LIMIT_EXCEEDED',
51
+ retry_after_seconds: 3600,
52
+ upgrade_url: UPGRADE_URL,
53
+ }),
54
+ };
55
+ case 500:
56
+ case 502:
57
+ case 503:
58
+ return {
59
+ text: `OMOPHub API is temporarily unavailable (${error.status}). Please try again in a moment.`,
60
+ json: JSON.stringify({ error_code: 'SERVER_ERROR' }),
61
+ };
62
+ default:
63
+ return {
64
+ text: `API error (${error.status}). Please try again or contact support if this persists.`,
65
+ json: JSON.stringify({
66
+ error_code: 'UNKNOWN_ERROR',
67
+ status: error.status,
68
+ }),
69
+ };
70
+ }
71
+ }
72
+ if (error instanceof Error) {
73
+ if (error.name === 'TimeoutError' || error.message.includes('timed out')) {
74
+ return {
75
+ text: `OMOPHub API request timed out for ${toolName}. The server may be slow — please try again.`,
76
+ json: JSON.stringify({ error_code: 'TIMEOUT_ERROR' }),
77
+ };
78
+ }
79
+ if (error.message.includes('fetch failed') || error.message.includes('ECONNREFUSED')) {
80
+ return {
81
+ text: `Cannot connect to OMOPHub API. Check your internet connection and that OMOPHUB_BASE_URL is correct.`,
82
+ json: JSON.stringify({ error_code: 'CONNECTION_ERROR' }),
83
+ };
84
+ }
85
+ return {
86
+ text: `${toolName} failed unexpectedly. Please try again.`,
87
+ json: JSON.stringify({ error_code: 'UNKNOWN_ERROR' }),
88
+ };
89
+ }
90
+ return {
91
+ text: `${toolName} failed with an unexpected error.`,
92
+ json: JSON.stringify({ error_code: 'UNKNOWN_ERROR' }),
93
+ };
94
+ }
95
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ type LogLevel = 'debug' | 'info' | 'warn' | 'error';
2
+ interface LogEntry {
3
+ level: LogLevel;
4
+ message: string;
5
+ tool_name?: string;
6
+ api_path?: string;
7
+ duration_ms?: number;
8
+ status?: number;
9
+ [key: string]: unknown;
10
+ }
11
+ export declare const logger: {
12
+ debug: (message: string, fields?: Omit<LogEntry, "level" | "message">) => void;
13
+ info: (message: string, fields?: Omit<LogEntry, "level" | "message">) => void;
14
+ warn: (message: string, fields?: Omit<LogEntry, "level" | "message">) => void;
15
+ error: (message: string, fields?: Omit<LogEntry, "level" | "message">) => void;
16
+ };
17
+ export {};
18
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,KAAK,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpD,UAAU,QAAQ;IAChB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAuBD,eAAO,MAAM,MAAM;qBACA,MAAM,WAAW,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;oBAErD,MAAM,WAAW,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;oBAEpD,MAAM,WAAW,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;qBAEnD,MAAM,WAAW,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAEtE,CAAC"}
@@ -0,0 +1,24 @@
1
+ const LOG_LEVELS = {
2
+ debug: 0,
3
+ info: 1,
4
+ warn: 2,
5
+ error: 3,
6
+ };
7
+ const envLevel = process.env.OMOPHUB_LOG_LEVEL;
8
+ const currentLevel = envLevel && envLevel in LOG_LEVELS ? envLevel : 'info';
9
+ function log(entry) {
10
+ if (LOG_LEVELS[entry.level] < LOG_LEVELS[currentLevel])
11
+ return;
12
+ const timestamp = new Date().toISOString();
13
+ const { level, message, ...fields } = entry;
14
+ const extra = Object.keys(fields).length > 0 ? ` ${JSON.stringify(fields)}` : '';
15
+ // All logs to stderr — stdout is reserved for JSON-RPC in stdio mode
16
+ process.stderr.write(`[${timestamp}] ${level.toUpperCase()} ${message}${extra}\n`);
17
+ }
18
+ export const logger = {
19
+ debug: (message, fields) => log({ level: 'debug', message, ...fields }),
20
+ info: (message, fields) => log({ level: 'info', message, ...fields }),
21
+ warn: (message, fields) => log({ level: 'warn', message, ...fields }),
22
+ error: (message, fields) => log({ level: 'error', message, ...fields }),
23
+ };
24
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,GAA6B;IAC3C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;AAC/C,MAAM,YAAY,GAAa,QAAQ,IAAI,QAAQ,IAAI,UAAU,CAAC,CAAC,CAAE,QAAqB,CAAC,CAAC,CAAC,MAAM,CAAC;AAEpG,SAAS,GAAG,CAAC,KAAe;IAC1B,IAAI,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO;IAE/D,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,KAAK,CAAC;IAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjF,qEAAqE;IACrE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,SAAS,KAAK,KAAK,CAAC,WAAW,EAAE,IAAI,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,CAAC,OAAe,EAAE,MAA4C,EAAE,EAAE,CACvE,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7C,IAAI,EAAE,CAAC,OAAe,EAAE,MAA4C,EAAE,EAAE,CACtE,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC;IAC5C,IAAI,EAAE,CAAC,OAAe,EAAE,MAA4C,EAAE,EAAE,CACtE,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC;IAC5C,KAAK,EAAE,CAAC,OAAe,EAAE,MAA4C,EAAE,EAAE,CACvE,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC;CAC9C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const VERSION: string;
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,OAAO,QAAc,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { createRequire } from 'node:module';
2
+ const require = createRequire(import.meta.url);
3
+ const pkg = require('../package.json');
4
+ export const VERSION = pkg.version;
5
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAE9D,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC"}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@omophub/omophub-mcp",
3
+ "version": "1.1.0",
4
+ "mcpName": "io.github.OMOPHub/omophub-mcp",
5
+ "description": "MCP server for OHDSI OMOP standardized medical vocabularies — search, lookup, map, and navigate concepts via AI agents",
6
+ "type": "module",
7
+ "main": "dist/index.js",
8
+ "bin": {
9
+ "omophub-mcp": "dist/index.js"
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "engines": {
15
+ "node": ">=20"
16
+ },
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "dev": "tsx src/index.ts",
20
+ "start": "node dist/index.js",
21
+ "start:http": "node dist/index.js --transport=http",
22
+ "test": "vitest run",
23
+ "test:watch": "vitest",
24
+ "test:coverage": "vitest run --coverage",
25
+ "lint": "biome check src/ test/",
26
+ "lint:fix": "biome check --write src/ test/",
27
+ "typecheck": "tsc --noEmit",
28
+ "format": "biome format --write src/ test/",
29
+ "format:check": "biome format --check src/ test/",
30
+ "prepublishOnly": "npm run build"
31
+ },
32
+ "keywords": [
33
+ "mcp",
34
+ "mcp-server",
35
+ "model-context-protocol",
36
+ "omop",
37
+ "ohdsi",
38
+ "medical-vocabularies",
39
+ "snomed",
40
+ "icd10",
41
+ "rxnorm",
42
+ "loinc",
43
+ "healthcare",
44
+ "clinical-data",
45
+ "ai-agent",
46
+ "vocabulary-mapping",
47
+ "concept-mapping",
48
+ "athena"
49
+ ],
50
+ "author": "OMOPHub",
51
+ "license": "MIT",
52
+ "repository": {
53
+ "type": "git",
54
+ "url": "https://github.com/OMOPHub/omophub-mcp.git"
55
+ },
56
+ "bugs": {
57
+ "url": "https://github.com/OMOPHub/omophub-mcp/issues"
58
+ },
59
+ "homepage": "https://omophub.com",
60
+ "dependencies": {
61
+ "@modelcontextprotocol/sdk": "^1.26.0",
62
+ "zod": "^4.3.6"
63
+ },
64
+ "devDependencies": {
65
+ "@biomejs/biome": "^2.4.4",
66
+ "@types/node": "^25.0.3",
67
+ "@vitest/coverage-v8": "^3.2.4",
68
+ "tsx": "^4.19.0",
69
+ "typescript": "^5.9.3",
70
+ "vitest": "^3.2.4"
71
+ }
72
+ }