@omophub/omophub-mcp 1.2.2 → 1.3.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/README.md +45 -4
  2. package/dist/client/api.d.ts +2 -2
  3. package/dist/client/api.d.ts.map +1 -1
  4. package/dist/client/api.js +1 -1
  5. package/dist/client/api.js.map +1 -1
  6. package/dist/client/resolve.d.ts +26 -0
  7. package/dist/client/resolve.d.ts.map +1 -0
  8. package/dist/client/resolve.js +55 -0
  9. package/dist/client/resolve.js.map +1 -0
  10. package/dist/client/types.d.ts +13 -8
  11. package/dist/client/types.d.ts.map +1 -1
  12. package/dist/formatters/index.d.ts.map +1 -1
  13. package/dist/formatters/index.js +21 -4
  14. package/dist/formatters/index.js.map +1 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +12 -9
  17. package/dist/index.js.map +1 -1
  18. package/dist/resources/index.d.ts.map +1 -1
  19. package/dist/resources/index.js +7 -4
  20. package/dist/resources/index.js.map +1 -1
  21. package/dist/server.d.ts +2 -1
  22. package/dist/server.d.ts.map +1 -1
  23. package/dist/server.js +1 -3
  24. package/dist/server.js.map +1 -1
  25. package/dist/tools/concepts.d.ts.map +1 -1
  26. package/dist/tools/concepts.js +7 -4
  27. package/dist/tools/concepts.js.map +1 -1
  28. package/dist/tools/explore.d.ts.map +1 -1
  29. package/dist/tools/explore.js +6 -4
  30. package/dist/tools/explore.js.map +1 -1
  31. package/dist/tools/hierarchy.d.ts.map +1 -1
  32. package/dist/tools/hierarchy.js +4 -2
  33. package/dist/tools/hierarchy.js.map +1 -1
  34. package/dist/tools/mappings.d.ts.map +1 -1
  35. package/dist/tools/mappings.js +4 -2
  36. package/dist/tools/mappings.js.map +1 -1
  37. package/dist/tools/search.d.ts.map +1 -1
  38. package/dist/tools/search.js +4 -2
  39. package/dist/tools/search.js.map +1 -1
  40. package/dist/tools/semantic-search.d.ts.map +1 -1
  41. package/dist/tools/semantic-search.js +4 -2
  42. package/dist/tools/semantic-search.js.map +1 -1
  43. package/dist/tools/similar.d.ts.map +1 -1
  44. package/dist/tools/similar.js +4 -2
  45. package/dist/tools/similar.js.map +1 -1
  46. package/dist/tools/vocabularies.d.ts.map +1 -1
  47. package/dist/tools/vocabularies.js +36 -10
  48. package/dist/tools/vocabularies.js.map +1 -1
  49. package/dist/transports/http.d.ts +3 -2
  50. package/dist/transports/http.d.ts.map +1 -1
  51. package/dist/transports/http.js +126 -19
  52. package/dist/transports/http.js.map +1 -1
  53. package/dist/utils/auth.d.ts +1 -1
  54. package/dist/utils/auth.d.ts.map +1 -1
  55. package/dist/utils/auth.js +1 -6
  56. package/dist/utils/auth.js.map +1 -1
  57. package/package.json +2 -2
@@ -1,11 +1,13 @@
1
+ import { randomUUID } from 'node:crypto';
1
2
  import { createServer } from 'node:http';
2
3
  import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
4
+ import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
3
5
  import { handleHealthRequest } from '../health.js';
4
6
  import { logger } from '../utils/logger.js';
5
7
  const CORS_HEADERS = {
6
8
  'Access-Control-Allow-Origin': '*',
7
9
  'Access-Control-Allow-Methods': 'GET, POST, DELETE, OPTIONS',
8
- 'Access-Control-Allow-Headers': 'Content-Type, mcp-session-id',
10
+ 'Access-Control-Allow-Headers': 'Content-Type, mcp-session-id, Authorization',
9
11
  'Access-Control-Expose-Headers': 'mcp-session-id',
10
12
  };
11
13
  function setCorsHeaders(res) {
@@ -13,41 +15,146 @@ function setCorsHeaders(res) {
13
15
  res.setHeader(key, value);
14
16
  }
15
17
  }
18
+ // Active sessions — each client gets its own transport + server
19
+ const sessions = new Map();
20
+ const MAX_BODY_SIZE = 1_048_576; // 1 MB
21
+ const JSON_RPC_INTERNAL_ERROR = JSON.stringify({
22
+ jsonrpc: '2.0',
23
+ error: { code: -32603, message: 'Internal server error' },
24
+ id: null,
25
+ });
16
26
  /**
17
- * Starts an HTTP server with Streamable HTTP MCP transport on /mcp
27
+ * Starts an HTTP server with per-session MCP transports on /
18
28
  * and a health endpoint on /health.
19
29
  */
20
- export async function startHttpTransport(mcpServer, port) {
21
- const transport = new StreamableHTTPServerTransport({
22
- sessionIdGenerator: undefined,
23
- });
24
- await mcpServer.connect(transport);
30
+ export async function startHttpTransport(serverFactory, defaultClient, port) {
25
31
  const httpServer = createServer(async (req, res) => {
26
32
  setCorsHeaders(res);
27
- // Handle CORS preflight
28
33
  if (req.method === 'OPTIONS') {
29
34
  res.writeHead(204);
30
35
  res.end();
31
36
  return;
32
37
  }
33
- // Health endpoint
34
38
  if (handleHealthRequest(req, res))
35
39
  return;
36
- // MCP endpoint
37
- if (req.url === '/mcp') {
40
+ const pathname = new URL(req.url ?? '/', 'http://localhost').pathname;
41
+ if (pathname === '/' || pathname === '/mcp') {
42
+ const rawSessionId = req.headers['mcp-session-id'];
43
+ const sessionId = Array.isArray(rawSessionId) ? rawSessionId[0] : rawSessionId;
44
+ // GET (SSE stream) and DELETE (session close) carry no body — route directly
45
+ if (req.method === 'GET' || req.method === 'DELETE') {
46
+ if (sessionId && sessions.has(sessionId)) {
47
+ const transport = sessions.get(sessionId);
48
+ try {
49
+ await transport.handleRequest(req, res);
50
+ }
51
+ catch (error) {
52
+ logger.error('MCP transport error', { error: String(error), sessionId });
53
+ if (!res.headersSent) {
54
+ res.writeHead(500, { 'Content-Type': 'application/json' });
55
+ res.end(JSON_RPC_INTERNAL_ERROR);
56
+ }
57
+ }
58
+ }
59
+ else {
60
+ res.writeHead(400, { 'Content-Type': 'application/json' });
61
+ res.end(JSON.stringify({
62
+ jsonrpc: '2.0',
63
+ error: { code: -32000, message: 'Bad Request: No valid session ID provided' },
64
+ id: null,
65
+ }));
66
+ }
67
+ return;
68
+ }
69
+ // POST — read body with size limit
70
+ const chunks = [];
71
+ let totalBytes = 0;
72
+ let aborted = false;
73
+ for await (const chunk of req) {
74
+ const buf = typeof chunk === 'string' ? Buffer.from(chunk) : chunk;
75
+ totalBytes += buf.length;
76
+ if (totalBytes > MAX_BODY_SIZE) {
77
+ req.destroy();
78
+ res.writeHead(413, { 'Content-Type': 'application/json' });
79
+ res.end(JSON.stringify({
80
+ jsonrpc: '2.0',
81
+ error: { code: -32000, message: 'Payload too large' },
82
+ id: null,
83
+ }));
84
+ aborted = true;
85
+ break;
86
+ }
87
+ chunks.push(buf);
88
+ }
89
+ if (aborted)
90
+ return;
91
+ const body = Buffer.concat(chunks).toString();
92
+ let parsedBody;
38
93
  try {
39
- await transport.handleRequest(req, res);
94
+ parsedBody = JSON.parse(body);
40
95
  }
41
- catch (error) {
42
- logger.error('MCP transport error', { error: String(error) });
43
- if (!res.headersSent) {
44
- res.writeHead(500, { 'Content-Type': 'application/json' });
45
- res.end(JSON.stringify({ error: 'Internal server error' }));
96
+ catch {
97
+ res.writeHead(400, { 'Content-Type': 'application/json' });
98
+ res.end(JSON.stringify({
99
+ jsonrpc: '2.0',
100
+ error: { code: -32700, message: 'Parse error' },
101
+ id: null,
102
+ }));
103
+ return;
104
+ }
105
+ // Existing session
106
+ if (sessionId && sessions.has(sessionId)) {
107
+ const transport = sessions.get(sessionId);
108
+ try {
109
+ await transport.handleRequest(req, res, parsedBody);
110
+ }
111
+ catch (error) {
112
+ logger.error('MCP transport error', { error: String(error), sessionId });
113
+ if (!res.headersSent) {
114
+ res.writeHead(500, { 'Content-Type': 'application/json' });
115
+ res.end(JSON_RPC_INTERNAL_ERROR);
116
+ }
117
+ }
118
+ return;
119
+ }
120
+ // New session (initialize request)
121
+ if (!sessionId && isInitializeRequest(parsedBody)) {
122
+ const transport = new StreamableHTTPServerTransport({
123
+ sessionIdGenerator: () => randomUUID(),
124
+ onsessioninitialized: (id) => {
125
+ sessions.set(id, transport);
126
+ logger.info('MCP session created', { sessionId: id });
127
+ },
128
+ });
129
+ transport.onclose = () => {
130
+ if (transport.sessionId) {
131
+ sessions.delete(transport.sessionId);
132
+ logger.info('MCP session closed', { sessionId: transport.sessionId });
133
+ }
134
+ };
135
+ const server = serverFactory(defaultClient);
136
+ await server.connect(transport);
137
+ try {
138
+ await transport.handleRequest(req, res, parsedBody);
139
+ }
140
+ catch (error) {
141
+ logger.error('MCP transport error (init)', { error: String(error) });
142
+ if (!res.headersSent) {
143
+ res.writeHead(500, { 'Content-Type': 'application/json' });
144
+ res.end(JSON_RPC_INTERNAL_ERROR);
145
+ }
46
146
  }
147
+ return;
47
148
  }
149
+ // Invalid request — no session and not an initialize
150
+ res.writeHead(400, { 'Content-Type': 'application/json' });
151
+ res.end(JSON.stringify({
152
+ jsonrpc: '2.0',
153
+ error: { code: -32000, message: 'Bad Request: No valid session ID provided' },
154
+ id: null,
155
+ }));
48
156
  return;
49
157
  }
50
- // Not found
51
158
  res.writeHead(404, { 'Content-Type': 'application/json' });
52
159
  res.end(JSON.stringify({ error: 'Not found' }));
53
160
  });
@@ -56,7 +163,7 @@ export async function startHttpTransport(mcpServer, port) {
56
163
  });
57
164
  await new Promise((resolve) => {
58
165
  httpServer.listen(port, () => {
59
- logger.info(`OMOPHub MCP server listening on http://localhost:${String(port)}/mcp`);
166
+ logger.info(`OMOPHub MCP server listening on http://localhost:${String(port)}`);
60
167
  logger.info(`Health endpoint at http://localhost:${String(port)}/health`);
61
168
  resolve();
62
169
  });
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export declare function resolveApiKey(cliKey?: string): string;
1
+ export declare function resolveApiKey(cliKey?: string): string | undefined;
2
2
  //# sourceMappingURL=auth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAWrD"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEjE"}
@@ -1,9 +1,4 @@
1
1
  export function resolveApiKey(cliKey) {
2
- const key = cliKey || process.env.OMOPHUB_API_KEY;
3
- if (!key) {
4
- throw new Error('OMOPHub API key required. Set OMOPHUB_API_KEY environment variable or pass --api-key=KEY.\n' +
5
- 'Get your free API key at: https://dashboard.omophub.com/api-keys');
6
- }
7
- return key;
2
+ return cliKey || process.env.OMOPHUB_API_KEY || undefined;
8
3
  }
9
4
  //# sourceMappingURL=auth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAC,MAAe;IAC3C,MAAM,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAElD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,6FAA6F;YAC3F,kEAAkE,CACrE,CAAC;IACJ,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAC,MAAe;IAC3C,OAAO,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,SAAS,CAAC;AAC5D,CAAC"}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@omophub/omophub-mcp",
3
- "version": "1.2.2",
3
+ "version": "1.3.1",
4
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",
5
+ "description": "MCP server for OHDSI OMOP standardized medical vocabularies - search, lookup, map, and navigate concepts via AI agents",
6
6
  "type": "module",
7
7
  "main": "dist/index.js",
8
8
  "bin": {