@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.
- package/LICENSE +201 -0
- package/README.md +618 -0
- package/dist/cache/index.d.ts +97 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +106 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/config.d.ts +34 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +40 -0
- package/dist/config.js.map +1 -0
- package/dist/core/cache-adapter.d.ts +73 -0
- package/dist/core/cache-adapter.d.ts.map +1 -0
- package/dist/core/cache-adapter.js +47 -0
- package/dist/core/cache-adapter.js.map +1 -0
- package/dist/core/cache-invalidation.d.ts +72 -0
- package/dist/core/cache-invalidation.d.ts.map +1 -0
- package/dist/core/cache-invalidation.js +114 -0
- package/dist/core/cache-invalidation.js.map +1 -0
- package/dist/core/container.d.ts +34 -0
- package/dist/core/container.d.ts.map +1 -0
- package/dist/core/container.js +75 -0
- package/dist/core/container.js.map +1 -0
- package/dist/graphql/client.d.ts +32 -0
- package/dist/graphql/client.d.ts.map +1 -0
- package/dist/graphql/client.js +49 -0
- package/dist/graphql/client.js.map +1 -0
- package/dist/graphql/fragments/apr-breakdown.fragment.d.ts +64 -0
- package/dist/graphql/fragments/apr-breakdown.fragment.d.ts.map +1 -0
- package/dist/graphql/fragments/apr-breakdown.fragment.js +62 -0
- package/dist/graphql/fragments/apr-breakdown.fragment.js.map +1 -0
- package/dist/graphql/fragments/asset-info.fragment.d.ts +18 -0
- package/dist/graphql/fragments/asset-info.fragment.d.ts.map +1 -0
- package/dist/graphql/fragments/asset-info.fragment.js +36 -0
- package/dist/graphql/fragments/asset-info.fragment.js.map +1 -0
- package/dist/graphql/fragments/chain-info.fragment.d.ts +18 -0
- package/dist/graphql/fragments/chain-info.fragment.d.ts.map +1 -0
- package/dist/graphql/fragments/chain-info.fragment.js +32 -0
- package/dist/graphql/fragments/chain-info.fragment.js.map +1 -0
- package/dist/graphql/fragments/index.d.ts +15 -0
- package/dist/graphql/fragments/index.d.ts.map +1 -0
- package/dist/graphql/fragments/index.js +21 -0
- package/dist/graphql/fragments/index.js.map +1 -0
- package/dist/graphql/fragments/pageinfo.fragment.d.ts +33 -0
- package/dist/graphql/fragments/pageinfo.fragment.d.ts.map +1 -0
- package/dist/graphql/fragments/pageinfo.fragment.js +47 -0
- package/dist/graphql/fragments/pageinfo.fragment.js.map +1 -0
- package/dist/graphql/fragments/transaction-base.fragment.d.ts +19 -0
- package/dist/graphql/fragments/transaction-base.fragment.d.ts.map +1 -0
- package/dist/graphql/fragments/transaction-base.fragment.js +32 -0
- package/dist/graphql/fragments/transaction-base.fragment.js.map +1 -0
- package/dist/graphql/fragments/vault-list.fragment.d.ts +53 -0
- package/dist/graphql/fragments/vault-list.fragment.d.ts.map +1 -0
- package/dist/graphql/fragments/vault-list.fragment.js +51 -0
- package/dist/graphql/fragments/vault-list.fragment.js.map +1 -0
- package/dist/graphql/fragments/vault-summary.fragment.d.ts +68 -0
- package/dist/graphql/fragments/vault-summary.fragment.d.ts.map +1 -0
- package/dist/graphql/fragments/vault-summary.fragment.js +66 -0
- package/dist/graphql/fragments/vault-summary.fragment.js.map +1 -0
- package/dist/graphql/fragments/vault.fragment.d.ts +133 -0
- package/dist/graphql/fragments/vault.fragment.d.ts.map +1 -0
- package/dist/graphql/fragments/vault.fragment.js +119 -0
- package/dist/graphql/fragments/vault.fragment.js.map +1 -0
- package/dist/graphql/fragments.d.ts +183 -0
- package/dist/graphql/fragments.d.ts.map +1 -0
- package/dist/graphql/fragments.js +297 -0
- package/dist/graphql/fragments.js.map +1 -0
- package/dist/graphql/queries/export.queries.d.ts +72 -0
- package/dist/graphql/queries/export.queries.d.ts.map +1 -0
- package/dist/graphql/queries/export.queries.js +202 -0
- package/dist/graphql/queries/export.queries.js.map +1 -0
- package/dist/graphql/queries/index.d.ts +15 -0
- package/dist/graphql/queries/index.d.ts.map +1 -0
- package/dist/graphql/queries/index.js +23 -0
- package/dist/graphql/queries/index.js.map +1 -0
- package/dist/graphql/queries/performance.queries.d.ts +63 -0
- package/dist/graphql/queries/performance.queries.d.ts.map +1 -0
- package/dist/graphql/queries/performance.queries.js +133 -0
- package/dist/graphql/queries/performance.queries.js.map +1 -0
- package/dist/graphql/queries/period-summaries.d.ts +15 -0
- package/dist/graphql/queries/period-summaries.d.ts.map +1 -0
- package/dist/graphql/queries/period-summaries.js +24 -0
- package/dist/graphql/queries/period-summaries.js.map +1 -0
- package/dist/graphql/queries/portfolio.queries.d.ts +78 -0
- package/dist/graphql/queries/portfolio.queries.d.ts.map +1 -0
- package/dist/graphql/queries/portfolio.queries.js +198 -0
- package/dist/graphql/queries/portfolio.queries.js.map +1 -0
- package/dist/graphql/queries/prediction.queries.d.ts +38 -0
- package/dist/graphql/queries/prediction.queries.d.ts.map +1 -0
- package/dist/graphql/queries/prediction.queries.js +100 -0
- package/dist/graphql/queries/prediction.queries.js.map +1 -0
- package/dist/graphql/queries/risk.queries.d.ts +37 -0
- package/dist/graphql/queries/risk.queries.d.ts.map +1 -0
- package/dist/graphql/queries/risk.queries.js +90 -0
- package/dist/graphql/queries/risk.queries.js.map +1 -0
- package/dist/graphql/queries/search.queries.d.ts +61 -0
- package/dist/graphql/queries/search.queries.d.ts.map +1 -0
- package/dist/graphql/queries/search.queries.js +103 -0
- package/dist/graphql/queries/search.queries.js.map +1 -0
- package/dist/graphql/queries/transaction.queries.d.ts +60 -0
- package/dist/graphql/queries/transaction.queries.d.ts.map +1 -0
- package/dist/graphql/queries/transaction.queries.js +252 -0
- package/dist/graphql/queries/transaction.queries.js.map +1 -0
- package/dist/graphql/queries/vault.queries.d.ts +54 -0
- package/dist/graphql/queries/vault.queries.d.ts.map +1 -0
- package/dist/graphql/queries/vault.queries.js +78 -0
- package/dist/graphql/queries/vault.queries.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/competitor-comparison.d.ts +8 -0
- package/dist/prompts/competitor-comparison.d.ts.map +1 -0
- package/dist/prompts/competitor-comparison.js +432 -0
- package/dist/prompts/competitor-comparison.js.map +1 -0
- package/dist/prompts/curator-performance.d.ts +8 -0
- package/dist/prompts/curator-performance.d.ts.map +1 -0
- package/dist/prompts/curator-performance.js +383 -0
- package/dist/prompts/curator-performance.js.map +1 -0
- package/dist/prompts/financial-analysis.d.ts +8 -0
- package/dist/prompts/financial-analysis.d.ts.map +1 -0
- package/dist/prompts/financial-analysis.js +480 -0
- package/dist/prompts/financial-analysis.js.map +1 -0
- package/dist/prompts/index.d.ts +21 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +50 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/onboarding-first-vault.d.ts +8 -0
- package/dist/prompts/onboarding-first-vault.d.ts.map +1 -0
- package/dist/prompts/onboarding-first-vault.js +317 -0
- package/dist/prompts/onboarding-first-vault.js.map +1 -0
- package/dist/prompts/portfolio-optimization.d.ts +8 -0
- package/dist/prompts/portfolio-optimization.d.ts.map +1 -0
- package/dist/prompts/portfolio-optimization.js +412 -0
- package/dist/prompts/portfolio-optimization.js.map +1 -0
- package/dist/prompts/protocol-overview.d.ts +8 -0
- package/dist/prompts/protocol-overview.d.ts.map +1 -0
- package/dist/prompts/protocol-overview.js +398 -0
- package/dist/prompts/protocol-overview.js.map +1 -0
- package/dist/prompts/shared/disclaimers.d.ts +54 -0
- package/dist/prompts/shared/disclaimers.d.ts.map +1 -0
- package/dist/prompts/shared/disclaimers.js +400 -0
- package/dist/prompts/shared/disclaimers.js.map +1 -0
- package/dist/resources/glossary.d.ts +8 -0
- package/dist/resources/glossary.d.ts.map +1 -0
- package/dist/resources/glossary.js +407 -0
- package/dist/resources/glossary.js.map +1 -0
- package/dist/resources/index.d.ts +18 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +29 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/schema.d.ts +22 -0
- package/dist/resources/schema.d.ts.map +1 -0
- package/dist/resources/schema.js +67 -0
- package/dist/resources/schema.js.map +1 -0
- package/dist/schemas/config.schema.d.ts +46 -0
- package/dist/schemas/config.schema.d.ts.map +1 -0
- package/dist/schemas/config.schema.js +48 -0
- package/dist/schemas/config.schema.js.map +1 -0
- package/dist/sdk/__tests__/apr-service.test.d.ts +7 -0
- package/dist/sdk/__tests__/apr-service.test.d.ts.map +1 -0
- package/dist/sdk/__tests__/apr-service.test.js +385 -0
- package/dist/sdk/__tests__/apr-service.test.js.map +1 -0
- package/dist/sdk/__tests__/math-utils.test.d.ts +7 -0
- package/dist/sdk/__tests__/math-utils.test.d.ts.map +1 -0
- package/dist/sdk/__tests__/math-utils.test.js +185 -0
- package/dist/sdk/__tests__/math-utils.test.js.map +1 -0
- package/dist/sdk/__tests__/simulation-service.test.d.ts +5 -0
- package/dist/sdk/__tests__/simulation-service.test.d.ts.map +1 -0
- package/dist/sdk/__tests__/simulation-service.test.js +397 -0
- package/dist/sdk/__tests__/simulation-service.test.js.map +1 -0
- package/dist/sdk/__tests__/vault-utils.test.d.ts +7 -0
- package/dist/sdk/__tests__/vault-utils.test.d.ts.map +1 -0
- package/dist/sdk/__tests__/vault-utils.test.js +189 -0
- package/dist/sdk/__tests__/vault-utils.test.js.map +1 -0
- package/dist/sdk/apr-service.d.ts +101 -0
- package/dist/sdk/apr-service.d.ts.map +1 -0
- package/dist/sdk/apr-service.js +175 -0
- package/dist/sdk/apr-service.js.map +1 -0
- package/dist/sdk/math-utils.d.ts +138 -0
- package/dist/sdk/math-utils.d.ts.map +1 -0
- package/dist/sdk/math-utils.js +218 -0
- package/dist/sdk/math-utils.js.map +1 -0
- package/dist/sdk/simulation-service.d.ts +106 -0
- package/dist/sdk/simulation-service.d.ts.map +1 -0
- package/dist/sdk/simulation-service.js +143 -0
- package/dist/sdk/simulation-service.js.map +1 -0
- package/dist/sdk/vault-utils.d.ts +125 -0
- package/dist/sdk/vault-utils.d.ts.map +1 -0
- package/dist/sdk/vault-utils.js +165 -0
- package/dist/sdk/vault-utils.js.map +1 -0
- package/dist/server.d.ts +21 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +225 -0
- package/dist/server.js.map +1 -0
- package/dist/services/analytics/protocol-overview.service.d.ts +61 -0
- package/dist/services/analytics/protocol-overview.service.d.ts.map +1 -0
- package/dist/services/analytics/protocol-overview.service.js +182 -0
- package/dist/services/analytics/protocol-overview.service.js.map +1 -0
- package/dist/services/analytics/risk.service.d.ts +92 -0
- package/dist/services/analytics/risk.service.d.ts.map +1 -0
- package/dist/services/analytics/risk.service.js +423 -0
- package/dist/services/analytics/risk.service.js.map +1 -0
- package/dist/services/base.service.d.ts +39 -0
- package/dist/services/base.service.d.ts.map +1 -0
- package/dist/services/base.service.js +37 -0
- package/dist/services/base.service.js.map +1 -0
- package/dist/services/index.d.ts +30 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +101 -0
- package/dist/services/index.js.map +1 -0
- package/dist/tools/__tests__/simulate-vault.test.d.ts +5 -0
- package/dist/tools/__tests__/simulate-vault.test.d.ts.map +1 -0
- package/dist/tools/__tests__/simulate-vault.test.js +363 -0
- package/dist/tools/__tests__/simulate-vault.test.js.map +1 -0
- package/dist/tools/analyze-risk.d.ts +34 -0
- package/dist/tools/analyze-risk.d.ts.map +1 -0
- package/dist/tools/analyze-risk.js +100 -0
- package/dist/tools/analyze-risk.js.map +1 -0
- package/dist/tools/compare-vaults.d.ts +29 -0
- package/dist/tools/compare-vaults.d.ts.map +1 -0
- package/dist/tools/compare-vaults.js +285 -0
- package/dist/tools/compare-vaults.js.map +1 -0
- package/dist/tools/export-data.d.ts +34 -0
- package/dist/tools/export-data.d.ts.map +1 -0
- package/dist/tools/export-data.js +309 -0
- package/dist/tools/export-data.js.map +1 -0
- package/dist/tools/get-price-history.d.ts +29 -0
- package/dist/tools/get-price-history.d.ts.map +1 -0
- package/dist/tools/get-price-history.js +236 -0
- package/dist/tools/get-price-history.js.map +1 -0
- package/dist/tools/get-transactions.d.ts +29 -0
- package/dist/tools/get-transactions.d.ts.map +1 -0
- package/dist/tools/get-transactions.js +181 -0
- package/dist/tools/get-transactions.js.map +1 -0
- package/dist/tools/index.d.ts +26 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +32 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/optimize-portfolio.d.ts +37 -0
- package/dist/tools/optimize-portfolio.d.ts.map +1 -0
- package/dist/tools/optimize-portfolio.js +459 -0
- package/dist/tools/optimize-portfolio.js.map +1 -0
- package/dist/tools/predict-yield.d.ts +30 -0
- package/dist/tools/predict-yield.d.ts.map +1 -0
- package/dist/tools/predict-yield.js +248 -0
- package/dist/tools/predict-yield.js.map +1 -0
- package/dist/tools/query-graphql.d.ts +35 -0
- package/dist/tools/query-graphql.d.ts.map +1 -0
- package/dist/tools/query-graphql.js +54 -0
- package/dist/tools/query-graphql.js.map +1 -0
- package/dist/tools/registry.d.ts +42 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +231 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/search-vaults.d.ts +40 -0
- package/dist/tools/search-vaults.d.ts.map +1 -0
- package/dist/tools/search-vaults.js +184 -0
- package/dist/tools/search-vaults.js.map +1 -0
- package/dist/tools/simulate-vault.d.ts +80 -0
- package/dist/tools/simulate-vault.d.ts.map +1 -0
- package/dist/tools/simulate-vault.js +281 -0
- package/dist/tools/simulate-vault.js.map +1 -0
- package/dist/tools/user-portfolio.d.ts +30 -0
- package/dist/tools/user-portfolio.d.ts.map +1 -0
- package/dist/tools/user-portfolio.js +142 -0
- package/dist/tools/user-portfolio.js.map +1 -0
- package/dist/tools/vault-data.d.ts +23 -0
- package/dist/tools/vault-data.d.ts.map +1 -0
- package/dist/tools/vault-data.js +68 -0
- package/dist/tools/vault-data.js.map +1 -0
- package/dist/tools/vault-performance.d.ts +30 -0
- package/dist/tools/vault-performance.d.ts.map +1 -0
- package/dist/tools/vault-performance.js +275 -0
- package/dist/tools/vault-performance.js.map +1 -0
- package/dist/types/generated.d.ts +1109 -0
- package/dist/types/generated.d.ts.map +1 -0
- package/dist/types/generated.js +2 -0
- package/dist/types/generated.js.map +1 -0
- package/dist/types/index.d.ts +46 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/comparison-metrics.d.ts +120 -0
- package/dist/utils/comparison-metrics.d.ts.map +1 -0
- package/dist/utils/comparison-metrics.js +215 -0
- package/dist/utils/comparison-metrics.js.map +1 -0
- package/dist/utils/config-loader.d.ts +17 -0
- package/dist/utils/config-loader.d.ts.map +1 -0
- package/dist/utils/config-loader.js +45 -0
- package/dist/utils/config-loader.js.map +1 -0
- package/dist/utils/csv-generator.d.ts +89 -0
- package/dist/utils/csv-generator.d.ts.map +1 -0
- package/dist/utils/csv-generator.js +97 -0
- package/dist/utils/csv-generator.js.map +1 -0
- package/dist/utils/disclaimers.d.ts +70 -0
- package/dist/utils/disclaimers.d.ts.map +1 -0
- package/dist/utils/disclaimers.js +161 -0
- package/dist/utils/disclaimers.js.map +1 -0
- package/dist/utils/errors.d.ts +66 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +86 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/execute-tool-with-cache.d.ts +97 -0
- package/dist/utils/execute-tool-with-cache.d.ts.map +1 -0
- package/dist/utils/execute-tool-with-cache.js +105 -0
- package/dist/utils/execute-tool-with-cache.js.map +1 -0
- package/dist/utils/portfolio-optimization.d.ts +100 -0
- package/dist/utils/portfolio-optimization.d.ts.map +1 -0
- package/dist/utils/portfolio-optimization.js +283 -0
- package/dist/utils/portfolio-optimization.js.map +1 -0
- package/dist/utils/risk-scoring.d.ts +226 -0
- package/dist/utils/risk-scoring.d.ts.map +1 -0
- package/dist/utils/risk-scoring.js +523 -0
- package/dist/utils/risk-scoring.js.map +1 -0
- package/dist/utils/tool-error-handler.d.ts +16 -0
- package/dist/utils/tool-error-handler.d.ts.map +1 -0
- package/dist/utils/tool-error-handler.js +43 -0
- package/dist/utils/tool-error-handler.js.map +1 -0
- package/dist/utils/tool-handler.d.ts +33 -0
- package/dist/utils/tool-handler.d.ts.map +1 -0
- package/dist/utils/tool-handler.js +59 -0
- package/dist/utils/tool-handler.js.map +1 -0
- package/dist/utils/tool-response.d.ts +16 -0
- package/dist/utils/tool-response.d.ts.map +1 -0
- package/dist/utils/tool-response.js +25 -0
- package/dist/utils/tool-response.js.map +1 -0
- package/dist/utils/validators.d.ts +359 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/utils/validators.js +233 -0
- package/dist/utils/validators.js.map +1 -0
- package/dist/utils/yield-prediction.d.ts +69 -0
- package/dist/utils/yield-prediction.d.ts.map +1 -0
- package/dist/utils/yield-prediction.js +290 -0
- package/dist/utils/yield-prediction.js.map +1 -0
- 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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"}
|