@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,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_price_history Tool
|
|
3
|
+
*
|
|
4
|
+
* Historical price data with OHLCV (Open, High, Low, Close, Volume) time-series analysis.
|
|
5
|
+
* Provides price trends and volatility metrics for vault share price over time.
|
|
6
|
+
*
|
|
7
|
+
* Use cases:
|
|
8
|
+
* - Price trend analysis and pattern recognition
|
|
9
|
+
* - Volatility assessment and risk evaluation
|
|
10
|
+
* - Historical price point identification for entry/exit decisions
|
|
11
|
+
* - Performance: ~300-500 tokens per vault per time range
|
|
12
|
+
*
|
|
13
|
+
* Cache strategy:
|
|
14
|
+
* - 30-minute TTL for price history data
|
|
15
|
+
* - Cache key: price_history:{address}:{chainId}:{timeRange}
|
|
16
|
+
* - Cache hit rate target: 75-85%
|
|
17
|
+
* - Cache tags: [CacheTag.VAULT, CacheTag.ANALYTICS] for invalidation
|
|
18
|
+
*/
|
|
19
|
+
import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
20
|
+
import { PriceHistoryInput } from '../utils/validators.js';
|
|
21
|
+
import { ServiceContainer } from '../core/container.js';
|
|
22
|
+
/**
|
|
23
|
+
* Create the executeGetPriceHistory function with DI container
|
|
24
|
+
*
|
|
25
|
+
* @param container - Service container with dependencies
|
|
26
|
+
* @returns Configured tool executor function
|
|
27
|
+
*/
|
|
28
|
+
export declare function createExecuteGetPriceHistory(container: ServiceContainer): (input: PriceHistoryInput) => Promise<CallToolResult>;
|
|
29
|
+
//# sourceMappingURL=get-price-history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-price-history.d.ts","sourceRoot":"","sources":["../../src/tools/get-price-history.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAI3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AA6QxD;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,gBAAgB,GAC1B,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,cAAc,CAAC,CA8DvD"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_price_history Tool
|
|
3
|
+
*
|
|
4
|
+
* Historical price data with OHLCV (Open, High, Low, Close, Volume) time-series analysis.
|
|
5
|
+
* Provides price trends and volatility metrics for vault share price over time.
|
|
6
|
+
*
|
|
7
|
+
* Use cases:
|
|
8
|
+
* - Price trend analysis and pattern recognition
|
|
9
|
+
* - Volatility assessment and risk evaluation
|
|
10
|
+
* - Historical price point identification for entry/exit decisions
|
|
11
|
+
* - Performance: ~300-500 tokens per vault per time range
|
|
12
|
+
*
|
|
13
|
+
* Cache strategy:
|
|
14
|
+
* - 30-minute TTL for price history data
|
|
15
|
+
* - Cache key: price_history:{address}:{chainId}:{timeRange}
|
|
16
|
+
* - Cache hit rate target: 75-85%
|
|
17
|
+
* - Cache tags: [CacheTag.VAULT, CacheTag.ANALYTICS] for invalidation
|
|
18
|
+
*/
|
|
19
|
+
import { getToolDisclaimer } from '../utils/disclaimers.js';
|
|
20
|
+
import { PRICE_HISTORY_QUERY } from '../graphql/queries/index.js';
|
|
21
|
+
import { executeToolWithCache } from '../utils/execute-tool-with-cache.js';
|
|
22
|
+
import { CacheTag } from '../core/cache-invalidation.js';
|
|
23
|
+
import { cacheKeys, cacheTTL } from '../cache/index.js';
|
|
24
|
+
/**
|
|
25
|
+
* Time range constants (in seconds)
|
|
26
|
+
*/
|
|
27
|
+
const TIME_RANGES = {
|
|
28
|
+
'7d': 7 * 24 * 60 * 60,
|
|
29
|
+
'30d': 30 * 24 * 60 * 60,
|
|
30
|
+
'90d': 90 * 24 * 60 * 60,
|
|
31
|
+
'1y': 365 * 24 * 60 * 60,
|
|
32
|
+
all: 0, // No time limit
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Type guard for TotalAssetsUpdatedData
|
|
36
|
+
*/
|
|
37
|
+
function isTotalAssetsUpdated(data) {
|
|
38
|
+
return (typeof data === 'object' && data !== null && 'totalAssetsUsd' in data && 'totalSupply' in data);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Aggregate transactions into OHLCV time buckets
|
|
42
|
+
* Groups data by day for cleaner visualization
|
|
43
|
+
*/
|
|
44
|
+
function aggregateOHLCV(transactions) {
|
|
45
|
+
if (transactions.length === 0)
|
|
46
|
+
return [];
|
|
47
|
+
// Group transactions by day (86400 seconds)
|
|
48
|
+
const dayBuckets = new Map();
|
|
49
|
+
for (const tx of transactions) {
|
|
50
|
+
if (!isTotalAssetsUpdated(tx.data))
|
|
51
|
+
continue;
|
|
52
|
+
const timestamp = parseInt(tx.timestamp, 10);
|
|
53
|
+
const dayTimestamp = Math.floor(timestamp / 86400) * 86400;
|
|
54
|
+
if (!dayBuckets.has(dayTimestamp)) {
|
|
55
|
+
dayBuckets.set(dayTimestamp, []);
|
|
56
|
+
}
|
|
57
|
+
dayBuckets.get(dayTimestamp).push(tx);
|
|
58
|
+
}
|
|
59
|
+
// Convert buckets to OHLCV data points
|
|
60
|
+
const ohlcvData = [];
|
|
61
|
+
for (const [dayTimestamp, txs] of Array.from(dayBuckets.entries()).sort((a, b) => a[0] - b[0])) {
|
|
62
|
+
const prices = txs
|
|
63
|
+
.filter((tx) => isTotalAssetsUpdated(tx.data))
|
|
64
|
+
.map((tx) => {
|
|
65
|
+
// Calculate price per share from totalAssetsUsd / totalSupply
|
|
66
|
+
const totalSupply = parseFloat(tx.data.totalSupply) / 1e18; // Convert from wei to decimal
|
|
67
|
+
return totalSupply > 0 ? tx.data.totalAssetsUsd / totalSupply : 0;
|
|
68
|
+
});
|
|
69
|
+
if (prices.length === 0)
|
|
70
|
+
continue;
|
|
71
|
+
const volumes = txs
|
|
72
|
+
.filter((tx) => isTotalAssetsUpdated(tx.data))
|
|
73
|
+
.map((tx) => tx.data.totalAssetsUsd);
|
|
74
|
+
const open = prices[0];
|
|
75
|
+
const close = prices[prices.length - 1];
|
|
76
|
+
const high = Math.max(...prices);
|
|
77
|
+
const low = Math.min(...prices);
|
|
78
|
+
const volume = volumes.reduce((sum, v) => sum + v, 0) / volumes.length; // Average TVL for the day
|
|
79
|
+
ohlcvData.push({
|
|
80
|
+
timestamp: dayTimestamp,
|
|
81
|
+
open,
|
|
82
|
+
high,
|
|
83
|
+
low,
|
|
84
|
+
close,
|
|
85
|
+
volume,
|
|
86
|
+
blockNumber: txs[txs.length - 1].blockNumber,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return ohlcvData;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Calculate price statistics from OHLCV data
|
|
93
|
+
*/
|
|
94
|
+
function calculateStatistics(ohlcvData) {
|
|
95
|
+
if (ohlcvData.length === 0) {
|
|
96
|
+
return {
|
|
97
|
+
currentPrice: 0,
|
|
98
|
+
startPrice: 0,
|
|
99
|
+
highPrice: 0,
|
|
100
|
+
lowPrice: 0,
|
|
101
|
+
averagePrice: 0,
|
|
102
|
+
percentChange: 0,
|
|
103
|
+
volatility: 0,
|
|
104
|
+
totalVolume: 0,
|
|
105
|
+
dataPoints: 0,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const prices = ohlcvData.map((d) => d.close);
|
|
109
|
+
const currentPrice = prices[prices.length - 1];
|
|
110
|
+
const startPrice = prices[0];
|
|
111
|
+
const highPrice = Math.max(...ohlcvData.map((d) => d.high));
|
|
112
|
+
const lowPrice = Math.min(...ohlcvData.map((d) => d.low));
|
|
113
|
+
const averagePrice = prices.reduce((sum, p) => sum + p, 0) / prices.length;
|
|
114
|
+
const percentChange = startPrice > 0 ? ((currentPrice - startPrice) / startPrice) * 100 : 0;
|
|
115
|
+
// Calculate volatility (standard deviation)
|
|
116
|
+
const squaredDiffs = prices.map((p) => Math.pow(p - averagePrice, 2));
|
|
117
|
+
const variance = squaredDiffs.reduce((sum, d) => sum + d, 0) / prices.length;
|
|
118
|
+
const volatility = Math.sqrt(variance);
|
|
119
|
+
const totalVolume = ohlcvData.reduce((sum, d) => sum + d.volume, 0);
|
|
120
|
+
return {
|
|
121
|
+
currentPrice,
|
|
122
|
+
startPrice,
|
|
123
|
+
highPrice,
|
|
124
|
+
lowPrice,
|
|
125
|
+
averagePrice,
|
|
126
|
+
percentChange,
|
|
127
|
+
volatility,
|
|
128
|
+
totalVolume,
|
|
129
|
+
dataPoints: ohlcvData.length,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Transform raw GraphQL response into markdown-formatted output
|
|
134
|
+
* Uses closure to capture input values and timestamp filter
|
|
135
|
+
*/
|
|
136
|
+
function createTransformPriceHistoryData(input, timestampGte) {
|
|
137
|
+
return (data) => {
|
|
138
|
+
// Filter transactions by timestamp client-side (since API doesn't support timestamp filtering)
|
|
139
|
+
const filteredItems = timestampGte > 0
|
|
140
|
+
? data.transactions.items.filter((item) => parseInt(item.timestamp) >= timestampGte)
|
|
141
|
+
: data.transactions.items;
|
|
142
|
+
// Aggregate into OHLCV time-series
|
|
143
|
+
const ohlcvData = aggregateOHLCV(filteredItems);
|
|
144
|
+
// Calculate statistics
|
|
145
|
+
const statistics = calculateStatistics(ohlcvData);
|
|
146
|
+
// Format output as markdown based on responseFormat
|
|
147
|
+
const responseFormat = (input.responseFormat ?? 'summary');
|
|
148
|
+
let markdown = `# Price History: ${input.vaultAddress}\n\n` +
|
|
149
|
+
`**Chain ID**: ${input.chainId}\n` +
|
|
150
|
+
`**Time Range**: ${input.timeRange}\n` +
|
|
151
|
+
`**Data Points**: ${statistics.dataPoints}\n\n` +
|
|
152
|
+
`## Price Statistics\n\n` +
|
|
153
|
+
`- **Current Price**: $${statistics.currentPrice.toFixed(6)}\n` +
|
|
154
|
+
`- **Start Price**: $${statistics.startPrice.toFixed(6)}\n` +
|
|
155
|
+
`- **High Price**: $${statistics.highPrice.toFixed(6)}\n` +
|
|
156
|
+
`- **Low Price**: $${statistics.lowPrice.toFixed(6)}\n` +
|
|
157
|
+
`- **Average Price**: $${statistics.averagePrice.toFixed(6)}\n` +
|
|
158
|
+
`- **Change**: ${statistics.percentChange > 0 ? '+' : ''}${statistics.percentChange.toFixed(2)}%\n` +
|
|
159
|
+
`- **Volatility (σ)**: $${statistics.volatility.toFixed(6)}\n` +
|
|
160
|
+
`- **Total Volume**: $${(statistics.totalVolume / 1000000).toFixed(2)}M\n\n`;
|
|
161
|
+
// Include OHLCV table for 'summary' and 'detailed' formats
|
|
162
|
+
if (responseFormat === 'summary' || responseFormat === 'detailed') {
|
|
163
|
+
markdown +=
|
|
164
|
+
`## OHLCV Data (Daily)\n\n` +
|
|
165
|
+
`| Date | Open | High | Low | Close | Volume |\n` +
|
|
166
|
+
`|------|------|------|-----|-------|--------|\n` +
|
|
167
|
+
ohlcvData
|
|
168
|
+
.map((d) => {
|
|
169
|
+
const date = new Date(d.timestamp * 1000).toISOString().split('T')[0];
|
|
170
|
+
return `| ${date} | $${d.open.toFixed(6)} | $${d.high.toFixed(6)} | $${d.low.toFixed(6)} | $${d.close.toFixed(6)} | $${(d.volume / 1000000).toFixed(2)}M |`;
|
|
171
|
+
})
|
|
172
|
+
.join('\n') +
|
|
173
|
+
`\n\n`;
|
|
174
|
+
}
|
|
175
|
+
markdown += `**Data Completeness**: ${data.transactions.pageInfo.hasNextPage ? 'More data available (truncated at 2000 points)' : 'Complete'}\n`;
|
|
176
|
+
return { markdown };
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Create the executeGetPriceHistory function with DI container
|
|
181
|
+
*
|
|
182
|
+
* @param container - Service container with dependencies
|
|
183
|
+
* @returns Configured tool executor function
|
|
184
|
+
*/
|
|
185
|
+
export function createExecuteGetPriceHistory(container) {
|
|
186
|
+
return async (input) => {
|
|
187
|
+
// Calculate timestamp threshold (0 for 'all')
|
|
188
|
+
const now = Math.floor(Date.now() / 1000);
|
|
189
|
+
const timeRangeSeconds = TIME_RANGES[input.timeRange];
|
|
190
|
+
const timestampGte = timeRangeSeconds > 0 ? now - timeRangeSeconds : 0;
|
|
191
|
+
// Build query variables
|
|
192
|
+
const variables = {
|
|
193
|
+
where: {
|
|
194
|
+
vault_in: [input.vaultAddress],
|
|
195
|
+
type_in: ['TotalAssetsUpdated'],
|
|
196
|
+
},
|
|
197
|
+
orderBy: 'timestamp',
|
|
198
|
+
orderDirection: 'asc',
|
|
199
|
+
first: 1000, // GraphQL API limit: 1-1000
|
|
200
|
+
};
|
|
201
|
+
const executor = executeToolWithCache({
|
|
202
|
+
container,
|
|
203
|
+
cacheKey: (input) => `${cacheKeys.priceHistory(input.vaultAddress, input.chainId, input.timeRange)}:${input.responseFormat || 'summary'}`,
|
|
204
|
+
cacheTTL: cacheTTL.priceHistory,
|
|
205
|
+
query: PRICE_HISTORY_QUERY,
|
|
206
|
+
variables: () => variables,
|
|
207
|
+
validateResult: (data) => ({
|
|
208
|
+
valid: !!(data.transactions && data.transactions.items.length > 0),
|
|
209
|
+
message: data.transactions && data.transactions.items.length > 0
|
|
210
|
+
? undefined
|
|
211
|
+
: `No price history data found for vault ${input.vaultAddress} on chain ${input.chainId} in the ${input.timeRange} time range.`,
|
|
212
|
+
}),
|
|
213
|
+
transformResult: createTransformPriceHistoryData(input, timestampGte),
|
|
214
|
+
toolName: 'get_price_history',
|
|
215
|
+
});
|
|
216
|
+
// Register cache tags for invalidation
|
|
217
|
+
const cacheKey = cacheKeys.priceHistory(input.vaultAddress, input.chainId, input.timeRange);
|
|
218
|
+
container.cacheInvalidator.register(cacheKey, [CacheTag.VAULT, CacheTag.ANALYTICS]);
|
|
219
|
+
// Execute and get result
|
|
220
|
+
const result = await executor(input);
|
|
221
|
+
// Transform JSON output to markdown text format with legal disclaimer
|
|
222
|
+
// executeToolWithCache returns JSON, but this tool should return markdown
|
|
223
|
+
if (!result.isError && result.content[0]?.type === 'text') {
|
|
224
|
+
try {
|
|
225
|
+
const output = JSON.parse(result.content[0].text);
|
|
226
|
+
result.content[0].text = output.markdown + getToolDisclaimer('price_history');
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
// If parsing fails, content is already in the right format
|
|
230
|
+
console.error('Failed to parse price history output:', error);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return result;
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=get-price-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-price-history.js","sourceRoot":"","sources":["../../src/tools/get-price-history.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_transactions Tool
|
|
3
|
+
*
|
|
4
|
+
* Vault transaction history with flexible filtering, pagination, and ordering.
|
|
5
|
+
* Supports all transaction types with 5-minute caching.
|
|
6
|
+
*
|
|
7
|
+
* Use cases:
|
|
8
|
+
* - Transaction history for specific vaults
|
|
9
|
+
* - Filtering by transaction type (deposits, redemptions, etc.)
|
|
10
|
+
* - Pagination and ordering support
|
|
11
|
+
* - Performance: ~300-800 tokens per query (depending on result count)
|
|
12
|
+
*
|
|
13
|
+
* Cache strategy:
|
|
14
|
+
* - 5-minute TTL for frequently changing transaction data
|
|
15
|
+
* - Cache key includes filters, pagination, and ordering
|
|
16
|
+
* - Cache hit rate target: 60-70%
|
|
17
|
+
* - Cache tags: [CacheTag.TRANSACTION] for invalidation
|
|
18
|
+
*/
|
|
19
|
+
import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
20
|
+
import { type GetTransactionsInput } from '../utils/validators.js';
|
|
21
|
+
import { ServiceContainer } from '../core/container.js';
|
|
22
|
+
/**
|
|
23
|
+
* Create the executeGetTransactions function with DI container
|
|
24
|
+
*
|
|
25
|
+
* @param container - Service container with dependencies
|
|
26
|
+
* @returns Configured tool executor function
|
|
27
|
+
*/
|
|
28
|
+
export declare function createExecuteGetTransactions(container: ServiceContainer): (input: GetTransactionsInput) => Promise<CallToolResult>;
|
|
29
|
+
//# sourceMappingURL=get-transactions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-transactions.d.ts","sourceRoot":"","sources":["../../src/tools/get-transactions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEpE,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAGnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAmKxD;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,gBAAgB,GAC1B,CAAC,KAAK,EAAE,oBAAoB,KAAK,OAAO,CAAC,cAAc,CAAC,CAoG1D"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_transactions Tool
|
|
3
|
+
*
|
|
4
|
+
* Vault transaction history with flexible filtering, pagination, and ordering.
|
|
5
|
+
* Supports all transaction types with 5-minute caching.
|
|
6
|
+
*
|
|
7
|
+
* Use cases:
|
|
8
|
+
* - Transaction history for specific vaults
|
|
9
|
+
* - Filtering by transaction type (deposits, redemptions, etc.)
|
|
10
|
+
* - Pagination and ordering support
|
|
11
|
+
* - Performance: ~300-800 tokens per query (depending on result count)
|
|
12
|
+
*
|
|
13
|
+
* Cache strategy:
|
|
14
|
+
* - 5-minute TTL for frequently changing transaction data
|
|
15
|
+
* - Cache key includes filters, pagination, and ordering
|
|
16
|
+
* - Cache hit rate target: 60-70%
|
|
17
|
+
* - Cache tags: [CacheTag.TRANSACTION] for invalidation
|
|
18
|
+
*/
|
|
19
|
+
import { createHash } from 'crypto';
|
|
20
|
+
import { getToolDisclaimer } from '../utils/disclaimers.js';
|
|
21
|
+
import { TRANSACTIONS_QUERY } from '../graphql/queries/index.js';
|
|
22
|
+
import { executeToolWithCache } from '../utils/execute-tool-with-cache.js';
|
|
23
|
+
import { CacheTag } from '../core/cache-invalidation.js';
|
|
24
|
+
import { cacheKeys, cacheTTL } from '../cache/index.js';
|
|
25
|
+
/**
|
|
26
|
+
* Build the where filter for the transactions query
|
|
27
|
+
*/
|
|
28
|
+
function buildWhereFilter(input) {
|
|
29
|
+
const where = {
|
|
30
|
+
chainId_eq: input.chainId,
|
|
31
|
+
vault_in: [input.vaultAddress.toLowerCase()],
|
|
32
|
+
};
|
|
33
|
+
if (input.transactionTypes && input.transactionTypes.length > 0) {
|
|
34
|
+
where.type_in = input.transactionTypes;
|
|
35
|
+
}
|
|
36
|
+
return where;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Generate a hash of the filters for cache key uniqueness
|
|
40
|
+
*/
|
|
41
|
+
function hashFilters(filters) {
|
|
42
|
+
const hash = createHash('md5');
|
|
43
|
+
hash.update(JSON.stringify(filters));
|
|
44
|
+
return hash.digest('hex').slice(0, 8);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Transform raw GraphQL response into processed output
|
|
48
|
+
* Uses closure to capture input parameters
|
|
49
|
+
*/
|
|
50
|
+
function createTransformTransactionsData(input) {
|
|
51
|
+
return (data) => {
|
|
52
|
+
const transactions = data.transactions.items;
|
|
53
|
+
const pageInfo = data.transactions.pageInfo;
|
|
54
|
+
return {
|
|
55
|
+
vaultAddress: input.vaultAddress,
|
|
56
|
+
chainId: input.chainId,
|
|
57
|
+
transactions: transactions.map((tx) => ({
|
|
58
|
+
id: tx.id,
|
|
59
|
+
type: tx.type,
|
|
60
|
+
timestamp: tx.timestamp,
|
|
61
|
+
blockNumber: tx.blockNumber,
|
|
62
|
+
hash: tx.hash,
|
|
63
|
+
logIndex: tx.logIndex,
|
|
64
|
+
chain: {
|
|
65
|
+
id: tx.chain.id,
|
|
66
|
+
name: tx.chain.name,
|
|
67
|
+
},
|
|
68
|
+
vault: {
|
|
69
|
+
id: tx.data.vault?.id || '',
|
|
70
|
+
address: tx.data.vault?.address || input.vaultAddress.toLowerCase(),
|
|
71
|
+
symbol: tx.data.vault?.symbol || 'UNKNOWN',
|
|
72
|
+
},
|
|
73
|
+
data: (tx.data || {}),
|
|
74
|
+
})),
|
|
75
|
+
pageInfo: {
|
|
76
|
+
hasNextPage: pageInfo.hasNextPage,
|
|
77
|
+
hasPreviousPage: pageInfo.hasPreviousPage,
|
|
78
|
+
count: pageInfo.count,
|
|
79
|
+
totalCount: pageInfo.totalCount,
|
|
80
|
+
},
|
|
81
|
+
filters: {
|
|
82
|
+
transactionTypes: input.transactionTypes,
|
|
83
|
+
orderBy: input.orderBy || 'blockNumber',
|
|
84
|
+
orderDirection: input.orderDirection || 'desc',
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Create the executeGetTransactions function with DI container
|
|
91
|
+
*
|
|
92
|
+
* @param container - Service container with dependencies
|
|
93
|
+
* @returns Configured tool executor function
|
|
94
|
+
*/
|
|
95
|
+
export function createExecuteGetTransactions(container) {
|
|
96
|
+
// Map to track in-flight requests at tool level (shared across all calls)
|
|
97
|
+
const inFlightRequests = new Map();
|
|
98
|
+
return async (input) => {
|
|
99
|
+
// Extract parameters with defaults
|
|
100
|
+
const first = input.pagination?.first ?? 100;
|
|
101
|
+
const skip = input.pagination?.skip ?? 0;
|
|
102
|
+
const orderBy = input.orderBy ?? 'blockNumber';
|
|
103
|
+
const orderDirection = input.orderDirection ?? 'desc';
|
|
104
|
+
// Build where filter
|
|
105
|
+
const where = buildWhereFilter(input);
|
|
106
|
+
const filterHash = hashFilters(where);
|
|
107
|
+
// Generate cache key for deduplication (including responseFormat)
|
|
108
|
+
const responseFormat = (input.responseFormat ?? 'list');
|
|
109
|
+
const cacheKey = `${cacheKeys.transactions({
|
|
110
|
+
vaultAddress: input.vaultAddress.toLowerCase(),
|
|
111
|
+
chainId: input.chainId,
|
|
112
|
+
filterHash,
|
|
113
|
+
first,
|
|
114
|
+
skip,
|
|
115
|
+
orderBy,
|
|
116
|
+
orderDirection,
|
|
117
|
+
})}:${responseFormat}`;
|
|
118
|
+
// Check for in-flight request with same key (request deduplication)
|
|
119
|
+
const inFlight = inFlightRequests.get(cacheKey);
|
|
120
|
+
if (inFlight) {
|
|
121
|
+
return await inFlight;
|
|
122
|
+
}
|
|
123
|
+
// Create new request promise
|
|
124
|
+
const requestPromise = (async () => {
|
|
125
|
+
try {
|
|
126
|
+
const executor = executeToolWithCache({
|
|
127
|
+
container,
|
|
128
|
+
cacheKey: () => cacheKey,
|
|
129
|
+
cacheTTL: cacheTTL.transactions,
|
|
130
|
+
query: TRANSACTIONS_QUERY,
|
|
131
|
+
variables: () => ({
|
|
132
|
+
first,
|
|
133
|
+
skip,
|
|
134
|
+
where,
|
|
135
|
+
orderBy,
|
|
136
|
+
orderDirection,
|
|
137
|
+
}),
|
|
138
|
+
validateResult: (data) => {
|
|
139
|
+
// Missing transactions object entirely = malformed response (error)
|
|
140
|
+
if (!data.transactions) {
|
|
141
|
+
return {
|
|
142
|
+
valid: false,
|
|
143
|
+
message: `No transaction data found for vault ${input.vaultAddress}`,
|
|
144
|
+
isError: true, // Malformed response structure
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
// Null/undefined items array = malformed response (error)
|
|
148
|
+
if (data.transactions.items === null || data.transactions.items === undefined) {
|
|
149
|
+
return {
|
|
150
|
+
valid: false,
|
|
151
|
+
message: `No transaction data found for vault ${input.vaultAddress}`,
|
|
152
|
+
isError: true, // Malformed response structure
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
// Empty array OR has items = valid response (transform will handle empty arrays)
|
|
156
|
+
return { valid: true };
|
|
157
|
+
},
|
|
158
|
+
transformResult: createTransformTransactionsData(input),
|
|
159
|
+
toolName: 'get_transactions',
|
|
160
|
+
});
|
|
161
|
+
// Register cache tags for invalidation
|
|
162
|
+
container.cacheInvalidator.register(cacheKey, [CacheTag.TRANSACTION]);
|
|
163
|
+
const result = await executor(input);
|
|
164
|
+
// Add legal disclaimer to output
|
|
165
|
+
if (!result.isError && result.content[0]?.type === 'text') {
|
|
166
|
+
result.content[0].text = result.content[0].text + getToolDisclaimer('get_transactions');
|
|
167
|
+
}
|
|
168
|
+
return result;
|
|
169
|
+
}
|
|
170
|
+
finally {
|
|
171
|
+
// Clean up in-flight request regardless of success/failure
|
|
172
|
+
inFlightRequests.delete(cacheKey);
|
|
173
|
+
}
|
|
174
|
+
})();
|
|
175
|
+
// Store in-flight request
|
|
176
|
+
inFlightRequests.set(cacheKey, requestPromise);
|
|
177
|
+
// Return the promise
|
|
178
|
+
return await requestPromise;
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=get-transactions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-transactions.js","sourceRoot":"","sources":["../../src/tools/get-transactions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Registry (DEPRECATED)
|
|
3
|
+
*
|
|
4
|
+
* This file is deprecated. Use src/tools/registry.ts instead.
|
|
5
|
+
* Kept for backward compatibility only.
|
|
6
|
+
*/
|
|
7
|
+
import { CallToolRequest, CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
8
|
+
/**
|
|
9
|
+
* @deprecated Use ToolDefinition from './registry.js' instead
|
|
10
|
+
*/
|
|
11
|
+
export type { ToolDefinition as Tool } from './registry.js';
|
|
12
|
+
/**
|
|
13
|
+
* @deprecated Use TOOL_REGISTRY from './registry.js' instead
|
|
14
|
+
* Tool array kept for backward compatibility only
|
|
15
|
+
*/
|
|
16
|
+
export { TOOL_REGISTRY as tools } from './registry.js';
|
|
17
|
+
/**
|
|
18
|
+
* @deprecated Tool handlers are now managed by the registry
|
|
19
|
+
* Use registerTools() from './registry.js' instead
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* @deprecated Use registerTools() from './registry.js' instead
|
|
23
|
+
* This function is kept for backward compatibility only
|
|
24
|
+
*/
|
|
25
|
+
export declare function handleToolCall(request: CallToolRequest): CallToolResult;
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAErF;;GAEG;AACH,YAAY,EAAE,cAAc,IAAI,IAAI,EAAE,MAAM,eAAe,CAAC;AAE5D;;;GAGG;AACH,OAAO,EAAE,aAAa,IAAI,KAAK,EAAE,MAAM,eAAe,CAAC;AAEvD;;;GAGG;AAEH;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,CAYvE"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Registry (DEPRECATED)
|
|
3
|
+
*
|
|
4
|
+
* This file is deprecated. Use src/tools/registry.ts instead.
|
|
5
|
+
* Kept for backward compatibility only.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* @deprecated Use TOOL_REGISTRY from './registry.js' instead
|
|
9
|
+
* Tool array kept for backward compatibility only
|
|
10
|
+
*/
|
|
11
|
+
export { TOOL_REGISTRY as tools } from './registry.js';
|
|
12
|
+
/**
|
|
13
|
+
* @deprecated Tool handlers are now managed by the registry
|
|
14
|
+
* Use registerTools() from './registry.js' instead
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* @deprecated Use registerTools() from './registry.js' instead
|
|
18
|
+
* This function is kept for backward compatibility only
|
|
19
|
+
*/
|
|
20
|
+
export function handleToolCall(request) {
|
|
21
|
+
const toolName = request.params.name;
|
|
22
|
+
return {
|
|
23
|
+
content: [
|
|
24
|
+
{
|
|
25
|
+
type: 'text',
|
|
26
|
+
text: `Tool "${toolName}" should be called via the MCP server. Use registerTools() from './registry.js'.`,
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
isError: true,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH;;;GAGG;AACH,OAAO,EAAE,aAAa,IAAI,KAAK,EAAE,MAAM,eAAe,CAAC;AAEvD;;;GAGG;AAEH;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAAwB;IACrD,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;IAErC,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,SAAS,QAAQ,kFAAkF;aAC1G;SACF;QACD,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* optimize_portfolio Tool
|
|
3
|
+
*
|
|
4
|
+
* Portfolio optimization with rebalancing recommendations using parallel vault queries.
|
|
5
|
+
* Analyzes current holdings and provides optimal allocation strategy based on
|
|
6
|
+
* per-vault historical data (price history and performance metrics).
|
|
7
|
+
*
|
|
8
|
+
* Implementation:
|
|
9
|
+
* - Executes N parallel GraphQL queries (one per vault) using Promise.all
|
|
10
|
+
* - Each vault gets up to 1000 transactions of historical data
|
|
11
|
+
* - Processes per-vault price history for accurate volatility calculation
|
|
12
|
+
* - Uses per-vault performance data for expected APR estimation
|
|
13
|
+
*
|
|
14
|
+
* Use cases:
|
|
15
|
+
* - Portfolio rebalancing and optimization
|
|
16
|
+
* - Risk-adjusted allocation strategies (equal_weight, risk_parity, max_sharpe, min_variance)
|
|
17
|
+
* - Diversification improvement
|
|
18
|
+
* - Performance enhancement through optimal weighting
|
|
19
|
+
* - Performance: ~800-1200 tokens per optimization (scales with vault count)
|
|
20
|
+
*
|
|
21
|
+
* Cache strategy:
|
|
22
|
+
* - 30-minute TTL (balances freshness with stability)
|
|
23
|
+
* - Cache key: portfolio_optimization:{chainId}:{vaultAddresses}:{strategy}
|
|
24
|
+
* - Cache hit rate target: 70-80%
|
|
25
|
+
* - Cache tags: [CacheTag.PORTFOLIO, CacheTag.ANALYTICS] for invalidation
|
|
26
|
+
*/
|
|
27
|
+
import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
28
|
+
import { OptimizePortfolioInput } from '../utils/validators.js';
|
|
29
|
+
import { ServiceContainer } from '../core/container.js';
|
|
30
|
+
/**
|
|
31
|
+
* Create the executeOptimizePortfolio function with DI container
|
|
32
|
+
*
|
|
33
|
+
* @param container - Service container with dependencies
|
|
34
|
+
* @returns Configured tool executor function
|
|
35
|
+
*/
|
|
36
|
+
export declare function createExecuteOptimizePortfolio(container: ServiceContainer): (input: OptimizePortfolioInput) => Promise<CallToolResult>;
|
|
37
|
+
//# sourceMappingURL=optimize-portfolio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimize-portfolio.d.ts","sourceRoot":"","sources":["../../src/tools/optimize-portfolio.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAUhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAkexD;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,gBAAgB,GAC1B,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC,cAAc,CAAC,CA0F5D"}
|