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 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,eAAe,EACf,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,WAAW,EACX,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,12 @@
1
+ // Export all tool handlers
2
+ // PRIMARY CATEGORY-SPECIFIC TOOLS (16 specialized tools - combined into single file)
3
+ export { getActivity, getHeartRate, getSleep, getWorkouts, getStressAndHRV, getRespiratory, getBloodGlucose, getBodyComposition, getWomensHealth, getNutrition, getCardiovascular, getWellness, getAudioAndHearing, getMicrobiome, getLocation, getMovementAnalysis, } from "./categoryTools.js";
4
+ // Search and retrieval tools
5
+ export { searchKeyword } from "./search-keyword.js";
6
+ export { searchFilters } from "./search-filters.js";
7
+ // End user information tools
8
+ export { listConnectedSources } from "./listConnectedSources.js";
9
+ export { listDevices } from "./listDevices.js";
10
+ // Internal/reference tools
11
+ export { getAvailableDataTypes } from "./getAvailableDataTypes.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAE3B,qFAAqF;AACrF,OAAO,EACL,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,eAAe,EACf,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,WAAW,EACX,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAE5B,6BAA6B;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,6BAA6B;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,2BAA2B;AAC3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { Request } from "express";
2
+ import type { z } from "zod";
3
+ import type { GetUserInformationSchema, GetAvailableDataTypesSchema, GetDailyDataSchema, GetEpochDataSchema } from "../schemas.js";
4
+ export declare function getUserInformation(req: Request, _args: z.infer<typeof GetUserInformationSchema>): Promise<{
5
+ connectedSources: any;
6
+ devices: any;
7
+ }>;
8
+ export declare function getAvailableDataTypes(_req: Request, args: z.infer<typeof GetAvailableDataTypesSchema>): Promise<{
9
+ totalCategories: number;
10
+ totalDataTypes: number;
11
+ categories: Array<{
12
+ name: string;
13
+ count: number;
14
+ examples: string[];
15
+ }>;
16
+ } | {
17
+ category: string;
18
+ count: number;
19
+ dataTypes: import("../data-types-generated.js").DataType[];
20
+ search?: undefined;
21
+ dataSource?: undefined;
22
+ } | {
23
+ search: string;
24
+ count: number;
25
+ dataTypes: import("../data-types-generated.js").DataType[];
26
+ category?: undefined;
27
+ dataSource?: undefined;
28
+ } | {
29
+ dataSource: string;
30
+ count: number;
31
+ dataTypes: import("../data-types-generated.js").DataType[];
32
+ category?: undefined;
33
+ search?: undefined;
34
+ }>;
35
+ export declare function getDailyData(req: Request, args: z.infer<typeof GetDailyDataSchema>): Promise<unknown>;
36
+ export declare function getEpochData(req: Request, args: z.infer<typeof GetEpochDataSchema>): Promise<unknown>;
37
+ //# sourceMappingURL=legacy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy.d.ts","sourceRoot":"","sources":["../../src/tools/legacy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EACV,wBAAwB,EACxB,2BAA2B,EAC3B,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,eAAe,CAAC;AAevB,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC;;;GA0BrG;AAED,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;GAsClD;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,oBA2BxF;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,oBA2BxF"}
@@ -0,0 +1,105 @@
1
+ import { extractThryveHeaders, buildUrlEncodedBody, getDefaultDateRange, getDefaultTimestampRange, THRYVE_API_BASE_URL, } from "../helpers.js";
2
+ import { getCategorySummary, getDataTypesByCategory, searchDataTypes, getDataTypesForSource, } from "../data-types-generated.js";
3
+ export async function getUserInformation(req, _args) {
4
+ const { headers, authToken } = extractThryveHeaders(req);
5
+ const body = buildUrlEncodedBody({ authenticationToken: authToken });
6
+ const response = await fetch(`${THRYVE_API_BASE_URL}/v5/userInformation`, {
7
+ method: "POST",
8
+ headers,
9
+ body,
10
+ });
11
+ if (!response.ok) {
12
+ throw new Error(`Thryve API error: ${response.status} ${response.statusText}`);
13
+ }
14
+ const data = await response.json();
15
+ // Filter out sensitive personal information - only return connected sources
16
+ if (Array.isArray(data) && data.length > 0) {
17
+ const userData = data[0];
18
+ return {
19
+ connectedSources: userData.connectedSources || [],
20
+ devices: userData.devices || [],
21
+ };
22
+ }
23
+ return { connectedSources: [], devices: [] };
24
+ }
25
+ export async function getAvailableDataTypes(_req, args) {
26
+ // If no filters, return category summary
27
+ if (!args.category && !args.search && !args.dataSource) {
28
+ return getCategorySummary();
29
+ }
30
+ // Filter by category
31
+ if (args.category) {
32
+ const dataTypes = getDataTypesByCategory(args.category);
33
+ return {
34
+ category: args.category,
35
+ count: dataTypes.length,
36
+ dataTypes,
37
+ };
38
+ }
39
+ // Search by keyword
40
+ if (args.search) {
41
+ const dataTypes = searchDataTypes(args.search);
42
+ return {
43
+ search: args.search,
44
+ count: dataTypes.length,
45
+ dataTypes,
46
+ };
47
+ }
48
+ // Filter by data source
49
+ if (args.dataSource) {
50
+ const dataTypes = getDataTypesForSource(args.dataSource);
51
+ return {
52
+ dataSource: args.dataSource,
53
+ count: dataTypes.length,
54
+ dataTypes,
55
+ };
56
+ }
57
+ return getCategorySummary();
58
+ }
59
+ export async function getDailyData(req, args) {
60
+ const { headers, authToken } = extractThryveHeaders(req);
61
+ // Apply default date range if not provided
62
+ const defaults = getDefaultDateRange();
63
+ const startDay = args.startDay || defaults.startDay;
64
+ const endDay = args.endDay || defaults.endDay;
65
+ const body = buildUrlEncodedBody({
66
+ authenticationToken: authToken,
67
+ startDay,
68
+ endDay,
69
+ dataSources: args.dataSources,
70
+ displayTypeName: args.displayTypeName,
71
+ });
72
+ const response = await fetch(`${THRYVE_API_BASE_URL}/v5/dailyDynamicValues`, {
73
+ method: "POST",
74
+ headers,
75
+ body,
76
+ });
77
+ if (!response.ok) {
78
+ throw new Error(`Thryve API error: ${response.status} ${response.statusText}`);
79
+ }
80
+ return await response.json();
81
+ }
82
+ export async function getEpochData(req, args) {
83
+ const { headers, authToken } = extractThryveHeaders(req);
84
+ // Apply default timestamp range if not provided
85
+ const defaults = getDefaultTimestampRange();
86
+ const startTimestamp = args.startTimestamp || defaults.startTimestamp;
87
+ const endTimestamp = args.endTimestamp || defaults.endTimestamp;
88
+ const body = buildUrlEncodedBody({
89
+ authenticationToken: authToken,
90
+ startTimestamp,
91
+ endTimestamp,
92
+ dataSources: args.dataSources,
93
+ displayTypeName: args.displayTypeName,
94
+ });
95
+ const response = await fetch(`${THRYVE_API_BASE_URL}/v5/dynamicEpochValues`, {
96
+ method: "POST",
97
+ headers,
98
+ body,
99
+ });
100
+ if (!response.ok) {
101
+ throw new Error(`Thryve API error: ${response.status} ${response.statusText}`);
102
+ }
103
+ return await response.json();
104
+ }
105
+ //# sourceMappingURL=legacy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy.js","sourceRoot":"","sources":["../../src/tools/legacy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Request } from "express";
2
+ import type { z } from "zod";
3
+ import type { ListConnectedSourcesSchema } from "../schemas.js";
4
+ export declare function listConnectedSources(req: Request, args: z.infer<typeof ListConnectedSourcesSchema>): Promise<{
5
+ sources: any;
6
+ count: any;
7
+ metadata: {
8
+ retrievedAt: string;
9
+ };
10
+ }>;
11
+ //# sourceMappingURL=listConnectedSources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listConnectedSources.d.ts","sourceRoot":"","sources":["../../src/tools/listConnectedSources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAOhE,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC;;;;;;GAiCjD"}
@@ -0,0 +1,29 @@
1
+ import { extractThryveHeaders, buildUrlEncodedBody, THRYVE_API_BASE_URL, } from "../helpers.js";
2
+ export async function listConnectedSources(req, args) {
3
+ const { headers, authToken } = extractThryveHeaders(req);
4
+ const body = buildUrlEncodedBody({
5
+ authenticationToken: authToken,
6
+ });
7
+ const response = await fetch(`${THRYVE_API_BASE_URL}/v5/userInformation`, {
8
+ method: "POST",
9
+ headers,
10
+ body,
11
+ });
12
+ if (!response.ok) {
13
+ throw new Error(`Thryve API error: ${response.status} ${response.statusText}`);
14
+ }
15
+ const data = await response.json();
16
+ // The API returns an array of user information objects
17
+ // Extract connected sources from the first user (assuming single user query)
18
+ const userInfo = Array.isArray(data) ? data[0] : data;
19
+ const connectedSources = userInfo?.connectedSources || [];
20
+ // Return full details with metadata
21
+ return {
22
+ sources: connectedSources,
23
+ count: connectedSources.length,
24
+ metadata: {
25
+ retrievedAt: new Date().toISOString(),
26
+ },
27
+ };
28
+ }
29
+ //# sourceMappingURL=listConnectedSources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listConnectedSources.js","sourceRoot":"","sources":["../../src/tools/listConnectedSources.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAEvB,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,GAAY,EACZ,IAAgD;IAEhD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAEzD,MAAM,IAAI,GAAG,mBAAmB,CAAC;QAC/B,mBAAmB,EAAE,SAAS;KAC/B,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,mBAAmB,qBAAqB,EAAE;QACxE,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI;KACL,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEnC,uDAAuD;IACvD,6EAA6E;IAC7E,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtD,MAAM,gBAAgB,GAAG,QAAQ,EAAE,gBAAgB,IAAI,EAAE,CAAC;IAE1D,oCAAoC;IACpC,OAAO;QACL,OAAO,EAAE,gBAAgB;QACzB,KAAK,EAAE,gBAAgB,CAAC,MAAM;QAC9B,QAAQ,EAAE;YACR,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Request } from "express";
2
+ import type { z } from "zod";
3
+ import type { ListDevicesSchema } from "../schemas.js";
4
+ export declare function listDevices(req: Request, args: z.infer<typeof ListDevicesSchema>): Promise<{
5
+ devices: any;
6
+ count: any;
7
+ metadata: {
8
+ retrievedAt: string;
9
+ };
10
+ }>;
11
+ //# sourceMappingURL=listDevices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listDevices.d.ts","sourceRoot":"","sources":["../../src/tools/listDevices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAOvD,wBAAsB,WAAW,CAC/B,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC;;;;;;GAiCxC"}
@@ -0,0 +1,29 @@
1
+ import { extractThryveHeaders, buildUrlEncodedBody, THRYVE_API_BASE_URL, } from "../helpers.js";
2
+ export async function listDevices(req, args) {
3
+ const { headers, authToken } = extractThryveHeaders(req);
4
+ const body = buildUrlEncodedBody({
5
+ authenticationToken: authToken,
6
+ });
7
+ const response = await fetch(`${THRYVE_API_BASE_URL}/v5/userInformation`, {
8
+ method: "POST",
9
+ headers,
10
+ body,
11
+ });
12
+ if (!response.ok) {
13
+ throw new Error(`Thryve API error: ${response.status} ${response.statusText}`);
14
+ }
15
+ const data = await response.json();
16
+ // The API returns an array of user information objects
17
+ // Extract devices from the first user (assuming single user query)
18
+ const userInfo = Array.isArray(data) ? data[0] : data;
19
+ const devices = userInfo?.devices || [];
20
+ // Return full details with metadata
21
+ return {
22
+ devices: devices,
23
+ count: devices.length,
24
+ metadata: {
25
+ retrievedAt: new Date().toISOString(),
26
+ },
27
+ };
28
+ }
29
+ //# sourceMappingURL=listDevices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listDevices.js","sourceRoot":"","sources":["../../src/tools/listDevices.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAEvB,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,GAAY,EACZ,IAAuC;IAEvC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAEzD,MAAM,IAAI,GAAG,mBAAmB,CAAC;QAC/B,mBAAmB,EAAE,SAAS;KAC/B,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,mBAAmB,qBAAqB,EAAE;QACxE,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI;KACL,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEnC,uDAAuD;IACvD,mEAAmE;IACnE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtD,MAAM,OAAO,GAAG,QAAQ,EAAE,OAAO,IAAI,EAAE,CAAC;IAExC,oCAAoC;IACpC,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,OAAO,CAAC,MAAM;QACrB,QAAQ,EAAE;YACR,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,42 @@
1
+ import type { Request } from "express";
2
+ import type { z } from "zod";
3
+ import type { SearchFiltersSchema } from "../schemas.js";
4
+ import type { HealthDataRecord } from "../types.js";
5
+ export declare function searchFilters(req: Request, args: z.infer<typeof SearchFiltersSchema>): Promise<{
6
+ results: Record<string, HealthDataRecord[]>;
7
+ metadata: {
8
+ resolution: "daily" | "epoch" | "both";
9
+ categories: ("Activity" | "Sleep" | "Workouts" | "Movement Analysis" | "Heart Rate" | "Stress & HRV" | "Blood Glucose" | "Respiratory" | "Body Composition" | "Womens Health" | "Nutrition" | "Cardiovascular" | "Wellness" | "Audio & Hearing" | "Microbiome" | "Location")[];
10
+ timeRange: {
11
+ start: string;
12
+ end: string;
13
+ };
14
+ totalRecords: number;
15
+ dataTypesFound: string[];
16
+ dataSources: number[] | undefined;
17
+ filters: {
18
+ dataTypes: number[] | undefined;
19
+ valueMin: number | undefined;
20
+ valueMax: number | undefined;
21
+ };
22
+ limitApplied: number | undefined;
23
+ };
24
+ } | {
25
+ resolution: "daily" | "epoch" | "both";
26
+ filters: {
27
+ dataTypes: number[] | undefined;
28
+ dataSources: number[] | undefined;
29
+ categories: ("Activity" | "Sleep" | "Workouts" | "Movement Analysis" | "Heart Rate" | "Stress & HRV" | "Blood Glucose" | "Respiratory" | "Body Composition" | "Womens Health" | "Nutrition" | "Cardiovascular" | "Wellness" | "Audio & Hearing" | "Microbiome" | "Location")[] | undefined;
30
+ startDate: string;
31
+ endDate: string;
32
+ startTimestamp: string | undefined;
33
+ endTimestamp: string | undefined;
34
+ valueMin: number | undefined;
35
+ valueMax: number | undefined;
36
+ limitApplied: number | undefined;
37
+ };
38
+ results: HealthDataRecord[];
39
+ pagination: import("../types.js").PaginationMetadata;
40
+ metadata?: undefined;
41
+ }>;
42
+ //# sourceMappingURL=search-filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-filters.d.ts","sourceRoot":"","sources":["../../src/tools/search-filters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAapD,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiM1F"}
@@ -0,0 +1,210 @@
1
+ import { extractThryveHeaders, buildUrlEncodedBody, getDefaultDateRange, getDefaultTimestampRange, THRYVE_API_BASE_URL, sortHealthData, paginateResults, } from "../helpers.js";
2
+ import { getDataTypeIdsForCategories, CATEGORY_MAPPINGS } from "../category-mappings.js";
3
+ import { flattenThryveResponse, enrichWithDataTypes } from "../data-enrichment.js";
4
+ export async function searchFilters(req, args) {
5
+ const { headers, authToken } = extractThryveHeaders(req);
6
+ // Determine date/timestamp ranges
7
+ let startDay;
8
+ let endDay;
9
+ let startTimestamp;
10
+ let endTimestamp;
11
+ // Prefer explicit timestamps if provided, otherwise use dates
12
+ if (args.startTimestamp || args.endTimestamp) {
13
+ const defaults = getDefaultTimestampRange();
14
+ startTimestamp = args.startTimestamp || defaults.startTimestamp;
15
+ endTimestamp = args.endTimestamp || defaults.endTimestamp;
16
+ // Extract dates from timestamps
17
+ startDay = startTimestamp.split('T')[0];
18
+ endDay = endTimestamp.split('T')[0];
19
+ }
20
+ else if (args.startDate || args.endDate) {
21
+ const defaults = getDefaultDateRange();
22
+ startDay = args.startDate || defaults.startDay;
23
+ endDay = args.endDate || defaults.endDay;
24
+ startTimestamp = `${startDay}T00:00:00Z`;
25
+ endTimestamp = `${endDay}T23:59:59Z`;
26
+ }
27
+ else {
28
+ const defaults = getDefaultDateRange();
29
+ startDay = defaults.startDay;
30
+ endDay = defaults.endDay;
31
+ startTimestamp = `${startDay}T00:00:00Z`;
32
+ endTimestamp = `${endDay}T23:59:59Z`;
33
+ }
34
+ // Convert dataSources array to comma-separated string
35
+ const dataSourcesParam = args.dataSources?.join(',');
36
+ // Determine resolution (default: "both")
37
+ const resolution = args.resolution || "both";
38
+ // Fetch data based on resolution
39
+ const fetchPromises = [];
40
+ if (resolution === "daily" || resolution === "both") {
41
+ const dailyBody = buildUrlEncodedBody({
42
+ authenticationToken: authToken,
43
+ startDay,
44
+ endDay,
45
+ dataSources: dataSourcesParam,
46
+ displayTypeName: "true",
47
+ });
48
+ fetchPromises.push(fetch(`${THRYVE_API_BASE_URL}/v5/dailyDynamicValues`, {
49
+ method: "POST",
50
+ headers,
51
+ body: dailyBody,
52
+ }));
53
+ }
54
+ if (resolution === "epoch" || resolution === "both") {
55
+ const epochBody = buildUrlEncodedBody({
56
+ authenticationToken: authToken,
57
+ startTimestamp,
58
+ endTimestamp,
59
+ dataSources: dataSourcesParam,
60
+ displayTypeName: "true",
61
+ });
62
+ fetchPromises.push(fetch(`${THRYVE_API_BASE_URL}/v5/dynamicEpochValues`, {
63
+ method: "POST",
64
+ headers,
65
+ body: epochBody,
66
+ }));
67
+ }
68
+ const responses = await Promise.all(fetchPromises);
69
+ // Check for errors
70
+ for (const response of responses) {
71
+ if (!response.ok) {
72
+ throw new Error(`Thryve API error: ${response.status} ${response.statusText}`);
73
+ }
74
+ }
75
+ // Parse responses
76
+ const jsonData = await Promise.all(responses.map(r => r.json()));
77
+ // Flatten and enrich data
78
+ let allData = [];
79
+ for (const data of jsonData) {
80
+ const flattened = flattenThryveResponse(data);
81
+ enrichWithDataTypes(flattened);
82
+ allData = allData.concat(flattened);
83
+ }
84
+ // Apply filters
85
+ let filteredData = allData;
86
+ // Filter by categories (convert to data type IDs)
87
+ if (args.categories && args.categories.length > 0) {
88
+ const categoryDataTypeIds = getDataTypeIdsForCategories(args.categories);
89
+ const dataTypeIdSet = new Set(categoryDataTypeIds);
90
+ filteredData = filteredData.filter((record) => {
91
+ const typeId = record.dataType || record.dailyDynamicValueType || record.dynamicEpochValueType;
92
+ return typeId && dataTypeIdSet.has(typeId);
93
+ });
94
+ }
95
+ // Filter by specific data type IDs
96
+ if (args.dataTypes && args.dataTypes.length > 0) {
97
+ const dataTypeIdSet = new Set(args.dataTypes);
98
+ filteredData = filteredData.filter((record) => {
99
+ const typeId = record.dataType || record.dailyDynamicValueType || record.dynamicEpochValueType;
100
+ return typeId !== undefined && dataTypeIdSet.has(typeId);
101
+ });
102
+ }
103
+ // Filter by value range
104
+ if (args.valueMin !== undefined || args.valueMax !== undefined) {
105
+ filteredData = filteredData.filter((record) => {
106
+ const value = typeof record.value === "string" ? parseFloat(record.value) : record.value;
107
+ if (isNaN(value))
108
+ return false;
109
+ if (args.valueMin !== undefined && value < args.valueMin)
110
+ return false;
111
+ if (args.valueMax !== undefined && value > args.valueMax)
112
+ return false;
113
+ return true;
114
+ });
115
+ }
116
+ // Apply limit if specified (before pagination/grouping)
117
+ if (args.limit) {
118
+ filteredData = filteredData.slice(0, args.limit);
119
+ }
120
+ // Check if we should group by category
121
+ if (args.groupByCategory && args.categories && args.categories.length > 0) {
122
+ // Group results by category (like getDailyData/getEpochData)
123
+ const groupedResults = groupByCategory(filteredData, args.categories);
124
+ // Build metadata
125
+ const dataTypesFound = new Set();
126
+ filteredData.forEach((record) => {
127
+ const typeName = record.dailyDynamicValueTypeName || record.dynamicEpochValueTypeName;
128
+ if (typeName)
129
+ dataTypesFound.add(typeName);
130
+ });
131
+ const metadata = {
132
+ resolution,
133
+ categories: args.categories,
134
+ timeRange: {
135
+ start: startTimestamp,
136
+ end: endTimestamp,
137
+ },
138
+ totalRecords: filteredData.length,
139
+ dataTypesFound: Array.from(dataTypesFound).sort(),
140
+ dataSources: args.dataSources,
141
+ filters: {
142
+ dataTypes: args.dataTypes,
143
+ valueMin: args.valueMin,
144
+ valueMax: args.valueMax,
145
+ },
146
+ limitApplied: args.limit,
147
+ };
148
+ return {
149
+ results: groupedResults,
150
+ metadata,
151
+ };
152
+ }
153
+ else {
154
+ // Return flat paginated results (original behavior)
155
+ const sortedData = sortHealthData(filteredData, args.sortBy, args.sortOrder);
156
+ const paginatedResult = paginateResults(sortedData, args.page, args.pageSize);
157
+ return {
158
+ ...paginatedResult,
159
+ resolution,
160
+ filters: {
161
+ dataTypes: args.dataTypes,
162
+ dataSources: args.dataSources,
163
+ categories: args.categories,
164
+ startDate: startDay,
165
+ endDate: endDay,
166
+ startTimestamp: args.startTimestamp,
167
+ endTimestamp: args.endTimestamp,
168
+ valueMin: args.valueMin,
169
+ valueMax: args.valueMax,
170
+ limitApplied: args.limit,
171
+ },
172
+ };
173
+ }
174
+ }
175
+ /**
176
+ * Group records by requested categories
177
+ * (Copied from getDailyData/getEpochData for compatibility)
178
+ */
179
+ function groupByCategory(records, requestedCategories) {
180
+ const grouped = {};
181
+ // Initialize structure for requested categories
182
+ for (const category of requestedCategories) {
183
+ grouped[category] = [];
184
+ }
185
+ // Get category data type IDs for matching
186
+ const categoryDataTypes = new Map();
187
+ for (const category of requestedCategories) {
188
+ const mapping = CATEGORY_MAPPINGS[category];
189
+ if (mapping) {
190
+ for (const dataTypeId of mapping.dataTypeIds) {
191
+ if (!categoryDataTypes.has(dataTypeId)) {
192
+ categoryDataTypes.set(dataTypeId, []);
193
+ }
194
+ categoryDataTypes.get(dataTypeId).push(category);
195
+ }
196
+ }
197
+ }
198
+ // Group records
199
+ for (const record of records) {
200
+ const typeId = record.dataType || record.dailyDynamicValueType || record.dynamicEpochValueType;
201
+ if (typeId && categoryDataTypes.has(typeId)) {
202
+ const categories = categoryDataTypes.get(typeId);
203
+ for (const category of categories) {
204
+ grouped[category].push(record);
205
+ }
206
+ }
207
+ }
208
+ return grouped;
209
+ }
210
+ //# sourceMappingURL=search-filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-filters.js","sourceRoot":"","sources":["../../src/tools/search-filters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { Request } from "express";
2
+ import type { z } from "zod";
3
+ import type { SearchKeywordSchema } from "../schemas.js";
4
+ import type { HealthDataRecord } from "../types.js";
5
+ export declare function searchKeyword(req: Request, args: z.infer<typeof SearchKeywordSchema>): Promise<{
6
+ data: never[];
7
+ totalRecords: number;
8
+ page: number;
9
+ pageSize: number;
10
+ totalPages: number;
11
+ query: string;
12
+ matchingPropertyNames: never[];
13
+ message: string;
14
+ } | {
15
+ query: string;
16
+ matchingPropertyNames: string[];
17
+ filters: {
18
+ startDate: string;
19
+ endDate: string;
20
+ dataType: string | undefined;
21
+ dataSource: string | undefined;
22
+ };
23
+ results: HealthDataRecord[];
24
+ pagination: import("../types.js").PaginationMetadata;
25
+ data?: undefined;
26
+ totalRecords?: undefined;
27
+ page?: undefined;
28
+ pageSize?: undefined;
29
+ totalPages?: undefined;
30
+ message?: undefined;
31
+ }>;
32
+ //# sourceMappingURL=search-keyword.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-keyword.d.ts","sourceRoot":"","sources":["../../src/tools/search-keyword.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAYpD,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;GAkJ1F"}