@continuumdao/ctm-mpc-defi 0.2.9 → 0.2.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/agent/catalog.cjs +519 -19
  2. package/dist/agent/catalog.cjs.map +1 -1
  3. package/dist/agent/catalog.d.ts +618 -14
  4. package/dist/agent/catalog.js +507 -20
  5. package/dist/agent/catalog.js.map +1 -1
  6. package/dist/agent/skills/hyperliquid/SKILL.md +34 -6
  7. package/dist/agent/skills/morpho/SKILL.md +48 -0
  8. package/dist/core/index.cjs +9 -0
  9. package/dist/core/index.cjs.map +1 -1
  10. package/dist/core/index.d.ts +3 -1
  11. package/dist/core/index.js +8 -1
  12. package/dist/core/index.js.map +1 -1
  13. package/dist/index.cjs +9 -0
  14. package/dist/index.cjs.map +1 -1
  15. package/dist/index.d.ts +1 -1
  16. package/dist/index.js +8 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/protocols/evm/aave-v4/index.cjs.map +1 -1
  19. package/dist/protocols/evm/aave-v4/index.js.map +1 -1
  20. package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
  21. package/dist/protocols/evm/euler-v2/index.js.map +1 -1
  22. package/dist/protocols/evm/hyperliquid/index.cjs +407 -34
  23. package/dist/protocols/evm/hyperliquid/index.cjs.map +1 -1
  24. package/dist/protocols/evm/hyperliquid/index.d.ts +168 -15
  25. package/dist/protocols/evm/hyperliquid/index.js +390 -35
  26. package/dist/protocols/evm/hyperliquid/index.js.map +1 -1
  27. package/dist/protocols/evm/maple/index.cjs.map +1 -1
  28. package/dist/protocols/evm/maple/index.js.map +1 -1
  29. package/dist/protocols/evm/morpho/index.cjs +1971 -0
  30. package/dist/protocols/evm/morpho/index.cjs.map +1 -0
  31. package/dist/protocols/evm/morpho/index.d.ts +522 -0
  32. package/dist/protocols/evm/morpho/index.js +1918 -0
  33. package/dist/protocols/evm/morpho/index.js.map +1 -0
  34. package/dist/protocols/evm/sky/index.cjs.map +1 -1
  35. package/dist/protocols/evm/sky/index.js.map +1 -1
  36. package/package.json +6 -1
@@ -927,6 +927,74 @@ var mcpEulerV2CollateralWithdrawInputSchema = mcpMultisignInput({
927
927
  collateralAsset: evmAddressSchema,
928
928
  amountHuman: zod.z.string().min(1)
929
929
  });
930
+ var mcpMorphoVaultDepositInputSchema = mcpMultisignInput({
931
+ vault: evmAddressSchema,
932
+ underlying: evmAddressSchema.describe("Underlying asset; use wrapped native with isNativeIn for ETH."),
933
+ amountHuman: zod.z.string().min(1),
934
+ isNativeIn: zod.z.boolean().optional()
935
+ });
936
+ var mcpMorphoVaultWithdrawInputSchema = mcpMultisignInput({
937
+ vault: evmAddressSchema,
938
+ amountHuman: zod.z.string().min(1)
939
+ });
940
+ var mcpMorphoBlueCollateralDepositInputSchema = mcpMultisignInput({
941
+ marketId: zod.z.string().min(1).describe("Morpho Blue marketId from API."),
942
+ collateralToken: evmAddressSchema,
943
+ amountHuman: zod.z.string().min(1),
944
+ isNativeIn: zod.z.boolean().optional()
945
+ });
946
+ var mcpMorphoBlueBorrowInputSchema = mcpMultisignInput({
947
+ marketId: zod.z.string().min(1),
948
+ loanToken: evmAddressSchema,
949
+ amountHuman: zod.z.string().min(1)
950
+ });
951
+ var mcpMorphoBlueRepayInputSchema = mcpMultisignInput({
952
+ marketId: zod.z.string().min(1),
953
+ loanToken: evmAddressSchema,
954
+ amountHuman: zod.z.string().min(1)
955
+ });
956
+ var mcpMorphoBlueCollateralWithdrawInputSchema = mcpMultisignInput({
957
+ marketId: zod.z.string().min(1),
958
+ amountHuman: zod.z.string().min(1),
959
+ collateralDecimals: zod.z.number().int().min(0).max(36).optional()
960
+ });
961
+ var mcpMorphoMerklClaimInputSchema = mcpMultisignInput({
962
+ claimData: zod.z.string().min(1).describe("Hex calldata for Merkl Distributor.claim from Merkl API."),
963
+ distributor: evmAddressSchema.optional(),
964
+ valueWei: zod.z.string().optional()
965
+ });
966
+ var morphoExposureRowSchema = zod.z.object({
967
+ label: zod.z.string(),
968
+ allocatedUsdLabel: zod.z.string(),
969
+ allocationPercentLabel: zod.z.string()
970
+ });
971
+ var mcpMorphoFetchEarnVaultsInputSchema = zod.z.object({
972
+ chainId: zod.z.number().int().positive(),
973
+ underlying: zod.z.string().trim().min(1).optional().describe("Deposit asset symbol (e.g. USDC) or ERC-20 address. Omit to search all listed vaults on the chain."),
974
+ query: zod.z.string().trim().min(1).optional().describe("Case-insensitive filter on vault name, symbol, address, or underlying symbol (e.g. Steakhouse, bbqUSDC)."),
975
+ limit: zod.z.number().int().min(1).max(200).optional().describe("Max rows (default 50).")
976
+ });
977
+ var mcpMorphoFetchEarnVaultsOutputSchema = zod.z.object({
978
+ vaults: zod.z.array(
979
+ zod.z.object({
980
+ vaultAddress: zod.z.string(),
981
+ vaultName: zod.z.string(),
982
+ vaultSymbol: zod.z.string(),
983
+ underlyingAddress: zod.z.string(),
984
+ underlyingSymbol: zod.z.string(),
985
+ apy: zod.z.string(),
986
+ netApy: zod.z.string(),
987
+ netApy7d: zod.z.string(),
988
+ netApy30d: zod.z.string(),
989
+ netApy90d: zod.z.string(),
990
+ performanceFee: zod.z.string(),
991
+ managementFee: zod.z.string().nullable(),
992
+ totalDepositsUsd: zod.z.string(),
993
+ liquidityUsd: zod.z.string(),
994
+ exposure: zod.z.array(morphoExposureRowSchema)
995
+ })
996
+ )
997
+ });
930
998
  function mcpGmxMultisignInput(fields) {
931
999
  return evmMultisignCommonInputSchema.extend(fields);
932
1000
  }
@@ -1131,7 +1199,8 @@ var mcpHyperliquidFetchMarketsOutputSchema = zod.z.object({
1131
1199
  asset: zod.z.number(),
1132
1200
  szDecimals: zod.z.number(),
1133
1201
  maxLeverage: zod.z.number(),
1134
- onlyIsolated: zod.z.boolean().optional()
1202
+ onlyIsolated: zod.z.boolean().optional(),
1203
+ dex: zod.z.string().optional()
1135
1204
  })
1136
1205
  ),
1137
1206
  dexes: zod.z.array(
@@ -1141,6 +1210,30 @@ var mcpHyperliquidFetchMarketsOutputSchema = zod.z.object({
1141
1210
  })
1142
1211
  )
1143
1212
  });
1213
+ var mcpHyperliquidSearchMarketsInputSchema = zod.z.object({
1214
+ chainId: zod.z.number().int().positive(),
1215
+ query: zod.z.string().min(1),
1216
+ dex: zod.z.string().optional(),
1217
+ limit: zod.z.number().int().positive().max(50).optional()
1218
+ });
1219
+ var mcpHyperliquidSearchMarketsOutputSchema = zod.z.object({
1220
+ matches: zod.z.array(
1221
+ zod.z.object({
1222
+ coin: zod.z.string(),
1223
+ symbol: zod.z.string(),
1224
+ dex: zod.z.string().optional(),
1225
+ asset: zod.z.number(),
1226
+ szDecimals: zod.z.number(),
1227
+ maxLeverage: zod.z.number(),
1228
+ onlyIsolated: zod.z.boolean().optional(),
1229
+ displayName: zod.z.string().optional(),
1230
+ category: zod.z.string().optional(),
1231
+ keywords: zod.z.array(zod.z.string()).optional(),
1232
+ matchScore: zod.z.number(),
1233
+ matchReason: zod.z.string()
1234
+ })
1235
+ )
1236
+ });
1144
1237
  var mcpHyperliquidFetchOpenContextInputSchema = zod.z.object({
1145
1238
  chainId: zod.z.number().int().positive(),
1146
1239
  executorAddress: evmAddressSchema,
@@ -1183,25 +1276,70 @@ var mcpHyperliquidFetchMarketSnapshotInputSchema = zod.z.object({
1183
1276
  chainId: zod.z.number().int().positive(),
1184
1277
  coin: zod.z.string().min(1),
1185
1278
  interval: hyperliquidOhlcvIntervalSchema.optional(),
1186
- dex: zod.z.string().optional()
1279
+ dex: zod.z.string().optional(),
1280
+ /** Recent OHLCV bars to return (default 48, max 200). Live price is always current. */
1281
+ candleLimit: zod.z.number().int().positive().max(200).optional()
1282
+ });
1283
+ var hyperliquidOhlcvCandleSchema = zod.z.object({
1284
+ timestampMs: zod.z.number(),
1285
+ open: zod.z.string(),
1286
+ high: zod.z.string(),
1287
+ low: zod.z.string(),
1288
+ close: zod.z.string(),
1289
+ volume: zod.z.string()
1290
+ });
1291
+ var hyperliquidLivePriceSchema = zod.z.object({
1292
+ markPx: zod.z.string().nullable(),
1293
+ midPx: zod.z.string().nullable(),
1294
+ oraclePx: zod.z.string().nullable(),
1295
+ prevDayPx: zod.z.string().nullable(),
1296
+ midUsd: zod.z.string(),
1297
+ source: zod.z.enum(["midPx", "markPx", "allMids"])
1187
1298
  });
1188
1299
  var mcpHyperliquidFetchMarketSnapshotOutputSchema = zod.z.object({
1189
1300
  snapshot: zod.z.object({
1190
1301
  coin: zod.z.string(),
1191
- midUsd: zod.z.string().nullable(),
1302
+ dex: zod.z.string().nullable(),
1303
+ livePrice: hyperliquidLivePriceSchema,
1304
+ midUsd: zod.z.string(),
1192
1305
  fetchedAtMs: zod.z.number(),
1193
1306
  interval: hyperliquidOhlcvIntervalSchema,
1194
- candles: zod.z.array(
1195
- zod.z.object({
1196
- timestampMs: zod.z.number(),
1197
- open: zod.z.string(),
1198
- high: zod.z.string(),
1199
- low: zod.z.string(),
1200
- close: zod.z.string(),
1201
- volume: zod.z.string()
1202
- })
1203
- )
1204
- })
1307
+ latestCandle: hyperliquidOhlcvCandleSchema.nullable(),
1308
+ candles: zod.z.array(hyperliquidOhlcvCandleSchema),
1309
+ candleCount: zod.z.number()
1310
+ }),
1311
+ resolvedCoin: zod.z.string(),
1312
+ dex: zod.z.string().nullable()
1313
+ });
1314
+ var mcpHyperliquidFetchOhlcvInputSchema = zod.z.object({
1315
+ chainId: zod.z.number().int().positive(),
1316
+ coin: zod.z.string().min(1),
1317
+ interval: hyperliquidOhlcvIntervalSchema.optional(),
1318
+ dex: zod.z.string().optional(),
1319
+ /** Calendar-day lookback ending now (e.g. 7 = last week). Preferred for agent requests. */
1320
+ lookbackDays: zod.z.number().positive().max(90).optional(),
1321
+ /** Hour lookback ending now. Alternative to lookbackDays. */
1322
+ lookbackHours: zod.z.number().positive().max(90 * 24).optional(),
1323
+ /** Explicit range start (ms since epoch). Use with endTimeMs. */
1324
+ startTimeMs: zod.z.number().int().positive().optional(),
1325
+ /** Explicit range end (ms since epoch). Defaults to now. */
1326
+ endTimeMs: zod.z.number().int().positive().optional()
1327
+ });
1328
+ var mcpHyperliquidFetchOhlcvOutputSchema = zod.z.object({
1329
+ ohlcv: zod.z.object({
1330
+ coin: zod.z.string(),
1331
+ dex: zod.z.string().nullable(),
1332
+ interval: hyperliquidOhlcvIntervalSchema,
1333
+ startTimeMs: zod.z.number(),
1334
+ endTimeMs: zod.z.number(),
1335
+ expectedBars: zod.z.number(),
1336
+ candleCount: zod.z.number(),
1337
+ latestCandle: hyperliquidOhlcvCandleSchema.nullable(),
1338
+ candles: zod.z.array(hyperliquidOhlcvCandleSchema),
1339
+ fetchedAtMs: zod.z.number()
1340
+ }),
1341
+ resolvedCoin: zod.z.string(),
1342
+ dex: zod.z.string().nullable()
1205
1343
  });
1206
1344
  var mcpHyperliquidFetchUsdClassBalancesInputSchema = zod.z.object({
1207
1345
  chainId: zod.z.number().int().positive(),
@@ -1612,6 +1750,87 @@ var MCP_PROTOCOL_TOOL_DEFINITIONS = [
1612
1750
  handler: { importPath: "protocols/evm/euler-v2", exportName: "buildEvmMultisignBodyEulerV2BorrowCollateralWithdrawBatch" },
1613
1751
  inputZod: mcpEulerV2CollateralWithdrawInputSchema
1614
1752
  }),
1753
+ defineProtocolMcpTool({
1754
+ name: "ctm_morpho_build_vault_deposit_multisign",
1755
+ actionId: "morpho.vault-deposit",
1756
+ protocolId: "morpho",
1757
+ chainCategory: "evm",
1758
+ description: "Build Morpho vault deposit batch (wrap/approve + deposit). Works with listed V1 and V2 vaults.",
1759
+ prerequisites: [
1760
+ "keyGenId",
1761
+ "chainId",
1762
+ "vaultAddress from ctm_morpho_fetch_earn_vaults",
1763
+ "underlying",
1764
+ "amountHuman"
1765
+ ],
1766
+ handler: { importPath: "protocols/evm/morpho", exportName: "buildEvmMultisignBodyMorphoVaultDepositBatch" },
1767
+ inputZod: mcpMorphoVaultDepositInputSchema
1768
+ }),
1769
+ defineProtocolMcpTool({
1770
+ name: "ctm_morpho_build_vault_withdraw_multisign",
1771
+ actionId: "morpho.vault-withdraw",
1772
+ protocolId: "morpho",
1773
+ chainCategory: "evm",
1774
+ description: "Build Morpho vault withdraw batch. Works with listed V1 and V2 vaults.",
1775
+ prerequisites: [
1776
+ "keyGenId",
1777
+ "chainId",
1778
+ "vaultAddress from ctm_morpho_fetch_earn_vaults or user positions",
1779
+ "amountHuman"
1780
+ ],
1781
+ handler: { importPath: "protocols/evm/morpho", exportName: "buildEvmMultisignBodyMorphoVaultWithdraw" },
1782
+ inputZod: mcpMorphoVaultWithdrawInputSchema
1783
+ }),
1784
+ defineProtocolMcpTool({
1785
+ name: "ctm_morpho_build_blue_collateral_deposit_multisign",
1786
+ actionId: "morpho.blue-collateral-deposit",
1787
+ protocolId: "morpho",
1788
+ chainCategory: "evm",
1789
+ description: "Build Morpho Blue supplyCollateral batch.",
1790
+ prerequisites: ["keyGenId", "chainId", "marketId", "collateralToken", "amountHuman"],
1791
+ handler: { importPath: "protocols/evm/morpho", exportName: "buildEvmMultisignBodyMorphoBlueSupplyCollateralBatch" },
1792
+ inputZod: mcpMorphoBlueCollateralDepositInputSchema
1793
+ }),
1794
+ defineProtocolMcpTool({
1795
+ name: "ctm_morpho_build_blue_borrow_multisign",
1796
+ actionId: "morpho.blue-borrow",
1797
+ protocolId: "morpho",
1798
+ chainCategory: "evm",
1799
+ description: "Build Morpho Blue borrow batch.",
1800
+ prerequisites: ["keyGenId", "chainId", "marketId", "loanToken", "amountHuman"],
1801
+ handler: { importPath: "protocols/evm/morpho", exportName: "buildEvmMultisignBodyMorphoBlueBorrowBatch" },
1802
+ inputZod: mcpMorphoBlueBorrowInputSchema
1803
+ }),
1804
+ defineProtocolMcpTool({
1805
+ name: "ctm_morpho_build_blue_repay_multisign",
1806
+ actionId: "morpho.blue-repay",
1807
+ protocolId: "morpho",
1808
+ chainCategory: "evm",
1809
+ description: "Build Morpho Blue repay batch.",
1810
+ prerequisites: ["keyGenId", "chainId", "marketId", "loanToken", "amountHuman"],
1811
+ handler: { importPath: "protocols/evm/morpho", exportName: "buildEvmMultisignBodyMorphoBlueRepayBatch" },
1812
+ inputZod: mcpMorphoBlueRepayInputSchema
1813
+ }),
1814
+ defineProtocolMcpTool({
1815
+ name: "ctm_morpho_build_blue_collateral_withdraw_multisign",
1816
+ actionId: "morpho.blue-collateral-withdraw",
1817
+ protocolId: "morpho",
1818
+ chainCategory: "evm",
1819
+ description: "Build Morpho Blue withdrawCollateral batch.",
1820
+ prerequisites: ["keyGenId", "chainId", "marketId", "amountHuman"],
1821
+ handler: { importPath: "protocols/evm/morpho", exportName: "buildEvmMultisignBodyMorphoBlueWithdrawCollateralBatch" },
1822
+ inputZod: mcpMorphoBlueCollateralWithdrawInputSchema
1823
+ }),
1824
+ defineProtocolMcpTool({
1825
+ name: "ctm_morpho_build_merkl_claim_multisign",
1826
+ actionId: "morpho.merkl-claim",
1827
+ protocolId: "morpho",
1828
+ chainCategory: "evm",
1829
+ description: "Build Morpho Merkl Distributor.claim transaction.",
1830
+ prerequisites: ["keyGenId", "chainId", "claim calldata from Merkl API"],
1831
+ handler: { importPath: "protocols/evm/morpho", exportName: "buildEvmMultisignBodyMorphoMerklDistributorClaim" },
1832
+ inputZod: mcpMorphoMerklClaimInputSchema
1833
+ }),
1615
1834
  defineProtocolMcpTool({
1616
1835
  name: "ctm_gmx_build_increase_multisign",
1617
1836
  actionId: "gmx.increase",
@@ -2135,19 +2354,31 @@ var CORE_MCP_TOOL_DEFINITIONS = [
2135
2354
  actionId: "hyperliquid.fetch-markets",
2136
2355
  protocolId: "hyperliquid",
2137
2356
  chainCategory: "evm",
2138
- description: "List Hyperliquid perp markets (coin, maxLeverage, szDecimals) and HIP-3 dex names. chainId 999 mainnet or 998 testnet.",
2357
+ description: "List Hyperliquid perp markets (native + all HIP-3 dexes when dex omitted). Each market has coin name, maxLeverage, szDecimals, and optional dex (e.g. xyz for xyz:AAPL). chainId 999 mainnet or 998 testnet.",
2139
2358
  prerequisites: ["chainId 999 or 998"],
2140
2359
  followUp: ["ctm_hyperliquid_fetch_open_context", "ctm_hyperliquid_build_limit_order_multisign"],
2141
2360
  handler: { importPath: "protocols/evm/hyperliquid", exportName: "hyperliquidFetchMarketsSummary" },
2142
2361
  inputZod: mcpHyperliquidFetchMarketsInputSchema,
2143
2362
  outputZod: mcpHyperliquidFetchMarketsOutputSchema
2144
2363
  }),
2364
+ defineMcpTool({
2365
+ name: "ctm_hyperliquid_search_markets",
2366
+ actionId: "hyperliquid.search-markets",
2367
+ protocolId: "hyperliquid",
2368
+ chainCategory: "evm",
2369
+ description: "Search Hyperliquid perp markets across all dexes by ticker (AAPL, BTC), display name, or keyword (Apple, tesla). Case-insensitive. Returns canonical coin names (e.g. xyz:AAPL).",
2370
+ prerequisites: ["chainId 999 or 998", "query"],
2371
+ followUp: ["ctm_hyperliquid_fetch_open_context", "ctm_hyperliquid_build_limit_order_multisign"],
2372
+ handler: { importPath: "protocols/evm/hyperliquid", exportName: "hyperliquidSearchMarketsSummary" },
2373
+ inputZod: mcpHyperliquidSearchMarketsInputSchema,
2374
+ outputZod: mcpHyperliquidSearchMarketsOutputSchema
2375
+ }),
2145
2376
  defineMcpTool({
2146
2377
  name: "ctm_hyperliquid_fetch_open_context",
2147
2378
  actionId: "hyperliquid.fetch-open-context",
2148
2379
  protocolId: "hyperliquid",
2149
2380
  chainCategory: "evm",
2150
- description: "Per-market trading context: account value, withdrawable, margin used, leverage setting, mark price, available buy/sell size.",
2381
+ description: "Per-market trading context: account value, withdrawable, margin used, leverage setting, mark price, available buy/sell size. Resolves ticker/name (AAPL, Apple) across dexes.",
2151
2382
  prerequisites: ["chainId", "executorAddress", "coin from fetch_markets"],
2152
2383
  followUp: ["ctm_hyperliquid_build_limit_order_multisign"],
2153
2384
  handler: { importPath: "protocols/evm/hyperliquid", exportName: "hyperliquidFetchOpenContextSummary" },
@@ -2183,13 +2414,25 @@ var CORE_MCP_TOOL_DEFINITIONS = [
2183
2414
  actionId: "hyperliquid.fetch-market-snapshot",
2184
2415
  protocolId: "hyperliquid",
2185
2416
  chainCategory: "evm",
2186
- description: "Mid price and OHLCV candles for a Hyperliquid perp coin. Default interval 15m.",
2417
+ description: "Live mark/mid price plus recent OHLCV candles for a Hyperliquid perp. Uses metaAndAssetCtxs for live prices (not stale candle close). Default interval 15m, 48 bars. Throws if live price unavailable.",
2187
2418
  prerequisites: ["chainId", "coin"],
2188
2419
  followUp: ["ctm_hyperliquid_fetch_open_context", "ctm_hyperliquid_build_limit_order_multisign"],
2189
2420
  handler: { importPath: "protocols/evm/hyperliquid", exportName: "hyperliquidFetchMarketSnapshotSummary" },
2190
2421
  inputZod: mcpHyperliquidFetchMarketSnapshotInputSchema,
2191
2422
  outputZod: mcpHyperliquidFetchMarketSnapshotOutputSchema
2192
2423
  }),
2424
+ defineMcpTool({
2425
+ name: "ctm_hyperliquid_fetch_ohlcv",
2426
+ actionId: "hyperliquid.fetch-ohlcv",
2427
+ protocolId: "hyperliquid",
2428
+ chainCategory: "evm",
2429
+ description: "OHLCV candle history for a Hyperliquid perp over an explicit lookback or time range. Requests only the needed window from Hyperliquid (e.g. lookbackDays: 7, interval: 15m \u2192 ~672 bars). Max 2000 bars \u2014 use coarser interval for longer history. Resolves ticker/name across dexes.",
2430
+ prerequisites: ["chainId 999 or 998", "coin", "lookbackDays or lookbackHours or startTimeMs"],
2431
+ followUp: ["ctm_hyperliquid_fetch_market_snapshot", "ctm_hyperliquid_build_limit_order_multisign"],
2432
+ handler: { importPath: "protocols/evm/hyperliquid", exportName: "hyperliquidFetchOhlcvSummary" },
2433
+ inputZod: mcpHyperliquidFetchOhlcvInputSchema,
2434
+ outputZod: mcpHyperliquidFetchOhlcvOutputSchema
2435
+ }),
2193
2436
  defineMcpTool({
2194
2437
  name: "ctm_hyperliquid_fetch_usd_class_balances",
2195
2438
  actionId: "hyperliquid.fetch-usd-balances",
@@ -2249,6 +2492,21 @@ var CORE_MCP_TOOL_DEFINITIONS = [
2249
2492
  handler: { importPath: "protocols/evm/hyperliquid", exportName: "hyperliquidFetchDelegationsForExecutor" },
2250
2493
  inputZod: mcpHyperliquidFetchDelegationsInputSchema,
2251
2494
  outputZod: mcpHyperliquidFetchDelegationsOutputSchema
2495
+ }),
2496
+ defineMcpTool({
2497
+ name: "ctm_morpho_fetch_earn_vaults",
2498
+ actionId: "morpho.fetch-earn-vaults",
2499
+ protocolId: "morpho",
2500
+ chainCategory: "evm",
2501
+ description: "Morpho-listed earn vaults (V1 + V2 unified). Filter by deposit asset symbol/address and/or case-insensitive vault name search. Returns vaultAddress for deposit/withdraw multisign tools.",
2502
+ prerequisites: ["chainId"],
2503
+ followUp: [
2504
+ "ctm_morpho_build_vault_deposit_multisign",
2505
+ "ctm_morpho_build_vault_withdraw_multisign"
2506
+ ],
2507
+ handler: { importPath: "protocols/evm/morpho", exportName: "morphoFetchEarnVaultsSummary" },
2508
+ inputZod: mcpMorphoFetchEarnVaultsInputSchema,
2509
+ outputZod: mcpMorphoFetchEarnVaultsOutputSchema
2252
2510
  })
2253
2511
  ];
2254
2512
  var MCP_TOOL_DEFINITIONS = [
@@ -2475,7 +2733,30 @@ registerProtocolModule(ethenaProtocolModule);
2475
2733
  function isMapleSyrupSupportedChain(chainId) {
2476
2734
  return chainId === 1 || chainId === 11155111;
2477
2735
  }
2736
+
2737
+ // src/core/defiProxy.ts
2738
+ var aaveGraphqlProxyUrl;
2739
+ var morphoGraphqlProxyUrl;
2740
+ function getAaveGraphqlProxyUrl() {
2741
+ return aaveGraphqlProxyUrl;
2742
+ }
2743
+ function getMorphoGraphqlProxyUrl() {
2744
+ return morphoGraphqlProxyUrl;
2745
+ }
2478
2746
  async function postJsonViaOptionalProxy(args) {
2747
+ const proxy = args.proxyUrl?.trim();
2748
+ if (proxy) {
2749
+ const r2 = await fetch(proxy, {
2750
+ method: "POST",
2751
+ headers: { "content-type": "application/json" },
2752
+ body: JSON.stringify(args.proxyEnvelope ?? args.body)
2753
+ });
2754
+ if (!r2.ok) {
2755
+ const t = await r2.text().catch(() => "");
2756
+ throw new Error(t ? `Proxy HTTP ${r2.status}: ${t.slice(0, 200)}` : `Proxy HTTP ${r2.status}`);
2757
+ }
2758
+ return await r2.json();
2759
+ }
2479
2760
  const r = await fetch(args.directUrl, {
2480
2761
  method: "POST",
2481
2762
  headers: { "content-type": "application/json" },
@@ -2538,7 +2819,10 @@ async function aaveV4Gql(query, variables) {
2538
2819
  const body = { query, variables: variables ?? {} };
2539
2820
  const j = await postJsonViaOptionalProxy({
2540
2821
  directUrl: AAVE_V4_GRAPHQL_URL,
2541
- body});
2822
+ body,
2823
+ proxyUrl: getAaveGraphqlProxyUrl(),
2824
+ proxyEnvelope: body
2825
+ });
2542
2826
  if (j.errors?.length) {
2543
2827
  const msg = j.errors.map((e) => e.message ?? "Unknown").join("; ");
2544
2828
  throw new Error(msg);
@@ -3011,6 +3295,175 @@ var hyperliquidProtocolModule = {
3011
3295
  ]
3012
3296
  };
3013
3297
  registerProtocolModule(hyperliquidProtocolModule);
3298
+ var MORPHO_GRAPHQL_URL = "https://api.morpho.org/graphql";
3299
+ async function morphoGql(query, variables) {
3300
+ const body = { query, variables: variables ?? {} };
3301
+ const j = await postJsonViaOptionalProxy({
3302
+ directUrl: MORPHO_GRAPHQL_URL,
3303
+ body,
3304
+ proxyUrl: getMorphoGraphqlProxyUrl(),
3305
+ proxyEnvelope: body
3306
+ });
3307
+ if (j.errors?.length) {
3308
+ const msg = j.errors.map((e) => e.message ?? "Unknown").join("; ");
3309
+ throw new Error(msg);
3310
+ }
3311
+ if (j.data == null) throw new Error("Morpho API: empty response");
3312
+ return j.data;
3313
+ }
3314
+ async function fetchMorphoChains() {
3315
+ const d = await morphoGql(`
3316
+ query { chains { id network } }
3317
+ `);
3318
+ return d.chains ?? [];
3319
+ }
3320
+ async function loadMorphoSupportedChainIds() {
3321
+ const rows = await fetchMorphoChains();
3322
+ const s = /* @__PURE__ */ new Set();
3323
+ for (const c of rows) {
3324
+ if (typeof c.id === "number" && Number.isFinite(c.id)) s.add(c.id);
3325
+ }
3326
+ return s;
3327
+ }
3328
+ var VAULT_PAGE_SIZE = 100;
3329
+ async function fetchMorphoVaultsForChain(chainId, first = 100) {
3330
+ const d = await morphoGql(
3331
+ `
3332
+ query MorphoVaults($chainId: Int!, $first: Int!) {
3333
+ vaults(first: $first, where: { chainId_in: [$chainId], listed: true }, orderBy: TotalAssetsUsd, orderDirection: Desc) {
3334
+ items {
3335
+ address symbol name listed
3336
+ asset { address symbol decimals price { usd } }
3337
+ chain { id }
3338
+ state { apy netApy fee totalAssetsUsd allRewards { supplyApr asset { address symbol } } }
3339
+ }
3340
+ }
3341
+ }
3342
+ `,
3343
+ { chainId, first }
3344
+ );
3345
+ return d.vaults?.items ?? [];
3346
+ }
3347
+ async function fetchMorphoVaultV2sForChain(chainId, first = 100, skip = 0) {
3348
+ const d = await morphoGql(
3349
+ `
3350
+ query MorphoVaultV2s($chainId: Int!, $first: Int!, $skip: Int!) {
3351
+ vaultV2s(
3352
+ first: $first
3353
+ skip: $skip
3354
+ where: { chainId_in: [$chainId], listed: true }
3355
+ orderBy: TotalAssetsUsd
3356
+ orderDirection: Desc
3357
+ ) {
3358
+ items {
3359
+ address symbol name listed
3360
+ asset { address symbol decimals price { usd } }
3361
+ chain { id }
3362
+ apy netApy performanceFee managementFee totalAssetsUsd
3363
+ rewards { supplyApr asset { address symbol } }
3364
+ }
3365
+ }
3366
+ }
3367
+ `,
3368
+ { chainId, first, skip }
3369
+ );
3370
+ return d.vaultV2s?.items ?? [];
3371
+ }
3372
+ async function fetchAllMorphoVaultV2AssetAddresses(chainId) {
3373
+ const out = /* @__PURE__ */ new Set();
3374
+ let skip = 0;
3375
+ for (let page = 0; page < 20; page++) {
3376
+ const batch = await fetchMorphoVaultV2sForChain(chainId, VAULT_PAGE_SIZE, skip);
3377
+ if (!batch.length) break;
3378
+ for (const v of batch) {
3379
+ const a = (v.asset?.address ?? "").trim();
3380
+ if (viem.isAddress(a)) out.add(viem.getAddress(a).toLowerCase());
3381
+ }
3382
+ if (batch.length < VAULT_PAGE_SIZE) break;
3383
+ skip += VAULT_PAGE_SIZE;
3384
+ }
3385
+ return out;
3386
+ }
3387
+ var chainAssetCache = /* @__PURE__ */ new Map();
3388
+ async function ensureMorphoChainAssetCache(chainId) {
3389
+ const hit = chainAssetCache.get(chainId);
3390
+ if (hit) return hit;
3391
+ const modes = /* @__PURE__ */ new Map();
3392
+ const [v1Vaults, v2Assets] = await Promise.all([
3393
+ fetchMorphoVaultsForChain(chainId, 300),
3394
+ fetchAllMorphoVaultV2AssetAddresses(chainId)
3395
+ ]);
3396
+ for (const v of v1Vaults) {
3397
+ const a = (v.asset?.address ?? "").trim();
3398
+ if (!viem.isAddress(a)) continue;
3399
+ const k = viem.getAddress(a).toLowerCase();
3400
+ const prev = modes.get(k) ?? { earn: false, borrow: false, collateral: false };
3401
+ prev.earn = true;
3402
+ modes.set(k, prev);
3403
+ }
3404
+ for (const k of v2Assets) {
3405
+ const prev = modes.get(k) ?? { earn: false, borrow: false, collateral: false };
3406
+ prev.earn = true;
3407
+ modes.set(k, prev);
3408
+ }
3409
+ const marketsD = await morphoGql(
3410
+ `
3411
+ query MorphoMarketsAssets($chainId: Int!) {
3412
+ markets(first: 500, where: { chainId_in: [$chainId] }) {
3413
+ items {
3414
+ loanAsset { address }
3415
+ collateralAsset { address }
3416
+ }
3417
+ }
3418
+ }
3419
+ `,
3420
+ { chainId }
3421
+ );
3422
+ for (const m of marketsD.markets?.items ?? []) {
3423
+ const loanAddr = (m.loanAsset?.address ?? "").trim();
3424
+ const colAddr = (m.collateralAsset?.address ?? "").trim();
3425
+ if (viem.isAddress(loanAddr)) {
3426
+ const k = viem.getAddress(loanAddr).toLowerCase();
3427
+ const prev = modes.get(k) ?? { earn: false, borrow: false, collateral: false };
3428
+ prev.borrow = true;
3429
+ modes.set(k, prev);
3430
+ }
3431
+ if (viem.isAddress(colAddr)) {
3432
+ const k = viem.getAddress(colAddr).toLowerCase();
3433
+ const prev = modes.get(k) ?? { earn: false, borrow: false, collateral: false };
3434
+ prev.collateral = true;
3435
+ modes.set(k, prev);
3436
+ }
3437
+ }
3438
+ const cache = { modesByUnderlying: modes, nativeWrapped: null };
3439
+ chainAssetCache.set(chainId, cache);
3440
+ return cache;
3441
+ }
3442
+
3443
+ // src/protocols/evm/morpho/index.ts
3444
+ var MORPHO_PROTOCOL_ID = "morpho";
3445
+ var morphoProtocolModule = {
3446
+ id: MORPHO_PROTOCOL_ID,
3447
+ chainCategory: "evm",
3448
+ isChainSupported(ctx) {
3449
+ return ctx.chainCategory === "evm";
3450
+ },
3451
+ isTokenSupported(token) {
3452
+ return token.category === "evm" && (token.kind === "native" || token.kind === "erc20");
3453
+ },
3454
+ actions: [
3455
+ { id: "morpho.fetch-earn-vaults", protocolId: MORPHO_PROTOCOL_ID, chainCategory: "evm", description: "Search Morpho-listed earn vaults by asset or name", commonParams: [], params: {} },
3456
+ { id: "morpho.vault-deposit", protocolId: MORPHO_PROTOCOL_ID, chainCategory: "evm", description: "Deposit into Morpho-listed earn vault (V1 or V2)", commonParams: ["keyGen", "purposeText", "useCustomGas"], params: {} },
3457
+ { id: "morpho.vault-withdraw", protocolId: MORPHO_PROTOCOL_ID, chainCategory: "evm", description: "Withdraw from Morpho earn vault (V1 or V2)", commonParams: ["keyGen", "purposeText", "useCustomGas"], params: {} },
3458
+ { id: "morpho.blue-collateral-deposit", protocolId: MORPHO_PROTOCOL_ID, chainCategory: "evm", description: "Supply collateral to Morpho Blue market", commonParams: ["keyGen", "purposeText", "useCustomGas"], params: {} },
3459
+ { id: "morpho.blue-borrow", protocolId: MORPHO_PROTOCOL_ID, chainCategory: "evm", description: "Borrow from Morpho Blue market", commonParams: ["keyGen", "purposeText", "useCustomGas"], params: {} },
3460
+ { id: "morpho.blue-repay", protocolId: MORPHO_PROTOCOL_ID, chainCategory: "evm", description: "Repay Morpho Blue borrow", commonParams: ["keyGen", "purposeText", "useCustomGas"], params: {} },
3461
+ { id: "morpho.blue-collateral-withdraw", protocolId: MORPHO_PROTOCOL_ID, chainCategory: "evm", description: "Withdraw Morpho Blue collateral", commonParams: ["keyGen", "purposeText", "useCustomGas"], params: {} },
3462
+ { id: "morpho.merkl-claim", protocolId: MORPHO_PROTOCOL_ID, chainCategory: "evm", description: "Claim Morpho Merkl rewards", commonParams: ["keyGen", "purposeText", "useCustomGas"], params: {} },
3463
+ { id: "morpho.midnight-borrow", protocolId: MORPHO_PROTOCOL_ID, chainCategory: "evm", description: "Morpho Midnight fixed-rate borrow (coming soon)", commonParams: ["keyGen", "purposeText", "useCustomGas"], params: {} }
3464
+ ]
3465
+ };
3466
+ registerProtocolModule(morphoProtocolModule);
3014
3467
  var skillsDir = path.join(path.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('catalog.cjs', document.baseURI).href)))), "skills");
3015
3468
  var SKILL_PROTOCOL_IDS = [
3016
3469
  "aave-v4",
@@ -3022,7 +3475,8 @@ var SKILL_PROTOCOL_IDS = [
3022
3475
  "maple-syrup",
3023
3476
  "sky",
3024
3477
  "gmx",
3025
- "hyperliquid"
3478
+ "hyperliquid",
3479
+ "morpho"
3026
3480
  ];
3027
3481
  function getToolsForProtocol(protocolId) {
3028
3482
  return MCP_TOOL_DEFINITIONS.filter((t) => t.protocolId === protocolId);
@@ -3236,6 +3690,37 @@ var PROTOCOL_SUPPORT_ADVISORS = {
3236
3690
  return { tokens: [] };
3237
3691
  }
3238
3692
  }),
3693
+ morpho: advisor("morpho", "api_underlyings", {
3694
+ async supportedChainIds() {
3695
+ const set = await loadMorphoSupportedChainIds();
3696
+ return [...set].sort((a, b) => a - b);
3697
+ },
3698
+ async supportedTokens(chainId) {
3699
+ const cache = await ensureMorphoChainAssetCache(chainId);
3700
+ const tokens = [...cache.modesByUnderlying.entries()].map(([address, modes]) => ({
3701
+ address,
3702
+ roles: [
3703
+ ...modes.earn ? ["vault_underlying"] : [],
3704
+ ...modes.borrow ? ["loan"] : [],
3705
+ ...modes.collateral ? ["collateral"] : []
3706
+ ]
3707
+ }));
3708
+ return {
3709
+ tokens,
3710
+ notes: "Morpho vault assets and Blue market loan/collateral tokens from api.morpho.org."
3711
+ };
3712
+ },
3713
+ async isTokenSupported(chainId, address) {
3714
+ const cache = await ensureMorphoChainAssetCache(chainId);
3715
+ let normalized;
3716
+ try {
3717
+ normalized = viem.getAddress(address).toLowerCase();
3718
+ } catch {
3719
+ return false;
3720
+ }
3721
+ return cache.modesByUnderlying.has(normalized);
3722
+ }
3723
+ }),
3239
3724
  "euler-v2": advisor("euler-v2", "subgraph_vaults", {
3240
3725
  async supportedChainIds() {
3241
3726
  return [...EULER_V2_SUBGRAPH_CHAIN_IDS];
@@ -3317,6 +3802,7 @@ registerProtocolModule(aaveV4ProtocolModule);
3317
3802
  registerProtocolModule(eulerV2ProtocolModule);
3318
3803
  registerProtocolModule(gmxProtocolModule);
3319
3804
  registerProtocolModule(hyperliquidProtocolModule);
3805
+ registerProtocolModule(morphoProtocolModule);
3320
3806
  function getAgentCatalog() {
3321
3807
  return {
3322
3808
  protocols: getProtocolModules(),
@@ -3335,6 +3821,7 @@ function getAgentCatalog() {
3335
3821
  eulerV2: eulerV2ProtocolModule,
3336
3822
  gmx: gmxProtocolModule,
3337
3823
  hyperliquid: hyperliquidProtocolModule,
3824
+ morpho: morphoProtocolModule,
3338
3825
  /** Prefer getAgentCatalogForMcp() or getMcpToolDefinitions() for MCP servers. */
3339
3826
  mcp: getAgentCatalogForMcp()
3340
3827
  };
@@ -3416,6 +3903,8 @@ exports.mcpHyperliquidFetchMarketSnapshotInputSchema = mcpHyperliquidFetchMarket
3416
3903
  exports.mcpHyperliquidFetchMarketSnapshotOutputSchema = mcpHyperliquidFetchMarketSnapshotOutputSchema;
3417
3904
  exports.mcpHyperliquidFetchMarketsInputSchema = mcpHyperliquidFetchMarketsInputSchema;
3418
3905
  exports.mcpHyperliquidFetchMarketsOutputSchema = mcpHyperliquidFetchMarketsOutputSchema;
3906
+ exports.mcpHyperliquidFetchOhlcvInputSchema = mcpHyperliquidFetchOhlcvInputSchema;
3907
+ exports.mcpHyperliquidFetchOhlcvOutputSchema = mcpHyperliquidFetchOhlcvOutputSchema;
3419
3908
  exports.mcpHyperliquidFetchOpenContextInputSchema = mcpHyperliquidFetchOpenContextInputSchema;
3420
3909
  exports.mcpHyperliquidFetchOpenContextOutputSchema = mcpHyperliquidFetchOpenContextOutputSchema;
3421
3910
  exports.mcpHyperliquidFetchOpenOrdersInputSchema = mcpHyperliquidFetchOpenOrdersInputSchema;
@@ -3431,6 +3920,8 @@ exports.mcpHyperliquidFetchUserVaultEquitiesOutputSchema = mcpHyperliquidFetchUs
3431
3920
  exports.mcpHyperliquidFetchVaultsInputSchema = mcpHyperliquidFetchVaultsInputSchema;
3432
3921
  exports.mcpHyperliquidFetchVaultsOutputSchema = mcpHyperliquidFetchVaultsOutputSchema;
3433
3922
  exports.mcpHyperliquidLimitOrderInputSchema = mcpHyperliquidLimitOrderInputSchema;
3923
+ exports.mcpHyperliquidSearchMarketsInputSchema = mcpHyperliquidSearchMarketsInputSchema;
3924
+ exports.mcpHyperliquidSearchMarketsOutputSchema = mcpHyperliquidSearchMarketsOutputSchema;
3434
3925
  exports.mcpHyperliquidStakeInputSchema = mcpHyperliquidStakeInputSchema;
3435
3926
  exports.mcpHyperliquidUndelegateInputSchema = mcpHyperliquidUndelegateInputSchema;
3436
3927
  exports.mcpHyperliquidUnstakeInputSchema = mcpHyperliquidUnstakeInputSchema;
@@ -3444,6 +3935,15 @@ exports.mcpLidoUnwrapWstEthInputSchema = mcpLidoUnwrapWstEthInputSchema;
3444
3935
  exports.mcpLidoWrapStEthInputSchema = mcpLidoWrapStEthInputSchema;
3445
3936
  exports.mcpMapleDepositInputSchema = mcpMapleDepositInputSchema;
3446
3937
  exports.mcpMapleRequestRedeemInputSchema = mcpMapleRequestRedeemInputSchema;
3938
+ exports.mcpMorphoBlueBorrowInputSchema = mcpMorphoBlueBorrowInputSchema;
3939
+ exports.mcpMorphoBlueCollateralDepositInputSchema = mcpMorphoBlueCollateralDepositInputSchema;
3940
+ exports.mcpMorphoBlueCollateralWithdrawInputSchema = mcpMorphoBlueCollateralWithdrawInputSchema;
3941
+ exports.mcpMorphoBlueRepayInputSchema = mcpMorphoBlueRepayInputSchema;
3942
+ exports.mcpMorphoFetchEarnVaultsInputSchema = mcpMorphoFetchEarnVaultsInputSchema;
3943
+ exports.mcpMorphoFetchEarnVaultsOutputSchema = mcpMorphoFetchEarnVaultsOutputSchema;
3944
+ exports.mcpMorphoMerklClaimInputSchema = mcpMorphoMerklClaimInputSchema;
3945
+ exports.mcpMorphoVaultDepositInputSchema = mcpMorphoVaultDepositInputSchema;
3946
+ exports.mcpMorphoVaultWithdrawInputSchema = mcpMorphoVaultWithdrawInputSchema;
3447
3947
  exports.mcpMultisignInput = mcpMultisignInput;
3448
3948
  exports.mcpMultisignOutputSchema = multisignOutputSchema;
3449
3949
  exports.mcpMultisignSubmitOutputSchema = mcpServerSubmitOutputSchema;