@fhirfly-io/mcp-server 0.2.3 → 0.4.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.
package/README.md CHANGED
@@ -15,6 +15,7 @@ This package lets Claude Desktop look up real healthcare reference data includin
15
15
  - **FDA Drug Labels** - Prescribing information
16
16
  - **SNOMED CT** - Clinical concepts (IPS free set)
17
17
  - **Connectivity** - Provider FHIR endpoints and Direct addresses
18
+ - **SMA** - State Medicaid Agency FHIR endpoint directory (CMS)
18
19
  - **Claims Intelligence** - NCCI edits, MUE limits, PFS/RVU data, coverage determinations
19
20
 
20
21
  When you ask Claude about medications, providers, or clinical codes, it can look up accurate, current information instead of relying on training data.
@@ -71,6 +72,8 @@ Try asking Claude:
71
72
  - "Look up NPI 1234567893"
72
73
  - "Search for COVID vaccines in the CVX database"
73
74
  - "What are the drug interactions for Lipitor?"
75
+ - "Which states have implemented Medicaid FHIR endpoints?"
76
+ - "Show me the FHIR endpoint details for California's Medicaid program"
74
77
 
75
78
  Claude should use the FHIRfly tools to look up real data.
76
79
 
@@ -102,6 +105,9 @@ Claude should use the FHIRfly tools to look up real data.
102
105
  | `snomed_search` | Search SNOMED CT IPS concepts |
103
106
  | `snomed_mappings` | Find cross-terminology mappings for a SNOMED concept |
104
107
  | `npi_connectivity` | Look up provider connectivity (FHIR endpoints) |
108
+ | `sma_list_states` | List states with Medicaid FHIR endpoint status |
109
+ | `sma_get_state` | Get SMA FHIR endpoint details for a state |
110
+ | `sma_stats` | Get aggregate SMA implementation statistics |
105
111
  | `ncci_validate` | Check if two codes can be billed together (NCCI) |
106
112
  | `mue_lookup` | Look up max units of service (MUE limits) |
107
113
  | `pfs_lookup` | Look up Medicare fee schedule / RVU data |
@@ -197,6 +203,7 @@ Your API key is sent to FHIRfly over HTTPS. No healthcare data is stored locally
197
203
  | CVX/MVX | CDC | Public domain |
198
204
  | FDA Drug Labels | FDA/openFDA | Public domain |
199
205
  | SNOMED CT IPS | SNOMED International | CC BY 4.0 |
206
+ | SMA Endpoint Directory | CMS | Public domain |
200
207
  | NCCI/MUE/PFS | CMS | Public domain |
201
208
 
202
209
  FHIRfly aggregates and indexes these data sources. See [fhirfly.io/docs](https://fhirfly.io/docs) for details.
package/dist/cli.js CHANGED
@@ -251,7 +251,7 @@ var MCP_ERROR_CODES = {
251
251
  };
252
252
 
253
253
  // src/version.ts
254
- var VERSION = "0.2.3";
254
+ var VERSION = "0.3.0";
255
255
 
256
256
  // src/server.ts
257
257
  var SERVER_INFO = {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/transport.ts","../src/client.ts","../src/types.ts","../src/version.ts","../src/server.ts","../src/cli.ts"],"names":["args"],"mappings":"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","file":"cli.js","sourcesContent":["// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * MCP Stdio Transport\n * Handles JSON-RPC communication over stdin/stdout\n */\n\nimport { createInterface } from \"readline\";\nimport type { JsonRpcRequest, JsonRpcResponse } from \"./types.js\";\n\nexport type MessageHandler = (request: JsonRpcRequest) => Promise<JsonRpcResponse>;\n\nexport class StdioTransport {\n private handler: MessageHandler | null = null;\n private debug: boolean;\n private pendingRequests: number = 0;\n private stdinClosed: boolean = false;\n\n constructor(debug: boolean = false) {\n this.debug = debug;\n }\n\n /**\n * Set the handler for incoming messages\n */\n setHandler(handler: MessageHandler): void {\n this.handler = handler;\n }\n\n /**\n * Start listening for messages on stdin\n */\n start(): void {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: false,\n });\n\n // Buffer for accumulating partial messages\n let buffer = \"\";\n\n rl.on(\"line\", async (line) => {\n buffer += line;\n\n // Try to parse as JSON\n try {\n const request = JSON.parse(buffer) as JsonRpcRequest;\n buffer = \"\"; // Clear buffer on successful parse\n\n if (this.debug) {\n console.error(\"[MCP DEBUG] Received:\", JSON.stringify(request, null, 2));\n }\n\n if (this.handler) {\n this.pendingRequests++;\n try {\n const response = await this.handler(request);\n this.send(response);\n } finally {\n this.pendingRequests--;\n this.maybeExit();\n }\n }\n } catch {\n // If parse fails, might be partial message - keep buffering\n // Unless it looks like a complete but invalid message\n if (line.trim().endsWith(\"}\")) {\n this.sendError(null, -32700, \"Parse error: Invalid JSON\");\n buffer = \"\";\n }\n }\n });\n\n rl.on(\"close\", () => {\n this.stdinClosed = true;\n if (this.debug) {\n console.error(\"[MCP DEBUG] stdin closed, waiting for pending requests...\");\n }\n this.maybeExit();\n });\n\n // Handle errors gracefully\n process.stdin.on(\"error\", (err) => {\n if (this.debug) {\n console.error(\"[MCP DEBUG] stdin error:\", err.message);\n }\n });\n }\n\n /**\n * Exit if stdin is closed and no pending requests\n */\n private maybeExit(): void {\n if (this.stdinClosed && this.pendingRequests === 0) {\n if (this.debug) {\n console.error(\"[MCP DEBUG] All requests complete, exiting\");\n }\n process.exit(0);\n }\n }\n\n /**\n * Send a JSON-RPC response to stdout\n */\n send(response: JsonRpcResponse): void {\n const message = JSON.stringify(response);\n\n if (this.debug) {\n console.error(\"[MCP DEBUG] Sending:\", JSON.stringify(response, null, 2));\n }\n\n // Write to stdout with newline\n process.stdout.write(message + \"\\n\");\n }\n\n /**\n * Send an error response\n */\n sendError(id: string | number | null, code: number, message: string, data?: unknown): void {\n this.send({\n jsonrpc: \"2.0\",\n id,\n error: {\n code,\n message,\n data,\n },\n });\n }\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * FHIRfly API Client\n * Makes HTTP requests to the FHIRfly MCP endpoint\n */\n\nimport type {\n JsonRpcRequest,\n JsonRpcResponse,\n McpServerConfig,\n McpToolsListResult,\n McpToolCallResult,\n} from \"./types.js\";\n\nexport class FhirflyClient {\n private config: McpServerConfig;\n private nextId = 1;\n\n constructor(config: McpServerConfig) {\n this.config = config;\n }\n\n /**\n * Send a JSON-RPC request to the FHIRfly MCP endpoint\n */\n async request(method: string, params?: Record<string, unknown>): Promise<JsonRpcResponse> {\n const requestBody: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id: this.nextId++,\n method,\n params,\n };\n\n if (this.config.debug) {\n console.error(`[MCP DEBUG] API Request: ${method}`, params);\n }\n\n const timeoutMs = this.config.timeout ?? 30_000;\n\n try {\n const response = await fetch(`${this.config.apiUrl}/mcp`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.config.apiKey,\n \"User-Agent\": \"@fhirfly-io/mcp-server\",\n },\n body: JSON.stringify(requestBody),\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (!response.ok) {\n // Handle HTTP errors\n if (response.status === 401) {\n return {\n jsonrpc: \"2.0\",\n id: requestBody.id,\n error: {\n code: -32001,\n message: \"Authentication failed. Check your FHIRFLY_API_KEY.\",\n },\n };\n }\n\n if (response.status === 429) {\n // Retry once after Retry-After delay (cap at 10s)\n const retryAfter = response.headers.get(\"Retry-After\");\n const delaySec = Math.min(Number(retryAfter) || 1, 10);\n\n if (this.config.debug) {\n console.error(`[MCP DEBUG] Rate limited, retrying after ${delaySec}s`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, delaySec * 1000));\n\n const retryResponse = await fetch(`${this.config.apiUrl}/mcp`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.config.apiKey,\n \"User-Agent\": \"@fhirfly-io/mcp-server\",\n },\n body: JSON.stringify(requestBody),\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (!retryResponse.ok) {\n return {\n jsonrpc: \"2.0\",\n id: requestBody.id,\n error: {\n code: -32002,\n message: \"Rate limit exceeded. Please slow down requests.\",\n },\n };\n }\n\n const retryResult = (await retryResponse.json()) as JsonRpcResponse;\n\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] Retry response:\", JSON.stringify(retryResult, null, 2));\n }\n\n return retryResult;\n }\n\n return {\n jsonrpc: \"2.0\",\n id: requestBody.id,\n error: {\n code: -32000,\n message: `API error: ${response.status} ${response.statusText}`,\n },\n };\n }\n\n const result = (await response.json()) as JsonRpcResponse;\n\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] API Response:\", JSON.stringify(result, null, 2));\n }\n\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] API Error:\", message);\n }\n\n return {\n jsonrpc: \"2.0\",\n id: requestBody.id,\n error: {\n code: -32003,\n message: `Network error: ${message}`,\n },\n };\n }\n }\n\n /**\n * Get list of available tools from FHIRfly\n */\n async listTools(): Promise<McpToolsListResult> {\n const response = await this.request(\"tools/list\", {});\n\n if (response.error) {\n throw new Error(response.error.message);\n }\n\n return response.result as McpToolsListResult;\n }\n\n /**\n * Call a tool on the FHIRfly API\n */\n async callTool(name: string, args: Record<string, unknown>): Promise<McpToolCallResult> {\n const response = await this.request(\"tools/call\", {\n name,\n arguments: args,\n });\n\n if (response.error) {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n error: response.error.message,\n code: response.error.code,\n }),\n },\n ],\n isError: true,\n };\n }\n\n return response.result as McpToolCallResult;\n }\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * MCP Protocol Types\n * Based on Model Context Protocol specification\n */\n\n// JSON-RPC 2.0 Types\nexport interface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id: string | number;\n method: string;\n params?: Record<string, unknown>;\n}\n\nexport interface JsonRpcResponse {\n jsonrpc: \"2.0\";\n id: string | number | null;\n result?: unknown;\n error?: JsonRpcError;\n}\n\nexport interface JsonRpcError {\n code: number;\n message: string;\n data?: unknown;\n}\n\n// MCP Protocol Types\nexport interface McpToolDefinition {\n name: string;\n description: string;\n inputSchema: {\n type: \"object\";\n properties?: Record<string, unknown>;\n required?: string[];\n };\n}\n\nexport interface McpToolsListResult {\n tools: McpToolDefinition[];\n}\n\nexport interface McpToolCallParams {\n name: string;\n arguments: Record<string, unknown>;\n}\n\nexport interface McpToolCallResult {\n content: Array<{\n type: \"text\" | \"image\" | \"resource\";\n text?: string;\n data?: string;\n mimeType?: string;\n }>;\n isError?: boolean;\n}\n\n// Server Configuration\nexport interface McpServerConfig {\n apiKey: string;\n apiUrl: string;\n debug: boolean;\n /** Fetch timeout in milliseconds. Default: 30000 (30 seconds). */\n timeout?: number;\n}\n\n// Standard MCP Error Codes\nexport const MCP_ERROR_CODES = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n} as const;\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\nexport const VERSION = \"0.2.3\";\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * FHIRfly MCP Server\n * Main server class that handles MCP protocol messages\n */\n\nimport { StdioTransport } from \"./transport.js\";\nimport { FhirflyClient } from \"./client.js\";\nimport {\n MCP_ERROR_CODES,\n type JsonRpcRequest,\n type JsonRpcResponse,\n type McpServerConfig,\n type McpToolCallParams,\n} from \"./types.js\";\nimport { VERSION } from \"./version.js\";\n\n// Server capabilities\nconst SERVER_INFO = {\n name: \"fhirfly-mcp-server\",\n version: VERSION,\n};\n\nconst SERVER_CAPABILITIES = {\n tools: {},\n};\n\nexport class McpServer {\n private transport: StdioTransport;\n private client: FhirflyClient;\n private config: McpServerConfig;\n public initialized: boolean = false;\n\n constructor(config: McpServerConfig) {\n this.config = config;\n this.transport = new StdioTransport(config.debug);\n this.client = new FhirflyClient(config);\n }\n\n /**\n * Start the MCP server\n */\n start(): void {\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] Starting FHIRfly MCP Server\");\n console.error(\"[MCP DEBUG] API URL:\", this.config.apiUrl);\n console.error(\"[MCP DEBUG] API Key:\", this.config.apiKey.slice(0, 10) + \"...\");\n }\n\n this.transport.setHandler(this.handleMessage.bind(this));\n this.transport.start();\n }\n\n /**\n * Handle incoming JSON-RPC messages\n */\n private async handleMessage(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n try {\n // Validate JSON-RPC request structure\n if (request.jsonrpc !== \"2.0\" || !request.method) {\n return {\n jsonrpc: \"2.0\",\n id: request.id ?? null,\n error: {\n code: MCP_ERROR_CODES.INVALID_REQUEST,\n message: \"Invalid JSON-RPC request\",\n },\n };\n }\n\n // Route to appropriate handler\n switch (request.method) {\n case \"initialize\":\n return this.handleInitialize(request);\n\n case \"initialized\":\n // Client notification that initialization is complete\n this.initialized = true;\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result: {},\n };\n\n case \"tools/list\":\n return this.handleToolsList(request);\n\n case \"tools/call\":\n return this.handleToolsCall(request);\n\n case \"ping\":\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result: {},\n };\n\n default:\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.METHOD_NOT_FOUND,\n message: `Unknown method: ${request.method}`,\n },\n };\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] Handler error:\", message);\n }\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.INTERNAL_ERROR,\n message: `Internal error: ${message}`,\n },\n };\n }\n }\n\n /**\n * Handle initialize request\n */\n private async handleInitialize(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] Initialize request from client\");\n }\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result: {\n protocolVersion: \"2024-11-05\",\n serverInfo: SERVER_INFO,\n capabilities: SERVER_CAPABILITIES,\n },\n };\n }\n\n /**\n * Handle tools/list request\n */\n private async handleToolsList(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n try {\n const result = await this.client.listTools();\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.INTERNAL_ERROR,\n message: `Failed to list tools: ${message}`,\n },\n };\n }\n }\n\n /**\n * Handle tools/call request\n */\n private async handleToolsCall(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n const params = request.params as McpToolCallParams | undefined;\n\n if (!params?.name) {\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.INVALID_PARAMS,\n message: \"Missing tool name in params\",\n },\n };\n }\n\n try {\n const result = await this.client.callTool(params.name, params.arguments ?? {});\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.INTERNAL_ERROR,\n message: `Tool call failed: ${message}`,\n },\n };\n }\n }\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * FHIRfly MCP Server CLI\n * Entry point for running as an MCP server\n */\n\nimport { McpServer } from \"./server.js\";\nimport { VERSION } from \"./version.js\";\n\n// Handle --version and --help flags (before config validation)\nconst args = process.argv.slice(2);\nif (args.includes(\"--version\") || args.includes(\"-v\")) {\n console.log(VERSION);\n process.exit(0);\n}\nif (args.includes(\"--help\") || args.includes(\"-h\")) {\n console.log(`@fhirfly-io/mcp-server v${VERSION}`);\n console.log(\"\");\n console.log(\"MCP server for connecting AI assistants to FHIRfly healthcare data.\");\n console.log(\"\");\n console.log(\"Environment variables:\");\n console.log(\" FHIRFLY_API_KEY Your FHIRfly API key (required, starts with ffly_)\");\n console.log(\" FHIRFLY_API_URL API base URL (default: https://api.fhirfly.io)\");\n console.log(\" FHIRFLY_DEBUG Enable debug logging (set to 1 or true)\");\n console.log(\" FHIRFLY_TIMEOUT Fetch timeout in milliseconds (default: 30000)\");\n console.log(\"\");\n console.log(\"Usage with Claude Desktop:\");\n console.log(' npx @fhirfly-io/mcp-server');\n console.log(\"\");\n console.log(\"Flags:\");\n console.log(\" --version, -v Show version number\");\n console.log(\" --help, -h Show this help message\");\n process.exit(0);\n}\n\n// Configuration from environment\nconst API_KEY = process.env.FHIRFLY_API_KEY;\nconst API_URL = process.env.FHIRFLY_API_URL || \"https://api.fhirfly.io\";\nconst DEBUG = process.env.FHIRFLY_DEBUG === \"1\" || process.env.FHIRFLY_DEBUG === \"true\";\nconst TIMEOUT = process.env.FHIRFLY_TIMEOUT ? parseInt(process.env.FHIRFLY_TIMEOUT, 10) : undefined;\n\n// Validate required configuration\nif (!API_KEY) {\n console.error(\"Error: FHIRFLY_API_KEY environment variable is required\");\n console.error(\"\");\n console.error(\"To get an API key:\");\n console.error(\" 1. Sign up at https://fhirfly.io\");\n console.error(\" 2. Go to Dashboard > Credentials\");\n console.error(\" 3. Create an MCP credential\");\n console.error(\"\");\n console.error(\"Then set the environment variable:\");\n console.error(' export FHIRFLY_API_KEY=\"your_api_key_here\"');\n console.error(\"\");\n console.error(\"Or configure in Claude Desktop's claude_desktop_config.json\");\n process.exit(1);\n}\n\n// Validate API key format\nif (!API_KEY.startsWith(\"ffly_\")) {\n console.error(\"Error: Invalid API key format\");\n console.error(\"FHIRfly API keys start with 'ffly_'\");\n console.error(\"\");\n console.error(\"Please check your FHIRFLY_API_KEY environment variable.\");\n process.exit(1);\n}\n\nif (DEBUG) {\n console.error(\"=\".repeat(50));\n console.error(\"FHIRfly MCP Server - Debug Mode\");\n console.error(\"=\".repeat(50));\n console.error(\"API URL:\", API_URL);\n console.error(\"API Key:\", API_KEY.slice(0, 10) + \"...\");\n console.error(\"=\".repeat(50));\n}\n\n// Create and start server\nconst server = new McpServer({\n apiKey: API_KEY,\n apiUrl: API_URL,\n debug: DEBUG,\n timeout: TIMEOUT,\n});\n\nserver.start();\n"]}
1
+ {"version":3,"sources":["../src/transport.ts","../src/client.ts","../src/types.ts","../src/version.ts","../src/server.ts","../src/cli.ts"],"names":["args"],"mappings":"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","file":"cli.js","sourcesContent":["// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * MCP Stdio Transport\n * Handles JSON-RPC communication over stdin/stdout\n */\n\nimport { createInterface } from \"readline\";\nimport type { JsonRpcRequest, JsonRpcResponse } from \"./types.js\";\n\nexport type MessageHandler = (request: JsonRpcRequest) => Promise<JsonRpcResponse>;\n\nexport class StdioTransport {\n private handler: MessageHandler | null = null;\n private debug: boolean;\n private pendingRequests: number = 0;\n private stdinClosed: boolean = false;\n\n constructor(debug: boolean = false) {\n this.debug = debug;\n }\n\n /**\n * Set the handler for incoming messages\n */\n setHandler(handler: MessageHandler): void {\n this.handler = handler;\n }\n\n /**\n * Start listening for messages on stdin\n */\n start(): void {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: false,\n });\n\n // Buffer for accumulating partial messages\n let buffer = \"\";\n\n rl.on(\"line\", async (line) => {\n buffer += line;\n\n // Try to parse as JSON\n try {\n const request = JSON.parse(buffer) as JsonRpcRequest;\n buffer = \"\"; // Clear buffer on successful parse\n\n if (this.debug) {\n console.error(\"[MCP DEBUG] Received:\", JSON.stringify(request, null, 2));\n }\n\n if (this.handler) {\n this.pendingRequests++;\n try {\n const response = await this.handler(request);\n this.send(response);\n } finally {\n this.pendingRequests--;\n this.maybeExit();\n }\n }\n } catch {\n // If parse fails, might be partial message - keep buffering\n // Unless it looks like a complete but invalid message\n if (line.trim().endsWith(\"}\")) {\n this.sendError(null, -32700, \"Parse error: Invalid JSON\");\n buffer = \"\";\n }\n }\n });\n\n rl.on(\"close\", () => {\n this.stdinClosed = true;\n if (this.debug) {\n console.error(\"[MCP DEBUG] stdin closed, waiting for pending requests...\");\n }\n this.maybeExit();\n });\n\n // Handle errors gracefully\n process.stdin.on(\"error\", (err) => {\n if (this.debug) {\n console.error(\"[MCP DEBUG] stdin error:\", err.message);\n }\n });\n }\n\n /**\n * Exit if stdin is closed and no pending requests\n */\n private maybeExit(): void {\n if (this.stdinClosed && this.pendingRequests === 0) {\n if (this.debug) {\n console.error(\"[MCP DEBUG] All requests complete, exiting\");\n }\n process.exit(0);\n }\n }\n\n /**\n * Send a JSON-RPC response to stdout\n */\n send(response: JsonRpcResponse): void {\n const message = JSON.stringify(response);\n\n if (this.debug) {\n console.error(\"[MCP DEBUG] Sending:\", JSON.stringify(response, null, 2));\n }\n\n // Write to stdout with newline\n process.stdout.write(message + \"\\n\");\n }\n\n /**\n * Send an error response\n */\n sendError(id: string | number | null, code: number, message: string, data?: unknown): void {\n this.send({\n jsonrpc: \"2.0\",\n id,\n error: {\n code,\n message,\n data,\n },\n });\n }\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * FHIRfly API Client\n * Makes HTTP requests to the FHIRfly MCP endpoint\n */\n\nimport type {\n JsonRpcRequest,\n JsonRpcResponse,\n McpServerConfig,\n McpToolsListResult,\n McpToolCallResult,\n} from \"./types.js\";\n\nexport class FhirflyClient {\n private config: McpServerConfig;\n private nextId = 1;\n\n constructor(config: McpServerConfig) {\n this.config = config;\n }\n\n /**\n * Send a JSON-RPC request to the FHIRfly MCP endpoint\n */\n async request(method: string, params?: Record<string, unknown>): Promise<JsonRpcResponse> {\n const requestBody: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id: this.nextId++,\n method,\n params,\n };\n\n if (this.config.debug) {\n console.error(`[MCP DEBUG] API Request: ${method}`, params);\n }\n\n const timeoutMs = this.config.timeout ?? 30_000;\n\n try {\n const response = await fetch(`${this.config.apiUrl}/mcp`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.config.apiKey,\n \"User-Agent\": \"@fhirfly-io/mcp-server\",\n },\n body: JSON.stringify(requestBody),\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (!response.ok) {\n // Handle HTTP errors\n if (response.status === 401) {\n return {\n jsonrpc: \"2.0\",\n id: requestBody.id,\n error: {\n code: -32001,\n message: \"Authentication failed. Check your FHIRFLY_API_KEY.\",\n },\n };\n }\n\n if (response.status === 429) {\n // Retry once after Retry-After delay (cap at 10s)\n const retryAfter = response.headers.get(\"Retry-After\");\n const delaySec = Math.min(Number(retryAfter) || 1, 10);\n\n if (this.config.debug) {\n console.error(`[MCP DEBUG] Rate limited, retrying after ${delaySec}s`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, delaySec * 1000));\n\n const retryResponse = await fetch(`${this.config.apiUrl}/mcp`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.config.apiKey,\n \"User-Agent\": \"@fhirfly-io/mcp-server\",\n },\n body: JSON.stringify(requestBody),\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (!retryResponse.ok) {\n return {\n jsonrpc: \"2.0\",\n id: requestBody.id,\n error: {\n code: -32002,\n message: \"Rate limit exceeded. Please slow down requests.\",\n },\n };\n }\n\n const retryResult = (await retryResponse.json()) as JsonRpcResponse;\n\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] Retry response:\", JSON.stringify(retryResult, null, 2));\n }\n\n return retryResult;\n }\n\n return {\n jsonrpc: \"2.0\",\n id: requestBody.id,\n error: {\n code: -32000,\n message: `API error: ${response.status} ${response.statusText}`,\n },\n };\n }\n\n const result = (await response.json()) as JsonRpcResponse;\n\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] API Response:\", JSON.stringify(result, null, 2));\n }\n\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] API Error:\", message);\n }\n\n return {\n jsonrpc: \"2.0\",\n id: requestBody.id,\n error: {\n code: -32003,\n message: `Network error: ${message}`,\n },\n };\n }\n }\n\n /**\n * Get list of available tools from FHIRfly\n */\n async listTools(): Promise<McpToolsListResult> {\n const response = await this.request(\"tools/list\", {});\n\n if (response.error) {\n throw new Error(response.error.message);\n }\n\n return response.result as McpToolsListResult;\n }\n\n /**\n * Call a tool on the FHIRfly API\n */\n async callTool(name: string, args: Record<string, unknown>): Promise<McpToolCallResult> {\n const response = await this.request(\"tools/call\", {\n name,\n arguments: args,\n });\n\n if (response.error) {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n error: response.error.message,\n code: response.error.code,\n }),\n },\n ],\n isError: true,\n };\n }\n\n return response.result as McpToolCallResult;\n }\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * MCP Protocol Types\n * Based on Model Context Protocol specification\n */\n\n// JSON-RPC 2.0 Types\nexport interface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id: string | number;\n method: string;\n params?: Record<string, unknown>;\n}\n\nexport interface JsonRpcResponse {\n jsonrpc: \"2.0\";\n id: string | number | null;\n result?: unknown;\n error?: JsonRpcError;\n}\n\nexport interface JsonRpcError {\n code: number;\n message: string;\n data?: unknown;\n}\n\n// MCP Protocol Types\nexport interface McpToolDefinition {\n name: string;\n description: string;\n inputSchema: {\n type: \"object\";\n properties?: Record<string, unknown>;\n required?: string[];\n };\n}\n\nexport interface McpToolsListResult {\n tools: McpToolDefinition[];\n}\n\nexport interface McpToolCallParams {\n name: string;\n arguments: Record<string, unknown>;\n}\n\nexport interface McpToolCallResult {\n content: Array<{\n type: \"text\" | \"image\" | \"resource\";\n text?: string;\n data?: string;\n mimeType?: string;\n }>;\n isError?: boolean;\n}\n\n// Server Configuration\nexport interface McpServerConfig {\n apiKey: string;\n apiUrl: string;\n debug: boolean;\n /** Fetch timeout in milliseconds. Default: 30000 (30 seconds). */\n timeout?: number;\n}\n\n// Standard MCP Error Codes\nexport const MCP_ERROR_CODES = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n} as const;\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\nexport const VERSION = \"0.3.0\";\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * FHIRfly MCP Server\n * Main server class that handles MCP protocol messages\n */\n\nimport { StdioTransport } from \"./transport.js\";\nimport { FhirflyClient } from \"./client.js\";\nimport {\n MCP_ERROR_CODES,\n type JsonRpcRequest,\n type JsonRpcResponse,\n type McpServerConfig,\n type McpToolCallParams,\n} from \"./types.js\";\nimport { VERSION } from \"./version.js\";\n\n// Server capabilities\nconst SERVER_INFO = {\n name: \"fhirfly-mcp-server\",\n version: VERSION,\n};\n\nconst SERVER_CAPABILITIES = {\n tools: {},\n};\n\nexport class McpServer {\n private transport: StdioTransport;\n private client: FhirflyClient;\n private config: McpServerConfig;\n public initialized: boolean = false;\n\n constructor(config: McpServerConfig) {\n this.config = config;\n this.transport = new StdioTransport(config.debug);\n this.client = new FhirflyClient(config);\n }\n\n /**\n * Start the MCP server\n */\n start(): void {\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] Starting FHIRfly MCP Server\");\n console.error(\"[MCP DEBUG] API URL:\", this.config.apiUrl);\n console.error(\"[MCP DEBUG] API Key:\", this.config.apiKey.slice(0, 10) + \"...\");\n }\n\n this.transport.setHandler(this.handleMessage.bind(this));\n this.transport.start();\n }\n\n /**\n * Handle incoming JSON-RPC messages\n */\n private async handleMessage(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n try {\n // Validate JSON-RPC request structure\n if (request.jsonrpc !== \"2.0\" || !request.method) {\n return {\n jsonrpc: \"2.0\",\n id: request.id ?? null,\n error: {\n code: MCP_ERROR_CODES.INVALID_REQUEST,\n message: \"Invalid JSON-RPC request\",\n },\n };\n }\n\n // Route to appropriate handler\n switch (request.method) {\n case \"initialize\":\n return this.handleInitialize(request);\n\n case \"initialized\":\n // Client notification that initialization is complete\n this.initialized = true;\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result: {},\n };\n\n case \"tools/list\":\n return this.handleToolsList(request);\n\n case \"tools/call\":\n return this.handleToolsCall(request);\n\n case \"ping\":\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result: {},\n };\n\n default:\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.METHOD_NOT_FOUND,\n message: `Unknown method: ${request.method}`,\n },\n };\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] Handler error:\", message);\n }\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.INTERNAL_ERROR,\n message: `Internal error: ${message}`,\n },\n };\n }\n }\n\n /**\n * Handle initialize request\n */\n private async handleInitialize(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] Initialize request from client\");\n }\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result: {\n protocolVersion: \"2024-11-05\",\n serverInfo: SERVER_INFO,\n capabilities: SERVER_CAPABILITIES,\n },\n };\n }\n\n /**\n * Handle tools/list request\n */\n private async handleToolsList(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n try {\n const result = await this.client.listTools();\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.INTERNAL_ERROR,\n message: `Failed to list tools: ${message}`,\n },\n };\n }\n }\n\n /**\n * Handle tools/call request\n */\n private async handleToolsCall(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n const params = request.params as McpToolCallParams | undefined;\n\n if (!params?.name) {\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.INVALID_PARAMS,\n message: \"Missing tool name in params\",\n },\n };\n }\n\n try {\n const result = await this.client.callTool(params.name, params.arguments ?? {});\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.INTERNAL_ERROR,\n message: `Tool call failed: ${message}`,\n },\n };\n }\n }\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * FHIRfly MCP Server CLI\n * Entry point for running as an MCP server\n */\n\nimport { McpServer } from \"./server.js\";\nimport { VERSION } from \"./version.js\";\n\n// Handle --version and --help flags (before config validation)\nconst args = process.argv.slice(2);\nif (args.includes(\"--version\") || args.includes(\"-v\")) {\n console.log(VERSION);\n process.exit(0);\n}\nif (args.includes(\"--help\") || args.includes(\"-h\")) {\n console.log(`@fhirfly-io/mcp-server v${VERSION}`);\n console.log(\"\");\n console.log(\"MCP server for connecting AI assistants to FHIRfly healthcare data.\");\n console.log(\"\");\n console.log(\"Environment variables:\");\n console.log(\" FHIRFLY_API_KEY Your FHIRfly API key (required, starts with ffly_)\");\n console.log(\" FHIRFLY_API_URL API base URL (default: https://api.fhirfly.io)\");\n console.log(\" FHIRFLY_DEBUG Enable debug logging (set to 1 or true)\");\n console.log(\" FHIRFLY_TIMEOUT Fetch timeout in milliseconds (default: 30000)\");\n console.log(\"\");\n console.log(\"Usage with Claude Desktop:\");\n console.log(' npx @fhirfly-io/mcp-server');\n console.log(\"\");\n console.log(\"Flags:\");\n console.log(\" --version, -v Show version number\");\n console.log(\" --help, -h Show this help message\");\n process.exit(0);\n}\n\n// Configuration from environment\nconst API_KEY = process.env.FHIRFLY_API_KEY;\nconst API_URL = process.env.FHIRFLY_API_URL || \"https://api.fhirfly.io\";\nconst DEBUG = process.env.FHIRFLY_DEBUG === \"1\" || process.env.FHIRFLY_DEBUG === \"true\";\nconst TIMEOUT = process.env.FHIRFLY_TIMEOUT ? parseInt(process.env.FHIRFLY_TIMEOUT, 10) : undefined;\n\n// Validate required configuration\nif (!API_KEY) {\n console.error(\"Error: FHIRFLY_API_KEY environment variable is required\");\n console.error(\"\");\n console.error(\"To get an API key:\");\n console.error(\" 1. Sign up at https://fhirfly.io\");\n console.error(\" 2. Go to Dashboard > Credentials\");\n console.error(\" 3. Create an MCP credential\");\n console.error(\"\");\n console.error(\"Then set the environment variable:\");\n console.error(' export FHIRFLY_API_KEY=\"your_api_key_here\"');\n console.error(\"\");\n console.error(\"Or configure in Claude Desktop's claude_desktop_config.json\");\n process.exit(1);\n}\n\n// Validate API key format\nif (!API_KEY.startsWith(\"ffly_\")) {\n console.error(\"Error: Invalid API key format\");\n console.error(\"FHIRfly API keys start with 'ffly_'\");\n console.error(\"\");\n console.error(\"Please check your FHIRFLY_API_KEY environment variable.\");\n process.exit(1);\n}\n\nif (DEBUG) {\n console.error(\"=\".repeat(50));\n console.error(\"FHIRfly MCP Server - Debug Mode\");\n console.error(\"=\".repeat(50));\n console.error(\"API URL:\", API_URL);\n console.error(\"API Key:\", API_KEY.slice(0, 10) + \"...\");\n console.error(\"=\".repeat(50));\n}\n\n// Create and start server\nconst server = new McpServer({\n apiKey: API_KEY,\n apiUrl: API_URL,\n debug: DEBUG,\n timeout: TIMEOUT,\n});\n\nserver.start();\n"]}
package/dist/index.cjs CHANGED
@@ -253,7 +253,7 @@ var MCP_ERROR_CODES = {
253
253
  };
254
254
 
255
255
  // src/version.ts
256
- var VERSION = "0.2.3";
256
+ var VERSION = "0.3.0";
257
257
 
258
258
  // src/server.ts
259
259
  var SERVER_INFO = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/transport.ts","../src/client.ts","../src/types.ts","../src/version.ts","../src/server.ts"],"names":["createInterface"],"mappings":"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","file":"index.cjs","sourcesContent":["// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * MCP Stdio Transport\n * Handles JSON-RPC communication over stdin/stdout\n */\n\nimport { createInterface } from \"readline\";\nimport type { JsonRpcRequest, JsonRpcResponse } from \"./types.js\";\n\nexport type MessageHandler = (request: JsonRpcRequest) => Promise<JsonRpcResponse>;\n\nexport class StdioTransport {\n private handler: MessageHandler | null = null;\n private debug: boolean;\n private pendingRequests: number = 0;\n private stdinClosed: boolean = false;\n\n constructor(debug: boolean = false) {\n this.debug = debug;\n }\n\n /**\n * Set the handler for incoming messages\n */\n setHandler(handler: MessageHandler): void {\n this.handler = handler;\n }\n\n /**\n * Start listening for messages on stdin\n */\n start(): void {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: false,\n });\n\n // Buffer for accumulating partial messages\n let buffer = \"\";\n\n rl.on(\"line\", async (line) => {\n buffer += line;\n\n // Try to parse as JSON\n try {\n const request = JSON.parse(buffer) as JsonRpcRequest;\n buffer = \"\"; // Clear buffer on successful parse\n\n if (this.debug) {\n console.error(\"[MCP DEBUG] Received:\", JSON.stringify(request, null, 2));\n }\n\n if (this.handler) {\n this.pendingRequests++;\n try {\n const response = await this.handler(request);\n this.send(response);\n } finally {\n this.pendingRequests--;\n this.maybeExit();\n }\n }\n } catch {\n // If parse fails, might be partial message - keep buffering\n // Unless it looks like a complete but invalid message\n if (line.trim().endsWith(\"}\")) {\n this.sendError(null, -32700, \"Parse error: Invalid JSON\");\n buffer = \"\";\n }\n }\n });\n\n rl.on(\"close\", () => {\n this.stdinClosed = true;\n if (this.debug) {\n console.error(\"[MCP DEBUG] stdin closed, waiting for pending requests...\");\n }\n this.maybeExit();\n });\n\n // Handle errors gracefully\n process.stdin.on(\"error\", (err) => {\n if (this.debug) {\n console.error(\"[MCP DEBUG] stdin error:\", err.message);\n }\n });\n }\n\n /**\n * Exit if stdin is closed and no pending requests\n */\n private maybeExit(): void {\n if (this.stdinClosed && this.pendingRequests === 0) {\n if (this.debug) {\n console.error(\"[MCP DEBUG] All requests complete, exiting\");\n }\n process.exit(0);\n }\n }\n\n /**\n * Send a JSON-RPC response to stdout\n */\n send(response: JsonRpcResponse): void {\n const message = JSON.stringify(response);\n\n if (this.debug) {\n console.error(\"[MCP DEBUG] Sending:\", JSON.stringify(response, null, 2));\n }\n\n // Write to stdout with newline\n process.stdout.write(message + \"\\n\");\n }\n\n /**\n * Send an error response\n */\n sendError(id: string | number | null, code: number, message: string, data?: unknown): void {\n this.send({\n jsonrpc: \"2.0\",\n id,\n error: {\n code,\n message,\n data,\n },\n });\n }\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * FHIRfly API Client\n * Makes HTTP requests to the FHIRfly MCP endpoint\n */\n\nimport type {\n JsonRpcRequest,\n JsonRpcResponse,\n McpServerConfig,\n McpToolsListResult,\n McpToolCallResult,\n} from \"./types.js\";\n\nexport class FhirflyClient {\n private config: McpServerConfig;\n private nextId = 1;\n\n constructor(config: McpServerConfig) {\n this.config = config;\n }\n\n /**\n * Send a JSON-RPC request to the FHIRfly MCP endpoint\n */\n async request(method: string, params?: Record<string, unknown>): Promise<JsonRpcResponse> {\n const requestBody: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id: this.nextId++,\n method,\n params,\n };\n\n if (this.config.debug) {\n console.error(`[MCP DEBUG] API Request: ${method}`, params);\n }\n\n const timeoutMs = this.config.timeout ?? 30_000;\n\n try {\n const response = await fetch(`${this.config.apiUrl}/mcp`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.config.apiKey,\n \"User-Agent\": \"@fhirfly-io/mcp-server\",\n },\n body: JSON.stringify(requestBody),\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (!response.ok) {\n // Handle HTTP errors\n if (response.status === 401) {\n return {\n jsonrpc: \"2.0\",\n id: requestBody.id,\n error: {\n code: -32001,\n message: \"Authentication failed. Check your FHIRFLY_API_KEY.\",\n },\n };\n }\n\n if (response.status === 429) {\n // Retry once after Retry-After delay (cap at 10s)\n const retryAfter = response.headers.get(\"Retry-After\");\n const delaySec = Math.min(Number(retryAfter) || 1, 10);\n\n if (this.config.debug) {\n console.error(`[MCP DEBUG] Rate limited, retrying after ${delaySec}s`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, delaySec * 1000));\n\n const retryResponse = await fetch(`${this.config.apiUrl}/mcp`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.config.apiKey,\n \"User-Agent\": \"@fhirfly-io/mcp-server\",\n },\n body: JSON.stringify(requestBody),\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (!retryResponse.ok) {\n return {\n jsonrpc: \"2.0\",\n id: requestBody.id,\n error: {\n code: -32002,\n message: \"Rate limit exceeded. Please slow down requests.\",\n },\n };\n }\n\n const retryResult = (await retryResponse.json()) as JsonRpcResponse;\n\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] Retry response:\", JSON.stringify(retryResult, null, 2));\n }\n\n return retryResult;\n }\n\n return {\n jsonrpc: \"2.0\",\n id: requestBody.id,\n error: {\n code: -32000,\n message: `API error: ${response.status} ${response.statusText}`,\n },\n };\n }\n\n const result = (await response.json()) as JsonRpcResponse;\n\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] API Response:\", JSON.stringify(result, null, 2));\n }\n\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] API Error:\", message);\n }\n\n return {\n jsonrpc: \"2.0\",\n id: requestBody.id,\n error: {\n code: -32003,\n message: `Network error: ${message}`,\n },\n };\n }\n }\n\n /**\n * Get list of available tools from FHIRfly\n */\n async listTools(): Promise<McpToolsListResult> {\n const response = await this.request(\"tools/list\", {});\n\n if (response.error) {\n throw new Error(response.error.message);\n }\n\n return response.result as McpToolsListResult;\n }\n\n /**\n * Call a tool on the FHIRfly API\n */\n async callTool(name: string, args: Record<string, unknown>): Promise<McpToolCallResult> {\n const response = await this.request(\"tools/call\", {\n name,\n arguments: args,\n });\n\n if (response.error) {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n error: response.error.message,\n code: response.error.code,\n }),\n },\n ],\n isError: true,\n };\n }\n\n return response.result as McpToolCallResult;\n }\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * MCP Protocol Types\n * Based on Model Context Protocol specification\n */\n\n// JSON-RPC 2.0 Types\nexport interface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id: string | number;\n method: string;\n params?: Record<string, unknown>;\n}\n\nexport interface JsonRpcResponse {\n jsonrpc: \"2.0\";\n id: string | number | null;\n result?: unknown;\n error?: JsonRpcError;\n}\n\nexport interface JsonRpcError {\n code: number;\n message: string;\n data?: unknown;\n}\n\n// MCP Protocol Types\nexport interface McpToolDefinition {\n name: string;\n description: string;\n inputSchema: {\n type: \"object\";\n properties?: Record<string, unknown>;\n required?: string[];\n };\n}\n\nexport interface McpToolsListResult {\n tools: McpToolDefinition[];\n}\n\nexport interface McpToolCallParams {\n name: string;\n arguments: Record<string, unknown>;\n}\n\nexport interface McpToolCallResult {\n content: Array<{\n type: \"text\" | \"image\" | \"resource\";\n text?: string;\n data?: string;\n mimeType?: string;\n }>;\n isError?: boolean;\n}\n\n// Server Configuration\nexport interface McpServerConfig {\n apiKey: string;\n apiUrl: string;\n debug: boolean;\n /** Fetch timeout in milliseconds. Default: 30000 (30 seconds). */\n timeout?: number;\n}\n\n// Standard MCP Error Codes\nexport const MCP_ERROR_CODES = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n} as const;\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\nexport const VERSION = \"0.2.3\";\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * FHIRfly MCP Server\n * Main server class that handles MCP protocol messages\n */\n\nimport { StdioTransport } from \"./transport.js\";\nimport { FhirflyClient } from \"./client.js\";\nimport {\n MCP_ERROR_CODES,\n type JsonRpcRequest,\n type JsonRpcResponse,\n type McpServerConfig,\n type McpToolCallParams,\n} from \"./types.js\";\nimport { VERSION } from \"./version.js\";\n\n// Server capabilities\nconst SERVER_INFO = {\n name: \"fhirfly-mcp-server\",\n version: VERSION,\n};\n\nconst SERVER_CAPABILITIES = {\n tools: {},\n};\n\nexport class McpServer {\n private transport: StdioTransport;\n private client: FhirflyClient;\n private config: McpServerConfig;\n public initialized: boolean = false;\n\n constructor(config: McpServerConfig) {\n this.config = config;\n this.transport = new StdioTransport(config.debug);\n this.client = new FhirflyClient(config);\n }\n\n /**\n * Start the MCP server\n */\n start(): void {\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] Starting FHIRfly MCP Server\");\n console.error(\"[MCP DEBUG] API URL:\", this.config.apiUrl);\n console.error(\"[MCP DEBUG] API Key:\", this.config.apiKey.slice(0, 10) + \"...\");\n }\n\n this.transport.setHandler(this.handleMessage.bind(this));\n this.transport.start();\n }\n\n /**\n * Handle incoming JSON-RPC messages\n */\n private async handleMessage(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n try {\n // Validate JSON-RPC request structure\n if (request.jsonrpc !== \"2.0\" || !request.method) {\n return {\n jsonrpc: \"2.0\",\n id: request.id ?? null,\n error: {\n code: MCP_ERROR_CODES.INVALID_REQUEST,\n message: \"Invalid JSON-RPC request\",\n },\n };\n }\n\n // Route to appropriate handler\n switch (request.method) {\n case \"initialize\":\n return this.handleInitialize(request);\n\n case \"initialized\":\n // Client notification that initialization is complete\n this.initialized = true;\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result: {},\n };\n\n case \"tools/list\":\n return this.handleToolsList(request);\n\n case \"tools/call\":\n return this.handleToolsCall(request);\n\n case \"ping\":\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result: {},\n };\n\n default:\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.METHOD_NOT_FOUND,\n message: `Unknown method: ${request.method}`,\n },\n };\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] Handler error:\", message);\n }\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.INTERNAL_ERROR,\n message: `Internal error: ${message}`,\n },\n };\n }\n }\n\n /**\n * Handle initialize request\n */\n private async handleInitialize(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] Initialize request from client\");\n }\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result: {\n protocolVersion: \"2024-11-05\",\n serverInfo: SERVER_INFO,\n capabilities: SERVER_CAPABILITIES,\n },\n };\n }\n\n /**\n * Handle tools/list request\n */\n private async handleToolsList(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n try {\n const result = await this.client.listTools();\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.INTERNAL_ERROR,\n message: `Failed to list tools: ${message}`,\n },\n };\n }\n }\n\n /**\n * Handle tools/call request\n */\n private async handleToolsCall(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n const params = request.params as McpToolCallParams | undefined;\n\n if (!params?.name) {\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.INVALID_PARAMS,\n message: \"Missing tool name in params\",\n },\n };\n }\n\n try {\n const result = await this.client.callTool(params.name, params.arguments ?? {});\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.INTERNAL_ERROR,\n message: `Tool call failed: ${message}`,\n },\n };\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/transport.ts","../src/client.ts","../src/types.ts","../src/version.ts","../src/server.ts"],"names":["createInterface"],"mappings":"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","file":"index.cjs","sourcesContent":["// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * MCP Stdio Transport\n * Handles JSON-RPC communication over stdin/stdout\n */\n\nimport { createInterface } from \"readline\";\nimport type { JsonRpcRequest, JsonRpcResponse } from \"./types.js\";\n\nexport type MessageHandler = (request: JsonRpcRequest) => Promise<JsonRpcResponse>;\n\nexport class StdioTransport {\n private handler: MessageHandler | null = null;\n private debug: boolean;\n private pendingRequests: number = 0;\n private stdinClosed: boolean = false;\n\n constructor(debug: boolean = false) {\n this.debug = debug;\n }\n\n /**\n * Set the handler for incoming messages\n */\n setHandler(handler: MessageHandler): void {\n this.handler = handler;\n }\n\n /**\n * Start listening for messages on stdin\n */\n start(): void {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: false,\n });\n\n // Buffer for accumulating partial messages\n let buffer = \"\";\n\n rl.on(\"line\", async (line) => {\n buffer += line;\n\n // Try to parse as JSON\n try {\n const request = JSON.parse(buffer) as JsonRpcRequest;\n buffer = \"\"; // Clear buffer on successful parse\n\n if (this.debug) {\n console.error(\"[MCP DEBUG] Received:\", JSON.stringify(request, null, 2));\n }\n\n if (this.handler) {\n this.pendingRequests++;\n try {\n const response = await this.handler(request);\n this.send(response);\n } finally {\n this.pendingRequests--;\n this.maybeExit();\n }\n }\n } catch {\n // If parse fails, might be partial message - keep buffering\n // Unless it looks like a complete but invalid message\n if (line.trim().endsWith(\"}\")) {\n this.sendError(null, -32700, \"Parse error: Invalid JSON\");\n buffer = \"\";\n }\n }\n });\n\n rl.on(\"close\", () => {\n this.stdinClosed = true;\n if (this.debug) {\n console.error(\"[MCP DEBUG] stdin closed, waiting for pending requests...\");\n }\n this.maybeExit();\n });\n\n // Handle errors gracefully\n process.stdin.on(\"error\", (err) => {\n if (this.debug) {\n console.error(\"[MCP DEBUG] stdin error:\", err.message);\n }\n });\n }\n\n /**\n * Exit if stdin is closed and no pending requests\n */\n private maybeExit(): void {\n if (this.stdinClosed && this.pendingRequests === 0) {\n if (this.debug) {\n console.error(\"[MCP DEBUG] All requests complete, exiting\");\n }\n process.exit(0);\n }\n }\n\n /**\n * Send a JSON-RPC response to stdout\n */\n send(response: JsonRpcResponse): void {\n const message = JSON.stringify(response);\n\n if (this.debug) {\n console.error(\"[MCP DEBUG] Sending:\", JSON.stringify(response, null, 2));\n }\n\n // Write to stdout with newline\n process.stdout.write(message + \"\\n\");\n }\n\n /**\n * Send an error response\n */\n sendError(id: string | number | null, code: number, message: string, data?: unknown): void {\n this.send({\n jsonrpc: \"2.0\",\n id,\n error: {\n code,\n message,\n data,\n },\n });\n }\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * FHIRfly API Client\n * Makes HTTP requests to the FHIRfly MCP endpoint\n */\n\nimport type {\n JsonRpcRequest,\n JsonRpcResponse,\n McpServerConfig,\n McpToolsListResult,\n McpToolCallResult,\n} from \"./types.js\";\n\nexport class FhirflyClient {\n private config: McpServerConfig;\n private nextId = 1;\n\n constructor(config: McpServerConfig) {\n this.config = config;\n }\n\n /**\n * Send a JSON-RPC request to the FHIRfly MCP endpoint\n */\n async request(method: string, params?: Record<string, unknown>): Promise<JsonRpcResponse> {\n const requestBody: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id: this.nextId++,\n method,\n params,\n };\n\n if (this.config.debug) {\n console.error(`[MCP DEBUG] API Request: ${method}`, params);\n }\n\n const timeoutMs = this.config.timeout ?? 30_000;\n\n try {\n const response = await fetch(`${this.config.apiUrl}/mcp`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.config.apiKey,\n \"User-Agent\": \"@fhirfly-io/mcp-server\",\n },\n body: JSON.stringify(requestBody),\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (!response.ok) {\n // Handle HTTP errors\n if (response.status === 401) {\n return {\n jsonrpc: \"2.0\",\n id: requestBody.id,\n error: {\n code: -32001,\n message: \"Authentication failed. Check your FHIRFLY_API_KEY.\",\n },\n };\n }\n\n if (response.status === 429) {\n // Retry once after Retry-After delay (cap at 10s)\n const retryAfter = response.headers.get(\"Retry-After\");\n const delaySec = Math.min(Number(retryAfter) || 1, 10);\n\n if (this.config.debug) {\n console.error(`[MCP DEBUG] Rate limited, retrying after ${delaySec}s`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, delaySec * 1000));\n\n const retryResponse = await fetch(`${this.config.apiUrl}/mcp`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.config.apiKey,\n \"User-Agent\": \"@fhirfly-io/mcp-server\",\n },\n body: JSON.stringify(requestBody),\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (!retryResponse.ok) {\n return {\n jsonrpc: \"2.0\",\n id: requestBody.id,\n error: {\n code: -32002,\n message: \"Rate limit exceeded. Please slow down requests.\",\n },\n };\n }\n\n const retryResult = (await retryResponse.json()) as JsonRpcResponse;\n\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] Retry response:\", JSON.stringify(retryResult, null, 2));\n }\n\n return retryResult;\n }\n\n return {\n jsonrpc: \"2.0\",\n id: requestBody.id,\n error: {\n code: -32000,\n message: `API error: ${response.status} ${response.statusText}`,\n },\n };\n }\n\n const result = (await response.json()) as JsonRpcResponse;\n\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] API Response:\", JSON.stringify(result, null, 2));\n }\n\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] API Error:\", message);\n }\n\n return {\n jsonrpc: \"2.0\",\n id: requestBody.id,\n error: {\n code: -32003,\n message: `Network error: ${message}`,\n },\n };\n }\n }\n\n /**\n * Get list of available tools from FHIRfly\n */\n async listTools(): Promise<McpToolsListResult> {\n const response = await this.request(\"tools/list\", {});\n\n if (response.error) {\n throw new Error(response.error.message);\n }\n\n return response.result as McpToolsListResult;\n }\n\n /**\n * Call a tool on the FHIRfly API\n */\n async callTool(name: string, args: Record<string, unknown>): Promise<McpToolCallResult> {\n const response = await this.request(\"tools/call\", {\n name,\n arguments: args,\n });\n\n if (response.error) {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n error: response.error.message,\n code: response.error.code,\n }),\n },\n ],\n isError: true,\n };\n }\n\n return response.result as McpToolCallResult;\n }\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * MCP Protocol Types\n * Based on Model Context Protocol specification\n */\n\n// JSON-RPC 2.0 Types\nexport interface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id: string | number;\n method: string;\n params?: Record<string, unknown>;\n}\n\nexport interface JsonRpcResponse {\n jsonrpc: \"2.0\";\n id: string | number | null;\n result?: unknown;\n error?: JsonRpcError;\n}\n\nexport interface JsonRpcError {\n code: number;\n message: string;\n data?: unknown;\n}\n\n// MCP Protocol Types\nexport interface McpToolDefinition {\n name: string;\n description: string;\n inputSchema: {\n type: \"object\";\n properties?: Record<string, unknown>;\n required?: string[];\n };\n}\n\nexport interface McpToolsListResult {\n tools: McpToolDefinition[];\n}\n\nexport interface McpToolCallParams {\n name: string;\n arguments: Record<string, unknown>;\n}\n\nexport interface McpToolCallResult {\n content: Array<{\n type: \"text\" | \"image\" | \"resource\";\n text?: string;\n data?: string;\n mimeType?: string;\n }>;\n isError?: boolean;\n}\n\n// Server Configuration\nexport interface McpServerConfig {\n apiKey: string;\n apiUrl: string;\n debug: boolean;\n /** Fetch timeout in milliseconds. Default: 30000 (30 seconds). */\n timeout?: number;\n}\n\n// Standard MCP Error Codes\nexport const MCP_ERROR_CODES = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n} as const;\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\nexport const VERSION = \"0.3.0\";\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * FHIRfly MCP Server\n * Main server class that handles MCP protocol messages\n */\n\nimport { StdioTransport } from \"./transport.js\";\nimport { FhirflyClient } from \"./client.js\";\nimport {\n MCP_ERROR_CODES,\n type JsonRpcRequest,\n type JsonRpcResponse,\n type McpServerConfig,\n type McpToolCallParams,\n} from \"./types.js\";\nimport { VERSION } from \"./version.js\";\n\n// Server capabilities\nconst SERVER_INFO = {\n name: \"fhirfly-mcp-server\",\n version: VERSION,\n};\n\nconst SERVER_CAPABILITIES = {\n tools: {},\n};\n\nexport class McpServer {\n private transport: StdioTransport;\n private client: FhirflyClient;\n private config: McpServerConfig;\n public initialized: boolean = false;\n\n constructor(config: McpServerConfig) {\n this.config = config;\n this.transport = new StdioTransport(config.debug);\n this.client = new FhirflyClient(config);\n }\n\n /**\n * Start the MCP server\n */\n start(): void {\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] Starting FHIRfly MCP Server\");\n console.error(\"[MCP DEBUG] API URL:\", this.config.apiUrl);\n console.error(\"[MCP DEBUG] API Key:\", this.config.apiKey.slice(0, 10) + \"...\");\n }\n\n this.transport.setHandler(this.handleMessage.bind(this));\n this.transport.start();\n }\n\n /**\n * Handle incoming JSON-RPC messages\n */\n private async handleMessage(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n try {\n // Validate JSON-RPC request structure\n if (request.jsonrpc !== \"2.0\" || !request.method) {\n return {\n jsonrpc: \"2.0\",\n id: request.id ?? null,\n error: {\n code: MCP_ERROR_CODES.INVALID_REQUEST,\n message: \"Invalid JSON-RPC request\",\n },\n };\n }\n\n // Route to appropriate handler\n switch (request.method) {\n case \"initialize\":\n return this.handleInitialize(request);\n\n case \"initialized\":\n // Client notification that initialization is complete\n this.initialized = true;\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result: {},\n };\n\n case \"tools/list\":\n return this.handleToolsList(request);\n\n case \"tools/call\":\n return this.handleToolsCall(request);\n\n case \"ping\":\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result: {},\n };\n\n default:\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.METHOD_NOT_FOUND,\n message: `Unknown method: ${request.method}`,\n },\n };\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] Handler error:\", message);\n }\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.INTERNAL_ERROR,\n message: `Internal error: ${message}`,\n },\n };\n }\n }\n\n /**\n * Handle initialize request\n */\n private async handleInitialize(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] Initialize request from client\");\n }\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result: {\n protocolVersion: \"2024-11-05\",\n serverInfo: SERVER_INFO,\n capabilities: SERVER_CAPABILITIES,\n },\n };\n }\n\n /**\n * Handle tools/list request\n */\n private async handleToolsList(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n try {\n const result = await this.client.listTools();\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.INTERNAL_ERROR,\n message: `Failed to list tools: ${message}`,\n },\n };\n }\n }\n\n /**\n * Handle tools/call request\n */\n private async handleToolsCall(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n const params = request.params as McpToolCallParams | undefined;\n\n if (!params?.name) {\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.INVALID_PARAMS,\n message: \"Missing tool name in params\",\n },\n };\n }\n\n try {\n const result = await this.client.callTool(params.name, params.arguments ?? {});\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.INTERNAL_ERROR,\n message: `Tool call failed: ${message}`,\n },\n };\n }\n }\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -142,6 +142,6 @@ declare class StdioTransport {
142
142
  sendError(id: string | number | null, code: number, message: string, data?: unknown): void;
143
143
  }
144
144
 
145
- declare const VERSION = "0.2.3";
145
+ declare const VERSION = "0.3.0";
146
146
 
147
147
  export { FhirflyClient, type JsonRpcError, type JsonRpcRequest, type JsonRpcResponse, McpServer, type McpServerConfig, type McpToolCallParams, type McpToolCallResult, type McpToolDefinition, type McpToolsListResult, StdioTransport, VERSION };
package/dist/index.d.ts CHANGED
@@ -142,6 +142,6 @@ declare class StdioTransport {
142
142
  sendError(id: string | number | null, code: number, message: string, data?: unknown): void;
143
143
  }
144
144
 
145
- declare const VERSION = "0.2.3";
145
+ declare const VERSION = "0.3.0";
146
146
 
147
147
  export { FhirflyClient, type JsonRpcError, type JsonRpcRequest, type JsonRpcResponse, McpServer, type McpServerConfig, type McpToolCallParams, type McpToolCallResult, type McpToolDefinition, type McpToolsListResult, StdioTransport, VERSION };
package/dist/index.js CHANGED
@@ -251,7 +251,7 @@ var MCP_ERROR_CODES = {
251
251
  };
252
252
 
253
253
  // src/version.ts
254
- var VERSION = "0.2.3";
254
+ var VERSION = "0.3.0";
255
255
 
256
256
  // src/server.ts
257
257
  var SERVER_INFO = {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/transport.ts","../src/client.ts","../src/types.ts","../src/version.ts","../src/server.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * MCP Stdio Transport\n * Handles JSON-RPC communication over stdin/stdout\n */\n\nimport { createInterface } from \"readline\";\nimport type { JsonRpcRequest, JsonRpcResponse } from \"./types.js\";\n\nexport type MessageHandler = (request: JsonRpcRequest) => Promise<JsonRpcResponse>;\n\nexport class StdioTransport {\n private handler: MessageHandler | null = null;\n private debug: boolean;\n private pendingRequests: number = 0;\n private stdinClosed: boolean = false;\n\n constructor(debug: boolean = false) {\n this.debug = debug;\n }\n\n /**\n * Set the handler for incoming messages\n */\n setHandler(handler: MessageHandler): void {\n this.handler = handler;\n }\n\n /**\n * Start listening for messages on stdin\n */\n start(): void {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: false,\n });\n\n // Buffer for accumulating partial messages\n let buffer = \"\";\n\n rl.on(\"line\", async (line) => {\n buffer += line;\n\n // Try to parse as JSON\n try {\n const request = JSON.parse(buffer) as JsonRpcRequest;\n buffer = \"\"; // Clear buffer on successful parse\n\n if (this.debug) {\n console.error(\"[MCP DEBUG] Received:\", JSON.stringify(request, null, 2));\n }\n\n if (this.handler) {\n this.pendingRequests++;\n try {\n const response = await this.handler(request);\n this.send(response);\n } finally {\n this.pendingRequests--;\n this.maybeExit();\n }\n }\n } catch {\n // If parse fails, might be partial message - keep buffering\n // Unless it looks like a complete but invalid message\n if (line.trim().endsWith(\"}\")) {\n this.sendError(null, -32700, \"Parse error: Invalid JSON\");\n buffer = \"\";\n }\n }\n });\n\n rl.on(\"close\", () => {\n this.stdinClosed = true;\n if (this.debug) {\n console.error(\"[MCP DEBUG] stdin closed, waiting for pending requests...\");\n }\n this.maybeExit();\n });\n\n // Handle errors gracefully\n process.stdin.on(\"error\", (err) => {\n if (this.debug) {\n console.error(\"[MCP DEBUG] stdin error:\", err.message);\n }\n });\n }\n\n /**\n * Exit if stdin is closed and no pending requests\n */\n private maybeExit(): void {\n if (this.stdinClosed && this.pendingRequests === 0) {\n if (this.debug) {\n console.error(\"[MCP DEBUG] All requests complete, exiting\");\n }\n process.exit(0);\n }\n }\n\n /**\n * Send a JSON-RPC response to stdout\n */\n send(response: JsonRpcResponse): void {\n const message = JSON.stringify(response);\n\n if (this.debug) {\n console.error(\"[MCP DEBUG] Sending:\", JSON.stringify(response, null, 2));\n }\n\n // Write to stdout with newline\n process.stdout.write(message + \"\\n\");\n }\n\n /**\n * Send an error response\n */\n sendError(id: string | number | null, code: number, message: string, data?: unknown): void {\n this.send({\n jsonrpc: \"2.0\",\n id,\n error: {\n code,\n message,\n data,\n },\n });\n }\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * FHIRfly API Client\n * Makes HTTP requests to the FHIRfly MCP endpoint\n */\n\nimport type {\n JsonRpcRequest,\n JsonRpcResponse,\n McpServerConfig,\n McpToolsListResult,\n McpToolCallResult,\n} from \"./types.js\";\n\nexport class FhirflyClient {\n private config: McpServerConfig;\n private nextId = 1;\n\n constructor(config: McpServerConfig) {\n this.config = config;\n }\n\n /**\n * Send a JSON-RPC request to the FHIRfly MCP endpoint\n */\n async request(method: string, params?: Record<string, unknown>): Promise<JsonRpcResponse> {\n const requestBody: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id: this.nextId++,\n method,\n params,\n };\n\n if (this.config.debug) {\n console.error(`[MCP DEBUG] API Request: ${method}`, params);\n }\n\n const timeoutMs = this.config.timeout ?? 30_000;\n\n try {\n const response = await fetch(`${this.config.apiUrl}/mcp`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.config.apiKey,\n \"User-Agent\": \"@fhirfly-io/mcp-server\",\n },\n body: JSON.stringify(requestBody),\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (!response.ok) {\n // Handle HTTP errors\n if (response.status === 401) {\n return {\n jsonrpc: \"2.0\",\n id: requestBody.id,\n error: {\n code: -32001,\n message: \"Authentication failed. Check your FHIRFLY_API_KEY.\",\n },\n };\n }\n\n if (response.status === 429) {\n // Retry once after Retry-After delay (cap at 10s)\n const retryAfter = response.headers.get(\"Retry-After\");\n const delaySec = Math.min(Number(retryAfter) || 1, 10);\n\n if (this.config.debug) {\n console.error(`[MCP DEBUG] Rate limited, retrying after ${delaySec}s`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, delaySec * 1000));\n\n const retryResponse = await fetch(`${this.config.apiUrl}/mcp`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.config.apiKey,\n \"User-Agent\": \"@fhirfly-io/mcp-server\",\n },\n body: JSON.stringify(requestBody),\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (!retryResponse.ok) {\n return {\n jsonrpc: \"2.0\",\n id: requestBody.id,\n error: {\n code: -32002,\n message: \"Rate limit exceeded. Please slow down requests.\",\n },\n };\n }\n\n const retryResult = (await retryResponse.json()) as JsonRpcResponse;\n\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] Retry response:\", JSON.stringify(retryResult, null, 2));\n }\n\n return retryResult;\n }\n\n return {\n jsonrpc: \"2.0\",\n id: requestBody.id,\n error: {\n code: -32000,\n message: `API error: ${response.status} ${response.statusText}`,\n },\n };\n }\n\n const result = (await response.json()) as JsonRpcResponse;\n\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] API Response:\", JSON.stringify(result, null, 2));\n }\n\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] API Error:\", message);\n }\n\n return {\n jsonrpc: \"2.0\",\n id: requestBody.id,\n error: {\n code: -32003,\n message: `Network error: ${message}`,\n },\n };\n }\n }\n\n /**\n * Get list of available tools from FHIRfly\n */\n async listTools(): Promise<McpToolsListResult> {\n const response = await this.request(\"tools/list\", {});\n\n if (response.error) {\n throw new Error(response.error.message);\n }\n\n return response.result as McpToolsListResult;\n }\n\n /**\n * Call a tool on the FHIRfly API\n */\n async callTool(name: string, args: Record<string, unknown>): Promise<McpToolCallResult> {\n const response = await this.request(\"tools/call\", {\n name,\n arguments: args,\n });\n\n if (response.error) {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n error: response.error.message,\n code: response.error.code,\n }),\n },\n ],\n isError: true,\n };\n }\n\n return response.result as McpToolCallResult;\n }\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * MCP Protocol Types\n * Based on Model Context Protocol specification\n */\n\n// JSON-RPC 2.0 Types\nexport interface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id: string | number;\n method: string;\n params?: Record<string, unknown>;\n}\n\nexport interface JsonRpcResponse {\n jsonrpc: \"2.0\";\n id: string | number | null;\n result?: unknown;\n error?: JsonRpcError;\n}\n\nexport interface JsonRpcError {\n code: number;\n message: string;\n data?: unknown;\n}\n\n// MCP Protocol Types\nexport interface McpToolDefinition {\n name: string;\n description: string;\n inputSchema: {\n type: \"object\";\n properties?: Record<string, unknown>;\n required?: string[];\n };\n}\n\nexport interface McpToolsListResult {\n tools: McpToolDefinition[];\n}\n\nexport interface McpToolCallParams {\n name: string;\n arguments: Record<string, unknown>;\n}\n\nexport interface McpToolCallResult {\n content: Array<{\n type: \"text\" | \"image\" | \"resource\";\n text?: string;\n data?: string;\n mimeType?: string;\n }>;\n isError?: boolean;\n}\n\n// Server Configuration\nexport interface McpServerConfig {\n apiKey: string;\n apiUrl: string;\n debug: boolean;\n /** Fetch timeout in milliseconds. Default: 30000 (30 seconds). */\n timeout?: number;\n}\n\n// Standard MCP Error Codes\nexport const MCP_ERROR_CODES = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n} as const;\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\nexport const VERSION = \"0.2.3\";\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * FHIRfly MCP Server\n * Main server class that handles MCP protocol messages\n */\n\nimport { StdioTransport } from \"./transport.js\";\nimport { FhirflyClient } from \"./client.js\";\nimport {\n MCP_ERROR_CODES,\n type JsonRpcRequest,\n type JsonRpcResponse,\n type McpServerConfig,\n type McpToolCallParams,\n} from \"./types.js\";\nimport { VERSION } from \"./version.js\";\n\n// Server capabilities\nconst SERVER_INFO = {\n name: \"fhirfly-mcp-server\",\n version: VERSION,\n};\n\nconst SERVER_CAPABILITIES = {\n tools: {},\n};\n\nexport class McpServer {\n private transport: StdioTransport;\n private client: FhirflyClient;\n private config: McpServerConfig;\n public initialized: boolean = false;\n\n constructor(config: McpServerConfig) {\n this.config = config;\n this.transport = new StdioTransport(config.debug);\n this.client = new FhirflyClient(config);\n }\n\n /**\n * Start the MCP server\n */\n start(): void {\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] Starting FHIRfly MCP Server\");\n console.error(\"[MCP DEBUG] API URL:\", this.config.apiUrl);\n console.error(\"[MCP DEBUG] API Key:\", this.config.apiKey.slice(0, 10) + \"...\");\n }\n\n this.transport.setHandler(this.handleMessage.bind(this));\n this.transport.start();\n }\n\n /**\n * Handle incoming JSON-RPC messages\n */\n private async handleMessage(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n try {\n // Validate JSON-RPC request structure\n if (request.jsonrpc !== \"2.0\" || !request.method) {\n return {\n jsonrpc: \"2.0\",\n id: request.id ?? null,\n error: {\n code: MCP_ERROR_CODES.INVALID_REQUEST,\n message: \"Invalid JSON-RPC request\",\n },\n };\n }\n\n // Route to appropriate handler\n switch (request.method) {\n case \"initialize\":\n return this.handleInitialize(request);\n\n case \"initialized\":\n // Client notification that initialization is complete\n this.initialized = true;\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result: {},\n };\n\n case \"tools/list\":\n return this.handleToolsList(request);\n\n case \"tools/call\":\n return this.handleToolsCall(request);\n\n case \"ping\":\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result: {},\n };\n\n default:\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.METHOD_NOT_FOUND,\n message: `Unknown method: ${request.method}`,\n },\n };\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] Handler error:\", message);\n }\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.INTERNAL_ERROR,\n message: `Internal error: ${message}`,\n },\n };\n }\n }\n\n /**\n * Handle initialize request\n */\n private async handleInitialize(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] Initialize request from client\");\n }\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result: {\n protocolVersion: \"2024-11-05\",\n serverInfo: SERVER_INFO,\n capabilities: SERVER_CAPABILITIES,\n },\n };\n }\n\n /**\n * Handle tools/list request\n */\n private async handleToolsList(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n try {\n const result = await this.client.listTools();\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.INTERNAL_ERROR,\n message: `Failed to list tools: ${message}`,\n },\n };\n }\n }\n\n /**\n * Handle tools/call request\n */\n private async handleToolsCall(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n const params = request.params as McpToolCallParams | undefined;\n\n if (!params?.name) {\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.INVALID_PARAMS,\n message: \"Missing tool name in params\",\n },\n };\n }\n\n try {\n const result = await this.client.callTool(params.name, params.arguments ?? {});\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.INTERNAL_ERROR,\n message: `Tool call failed: ${message}`,\n },\n };\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/transport.ts","../src/client.ts","../src/types.ts","../src/version.ts","../src/server.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * MCP Stdio Transport\n * Handles JSON-RPC communication over stdin/stdout\n */\n\nimport { createInterface } from \"readline\";\nimport type { JsonRpcRequest, JsonRpcResponse } from \"./types.js\";\n\nexport type MessageHandler = (request: JsonRpcRequest) => Promise<JsonRpcResponse>;\n\nexport class StdioTransport {\n private handler: MessageHandler | null = null;\n private debug: boolean;\n private pendingRequests: number = 0;\n private stdinClosed: boolean = false;\n\n constructor(debug: boolean = false) {\n this.debug = debug;\n }\n\n /**\n * Set the handler for incoming messages\n */\n setHandler(handler: MessageHandler): void {\n this.handler = handler;\n }\n\n /**\n * Start listening for messages on stdin\n */\n start(): void {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: false,\n });\n\n // Buffer for accumulating partial messages\n let buffer = \"\";\n\n rl.on(\"line\", async (line) => {\n buffer += line;\n\n // Try to parse as JSON\n try {\n const request = JSON.parse(buffer) as JsonRpcRequest;\n buffer = \"\"; // Clear buffer on successful parse\n\n if (this.debug) {\n console.error(\"[MCP DEBUG] Received:\", JSON.stringify(request, null, 2));\n }\n\n if (this.handler) {\n this.pendingRequests++;\n try {\n const response = await this.handler(request);\n this.send(response);\n } finally {\n this.pendingRequests--;\n this.maybeExit();\n }\n }\n } catch {\n // If parse fails, might be partial message - keep buffering\n // Unless it looks like a complete but invalid message\n if (line.trim().endsWith(\"}\")) {\n this.sendError(null, -32700, \"Parse error: Invalid JSON\");\n buffer = \"\";\n }\n }\n });\n\n rl.on(\"close\", () => {\n this.stdinClosed = true;\n if (this.debug) {\n console.error(\"[MCP DEBUG] stdin closed, waiting for pending requests...\");\n }\n this.maybeExit();\n });\n\n // Handle errors gracefully\n process.stdin.on(\"error\", (err) => {\n if (this.debug) {\n console.error(\"[MCP DEBUG] stdin error:\", err.message);\n }\n });\n }\n\n /**\n * Exit if stdin is closed and no pending requests\n */\n private maybeExit(): void {\n if (this.stdinClosed && this.pendingRequests === 0) {\n if (this.debug) {\n console.error(\"[MCP DEBUG] All requests complete, exiting\");\n }\n process.exit(0);\n }\n }\n\n /**\n * Send a JSON-RPC response to stdout\n */\n send(response: JsonRpcResponse): void {\n const message = JSON.stringify(response);\n\n if (this.debug) {\n console.error(\"[MCP DEBUG] Sending:\", JSON.stringify(response, null, 2));\n }\n\n // Write to stdout with newline\n process.stdout.write(message + \"\\n\");\n }\n\n /**\n * Send an error response\n */\n sendError(id: string | number | null, code: number, message: string, data?: unknown): void {\n this.send({\n jsonrpc: \"2.0\",\n id,\n error: {\n code,\n message,\n data,\n },\n });\n }\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * FHIRfly API Client\n * Makes HTTP requests to the FHIRfly MCP endpoint\n */\n\nimport type {\n JsonRpcRequest,\n JsonRpcResponse,\n McpServerConfig,\n McpToolsListResult,\n McpToolCallResult,\n} from \"./types.js\";\n\nexport class FhirflyClient {\n private config: McpServerConfig;\n private nextId = 1;\n\n constructor(config: McpServerConfig) {\n this.config = config;\n }\n\n /**\n * Send a JSON-RPC request to the FHIRfly MCP endpoint\n */\n async request(method: string, params?: Record<string, unknown>): Promise<JsonRpcResponse> {\n const requestBody: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id: this.nextId++,\n method,\n params,\n };\n\n if (this.config.debug) {\n console.error(`[MCP DEBUG] API Request: ${method}`, params);\n }\n\n const timeoutMs = this.config.timeout ?? 30_000;\n\n try {\n const response = await fetch(`${this.config.apiUrl}/mcp`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.config.apiKey,\n \"User-Agent\": \"@fhirfly-io/mcp-server\",\n },\n body: JSON.stringify(requestBody),\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (!response.ok) {\n // Handle HTTP errors\n if (response.status === 401) {\n return {\n jsonrpc: \"2.0\",\n id: requestBody.id,\n error: {\n code: -32001,\n message: \"Authentication failed. Check your FHIRFLY_API_KEY.\",\n },\n };\n }\n\n if (response.status === 429) {\n // Retry once after Retry-After delay (cap at 10s)\n const retryAfter = response.headers.get(\"Retry-After\");\n const delaySec = Math.min(Number(retryAfter) || 1, 10);\n\n if (this.config.debug) {\n console.error(`[MCP DEBUG] Rate limited, retrying after ${delaySec}s`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, delaySec * 1000));\n\n const retryResponse = await fetch(`${this.config.apiUrl}/mcp`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.config.apiKey,\n \"User-Agent\": \"@fhirfly-io/mcp-server\",\n },\n body: JSON.stringify(requestBody),\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (!retryResponse.ok) {\n return {\n jsonrpc: \"2.0\",\n id: requestBody.id,\n error: {\n code: -32002,\n message: \"Rate limit exceeded. Please slow down requests.\",\n },\n };\n }\n\n const retryResult = (await retryResponse.json()) as JsonRpcResponse;\n\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] Retry response:\", JSON.stringify(retryResult, null, 2));\n }\n\n return retryResult;\n }\n\n return {\n jsonrpc: \"2.0\",\n id: requestBody.id,\n error: {\n code: -32000,\n message: `API error: ${response.status} ${response.statusText}`,\n },\n };\n }\n\n const result = (await response.json()) as JsonRpcResponse;\n\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] API Response:\", JSON.stringify(result, null, 2));\n }\n\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] API Error:\", message);\n }\n\n return {\n jsonrpc: \"2.0\",\n id: requestBody.id,\n error: {\n code: -32003,\n message: `Network error: ${message}`,\n },\n };\n }\n }\n\n /**\n * Get list of available tools from FHIRfly\n */\n async listTools(): Promise<McpToolsListResult> {\n const response = await this.request(\"tools/list\", {});\n\n if (response.error) {\n throw new Error(response.error.message);\n }\n\n return response.result as McpToolsListResult;\n }\n\n /**\n * Call a tool on the FHIRfly API\n */\n async callTool(name: string, args: Record<string, unknown>): Promise<McpToolCallResult> {\n const response = await this.request(\"tools/call\", {\n name,\n arguments: args,\n });\n\n if (response.error) {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n error: response.error.message,\n code: response.error.code,\n }),\n },\n ],\n isError: true,\n };\n }\n\n return response.result as McpToolCallResult;\n }\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * MCP Protocol Types\n * Based on Model Context Protocol specification\n */\n\n// JSON-RPC 2.0 Types\nexport interface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id: string | number;\n method: string;\n params?: Record<string, unknown>;\n}\n\nexport interface JsonRpcResponse {\n jsonrpc: \"2.0\";\n id: string | number | null;\n result?: unknown;\n error?: JsonRpcError;\n}\n\nexport interface JsonRpcError {\n code: number;\n message: string;\n data?: unknown;\n}\n\n// MCP Protocol Types\nexport interface McpToolDefinition {\n name: string;\n description: string;\n inputSchema: {\n type: \"object\";\n properties?: Record<string, unknown>;\n required?: string[];\n };\n}\n\nexport interface McpToolsListResult {\n tools: McpToolDefinition[];\n}\n\nexport interface McpToolCallParams {\n name: string;\n arguments: Record<string, unknown>;\n}\n\nexport interface McpToolCallResult {\n content: Array<{\n type: \"text\" | \"image\" | \"resource\";\n text?: string;\n data?: string;\n mimeType?: string;\n }>;\n isError?: boolean;\n}\n\n// Server Configuration\nexport interface McpServerConfig {\n apiKey: string;\n apiUrl: string;\n debug: boolean;\n /** Fetch timeout in milliseconds. Default: 30000 (30 seconds). */\n timeout?: number;\n}\n\n// Standard MCP Error Codes\nexport const MCP_ERROR_CODES = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n} as const;\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\nexport const VERSION = \"0.3.0\";\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * FHIRfly MCP Server\n * Main server class that handles MCP protocol messages\n */\n\nimport { StdioTransport } from \"./transport.js\";\nimport { FhirflyClient } from \"./client.js\";\nimport {\n MCP_ERROR_CODES,\n type JsonRpcRequest,\n type JsonRpcResponse,\n type McpServerConfig,\n type McpToolCallParams,\n} from \"./types.js\";\nimport { VERSION } from \"./version.js\";\n\n// Server capabilities\nconst SERVER_INFO = {\n name: \"fhirfly-mcp-server\",\n version: VERSION,\n};\n\nconst SERVER_CAPABILITIES = {\n tools: {},\n};\n\nexport class McpServer {\n private transport: StdioTransport;\n private client: FhirflyClient;\n private config: McpServerConfig;\n public initialized: boolean = false;\n\n constructor(config: McpServerConfig) {\n this.config = config;\n this.transport = new StdioTransport(config.debug);\n this.client = new FhirflyClient(config);\n }\n\n /**\n * Start the MCP server\n */\n start(): void {\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] Starting FHIRfly MCP Server\");\n console.error(\"[MCP DEBUG] API URL:\", this.config.apiUrl);\n console.error(\"[MCP DEBUG] API Key:\", this.config.apiKey.slice(0, 10) + \"...\");\n }\n\n this.transport.setHandler(this.handleMessage.bind(this));\n this.transport.start();\n }\n\n /**\n * Handle incoming JSON-RPC messages\n */\n private async handleMessage(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n try {\n // Validate JSON-RPC request structure\n if (request.jsonrpc !== \"2.0\" || !request.method) {\n return {\n jsonrpc: \"2.0\",\n id: request.id ?? null,\n error: {\n code: MCP_ERROR_CODES.INVALID_REQUEST,\n message: \"Invalid JSON-RPC request\",\n },\n };\n }\n\n // Route to appropriate handler\n switch (request.method) {\n case \"initialize\":\n return this.handleInitialize(request);\n\n case \"initialized\":\n // Client notification that initialization is complete\n this.initialized = true;\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result: {},\n };\n\n case \"tools/list\":\n return this.handleToolsList(request);\n\n case \"tools/call\":\n return this.handleToolsCall(request);\n\n case \"ping\":\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result: {},\n };\n\n default:\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.METHOD_NOT_FOUND,\n message: `Unknown method: ${request.method}`,\n },\n };\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] Handler error:\", message);\n }\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.INTERNAL_ERROR,\n message: `Internal error: ${message}`,\n },\n };\n }\n }\n\n /**\n * Handle initialize request\n */\n private async handleInitialize(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n if (this.config.debug) {\n console.error(\"[MCP DEBUG] Initialize request from client\");\n }\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result: {\n protocolVersion: \"2024-11-05\",\n serverInfo: SERVER_INFO,\n capabilities: SERVER_CAPABILITIES,\n },\n };\n }\n\n /**\n * Handle tools/list request\n */\n private async handleToolsList(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n try {\n const result = await this.client.listTools();\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.INTERNAL_ERROR,\n message: `Failed to list tools: ${message}`,\n },\n };\n }\n }\n\n /**\n * Handle tools/call request\n */\n private async handleToolsCall(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n const params = request.params as McpToolCallParams | undefined;\n\n if (!params?.name) {\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.INVALID_PARAMS,\n message: \"Missing tool name in params\",\n },\n };\n }\n\n try {\n const result = await this.client.callTool(params.name, params.arguments ?? {});\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: MCP_ERROR_CODES.INTERNAL_ERROR,\n message: `Tool call failed: ${message}`,\n },\n };\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fhirfly-io/mcp-server",
3
- "version": "0.2.3",
3
+ "version": "0.4.0",
4
4
  "description": "FHIRfly MCP server for Claude Desktop - Healthcare reference data via Model Context Protocol",
5
5
  "author": "FHIRfly.io LLC <admin@fhirfly.io>",
6
6
  "license": "MIT",
@@ -8,10 +8,10 @@
8
8
  "homepage": "https://fhirfly.io/docs/mcp",
9
9
  "repository": {
10
10
  "type": "git",
11
- "url": "git+https://gitlab.com/fhirfly-io/fhirfly-mcp-server.git"
11
+ "url": "git+https://github.com/FHIRfly-io/fhirfly-mcp-server.git"
12
12
  },
13
13
  "bugs": {
14
- "url": "https://gitlab.com/fhirfly-io/fhirfly-mcp-server/-/issues"
14
+ "url": "https://github.com/FHIRfly-io/fhirfly-mcp-server/issues"
15
15
  },
16
16
  "mcpName": "io.fhirfly/mcp-server",
17
17
  "keywords": [