Skip to content

Commit 87f31e7

Browse files
committed
work on Schema and clean up
1 parent 18ab638 commit 87f31e7

File tree

9 files changed

+166
-20
lines changed

9 files changed

+166
-20
lines changed

integrations/mcp/server/pom.xml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,6 @@
4242
<groupId>io.helidon.http.media</groupId>
4343
<artifactId>helidon-http-media-jackson</artifactId>
4444
</dependency>
45-
<!-- TODO - To be removed -->
46-
<dependency>
47-
<groupId>io.helidon.webclient</groupId>
48-
<artifactId>helidon-webclient</artifactId>
49-
</dependency>
5045
<dependency>
5146
<groupId>io.helidon.webserver.testing.junit5</groupId>
5247
<artifactId>helidon-webserver-testing-junit5</artifactId>

integrations/mcp/server/src/main/java/io/helidon/integrations/mcp/server/Capability.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,7 @@ public enum Capability {
55
RESOURCE_LIST_CHANGED,
66
RESOURCE_SUBSCRIBE,
77
PROMPT_LIST_CHANGED,
8-
LOGGING
8+
LOGGING,
9+
COMPLETION,
10+
PAGINATION
911
}

integrations/mcp/server/src/main/java/io/helidon/integrations/mcp/server/InputSchema.java

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,20 +46,51 @@ private Builder() {
4646
this.properties = new HashMap<>();
4747
}
4848

49-
public Builder properties(String key, String value, boolean required) {
49+
public Builder asBoolean(String name, boolean bool, boolean required) {
50+
return this;
51+
}
52+
public Builder asBoolean(String name, boolean bool) {
53+
return this;
54+
}
55+
56+
public <T> Builder array(String name, List<T> list, boolean required) {
57+
return this;
58+
}
59+
60+
public <T> Builder array(String name, List<T> list) {
61+
return this;
62+
}
63+
64+
public Builder number(String name, boolean required) {
65+
return this;
66+
}
67+
68+
public Builder number(String name) {
69+
return this;
70+
}
71+
72+
public Builder object(String name, Class<?> type, boolean required) {
73+
return this;
74+
}
75+
76+
public Builder object(String name, Class<?> type) {
77+
return this;
78+
}
79+
80+
Builder properties(String key, String value, boolean required) {
5081
this.properties.put(key, value);
5182
if (required) {
5283
this.required.add(key);
5384
}
5485
return this;
5586
}
5687

57-
public Builder properties(String key, String value) {
88+
Builder properties(String key, String value) {
5889
this.properties.put(key, value);
5990
return this;
6091
}
6192

62-
public Builder required(String value) {
93+
Builder required(String value) {
6394
this.required.add(value);
6495
return this;
6596
}

integrations/mcp/server/src/main/java/io/helidon/integrations/mcp/server/McpServerInfo.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ public interface McpServerInfo {
4343
*/
4444
Set<Capability> capabilities();
4545

46+
static Builder builder() {
47+
return new Builder();
48+
}
49+
4650
static McpServerInfo create(String name, String version, Capability... capabilities) {
4751
return new McpServerInfo() {
4852
@Override
@@ -61,4 +65,44 @@ public Set<Capability> capabilities() {
6165
}
6266
};
6367
}
68+
69+
class Builder {
70+
private String name;
71+
private String version;
72+
private Set<Capability> capabilities;
73+
74+
public Builder name(String name) {
75+
this.name = name;
76+
return this;
77+
}
78+
79+
public Builder version(String version) {
80+
this.version = version;
81+
return this;
82+
}
83+
84+
public Builder capability(Capability... capabilities) {
85+
this.capabilities = Set.of(capabilities);
86+
return this;
87+
}
88+
89+
public McpServerInfo build() {
90+
return new McpServerInfo() {
91+
@Override
92+
public String name() {
93+
return name;
94+
}
95+
96+
@Override
97+
public String version() {
98+
return version;
99+
}
100+
101+
@Override
102+
public Set<Capability> capabilities() {
103+
return capabilities;
104+
}
105+
};
106+
}
107+
}
64108
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package io.helidon.integrations.mcp.server;
2+
3+
import java.util.List;
4+
import java.util.Map;
5+
import java.util.NoSuchElementException;
6+
import java.util.Optional;
7+
import java.util.Set;
8+
9+
import io.helidon.common.mapper.OptionalValue;
10+
import io.helidon.common.mapper.Value;
11+
12+
public class Parameters implements io.helidon.common.parameters.Parameters {
13+
14+
io.helidon.common.parameters.Parameters delegate =
15+
io.helidon.common.parameters.Parameters.create("mcp", Map.of());
16+
17+
public <T> Optional<T> object(String name, Class<T> clazz) {
18+
return Optional.empty();
19+
}
20+
21+
@Override
22+
public List<String> all(String name) throws NoSuchElementException {
23+
return delegate.all(name);
24+
}
25+
26+
@Override
27+
public List<Value<String>> allValues(String name) throws NoSuchElementException {
28+
return delegate.allValues(name);
29+
}
30+
31+
@Override
32+
public String get(String name) throws NoSuchElementException {
33+
return delegate.get(name);
34+
}
35+
36+
@Override
37+
public OptionalValue<String> first(String name) {
38+
return delegate.first(name);
39+
}
40+
41+
@Override
42+
public boolean contains(String name) {
43+
return delegate.contains(name);
44+
}
45+
46+
@Override
47+
public int size() {
48+
return delegate.size();
49+
}
50+
51+
@Override
52+
public Set<String> names() {
53+
return delegate.names();
54+
}
55+
56+
@Override
57+
public String component() {
58+
return delegate.component();
59+
}
60+
}

integrations/mcp/server/src/main/java/io/helidon/integrations/mcp/server/Prompt.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
package io.helidon.integrations.mcp.server;
1818

19-
import io.helidon.common.parameters.Parameters;
20-
2119
/**
2220
* MCP Prompt definition.
2321
*/

integrations/mcp/server/src/main/java/io/helidon/integrations/mcp/server/Tool.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
package io.helidon.integrations.mcp.server;
1818

19-
import io.helidon.common.parameters.Parameters;
20-
2119
/**
2220
* MCP tool definition.
2321
*/

integrations/mcp/tests/declarative/src/main/java/io/helidon/integrations/mcp/McpWeatherServerDeclarative.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828
@Mcp.Server("mcp-weather-server")
2929
@Mcp.Version("0.0.1")
30-
@Mcp.Capability({TOOL_LIST_CHANGED, RESOURCE_LIST_CHANGED})
30+
@Mcp.Capability({ TOOL_LIST_CHANGED, RESOURCE_LIST_CHANGED })
3131
class McpWeatherServerDeclarative {
3232

3333
@Mcp.Tool

integrations/mcp/tests/se/src/main/java/io/helidon/integrations/mcp/tests/se/McpWeatherServerSe.java

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
1616

1717
package io.helidon.integrations.mcp.tests.se;
1818

19+
import java.util.Optional;
20+
1921
import io.helidon.common.config.Config;
20-
import io.helidon.common.parameters.Parameters;
2122
import io.helidon.integrations.mcp.server.Capability;
2223
import io.helidon.integrations.mcp.server.McpHttpFeature;
2324
import io.helidon.integrations.mcp.server.McpRouting;
2425
import io.helidon.integrations.mcp.server.McpServerDetails;
2526
import io.helidon.integrations.mcp.server.McpServerInfo;
27+
import io.helidon.integrations.mcp.server.Parameters;
2628
import io.helidon.integrations.mcp.server.Prompt;
2729
import io.helidon.integrations.mcp.server.PromptArgument;
2830
import io.helidon.integrations.mcp.server.PromptContent;
@@ -70,7 +72,11 @@ static class McpWeatherDetails implements McpServerDetails {
7072

7173
@Override
7274
public McpServerInfo info() {
73-
return McpServerInfo.create("mcp-server", "0.0.1", Capability.TOOL_LIST_CHANGED);
75+
return McpServerInfo.builder()
76+
.name("weather-mcp-server")
77+
.version("0.0.1")
78+
.capability(Capability.TOOL_LIST_CHANGED)
79+
.build();
7480
}
7581

7682
@Override
@@ -88,20 +94,32 @@ public ToolInfo info() {
8894
return ToolInfo.builder()
8995
.name("tool-weater")
9096
.description("Get the weather in a specific town")
91-
.schema(schema -> schema.properties("town", "string", true))
97+
.schema(schema -> schema
98+
.object("town", Town.class, false))
9299
.build();
93100
}
94101

95102
@Override
96103
public ToolContent process(Parameters parameters) {
97-
// Optional<Town> value = parameters.object("town", Town.class);
98-
// Optional<String> value = parameters.objectString("town");
99-
// OptionalValue<String> value = parameters.first("town");
104+
105+
Optional<Town> town = parameters.object("town", Town.class);
100106

101107
ToolContent resource = ToolContent.resourceContent("uri");
102108
ToolContent image = ToolContent.imageContent("data", "text/plain");
103109
return ToolContent.textContent("data");
104110
}
111+
112+
static class Town {
113+
String name;
114+
double latitude;
115+
double longitude;
116+
117+
Town() {
118+
name = "Prague";
119+
latitude = 50.09;
120+
longitude = 14.40;
121+
}
122+
}
105123
}
106124

107125
static class WeatherPrompt implements Prompt {

0 commit comments

Comments
 (0)