Loading .gitignore 0 → 100644 +33 −0 Changes for .gitignore: 33 added lines, 0 removed lines. Original line number Diff line number Diff line HELP.md target/ .mvn/wrapper/maven-wrapper.jar !**/src/main/**/target/ !**/src/test/**/target/ ### STS ### .apt_generated .classpath .factorypath .project .settings .springBeans .sts4-cache ### IntelliJ IDEA ### .idea *.iws *.iml *.ipr ### NetBeans ### /nbproject/private/ /nbbuild/ /dist/ /nbdist/ /.nb-gradle/ build/ !**/src/main/**/build/ !**/src/test/**/build/ ### VS Code ### .vscode/ pom.xml 0 → 100644 +75 −0 Changes for pom.xml: 75 added lines, 0 removed lines. Original line number Diff line number Diff line <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.5.5</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>org.etsi.osl</groupId> <artifactId>org.etsi.osl.mcp.backend</artifactId> <version>0.0.1-SNAPSHOT</version> <name>org.etsi.osl.mcp.backend</name> <organization> <name>OpenSlice by ETSI</name> <url>https://osl.etsi.org</url> </organization> <properties> <java.version>17</java.version> <spring-ai.version>1.1.0</spring-ai.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-mcp-client-webflux</artifactId> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-model-ollama</artifactId> </dependency> <dependency> <groupId>org.commonmark</groupId> <artifactId>commonmark</artifactId> <version>0.24.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-bom</artifactId> <version>${spring-ai.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> src/main/java/org/etsi/osl/mcp/backend/ChatController.java 0 → 100644 +64 −0 Changes for src/main/java/org/etsi/osl/mcp/backend/ChatController.java: 64 added lines, 0 removed lines. Original line number Diff line number Diff line package org.etsi.osl.mcp.backend; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor; import org.springframework.ai.tool.ToolCallbackProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; @RestController public class ChatController { private static final Logger log = LoggerFactory.getLogger(ChatController.class); private final ChatClient chatClient; public ChatController(ChatClient.Builder chatClientBuilder, ToolCallbackProvider tools) { this.chatClient = chatClientBuilder .defaultAdvisors(new SimpleLoggerAdvisor()) .defaultToolCallbacks(tools) .build(); } @PostMapping("/ask") public Answer ask(@RequestBody Question question) { var response = chatClient.prompt() .user(question.question()) .call() .content(); log.debug("Response from AI: {}", response); String markdownAnswer = formatResponse(question, response); log.debug("Markdown formatted response: {}", markdownAnswer); var htmlResponse = MarkdownHelper.toHTML(markdownAnswer); log.debug("HTML formatted response: {}", htmlResponse); return new Answer(htmlResponse); } private String formatResponse(Question question, String answer) { return answer; // var prompt = """ // Following are the question and answer: // // Question: {question} // // Answer: {answer} // // Format the answer into plain human readable text and return only the formatted response. // """; // return chatClient // .prompt() // .user(u -> u.text(prompt) // .param("question", question.question()) // .param("answer", answer) // ) // .call() // .content(); } public record Question(String question) {} public record Answer(String answer) {} } src/main/java/org/etsi/osl/mcp/backend/MarkdownHelper.java 0 → 100644 +15 −0 Changes for src/main/java/org/etsi/osl/mcp/backend/MarkdownHelper.java: 15 added lines, 0 removed lines. Original line number Diff line number Diff line package org.etsi.osl.mcp.backend; import org.commonmark.node.Node; import org.commonmark.parser.Parser; import org.commonmark.renderer.html.HtmlRenderer; public class MarkdownHelper { private static final Parser parser = Parser.builder().build(); private static final HtmlRenderer renderer = HtmlRenderer.builder().build(); public static String toHTML(String markdownText) { Node document = parser.parse(markdownText); return renderer.render(document); } } No newline at end of file src/main/java/org/etsi/osl/mcp/backend/OslMcpClientApplication.java 0 → 100644 +12 −0 Changes for src/main/java/org/etsi/osl/mcp/backend/OslMcpClientApplication.java: 12 added lines, 0 removed lines. Original line number Diff line number Diff line package org.etsi.osl.mcp.backend; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class OslMcpClientApplication { public static void main(String[] args) { SpringApplication.run(OslMcpClientApplication.class, args); } } Loading
.gitignore 0 → 100644 +33 −0 Changes for .gitignore: 33 added lines, 0 removed lines. Original line number Diff line number Diff line HELP.md target/ .mvn/wrapper/maven-wrapper.jar !**/src/main/**/target/ !**/src/test/**/target/ ### STS ### .apt_generated .classpath .factorypath .project .settings .springBeans .sts4-cache ### IntelliJ IDEA ### .idea *.iws *.iml *.ipr ### NetBeans ### /nbproject/private/ /nbbuild/ /dist/ /nbdist/ /.nb-gradle/ build/ !**/src/main/**/build/ !**/src/test/**/build/ ### VS Code ### .vscode/
pom.xml 0 → 100644 +75 −0 Changes for pom.xml: 75 added lines, 0 removed lines. Original line number Diff line number Diff line <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.5.5</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>org.etsi.osl</groupId> <artifactId>org.etsi.osl.mcp.backend</artifactId> <version>0.0.1-SNAPSHOT</version> <name>org.etsi.osl.mcp.backend</name> <organization> <name>OpenSlice by ETSI</name> <url>https://osl.etsi.org</url> </organization> <properties> <java.version>17</java.version> <spring-ai.version>1.1.0</spring-ai.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-mcp-client-webflux</artifactId> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-model-ollama</artifactId> </dependency> <dependency> <groupId>org.commonmark</groupId> <artifactId>commonmark</artifactId> <version>0.24.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-bom</artifactId> <version>${spring-ai.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
src/main/java/org/etsi/osl/mcp/backend/ChatController.java 0 → 100644 +64 −0 Changes for src/main/java/org/etsi/osl/mcp/backend/ChatController.java: 64 added lines, 0 removed lines. Original line number Diff line number Diff line package org.etsi.osl.mcp.backend; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor; import org.springframework.ai.tool.ToolCallbackProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; @RestController public class ChatController { private static final Logger log = LoggerFactory.getLogger(ChatController.class); private final ChatClient chatClient; public ChatController(ChatClient.Builder chatClientBuilder, ToolCallbackProvider tools) { this.chatClient = chatClientBuilder .defaultAdvisors(new SimpleLoggerAdvisor()) .defaultToolCallbacks(tools) .build(); } @PostMapping("/ask") public Answer ask(@RequestBody Question question) { var response = chatClient.prompt() .user(question.question()) .call() .content(); log.debug("Response from AI: {}", response); String markdownAnswer = formatResponse(question, response); log.debug("Markdown formatted response: {}", markdownAnswer); var htmlResponse = MarkdownHelper.toHTML(markdownAnswer); log.debug("HTML formatted response: {}", htmlResponse); return new Answer(htmlResponse); } private String formatResponse(Question question, String answer) { return answer; // var prompt = """ // Following are the question and answer: // // Question: {question} // // Answer: {answer} // // Format the answer into plain human readable text and return only the formatted response. // """; // return chatClient // .prompt() // .user(u -> u.text(prompt) // .param("question", question.question()) // .param("answer", answer) // ) // .call() // .content(); } public record Question(String question) {} public record Answer(String answer) {} }
src/main/java/org/etsi/osl/mcp/backend/MarkdownHelper.java 0 → 100644 +15 −0 Changes for src/main/java/org/etsi/osl/mcp/backend/MarkdownHelper.java: 15 added lines, 0 removed lines. Original line number Diff line number Diff line package org.etsi.osl.mcp.backend; import org.commonmark.node.Node; import org.commonmark.parser.Parser; import org.commonmark.renderer.html.HtmlRenderer; public class MarkdownHelper { private static final Parser parser = Parser.builder().build(); private static final HtmlRenderer renderer = HtmlRenderer.builder().build(); public static String toHTML(String markdownText) { Node document = parser.parse(markdownText); return renderer.render(document); } } No newline at end of file
src/main/java/org/etsi/osl/mcp/backend/OslMcpClientApplication.java 0 → 100644 +12 −0 Changes for src/main/java/org/etsi/osl/mcp/backend/OslMcpClientApplication.java: 12 added lines, 0 removed lines. Original line number Diff line number Diff line package org.etsi.osl.mcp.backend; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class OslMcpClientApplication { public static void main(String[] args) { SpringApplication.run(OslMcpClientApplication.class, args); } }