thryve-mcp-server 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/Overview.csv +351 -0
  2. package/README.md +229 -0
  3. package/dist/category-mappings.d.ts +34 -0
  4. package/dist/category-mappings.d.ts.map +1 -0
  5. package/dist/category-mappings.js +146 -0
  6. package/dist/category-mappings.js.map +1 -0
  7. package/dist/data-enrichment.d.ts +19 -0
  8. package/dist/data-enrichment.d.ts.map +1 -0
  9. package/dist/data-enrichment.js +105 -0
  10. package/dist/data-enrichment.js.map +1 -0
  11. package/dist/data-types-generated.d.ts +70 -0
  12. package/dist/data-types-generated.d.ts.map +1 -0
  13. package/dist/data-types-generated.js +2597 -0
  14. package/dist/data-types-generated.js.map +1 -0
  15. package/dist/data-types.d.ts +53 -0
  16. package/dist/data-types.d.ts.map +1 -0
  17. package/dist/data-types.js +138 -0
  18. package/dist/data-types.js.map +1 -0
  19. package/dist/debug-logger.d.ts +17 -0
  20. package/dist/debug-logger.d.ts.map +1 -0
  21. package/dist/debug-logger.js +35 -0
  22. package/dist/debug-logger.js.map +1 -0
  23. package/dist/debug-middleware.d.ts +12 -0
  24. package/dist/debug-middleware.d.ts.map +1 -0
  25. package/dist/debug-middleware.js +36 -0
  26. package/dist/debug-middleware.js.map +1 -0
  27. package/dist/helpers.d.ts +19 -0
  28. package/dist/helpers.d.ts.map +1 -0
  29. package/dist/helpers.js +166 -0
  30. package/dist/helpers.js.map +1 -0
  31. package/dist/index.d.ts +3 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +754 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/schemas.d.ts +557 -0
  36. package/dist/schemas.d.ts.map +1 -0
  37. package/dist/schemas.js +338 -0
  38. package/dist/schemas.js.map +1 -0
  39. package/dist/tool-loader.d.ts +34 -0
  40. package/dist/tool-loader.d.ts.map +1 -0
  41. package/dist/tool-loader.js +108 -0
  42. package/dist/tool-loader.js.map +1 -0
  43. package/dist/tool-registry.d.ts +44 -0
  44. package/dist/tool-registry.d.ts.map +1 -0
  45. package/dist/tool-registry.js +54 -0
  46. package/dist/tool-registry.js.map +1 -0
  47. package/dist/tools/baseCategoryHandler.d.ts +28 -0
  48. package/dist/tools/baseCategoryHandler.d.ts.map +1 -0
  49. package/dist/tools/baseCategoryHandler.js +184 -0
  50. package/dist/tools/baseCategoryHandler.js.map +1 -0
  51. package/dist/tools/categories/getActivity.d.ts +10 -0
  52. package/dist/tools/categories/getActivity.d.ts.map +1 -0
  53. package/dist/tools/categories/getActivity.js +5 -0
  54. package/dist/tools/categories/getActivity.js.map +1 -0
  55. package/dist/tools/categories/getAudioAndHearing.d.ts +10 -0
  56. package/dist/tools/categories/getAudioAndHearing.d.ts.map +1 -0
  57. package/dist/tools/categories/getAudioAndHearing.js +5 -0
  58. package/dist/tools/categories/getAudioAndHearing.js.map +1 -0
  59. package/dist/tools/categories/getBloodGlucose.d.ts +10 -0
  60. package/dist/tools/categories/getBloodGlucose.d.ts.map +1 -0
  61. package/dist/tools/categories/getBloodGlucose.js +5 -0
  62. package/dist/tools/categories/getBloodGlucose.js.map +1 -0
  63. package/dist/tools/categories/getBodyComposition.d.ts +10 -0
  64. package/dist/tools/categories/getBodyComposition.d.ts.map +1 -0
  65. package/dist/tools/categories/getBodyComposition.js +5 -0
  66. package/dist/tools/categories/getBodyComposition.js.map +1 -0
  67. package/dist/tools/categories/getCardiovascular.d.ts +10 -0
  68. package/dist/tools/categories/getCardiovascular.d.ts.map +1 -0
  69. package/dist/tools/categories/getCardiovascular.js +5 -0
  70. package/dist/tools/categories/getCardiovascular.js.map +1 -0
  71. package/dist/tools/categories/getHeartRate.d.ts +10 -0
  72. package/dist/tools/categories/getHeartRate.d.ts.map +1 -0
  73. package/dist/tools/categories/getHeartRate.js +5 -0
  74. package/dist/tools/categories/getHeartRate.js.map +1 -0
  75. package/dist/tools/categories/getLocation.d.ts +10 -0
  76. package/dist/tools/categories/getLocation.d.ts.map +1 -0
  77. package/dist/tools/categories/getLocation.js +5 -0
  78. package/dist/tools/categories/getLocation.js.map +1 -0
  79. package/dist/tools/categories/getMicrobiome.d.ts +10 -0
  80. package/dist/tools/categories/getMicrobiome.d.ts.map +1 -0
  81. package/dist/tools/categories/getMicrobiome.js +5 -0
  82. package/dist/tools/categories/getMicrobiome.js.map +1 -0
  83. package/dist/tools/categories/getMovementAnalysis.d.ts +10 -0
  84. package/dist/tools/categories/getMovementAnalysis.d.ts.map +1 -0
  85. package/dist/tools/categories/getMovementAnalysis.js +5 -0
  86. package/dist/tools/categories/getMovementAnalysis.js.map +1 -0
  87. package/dist/tools/categories/getNutrition.d.ts +10 -0
  88. package/dist/tools/categories/getNutrition.d.ts.map +1 -0
  89. package/dist/tools/categories/getNutrition.js +5 -0
  90. package/dist/tools/categories/getNutrition.js.map +1 -0
  91. package/dist/tools/categories/getRespiratory.d.ts +10 -0
  92. package/dist/tools/categories/getRespiratory.d.ts.map +1 -0
  93. package/dist/tools/categories/getRespiratory.js +5 -0
  94. package/dist/tools/categories/getRespiratory.js.map +1 -0
  95. package/dist/tools/categories/getSleep.d.ts +10 -0
  96. package/dist/tools/categories/getSleep.d.ts.map +1 -0
  97. package/dist/tools/categories/getSleep.js +5 -0
  98. package/dist/tools/categories/getSleep.js.map +1 -0
  99. package/dist/tools/categories/getStressAndHRV.d.ts +10 -0
  100. package/dist/tools/categories/getStressAndHRV.d.ts.map +1 -0
  101. package/dist/tools/categories/getStressAndHRV.js +5 -0
  102. package/dist/tools/categories/getStressAndHRV.js.map +1 -0
  103. package/dist/tools/categories/getWellness.d.ts +10 -0
  104. package/dist/tools/categories/getWellness.d.ts.map +1 -0
  105. package/dist/tools/categories/getWellness.js +5 -0
  106. package/dist/tools/categories/getWellness.js.map +1 -0
  107. package/dist/tools/categories/getWomensHealth.d.ts +10 -0
  108. package/dist/tools/categories/getWomensHealth.d.ts.map +1 -0
  109. package/dist/tools/categories/getWomensHealth.js +5 -0
  110. package/dist/tools/categories/getWomensHealth.js.map +1 -0
  111. package/dist/tools/categories/getWorkouts.d.ts +10 -0
  112. package/dist/tools/categories/getWorkouts.d.ts.map +1 -0
  113. package/dist/tools/categories/getWorkouts.js +5 -0
  114. package/dist/tools/categories/getWorkouts.js.map +1 -0
  115. package/dist/tools/categoryTools.d.ts +100 -0
  116. package/dist/tools/categoryTools.d.ts.map +1 -0
  117. package/dist/tools/categoryTools.js +66 -0
  118. package/dist/tools/categoryTools.js.map +1 -0
  119. package/dist/tools/get.d.ts +39 -0
  120. package/dist/tools/get.d.ts.map +1 -0
  121. package/dist/tools/get.js +118 -0
  122. package/dist/tools/get.js.map +1 -0
  123. package/dist/tools/getAvailableDataTypes.d.ts +101 -0
  124. package/dist/tools/getAvailableDataTypes.d.ts.map +1 -0
  125. package/dist/tools/getAvailableDataTypes.js +120 -0
  126. package/dist/tools/getAvailableDataTypes.js.map +1 -0
  127. package/dist/tools/getConnectionWidgetUrl.d.ts +12 -0
  128. package/dist/tools/getConnectionWidgetUrl.d.ts.map +1 -0
  129. package/dist/tools/getConnectionWidgetUrl.js +26 -0
  130. package/dist/tools/getConnectionWidgetUrl.js.map +1 -0
  131. package/dist/tools/getDailyData.d.ts +30 -0
  132. package/dist/tools/getDailyData.d.ts.map +1 -0
  133. package/dist/tools/getDailyData.js +114 -0
  134. package/dist/tools/getDailyData.js.map +1 -0
  135. package/dist/tools/getEpochData.d.ts +30 -0
  136. package/dist/tools/getEpochData.d.ts.map +1 -0
  137. package/dist/tools/getEpochData.js +111 -0
  138. package/dist/tools/getEpochData.js.map +1 -0
  139. package/dist/tools/getHealthDataByCategory.d.ts +38 -0
  140. package/dist/tools/getHealthDataByCategory.d.ts.map +1 -0
  141. package/dist/tools/getHealthDataByCategory.js +231 -0
  142. package/dist/tools/getHealthDataByCategory.js.map +1 -0
  143. package/dist/tools/getUserInformation.d.ts +8 -0
  144. package/dist/tools/getUserInformation.d.ts.map +1 -0
  145. package/dist/tools/getUserInformation.js +24 -0
  146. package/dist/tools/getUserInformation.js.map +1 -0
  147. package/dist/tools/index.d.ts +7 -0
  148. package/dist/tools/index.d.ts.map +1 -0
  149. package/dist/tools/index.js +12 -0
  150. package/dist/tools/index.js.map +1 -0
  151. package/dist/tools/legacy.d.ts +37 -0
  152. package/dist/tools/legacy.d.ts.map +1 -0
  153. package/dist/tools/legacy.js +105 -0
  154. package/dist/tools/legacy.js.map +1 -0
  155. package/dist/tools/listConnectedSources.d.ts +11 -0
  156. package/dist/tools/listConnectedSources.d.ts.map +1 -0
  157. package/dist/tools/listConnectedSources.js +29 -0
  158. package/dist/tools/listConnectedSources.js.map +1 -0
  159. package/dist/tools/listDevices.d.ts +11 -0
  160. package/dist/tools/listDevices.d.ts.map +1 -0
  161. package/dist/tools/listDevices.js +29 -0
  162. package/dist/tools/listDevices.js.map +1 -0
  163. package/dist/tools/search-filters.d.ts +42 -0
  164. package/dist/tools/search-filters.d.ts.map +1 -0
  165. package/dist/tools/search-filters.js +210 -0
  166. package/dist/tools/search-filters.js.map +1 -0
  167. package/dist/tools/search-keyword.d.ts +32 -0
  168. package/dist/tools/search-keyword.d.ts.map +1 -0
  169. package/dist/tools/search-keyword.js +122 -0
  170. package/dist/tools/search-keyword.js.map +1 -0
  171. package/dist/tools/search-tools.d.ts +8 -0
  172. package/dist/tools/search-tools.d.ts.map +1 -0
  173. package/dist/tools/search-tools.js +273 -0
  174. package/dist/tools/search-tools.js.map +1 -0
  175. package/dist/types.d.ts +37 -0
  176. package/dist/types.d.ts.map +1 -0
  177. package/dist/types.js +2 -0
  178. package/dist/types.js.map +1 -0
  179. package/package.json +30 -0
  180. package/parse-csv.py +152 -0
  181. package/src/category-mappings.ts +181 -0
  182. package/src/data-enrichment.ts +125 -0
  183. package/src/data-types-generated.ts +2652 -0
  184. package/src/helpers.ts +198 -0
  185. package/src/index.ts +859 -0
  186. package/src/schemas.ts +372 -0
  187. package/src/tools/baseCategoryHandler.ts +243 -0
  188. package/src/tools/categoryTools.ts +101 -0
  189. package/src/tools/get.ts +147 -0
  190. package/src/tools/getAvailableDataTypes.ts +148 -0
  191. package/src/tools/index.ts +32 -0
  192. package/src/tools/listConnectedSources.ts +45 -0
  193. package/src/tools/listDevices.ts +45 -0
  194. package/src/tools/search-filters.ts +253 -0
  195. package/src/tools/search-keyword.ts +162 -0
  196. package/src/types.ts +44 -0
  197. package/tsconfig.json +20 -0
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Category mappings for LLM-friendly health data access
3
+ * Maps high-level categories to Thryve data type IDs
4
+ */
5
+
6
+ import { ALL_DATA_TYPES } from "./data-types-generated.js";
7
+
8
+ export type HealthCategory =
9
+ | "Activity"
10
+ | "Heart Rate"
11
+ | "Sleep"
12
+ | "Workouts"
13
+ | "Stress & HRV"
14
+ | "Respiratory"
15
+ | "Blood Glucose"
16
+ | "Body Composition"
17
+ | "Womens Health"
18
+ | "Nutrition"
19
+ | "Cardiovascular"
20
+ | "Wellness"
21
+ | "Audio & Hearing"
22
+ | "Microbiome"
23
+ | "Location"
24
+ | "Movement Analysis";
25
+
26
+ interface CategoryMapping {
27
+ thryveCategories: string[];
28
+ description: string;
29
+ dataTypeIds: number[];
30
+ }
31
+
32
+ /**
33
+ * Build category mappings dynamically from data types
34
+ */
35
+ function buildCategoryMappings(): Record<HealthCategory, CategoryMapping> {
36
+ const mappings: Record<string, CategoryMapping> = {
37
+ "Activity": {
38
+ thryveCategories: ["Activity"],
39
+ description: "Steps, distance, floors climbed, elevation, calories burned, and general activity metrics",
40
+ dataTypeIds: [],
41
+ },
42
+ "Heart Rate": {
43
+ thryveCategories: ["Heart Rate"],
44
+ description: "Heart rate measurements including resting, average, min, max, and variability",
45
+ dataTypeIds: [],
46
+ },
47
+ "Sleep": {
48
+ thryveCategories: ["Sleep"],
49
+ description: "Sleep duration, stages, quality, and sleep-related metrics",
50
+ dataTypeIds: [],
51
+ },
52
+ "Workouts": {
53
+ thryveCategories: ["Workouts"],
54
+ description: "Exercise sessions, workout types, duration, and performance metrics",
55
+ dataTypeIds: [],
56
+ },
57
+ "Stress & HRV": {
58
+ thryveCategories: ["Stress & HRV"],
59
+ description: "Stress levels, heart rate variability, and recovery metrics",
60
+ dataTypeIds: [],
61
+ },
62
+ "Respiratory": {
63
+ thryveCategories: ["Respiratory & Breathing"],
64
+ description: "Breathing rate, SpO2, respiratory patterns, and lung function",
65
+ dataTypeIds: [],
66
+ },
67
+ "Blood Glucose": {
68
+ thryveCategories: ["Blood Glucose"],
69
+ description: "Blood glucose levels and continuous glucose monitoring (CGM) data",
70
+ dataTypeIds: [],
71
+ },
72
+ "Body Composition": {
73
+ thryveCategories: ["Body Composition & Measurements"],
74
+ description: "Weight, BMI, body fat percentage, muscle mass, and body measurements",
75
+ dataTypeIds: [],
76
+ },
77
+ "Womens Health": {
78
+ thryveCategories: ["Women's Health"],
79
+ description: "Menstrual cycle tracking, ovulation, symptoms, and reproductive health",
80
+ dataTypeIds: [],
81
+ },
82
+ "Nutrition": {
83
+ thryveCategories: ["Detailed Nutrition"],
84
+ description: "Nutritional intake including calories, macros, micros, hydration, and meal data",
85
+ dataTypeIds: [],
86
+ },
87
+ "Cardiovascular": {
88
+ thryveCategories: ["Cardiovascular Health", "Advanced Cardiac Analysis"],
89
+ description: "Blood pressure, VO2 max, cardiac analysis, and cardiovascular health metrics",
90
+ dataTypeIds: [],
91
+ },
92
+ "Wellness": {
93
+ thryveCategories: ["Self-Reported Wellness"],
94
+ description: "General wellness, mood, energy levels, and self-reported health data",
95
+ dataTypeIds: [],
96
+ },
97
+ "Audio & Hearing": {
98
+ thryveCategories: ["Audio & Hearing Health"],
99
+ description: "Hearing health, audio exposure, and environmental sound levels",
100
+ dataTypeIds: [],
101
+ },
102
+ "Microbiome": {
103
+ thryveCategories: ["Microbiome & Gut Health"],
104
+ description: "Gut health, microbiome composition, and digestive metrics",
105
+ dataTypeIds: [],
106
+ },
107
+ "Location": {
108
+ thryveCategories: ["Location & GPS"],
109
+ description: "GPS coordinates, routes, and location tracking data",
110
+ dataTypeIds: [],
111
+ },
112
+ "Movement Analysis": {
113
+ thryveCategories: ["Movement Analysis"],
114
+ description: "Movement patterns, gait analysis, and biomechanics",
115
+ dataTypeIds: [],
116
+ },
117
+ };
118
+
119
+ // Build data type ID lists by matching categories
120
+ for (const dataType of ALL_DATA_TYPES) {
121
+ for (const [category, mapping] of Object.entries(mappings)) {
122
+ // Check if this data type's category matches any of the mapping's Thryve categories
123
+ const matches = mapping.thryveCategories.some((thryveCategory) => {
124
+ // Handle compound categories like "Activity,Workouts"
125
+ const dataTypeCategories = dataType.category.split(",").map((c) => c.trim());
126
+ return dataTypeCategories.includes(thryveCategory);
127
+ });
128
+
129
+ if (matches) {
130
+ mapping.dataTypeIds.push(dataType.id);
131
+ }
132
+ }
133
+ }
134
+
135
+ return mappings as Record<HealthCategory, CategoryMapping>;
136
+ }
137
+
138
+ // Build mappings once at module load time
139
+ export const CATEGORY_MAPPINGS = buildCategoryMappings();
140
+
141
+ /**
142
+ * Get all data type IDs for given categories
143
+ */
144
+ export function getDataTypeIdsForCategories(categories: HealthCategory[]): number[] {
145
+ const allIds = new Set<number>();
146
+
147
+ for (const category of categories) {
148
+ const mapping = CATEGORY_MAPPINGS[category];
149
+ if (mapping) {
150
+ mapping.dataTypeIds.forEach((id) => allIds.add(id));
151
+ }
152
+ }
153
+
154
+ return Array.from(allIds);
155
+ }
156
+
157
+ /**
158
+ * Get category information for display
159
+ */
160
+ export function getCategoryInfo(category: HealthCategory): CategoryMapping | undefined {
161
+ return CATEGORY_MAPPINGS[category];
162
+ }
163
+
164
+ /**
165
+ * Get all available categories
166
+ */
167
+ export function getAllCategories(): HealthCategory[] {
168
+ return Object.keys(CATEGORY_MAPPINGS) as HealthCategory[];
169
+ }
170
+
171
+ /**
172
+ * Get category statistics
173
+ */
174
+ export function getCategoryStats() {
175
+ return Object.entries(CATEGORY_MAPPINGS).map(([category, mapping]) => ({
176
+ category,
177
+ description: mapping.description,
178
+ dataTypeCount: mapping.dataTypeIds.length,
179
+ thryveCategories: mapping.thryveCategories,
180
+ }));
181
+ }
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Shared data enrichment utilities for health data
3
+ * Used by getDailyData, getEpochData, and getHealthDataByCategory
4
+ */
5
+
6
+ import type { HealthDataRecord } from "./types.js";
7
+ import { getDataTypeById } from "./data-types-generated.js";
8
+ import { generateRecordId } from "./helpers.js";
9
+
10
+ /**
11
+ * Flatten Thryve API response structure into flat array of records
12
+ */
13
+ export function flattenThryveResponse(data: any): HealthDataRecord[] {
14
+ const records: HealthDataRecord[] = [];
15
+
16
+ if (!Array.isArray(data)) {
17
+ return records;
18
+ }
19
+
20
+ for (const item of data) {
21
+ if (item.dataSources && Array.isArray(item.dataSources)) {
22
+ for (const dataSource of item.dataSources) {
23
+ if (dataSource.data && Array.isArray(dataSource.data)) {
24
+ for (const record of dataSource.data) {
25
+ records.push({
26
+ ...record,
27
+ dataSource: dataSource.dataSource,
28
+ dataSourceName: dataSource.dataSourceName,
29
+ _recordId: generateRecordId({ ...record, dataSource: dataSource.dataSource }),
30
+ });
31
+ }
32
+ }
33
+ }
34
+ }
35
+ }
36
+
37
+ return records;
38
+ }
39
+
40
+ /**
41
+ * Enrich records with data type metadata (name, category, unit)
42
+ */
43
+ export function enrichWithDataTypes(records: HealthDataRecord[]): void {
44
+ for (const record of records) {
45
+ const typeId =
46
+ record.dailyDynamicValueType ||
47
+ record.dynamicValueType ||
48
+ record.dynamicEpochValueType;
49
+
50
+ if (typeId) {
51
+ const dataType = getDataTypeById(typeId);
52
+ if (dataType) {
53
+ // Set appropriate type name based on the type ID field
54
+ if (record.dailyDynamicValueType) {
55
+ record.dailyDynamicValueTypeName = dataType.name;
56
+ }
57
+ if (record.dynamicValueType || record.dynamicEpochValueType) {
58
+ record.dynamicValueTypeName = dataType.name;
59
+ record.dynamicEpochValueTypeName = dataType.name;
60
+ }
61
+
62
+ record.category = dataType.category;
63
+ record.unit = dataType.unit;
64
+ record.dataType = typeId;
65
+ }
66
+ }
67
+ }
68
+ }
69
+
70
+ /**
71
+ * Rebuild Thryve API response structure from flattened records
72
+ * Groups records by dataSource
73
+ */
74
+ export function rebuildThryveResponse(records: HealthDataRecord[]): any[] {
75
+ if (records.length === 0) {
76
+ return [];
77
+ }
78
+
79
+ // Group records by data source
80
+ const groupedBySource = new Map<number, HealthDataRecord[]>();
81
+
82
+ for (const record of records) {
83
+ const sourceId = record.dataSource || 0;
84
+ if (!groupedBySource.has(sourceId)) {
85
+ groupedBySource.set(sourceId, []);
86
+ }
87
+ groupedBySource.get(sourceId)!.push(record);
88
+ }
89
+
90
+ // Rebuild structure
91
+ const result: any[] = [];
92
+
93
+ for (const [dataSource, sourceRecords] of groupedBySource) {
94
+ // Extract first record to get authToken (if present)
95
+ const firstRecord = sourceRecords[0];
96
+ const authToken = (firstRecord as any).authenticationToken;
97
+
98
+ const dataSourceObj: any = {
99
+ dataSource,
100
+ data: sourceRecords.map((record) => {
101
+ // Remove internal fields
102
+ const { dataSource: _ds, dataSourceName: _dsName, _recordId, ...cleanRecord } = record;
103
+ return cleanRecord;
104
+ }),
105
+ };
106
+
107
+ // Add dataSourceName if available
108
+ if (sourceRecords[0].dataSourceName) {
109
+ dataSourceObj.dataSourceName = sourceRecords[0].dataSourceName;
110
+ }
111
+
112
+ const responseItem: any = {
113
+ dataSources: [dataSourceObj],
114
+ };
115
+
116
+ // Add authToken if present
117
+ if (authToken) {
118
+ responseItem.authenticationToken = authToken;
119
+ }
120
+
121
+ result.push(responseItem);
122
+ }
123
+
124
+ return result;
125
+ }