Skip to content

Commit 029de07

Browse files
committed
CAY-2942 CayenneModeler MCP: cgen_run tool
removing hello tool now that we have a real one cleanup
1 parent 6e92811 commit 029de07

9 files changed

Lines changed: 82 additions & 293 deletions

File tree

cayenne-mcp-server/src/main/java/org/apache/cayenne/mcp/CayenneMcpServer.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import io.modelcontextprotocol.server.transport.StdioServerTransportProvider;
2626
import io.modelcontextprotocol.spec.McpSchema;
2727
import org.apache.cayenne.mcp.tools.cgen.CgenRunTool;
28-
import org.apache.cayenne.mcp.tools.hello.HelloTool;
2928
import org.slf4j.Logger;
3029
import org.slf4j.LoggerFactory;
3130

@@ -53,7 +52,7 @@ public void run(String version, InputStream in, OutputStream out) {
5352
McpSyncServer server = McpServer.sync(transport)
5453
.serverInfo("cayenne-mcp-server", version)
5554
.capabilities(McpSchema.ServerCapabilities.builder().tools(true).build())
56-
.tools(HelloTool.spec(), CgenRunTool.spec(jsonMapper))
55+
.tools(CgenRunTool.spec(jsonMapper))
5756
.build();
5857

5958
Runtime.getRuntime().addShutdownHook(new Thread(() -> {

cayenne-mcp-server/src/main/java/org/apache/cayenne/mcp/tools/hello/HelloTool.java

Lines changed: 0 additions & 51 deletions
This file was deleted.
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package org.apache.cayenne.mcp;
2+
3+
import java.io.IOException;
4+
import java.io.InputStream;
5+
import java.io.OutputStream;
6+
import java.io.PipedInputStream;
7+
import java.io.PipedOutputStream;
8+
import java.util.concurrent.TimeUnit;
9+
10+
/**
11+
* Handles the lifecycle of a test in-process MCP server.
12+
*/
13+
public class InProcessMcpServer {
14+
15+
private final OutputStream outputStream;
16+
private final InputStream inputStream;
17+
private final Thread serverThread;
18+
19+
public static InProcessMcpServer start() {
20+
try {
21+
PipedOutputStream clientOut = new PipedOutputStream();
22+
PipedInputStream serverIn = new PipedInputStream(clientOut);
23+
PipedOutputStream serverOut = new PipedOutputStream();
24+
PipedInputStream clientIn = new PipedInputStream(serverOut);
25+
26+
Thread serverThread = new Thread(
27+
() -> new CayenneMcpServer().run("test", serverIn, serverOut),
28+
"mcp-server");
29+
serverThread.setDaemon(true);
30+
serverThread.start();
31+
32+
return new InProcessMcpServer(clientOut, clientIn, serverThread);
33+
} catch (IOException e) {
34+
throw new RuntimeException("Failed to start in-process MCP server", e);
35+
}
36+
}
37+
38+
private InProcessMcpServer(OutputStream outputStream, InputStream inputStream, Thread serverThread) {
39+
this.outputStream = outputStream;
40+
this.inputStream = inputStream;
41+
this.serverThread = serverThread;
42+
}
43+
44+
/**
45+
* Stream the test writes JSON-RPC requests to (→ server stdin).
46+
*/
47+
public OutputStream getOutputStream() {
48+
return outputStream;
49+
}
50+
51+
/**
52+
* Stream the test reads JSON-RPC responses from (← server stdout).
53+
*/
54+
public InputStream getInputStream() {
55+
return inputStream;
56+
}
57+
58+
/**
59+
* Waits for the server thread to finish, returning {@code true} if it stops
60+
* within {@code timeout}. Closing {@link #getOutputStream()} signals EOF to
61+
* the server and causes it to shut down.
62+
*/
63+
public boolean waitFor(long timeout, TimeUnit unit) throws InterruptedException {
64+
serverThread.join(unit.toMillis(timeout));
65+
return !serverThread.isAlive();
66+
}
67+
}

cayenne-mcp-server/src/test/java/org/apache/cayenne/mcp/McpHandle.java

Lines changed: 0 additions & 42 deletions
This file was deleted.

cayenne-mcp-server/src/test/java/org/apache/cayenne/mcp/McpStarter.java

Lines changed: 0 additions & 27 deletions
This file was deleted.

cayenne-mcp-server/src/test/java/org/apache/cayenne/mcp/tools/cgen/CgenRunIT.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,7 @@ public class CgenRunIT {
4949
void setUp() throws IOException {
5050
tool = new CgenRunTool();
5151
destDir = tempDir.resolve("generated");
52-
writeFixture("PersonMap", "com.example", destDir, true);
53-
projectFile = tempDir.resolve("cayenne-project.xml");
52+
projectFile = writeFixture("PersonMap", "com.example", destDir, true);
5453
}
5554

5655
@Test
@@ -117,10 +116,12 @@ public void subclassNotOverwrittenWhenMakePairsIsTrue() throws IOException {
117116
int skipped = result.summary().filesConsidered() - result.summary().filesWritten();
118117
assertTrue(skipped >= 1, "At least one file (the existing subclass) should have been skipped");
119118
}
120-
121-
private void writeFixture(String mapName, String pkg, Path destDir, boolean makePairs) throws IOException {
119+
120+
private Path writeFixture(String mapName, String pkg, Path destDir, boolean makePairs) throws IOException {
121+
122122
// Project descriptor
123-
Files.writeString(tempDir.resolve("cayenne-project.xml"), String.format("""
123+
Path projectDescriptor = tempDir.resolve("cayenne-project.xml");
124+
Files.writeString(projectDescriptor, String.format("""
124125
<?xml version="1.0" encoding="utf-8"?>
125126
<domain xmlns="http://cayenne.apache.org/schema/12/domain" project-version="12">
126127
<map name="%s"/>
@@ -144,5 +145,7 @@ private void writeFixture(String mapName, String pkg, Path destDir, boolean make
144145
</cgen>
145146
</data-map>
146147
""", pkg, pkg, destDir.toAbsolutePath(), makePairs));
148+
149+
return projectDescriptor;
147150
}
148151
}

cayenne-mcp-server/src/test/java/org/apache/cayenne/mcp/tools/cgen/CgenRunMcpIT.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@
1818
****************************************************************/
1919
package org.apache.cayenne.mcp.tools.cgen;
2020

21-
import org.apache.cayenne.mcp.McpHandle;
22-
import org.apache.cayenne.mcp.McpStarter;
21+
import org.apache.cayenne.mcp.InProcessMcpServer;
2322
import org.junit.jupiter.api.AfterEach;
2423
import org.junit.jupiter.api.BeforeEach;
2524
import org.junit.jupiter.api.Test;
@@ -52,7 +51,7 @@ public class CgenRunMcpIT {
5251
@TempDir
5352
Path tempDir;
5453

55-
private McpHandle handle;
54+
private InProcessMcpServer server;
5655
private BufferedWriter writer;
5756
private BufferedReader reader;
5857
private Path projectFile;
@@ -64,9 +63,9 @@ void setUp() throws Exception {
6463
writeFixture("PersonMap", "com.example", destDir, true);
6564
projectFile = tempDir.resolve("cayenne-project.xml");
6665

67-
handle = McpStarter.start();
68-
writer = new BufferedWriter(new OutputStreamWriter(handle.getOutputStream()));
69-
reader = new BufferedReader(new InputStreamReader(handle.getInputStream()));
66+
server = InProcessMcpServer.start();
67+
writer = new BufferedWriter(new OutputStreamWriter(server.getOutputStream()));
68+
reader = new BufferedReader(new InputStreamReader(server.getInputStream()));
7069

7170
send("""
7271
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{\
@@ -83,7 +82,7 @@ void setUp() throws Exception {
8382
@AfterEach
8483
void stopServer() throws Exception {
8584
writer.close();
86-
assertTrue(handle.waitFor(10, TimeUnit.SECONDS), "Server thread did not stop after stdin was closed");
85+
assertTrue(server.waitFor(10, TimeUnit.SECONDS), "Server thread did not stop after stdin was closed");
8786
}
8887

8988
@Test

cayenne-mcp-server/src/test/java/org/apache/cayenne/mcp/tools/hello/HelloMcpIT.java

Lines changed: 0 additions & 111 deletions
This file was deleted.

0 commit comments

Comments
 (0)