tebra-mcp-server 0.1.0 → 0.2.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 (103) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +267 -35
  3. package/dist/config.d.ts +12 -0
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +12 -0
  6. package/dist/config.js.map +1 -1
  7. package/dist/fhir-client.d.ts +22 -0
  8. package/dist/fhir-client.d.ts.map +1 -0
  9. package/dist/fhir-client.js +86 -0
  10. package/dist/fhir-client.js.map +1 -0
  11. package/dist/index.d.ts +4 -0
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +98 -6
  14. package/dist/index.js.map +1 -1
  15. package/dist/integrations/epic-notes-integration.d.ts +145 -0
  16. package/dist/integrations/epic-notes-integration.d.ts.map +1 -0
  17. package/dist/integrations/epic-notes-integration.js +227 -0
  18. package/dist/integrations/epic-notes-integration.js.map +1 -0
  19. package/dist/integrations/fal-integration.d.ts +109 -0
  20. package/dist/integrations/fal-integration.d.ts.map +1 -0
  21. package/dist/integrations/fal-integration.js +192 -0
  22. package/dist/integrations/fal-integration.js.map +1 -0
  23. package/dist/soap-client.d.ts +1 -0
  24. package/dist/soap-client.d.ts.map +1 -1
  25. package/dist/soap-client.js +68 -1
  26. package/dist/soap-client.js.map +1 -1
  27. package/dist/tools/appointment-crud.d.ts +117 -0
  28. package/dist/tools/appointment-crud.d.ts.map +1 -0
  29. package/dist/tools/appointment-crud.js +218 -0
  30. package/dist/tools/appointment-crud.js.map +1 -0
  31. package/dist/tools/appointment-detail.d.ts +25 -0
  32. package/dist/tools/appointment-detail.d.ts.map +1 -0
  33. package/dist/tools/appointment-detail.js +85 -0
  34. package/dist/tools/appointment-detail.js.map +1 -0
  35. package/dist/tools/appointment-reasons.d.ts +20 -0
  36. package/dist/tools/appointment-reasons.d.ts.map +1 -0
  37. package/dist/tools/appointment-reasons.js +48 -0
  38. package/dist/tools/appointment-reasons.js.map +1 -0
  39. package/dist/tools/appointments.d.ts +46 -0
  40. package/dist/tools/appointments.d.ts.map +1 -1
  41. package/dist/tools/appointments.js +71 -4
  42. package/dist/tools/appointments.js.map +1 -1
  43. package/dist/tools/authorizations.js +5 -5
  44. package/dist/tools/bulk-patients.d.ts +33 -0
  45. package/dist/tools/bulk-patients.d.ts.map +1 -0
  46. package/dist/tools/bulk-patients.js +81 -0
  47. package/dist/tools/bulk-patients.js.map +1 -0
  48. package/dist/tools/charges.d.ts +61 -0
  49. package/dist/tools/charges.d.ts.map +1 -1
  50. package/dist/tools/charges.js +98 -14
  51. package/dist/tools/charges.js.map +1 -1
  52. package/dist/tools/documents.d.ts +71 -0
  53. package/dist/tools/documents.d.ts.map +1 -0
  54. package/dist/tools/documents.js +139 -0
  55. package/dist/tools/documents.js.map +1 -0
  56. package/dist/tools/eligibility.js +5 -5
  57. package/dist/tools/encounter-status.d.ts +34 -0
  58. package/dist/tools/encounter-status.d.ts.map +1 -0
  59. package/dist/tools/encounter-status.js +73 -0
  60. package/dist/tools/encounter-status.js.map +1 -0
  61. package/dist/tools/encounters.js +29 -29
  62. package/dist/tools/external-ids.d.ts +66 -0
  63. package/dist/tools/external-ids.d.ts.map +1 -0
  64. package/dist/tools/external-ids.js +140 -0
  65. package/dist/tools/external-ids.js.map +1 -0
  66. package/dist/tools/fhir-clinical.d.ts +187 -0
  67. package/dist/tools/fhir-clinical.d.ts.map +1 -0
  68. package/dist/tools/fhir-clinical.js +597 -0
  69. package/dist/tools/fhir-clinical.js.map +1 -0
  70. package/dist/tools/patient-crud.d.ts +190 -0
  71. package/dist/tools/patient-crud.d.ts.map +1 -0
  72. package/dist/tools/patient-crud.js +297 -0
  73. package/dist/tools/patient-crud.js.map +1 -0
  74. package/dist/tools/patients.d.ts +87 -1
  75. package/dist/tools/patients.d.ts.map +1 -1
  76. package/dist/tools/patients.js +108 -8
  77. package/dist/tools/patients.js.map +1 -1
  78. package/dist/tools/payments.d.ts +105 -0
  79. package/dist/tools/payments.d.ts.map +1 -0
  80. package/dist/tools/payments.js +206 -0
  81. package/dist/tools/payments.js.map +1 -0
  82. package/dist/tools/practices.d.ts +20 -0
  83. package/dist/tools/practices.d.ts.map +1 -0
  84. package/dist/tools/practices.js +54 -0
  85. package/dist/tools/practices.js.map +1 -0
  86. package/dist/tools/procedure-codes.js +5 -5
  87. package/dist/tools/providers.d.ts +25 -0
  88. package/dist/tools/providers.d.ts.map +1 -0
  89. package/dist/tools/providers.js +62 -0
  90. package/dist/tools/providers.js.map +1 -0
  91. package/dist/tools/service-locations.d.ts +25 -0
  92. package/dist/tools/service-locations.d.ts.map +1 -0
  93. package/dist/tools/service-locations.js +62 -0
  94. package/dist/tools/service-locations.js.map +1 -0
  95. package/dist/tools/system.d.ts +81 -0
  96. package/dist/tools/system.d.ts.map +1 -0
  97. package/dist/tools/system.js +184 -0
  98. package/dist/tools/system.js.map +1 -0
  99. package/dist/tools/transactions.d.ts +61 -0
  100. package/dist/tools/transactions.d.ts.map +1 -0
  101. package/dist/tools/transactions.js +122 -0
  102. package/dist/tools/transactions.js.map +1 -0
  103. package/package.json +60 -54
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Tebra MCP tools: Bulk patient retrieval with pagination.
3
+ */
4
+ import type { TebraConfig } from '../config.js';
5
+ export declare const bulkPatientTools: {
6
+ name: string;
7
+ description: string;
8
+ inputSchema: {
9
+ type: "object";
10
+ properties: {
11
+ batchSize: {
12
+ type: string;
13
+ description: string;
14
+ };
15
+ startKey: {
16
+ type: string;
17
+ description: string;
18
+ };
19
+ isActive: {
20
+ type: string;
21
+ description: string;
22
+ };
23
+ };
24
+ required: never[];
25
+ };
26
+ }[];
27
+ export declare function handleBulkPatientTool(name: string, args: Record<string, unknown>, config: TebraConfig): Promise<{
28
+ content: Array<{
29
+ type: string;
30
+ text: string;
31
+ }>;
32
+ }>;
33
+ //# sourceMappingURL=bulk-patients.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk-patients.d.ts","sourceRoot":"","sources":["../../src/tools/bulk-patients.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAWhD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;GAwB5B,CAAC;AAIF,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAoD7D"}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ /**
3
+ * Tebra MCP tools: Bulk patient retrieval with pagination.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.bulkPatientTools = void 0;
7
+ exports.handleBulkPatientTool = handleBulkPatientTool;
8
+ const soap_client_js_1 = require("../soap-client.js");
9
+ // ─── Tool Definitions ───────────────────────────────────────────
10
+ exports.bulkPatientTools = [
11
+ {
12
+ name: 'tebra_get_all_patients',
13
+ description: 'Get all patients in bulk with pagination. Returns a page of patients and a continuation key for the next page. Use startKey from the previous response to get the next batch.',
14
+ inputSchema: {
15
+ type: 'object',
16
+ properties: {
17
+ batchSize: {
18
+ type: 'number',
19
+ description: 'Number of patients per page (default 200, max 1000)',
20
+ },
21
+ startKey: {
22
+ type: 'string',
23
+ description: 'Continuation key from previous response (omit for first page)',
24
+ },
25
+ isActive: {
26
+ type: 'boolean',
27
+ description: 'Optional filter: true for active patients only, false for inactive only',
28
+ },
29
+ },
30
+ required: [],
31
+ },
32
+ },
33
+ ];
34
+ // ─── Tool Handler ───────────────────────────────────────────────
35
+ async function handleBulkPatientTool(name, args, config) {
36
+ if (name !== 'tebra_get_all_patients') {
37
+ return { content: [{ type: 'text', text: `Unknown bulk patient tool: ${name}` }] };
38
+ }
39
+ const batchSize = args.batchSize != null ? Number(args.batchSize) : 200;
40
+ const startKey = args.startKey ? String(args.startKey) : undefined;
41
+ const isActive = args.isActive != null ? args.isActive : undefined;
42
+ const fieldsXml = [
43
+ `<kar:BatchSize>${batchSize}</kar:BatchSize>`,
44
+ startKey ? `<kar:StartKey>${(0, soap_client_js_1.escapeXml)(startKey)}</kar:StartKey>` : '',
45
+ isActive != null ? `<kar:Active>${isActive ? 'true' : 'false'}</kar:Active>` : '',
46
+ ]
47
+ .filter(Boolean)
48
+ .join('\n ');
49
+ const bodyXml = `
50
+ <kar:request>
51
+ <kar:Fields>
52
+ ${fieldsXml}
53
+ </kar:Fields>
54
+ </kar:request>`;
55
+ const xml = await (0, soap_client_js_1.soapRequest)(config, 'GetAllPatients', bodyXml);
56
+ const blocks = (0, soap_client_js_1.extractAllTags)(xml, 'PatientData');
57
+ const nextStartKey = (0, soap_client_js_1.extractTag)(xml, 'NextStartKey') || null;
58
+ const patients = blocks.map((block) => ({
59
+ patientId: (0, soap_client_js_1.extractTag)(block, 'PatientID') || (0, soap_client_js_1.extractTag)(block, 'ID'),
60
+ firstName: (0, soap_client_js_1.extractTag)(block, 'FirstName'),
61
+ lastName: (0, soap_client_js_1.extractTag)(block, 'LastName'),
62
+ dateOfBirth: (0, soap_client_js_1.extractTag)(block, 'DateofBirth') || (0, soap_client_js_1.extractTag)(block, 'DOB'),
63
+ mrn: (0, soap_client_js_1.extractTag)(block, 'MRN'),
64
+ active: (0, soap_client_js_1.extractTag)(block, 'Active'),
65
+ insurances: (0, soap_client_js_1.extractAllTags)(block, 'InsurancePolicyData').map((ins) => ({
66
+ payerName: (0, soap_client_js_1.extractTag)(ins, 'PayerName') || (0, soap_client_js_1.extractTag)(ins, 'CompanyName'),
67
+ memberId: (0, soap_client_js_1.extractTag)(ins, 'MemberNumber') || (0, soap_client_js_1.extractTag)(ins, 'PolicyNumber'),
68
+ isPrimary: ((0, soap_client_js_1.extractNumber)(ins, 'SequenceNumber') || 1) === 1,
69
+ })),
70
+ }));
71
+ const result = {
72
+ patients,
73
+ count: patients.length,
74
+ nextStartKey,
75
+ hasMore: nextStartKey !== null && nextStartKey !== '',
76
+ };
77
+ return {
78
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
79
+ };
80
+ }
81
+ //# sourceMappingURL=bulk-patients.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk-patients.js","sourceRoot":"","sources":["../../src/tools/bulk-patients.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,67 @@ export declare const chargeTools: {
20
20
  type: string;
21
21
  description: string;
22
22
  };
23
+ fromPostingDate: {
24
+ type: string;
25
+ description: string;
26
+ };
27
+ toPostingDate: {
28
+ type: string;
29
+ description: string;
30
+ };
31
+ batchNumber: {
32
+ type: string;
33
+ description: string;
34
+ };
35
+ renderingProviderName: {
36
+ type: string;
37
+ description: string;
38
+ };
39
+ procedureCode: {
40
+ type: string;
41
+ description: string;
42
+ };
43
+ diagnosisCode: {
44
+ type: string;
45
+ description: string;
46
+ };
47
+ status: {
48
+ type: string;
49
+ description: string;
50
+ };
51
+ billedTo: {
52
+ type: string;
53
+ description: string;
54
+ };
55
+ includeUnapprovedCharges: {
56
+ type: string;
57
+ description: string;
58
+ };
59
+ encounterStatus: {
60
+ type: string;
61
+ enum: string[];
62
+ description: string;
63
+ };
64
+ casePayerScenario: {
65
+ type: string;
66
+ description: string;
67
+ };
68
+ fromLastModifiedDate: {
69
+ type: string;
70
+ description: string;
71
+ };
72
+ toLastModifiedDate: {
73
+ type: string;
74
+ description: string;
75
+ };
76
+ fromCreatedDate: {
77
+ type: string;
78
+ description: string;
79
+ };
80
+ toCreatedDate: {
81
+ type: string;
82
+ description: string;
83
+ };
23
84
  };
24
85
  required: never[];
25
86
  };
@@ -1 +1 @@
1
- {"version":3,"file":"charges.d.ts","sourceRoot":"","sources":["../../src/tools/charges.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAKhD,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;GAwBvB,CAAC;AAIF,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAiD7D"}
1
+ {"version":3,"file":"charges.d.ts","sourceRoot":"","sources":["../../src/tools/charges.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAKhD,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqFvB,CAAC;AAIF,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA0E7D"}
@@ -10,21 +10,82 @@ const soap_client_js_1 = require("../soap-client.js");
10
10
  exports.chargeTools = [
11
11
  {
12
12
  name: 'tebra_get_charges',
13
- description: 'Get charges from Tebra with optional date range and patient filters. Returns charge details with payment status, amounts, and balances.',
13
+ description: 'Get charges from Tebra with flexible filters: date range, patient, provider, procedure/diagnosis codes, billing status, encounter status, and more. Returns charge details with payment status, amounts, and balances.',
14
14
  inputSchema: {
15
15
  type: 'object',
16
16
  properties: {
17
17
  fromDate: {
18
18
  type: 'string',
19
- description: 'Start date filter (ISO 8601)',
19
+ description: 'Service start date filter (ISO 8601)',
20
20
  },
21
21
  toDate: {
22
22
  type: 'string',
23
- description: 'End date filter (ISO 8601)',
23
+ description: 'Service end date filter (ISO 8601)',
24
24
  },
25
25
  patientId: {
26
26
  type: 'string',
27
- description: 'Optional Tebra patient ID to filter by',
27
+ description: 'Tebra patient ID to filter by',
28
+ },
29
+ fromPostingDate: {
30
+ type: 'string',
31
+ description: 'Posting date range start (YYYY-MM-DD)',
32
+ },
33
+ toPostingDate: {
34
+ type: 'string',
35
+ description: 'Posting date range end (YYYY-MM-DD)',
36
+ },
37
+ batchNumber: {
38
+ type: 'string',
39
+ description: 'Filter by batch number',
40
+ },
41
+ renderingProviderName: {
42
+ type: 'string',
43
+ description: 'Rendering provider full name',
44
+ },
45
+ procedureCode: {
46
+ type: 'string',
47
+ description: 'Filter by CPT procedure code',
48
+ },
49
+ diagnosisCode: {
50
+ type: 'string',
51
+ description: 'Filter by ICD diagnosis code',
52
+ },
53
+ status: {
54
+ type: 'string',
55
+ description: 'Charge status filter',
56
+ },
57
+ billedTo: {
58
+ type: 'string',
59
+ description: 'Billed-to entity filter',
60
+ },
61
+ includeUnapprovedCharges: {
62
+ type: 'boolean',
63
+ description: 'Include unapproved charges (default false)',
64
+ },
65
+ encounterStatus: {
66
+ type: 'string',
67
+ enum: ['Draft', 'Review', 'Approved', 'Rejected'],
68
+ description: 'Encounter status filter',
69
+ },
70
+ casePayerScenario: {
71
+ type: 'string',
72
+ description: 'Case payer scenario filter',
73
+ },
74
+ fromLastModifiedDate: {
75
+ type: 'string',
76
+ description: 'Modified date range start (YYYY-MM-DD)',
77
+ },
78
+ toLastModifiedDate: {
79
+ type: 'string',
80
+ description: 'Modified date range end (YYYY-MM-DD)',
81
+ },
82
+ fromCreatedDate: {
83
+ type: 'string',
84
+ description: 'Created date range start (YYYY-MM-DD)',
85
+ },
86
+ toCreatedDate: {
87
+ type: 'string',
88
+ description: 'Created date range end (YYYY-MM-DD)',
28
89
  },
29
90
  },
30
91
  required: [],
@@ -36,16 +97,39 @@ async function handleChargeTool(name, args, config) {
36
97
  if (name !== 'tebra_get_charges') {
37
98
  return { content: [{ type: 'text', text: `Unknown charge tool: ${name}` }] };
38
99
  }
39
- const fromDate = args.fromDate ? String(args.fromDate) : undefined;
40
- const toDate = args.toDate ? String(args.toDate) : undefined;
41
- const patientId = args.patientId ? String(args.patientId) : undefined;
42
- const fieldsXml = [
43
- fromDate ? `<kar:FromServiceDate>${(0, soap_client_js_1.escapeXml)(fromDate)}</kar:FromServiceDate>` : '',
44
- toDate ? `<kar:ToServiceDate>${(0, soap_client_js_1.escapeXml)(toDate)}</kar:ToServiceDate>` : '',
45
- patientId ? `<kar:PatientID>${(0, soap_client_js_1.escapeXml)(patientId)}</kar:PatientID>` : '',
46
- ]
47
- .filter(Boolean)
48
- .join('\n ');
100
+ // Map of arg names to SOAP filter field names
101
+ const stringFilterMap = [
102
+ ['fromDate', 'FromServiceDate'],
103
+ ['toDate', 'ToServiceDate'],
104
+ ['patientId', 'PatientID'],
105
+ ['fromPostingDate', 'FromPostingDate'],
106
+ ['toPostingDate', 'ToPostingDate'],
107
+ ['batchNumber', 'BatchNumber'],
108
+ ['renderingProviderName', 'RenderingProviderFullName'],
109
+ ['procedureCode', 'ProcedureCode'],
110
+ ['diagnosisCode', 'DiagnosisCode'],
111
+ ['status', 'Status'],
112
+ ['billedTo', 'BilledTo'],
113
+ ['encounterStatus', 'EncounterStatus'],
114
+ ['casePayerScenario', 'CasePayerScenario'],
115
+ ['fromLastModifiedDate', 'FromLastModifiedDate'],
116
+ ['toLastModifiedDate', 'ToLastModifiedDate'],
117
+ ['fromCreatedDate', 'FromCreatedDate'],
118
+ ['toCreatedDate', 'ToCreatedDate'],
119
+ ];
120
+ const filterFields = [];
121
+ for (const [argKey, soapField] of stringFilterMap) {
122
+ const val = args[argKey];
123
+ if (val !== undefined && val !== null && val !== '') {
124
+ filterFields.push(`<kar:${soapField}>${(0, soap_client_js_1.escapeXml)(String(val))}</kar:${soapField}>`);
125
+ }
126
+ }
127
+ // Boolean: includeUnapprovedCharges -> "T" / "F"
128
+ if (args.includeUnapprovedCharges !== undefined && args.includeUnapprovedCharges !== null) {
129
+ const boolVal = args.includeUnapprovedCharges ? 'T' : 'F';
130
+ filterFields.push(`<kar:IncludeUnapprovedCharges>${boolVal}</kar:IncludeUnapprovedCharges>`);
131
+ }
132
+ const fieldsXml = filterFields.join('\n ');
49
133
  const bodyXml = `
50
134
  <kar:request>
51
135
  <kar:Fields>
@@ -1 +1 @@
1
- {"version":3,"file":"charges.js","sourceRoot":"","sources":["../../src/tools/charges.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"charges.js","sourceRoot":"","sources":["../../src/tools/charges.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Tebra MCP tools: Document create and delete.
3
+ */
4
+ import type { TebraConfig } from '../config.js';
5
+ export declare const documentTools: ({
6
+ name: string;
7
+ description: string;
8
+ inputSchema: {
9
+ type: "object";
10
+ properties: {
11
+ patientId: {
12
+ type: string;
13
+ description: string;
14
+ };
15
+ documentLabel: {
16
+ type: string;
17
+ description: string;
18
+ };
19
+ fileName: {
20
+ type: string;
21
+ description: string;
22
+ };
23
+ fileContent: {
24
+ type: string;
25
+ description: string;
26
+ };
27
+ fileType: {
28
+ type: string;
29
+ description: string;
30
+ enum: string[];
31
+ };
32
+ description: {
33
+ type: string;
34
+ description: string;
35
+ };
36
+ encounterDate: {
37
+ type: string;
38
+ description: string;
39
+ };
40
+ documentId?: undefined;
41
+ };
42
+ required: string[];
43
+ };
44
+ } | {
45
+ name: string;
46
+ description: string;
47
+ inputSchema: {
48
+ type: "object";
49
+ properties: {
50
+ documentId: {
51
+ type: string;
52
+ description: string;
53
+ };
54
+ patientId?: undefined;
55
+ documentLabel?: undefined;
56
+ fileName?: undefined;
57
+ fileContent?: undefined;
58
+ fileType?: undefined;
59
+ description?: undefined;
60
+ encounterDate?: undefined;
61
+ };
62
+ required: string[];
63
+ };
64
+ })[];
65
+ export declare function handleDocumentTool(name: string, args: Record<string, unknown>, config: TebraConfig): Promise<{
66
+ content: Array<{
67
+ type: string;
68
+ text: string;
69
+ }>;
70
+ }>;
71
+ //# sourceMappingURL=documents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/tools/documents.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAKhD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAwDzB,CAAC;AAIF,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAmF7D"}
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ /**
3
+ * Tebra MCP tools: Document create and delete.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.documentTools = void 0;
7
+ exports.handleDocumentTool = handleDocumentTool;
8
+ const soap_client_js_1 = require("../soap-client.js");
9
+ // ─── Tool Definitions ───────────────────────────────────────────
10
+ exports.documentTools = [
11
+ {
12
+ name: 'tebra_create_document',
13
+ description: 'Upload a document to a patient record in Tebra. Supports PDF, JPG, PNG, and TIFF files via base64 content.',
14
+ inputSchema: {
15
+ type: 'object',
16
+ properties: {
17
+ patientId: {
18
+ type: 'string',
19
+ description: 'Tebra patient ID',
20
+ },
21
+ documentLabel: {
22
+ type: 'string',
23
+ description: 'Document category label (e.g. Lab Results, Referral Letter)',
24
+ },
25
+ fileName: {
26
+ type: 'string',
27
+ description: 'File name with extension (e.g. lab_results.pdf)',
28
+ },
29
+ fileContent: {
30
+ type: 'string',
31
+ description: 'Base64-encoded file content',
32
+ },
33
+ fileType: {
34
+ type: 'string',
35
+ description: 'File type: PDF, JPG, PNG, or TIFF',
36
+ enum: ['PDF', 'JPG', 'PNG', 'TIFF'],
37
+ },
38
+ description: {
39
+ type: 'string',
40
+ description: 'Optional document description/notes',
41
+ },
42
+ encounterDate: {
43
+ type: 'string',
44
+ description: 'Optional encounter date to associate with (ISO 8601)',
45
+ },
46
+ },
47
+ required: ['patientId', 'documentLabel', 'fileName', 'fileContent', 'fileType'],
48
+ },
49
+ },
50
+ {
51
+ name: 'tebra_delete_document',
52
+ description: 'Delete a document from Tebra by document ID.',
53
+ inputSchema: {
54
+ type: 'object',
55
+ properties: {
56
+ documentId: {
57
+ type: 'string',
58
+ description: 'Tebra document ID to delete',
59
+ },
60
+ },
61
+ required: ['documentId'],
62
+ },
63
+ },
64
+ ];
65
+ // ─── Tool Handler ───────────────────────────────────────────────
66
+ async function handleDocumentTool(name, args, config) {
67
+ switch (name) {
68
+ case 'tebra_create_document': {
69
+ const patientId = String(args.patientId ?? '');
70
+ const documentLabel = String(args.documentLabel ?? '');
71
+ const fileName = String(args.fileName ?? '');
72
+ const fileContent = String(args.fileContent ?? '');
73
+ const fileType = String(args.fileType ?? '');
74
+ if (!patientId || !documentLabel || !fileName || !fileContent || !fileType) {
75
+ return {
76
+ content: [{
77
+ type: 'text',
78
+ text: 'patientId, documentLabel, fileName, fileContent, and fileType are all required.',
79
+ }],
80
+ };
81
+ }
82
+ const validTypes = ['PDF', 'JPG', 'PNG', 'TIFF'];
83
+ if (!validTypes.includes(fileType)) {
84
+ return {
85
+ content: [{ type: 'text', text: `Invalid fileType "${fileType}". Must be one of: ${validTypes.join(', ')}` }],
86
+ };
87
+ }
88
+ const description = args.description ? String(args.description) : undefined;
89
+ const encounterDate = args.encounterDate ? String(args.encounterDate) : undefined;
90
+ const bodyXml = `
91
+ <kar:request>
92
+ <kar:Document>
93
+ <kar:PatientId>${(0, soap_client_js_1.escapeXml)(patientId)}</kar:PatientId>
94
+ <kar:Label>${(0, soap_client_js_1.escapeXml)(documentLabel)}</kar:Label>
95
+ <kar:Name>${(0, soap_client_js_1.escapeXml)(documentLabel)}</kar:Name>
96
+ <kar:FileName>${(0, soap_client_js_1.escapeXml)(fileName)}</kar:FileName>
97
+ <kar:FileContent>${fileContent}</kar:FileContent>
98
+ ${encounterDate ? `<kar:DocumentDate>${(0, soap_client_js_1.escapeXml)(encounterDate)}</kar:DocumentDate>` : ''}
99
+ ${description ? `<kar:DocumentNotes>${(0, soap_client_js_1.escapeXml)(description)}</kar:DocumentNotes>` : ''}
100
+ <kar:Status>New</kar:Status>
101
+ </kar:Document>
102
+ </kar:request>`;
103
+ const xml = await (0, soap_client_js_1.soapRequest)(config, 'CreateDocument', bodyXml);
104
+ const documentId = (0, soap_client_js_1.extractTag)(xml, 'DocumentID') || (0, soap_client_js_1.extractTag)(xml, 'ID');
105
+ return {
106
+ content: [{
107
+ type: 'text',
108
+ text: JSON.stringify({
109
+ documentId,
110
+ message: 'Document uploaded successfully.',
111
+ }, null, 2),
112
+ }],
113
+ };
114
+ }
115
+ case 'tebra_delete_document': {
116
+ const documentId = String(args.documentId ?? '');
117
+ if (!documentId) {
118
+ return { content: [{ type: 'text', text: 'documentId is required.' }] };
119
+ }
120
+ const bodyXml = `
121
+ <kar:request>
122
+ <kar:DocumentID>${(0, soap_client_js_1.escapeXml)(documentId)}</kar:DocumentID>
123
+ </kar:request>`;
124
+ await (0, soap_client_js_1.soapRequest)(config, 'DeleteDocument', bodyXml);
125
+ return {
126
+ content: [{
127
+ type: 'text',
128
+ text: JSON.stringify({
129
+ documentId,
130
+ message: 'Document deleted successfully.',
131
+ }, null, 2),
132
+ }],
133
+ };
134
+ }
135
+ default:
136
+ return { content: [{ type: 'text', text: `Unknown document tool: ${name}` }] };
137
+ }
138
+ }
139
+ //# sourceMappingURL=documents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.js","sourceRoot":"","sources":["../../src/tools/documents.ts"],"names":[],"mappings":"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"}
@@ -36,11 +36,11 @@ async function handleEligibilityTool(name, args, config) {
36
36
  if (!patientId) {
37
37
  return { content: [{ type: 'text', text: 'patientId is required.' }] };
38
38
  }
39
- const bodyXml = `
40
- <kar:request>
41
- <kar:Fields>
42
- <kar:PatientID>${(0, soap_client_js_1.escapeXml)(patientId)}</kar:PatientID>
43
- </kar:Fields>
39
+ const bodyXml = `
40
+ <kar:request>
41
+ <kar:Fields>
42
+ <kar:PatientID>${(0, soap_client_js_1.escapeXml)(patientId)}</kar:PatientID>
43
+ </kar:Fields>
44
44
  </kar:request>`;
45
45
  const xml = await (0, soap_client_js_1.soapRequest)(config, 'GetPatient', bodyXml);
46
46
  const patientBlock = (0, soap_client_js_1.extractTag)(xml, 'Patient');
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Tebra MCP tools: Encounter status update.
3
+ */
4
+ import type { TebraConfig } from '../config.js';
5
+ export declare const encounterStatusTools: {
6
+ name: string;
7
+ description: string;
8
+ inputSchema: {
9
+ type: "object";
10
+ properties: {
11
+ encounterId: {
12
+ type: string;
13
+ description: string;
14
+ };
15
+ status: {
16
+ type: string;
17
+ description: string;
18
+ enum: string[];
19
+ };
20
+ reviewNote: {
21
+ type: string;
22
+ description: string;
23
+ };
24
+ };
25
+ required: string[];
26
+ };
27
+ }[];
28
+ export declare function handleEncounterStatusTool(name: string, args: Record<string, unknown>, config: TebraConfig): Promise<{
29
+ content: Array<{
30
+ type: string;
31
+ text: string;
32
+ }>;
33
+ }>;
34
+ //# sourceMappingURL=encounter-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encounter-status.d.ts","sourceRoot":"","sources":["../../src/tools/encounter-status.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAKhD,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;GAyBhC,CAAC;AAIF,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA2C7D"}