#
tokens: 7184/50000 12/12 files
lines: on (toggle) GitHub
raw markdown copy reset
# 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 | 
```