diff --git a/README.md b/README.md index a9cce593..1395002c 100644 --- a/README.md +++ b/README.md @@ -246,7 +246,7 @@ Copy [`mcp.json.example`](./mcp.json.example) to `.mcp.json` in your project roo { "mcpServers": { "yaci-devkit": { - "url": "http://localhost:10000/sse" + "url": "http://localhost:10000/mcp" } } } diff --git a/applications/cli/build.gradle b/applications/cli/build.gradle index d188d61a..511a74e4 100644 --- a/applications/cli/build.gradle +++ b/applications/cli/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '3.2.5' - id 'io.spring.dependency-management' version '1.1.4' + id 'org.springframework.boot' version '3.5.11' + id 'io.spring.dependency-management' version '1.1.7' id 'org.graalvm.buildtools.native' version '0.10.2' id 'java' id 'signing' @@ -18,17 +18,16 @@ java { } repositories { - //maven { url 'https://repo.spring.io/release' } mavenCentral() mavenLocal() maven { - url "https://oss.sonatype.org/content/repositories/snapshots" + url "https://central.sonatype.com/repository/maven-snapshots/" } } ext { - set('springShellVersion', "3.2.4") - set('springAiVersion', "1.0.3") + set('springShellVersion', "3.4.1") + set('springAiVersion', "1.1.2") } dependencies { @@ -39,13 +38,12 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-logging' implementation 'org.springframework.boot:spring-boot-starter-mustache' - implementation('com.bloxbean.cardano:yaci:0.3.3') { + implementation('com.bloxbean.cardano:yaci:0.4.0') { exclude group: 'com.bloxbean.cardano', module: 'cardano-client-core' } - implementation 'com.bloxbean.cardano:cardano-client-lib:0.6.2' - implementation 'com.bloxbean.cardano:cardano-client-backend:0.6.2' - implementation 'com.bloxbean.cardano:cardano-client-backend-blockfrost:0.6.2' - //implementation 'com.bloxbean.cardano:cardano-client-supplier-local:0.5.1' + implementation 'com.bloxbean.cardano:cardano-client-lib:0.7.1' + implementation 'com.bloxbean.cardano:cardano-client-backend:0.7.1' + implementation 'com.bloxbean.cardano:cardano-client-backend-blockfrost:0.7.1' implementation 'org.apache.commons:commons-compress:1.23.0' diff --git a/applications/cli/docker/application.properties b/applications/cli/docker/application.properties index 81cc1311..9e80581f 100644 --- a/applications/cli/docker/application.properties +++ b/applications/cli/docker/application.properties @@ -9,8 +9,3 @@ pool.keys.home=/clusters/pool-keys spring.shell.config.location=/clusters server.port=10000 -# MCP Server -spring.ai.mcp.server.enabled=true -spring.ai.mcp.server.name=yaci-devkit -spring.ai.mcp.server.version=0.1.0 - diff --git a/applications/cli/src/main/java/com/bloxbean/cardano/yacicli/cip30/controller/GlobalExceptionHandler.java b/applications/cli/src/main/java/com/bloxbean/cardano/yacicli/cip30/controller/GlobalExceptionHandler.java index d8e729fd..81e332b6 100644 --- a/applications/cli/src/main/java/com/bloxbean/cardano/yacicli/cip30/controller/GlobalExceptionHandler.java +++ b/applications/cli/src/main/java/com/bloxbean/cardano/yacicli/cip30/controller/GlobalExceptionHandler.java @@ -7,6 +7,7 @@ import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.servlet.resource.NoResourceFoundException; import java.util.HashMap; import java.util.Map; @@ -56,6 +57,20 @@ public ResponseEntity> handleIllegalArgumentException( return ResponseEntity.badRequest().body(response); } + /** + * Handle missing static resource requests (e.g., MCP client probing legacy endpoints) + */ + @ExceptionHandler(NoResourceFoundException.class) + public ResponseEntity> handleNoResourceFoundException( + NoResourceFoundException ex) { + Map response = new HashMap<>(); + response.put("code", HttpStatus.NOT_FOUND.value()); + response.put("message", "Resource not found"); + + log.debug("Resource not found: {}", ex.getMessage()); + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response); + } + /** * Handle generic exceptions */ diff --git a/applications/cli/src/main/java/com/bloxbean/cardano/yacicli/commands/tail/BlockStreamerService.java b/applications/cli/src/main/java/com/bloxbean/cardano/yacicli/commands/tail/BlockStreamerService.java index 6014f25c..fc0333d6 100644 --- a/applications/cli/src/main/java/com/bloxbean/cardano/yacicli/commands/tail/BlockStreamerService.java +++ b/applications/cli/src/main/java/com/bloxbean/cardano/yacicli/commands/tail/BlockStreamerService.java @@ -221,23 +221,6 @@ private CliConnection getConnectionInfo(String host, int port, String network, l wellKnownPoint = new Point(slot, blockHash); else wellKnownPoint = Constants.WELL_KNOWN_MAINNET_POINT; - } else if ("legacy_testnet".equals(network)) { - if (!StringUtils.hasLength(host)) { - host = Constants.TESTNET_IOHK_RELAY_ADDR; - } - - if (port == 0) { - port = Constants.TESTNET_IOHK_RELAY_PORT; - } - - if (protocolMagic == 0) { - protocolMagic = Constants.LEGACY_TESTNET_PROTOCOL_MAGIC; - } - - if (slot != 0 && StringUtils.hasLength(blockHash)) - wellKnownPoint = new Point(slot, blockHash); - else - wellKnownPoint = Constants.WELL_KNOWN_TESTNET_POINT; } else if ("preprod".equals(network)) { if (!StringUtils.hasLength(host)) { host = Constants.PREPROD_IOHK_RELAY_ADDR; diff --git a/applications/cli/src/main/java/com/bloxbean/cardano/yacicli/localcluster/service/LocalProtocolParamSupplier.java b/applications/cli/src/main/java/com/bloxbean/cardano/yacicli/localcluster/service/LocalProtocolParamSupplier.java index c93b42ac..2fe79572 100644 --- a/applications/cli/src/main/java/com/bloxbean/cardano/yacicli/localcluster/service/LocalProtocolParamSupplier.java +++ b/applications/cli/src/main/java/com/bloxbean/cardano/yacicli/localcluster/service/LocalProtocolParamSupplier.java @@ -62,10 +62,10 @@ public ProtocolParams getProtocolParams() { protocolParams.setPoolDeposit(String.valueOf(protocolParamUpdate.getPoolDeposit())); protocolParams.setEMax(protocolParamUpdate.getMaxEpoch()); protocolParams.setNOpt(protocolParamUpdate.getNOpt()); - protocolParams.setA0(protocolParamUpdate.getPoolPledgeInfluence()); - protocolParams.setRho(protocolParamUpdate.getExpansionRate()); - protocolParams.setTau(protocolParamUpdate.getTreasuryGrowthRate()); - protocolParams.setDecentralisationParam(protocolParamUpdate.getDecentralisationParam()); //Deprecated. Not there + protocolParams.setA0(protocolParamUpdate.getPoolPledgeInfluence() != null? protocolParamUpdate.getPoolPledgeInfluence().safeRatio(): null); + protocolParams.setRho(protocolParamUpdate.getExpansionRate() != null? protocolParamUpdate.getExpansionRate().safeRatio(): null); + protocolParams.setTau(protocolParamUpdate.getTreasuryGrowthRate() != null? protocolParamUpdate.getTreasuryGrowthRate().safeRatio(): null); + protocolParams.setDecentralisationParam(protocolParamUpdate.getDecentralisationParam() != null? protocolParamUpdate.getDecentralisationParam().safeRatio(): null); //Deprecated. Not there //protocolParams.setExtraEntropy(protocolParamUpdate.getExtraEntropy()); //TODO protocolParams.setProtocolMajorVer(protocolParamUpdate.getProtocolMajorVer()); protocolParams.setProtocolMinorVer(protocolParamUpdate.getProtocolMinorVer()); @@ -90,8 +90,8 @@ public ProtocolParams getProtocolParams() { protocolParams.setCostModels(costModels); - protocolParams.setPriceMem(protocolParamUpdate.getPriceMem()); - protocolParams.setPriceStep(protocolParamUpdate.getPriceStep()); + protocolParams.setPriceMem(protocolParamUpdate.getPriceMem() != null? protocolParamUpdate.getPriceMem().safeRatio(): null); + protocolParams.setPriceStep(protocolParamUpdate.getPriceStep() != null? protocolParamUpdate.getPriceStep().safeRatio(): null); protocolParams.setMaxTxExMem(String.valueOf(protocolParamUpdate.getMaxTxExMem())); protocolParams.setMaxTxExSteps(String.valueOf(protocolParamUpdate.getMaxTxExSteps())); protocolParams.setMaxBlockExMem(String.valueOf(protocolParamUpdate.getMaxBlockExMem())); diff --git a/applications/cli/src/main/resources/application.yml b/applications/cli/src/main/resources/application.yml index 1a5864dc..cafbb323 100644 --- a/applications/cli/src/main/resources/application.yml +++ b/applications/cli/src/main/resources/application.yml @@ -12,11 +12,15 @@ spring: location: classpath:/banner.txt devtools: add-properties:logging: false + shell: + interactive: + enabled: true ai: mcp: server: name: yaci-devkit version: 0.1.0 + protocol: STATELESS logging: level: diff --git a/applications/cli/src/main/resources/logback-spring.xml b/applications/cli/src/main/resources/logback-spring.xml index 48237cbd..c0baa8a7 100644 --- a/applications/cli/src/main/resources/logback-spring.xml +++ b/applications/cli/src/main/resources/logback-spring.xml @@ -8,9 +8,9 @@ ${LOG_FILE} - - - + ${LOG_FILE}.%i + 1 + 20 10MB @@ -21,6 +21,22 @@ %clr(%d){faint} %clr(${PID:- }){magenta} %clr([%15.15t]){magenta} %clr(%-5p) %clr(%-40c{40}){cyan} - %m%n + + + + + + + + + + + + + + + + diff --git a/mcp.json.example b/mcp.json.example index fc429501..d868beb7 100644 --- a/mcp.json.example +++ b/mcp.json.example @@ -1,7 +1,7 @@ { "mcpServers": { "yaci-devkit": { - "url": "http://localhost:10000/sse" + "url": "http://localhost:10000/mcp" } } }