@lagoon-protocol/lagoon-mcp 0.4.0 → 0.6.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/dist/config.d.ts +1 -1
- package/dist/config.js +1 -1
- package/dist/core/cache-invalidation.d.ts +7 -1
- package/dist/core/cache-invalidation.d.ts.map +1 -1
- package/dist/core/cache-invalidation.js +17 -1
- package/dist/core/cache-invalidation.js.map +1 -1
- package/dist/core/container.js +1 -1
- package/dist/graphql/client.d.ts.map +1 -1
- package/dist/graphql/client.js +6 -0
- package/dist/graphql/client.js.map +1 -1
- package/dist/graphql/fragments/transaction-base.fragment.d.ts +1 -1
- package/dist/graphql/fragments/transaction-base.fragment.d.ts.map +1 -1
- package/dist/graphql/fragments/transaction-base.fragment.js +0 -1
- package/dist/graphql/fragments/transaction-base.fragment.js.map +1 -1
- package/dist/graphql/fragments/vault.fragment.d.ts +2 -1
- package/dist/graphql/fragments/vault.fragment.d.ts.map +1 -1
- package/dist/graphql/fragments/vault.fragment.js +1 -0
- package/dist/graphql/fragments/vault.fragment.js.map +1 -1
- package/dist/graphql/queries/export.queries.d.ts +5 -7
- package/dist/graphql/queries/export.queries.d.ts.map +1 -1
- package/dist/graphql/queries/export.queries.js +22 -28
- package/dist/graphql/queries/export.queries.js.map +1 -1
- package/dist/graphql/queries/index.d.ts +3 -3
- package/dist/graphql/queries/index.d.ts.map +1 -1
- package/dist/graphql/queries/index.js +3 -3
- package/dist/graphql/queries/index.js.map +1 -1
- package/dist/graphql/queries/performance.queries.d.ts +6 -4
- package/dist/graphql/queries/performance.queries.d.ts.map +1 -1
- package/dist/graphql/queries/performance.queries.js +5 -11
- package/dist/graphql/queries/performance.queries.js.map +1 -1
- package/dist/graphql/queries/portfolio.queries.d.ts +5 -11
- package/dist/graphql/queries/portfolio.queries.d.ts.map +1 -1
- package/dist/graphql/queries/portfolio.queries.js +14 -87
- package/dist/graphql/queries/portfolio.queries.js.map +1 -1
- package/dist/graphql/queries/prediction.queries.d.ts +13 -15
- package/dist/graphql/queries/prediction.queries.d.ts.map +1 -1
- package/dist/graphql/queries/prediction.queries.js +12 -31
- package/dist/graphql/queries/prediction.queries.js.map +1 -1
- package/dist/graphql/queries/risk.queries.d.ts +3 -3
- package/dist/graphql/queries/risk.queries.d.ts.map +1 -1
- package/dist/graphql/queries/risk.queries.js +7 -22
- package/dist/graphql/queries/risk.queries.js.map +1 -1
- package/dist/graphql/queries/search.queries.d.ts.map +1 -1
- package/dist/graphql/queries/search.queries.js +6 -2
- package/dist/graphql/queries/search.queries.js.map +1 -1
- package/dist/graphql/queries/transaction.queries.d.ts +6 -26
- package/dist/graphql/queries/transaction.queries.d.ts.map +1 -1
- package/dist/graphql/queries/transaction.queries.js +227 -59
- package/dist/graphql/queries/transaction.queries.js.map +1 -1
- package/dist/graphql/queries/vault.queries.d.ts +21 -3
- package/dist/graphql/queries/vault.queries.d.ts.map +1 -1
- package/dist/graphql/queries/vault.queries.js +38 -0
- package/dist/graphql/queries/vault.queries.js.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/prompts/competitor-comparison.d.ts.map +1 -1
- package/dist/prompts/competitor-comparison.js +3 -1
- package/dist/prompts/competitor-comparison.js.map +1 -1
- package/dist/prompts/curator-performance.d.ts.map +1 -1
- package/dist/prompts/curator-performance.js +3 -1
- package/dist/prompts/curator-performance.js.map +1 -1
- package/dist/prompts/financial-analysis.d.ts.map +1 -1
- package/dist/prompts/financial-analysis.js +7 -3
- package/dist/prompts/financial-analysis.js.map +1 -1
- package/dist/prompts/onboarding-first-vault.d.ts.map +1 -1
- package/dist/prompts/onboarding-first-vault.js +5 -1
- package/dist/prompts/onboarding-first-vault.js.map +1 -1
- package/dist/prompts/portfolio-optimization.d.ts.map +1 -1
- package/dist/prompts/portfolio-optimization.js +5 -1
- package/dist/prompts/portfolio-optimization.js.map +1 -1
- package/dist/prompts/protocol-overview.d.ts.map +1 -1
- package/dist/prompts/protocol-overview.js +3 -1
- package/dist/prompts/protocol-overview.js.map +1 -1
- package/dist/resources/schema.d.ts +8 -3
- package/dist/resources/schema.d.ts.map +1 -1
- package/dist/resources/schema.js +34 -30
- package/dist/resources/schema.js.map +1 -1
- package/dist/server.d.ts +4 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +5 -2
- package/dist/server.js.map +1 -1
- package/dist/services/analytics/risk.service.d.ts +10 -12
- package/dist/services/analytics/risk.service.d.ts.map +1 -1
- package/dist/services/analytics/risk.service.js +41 -42
- package/dist/services/analytics/risk.service.js.map +1 -1
- package/dist/skills/loader.d.ts.map +1 -1
- package/dist/skills/loader.js +18 -8
- package/dist/skills/loader.js.map +1 -1
- package/dist/tools/compare-vaults.d.ts.map +1 -1
- package/dist/tools/compare-vaults.js +6 -3
- package/dist/tools/compare-vaults.js.map +1 -1
- package/dist/tools/discover-tools.d.ts +3 -3
- package/dist/tools/discover-tools.d.ts.map +1 -1
- package/dist/tools/discover-tools.js +16 -3
- package/dist/tools/discover-tools.js.map +1 -1
- package/dist/tools/export-data.d.ts.map +1 -1
- package/dist/tools/export-data.js +10 -16
- package/dist/tools/export-data.js.map +1 -1
- package/dist/tools/get-price-history.d.ts.map +1 -1
- package/dist/tools/get-price-history.js +55 -63
- package/dist/tools/get-price-history.js.map +1 -1
- package/dist/tools/get-transactions.d.ts.map +1 -1
- package/dist/tools/get-transactions.js +3 -1
- package/dist/tools/get-transactions.js.map +1 -1
- package/dist/tools/optimize-portfolio.d.ts.map +1 -1
- package/dist/tools/optimize-portfolio.js +6 -17
- package/dist/tools/optimize-portfolio.js.map +1 -1
- package/dist/tools/predict-yield.d.ts.map +1 -1
- package/dist/tools/predict-yield.js +61 -38
- package/dist/tools/predict-yield.js.map +1 -1
- package/dist/tools/query-graphql.d.ts.map +1 -1
- package/dist/tools/query-graphql.js +139 -0
- package/dist/tools/query-graphql.js.map +1 -1
- package/dist/tools/search-vaults.d.ts.map +1 -1
- package/dist/tools/search-vaults.js +9 -2
- package/dist/tools/search-vaults.js.map +1 -1
- package/dist/tools/vault-performance.d.ts.map +1 -1
- package/dist/tools/vault-performance.js +7 -19
- package/dist/tools/vault-performance.js.map +1 -1
- package/dist/types/generated.d.ts +811 -19
- package/dist/types/generated.d.ts.map +1 -1
- package/dist/utils/comparison-metrics.d.ts.map +1 -1
- package/dist/utils/comparison-metrics.js +6 -3
- package/dist/utils/comparison-metrics.js.map +1 -1
- package/dist/utils/csv-generator.d.ts +4 -1
- package/dist/utils/csv-generator.d.ts.map +1 -1
- package/dist/utils/csv-generator.js +8 -4
- package/dist/utils/csv-generator.js.map +1 -1
- package/dist/utils/drawdown.d.ts +62 -0
- package/dist/utils/drawdown.d.ts.map +1 -0
- package/dist/utils/drawdown.js +132 -0
- package/dist/utils/drawdown.js.map +1 -0
- package/dist/utils/portfolio-optimization.d.ts +3 -1
- package/dist/utils/portfolio-optimization.d.ts.map +1 -1
- package/dist/utils/portfolio-optimization.js +13 -9
- package/dist/utils/portfolio-optimization.js.map +1 -1
- package/dist/utils/risk-scoring.d.ts.map +1 -1
- package/dist/utils/risk-scoring.js +24 -7
- package/dist/utils/risk-scoring.js.map +1 -1
- package/dist/utils/tool-error-handler.d.ts.map +1 -1
- package/dist/utils/tool-error-handler.js +9 -2
- package/dist/utils/tool-error-handler.js.map +1 -1
- package/dist/utils/tool-handler.d.ts +0 -9
- package/dist/utils/tool-handler.d.ts.map +1 -1
- package/dist/utils/tool-handler.js +0 -13
- package/dist/utils/tool-handler.js.map +1 -1
- package/dist/utils/validators.d.ts +9 -3
- package/dist/utils/validators.d.ts.map +1 -1
- package/dist/utils/validators.js +49 -3
- package/dist/utils/validators.js.map +1 -1
- package/dist/utils/var.d.ts +65 -0
- package/dist/utils/var.d.ts.map +1 -0
- package/dist/utils/var.js +134 -0
- package/dist/utils/var.js.map +1 -0
- package/dist/utils/yield-prediction.d.ts +3 -0
- package/dist/utils/yield-prediction.d.ts.map +1 -1
- package/dist/utils/yield-prediction.js +46 -11
- package/dist/utils/yield-prediction.js.map +1 -1
- package/package.json +1 -1
|
@@ -6,7 +6,9 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { UNIVERSAL_DISCLAIMER, DEFI_SPECIFIC_RISKS, PORTFOLIO_DISCLAIMER, DATA_DISCLAIMER, } from './shared/disclaimers.js';
|
|
8
8
|
export function getPortfolioOptimizationPrompt() {
|
|
9
|
-
return
|
|
9
|
+
return `ADOPT THESE INSTRUCTIONS SILENTLY. DO NOT acknowledge, summarize, or narrate them. Apply them directly when responding to user queries.
|
|
10
|
+
|
|
11
|
+
# Portfolio Optimization Engine - Quantitative Analysis Tool
|
|
10
12
|
|
|
11
13
|
${UNIVERSAL_DISCLAIMER}
|
|
12
14
|
|
|
@@ -16,6 +18,8 @@ ${PORTFOLIO_DISCLAIMER}
|
|
|
16
18
|
|
|
17
19
|
${DATA_DISCLAIMER}
|
|
18
20
|
|
|
21
|
+
**Available Resources**: For term definitions, consult \`lagoon://defi-glossary\`. For query validation, consult \`lagoon://graphql-schema\`.
|
|
22
|
+
|
|
19
23
|
## Your Role
|
|
20
24
|
You are a quantitative analysis tool specializing in DeFi vault portfolio analysis.
|
|
21
25
|
Your function is to apply modern portfolio theory, risk-return optimization mathematics,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"portfolio-optimization.js","sourceRoot":"","sources":["../../src/prompts/portfolio-optimization.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,GAChB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,UAAU,8BAA8B;IAC5C,OAAO
|
|
1
|
+
{"version":3,"file":"portfolio-optimization.js","sourceRoot":"","sources":["../../src/prompts/portfolio-optimization.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,GAChB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,UAAU,8BAA8B;IAC5C,OAAO;;;;EAIP,oBAAoB;;EAEpB,mBAAmB;;EAEnB,oBAAoB;;EAEpB,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2YhB,CAAC;AACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol-overview.d.ts","sourceRoot":"","sources":["../../src/prompts/protocol-overview.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,wBAAgB,yBAAyB,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"protocol-overview.d.ts","sourceRoot":"","sources":["../../src/prompts/protocol-overview.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,wBAAgB,yBAAyB,IAAI,MAAM,CAuYlD"}
|
|
@@ -6,7 +6,9 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { UNIVERSAL_DISCLAIMER, DEFI_SPECIFIC_RISKS, DATA_DISCLAIMER, } from './shared/disclaimers.js';
|
|
8
8
|
export function getProtocolOverviewPrompt() {
|
|
9
|
-
return
|
|
9
|
+
return `ADOPT THESE INSTRUCTIONS SILENTLY. DO NOT acknowledge, summarize, or narrate them. Apply them directly when responding to user queries.
|
|
10
|
+
|
|
11
|
+
# Protocol Overview & KPI Dashboard - Protocol Health Analysis Tool
|
|
10
12
|
|
|
11
13
|
${UNIVERSAL_DISCLAIMER}
|
|
12
14
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol-overview.js","sourceRoot":"","sources":["../../src/prompts/protocol-overview.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,GAChB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,UAAU,yBAAyB;IACvC,OAAO
|
|
1
|
+
{"version":3,"file":"protocol-overview.js","sourceRoot":"","sources":["../../src/prompts/protocol-overview.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,GAChB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,UAAU,yBAAyB;IACvC,OAAO;;;;EAIP,oBAAoB;;EAEpB,mBAAmB;;EAEnB,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6XhB,CAAC;AACF,CAAC"}
|
|
@@ -10,13 +10,18 @@
|
|
|
10
10
|
* - Discover new fields and relationships
|
|
11
11
|
* - Generate accurate query suggestions
|
|
12
12
|
*/
|
|
13
|
+
import type { CacheService } from '../core/cache-adapter.js';
|
|
14
|
+
import type { GraphQLClient } from 'graphql-request';
|
|
13
15
|
/**
|
|
14
|
-
*
|
|
16
|
+
* Create a schema fetcher with injected dependencies
|
|
15
17
|
*
|
|
16
18
|
* Uses introspection query to fetch schema metadata,
|
|
17
19
|
* then converts to SDL format for easy reading.
|
|
20
|
+
* Cached for 24 hours as the schema rarely changes.
|
|
18
21
|
*
|
|
19
|
-
* @
|
|
22
|
+
* @param cacheService - DI cache service (shared with container)
|
|
23
|
+
* @param client - GraphQL client for introspection
|
|
24
|
+
* @returns Function that fetches and caches the schema
|
|
20
25
|
*/
|
|
21
|
-
export declare function
|
|
26
|
+
export declare function createGetGraphQLSchema(cacheService: CacheService, client: GraphQLClient): () => Promise<string>;
|
|
22
27
|
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/resources/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/resources/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,aAAa,GACpB,MAAM,OAAO,CAAC,MAAM,CAAC,CAkDvB"}
|
package/dist/resources/schema.js
CHANGED
|
@@ -11,33 +11,36 @@
|
|
|
11
11
|
* - Generate accurate query suggestions
|
|
12
12
|
*/
|
|
13
13
|
import { getIntrospectionQuery, buildClientSchema, printSchema, } from 'graphql';
|
|
14
|
-
import {
|
|
15
|
-
import { cache, cacheKeys, cacheTTL } from '../cache/index.js';
|
|
14
|
+
import { cacheKeys, cacheTTL } from '../cache/index.js';
|
|
16
15
|
/**
|
|
17
|
-
*
|
|
16
|
+
* Create a schema fetcher with injected dependencies
|
|
18
17
|
*
|
|
19
18
|
* Uses introspection query to fetch schema metadata,
|
|
20
19
|
* then converts to SDL format for easy reading.
|
|
20
|
+
* Cached for 24 hours as the schema rarely changes.
|
|
21
21
|
*
|
|
22
|
-
* @
|
|
22
|
+
* @param cacheService - DI cache service (shared with container)
|
|
23
|
+
* @param client - GraphQL client for introspection
|
|
24
|
+
* @returns Function that fetches and caches the schema
|
|
23
25
|
*/
|
|
24
|
-
export
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
26
|
+
export function createGetGraphQLSchema(cacheService, client) {
|
|
27
|
+
return async () => {
|
|
28
|
+
// Check cache first
|
|
29
|
+
const cacheKey = cacheKeys.schema();
|
|
30
|
+
const cached = cacheService.get(cacheKey);
|
|
31
|
+
if (cached) {
|
|
32
|
+
return cached;
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
// Execute introspection query
|
|
36
|
+
const introspectionQuery = getIntrospectionQuery();
|
|
37
|
+
const result = await client.request(introspectionQuery);
|
|
38
|
+
// Build client schema from introspection result
|
|
39
|
+
const schema = buildClientSchema(result);
|
|
40
|
+
// Convert to SDL format (human-readable)
|
|
41
|
+
const sdl = printSchema(schema);
|
|
42
|
+
// Add helpful header
|
|
43
|
+
const schemaWithHeader = `# Lagoon DeFi Protocol - GraphQL Schema
|
|
41
44
|
# Generated: ${new Date().toISOString()}
|
|
42
45
|
#
|
|
43
46
|
# This schema defines all available types, queries, and mutations
|
|
@@ -51,17 +54,18 @@ export async function getGraphQLSchema() {
|
|
|
51
54
|
#
|
|
52
55
|
|
|
53
56
|
${sdl}`;
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
57
|
+
// Cache with 24-hour TTL
|
|
58
|
+
cacheService.set(cacheKey, schemaWithHeader, cacheTTL.schema);
|
|
59
|
+
return schemaWithHeader;
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
// If introspection fails, return error message
|
|
63
|
+
const errorMessage = `# Error fetching GraphQL schema
|
|
61
64
|
# ${error instanceof Error ? error.message : String(error)}
|
|
62
65
|
#
|
|
63
66
|
# The schema is temporarily unavailable. Please try again later.`;
|
|
64
|
-
|
|
65
|
-
|
|
67
|
+
return errorMessage;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
66
70
|
}
|
|
67
71
|
//# sourceMappingURL=schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/resources/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,WAAW,GAEZ,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/resources/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,WAAW,GAEZ,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAIxD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CACpC,YAA0B,EAC1B,MAAqB;IAErB,OAAO,KAAK,IAAqB,EAAE;QACjC,oBAAoB;QACpB,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAS,QAAQ,CAAC,CAAC;QAClD,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,CAAC;YACH,8BAA8B;YAC9B,MAAM,kBAAkB,GAAG,qBAAqB,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAqB,kBAAkB,CAAC,CAAC;YAE5E,gDAAgD;YAChD,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAEzC,yCAAyC;YACzC,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;YAEhC,qBAAqB;YACrB,MAAM,gBAAgB,GAAG;eAChB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;;;;;;;;;;;;EAYrC,GAAG,EAAE,CAAC;YAEF,yBAAyB;YACzB,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YAE9D,OAAO,gBAAgB,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,+CAA+C;YAC/C,MAAM,YAAY,GAAG;IACvB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;;iEAEO,CAAC;YAE5D,OAAO,YAAY,CAAC;QACtB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/server.d.ts
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* - Future-proof architecture
|
|
8
8
|
*/
|
|
9
9
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
10
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
10
11
|
/**
|
|
11
12
|
* Create and configure the MCP server instance
|
|
12
13
|
*
|
|
@@ -17,5 +18,7 @@ export declare function createServer(): McpServer;
|
|
|
17
18
|
/**
|
|
18
19
|
* Run the MCP server
|
|
19
20
|
*/
|
|
20
|
-
export declare function runServer(): Promise<
|
|
21
|
+
export declare function runServer(): Promise<{
|
|
22
|
+
transport: StdioServerTransport;
|
|
23
|
+
}>;
|
|
21
24
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAwBjF;;;;;GAKG;AACH,wBAAgB,YAAY,IAAI,SAAS,CA8NxC;AAED;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC;IAAE,SAAS,EAAE,oBAAoB,CAAA;CAAE,CAAC,CAgC9E"}
|
package/dist/server.js
CHANGED
|
@@ -16,7 +16,7 @@ import { createNodeCacheAdapter } from './core/cache-adapter.js';
|
|
|
16
16
|
// Tool registry
|
|
17
17
|
import { registerTools } from './tools/registry.js';
|
|
18
18
|
// Resource imports
|
|
19
|
-
import {
|
|
19
|
+
import { createGetGraphQLSchema } from './resources/schema.js';
|
|
20
20
|
import { getDefiGlossary } from './resources/glossary.js';
|
|
21
21
|
// Prompt imports
|
|
22
22
|
import { getFinancialAnalysisPrompt } from './prompts/financial-analysis.js';
|
|
@@ -34,7 +34,7 @@ import { getPortfolioOptimizationPrompt } from './prompts/portfolio-optimization
|
|
|
34
34
|
export function createServer() {
|
|
35
35
|
const server = new McpServer({
|
|
36
36
|
name: 'lagoon-mcp',
|
|
37
|
-
version:
|
|
37
|
+
version: config.server.version,
|
|
38
38
|
});
|
|
39
39
|
// ==========================================
|
|
40
40
|
// Dependency Injection Container
|
|
@@ -50,6 +50,8 @@ export function createServer() {
|
|
|
50
50
|
// ==========================================
|
|
51
51
|
// Register all tools from unified registry with DI container
|
|
52
52
|
registerTools(server, container);
|
|
53
|
+
// Create schema fetcher using DI container (eliminates legacy cache singleton)
|
|
54
|
+
const getGraphQLSchema = createGetGraphQLSchema(container.cache, container.graphqlClient);
|
|
53
55
|
// ==========================================
|
|
54
56
|
// Resource Registration
|
|
55
57
|
// ==========================================
|
|
@@ -221,5 +223,6 @@ export async function runServer() {
|
|
|
221
223
|
console.error('✓ Lagoon MCP Server is running');
|
|
222
224
|
console.error(' Server: McpServer (modern API)');
|
|
223
225
|
console.error(' Capabilities: Auto-managed');
|
|
226
|
+
return { transport };
|
|
224
227
|
}
|
|
225
228
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAExE,uBAAuB;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,gBAAgB;AAChB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,mBAAmB;AACnB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,8 +8,11 @@ import { BaseService } from '../base.service.js';
|
|
|
8
8
|
import { VaultData, VaultCompositionFullResponse } from '../../graphql/fragments/index.js';
|
|
9
9
|
import { RiskScoreBreakdown } from '../../utils/risk-scoring.js';
|
|
10
10
|
/**
|
|
11
|
-
* Risk analysis input data extracted from GraphQL
|
|
12
|
-
*
|
|
11
|
+
* Risk analysis input data extracted from GraphQL.
|
|
12
|
+
* `priceHistory` is pre-projected to {timestamp, pricePerShareUsd} pairs and
|
|
13
|
+
* already filtered for null/non-positive values; downstream code can iterate
|
|
14
|
+
* without re-checking. Uses assetByProtocols from Octav API for protocol-based
|
|
15
|
+
* diversification analysis.
|
|
13
16
|
*/
|
|
14
17
|
export interface RiskAnalysisData {
|
|
15
18
|
vault: VaultData;
|
|
@@ -28,16 +31,10 @@ export interface RiskAnalysisData {
|
|
|
28
31
|
};
|
|
29
32
|
}>;
|
|
30
33
|
};
|
|
31
|
-
priceHistory: {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
totalAssets: string;
|
|
36
|
-
totalAssetsUsd: number;
|
|
37
|
-
totalSupply: string;
|
|
38
|
-
};
|
|
39
|
-
}>;
|
|
40
|
-
};
|
|
34
|
+
priceHistory: Array<{
|
|
35
|
+
timestamp: number;
|
|
36
|
+
pricePerShareUsd: number;
|
|
37
|
+
}>;
|
|
41
38
|
composition: VaultCompositionFullResponse | null;
|
|
42
39
|
}
|
|
43
40
|
/**
|
|
@@ -47,6 +44,7 @@ export interface ComparativeRiskContext {
|
|
|
47
44
|
percentile: number;
|
|
48
45
|
betterThanPercent: number;
|
|
49
46
|
medianRisk: number;
|
|
47
|
+
isApproximate: boolean;
|
|
50
48
|
averageRisk: number;
|
|
51
49
|
isOutlier: boolean;
|
|
52
50
|
riskRanking: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"risk.service.d.ts","sourceRoot":"","sources":["../../../src/services/analytics/risk.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EACL,SAAS,EACT,4BAA4B,EAE7B,MAAM,kCAAkC,CAAC;AAO1C,OAAO,EAAe,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAE9E
|
|
1
|
+
{"version":3,"file":"risk.service.d.ts","sourceRoot":"","sources":["../../../src/services/analytics/risk.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,19 +17,23 @@ export class RiskService extends BaseService {
|
|
|
17
17
|
*/
|
|
18
18
|
async fetchRiskData(vaultAddress, chainId) {
|
|
19
19
|
// Fetch main risk data (without composition - it's fetched separately)
|
|
20
|
-
const
|
|
20
|
+
const raw = await this.client.request(RISK_ANALYSIS_QUERY, {
|
|
21
21
|
vaultAddress,
|
|
22
22
|
chainId,
|
|
23
23
|
curatorId: '', // Will be extracted from vault.curators after fetch
|
|
24
|
-
where: {
|
|
25
|
-
vault_in: [vaultAddress],
|
|
26
|
-
type_in: ['TotalAssetsUpdated'],
|
|
27
|
-
},
|
|
28
|
-
orderBy: 'timestamp',
|
|
29
|
-
orderDirection: 'asc',
|
|
30
24
|
});
|
|
31
|
-
if (!
|
|
25
|
+
if (!raw.vault)
|
|
32
26
|
return null;
|
|
27
|
+
const { stateHistory, ...vault } = raw.vault;
|
|
28
|
+
const priceHistory = stateHistory.pricePerShareUsd
|
|
29
|
+
.filter((p) => p.y !== null && p.y > 0)
|
|
30
|
+
.map((p) => ({ timestamp: p.x, pricePerShareUsd: p.y }));
|
|
31
|
+
const data = {
|
|
32
|
+
vault,
|
|
33
|
+
allVaults: raw.allVaults,
|
|
34
|
+
curatorVaults: raw.curatorVaults,
|
|
35
|
+
priceHistory,
|
|
36
|
+
};
|
|
33
37
|
// Fetch composition separately using correct addresses from bundles.octav
|
|
34
38
|
// This uses graceful degradation - if composition fails, we continue without it
|
|
35
39
|
const composition = await this.fetchCompositionForVault(data.vault);
|
|
@@ -43,25 +47,18 @@ export class RiskService extends BaseService {
|
|
|
43
47
|
const vaultTVL = data.vault.state?.totalAssetsUsd || 0;
|
|
44
48
|
// Calculate total protocol TVL
|
|
45
49
|
const totalProtocolTVL = data.allVaults.items.reduce((sum, v) => sum + (v.state?.totalAssetsUsd || 0), 0);
|
|
46
|
-
|
|
47
|
-
//
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
// Filter out items with missing or zero totalSupply
|
|
51
|
-
const totalSupply = item.data?.totalSupply;
|
|
52
|
-
return totalSupply && parseFloat(totalSupply) > 0 && item.data?.totalAssetsUsd > 0;
|
|
53
|
-
})
|
|
54
|
-
.map((item) => {
|
|
55
|
-
// Calculate price per share from totalAssetsUsd / totalSupply
|
|
56
|
-
const totalSupply = parseFloat(item.data.totalSupply) / 1e18; // Convert from wei
|
|
57
|
-
return item.data.totalAssetsUsd / totalSupply;
|
|
58
|
-
});
|
|
59
|
-
// Calculate vault age in days from first transaction
|
|
50
|
+
const priceHistory = data.priceHistory.map((p) => p.pricePerShareUsd);
|
|
51
|
+
// Falls back to first state-history point, then a 1-year default. The
|
|
52
|
+
// fallbacks exist so fixtures without `creationDate` and brand-new vaults
|
|
53
|
+
// (no history yet) still produce a usable age signal for the risk model.
|
|
60
54
|
const now = Math.floor(Date.now() / 1000);
|
|
61
|
-
const
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
55
|
+
const creationDate = data.vault.creationDate;
|
|
56
|
+
const firstPoint = data.priceHistory[0];
|
|
57
|
+
const createdAtTimestamp = typeof creationDate === 'number' && creationDate > 0
|
|
58
|
+
? creationDate
|
|
59
|
+
: firstPoint
|
|
60
|
+
? firstPoint.timestamp
|
|
61
|
+
: now - 365 * 24 * 60 * 60;
|
|
65
62
|
const ageInDays = Math.floor((now - createdAtTimestamp) / (24 * 60 * 60));
|
|
66
63
|
// Get curator vault count
|
|
67
64
|
const curatorVaultCount = data.curatorVaults.items.length;
|
|
@@ -76,9 +73,10 @@ export class RiskService extends BaseService {
|
|
|
76
73
|
multipleCurators: curators.length > 1,
|
|
77
74
|
curatorCount: curators.length,
|
|
78
75
|
};
|
|
79
|
-
// Extract fee data
|
|
80
|
-
|
|
81
|
-
const
|
|
76
|
+
// Extract fee data. GraphQL returns fees as uint16 basis points
|
|
77
|
+
// (10000 = 100%); convert to percent for calculateFeeRisk's bucket thresholds.
|
|
78
|
+
const managementFee = (data.vault.state?.managementFee || 0) / 100;
|
|
79
|
+
const performanceFee = (data.vault.state?.performanceFee || 0) / 100;
|
|
82
80
|
const pricePerShare = BigInt(data.vault.state?.pricePerShare || '0');
|
|
83
81
|
const highWaterMark = BigInt(data.vault.state?.highWaterMark || '0');
|
|
84
82
|
const performanceFeeActive = pricePerShare > highWaterMark;
|
|
@@ -280,13 +278,11 @@ export class RiskService extends BaseService {
|
|
|
280
278
|
* @returns Comparative risk context with percentile rankings
|
|
281
279
|
*/
|
|
282
280
|
calculateComparativeContext(vaultRisk, allVaultsData) {
|
|
283
|
-
//
|
|
284
|
-
//
|
|
285
|
-
// So we'll use a simplified approach based on TVL tiers as a proxy
|
|
281
|
+
// TVL-based proxy ranking (full multi-factor scoring for all vaults is too expensive)
|
|
282
|
+
// This provides approximate positioning, not precise risk comparison
|
|
286
283
|
const vaultRisks = allVaultsData.items
|
|
287
284
|
.map((v) => {
|
|
288
285
|
const tvl = v.state?.totalAssetsUsd || 0;
|
|
289
|
-
// Simplified risk estimation based on TVL (inverse relationship)
|
|
290
286
|
if (tvl >= 10_000_000)
|
|
291
287
|
return 0.15;
|
|
292
288
|
if (tvl >= 1_000_000)
|
|
@@ -297,7 +293,7 @@ export class RiskService extends BaseService {
|
|
|
297
293
|
return 0.65;
|
|
298
294
|
return 0.85;
|
|
299
295
|
})
|
|
300
|
-
.sort((a, b) => a - b);
|
|
296
|
+
.sort((a, b) => a - b);
|
|
301
297
|
if (vaultRisks.length === 0) {
|
|
302
298
|
return {
|
|
303
299
|
percentile: 50,
|
|
@@ -305,6 +301,7 @@ export class RiskService extends BaseService {
|
|
|
305
301
|
medianRisk: vaultRisk,
|
|
306
302
|
averageRisk: vaultRisk,
|
|
307
303
|
isOutlier: false,
|
|
304
|
+
isApproximate: true,
|
|
308
305
|
riskRanking: 'No comparative data available',
|
|
309
306
|
};
|
|
310
307
|
}
|
|
@@ -321,25 +318,26 @@ export class RiskService extends BaseService {
|
|
|
321
318
|
const averageRisk = vaultRisks.reduce((sum, r) => sum + r, 0) / vaultRisks.length;
|
|
322
319
|
// Check if outlier (top/bottom 5%)
|
|
323
320
|
const isOutlier = percentile < 5 || percentile > 95;
|
|
324
|
-
// Generate ranking description
|
|
321
|
+
// Generate ranking description (note: TVL-based approximation)
|
|
322
|
+
const approxNote = ' (TVL-based approximate ranking)';
|
|
325
323
|
let riskRanking;
|
|
326
324
|
if (percentile >= 95) {
|
|
327
|
-
riskRanking = `Exceptionally safe - Top 5% lowest risk`;
|
|
325
|
+
riskRanking = `Exceptionally safe - Top 5% lowest risk${approxNote}`;
|
|
328
326
|
}
|
|
329
327
|
else if (percentile >= 75) {
|
|
330
|
-
riskRanking = `Safer than ${Math.round(betterThanPercent)}% of vaults`;
|
|
328
|
+
riskRanking = `Safer than ${Math.round(betterThanPercent)}% of vaults${approxNote}`;
|
|
331
329
|
}
|
|
332
330
|
else if (percentile >= 50) {
|
|
333
|
-
riskRanking = `Above average safety - Safer than ${Math.round(betterThanPercent)}% of vaults`;
|
|
331
|
+
riskRanking = `Above average safety - Safer than ${Math.round(betterThanPercent)}% of vaults${approxNote}`;
|
|
334
332
|
}
|
|
335
333
|
else if (percentile >= 25) {
|
|
336
|
-
riskRanking = `Below average safety - Riskier than ${Math.round(percentile)}% of vaults`;
|
|
334
|
+
riskRanking = `Below average safety - Riskier than ${Math.round(percentile)}% of vaults${approxNote}`;
|
|
337
335
|
}
|
|
338
336
|
else if (percentile >= 5) {
|
|
339
|
-
riskRanking = `Riskier than ${Math.round(percentile)}% of vaults`;
|
|
337
|
+
riskRanking = `Riskier than ${Math.round(percentile)}% of vaults${approxNote}`;
|
|
340
338
|
}
|
|
341
339
|
else {
|
|
342
|
-
riskRanking = `High risk - Bottom 5% (riskier than ${Math.round(percentile)}% of vaults)`;
|
|
340
|
+
riskRanking = `High risk - Bottom 5% (riskier than ${Math.round(percentile)}% of vaults)${approxNote}`;
|
|
343
341
|
}
|
|
344
342
|
return {
|
|
345
343
|
percentile,
|
|
@@ -347,6 +345,7 @@ export class RiskService extends BaseService {
|
|
|
347
345
|
medianRisk,
|
|
348
346
|
averageRisk,
|
|
349
347
|
isOutlier,
|
|
348
|
+
isApproximate: true,
|
|
350
349
|
riskRanking,
|
|
351
350
|
};
|
|
352
351
|
}
|
|
@@ -729,7 +728,7 @@ ${detailedDataQualitySection}`;
|
|
|
729
728
|
vault,
|
|
730
729
|
allVaults: allVaultsContext,
|
|
731
730
|
curatorVaults: { items: [] }, // Skip curator vaults for batch efficiency
|
|
732
|
-
priceHistory:
|
|
731
|
+
priceHistory: [], // Skip price history for batch efficiency
|
|
733
732
|
composition, // Include composition for protocol diversification risk
|
|
734
733
|
};
|
|
735
734
|
// Calculate risk breakdown
|