@lagoon-protocol/lagoon-mcp 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 (335) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +618 -0
  3. package/dist/cache/index.d.ts +97 -0
  4. package/dist/cache/index.d.ts.map +1 -0
  5. package/dist/cache/index.js +106 -0
  6. package/dist/cache/index.js.map +1 -0
  7. package/dist/config.d.ts +34 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +40 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/core/cache-adapter.d.ts +73 -0
  12. package/dist/core/cache-adapter.d.ts.map +1 -0
  13. package/dist/core/cache-adapter.js +47 -0
  14. package/dist/core/cache-adapter.js.map +1 -0
  15. package/dist/core/cache-invalidation.d.ts +72 -0
  16. package/dist/core/cache-invalidation.d.ts.map +1 -0
  17. package/dist/core/cache-invalidation.js +114 -0
  18. package/dist/core/cache-invalidation.js.map +1 -0
  19. package/dist/core/container.d.ts +34 -0
  20. package/dist/core/container.d.ts.map +1 -0
  21. package/dist/core/container.js +75 -0
  22. package/dist/core/container.js.map +1 -0
  23. package/dist/graphql/client.d.ts +32 -0
  24. package/dist/graphql/client.d.ts.map +1 -0
  25. package/dist/graphql/client.js +49 -0
  26. package/dist/graphql/client.js.map +1 -0
  27. package/dist/graphql/fragments/apr-breakdown.fragment.d.ts +64 -0
  28. package/dist/graphql/fragments/apr-breakdown.fragment.d.ts.map +1 -0
  29. package/dist/graphql/fragments/apr-breakdown.fragment.js +62 -0
  30. package/dist/graphql/fragments/apr-breakdown.fragment.js.map +1 -0
  31. package/dist/graphql/fragments/asset-info.fragment.d.ts +18 -0
  32. package/dist/graphql/fragments/asset-info.fragment.d.ts.map +1 -0
  33. package/dist/graphql/fragments/asset-info.fragment.js +36 -0
  34. package/dist/graphql/fragments/asset-info.fragment.js.map +1 -0
  35. package/dist/graphql/fragments/chain-info.fragment.d.ts +18 -0
  36. package/dist/graphql/fragments/chain-info.fragment.d.ts.map +1 -0
  37. package/dist/graphql/fragments/chain-info.fragment.js +32 -0
  38. package/dist/graphql/fragments/chain-info.fragment.js.map +1 -0
  39. package/dist/graphql/fragments/index.d.ts +15 -0
  40. package/dist/graphql/fragments/index.d.ts.map +1 -0
  41. package/dist/graphql/fragments/index.js +21 -0
  42. package/dist/graphql/fragments/index.js.map +1 -0
  43. package/dist/graphql/fragments/pageinfo.fragment.d.ts +33 -0
  44. package/dist/graphql/fragments/pageinfo.fragment.d.ts.map +1 -0
  45. package/dist/graphql/fragments/pageinfo.fragment.js +47 -0
  46. package/dist/graphql/fragments/pageinfo.fragment.js.map +1 -0
  47. package/dist/graphql/fragments/transaction-base.fragment.d.ts +19 -0
  48. package/dist/graphql/fragments/transaction-base.fragment.d.ts.map +1 -0
  49. package/dist/graphql/fragments/transaction-base.fragment.js +32 -0
  50. package/dist/graphql/fragments/transaction-base.fragment.js.map +1 -0
  51. package/dist/graphql/fragments/vault-list.fragment.d.ts +53 -0
  52. package/dist/graphql/fragments/vault-list.fragment.d.ts.map +1 -0
  53. package/dist/graphql/fragments/vault-list.fragment.js +51 -0
  54. package/dist/graphql/fragments/vault-list.fragment.js.map +1 -0
  55. package/dist/graphql/fragments/vault-summary.fragment.d.ts +68 -0
  56. package/dist/graphql/fragments/vault-summary.fragment.d.ts.map +1 -0
  57. package/dist/graphql/fragments/vault-summary.fragment.js +66 -0
  58. package/dist/graphql/fragments/vault-summary.fragment.js.map +1 -0
  59. package/dist/graphql/fragments/vault.fragment.d.ts +133 -0
  60. package/dist/graphql/fragments/vault.fragment.d.ts.map +1 -0
  61. package/dist/graphql/fragments/vault.fragment.js +119 -0
  62. package/dist/graphql/fragments/vault.fragment.js.map +1 -0
  63. package/dist/graphql/fragments.d.ts +183 -0
  64. package/dist/graphql/fragments.d.ts.map +1 -0
  65. package/dist/graphql/fragments.js +297 -0
  66. package/dist/graphql/fragments.js.map +1 -0
  67. package/dist/graphql/queries/export.queries.d.ts +72 -0
  68. package/dist/graphql/queries/export.queries.d.ts.map +1 -0
  69. package/dist/graphql/queries/export.queries.js +202 -0
  70. package/dist/graphql/queries/export.queries.js.map +1 -0
  71. package/dist/graphql/queries/index.d.ts +15 -0
  72. package/dist/graphql/queries/index.d.ts.map +1 -0
  73. package/dist/graphql/queries/index.js +23 -0
  74. package/dist/graphql/queries/index.js.map +1 -0
  75. package/dist/graphql/queries/performance.queries.d.ts +63 -0
  76. package/dist/graphql/queries/performance.queries.d.ts.map +1 -0
  77. package/dist/graphql/queries/performance.queries.js +133 -0
  78. package/dist/graphql/queries/performance.queries.js.map +1 -0
  79. package/dist/graphql/queries/period-summaries.d.ts +15 -0
  80. package/dist/graphql/queries/period-summaries.d.ts.map +1 -0
  81. package/dist/graphql/queries/period-summaries.js +24 -0
  82. package/dist/graphql/queries/period-summaries.js.map +1 -0
  83. package/dist/graphql/queries/portfolio.queries.d.ts +78 -0
  84. package/dist/graphql/queries/portfolio.queries.d.ts.map +1 -0
  85. package/dist/graphql/queries/portfolio.queries.js +198 -0
  86. package/dist/graphql/queries/portfolio.queries.js.map +1 -0
  87. package/dist/graphql/queries/prediction.queries.d.ts +38 -0
  88. package/dist/graphql/queries/prediction.queries.d.ts.map +1 -0
  89. package/dist/graphql/queries/prediction.queries.js +100 -0
  90. package/dist/graphql/queries/prediction.queries.js.map +1 -0
  91. package/dist/graphql/queries/risk.queries.d.ts +37 -0
  92. package/dist/graphql/queries/risk.queries.d.ts.map +1 -0
  93. package/dist/graphql/queries/risk.queries.js +90 -0
  94. package/dist/graphql/queries/risk.queries.js.map +1 -0
  95. package/dist/graphql/queries/search.queries.d.ts +61 -0
  96. package/dist/graphql/queries/search.queries.d.ts.map +1 -0
  97. package/dist/graphql/queries/search.queries.js +103 -0
  98. package/dist/graphql/queries/search.queries.js.map +1 -0
  99. package/dist/graphql/queries/transaction.queries.d.ts +60 -0
  100. package/dist/graphql/queries/transaction.queries.d.ts.map +1 -0
  101. package/dist/graphql/queries/transaction.queries.js +252 -0
  102. package/dist/graphql/queries/transaction.queries.js.map +1 -0
  103. package/dist/graphql/queries/vault.queries.d.ts +54 -0
  104. package/dist/graphql/queries/vault.queries.d.ts.map +1 -0
  105. package/dist/graphql/queries/vault.queries.js +78 -0
  106. package/dist/graphql/queries/vault.queries.js.map +1 -0
  107. package/dist/index.d.ts +12 -0
  108. package/dist/index.d.ts.map +1 -0
  109. package/dist/index.js +32 -0
  110. package/dist/index.js.map +1 -0
  111. package/dist/prompts/competitor-comparison.d.ts +8 -0
  112. package/dist/prompts/competitor-comparison.d.ts.map +1 -0
  113. package/dist/prompts/competitor-comparison.js +432 -0
  114. package/dist/prompts/competitor-comparison.js.map +1 -0
  115. package/dist/prompts/curator-performance.d.ts +8 -0
  116. package/dist/prompts/curator-performance.d.ts.map +1 -0
  117. package/dist/prompts/curator-performance.js +383 -0
  118. package/dist/prompts/curator-performance.js.map +1 -0
  119. package/dist/prompts/financial-analysis.d.ts +8 -0
  120. package/dist/prompts/financial-analysis.d.ts.map +1 -0
  121. package/dist/prompts/financial-analysis.js +480 -0
  122. package/dist/prompts/financial-analysis.js.map +1 -0
  123. package/dist/prompts/index.d.ts +21 -0
  124. package/dist/prompts/index.d.ts.map +1 -0
  125. package/dist/prompts/index.js +50 -0
  126. package/dist/prompts/index.js.map +1 -0
  127. package/dist/prompts/onboarding-first-vault.d.ts +8 -0
  128. package/dist/prompts/onboarding-first-vault.d.ts.map +1 -0
  129. package/dist/prompts/onboarding-first-vault.js +317 -0
  130. package/dist/prompts/onboarding-first-vault.js.map +1 -0
  131. package/dist/prompts/portfolio-optimization.d.ts +8 -0
  132. package/dist/prompts/portfolio-optimization.d.ts.map +1 -0
  133. package/dist/prompts/portfolio-optimization.js +412 -0
  134. package/dist/prompts/portfolio-optimization.js.map +1 -0
  135. package/dist/prompts/protocol-overview.d.ts +8 -0
  136. package/dist/prompts/protocol-overview.d.ts.map +1 -0
  137. package/dist/prompts/protocol-overview.js +398 -0
  138. package/dist/prompts/protocol-overview.js.map +1 -0
  139. package/dist/prompts/shared/disclaimers.d.ts +54 -0
  140. package/dist/prompts/shared/disclaimers.d.ts.map +1 -0
  141. package/dist/prompts/shared/disclaimers.js +400 -0
  142. package/dist/prompts/shared/disclaimers.js.map +1 -0
  143. package/dist/resources/glossary.d.ts +8 -0
  144. package/dist/resources/glossary.d.ts.map +1 -0
  145. package/dist/resources/glossary.js +407 -0
  146. package/dist/resources/glossary.js.map +1 -0
  147. package/dist/resources/index.d.ts +18 -0
  148. package/dist/resources/index.d.ts.map +1 -0
  149. package/dist/resources/index.js +29 -0
  150. package/dist/resources/index.js.map +1 -0
  151. package/dist/resources/schema.d.ts +22 -0
  152. package/dist/resources/schema.d.ts.map +1 -0
  153. package/dist/resources/schema.js +67 -0
  154. package/dist/resources/schema.js.map +1 -0
  155. package/dist/schemas/config.schema.d.ts +46 -0
  156. package/dist/schemas/config.schema.d.ts.map +1 -0
  157. package/dist/schemas/config.schema.js +48 -0
  158. package/dist/schemas/config.schema.js.map +1 -0
  159. package/dist/sdk/__tests__/apr-service.test.d.ts +7 -0
  160. package/dist/sdk/__tests__/apr-service.test.d.ts.map +1 -0
  161. package/dist/sdk/__tests__/apr-service.test.js +385 -0
  162. package/dist/sdk/__tests__/apr-service.test.js.map +1 -0
  163. package/dist/sdk/__tests__/math-utils.test.d.ts +7 -0
  164. package/dist/sdk/__tests__/math-utils.test.d.ts.map +1 -0
  165. package/dist/sdk/__tests__/math-utils.test.js +185 -0
  166. package/dist/sdk/__tests__/math-utils.test.js.map +1 -0
  167. package/dist/sdk/__tests__/simulation-service.test.d.ts +5 -0
  168. package/dist/sdk/__tests__/simulation-service.test.d.ts.map +1 -0
  169. package/dist/sdk/__tests__/simulation-service.test.js +397 -0
  170. package/dist/sdk/__tests__/simulation-service.test.js.map +1 -0
  171. package/dist/sdk/__tests__/vault-utils.test.d.ts +7 -0
  172. package/dist/sdk/__tests__/vault-utils.test.d.ts.map +1 -0
  173. package/dist/sdk/__tests__/vault-utils.test.js +189 -0
  174. package/dist/sdk/__tests__/vault-utils.test.js.map +1 -0
  175. package/dist/sdk/apr-service.d.ts +101 -0
  176. package/dist/sdk/apr-service.d.ts.map +1 -0
  177. package/dist/sdk/apr-service.js +175 -0
  178. package/dist/sdk/apr-service.js.map +1 -0
  179. package/dist/sdk/math-utils.d.ts +138 -0
  180. package/dist/sdk/math-utils.d.ts.map +1 -0
  181. package/dist/sdk/math-utils.js +218 -0
  182. package/dist/sdk/math-utils.js.map +1 -0
  183. package/dist/sdk/simulation-service.d.ts +106 -0
  184. package/dist/sdk/simulation-service.d.ts.map +1 -0
  185. package/dist/sdk/simulation-service.js +143 -0
  186. package/dist/sdk/simulation-service.js.map +1 -0
  187. package/dist/sdk/vault-utils.d.ts +125 -0
  188. package/dist/sdk/vault-utils.d.ts.map +1 -0
  189. package/dist/sdk/vault-utils.js +165 -0
  190. package/dist/sdk/vault-utils.js.map +1 -0
  191. package/dist/server.d.ts +21 -0
  192. package/dist/server.d.ts.map +1 -0
  193. package/dist/server.js +225 -0
  194. package/dist/server.js.map +1 -0
  195. package/dist/services/analytics/protocol-overview.service.d.ts +61 -0
  196. package/dist/services/analytics/protocol-overview.service.d.ts.map +1 -0
  197. package/dist/services/analytics/protocol-overview.service.js +182 -0
  198. package/dist/services/analytics/protocol-overview.service.js.map +1 -0
  199. package/dist/services/analytics/risk.service.d.ts +92 -0
  200. package/dist/services/analytics/risk.service.d.ts.map +1 -0
  201. package/dist/services/analytics/risk.service.js +423 -0
  202. package/dist/services/analytics/risk.service.js.map +1 -0
  203. package/dist/services/base.service.d.ts +39 -0
  204. package/dist/services/base.service.d.ts.map +1 -0
  205. package/dist/services/base.service.js +37 -0
  206. package/dist/services/base.service.js.map +1 -0
  207. package/dist/services/index.d.ts +30 -0
  208. package/dist/services/index.d.ts.map +1 -0
  209. package/dist/services/index.js +101 -0
  210. package/dist/services/index.js.map +1 -0
  211. package/dist/tools/__tests__/simulate-vault.test.d.ts +5 -0
  212. package/dist/tools/__tests__/simulate-vault.test.d.ts.map +1 -0
  213. package/dist/tools/__tests__/simulate-vault.test.js +363 -0
  214. package/dist/tools/__tests__/simulate-vault.test.js.map +1 -0
  215. package/dist/tools/analyze-risk.d.ts +34 -0
  216. package/dist/tools/analyze-risk.d.ts.map +1 -0
  217. package/dist/tools/analyze-risk.js +100 -0
  218. package/dist/tools/analyze-risk.js.map +1 -0
  219. package/dist/tools/compare-vaults.d.ts +29 -0
  220. package/dist/tools/compare-vaults.d.ts.map +1 -0
  221. package/dist/tools/compare-vaults.js +285 -0
  222. package/dist/tools/compare-vaults.js.map +1 -0
  223. package/dist/tools/export-data.d.ts +34 -0
  224. package/dist/tools/export-data.d.ts.map +1 -0
  225. package/dist/tools/export-data.js +309 -0
  226. package/dist/tools/export-data.js.map +1 -0
  227. package/dist/tools/get-price-history.d.ts +29 -0
  228. package/dist/tools/get-price-history.d.ts.map +1 -0
  229. package/dist/tools/get-price-history.js +236 -0
  230. package/dist/tools/get-price-history.js.map +1 -0
  231. package/dist/tools/get-transactions.d.ts +29 -0
  232. package/dist/tools/get-transactions.d.ts.map +1 -0
  233. package/dist/tools/get-transactions.js +181 -0
  234. package/dist/tools/get-transactions.js.map +1 -0
  235. package/dist/tools/index.d.ts +26 -0
  236. package/dist/tools/index.d.ts.map +1 -0
  237. package/dist/tools/index.js +32 -0
  238. package/dist/tools/index.js.map +1 -0
  239. package/dist/tools/optimize-portfolio.d.ts +37 -0
  240. package/dist/tools/optimize-portfolio.d.ts.map +1 -0
  241. package/dist/tools/optimize-portfolio.js +459 -0
  242. package/dist/tools/optimize-portfolio.js.map +1 -0
  243. package/dist/tools/predict-yield.d.ts +30 -0
  244. package/dist/tools/predict-yield.d.ts.map +1 -0
  245. package/dist/tools/predict-yield.js +248 -0
  246. package/dist/tools/predict-yield.js.map +1 -0
  247. package/dist/tools/query-graphql.d.ts +35 -0
  248. package/dist/tools/query-graphql.d.ts.map +1 -0
  249. package/dist/tools/query-graphql.js +54 -0
  250. package/dist/tools/query-graphql.js.map +1 -0
  251. package/dist/tools/registry.d.ts +42 -0
  252. package/dist/tools/registry.d.ts.map +1 -0
  253. package/dist/tools/registry.js +231 -0
  254. package/dist/tools/registry.js.map +1 -0
  255. package/dist/tools/search-vaults.d.ts +40 -0
  256. package/dist/tools/search-vaults.d.ts.map +1 -0
  257. package/dist/tools/search-vaults.js +184 -0
  258. package/dist/tools/search-vaults.js.map +1 -0
  259. package/dist/tools/simulate-vault.d.ts +80 -0
  260. package/dist/tools/simulate-vault.d.ts.map +1 -0
  261. package/dist/tools/simulate-vault.js +281 -0
  262. package/dist/tools/simulate-vault.js.map +1 -0
  263. package/dist/tools/user-portfolio.d.ts +30 -0
  264. package/dist/tools/user-portfolio.d.ts.map +1 -0
  265. package/dist/tools/user-portfolio.js +142 -0
  266. package/dist/tools/user-portfolio.js.map +1 -0
  267. package/dist/tools/vault-data.d.ts +23 -0
  268. package/dist/tools/vault-data.d.ts.map +1 -0
  269. package/dist/tools/vault-data.js +68 -0
  270. package/dist/tools/vault-data.js.map +1 -0
  271. package/dist/tools/vault-performance.d.ts +30 -0
  272. package/dist/tools/vault-performance.d.ts.map +1 -0
  273. package/dist/tools/vault-performance.js +275 -0
  274. package/dist/tools/vault-performance.js.map +1 -0
  275. package/dist/types/generated.d.ts +1109 -0
  276. package/dist/types/generated.d.ts.map +1 -0
  277. package/dist/types/generated.js +2 -0
  278. package/dist/types/generated.js.map +1 -0
  279. package/dist/types/index.d.ts +46 -0
  280. package/dist/types/index.d.ts.map +1 -0
  281. package/dist/types/index.js +8 -0
  282. package/dist/types/index.js.map +1 -0
  283. package/dist/utils/comparison-metrics.d.ts +120 -0
  284. package/dist/utils/comparison-metrics.d.ts.map +1 -0
  285. package/dist/utils/comparison-metrics.js +215 -0
  286. package/dist/utils/comparison-metrics.js.map +1 -0
  287. package/dist/utils/config-loader.d.ts +17 -0
  288. package/dist/utils/config-loader.d.ts.map +1 -0
  289. package/dist/utils/config-loader.js +45 -0
  290. package/dist/utils/config-loader.js.map +1 -0
  291. package/dist/utils/csv-generator.d.ts +89 -0
  292. package/dist/utils/csv-generator.d.ts.map +1 -0
  293. package/dist/utils/csv-generator.js +97 -0
  294. package/dist/utils/csv-generator.js.map +1 -0
  295. package/dist/utils/disclaimers.d.ts +70 -0
  296. package/dist/utils/disclaimers.d.ts.map +1 -0
  297. package/dist/utils/disclaimers.js +161 -0
  298. package/dist/utils/disclaimers.js.map +1 -0
  299. package/dist/utils/errors.d.ts +66 -0
  300. package/dist/utils/errors.d.ts.map +1 -0
  301. package/dist/utils/errors.js +86 -0
  302. package/dist/utils/errors.js.map +1 -0
  303. package/dist/utils/execute-tool-with-cache.d.ts +97 -0
  304. package/dist/utils/execute-tool-with-cache.d.ts.map +1 -0
  305. package/dist/utils/execute-tool-with-cache.js +105 -0
  306. package/dist/utils/execute-tool-with-cache.js.map +1 -0
  307. package/dist/utils/portfolio-optimization.d.ts +100 -0
  308. package/dist/utils/portfolio-optimization.d.ts.map +1 -0
  309. package/dist/utils/portfolio-optimization.js +283 -0
  310. package/dist/utils/portfolio-optimization.js.map +1 -0
  311. package/dist/utils/risk-scoring.d.ts +226 -0
  312. package/dist/utils/risk-scoring.d.ts.map +1 -0
  313. package/dist/utils/risk-scoring.js +523 -0
  314. package/dist/utils/risk-scoring.js.map +1 -0
  315. package/dist/utils/tool-error-handler.d.ts +16 -0
  316. package/dist/utils/tool-error-handler.d.ts.map +1 -0
  317. package/dist/utils/tool-error-handler.js +43 -0
  318. package/dist/utils/tool-error-handler.js.map +1 -0
  319. package/dist/utils/tool-handler.d.ts +33 -0
  320. package/dist/utils/tool-handler.d.ts.map +1 -0
  321. package/dist/utils/tool-handler.js +59 -0
  322. package/dist/utils/tool-handler.js.map +1 -0
  323. package/dist/utils/tool-response.d.ts +16 -0
  324. package/dist/utils/tool-response.d.ts.map +1 -0
  325. package/dist/utils/tool-response.js +25 -0
  326. package/dist/utils/tool-response.js.map +1 -0
  327. package/dist/utils/validators.d.ts +359 -0
  328. package/dist/utils/validators.d.ts.map +1 -0
  329. package/dist/utils/validators.js +233 -0
  330. package/dist/utils/validators.js.map +1 -0
  331. package/dist/utils/yield-prediction.d.ts +69 -0
  332. package/dist/utils/yield-prediction.d.ts.map +1 -0
  333. package/dist/utils/yield-prediction.js +290 -0
  334. package/dist/utils/yield-prediction.js.map +1 -0
  335. package/package.json +83 -0
@@ -0,0 +1,248 @@
1
+ /**
2
+ * predict_yield Tool
3
+ *
4
+ * ML-based yield forecasting for vault APR prediction.
5
+ * Analyzes historical performance to predict future returns.
6
+ *
7
+ * Use cases:
8
+ * - Investment planning and return projections
9
+ * - Yield farming strategy optimization
10
+ * - Risk-adjusted return forecasting
11
+ * - Performance trend analysis
12
+ * - Performance: ~400-600 tokens per prediction
13
+ *
14
+ * Cache strategy:
15
+ * - 60-minute TTL (predictions valid for moderate duration)
16
+ * - Cache key: yield_prediction:{chainId}:{vaultAddress}:{timeRange}
17
+ * - Cache hit rate target: 75-85%
18
+ * - Cache tags: [CacheTag.VAULT, CacheTag.APR, CacheTag.ANALYTICS] for invalidation
19
+ */
20
+ import { getToolDisclaimer } from '../utils/disclaimers.js';
21
+ import * as PredictionQueries from '../graphql/queries/prediction.queries.js';
22
+ import { predictYield } from '../utils/yield-prediction.js';
23
+ import { executeToolWithCache } from '../utils/execute-tool-with-cache.js';
24
+ import { CacheTag } from '../core/cache-invalidation.js';
25
+ import { cacheTTL } from '../cache/index.js';
26
+ import { transformPeriodSummariesToAPRData, calculateAPRFromPriceChange, } from '../sdk/apr-service.js';
27
+ /**
28
+ * Time range constants (in seconds)
29
+ */
30
+ const TIME_RANGES = {
31
+ '7d': 7 * 24 * 60 * 60,
32
+ '30d': 30 * 24 * 60 * 60,
33
+ '90d': 90 * 24 * 60 * 60,
34
+ };
35
+ /**
36
+ * Format yield prediction as markdown
37
+ */
38
+ function formatYieldPrediction(prediction, vaultName, timeRange) {
39
+ const trendEmoji = {
40
+ increasing: '📈',
41
+ decreasing: '📉',
42
+ stable: '➡️',
43
+ }[prediction.trend];
44
+ const confidenceEmoji = prediction.confidence > 0.7 ? '🟢' : prediction.confidence > 0.4 ? '🟡' : '🔴';
45
+ const hasFeeData = prediction.feeAdjustedAPR !== undefined && prediction.feeImpact;
46
+ let output = `
47
+ ## Yield Prediction: ${vaultName}
48
+
49
+ ### Current Performance
50
+ - **Current APR**: ${Number(prediction.currentAPR).toFixed(2)}%
51
+ - **Predicted APR**: ${Number(prediction.predictedAPR).toFixed(2)}%${hasFeeData ? ` (Gross)` : ''}
52
+ ${hasFeeData ? `- **Predicted Net APR**: ${Number(prediction.feeAdjustedAPR).toFixed(2)}% (After Fees)` : ''}
53
+ - **Trend**: ${trendEmoji} ${prediction.trend.charAt(0).toUpperCase() + prediction.trend.slice(1)}
54
+ - **Confidence**: ${confidenceEmoji} ${(prediction.confidence * 100).toFixed(0)}%
55
+
56
+ ---
57
+ `;
58
+ if (hasFeeData) {
59
+ output += `
60
+ ### Fee Impact
61
+
62
+ - **Management Fee**: ${Number(prediction.feeImpact?.managementFee).toFixed(2)}% annually
63
+ - **Performance Fee**: ${Number(prediction.feeImpact?.performanceFee).toFixed(2)}%${prediction.feeImpact?.performanceFeeActive ? ' (Currently Active - Above High Water Mark)' : ' (Inactive - Below High Water Mark)'}
64
+ - **Total Annual Fee Drag**: ${Number(prediction.feeImpact?.totalAnnualFeeDrag).toFixed(2)}%
65
+ - **Net Impact**: Reduces predicted returns from ${Number(prediction.predictedAPR).toFixed(2)}% to ${Number(prediction.feeAdjustedAPR).toFixed(2)}%
66
+
67
+ ---
68
+ `;
69
+ }
70
+ output += `
71
+ ### Projected Returns
72
+
73
+ Based on ${timeRange} historical data:
74
+
75
+ `;
76
+ if (hasFeeData) {
77
+ output += `#### Gross Returns (Before Fees)
78
+
79
+ | Timeframe | Expected Return | Range (Min-Max) |
80
+ |-----------|----------------|-----------------|
81
+ ${prediction.projectedReturns
82
+ .map((p) => `| **${p.timeframe}** | ${p.expectedReturn.toFixed(2)}% | ${p.minReturn.toFixed(2)}% - ${p.maxReturn.toFixed(2)}% |`)
83
+ .join('\n')}
84
+
85
+ #### Net Returns (After Fees)
86
+
87
+ | Timeframe | Expected Return | Range (Min-Max) |
88
+ |-----------|----------------|-----------------|
89
+ ${prediction
90
+ .feeAdjustedReturns.map((p) => `| **${p.timeframe}** | ${p.expectedReturn.toFixed(2)}% | ${p.minReturn.toFixed(2)}% - ${p.maxReturn.toFixed(2)}% |`)
91
+ .join('\n')}
92
+ `;
93
+ }
94
+ else {
95
+ output += `| Timeframe | Expected Return | Range (Min-Max) |
96
+ |-----------|----------------|-----------------|
97
+ ${prediction.projectedReturns
98
+ .map((p) => `| **${p.timeframe}** | ${p.expectedReturn.toFixed(2)}% | ${p.minReturn.toFixed(2)}% - ${p.maxReturn.toFixed(2)}% |`)
99
+ .join('\n')}
100
+ `;
101
+ }
102
+ output += `
103
+ ---
104
+
105
+ ### Key Insights
106
+
107
+ ${prediction.insights.map((insight) => `- ${insight}`).join('\n')}
108
+
109
+ ---
110
+
111
+ ### Methodology
112
+
113
+ This prediction uses:
114
+ - **Linear Regression**: Long-term trend analysis
115
+ - **Exponential Moving Averages**: Short-term momentum
116
+ - **Volatility Analysis**: Confidence interval calculation
117
+ - **Historical Data**: ${timeRange} performance window
118
+
119
+ **Note**: Predictions are estimates based on historical performance. Actual returns may vary due to market conditions, protocol changes, and external factors.
120
+ `;
121
+ return output;
122
+ }
123
+ /**
124
+ * Transform raw GraphQL response into yield prediction markdown output
125
+ * Uses closure to capture input values
126
+ */
127
+ function createTransformYieldPredictionData(input, timestampThreshold) {
128
+ return (data) => {
129
+ // Prepare historical data points
130
+ const historicalData = [];
131
+ // Transform performance history to period summaries for SDK
132
+ if (data.performanceHistory && data.performanceHistory.items.length > 0) {
133
+ const periodSummaries = data.performanceHistory.items
134
+ .filter((item) => parseInt(item.timestamp, 10) >= timestampThreshold)
135
+ .map((item) => ({
136
+ timestamp: item.timestamp,
137
+ totalAssetsAtStart: item.data.totalAssetsAtStart,
138
+ totalSupplyAtStart: item.data.totalSupplyAtStart,
139
+ }));
140
+ // Use SDK to calculate APR from period summaries
141
+ const aprData = transformPeriodSummariesToAPRData(periodSummaries, data.vault);
142
+ // Calculate APR for each data point using SDK functions
143
+ for (const item of data.performanceHistory.items) {
144
+ const timestamp = parseInt(item.timestamp, 10);
145
+ if (timestamp >= timestampThreshold) {
146
+ // Calculate price per share at this point
147
+ const historicalPeriod = {
148
+ timestamp: item.timestamp,
149
+ totalAssetsAtStart: item.data.totalAssetsAtStart,
150
+ totalSupplyAtStart: item.data.totalSupplyAtStart,
151
+ };
152
+ // Use inception point as baseline for historical APR calculation
153
+ if (aprData.inception) {
154
+ const daysElapsed = (timestamp - aprData.inception.timestamp) / (24 * 60 * 60);
155
+ if (daysElapsed > 0) {
156
+ // Calculate price per share for this period using SDK helper
157
+ const historicalAPRData = transformPeriodSummariesToAPRData([historicalPeriod], data.vault);
158
+ if (historicalAPRData.inception) {
159
+ const apr = calculateAPRFromPriceChange(aprData.inception.pricePerShare, historicalAPRData.inception.pricePerShare, daysElapsed);
160
+ historicalData.push({
161
+ timestamp,
162
+ apr: apr, // APR as percentage
163
+ tvl: Number(item.data.totalAssetsAtEnd),
164
+ });
165
+ }
166
+ }
167
+ }
168
+ }
169
+ }
170
+ }
171
+ // Extract fee data for fee-adjusted predictions
172
+ const managementFee = data.vault.state?.managementFee || 0;
173
+ const performanceFee = data.vault.state?.performanceFee || 0;
174
+ const pricePerShare = BigInt(data.vault.state?.pricePerShare || '0');
175
+ const highWaterMark = BigInt(data.vault.state?.highWaterMark || '0');
176
+ const performanceFeeActive = pricePerShare > highWaterMark;
177
+ // Only pass fee parameters if vault has meaningful fees
178
+ const hasFees = managementFee > 0 || performanceFee > 0;
179
+ // Perform yield prediction with optional fee parameters
180
+ const prediction = predictYield(historicalData, hasFees
181
+ ? {
182
+ managementFee,
183
+ performanceFee,
184
+ performanceFeeActive,
185
+ }
186
+ : undefined);
187
+ // Format prediction as markdown
188
+ const markdown = formatYieldPrediction(prediction, data.vault.name || 'Unknown Vault', input.timeRange);
189
+ return { markdown };
190
+ };
191
+ }
192
+ /**
193
+ * Create the executePredictYield function with DI container
194
+ *
195
+ * @param container - Service container with dependencies
196
+ * @returns Configured tool executor function
197
+ */
198
+ export function createExecutePredictYield(container) {
199
+ return async (input) => {
200
+ // Calculate timestamp threshold for time range
201
+ const nowTimestamp = Math.floor(Date.now() / 1000);
202
+ const timeRangeSeconds = TIME_RANGES[input.timeRange];
203
+ const timestampThreshold = nowTimestamp - timeRangeSeconds;
204
+ // Determine response format (default to 'quick')
205
+ const responseFormat = input.responseFormat === 'detailed' ? 'detailed' : 'quick';
206
+ // Create dynamic query based on responseFormat
207
+ const query = PredictionQueries.createYieldPredictionQuery(responseFormat);
208
+ const executor = executeToolWithCache({
209
+ container,
210
+ cacheKey: (input) => `yield_prediction:${input.chainId}:${input.vaultAddress}:${input.timeRange}:${input.responseFormat || 'quick'}`,
211
+ cacheTTL: cacheTTL.yieldPrediction,
212
+ query,
213
+ variables: () => ({
214
+ vaultAddress: input.vaultAddress,
215
+ chainId: input.chainId,
216
+ }),
217
+ validateResult: (data) => ({
218
+ valid: !!data.vault,
219
+ message: data.vault
220
+ ? undefined
221
+ : `No vault found at address ${input.vaultAddress} on chain ${input.chainId}`,
222
+ }),
223
+ transformResult: createTransformYieldPredictionData(input, timestampThreshold),
224
+ toolName: 'predict_yield',
225
+ });
226
+ // Register cache tags for invalidation
227
+ const cacheKey = `yield_prediction:${input.chainId}:${input.vaultAddress}:${input.timeRange}:${input.responseFormat || 'quick'}`;
228
+ container.cacheInvalidator.register(cacheKey, [
229
+ CacheTag.VAULT,
230
+ CacheTag.APR,
231
+ CacheTag.ANALYTICS,
232
+ ]);
233
+ // Execute and get result
234
+ const result = await executor(input);
235
+ // Transform JSON output to markdown text format with legal disclaimer
236
+ if (!result.isError && result.content[0]?.type === 'text') {
237
+ try {
238
+ const output = JSON.parse(result.content[0].text);
239
+ result.content[0].text = output.markdown + getToolDisclaimer('predict_yield');
240
+ }
241
+ catch (error) {
242
+ console.error('Failed to parse yield prediction output:', error);
243
+ }
244
+ }
245
+ return result;
246
+ };
247
+ }
248
+ //# sourceMappingURL=predict-yield.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predict-yield.js","sourceRoot":"","sources":["../../src/tools/predict-yield.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * query_graphql Tool
3
+ *
4
+ * Direct GraphQL query execution for power users and large datasets.
5
+ * No caching - designed for unpredictable, custom queries.
6
+ *
7
+ * Use cases:
8
+ * - Custom queries with specific field selection
9
+ * - Large dataset queries (20+ vaults)
10
+ * - One-time analysis queries
11
+ * - Advanced filtering and aggregation
12
+ *
13
+ * WHY NO CACHING?
14
+ * This tool is intentionally non-cached because:
15
+ * 1. Query content is unpredictable (user-controlled)
16
+ * 2. Results are typically one-time use
17
+ * 3. Large datasets would waste cache memory
18
+ * 4. Fresh data is required (no staleness tolerance)
19
+ */
20
+ import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
21
+ import { QueryGraphQLInput } from '../utils/validators.js';
22
+ import { ServiceContainer } from '../core/container.js';
23
+ /**
24
+ * Create the executeQueryGraphQL function with DI container
25
+ *
26
+ * This factory function demonstrates the lightweight pattern for non-cached tools:
27
+ * 1. Dependency injection for testability
28
+ * 2. No caching overhead (inappropriate for unpredictable queries)
29
+ * 3. Simple, focused implementation
30
+ *
31
+ * @param container - Service container with dependencies
32
+ * @returns Configured tool executor function
33
+ */
34
+ export declare function createExecuteQueryGraphQL(container: ServiceContainer): (input: QueryGraphQLInput) => Promise<CallToolResult>;
35
+ //# sourceMappingURL=query-graphql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-graphql.d.ts","sourceRoot":"","sources":["../../src/tools/query-graphql.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,gBAAgB,GAC1B,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,cAAc,CAAC,CAoBvD"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * query_graphql Tool
3
+ *
4
+ * Direct GraphQL query execution for power users and large datasets.
5
+ * No caching - designed for unpredictable, custom queries.
6
+ *
7
+ * Use cases:
8
+ * - Custom queries with specific field selection
9
+ * - Large dataset queries (20+ vaults)
10
+ * - One-time analysis queries
11
+ * - Advanced filtering and aggregation
12
+ *
13
+ * WHY NO CACHING?
14
+ * This tool is intentionally non-cached because:
15
+ * 1. Query content is unpredictable (user-controlled)
16
+ * 2. Results are typically one-time use
17
+ * 3. Large datasets would waste cache memory
18
+ * 4. Fresh data is required (no staleness tolerance)
19
+ */
20
+ import { getToolDisclaimer } from '../utils/disclaimers.js';
21
+ import { handleToolError } from '../utils/tool-error-handler.js';
22
+ /**
23
+ * Create the executeQueryGraphQL function with DI container
24
+ *
25
+ * This factory function demonstrates the lightweight pattern for non-cached tools:
26
+ * 1. Dependency injection for testability
27
+ * 2. No caching overhead (inappropriate for unpredictable queries)
28
+ * 3. Simple, focused implementation
29
+ *
30
+ * @param container - Service container with dependencies
31
+ * @returns Configured tool executor function
32
+ */
33
+ export function createExecuteQueryGraphQL(container) {
34
+ return async (input) => {
35
+ try {
36
+ // Execute GraphQL query using injected client
37
+ const data = await container.graphqlClient.request(input.query, input.variables);
38
+ // Return successful response with pretty-printed JSON and legal disclaimer
39
+ return {
40
+ content: [
41
+ {
42
+ type: 'text',
43
+ text: JSON.stringify(data, null, 2) + getToolDisclaimer('query_graphql'),
44
+ },
45
+ ],
46
+ isError: false,
47
+ };
48
+ }
49
+ catch (error) {
50
+ return handleToolError(error, 'query_graphql');
51
+ }
52
+ };
53
+ }
54
+ //# sourceMappingURL=query-graphql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-graphql.js","sourceRoot":"","sources":["../../src/tools/query-graphql.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAG5D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,yBAAyB,CACvC,SAA2B;IAE3B,OAAO,KAAK,EAAE,KAAwB,EAA2B,EAAE;QACjE,IAAI,CAAC;YACH,8CAA8C;YAC9C,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YAEjF,2EAA2E;YAC3E,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,iBAAiB,CAAC,eAAe,CAAC;qBACzE;iBACF;gBACD,OAAO,EAAE,KAAK;aACf,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,eAAe,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Unified Tool Registry
3
+ *
4
+ * Single source of truth for all MCP tool definitions.
5
+ * Eliminates duplication between tools/index.ts and server.ts registration.
6
+ */
7
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
8
+ import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
9
+ import { ZodSchema } from 'zod';
10
+ import { ServiceContainer } from '../core/container.js';
11
+ /**
12
+ * Tool definition with type safety
13
+ * Now uses factory functions that accept ServiceContainer
14
+ */
15
+ export interface ToolDefinition<TInput = unknown> {
16
+ name: string;
17
+ description: string;
18
+ schema: ZodSchema<TInput>;
19
+ executorFactory: (container: ServiceContainer) => (input: TInput) => Promise<CallToolResult>;
20
+ }
21
+ /**
22
+ * Complete tool registry
23
+ * Single source of truth for tool metadata and handlers
24
+ */
25
+ export declare const TOOL_REGISTRY: ToolDefinition<any>[];
26
+ /**
27
+ * Register all tools with the MCP server
28
+ * Converts registry entries to MCP tool registrations
29
+ *
30
+ * @param server - MCP server instance
31
+ * @param container - Service container with dependencies (GraphQL client, cache, config)
32
+ */
33
+ export declare function registerTools(server: McpServer, container: ServiceContainer): void;
34
+ /**
35
+ * Get tool names for listing
36
+ */
37
+ export declare function getToolNames(): string[];
38
+ /**
39
+ * Find tool by name
40
+ */
41
+ export declare function findTool(name: string): ToolDefinition | undefined;
42
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,SAAS,EAA0B,MAAM,KAAK,CAAC;AAkBxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAqBxD;;;GAGG;AACH,MAAM,WAAW,cAAc,CAAC,MAAM,GAAG,OAAO;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1B,eAAe,EAAE,CAAC,SAAS,EAAE,gBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;CAC9F;AAED;;;GAGG;AAEH,eAAO,MAAM,aAAa,EAAE,cAAc,CAAC,GAAG,CAAC,EA0K9C,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,GAAG,IAAI,CA8BlF;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAEvC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEjE"}
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Unified Tool Registry
3
+ *
4
+ * Single source of truth for all MCP tool definitions.
5
+ * Eliminates duplication between tools/index.ts and server.ts registration.
6
+ */
7
+ import { ZodObject } from 'zod';
8
+ // Tool factory functions
9
+ import { createExecuteQueryGraphQL } from './query-graphql.js';
10
+ import { createExecuteGetVaultData } from './vault-data.js';
11
+ import { createExecuteGetUserPortfolio } from './user-portfolio.js';
12
+ import { createExecuteSearchVaults } from './search-vaults.js';
13
+ import { createExecuteGetVaultPerformance } from './vault-performance.js';
14
+ import { createExecuteGetTransactions } from './get-transactions.js';
15
+ import { createExecuteCompareVaults } from './compare-vaults.js';
16
+ import { createExecuteGetPriceHistory } from './get-price-history.js';
17
+ import { createExecuteExportData } from './export-data.js';
18
+ import { createExecuteAnalyzeRisk } from './analyze-risk.js';
19
+ import { createExecutePredictYield } from './predict-yield.js';
20
+ import { createExecuteOptimizePortfolio } from './optimize-portfolio.js';
21
+ import { createExecuteSimulateVault, simulateVaultInputSchema } from './simulate-vault.js';
22
+ // Input schemas
23
+ import { queryGraphQLInputSchema, getVaultDataInputSchema, getUserPortfolioInputSchema, searchVaultsInputSchema, getVaultPerformanceInputSchema, getTransactionsInputSchema, compareVaultsInputSchema, priceHistoryInputSchema, exportDataInputSchema, analyzeRiskInputSchema, predictYieldInputSchema, optimizePortfolioInputSchema, } from '../utils/validators.js';
24
+ // Tool utilities
25
+ import { createToolHandler } from '../utils/tool-handler.js';
26
+ /**
27
+ * Complete tool registry
28
+ * Single source of truth for tool metadata and handlers
29
+ */
30
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
31
+ export const TOOL_REGISTRY = [
32
+ {
33
+ name: 'query_graphql',
34
+ description: 'Execute raw GraphQL queries against the Lagoon backend. ' +
35
+ 'Use for custom queries with specific field selection, large datasets (20+ vaults), ' +
36
+ 'or advanced filtering. No caching - results are always fresh. ' +
37
+ 'Requires GraphQL query syntax knowledge.',
38
+ schema: queryGraphQLInputSchema,
39
+ executorFactory: createExecuteQueryGraphQL,
40
+ },
41
+ {
42
+ name: 'get_vault_data',
43
+ description: 'Fetch complete vault information with 15-minute caching. ' +
44
+ 'Optimized for detailed analysis of 1-5 vaults. ' +
45
+ 'Returns all vault fields including asset info, financial metrics, curator details, and metadata. ' +
46
+ 'Best for: small vault sets, repeated queries, comprehensive analysis. ' +
47
+ 'Performance: ~500 tokens per vault.',
48
+ schema: getVaultDataInputSchema,
49
+ executorFactory: createExecuteGetVaultData,
50
+ },
51
+ {
52
+ name: 'get_user_portfolio',
53
+ description: 'Fetch user portfolio with 5-minute caching. ' +
54
+ 'Automatically queries all supported chains via the users API. ' +
55
+ 'Returns sorted positions by USD value with complete vault data for each position. ' +
56
+ 'Best for: multi-chain portfolio analysis, user position tracking, portfolio value aggregation. ' +
57
+ 'Performance: ~300-800 tokens per user (varies with position count).',
58
+ schema: getUserPortfolioInputSchema,
59
+ executorFactory: createExecuteGetUserPortfolio,
60
+ },
61
+ {
62
+ name: 'search_vaults',
63
+ description: 'Search and filter vaults with advanced criteria and 10-minute caching. ' +
64
+ 'Supports 20+ filter options including asset, chain, TVL, curator, visibility. ' +
65
+ 'Returns paginated results (default 100, max 1000) with sort options. ' +
66
+ 'Best for: vault discovery, filtering by criteria, TVL-sorted lists, multi-vault analysis. ' +
67
+ 'Performance: ~300-500 tokens per page. ' +
68
+ 'Cache key based on filter hash for efficient repeated searches.',
69
+ schema: searchVaultsInputSchema,
70
+ executorFactory: createExecuteSearchVaults,
71
+ },
72
+ {
73
+ name: 'get_vault_performance',
74
+ description: 'Historical metrics and trend analysis for vaults with 30-minute caching. ' +
75
+ 'Aggregates transaction data (TotalAssetsUpdated, PeriodSummary) for time-series analysis. ' +
76
+ 'Supports 4 time ranges: 7d, 30d, 90d, 1y. ' +
77
+ 'Returns metrics array with timestamps and TVL, plus summary statistics (start/end value, % change, volume). ' +
78
+ 'Best for: performance tracking, trend analysis, TVL history, inflection point identification. ' +
79
+ 'Performance: ~400-600 tokens per vault per time range. ' +
80
+ 'Fetches up to 1000 transactions per query.',
81
+ schema: getVaultPerformanceInputSchema,
82
+ executorFactory: createExecuteGetVaultPerformance,
83
+ },
84
+ {
85
+ name: 'get_transactions',
86
+ description: 'Query vault transaction history with flexible filtering, pagination, and ordering. ' +
87
+ 'Supports all transaction types: deposits (SettleDeposit, DepositRequest, DepositSync), ' +
88
+ 'redemptions (SettleRedeem, RedeemRequest, DepositRequestCanceled), ' +
89
+ 'state changes (TotalAssetsUpdated, NewTotalAssetsUpdated, PeriodSummary), ' +
90
+ 'and configuration updates (RatesUpdated, StateUpdated). ' +
91
+ 'Returns detailed transaction data with timestamps, block numbers, hashes, and type-specific fields. ' +
92
+ 'Best for: analyzing historical vault activity, tracking user deposits/withdrawals, monitoring state changes, generating transaction reports. ' +
93
+ 'Performance: ~400-600 tokens per query (varies with transaction count). ' +
94
+ 'Features 15-minute caching and pagination support (default 100, max 1000).',
95
+ schema: getTransactionsInputSchema,
96
+ executorFactory: createExecuteGetTransactions,
97
+ },
98
+ {
99
+ name: 'compare_vaults',
100
+ description: 'Compare multiple vaults side-by-side with normalized metrics and rankings (2-10 vaults). ' +
101
+ 'Provides comprehensive comparison including TVL, APR, overall performance scores, and percentile rankings. ' +
102
+ 'Calculates deltas from averages and identifies best/worst performers automatically. ' +
103
+ 'Returns formatted comparison table with summary statistics and individual vault rankings. ' +
104
+ 'Best for: evaluating investment opportunities, identifying top performers, risk-adjusted return analysis, portfolio construction. ' +
105
+ 'Performance: ~300 tokens per vault. ' +
106
+ 'Features 15-minute caching based on vault address combinations.',
107
+ schema: compareVaultsInputSchema,
108
+ executorFactory: createExecuteCompareVaults,
109
+ },
110
+ {
111
+ name: 'get_price_history',
112
+ description: 'Fetch historical price data for vault shares with OHLCV (Open, High, Low, Close, Volume) time-series analysis. ' +
113
+ 'Aggregates price data by day for cleaner visualization and provides comprehensive price statistics. ' +
114
+ 'Calculates volatility (standard deviation), percent changes, and identifies price trends over time. ' +
115
+ 'Returns formatted price history table with daily OHLCV data and statistical summary. ' +
116
+ 'Best for: price trend analysis, volatility assessment, historical price point identification, entry/exit decision support. ' +
117
+ 'Performance: ~300-500 tokens per vault per time range. ' +
118
+ 'Features 30-minute caching for historical data. ' +
119
+ 'Time ranges: 7d (7 days), 30d (30 days), 90d (90 days), 1y (1 year), all (complete history).',
120
+ schema: priceHistoryInputSchema,
121
+ executorFactory: createExecuteGetPriceHistory,
122
+ },
123
+ {
124
+ name: 'export_data',
125
+ description: 'Export vault data, transactions, price history, or performance metrics in CSV or JSON format for external analysis. ' +
126
+ 'Supports multiple data types: vaults (vault info with TVL/APR), transactions (deposit/redeem history), ' +
127
+ 'price_history (OHLCV time-series), performance (TVL metrics over time). ' +
128
+ 'Formats: CSV (RFC 4180 compliant with proper escaping) or JSON (structured objects). ' +
129
+ 'Returns formatted data ready for import into spreadsheets, databases, or analytics tools. ' +
130
+ 'Best for: spreadsheet analysis, reporting, custom analytics, data integration with external tools, accounting records. ' +
131
+ 'Performance: ~200-400 tokens per export depending on data size. ' +
132
+ 'No caching (exports generated on-demand with latest data). ' +
133
+ 'Up to 1000 records per export.',
134
+ schema: exportDataInputSchema,
135
+ executorFactory: createExecuteExportData,
136
+ },
137
+ {
138
+ name: 'analyze_risk',
139
+ description: 'Analyze vault risk with multi-factor scoring across TVL, concentration, volatility, age, and curator reputation. ' +
140
+ 'Provides comprehensive risk assessment with individual factor breakdowns and overall risk level (Low/Medium/High/Critical). ' +
141
+ 'Evaluates: TVL risk (liquidity and market validation), concentration risk (protocol-wide exposure), ' +
142
+ 'volatility risk (price stability), age risk (operational track record), curator risk (reputation and experience). ' +
143
+ 'Returns detailed risk analysis with scores (0-1 scale), risk levels with emoji indicators, and factor explanations. ' +
144
+ 'Best for: investment decision-making, due diligence, portfolio risk monitoring, comparative vault analysis. ' +
145
+ 'Performance: ~400-600 tokens per analysis. ' +
146
+ 'Features 15-minute caching for risk stability.',
147
+ schema: analyzeRiskInputSchema,
148
+ executorFactory: createExecuteAnalyzeRisk,
149
+ },
150
+ {
151
+ name: 'predict_yield',
152
+ description: 'Predict vault yield with ML-based forecasting using trend analysis and historical performance. ' +
153
+ 'Analyzes APR trends using linear regression, exponential moving averages, and volatility analysis. ' +
154
+ 'Provides projected returns for multiple timeframes (7d, 30d, 90d, 1y) with confidence intervals. ' +
155
+ 'Returns current APR, predicted APR, trend direction, confidence score, and detailed insights. ' +
156
+ 'Best for: investment planning, yield farming optimization, return projections, performance trend analysis. ' +
157
+ 'Performance: ~400-600 tokens per prediction. ' +
158
+ 'Features 60-minute caching for prediction stability.',
159
+ schema: predictYieldInputSchema,
160
+ executorFactory: createExecutePredictYield,
161
+ },
162
+ {
163
+ name: 'optimize_portfolio',
164
+ description: 'Optimize portfolio allocation with rebalancing recommendations using multiple strategies. ' +
165
+ 'Analyzes current holdings and provides optimal allocation based on selected strategy: ' +
166
+ 'equal_weight (maximum diversification), risk_parity (balanced risk contribution), ' +
167
+ 'max_sharpe (risk-adjusted returns), min_variance (minimized volatility). ' +
168
+ 'Returns target allocations, rebalancing actions, portfolio metrics (expected return, risk, Sharpe ratio, diversification). ' +
169
+ 'Calculates exact buy/sell amounts and identifies positions requiring adjustment. ' +
170
+ 'Best for: portfolio rebalancing, risk-adjusted allocation, diversification improvement, performance optimization. ' +
171
+ 'Performance: ~600-800 tokens per optimization. ' +
172
+ 'Features 30-minute caching for optimization stability.',
173
+ schema: optimizePortfolioInputSchema,
174
+ executorFactory: createExecuteOptimizePortfolio,
175
+ },
176
+ {
177
+ name: 'simulate_vault',
178
+ description: 'Simulate vault behavior with different parameters for scenario analysis and planning. ' +
179
+ 'Tests various scenarios including deposit/redemption amounts, fee structures, and yield rates. ' +
180
+ 'Provides projected outcomes for investment strategies and risk scenarios. ' +
181
+ 'Returns detailed simulation results with before/after comparisons and key metrics. ' +
182
+ 'Best for: strategy testing, investment planning, fee impact analysis, "what-if" scenarios. ' +
183
+ 'Performance: ~300-500 tokens per simulation. ' +
184
+ 'No caching (simulations are scenario-specific).',
185
+ schema: simulateVaultInputSchema,
186
+ executorFactory: createExecuteSimulateVault,
187
+ },
188
+ ];
189
+ /**
190
+ * Register all tools with the MCP server
191
+ * Converts registry entries to MCP tool registrations
192
+ *
193
+ * @param server - MCP server instance
194
+ * @param container - Service container with dependencies (GraphQL client, cache, config)
195
+ */
196
+ export function registerTools(server, container) {
197
+ for (const tool of TOOL_REGISTRY) {
198
+ // Create executor from factory with injected container
199
+ const executor = tool.executorFactory(container);
200
+ // Create wrapped handler with validation
201
+ const handler = createToolHandler(executor, tool.schema);
202
+ // Extract raw shape from Zod schema for MCP registration
203
+ // The MCP SDK expects a ZodRawShape, not a complete schema or JSON Schema
204
+ // The SDK will wrap this with z.object() internally
205
+ // We use type assertion here because ZodObject's shape property is typed as any in the library
206
+ // but we know it's safe because we're checking the instance type
207
+ const inputShape = tool.schema instanceof ZodObject
208
+ ? tool.schema.shape
209
+ : (() => {
210
+ throw new Error(`Tool ${tool.name} schema must be a ZodObject`);
211
+ })();
212
+ // Register with server
213
+ server.registerTool(tool.name, {
214
+ description: tool.description,
215
+ inputSchema: inputShape,
216
+ }, handler);
217
+ }
218
+ }
219
+ /**
220
+ * Get tool names for listing
221
+ */
222
+ export function getToolNames() {
223
+ return TOOL_REGISTRY.map((tool) => tool.name);
224
+ }
225
+ /**
226
+ * Find tool by name
227
+ */
228
+ export function findTool(name) {
229
+ return TOOL_REGISTRY.find((tool) => tool.name === name);
230
+ }
231
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}