@cyanheads/medical-codes-mcp-server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/AGENTS.md +375 -0
  2. package/CLAUDE.md +375 -0
  3. package/Dockerfile +124 -0
  4. package/LICENSE +201 -0
  5. package/README.md +328 -0
  6. package/changelog/0.1.x/0.1.0.md +24 -0
  7. package/changelog/template.md +127 -0
  8. package/data/medical-codes.db +0 -0
  9. package/dist/config/server-config.d.ts +23 -0
  10. package/dist/config/server-config.d.ts.map +1 -0
  11. package/dist/config/server-config.js +51 -0
  12. package/dist/config/server-config.js.map +1 -0
  13. package/dist/index.d.ts +9 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +54 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/mcp-server/tools/definitions/_render.d.ts +26 -0
  18. package/dist/mcp-server/tools/definitions/_render.d.ts.map +1 -0
  19. package/dist/mcp-server/tools/definitions/_render.js +45 -0
  20. package/dist/mcp-server/tools/definitions/_render.js.map +1 -0
  21. package/dist/mcp-server/tools/definitions/browse-hierarchy.tool.d.ts +51 -0
  22. package/dist/mcp-server/tools/definitions/browse-hierarchy.tool.d.ts.map +1 -0
  23. package/dist/mcp-server/tools/definitions/browse-hierarchy.tool.js +131 -0
  24. package/dist/mcp-server/tools/definitions/browse-hierarchy.tool.js.map +1 -0
  25. package/dist/mcp-server/tools/definitions/check-code.tool.d.ts +42 -0
  26. package/dist/mcp-server/tools/definitions/check-code.tool.d.ts.map +1 -0
  27. package/dist/mcp-server/tools/definitions/check-code.tool.js +91 -0
  28. package/dist/mcp-server/tools/definitions/check-code.tool.js.map +1 -0
  29. package/dist/mcp-server/tools/definitions/get-code.tool.d.ts +52 -0
  30. package/dist/mcp-server/tools/definitions/get-code.tool.d.ts.map +1 -0
  31. package/dist/mcp-server/tools/definitions/get-code.tool.js +165 -0
  32. package/dist/mcp-server/tools/definitions/get-code.tool.js.map +1 -0
  33. package/dist/mcp-server/tools/definitions/list-systems.tool.d.ts +21 -0
  34. package/dist/mcp-server/tools/definitions/list-systems.tool.d.ts.map +1 -0
  35. package/dist/mcp-server/tools/definitions/list-systems.tool.js +81 -0
  36. package/dist/mcp-server/tools/definitions/list-systems.tool.js.map +1 -0
  37. package/dist/mcp-server/tools/definitions/map-codes.tool.d.ts +55 -0
  38. package/dist/mcp-server/tools/definitions/map-codes.tool.d.ts.map +1 -0
  39. package/dist/mcp-server/tools/definitions/map-codes.tool.js +132 -0
  40. package/dist/mcp-server/tools/definitions/map-codes.tool.js.map +1 -0
  41. package/dist/mcp-server/tools/definitions/search-codes.tool.d.ts +48 -0
  42. package/dist/mcp-server/tools/definitions/search-codes.tool.d.ts.map +1 -0
  43. package/dist/mcp-server/tools/definitions/search-codes.tool.js +133 -0
  44. package/dist/mcp-server/tools/definitions/search-codes.tool.js.map +1 -0
  45. package/dist/services/code-index/code-index-service.d.ts +185 -0
  46. package/dist/services/code-index/code-index-service.d.ts.map +1 -0
  47. package/dist/services/code-index/code-index-service.js +530 -0
  48. package/dist/services/code-index/code-index-service.js.map +1 -0
  49. package/dist/services/code-index/detect.d.ts +23 -0
  50. package/dist/services/code-index/detect.d.ts.map +1 -0
  51. package/dist/services/code-index/detect.js +58 -0
  52. package/dist/services/code-index/detect.js.map +1 -0
  53. package/dist/services/code-index/schema.d.ts +55 -0
  54. package/dist/services/code-index/schema.d.ts.map +1 -0
  55. package/dist/services/code-index/schema.js +129 -0
  56. package/dist/services/code-index/schema.js.map +1 -0
  57. package/dist/services/code-index/types.d.ts +71 -0
  58. package/dist/services/code-index/types.d.ts.map +1 -0
  59. package/dist/services/code-index/types.js +24 -0
  60. package/dist/services/code-index/types.js.map +1 -0
  61. package/package.json +92 -0
  62. package/server.json +125 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-codes.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/map-codes.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @fileoverview medcode_search_codes — find codes whose official descriptions
3
+ * match a described concept, via full-text search over the bundled index.
4
+ * Filter by system, billable status, and chapter. The reverse of
5
+ * medcode_get_code: you have a clinical description and need the code.
6
+ * @module mcp-server/tools/definitions/search-codes.tool
7
+ */
8
+ import { z } from '@cyanheads/mcp-ts-core';
9
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
10
+ export declare const searchCodesTool: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
11
+ query: z.ZodString;
12
+ system: z.ZodOptional<z.ZodEnum<{
13
+ ICD10CM: "ICD10CM";
14
+ ICD10PCS: "ICD10PCS";
15
+ HCPCS: "HCPCS";
16
+ RXNORM: "RXNORM";
17
+ }>>;
18
+ billableOnly: z.ZodDefault<z.ZodBoolean>;
19
+ chapter: z.ZodOptional<z.ZodString>;
20
+ limit: z.ZodOptional<z.ZodNumber>;
21
+ }, z.core.$strip>, z.ZodObject<{
22
+ codes: z.ZodArray<z.ZodObject<{
23
+ system: z.ZodString;
24
+ code: z.ZodString;
25
+ description: z.ZodNullable<z.ZodString>;
26
+ shortDescription: z.ZodNullable<z.ZodString>;
27
+ billable: z.ZodBoolean;
28
+ header: z.ZodBoolean;
29
+ chapter: z.ZodNullable<z.ZodString>;
30
+ }, z.core.$strip>>;
31
+ }, z.core.$strip>, readonly [{
32
+ readonly reason: "no_match";
33
+ readonly code: JsonRpcErrorCode.NotFound;
34
+ readonly when: "The full-text query returned zero rows.";
35
+ readonly recovery: "Broaden the terms, drop the system or chapter filter, or try clinical synonyms.";
36
+ }], {
37
+ readonly effectiveQuery: z.ZodString;
38
+ readonly appliedFilters: z.ZodObject<{
39
+ system: z.ZodNullable<z.ZodString>;
40
+ billableOnly: z.ZodBoolean;
41
+ chapter: z.ZodNullable<z.ZodString>;
42
+ }, z.core.$strip>;
43
+ readonly truncated: z.ZodBoolean;
44
+ readonly shown: z.ZodNumber;
45
+ readonly cap: z.ZodNumber;
46
+ readonly notice: z.ZodOptional<z.ZodString>;
47
+ }>;
48
+ //# sourceMappingURL=search-codes.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-codes.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-codes.tool.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AASjE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyI1B,CAAC"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * @fileoverview medcode_search_codes — find codes whose official descriptions
3
+ * match a described concept, via full-text search over the bundled index.
4
+ * Filter by system, billable status, and chapter. The reverse of
5
+ * medcode_get_code: you have a clinical description and need the code.
6
+ * @module mcp-server/tools/definitions/search-codes.tool
7
+ */
8
+ import { tool, z } from '@cyanheads/mcp-ts-core';
9
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
10
+ import { getServerConfig } from '../../../config/server-config.js';
11
+ import { getCodeIndexService } from '../../../services/code-index/code-index-service.js';
12
+ import { SYSTEM_IDS } from '../../../services/code-index/types.js';
13
+ import { renderCodeLine } from './_render.js';
14
+ const SOURCE_URL = 'https://github.com/cyanheads/medical-codes-mcp-server/blob/main/src/mcp-server/tools/definitions/search-codes.tool.ts';
15
+ export const searchCodesTool = tool('medcode_search_codes', {
16
+ title: 'medical-codes-mcp-server',
17
+ description: 'Find US medical codes whose official descriptions match a described concept, via full-text search over the bundled index. Every search term must appear (prefix-matched), so "diabetic neuropathy" returns codes mentioning both. Filter by `system` (ICD10CM/ICD10PCS/HCPCS/RXNORM), `billableOnly` to exclude headers/categories, and `chapter`. Use when you have a clinical description and need the code — the reverse of medcode_get_code. Results echo the resolved system per row for chaining, and disclose truncation when the result hits the cap.',
18
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
19
+ sourceUrl: SOURCE_URL,
20
+ input: z.object({
21
+ query: z
22
+ .string()
23
+ .min(1)
24
+ .describe('Clinical description to match, e.g. "type 2 diabetes with neuropathy".'),
25
+ system: z
26
+ .enum(SYSTEM_IDS)
27
+ .optional()
28
+ .describe('Restrict results to one system. Omit to search all bundled systems.'),
29
+ billableOnly: z
30
+ .boolean()
31
+ .default(false)
32
+ .describe('When true, return only billable leaf codes (exclude headers/categories).'),
33
+ chapter: z
34
+ .string()
35
+ .optional()
36
+ .describe("Restrict to a chapter/range bucket (the value from a code's `chapter` field)."),
37
+ limit: z
38
+ .number()
39
+ .int()
40
+ .min(1)
41
+ .max(200)
42
+ .optional()
43
+ .describe("Max codes to return. Defaults to the server's MEDCODE_MAX_RESULTS (50), ceiling 200."),
44
+ }),
45
+ output: z.object({
46
+ codes: z
47
+ .array(z
48
+ .object({
49
+ system: z.string().describe('The system the code belongs to, echoed for chaining.'),
50
+ code: z.string().describe('The code in display form (ICD-10-CM carries the dot).'),
51
+ description: z
52
+ .string()
53
+ .nullable()
54
+ .describe('Official long description (falls back to short when no long form exists).'),
55
+ shortDescription: z
56
+ .string()
57
+ .nullable()
58
+ .describe('Official short description, or null when none is on record.'),
59
+ billable: z.boolean().describe('True when the code is a billable leaf.'),
60
+ header: z.boolean().describe('True when the code is a non-billable category/header.'),
61
+ chapter: z.string().nullable().describe('Chapter/range bucket, or null.'),
62
+ })
63
+ .describe('A code matching the search query.'))
64
+ .describe('Matching codes, ranked by full-text relevance.'),
65
+ }),
66
+ enrichment: {
67
+ effectiveQuery: z.string().describe('The query as the server parsed it for matching.'),
68
+ appliedFilters: z
69
+ .object({
70
+ system: z.string().nullable().describe('System filter applied, or null.'),
71
+ billableOnly: z.boolean().describe('Whether the billable-only filter was applied.'),
72
+ chapter: z.string().nullable().describe('Chapter filter applied, or null.'),
73
+ })
74
+ .describe('Filters the server applied to the search.'),
75
+ truncated: z.boolean().describe('True when results were capped at the limit.'),
76
+ shown: z.number().describe('Number of codes returned.'),
77
+ cap: z.number().describe('The limit that was applied.'),
78
+ notice: z
79
+ .string()
80
+ .optional()
81
+ .describe('Guidance when nothing matched — echoes the query and suggests how to broaden.'),
82
+ },
83
+ enrichmentTrailer: {
84
+ appliedFilters: {
85
+ render: (f) => `**Filters:** system=${f.system ?? 'any'}, billableOnly=${f.billableOnly}, chapter=${f.chapter ?? 'any'}`,
86
+ },
87
+ },
88
+ errors: [
89
+ {
90
+ reason: 'no_match',
91
+ code: JsonRpcErrorCode.NotFound,
92
+ when: 'The full-text query returned zero rows.',
93
+ recovery: 'Broaden the terms, drop the system or chapter filter, or try clinical synonyms.',
94
+ },
95
+ ],
96
+ handler(input, ctx) {
97
+ const cap = input.limit ?? getServerConfig().maxResults;
98
+ const codes = getCodeIndexService().searchFts(input.query, {
99
+ ...(input.system && { system: input.system }),
100
+ billableOnly: input.billableOnly,
101
+ ...(input.chapter && { chapter: input.chapter }),
102
+ limit: cap,
103
+ });
104
+ ctx.enrich({
105
+ effectiveQuery: input.query.trim(),
106
+ appliedFilters: {
107
+ system: input.system ?? null,
108
+ billableOnly: input.billableOnly,
109
+ chapter: input.chapter ?? null,
110
+ },
111
+ });
112
+ const wasTruncated = codes.length >= cap;
113
+ ctx.enrich({ truncated: wasTruncated, shown: codes.length, cap });
114
+ if (codes.length === 0) {
115
+ ctx.enrich.notice(`No codes matched "${input.query.trim()}"${input.system ? ` in ${input.system}` : ''}. ` +
116
+ 'Broaden the terms, drop the filters, or try clinical synonyms.');
117
+ ctx.log.info('Search returned no matches', { query: input.query });
118
+ return { codes };
119
+ }
120
+ ctx.log.info('Search completed', { query: input.query, count: codes.length });
121
+ return { codes };
122
+ },
123
+ format: (result) => {
124
+ if (result.codes.length === 0) {
125
+ return [{ type: 'text', text: 'No matching codes.' }];
126
+ }
127
+ const lines = [`## ${result.codes.length} matching code(s)`, ''];
128
+ for (const c of result.codes)
129
+ lines.push(renderCodeLine(c));
130
+ return [{ type: 'text', text: lines.join('\n') }];
131
+ },
132
+ });
133
+ //# sourceMappingURL=search-codes.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-codes.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-codes.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * @fileoverview The code-index service — the single source of truth for the
3
+ * server. Opens the bundled SQLite + FTS5 database read-only at startup and
4
+ * exposes typed query methods the six tools compose: decode, search, validate,
5
+ * crosswalk, and hierarchy-browse. No network, no tenant state — the corpus is
6
+ * global, read-only, and built at package-build time.
7
+ * @module services/code-index/code-index-service
8
+ */
9
+ import { type BuildMetaRow, type CheckStatus, type CodeRow, type MapDirection, type PcsAxisRow, type SystemId } from './types.js';
10
+ /** A decoded code with display form and derived flags, the shape tools return. */
11
+ export interface DecodedCode {
12
+ billable: boolean;
13
+ chapter: string | null;
14
+ code: string;
15
+ description: string | null;
16
+ header: boolean;
17
+ shortDescription: string | null;
18
+ system: SystemId;
19
+ }
20
+ /** A decoded code plus its immediate hierarchy neighbours. */
21
+ export interface DecodedCodeWithHierarchy extends DecodedCode {
22
+ children: DecodedCode[];
23
+ parent: string | null;
24
+ }
25
+ /** Result of a validity check — discriminated status plus optional why-not. */
26
+ export interface CheckResult {
27
+ code: string;
28
+ status: CheckStatus;
29
+ system: SystemId;
30
+ whyNot?: string;
31
+ }
32
+ /** One crosswalk hit with the edge/provenance that produced it. */
33
+ export interface MapHit {
34
+ description?: string;
35
+ /** The system or relationship that answered (e.g. 'ICD10CM', 'has_ingredient'). */
36
+ source: string;
37
+ system: SystemId | null;
38
+ value: string;
39
+ }
40
+ /** A FTS search hit. */
41
+ export interface SearchHit extends DecodedCode {
42
+ }
43
+ /**
44
+ * Read-only handle over the bundled medical-codes index. Constructed once in
45
+ * `setup()`. All query methods are synchronous SQLite reads — fast enough to
46
+ * call inline from handlers.
47
+ */
48
+ export declare class CodeIndexService {
49
+ private readonly db;
50
+ readonly dbPath: string;
51
+ private constructor();
52
+ /**
53
+ * Open the bundled DB read-only and assert it is a populated build. Fails fast
54
+ * (throws) on a missing file, an unreadable DB, or an empty `build_meta` — a
55
+ * broken bundle should crash loudly at startup, not serve empty results.
56
+ */
57
+ static open(): Promise<CodeIndexService>;
58
+ /** Map a raw `codes` row (snake_case, 0/1 ints) to a typed CodeRow. */
59
+ private static toCodeRow;
60
+ /** Project a CodeRow into the display shape tools return. */
61
+ private static decode;
62
+ /** Lexically-plausible systems for a raw code (no DB hit). */
63
+ detectSystem(rawCode: string): SystemId[];
64
+ /** Fetch the raw row for a code in a specific system, or null. */
65
+ private getRow;
66
+ /**
67
+ * Find which systems actually contain a code string. Narrows by lexical shape
68
+ * first (cheap), then confirms membership in the DB. The lexical candidates
69
+ * may overlap (a letter+4-digit code is shaped like both ICD-10-CM and HCPCS);
70
+ * DB membership is the real disambiguator — a code present in exactly one
71
+ * system is unambiguous regardless of shape overlap.
72
+ */
73
+ private resolveSystems;
74
+ /**
75
+ * Decode one code. Returns `{ kind: 'found' }` with the row, `'ambiguous'`
76
+ * with the colliding systems, or `'not_found'`. When `system` is given it is
77
+ * authoritative; otherwise membership across detected systems decides.
78
+ */
79
+ getByCode(rawCode: string, system?: SystemId): {
80
+ kind: 'found';
81
+ row: CodeRow;
82
+ } | {
83
+ kind: 'ambiguous';
84
+ systems: SystemId[];
85
+ } | {
86
+ kind: 'not_found';
87
+ };
88
+ /** Immediate children of a code within its system (prefix hierarchy). */
89
+ childrenOf(system: SystemId, parentCode: string): DecodedCode[];
90
+ /** Decode with parent + immediate children attached. */
91
+ getByCodeWithHierarchy(row: CodeRow): DecodedCodeWithHierarchy;
92
+ /**
93
+ * Full-text search over code descriptions. Translates the user's text into a
94
+ * safe FTS5 MATCH expression (every token required, prefix-matched), applies
95
+ * the system/billable/chapter filters, and caps at `limit`.
96
+ */
97
+ searchFts(queryText: string, filters: {
98
+ system?: SystemId;
99
+ billableOnly?: boolean;
100
+ chapter?: string;
101
+ limit: number;
102
+ }): SearchHit[];
103
+ /**
104
+ * Validate a code's existence, currency, and billability. Existence vs.
105
+ * validity are split: a non-billable or terminated code is a *successful*
106
+ * status with a why-not, NOT a failure. Only a code absent from every detected
107
+ * system is `unknown`.
108
+ */
109
+ checkCode(rawCode: string, system?: SystemId): {
110
+ kind: 'resolved';
111
+ result: CheckResult;
112
+ } | {
113
+ kind: 'ambiguous';
114
+ systems: SystemId[];
115
+ };
116
+ /**
117
+ * Crosswalk a value across systems or within a hierarchy. v1 supports the
118
+ * hierarchy directions (`parents`/`children`); the drug directions resolve
119
+ * against the RxNorm tables, which are empty until phase 2 — the tool guards
120
+ * for that before calling.
121
+ */
122
+ mapCode(from: string, direction: MapDirection, system?: SystemId): {
123
+ kind: 'ok';
124
+ hits: MapHit[];
125
+ resolvedSystem: SystemId | null;
126
+ } | {
127
+ kind: 'ambiguous';
128
+ systems: SystemId[];
129
+ } | {
130
+ kind: 'source_not_found';
131
+ };
132
+ /** Whether the RxNorm tables carry any rows (i.e. phase 2 is bundled). */
133
+ hasRxNorm(): boolean;
134
+ /** RxNorm crosswalk resolution. */
135
+ private mapDrug;
136
+ /** True when `direction` needs the RxNorm tables. */
137
+ static isDrugDirection(direction: MapDirection): boolean;
138
+ /**
139
+ * Browse a system's hierarchy. With no `node`: top-level entries (3-char
140
+ * ICD-10-CM categories grouped by chapter letter, HCPCS range buckets, PCS
141
+ * section axis values). With a `node`: that node's children — for ICD-10-PCS,
142
+ * the valid next-position axis values rather than prefix children.
143
+ */
144
+ browse(system: SystemId, node: string | undefined, limit: number): {
145
+ kind: 'codes';
146
+ codes: DecodedCode[];
147
+ } | {
148
+ kind: 'axes';
149
+ axes: PcsAxisRow[];
150
+ } | {
151
+ kind: 'unknown_node';
152
+ };
153
+ /**
154
+ * PCS axis browse. Only the position-1 Section axis is baked into `pcs_axes`
155
+ * (positions 2-7 are context-dependent on the full preceding axis path and a
156
+ * flat table can't represent them without storing wrong meanings — see
157
+ * `parseIcd10pcsAxes`). So the top level (no node) returns the 17 Sections;
158
+ * a partial code asks for a deeper position, which has no rows — the caller
159
+ * gets an explicit notice (handled in the tool), not silent-empty or wrong data.
160
+ */
161
+ private browsePcs;
162
+ /** Provenance for every bundled system. */
163
+ listSystems(): BuildMetaRow[];
164
+ /** Expose the decode projection for tools that already hold a CodeRow. */
165
+ static project(row: CodeRow): DecodedCode;
166
+ }
167
+ /**
168
+ * Translate free user text into a safe FTS5 MATCH expression. Strips FTS5
169
+ * operator characters, splits into tokens, and ANDs prefix-matched tokens so
170
+ * "diabetic neuropathy" requires both stems. Returns null when nothing usable
171
+ * remains (caller treats that as an empty result, not an error).
172
+ */
173
+ export declare function toFtsMatch(text: string): string | null;
174
+ /**
175
+ * Escape SQL LIKE wildcards (`%`, `_`) and the escape char (`\`) in a
176
+ * user-supplied substring so it matches literally inside a `LIKE '%…%'` pattern.
177
+ * Pair with `ESCAPE '\'` in the query. Without this a value like `%` would match
178
+ * every row; `_` would match any single character.
179
+ */
180
+ export declare function escapeLike(value: string): string;
181
+ /** Open the bundled index and cache the handle. Called once from `setup()`. */
182
+ export declare function initCodeIndexService(): Promise<void>;
183
+ /** Return the initialized service, throwing if `setup()` hasn't run. */
184
+ export declare function getCodeIndexService(): CodeIndexService;
185
+ //# sourceMappingURL=code-index-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-index-service.d.ts","sourceRoot":"","sources":["../../../src/services/code-index/code-index-service.ts"],"names":[],"mappings":"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"}