# Directory Structure ``` ├── .gitignore ├── LICENSE ├── pom.xml ├── README.md └── src ├── main │ ├── java │ │ └── org │ │ └── rainyheart │ │ └── cawl4ai │ │ └── mcp │ │ ├── conf │ │ │ └── ConfigProperties.java │ │ ├── controller │ │ │ ├── Crawl4aiApi.java │ │ │ └── impl │ │ │ └── Crawl4aiApiImpl.java │ │ ├── http │ │ │ ├── request │ │ │ │ ├── CrawlRequest.java │ │ │ │ └── CrawlTaskRequest.java │ │ │ └── response │ │ │ ├── CrawlResponse.java │ │ │ └── CrawlTaskResponse.java │ │ └── McpServerApplication.java │ └── resources │ └── application.properties └── test └── java └── org └── rainyheart └── cawl4ai └── client └── ClientStdio.java ``` # Files -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- ``` 1 | /target/ 2 | .settings/ 3 | .project 4 | .classpath ``` -------------------------------------------------------------------------------- /src/main/java/org/rainyheart/cawl4ai/mcp/controller/Crawl4aiApi.java: -------------------------------------------------------------------------------- ```java 1 | /** 2 | * Create on Apr 21, 2025 3 | * 4 | * Copyright (c) 2025 by Ken Ye. 5 | * 6 | * All Rights Reserved, Designed By Ken Ye 7 | * 8 | * Copyright: Copyright(C) 2025-2035 9 | * 10 | * Company: Ken Ye 11 | */ 12 | package org.rainyheart.cawl4ai.mcp.controller; 13 | 14 | public interface Crawl4aiApi { 15 | 16 | public String task(String taskId); 17 | 18 | public String crawl(String[] urls, String strategy, Integer max_depth, String output_format); 19 | } 20 | ``` -------------------------------------------------------------------------------- /src/main/java/org/rainyheart/cawl4ai/mcp/http/request/CrawlTaskRequest.java: -------------------------------------------------------------------------------- ```java 1 | /** 2 | * Create on Apr 21, 2025 3 | * 4 | * Copyright (c) 2025 by Ken Ye. 5 | * 6 | * All Rights Reserved, Designed By Ken Ye 7 | * 8 | * Copyright: Copyright(C) 2025-2035 9 | * 10 | * Company: Ken Ye 11 | */ 12 | package org.rainyheart.cawl4ai.mcp.http.request; 13 | 14 | public class CrawlTaskRequest { 15 | 16 | private String taskId; 17 | 18 | public String getTaskId() { 19 | return taskId; 20 | } 21 | 22 | public void setTaskId(String taskId) { 23 | this.taskId = taskId; 24 | } 25 | 26 | } 27 | ``` -------------------------------------------------------------------------------- /src/main/java/org/rainyheart/cawl4ai/mcp/http/response/CrawlResponse.java: -------------------------------------------------------------------------------- ```java 1 | /** 2 | * Create on Apr 21, 2025 3 | * 4 | * Copyright (c) 2025 by Ken Ye. 5 | * 6 | * All Rights Reserved, Designed By Ken Ye 7 | * 8 | * Copyright: Copyright(C) 2025-2035 9 | * 10 | * Company: Ken Ye 11 | */ 12 | package org.rainyheart.cawl4ai.mcp.http.response; 13 | 14 | import java.util.HashMap; 15 | import java.util.Map; 16 | 17 | public class CrawlResponse { 18 | private String taskId; 19 | 20 | public String getTaskId() { 21 | return taskId; 22 | } 23 | 24 | public void setTaskId(String taskId) { 25 | this.taskId = taskId; 26 | } 27 | 28 | public Map<String, Object> toMap() { 29 | Map<String, Object> map = new HashMap<String, Object>(); 30 | map.put("taskId", taskId); 31 | return map; 32 | } 33 | 34 | } 35 | ``` -------------------------------------------------------------------------------- /src/main/resources/application.properties: -------------------------------------------------------------------------------- ``` 1 | spring.main.web-application-type=none 2 | 3 | # NOTE: You must disable the banner and the console logging 4 | # to allow the STDIO transport to work !!! 5 | spring.main.banner-mode=off 6 | # logging.pattern.console=%d{yyyy-MMM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n 7 | logging.pattern.console= 8 | 9 | spring.ai.mcp.server.name=jcrawl4ai-mcp-server 10 | 11 | ## crawl4ai Settings - update your URL and token below 12 | crawl4ai.base-url=http://your-cral4ai-server-url:11235 13 | crawl4ai.api-token=your-api-token 14 | 15 | # MCP 16 | spring.ai.mcp.server.enabled=true 17 | spring.ai.mcp.server.version=1.0.0 18 | spring.ai.mcp.server.type=SYNC 19 | spring.ai.mcp.server.stdio=true 20 | logging.level.org.springframework.web=DEBUG 21 | 22 | logging.file.name=./target/mcp-stdio-server.log 23 | 24 | ``` -------------------------------------------------------------------------------- /src/main/java/org/rainyheart/cawl4ai/mcp/conf/ConfigProperties.java: -------------------------------------------------------------------------------- ```java 1 | /** 2 | * Create on Apr 21, 2025 3 | * 4 | * Copyright (c) 2025 by Ken Ye. 5 | * 6 | * All Rights Reserved, Designed By Ken Ye 7 | * 8 | * Copyright: Copyright(C) 2025-2035 9 | * 10 | * Company: Ken Ye 11 | */ 12 | package org.rainyheart.cawl4ai.mcp.conf; 13 | 14 | import org.springframework.boot.context.properties.ConfigurationProperties; 15 | 16 | @ConfigurationProperties(prefix = "crawl4ai") 17 | public class ConfigProperties { 18 | private String baseUrl; 19 | private String apiToken; 20 | public String getBaseUrl() { 21 | return baseUrl; 22 | } 23 | public void setBaseUrl(String baseUrl) { 24 | this.baseUrl = baseUrl; 25 | } 26 | public String getApiToken() { 27 | return apiToken; 28 | } 29 | public void setApiToken(String apiToken) { 30 | this.apiToken = apiToken; 31 | } 32 | 33 | } 34 | ``` -------------------------------------------------------------------------------- /src/main/java/org/rainyheart/cawl4ai/mcp/McpServerApplication.java: -------------------------------------------------------------------------------- ```java 1 | /** 2 | * Create on Apr 21, 2025 3 | * 4 | * Copyright (c) 2025 by Ken Ye. 5 | * 6 | * All Rights Reserved, Designed By Ken Ye 7 | * 8 | * Copyright: Copyright(C) 2025-2035 9 | * 10 | * Company: Ken Ye 11 | */ 12 | package org.rainyheart.cawl4ai.mcp; 13 | 14 | import org.rainyheart.cawl4ai.mcp.conf.ConfigProperties; 15 | import org.rainyheart.cawl4ai.mcp.controller.Crawl4aiApi; 16 | import org.springframework.ai.tool.ToolCallbackProvider; 17 | import org.springframework.ai.tool.method.MethodToolCallbackProvider; 18 | import org.springframework.boot.SpringApplication; 19 | import org.springframework.boot.autoconfigure.SpringBootApplication; 20 | import org.springframework.boot.context.properties.EnableConfigurationProperties; 21 | import org.springframework.context.annotation.Bean; 22 | import org.springframework.context.annotation.ComponentScan; 23 | 24 | @SpringBootApplication 25 | @EnableConfigurationProperties({ConfigProperties.class}) 26 | @ComponentScan(basePackages = "org.rainyheart.cawl4ai.mcp") 27 | public class McpServerApplication { 28 | 29 | public static void main(String[] args) { 30 | SpringApplication.run(McpServerApplication.class, args); 31 | } 32 | 33 | @Bean 34 | public ToolCallbackProvider tools(Crawl4aiApi crawl4aiApi) { 35 | return MethodToolCallbackProvider.builder().toolObjects(crawl4aiApi).build(); 36 | } 37 | 38 | } 39 | ``` -------------------------------------------------------------------------------- /src/main/java/org/rainyheart/cawl4ai/mcp/http/request/CrawlRequest.java: -------------------------------------------------------------------------------- ```java 1 | /** 2 | * Create on Apr 21, 2025 3 | * 4 | * Copyright (c) 2025 by Ken Ye. 5 | * 6 | * All Rights Reserved, Designed By Ken Ye 7 | * 8 | * Copyright: Copyright(C) 2025-2035 9 | * 10 | * Company: Ken Ye 11 | */ 12 | package org.rainyheart.cawl4ai.mcp.http.request; 13 | 14 | import java.util.HashMap; 15 | import java.util.Map; 16 | 17 | import cn.hutool.json.JSONUtil; 18 | 19 | public class CrawlRequest { 20 | 21 | private String[] urls; 22 | 23 | private String strategy; 24 | 25 | private Integer max_depth; 26 | 27 | private String output_format; 28 | 29 | public String[] getUrls() { 30 | return urls; 31 | } 32 | 33 | public void setUrls(String[] urls) { 34 | this.urls = urls; 35 | } 36 | 37 | public String getStrategy() { 38 | return strategy; 39 | } 40 | 41 | public void setStrategy(String strategy) { 42 | this.strategy = strategy; 43 | } 44 | 45 | public Integer getMax_depth() { 46 | return max_depth; 47 | } 48 | 49 | public void setMax_depth(Integer max_depth) { 50 | this.max_depth = max_depth; 51 | } 52 | 53 | public String getOutput_format() { 54 | return output_format; 55 | } 56 | 57 | public void setOutput_format(String output_format) { 58 | this.output_format = output_format; 59 | } 60 | 61 | public String toJson() { 62 | return JSONUtil.toJsonStr(this); 63 | } 64 | 65 | public Map<String, Object> toMap() { 66 | Map<String, Object> map = new HashMap<String, Object>(); 67 | map.put("urls", urls); 68 | map.put("urstrategyls", strategy); 69 | map.put("max_depth", max_depth); 70 | map.put("output_format", output_format); 71 | return map; 72 | } 73 | 74 | } 75 | ``` -------------------------------------------------------------------------------- /src/main/java/org/rainyheart/cawl4ai/mcp/controller/impl/Crawl4aiApiImpl.java: -------------------------------------------------------------------------------- ```java 1 | /** 2 | * Create on Apr 21, 2025 3 | * 4 | * Copyright (c) 2025 by Ken Ye. 5 | * 6 | * All Rights Reserved, Designed By Ken Ye 7 | * 8 | * Copyright: Copyright(C) 2025-2035 9 | * 10 | * Company: Ken Ye 11 | */ 12 | package org.rainyheart.cawl4ai.mcp.controller.impl; 13 | 14 | import org.rainyheart.cawl4ai.mcp.conf.ConfigProperties; 15 | import org.rainyheart.cawl4ai.mcp.controller.Crawl4aiApi; 16 | import org.rainyheart.cawl4ai.mcp.http.request.CrawlRequest; 17 | import org.rainyheart.cawl4ai.mcp.http.response.CrawlResponse; 18 | import org.rainyheart.cawl4ai.mcp.http.response.CrawlTaskResponse; 19 | import org.slf4j.Logger; 20 | import org.slf4j.LoggerFactory; 21 | import org.springframework.ai.tool.annotation.Tool; 22 | import org.springframework.ai.tool.annotation.ToolParam; 23 | import org.springframework.beans.factory.annotation.Autowired; 24 | import org.springframework.stereotype.Service; 25 | 26 | import cn.hutool.http.HttpRequest; 27 | import cn.hutool.http.HttpResponse; 28 | import cn.hutool.json.JSONUtil; 29 | 30 | @Service 31 | public class Crawl4aiApiImpl implements Crawl4aiApi { 32 | 33 | @Autowired 34 | private ConfigProperties configProperties; 35 | 36 | private Logger logger = LoggerFactory.getLogger(this.getClass()); 37 | 38 | @Override 39 | @Tool(description = "Call crawl4ai API to crawl a URL") 40 | public String crawl(@ToolParam(description = "the target websites urls") String[] urls, 41 | @ToolParam(description = "cawl strategy") String strategy, 42 | @ToolParam(description = "max_depth for cawl") Integer max_depth, 43 | @ToolParam(description = "response output format for cawl") String output_format) { 44 | logger.debug("Crawl4aiApiImpl.crawl() urls: {}, strategy: {}, max_depth: {}, output_format: {}", urls, strategy, 45 | max_depth, output_format); 46 | CrawlRequest request = new CrawlRequest(); 47 | request.setUrls(urls); 48 | request.setStrategy(strategy); 49 | request.setMax_depth(max_depth); 50 | request.setOutput_format(output_format); 51 | HttpRequest httpRequest = HttpRequest.post(configProperties.getBaseUrl() + "/crawl") 52 | .bearerAuth(configProperties.getApiToken()).body(request.toJson()); 53 | HttpResponse response = httpRequest.execute(); 54 | logger.debug(response.body()); 55 | CrawlResponse rsp = JSONUtil.toBean(response.body(), CrawlResponse.class); 56 | return JSONUtil.toJsonStr(rsp); 57 | } 58 | 59 | @Override 60 | @Tool(description = "Get the crawl result by the given taskId") 61 | public String task(String taskId) { 62 | logger.debug("taskId: {}", taskId); 63 | HttpRequest httpRequest = HttpRequest.get(configProperties.getBaseUrl() + "/task/" + taskId) 64 | .bearerAuth(configProperties.getApiToken()); 65 | HttpResponse response = httpRequest.execute(); 66 | logger.debug(response.body()); 67 | CrawlTaskResponse rsp = JSONUtil.toBean(response.body(), CrawlTaskResponse.class); 68 | return JSONUtil.toJsonStr(rsp); 69 | } 70 | } 71 | ``` -------------------------------------------------------------------------------- /src/test/java/org/rainyheart/cawl4ai/client/ClientStdio.java: -------------------------------------------------------------------------------- ```java 1 | /* 2 | * Copyright 2024 - 2024 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.rainyheart.cawl4ai.client; 17 | 18 | import org.rainyheart.cawl4ai.mcp.http.request.CrawlRequest; 19 | import org.rainyheart.cawl4ai.mcp.http.response.CrawlResponse; 20 | 21 | import cn.hutool.json.JSONObject; 22 | import cn.hutool.json.JSONUtil; 23 | import io.modelcontextprotocol.client.McpClient; 24 | import io.modelcontextprotocol.client.transport.ServerParameters; 25 | import io.modelcontextprotocol.client.transport.StdioClientTransport; 26 | import io.modelcontextprotocol.spec.McpSchema; 27 | import io.modelcontextprotocol.spec.McpSchema.CallToolRequest; 28 | import io.modelcontextprotocol.spec.McpSchema.CallToolResult; 29 | import io.modelcontextprotocol.spec.McpSchema.ListToolsResult; 30 | import io.modelcontextprotocol.spec.McpSchema.TextContent; 31 | 32 | /** 33 | * With stdio transport, the MCP server is automatically started by the client. But you 34 | * have to build the server jar first: 35 | * 36 | * <pre> 37 | * ./mvnw clean install 38 | * </pre> 39 | */ 40 | public class ClientStdio { 41 | 42 | public static void main(String[] args) throws InterruptedException { 43 | 44 | var stdioParams = ServerParameters.builder("java") 45 | .args("-jar", 46 | "./target/jcrawl4ai-mcp-server-1.0.0.jar") 47 | .build(); 48 | 49 | var transport = new StdioClientTransport(stdioParams); 50 | var client = McpClient.sync(transport).build(); 51 | 52 | client.initialize(); 53 | 54 | // List and demonstrate tools 55 | ListToolsResult toolsList = client.listTools(); 56 | System.out.println("Available Tools = " + toolsList); 57 | CrawlRequest request = new CrawlRequest(); 58 | request.setMax_depth(10); 59 | request.setStrategy("best_first"); 60 | request.setOutput_format("markdown"); 61 | request.setUrls(new String[] { "https://www.weather.gov" }); 62 | 63 | CallToolResult crawlResult = client.callTool(new CallToolRequest("crawl", 64 | request.toMap())); 65 | System.out.println("Crawl response: " + crawlResult); 66 | String taskId = null; 67 | for(McpSchema.Content content : crawlResult.content()) { 68 | if(content instanceof TextContent) { 69 | taskId = ((TextContent)content).text(); 70 | } 71 | } 72 | JSONObject json = JSONUtil.parseObj(JSONUtil.toJsonPrettyStr(taskId.replace("\\", "").replace("\"", ""))); 73 | taskId = (String) json.get("taskId"); 74 | CrawlResponse response = new CrawlResponse(); 75 | response.setTaskId(taskId); 76 | 77 | CallToolResult finalResult = client.callTool(new CallToolRequest("task", response.toMap())); 78 | 79 | String status = finalResult.content().get(0).toString(); 80 | while (status.indexOf("completed") < 0) { 81 | finalResult = client.callTool(new CallToolRequest("task", response.toMap())); 82 | status = finalResult.content().get(0).toString(); 83 | } 84 | 85 | System.out.println("Task Response = " + finalResult); 86 | 87 | client.closeGracefully(); 88 | } 89 | 90 | } 91 | ``` -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- ``` 1 | <?xml version='1.0' encoding='UTF-8'?> 2 | <project xmlns="http://maven.apache.org/POM/4.0.0" 3 | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 | xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 | <modelVersion>4.0.0</modelVersion> 6 | 7 | <groupId>org.rainyheart</groupId> 8 | <artifactId>jcrawl4ai-mcp-server</artifactId> 9 | <version>1.0.0</version> 10 | <packaging>jar</packaging> 11 | 12 | <name>jcrawl4ai-mcp-server</name> 13 | <description>Crawl4ai MCP Server</description> 14 | 15 | <parent> 16 | <groupId>org.springframework.boot</groupId> 17 | <artifactId>spring-boot-starter-parent</artifactId> 18 | <version>3.4.4</version> 19 | </parent> 20 | 21 | <properties> 22 | <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 23 | <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 24 | <java.version>17</java.version> 25 | <hutool.version>5.8.20</hutool.version> 26 | </properties> 27 | 28 | <dependencyManagement> 29 | <dependencies> 30 | <dependency> 31 | <groupId>org.springframework.ai</groupId> 32 | <artifactId>spring-ai-bom</artifactId> 33 | <version>1.0.0-M7</version> 34 | <type>pom</type> 35 | <scope>import</scope> 36 | </dependency> 37 | </dependencies> 38 | </dependencyManagement> 39 | 40 | <dependencies> 41 | <dependency> 42 | <groupId>org.springframework.ai</groupId> 43 | <artifactId>spring-ai-starter-mcp-server</artifactId> 44 | </dependency> 45 | 46 | <dependency> 47 | <groupId>org.springframework</groupId> 48 | <artifactId>spring-web</artifactId> 49 | </dependency> 50 | 51 | <dependency> 52 | <groupId>cn.hutool</groupId> 53 | <artifactId>hutool-all</artifactId> 54 | <version>${hutool.version}</version> 55 | </dependency> 56 | </dependencies> 57 | 58 | <build> 59 | <plugins> 60 | <plugin> 61 | <groupId>org.springframework.boot</groupId> 62 | <artifactId>spring-boot-maven-plugin</artifactId> 63 | </plugin> 64 | </plugins> 65 | </build> 66 | 67 | <repositories> 68 | <repository> 69 | <id>spring-milestones</id> 70 | <name>Spring Milestones</name> 71 | <url>https://repo.spring.io/milestone</url> 72 | <snapshots> 73 | <enabled>false</enabled> 74 | </snapshots> 75 | </repository> 76 | <repository> 77 | <id>spring-snapshots</id> 78 | <name>Spring Snapshots</name> 79 | <url>https://repo.spring.io/snapshot</url> 80 | <releases> 81 | <enabled>false</enabled> 82 | </releases> 83 | </repository> 84 | <repository> 85 | <id>central-portal-snapshots</id> 86 | <name>Central Portal Snapshots</name> 87 | <url>https://central.sonatype.com/repository/maven-snapshots/</url> 88 | <releases> 89 | <enabled>false</enabled> 90 | </releases> 91 | <snapshots> 92 | <enabled>true</enabled> 93 | </snapshots> 94 | </repository> 95 | </repositories> 96 | 97 | <distributionManagement> 98 | <repository> 99 | <id>github</id> 100 | <name>GitHub Ken Ye Apache Maven Packages</name> 101 | <url>https://maven.pkg.github.com/rainyheart/jcrawl4ai-mcp-server</url> 102 | </repository> 103 | </distributionManagement> 104 | </project> 105 | ``` -------------------------------------------------------------------------------- /src/main/java/org/rainyheart/cawl4ai/mcp/http/response/CrawlTaskResponse.java: -------------------------------------------------------------------------------- ```java 1 | /** 2 | * Create on Apr 21, 2025 3 | * 4 | * Copyright (c) 2025 by Ken Ye. 5 | * 6 | * All Rights Reserved, Designed By Ken Ye 7 | * 8 | * Copyright: Copyright(C) 2025-2035 9 | * 10 | * Company: Ken Ye 11 | */ 12 | package org.rainyheart.cawl4ai.mcp.http.response; 13 | 14 | public class CrawlTaskResponse { 15 | private String status; 16 | private String created_at; 17 | private Result[] results; 18 | 19 | public String getStatus() { 20 | return status; 21 | } 22 | 23 | public void setStatus(String status) { 24 | this.status = status; 25 | } 26 | 27 | public String getCreated_at() { 28 | return created_at; 29 | } 30 | 31 | public void setCreated_at(String created_at) { 32 | this.created_at = created_at; 33 | } 34 | 35 | public Result[] getResults() { 36 | return results; 37 | } 38 | 39 | public void setResults(Result[] results) { 40 | this.results = results; 41 | } 42 | 43 | public class Result { 44 | 45 | private String url; 46 | private String html; 47 | private Boolean success; 48 | private String cleaned_html; 49 | private String[] media; 50 | private String[] links; 51 | private String downloaded_files; 52 | private String screenshot; 53 | private String markdown; 54 | private String markdown_v2; 55 | private String fit_markdown; 56 | private String fit_html; 57 | private String extracted_content; 58 | private String[] metadata; 59 | private String error_message; 60 | private String session_id; 61 | private String[] response_headers; 62 | private String status_code; 63 | 64 | public Result() { 65 | super(); 66 | } 67 | public String getUrl() { 68 | return url; 69 | } 70 | 71 | public void setUrl(String url) { 72 | this.url = url; 73 | } 74 | 75 | public String getHtml() { 76 | return html; 77 | } 78 | 79 | public void setHtml(String html) { 80 | this.html = html; 81 | } 82 | 83 | public Boolean getSuccess() { 84 | return success; 85 | } 86 | 87 | public void setSuccess(Boolean success) { 88 | this.success = success; 89 | } 90 | 91 | public String getCleaned_html() { 92 | return cleaned_html; 93 | } 94 | 95 | public void setCleaned_html(String cleaned_html) { 96 | this.cleaned_html = cleaned_html; 97 | } 98 | 99 | public String[] getMedia() { 100 | return media; 101 | } 102 | 103 | public void setMedia(String[] media) { 104 | this.media = media; 105 | } 106 | 107 | public String[] getLinks() { 108 | return links; 109 | } 110 | 111 | public void setLinks(String[] links) { 112 | this.links = links; 113 | } 114 | 115 | public String getDownloaded_files() { 116 | return downloaded_files; 117 | } 118 | 119 | public void setDownloaded_files(String downloaded_files) { 120 | this.downloaded_files = downloaded_files; 121 | } 122 | 123 | public String getScreenshot() { 124 | return screenshot; 125 | } 126 | 127 | public void setScreenshot(String screenshot) { 128 | this.screenshot = screenshot; 129 | } 130 | 131 | public String getMarkdown() { 132 | return markdown; 133 | } 134 | 135 | public void setMarkdown(String markdown) { 136 | this.markdown = markdown; 137 | } 138 | 139 | public String getMarkdown_v2() { 140 | return markdown_v2; 141 | } 142 | 143 | public void setMarkdown_v2(String markdown_v2) { 144 | this.markdown_v2 = markdown_v2; 145 | } 146 | 147 | public String getFit_markdown() { 148 | return fit_markdown; 149 | } 150 | 151 | public void setFit_markdown(String fit_markdown) { 152 | this.fit_markdown = fit_markdown; 153 | } 154 | 155 | public String getFit_html() { 156 | return fit_html; 157 | } 158 | 159 | public void setFit_html(String fit_html) { 160 | this.fit_html = fit_html; 161 | } 162 | 163 | public String getExtracted_content() { 164 | return extracted_content; 165 | } 166 | 167 | public void setExtracted_content(String extracted_content) { 168 | this.extracted_content = extracted_content; 169 | } 170 | 171 | public String[] getMetadata() { 172 | return metadata; 173 | } 174 | 175 | public void setMetadata(String[] metadata) { 176 | this.metadata = metadata; 177 | } 178 | 179 | public String getError_message() { 180 | return error_message; 181 | } 182 | 183 | public void setError_message(String error_message) { 184 | this.error_message = error_message; 185 | } 186 | 187 | public String getSession_id() { 188 | return session_id; 189 | } 190 | 191 | public void setSession_id(String session_id) { 192 | this.session_id = session_id; 193 | } 194 | 195 | public String[] getResponse_headers() { 196 | return response_headers; 197 | } 198 | 199 | public void setResponse_headers(String[] response_headers) { 200 | this.response_headers = response_headers; 201 | } 202 | 203 | public String getStatus_code() { 204 | return status_code; 205 | } 206 | 207 | public void setStatus_code(String status_code) { 208 | this.status_code = status_code; 209 | } 210 | } 211 | } 212 | ```