diff --git a/_posts/2025-09-08-mcp-toolgroups-from-osgi-services.md b/_posts/2025-09-08-mcp-toolgroups-from-osgi-services.md
new file mode 100644
index 0000000..cf7fa09
--- /dev/null
+++ b/_posts/2025-09-08-mcp-toolgroups-from-osgi-services.md
@@ -0,0 +1,361 @@
+---
+layout: prev-next-collection
+title: Building MCP Servers with ToolGroups and OSGi Services
+description: New bndtools project templates for creating dynamic Model Context Protocol (MCP) Servers using OSGi Services
+comments: true
+author: Scott Lewis
+---
+
+MCP Server development has become popular, and developers are frequently looking to [build MCP Servers](https://github.com/modelcontextprotocol/servers), and [expose existing APIs and
+services as MCP Tools](https://thenewstack.io/why-your-legacy-apis-are-a-roadblock-for-ai-agents).
+
+The ECF Project has recently added support for [Dynamic Tool Groups](https://github.com/ECF/MCPToolGroups) based upon and extending
+the [mcp-annotations](https://github.com/spring-ai-community/mcp-annotations) project. Although not limited to OSGi frameworks, the ability
+to dynamically reflect and generate MCP Tool Specification Metadata from mcp annotated OSGi services makes it an excellent fit for the
+OSGi Service Registry and the Service Component Runtime.
+
+We've recently added 3 new bndtools project templates for constructing and testing MCP Servers. These MCP Servers, can dynamically add or remove any mcp annotated OSGi service as an
+MCP Tool Group (set of associated tools), making it immediately available to any MCP Client for tool introspection or tool calling.
+
+Below is a few screenshots showing the use of the 3 new project templates in bndtools to create an MCP ToolGroup OSGi service, dynamically add and remove the
+tools in that tool group to MCP sync or async server, and a simple example test client that to test the functioning of the MCP servers.
+
+With Bndtoools 7.1+ installed an a recent version of Eclipse (4.36+), create a new Eclipse workspace and choose New->Bnd OSGi Workspace.
+
+1. Create a new Bndtools Workspace using the [ECF Bndtools Workspace Template](https://github.com/ECF/bndtools.workspace)
+
+
+
+2. Create a new bndtools project using the ArithmeticToolGroup API Project template
+
+
+
+The new project wizard will request a name for the project. You should use a name with java package-like 'dot'
+notation for the project name...e.g.: **my.arithmetic.api**
+
+3. Create a MCP Server project using the ArithmeticToolGroup MCP Servers Project template from the New Bnd OSGi Project wizard as shown above.
+
+The project name should be unique, but should have same dot notation as above. For example: **my.arithmetic.mcpserver**
+
+After the new project name entry and Next> this dialog will appear:
+
+
+
+The name given during api project creation should be provided in this field as shown in the screenshot above.
+
+4. Create a MCP Test Client project using the ArithmeticToolGroup MCP Test Client Project template from the New Bnd OSGi Project wizard.
+
+As before, you should give a project name like the two previous projects: **my.arithmetic.mcpclient**
+
+This dialog will then appear and you should complete both fields with the names for the projects used above and choose Finish
+
+
+
+You should then have three projects in your workspace. You may examine the API class (ArithmeticToolGroup in API project) or API impl in the mcpserver project
+(ArithmeticToolGroupComponent) the two (sync and async) servers.
+
+
+
+## Run/Debug the ArithmeticToolGroup MCP Servers in Eclipse
+
+To Run or Debug the ArithmeticToolGroup MCP Servers, to to the mcpserver project in your workspace and open the file **mcpservers.bndrun**. Once the bndrun editor
+is open you can launch (run or debug) by choosing the Run OSGi or Debug OSGi button in the upper right of the bndrun editor.
+
+In the console you should then get debug output like this
+
+```console
+Sep 08, 2025 2:54:17 PM org.apache.aries.spifly.BaseActivator log
+INFO: Registered provider org.slf4j.simple.SimpleServiceProvider of service org.slf4j.spi.SLF4JServiceProvider in bundle slf4j.simple
+[FelixStartLevel] DEBUG my.arithmetic.mcpserver.AsyncMcpToolGroupServerComponent - starting async server with uds path=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\a.socket
+[FelixStartLevel] DEBUG reactor.util.Loggers - Using Slf4j logging framework
+[FelixStartLevel] DEBUG com.composent.ai.mcp.transport.uds.UDSMcpServerTransportProvider - Session transport initProcessing completed
+[FelixStartLevel] DEBUG my.arithmetic.mcpserver.AsyncMcpToolGroupServerComponent - async server started
+[FelixStartLevel] DEBUG my.arithmetic.mcpserver.SyncMcpToolGroupServerComponent - starting sync server with uds at path=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\s.socket
+[FelixStartLevel] DEBUG com.composent.ai.mcp.transport.uds.UDSMcpServerTransportProvider - Session transport initProcessing completed
+[FelixStartLevel] DEBUG my.arithmetic.mcpserver.SyncMcpToolGroupServerComponent - sync server started
+[FelixStartLevel] DEBUG com.github.victools.jsonschema.generator.impl.SchemaGenerationContextImpl - storing configured custom inline type for double as definition (since it is the main schema "#")
+[FelixStartLevel] DEBUG com.github.victools.jsonschema.generator.impl.SchemaGenerationContextImpl - storing configured custom inline type for double as definition (since it is the main schema "#")
+[FelixStartLevel] DEBUG com.composent.ai.mcp.toolgroup.provider.SyncMcpToolGroupProvider - created sync toolspec=SyncToolSpecification[tool=Tool[name=my.arithmetic.api.ArithmeticToolGroup.add, title=null, description=computes the sum of the two double precision input arguments a and b, inputSchema=JsonSchema[type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y], additionalProperties=null, defs=null, definitions=null], outputSchema=null, annotations=ToolAnnotations[title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true, returnDirect=null], meta=null], call=null, callHandler=org.springaicommunity.mcp.method.tool.SyncMcpToolMethodCallback@2b941329]
+[FelixStartLevel] DEBUG com.github.victools.jsonschema.generator.impl.SchemaGenerationContextImpl - storing configured custom inline type for double as definition (since it is the main schema "#")
+[FelixStartLevel] DEBUG com.github.victools.jsonschema.generator.impl.SchemaGenerationContextImpl - storing configured custom inline type for double as definition (since it is the main schema "#")
+[FelixStartLevel] DEBUG com.composent.ai.mcp.toolgroup.provider.SyncMcpToolGroupProvider - created sync toolspec=SyncToolSpecification[tool=Tool[name=my.arithmetic.api.ArithmeticToolGroup.multiply, title=null, description=return the product of the two given double precision arguments named a and b, inputSchema=JsonSchema[type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y], additionalProperties=null, defs=null, definitions=null], outputSchema=null, annotations=ToolAnnotations[title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true, returnDirect=null], meta=null], call=null, callHandler=org.springaicommunity.mcp.method.tool.SyncMcpToolMethodCallback@293229b1]
+[FelixStartLevel] DEBUG com.github.victools.jsonschema.generator.impl.SchemaGenerationContextImpl - storing configured custom inline type for java.lang.String as definition (since it is the main schema "#")
+[FelixStartLevel] DEBUG com.composent.ai.mcp.toolgroup.provider.SyncMcpToolGroupProvider - created sync toolspec=SyncToolSpecification[tool=Tool[name=my.arithmetic.api.ArithmeticToolGroup.get-image-and-message-tool, title=null, description=Tool returning CallToolResult with an image and message, inputSchema=JsonSchema[type=object, properties={message={type=string, description=Message to associate with image}}, required=[message], additionalProperties=null, defs=null, definitions=null], outputSchema=null, annotations=ToolAnnotations[title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true, returnDirect=null], meta=null], call=null, callHandler=org.springaicommunity.mcp.method.tool.SyncMcpToolMethodCallback@f34732d]
+[FelixStartLevel] DEBUG io.modelcontextprotocol.server.McpAsyncServer - Added tool handler: my.arithmetic.api.ArithmeticToolGroup.add
+[FelixStartLevel] DEBUG com.composent.ai.mcp.toolgroup.AbstractSyncMcpToolGroupServer - added tool specification=my.arithmetic.api.ArithmeticToolGroup.add to sync server=io.modelcontextprotocol.server.McpSyncServer@e154bde
+[FelixStartLevel] DEBUG io.modelcontextprotocol.server.McpAsyncServer - Added tool handler: my.arithmetic.api.ArithmeticToolGroup.multiply
+[FelixStartLevel] DEBUG com.composent.ai.mcp.toolgroup.AbstractSyncMcpToolGroupServer - added tool specification=my.arithmetic.api.ArithmeticToolGroup.multiply to sync server=io.modelcontextprotocol.server.McpSyncServer@e154bde
+[FelixStartLevel] DEBUG io.modelcontextprotocol.server.McpAsyncServer - Added tool handler: my.arithmetic.api.ArithmeticToolGroup.get-image-and-message-tool
+[FelixStartLevel] DEBUG com.composent.ai.mcp.toolgroup.AbstractSyncMcpToolGroupServer - added tool specification=my.arithmetic.api.ArithmeticToolGroup.get-image-and-message-tool to sync server=io.modelcontextprotocol.server.McpSyncServer@e154bde
+[FelixStartLevel] DEBUG com.github.victools.jsonschema.generator.impl.SchemaGenerationContextImpl - storing configured custom inline type for double as definition (since it is the main schema "#")
+[FelixStartLevel] DEBUG com.github.victools.jsonschema.generator.impl.SchemaGenerationContextImpl - storing configured custom inline type for double as definition (since it is the main schema "#")
+[FelixStartLevel] DEBUG com.composent.ai.mcp.toolgroup.provider.AsyncMcpToolGroupProvider - created async toolspec=AsyncToolSpecification[tool=Tool[name=my.arithmetic.api.ArithmeticToolGroup.asyncAdd, title=null, description=asynchronously computes the sum of the two double precision input arguments a and b, inputSchema=JsonSchema[type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y], additionalProperties=null, defs=null, definitions=null], outputSchema=null, annotations=ToolAnnotations[title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true, returnDirect=null], meta=null], call=null, callHandler=org.springaicommunity.mcp.method.tool.AsyncMcpToolMethodCallback@70c3b659]
+[FelixStartLevel] DEBUG com.github.victools.jsonschema.generator.impl.SchemaGenerationContextImpl - storing configured custom inline type for double as definition (since it is the main schema "#")
+[FelixStartLevel] DEBUG com.github.victools.jsonschema.generator.impl.SchemaGenerationContextImpl - storing configured custom inline type for double as definition (since it is the main schema "#")
+[FelixStartLevel] DEBUG com.composent.ai.mcp.toolgroup.provider.AsyncMcpToolGroupProvider - created async toolspec=AsyncToolSpecification[tool=Tool[name=my.arithmetic.api.ArithmeticToolGroup.asyncMultiply, title=null, description=asynchronously computes the product of the two given double precision arguments named a and b, inputSchema=JsonSchema[type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y], additionalProperties=null, defs=null, definitions=null], outputSchema=null, annotations=ToolAnnotations[title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true, returnDirect=null], meta=null], call=null, callHandler=org.springaicommunity.mcp.method.tool.AsyncMcpToolMethodCallback@1710062c]
+[FelixStartLevel] DEBUG io.modelcontextprotocol.server.McpAsyncServer - Added tool handler: my.arithmetic.api.ArithmeticToolGroup.asyncAdd
+[FelixStartLevel] DEBUG com.composent.ai.mcp.toolgroup.AbstractAsyncMcpToolGroupServer - added tool specification=my.arithmetic.api.ArithmeticToolGroup.asyncAdd to async server=io.modelcontextprotocol.server.McpAsyncServer@463ac911
+[FelixStartLevel] DEBUG io.modelcontextprotocol.server.McpAsyncServer - Added tool handler: my.arithmetic.api.ArithmeticToolGroup.asyncMultiply
+[FelixStartLevel] DEBUG com.composent.ai.mcp.toolgroup.AbstractAsyncMcpToolGroupServer - added tool specification=my.arithmetic.api.ArithmeticToolGroup.asyncMultiply to async server=io.modelcontextprotocol.server.McpAsyncServer@463ac911
+____________________________
+Welcome to Apache Felix Gogo
+
+g!
+```
+
+The debug output indicates that both async and sync mcp servers were created (see AsyncMcpToolGroupServerComponent and SyncMcpToolGroupServerComponent), and that the
+ArithmeticToolGroupComponent api implementation was created but the api was dynamically inspected, tool specifications created, and then added to the sync or async
+servers appropriately. See ArithmeticToolGroupComponent.activate() method.
+
+## Run/Debug the Test MCP Client in Eclipse
+
+In your MCP client project in workspace, open the mcpclient.bndrun file and choose Run OSGi/Debug OSGI as desired. The MCP Test Client has both an async client (McpAsyncClientCompoent)
+and sync client (McpSyncClientComponent). Both of these client connect via the Unix Domain Socket Transport to the async or sync MCP server that should
+be already running, and then call some of the async/sync method calls via the MCP protocol.
+
+```console
+Sep 08, 2025 3:12:23 PM org.apache.aries.spifly.BaseActivator log
+INFO: Registered provider org.slf4j.simple.SimpleServiceProvider of service org.slf4j.spi.SLF4JServiceProvider in bundle slf4j.simple
+[FelixStartLevel] DEBUG my.arithmetic.mcpclient.McpAsyncClientComponent - starting uds async client with socket path=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\a.socket
+[FelixStartLevel] DEBUG reactor.util.Loggers - Using Slf4j logging framework
+[FelixStartLevel] DEBUG io.modelcontextprotocol.client.LifecycleInitializer - Initialization process started
+[boundedElastic-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - connect targetAddress=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\a.socket
+[boundedElastic-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - connect targetAddress=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\a.socket
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - select returned count=1
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - client=java.nio.channels.SocketChannel[connection-pending remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\a.socket]
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - connected client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\a.socket]
+[pool-4-thread-1] INFO com.composent.ai.mcp.transport.uds.UDSMcpClientTransport - CONNECTED to targetAddress=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\a.socket
+[boundedElastic-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - connected client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\a.socket]
+[FelixStartLevel] DEBUG io.modelcontextprotocol.spec.McpClientSession - Sending message for method initialize
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - select returned count=1
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\a.socket]
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\a.socket] msg=
+[pool-4-thread-1] DEBUG io.modelcontextprotocol.spec.McpSchema - Received JSON message: {"jsonrpc":"2.0","method":"notifications/tools/list_changed"}
+[pool-2-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing msg={"jsonrpc":"2.0","method":"initialize","id":"28bf018d-0","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"Spring AI MCP Client","version":"0.3.1"}}}
+
+[pool-2-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - doWrite message={"jsonrpc":"2.0","method":"initialize","id":"28bf018d-0","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"Spring AI MCP Client","version":"0.3.1"}}}
+
+[pool-2-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing done msg={"jsonrpc":"2.0","method":"initialize","id":"28bf018d-0","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"Spring AI MCP Client","version":"0.3.1"}}}
+
+[pool-4-thread-1] DEBUG io.modelcontextprotocol.spec.McpClientSession - Received notification: JSONRPCNotification[jsonrpc=2.0, method=notifications/tools/list_changed, params=null]
+[pool-4-thread-1] DEBUG io.modelcontextprotocol.client.LifecycleInitializer - Joining previous initialization
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - select returned count=1
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\a.socket]
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\a.socket] msg=
+[pool-4-thread-1] DEBUG io.modelcontextprotocol.spec.McpSchema - Received JSON message: {"jsonrpc":"2.0","method":"notifications/tools/list_changed"}
+[pool-4-thread-1] DEBUG io.modelcontextprotocol.spec.McpClientSession - Received notification: JSONRPCNotification[jsonrpc=2.0, method=notifications/tools/list_changed, params=null]
+[pool-4-thread-1] DEBUG io.modelcontextprotocol.client.LifecycleInitializer - Joining previous initialization
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - select returned count=1
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\a.socket]
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\a.socket] msg=
+[pool-4-thread-1] DEBUG io.modelcontextprotocol.spec.McpSchema - Received JSON message: {"jsonrpc":"2.0","id":"28bf018d-0","result":{"protocolVersion":"2024-11-05","capabilities":{"logging":{},"tools":{"listChanged":true}},"serverInfo":{"name":"my.arithmetic.mcpserver.AsyncMcpToolGroupServerComponent","version":"1.0.0"}}}
+[pool-4-thread-1] DEBUG io.modelcontextprotocol.spec.McpClientSession - Received Response: JSONRPCResponse[jsonrpc=2.0, id=28bf018d-0, result={protocolVersion=2024-11-05, capabilities={logging={}, tools={listChanged=true}}, serverInfo={name=my.arithmetic.mcpserver.AsyncMcpToolGroupServerComponent, version=1.0.0}}, error=null]
+[pool-4-thread-1] INFO io.modelcontextprotocol.client.LifecycleInitializer - Server response with Protocol: 2024-11-05, Capabilities: ServerCapabilities[completions=null, experimental=null, logging=LoggingCapabilities[], prompts=null, resources=null, tools=ToolCapabilities[listChanged=true]], Info: Implementation[name=my.arithmetic.mcpserver.AsyncMcpToolGroupServerComponent, title=null, version=1.0.0] and Instructions null
+[pool-2-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing msg={"jsonrpc":"2.0","method":"notifications/initialized"}
+
+[pool-2-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - doWrite message={"jsonrpc":"2.0","method":"notifications/initialized"}
+
+[pool-2-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing done msg={"jsonrpc":"2.0","method":"notifications/initialized"}
+
+[pool-4-thread-1] DEBUG io.modelcontextprotocol.spec.McpClientSession - Sending message for method tools/list
+[pool-2-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing msg={"jsonrpc":"2.0","method":"tools/list","id":"28bf018d-1","params":{}}
+
+[pool-4-thread-1] DEBUG io.modelcontextprotocol.spec.McpClientSession - Sending message for method tools/list
+[FelixStartLevel] DEBUG my.arithmetic.mcpclient.McpAsyncClientComponent - uds async client initialized
+[pool-2-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - doWrite message={"jsonrpc":"2.0","method":"tools/list","id":"28bf018d-1","params":{}}
+
+[pool-2-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing done msg={"jsonrpc":"2.0","method":"tools/list","id":"28bf018d-1","params":{}}
+
+[pool-2-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing msg={"jsonrpc":"2.0","method":"tools/list","id":"28bf018d-2","params":{}}
+
+[pool-2-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - doWrite message={"jsonrpc":"2.0","method":"tools/list","id":"28bf018d-2","params":{}}
+
+[pool-2-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing done msg={"jsonrpc":"2.0","method":"tools/list","id":"28bf018d-2","params":{}}
+
+[FelixStartLevel] DEBUG io.modelcontextprotocol.client.LifecycleInitializer - Joining previous initialization
+[FelixStartLevel] DEBUG io.modelcontextprotocol.spec.McpClientSession - Sending message for method tools/call
+[FelixStartLevel] DEBUG io.modelcontextprotocol.client.LifecycleInitializer - Joining previous initialization
+[FelixStartLevel] DEBUG io.modelcontextprotocol.spec.McpClientSession - Sending message for method tools/call
+[FelixStartLevel] DEBUG my.arithmetic.mcpclient.McpSyncClientComponent - starting uds client with socket at path=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\s.socket
+[pool-2-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing msg={"jsonrpc":"2.0","method":"tools/call","id":"28bf018d-3","params":{"name":"my.arithmetic.api.ArithmeticToolGroup.asyncAdd","arguments":{"y":"26.32","x":"25.1"}}}
+
+[pool-2-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - doWrite message={"jsonrpc":"2.0","method":"tools/call","id":"28bf018d-3","params":{"name":"my.arithmetic.api.ArithmeticToolGroup.asyncAdd","arguments":{"y":"26.32","x":"25.1"}}}
+
+[pool-2-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing done msg={"jsonrpc":"2.0","method":"tools/call","id":"28bf018d-3","params":{"name":"my.arithmetic.api.ArithmeticToolGroup.asyncAdd","arguments":{"y":"26.32","x":"25.1"}}}
+
+[pool-2-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing msg={"jsonrpc":"2.0","method":"tools/call","id":"28bf018d-4","params":{"name":"my.arithmetic.api.ArithmeticToolGroup.asyncMultiply","arguments":{"y":"223.86","x":"210.71"}}}
+
+[pool-2-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - doWrite message={"jsonrpc":"2.0","method":"tools/call","id":"28bf018d-4","params":{"name":"my.arithmetic.api.ArithmeticToolGroup.asyncMultiply","arguments":{"y":"223.86","x":"210.71"}}}
+
+[pool-2-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing done msg={"jsonrpc":"2.0","method":"tools/call","id":"28bf018d-4","params":{"name":"my.arithmetic.api.ArithmeticToolGroup.asyncMultiply","arguments":{"y":"223.86","x":"210.71"}}}
+
+[FelixStartLevel] DEBUG io.modelcontextprotocol.client.LifecycleInitializer - Initialization process started
+[FelixStartLevel] DEBUG io.modelcontextprotocol.spec.McpClientSession - Sending message for method initialize
+[boundedElastic-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - connect targetAddress=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\s.socket
+[boundedElastic-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - connect targetAddress=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\s.socket
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - select returned count=1
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - client=java.nio.channels.SocketChannel[connection-pending remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\s.socket]
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - connected client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\s.socket]
+[pool-9-thread-1] INFO com.composent.ai.mcp.transport.uds.UDSMcpClientTransport - CONNECTED to targetAddress=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\s.socket
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - select returned count=1
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\s.socket]
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\s.socket] msg=
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.spec.McpSchema - Received JSON message: {"jsonrpc":"2.0","method":"notifications/tools/list_changed"}
+[boundedElastic-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - connected client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\s.socket]
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - select returned count=1
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\a.socket]
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read partial={"jsonrpc":"2.0","id":"28bf018d-1","result":{"tools":[{"name":"my.arithmetic.api.ArithmeticToolGroup.asyncAdd","description":"asynchronously computes the sum of the two double precision input arguments a and b","inputSchema":{"type":"object","properties":{"x":{"type":"number","format":"double","description":"x is the first argument"},"y":{"type":"number","format":"double","description":"y is the second argument"}},"required":["x","y"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"my.arithmetic.api.ArithmeticToolGroup.asyncMultiply","description":"asynchronously computes the product of the two given double precision arguments named a and b","inputSchema":{"type":"object","properties":{"x":{"type":"number","format":"double","description":"x is the first argument"},"y":{"type":"number","format":"double","description":"y is the second argument"}},"required":["x","y"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":tr
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - select returned count=1
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\a.socket]
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\a.socket] msg=
+[pool-4-thread-1] DEBUG io.modelcontextprotocol.spec.McpSchema - Received JSON message: {"jsonrpc":"2.0","id":"28bf018d-1","result":{"tools":[{"name":"my.arithmetic.api.ArithmeticToolGroup.asyncAdd","description":"asynchronously computes the sum of the two double precision input arguments a and b","inputSchema":{"type":"object","properties":{"x":{"type":"number","format":"double","description":"x is the first argument"},"y":{"type":"number","format":"double","description":"y is the second argument"}},"required":["x","y"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"my.arithmetic.api.ArithmeticToolGroup.asyncMultiply","description":"asynchronously computes the product of the two given double precision arguments named a and b","inputSchema":{"type":"object","properties":{"x":{"type":"number","format":"double","description":"x is the first argument"},"y":{"type":"number","format":"double","description":"y is the second argument"}},"required":["x","y"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}}]}}
+[pool-4-thread-1] DEBUG io.modelcontextprotocol.spec.McpClientSession - Received Response: JSONRPCResponse[jsonrpc=2.0, id=28bf018d-1, result={tools=[{name=my.arithmetic.api.ArithmeticToolGroup.asyncAdd, description=asynchronously computes the sum of the two double precision input arguments a and b, inputSchema={type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y]}, annotations={title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true}}, {name=my.arithmetic.api.ArithmeticToolGroup.asyncMultiply, description=asynchronously computes the product of the two given double precision arguments named a and b, inputSchema={type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y]}, annotations={title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true}}]}, error=null]
+[pool-8-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing msg={"jsonrpc":"2.0","method":"initialize","id":"2b502ad0-0","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"Java SDK MCP Client","version":"1.0.0"}}}
+
+[pool-8-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - doWrite message={"jsonrpc":"2.0","method":"initialize","id":"2b502ad0-0","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"Java SDK MCP Client","version":"1.0.0"}}}
+
+[pool-8-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing done msg={"jsonrpc":"2.0","method":"initialize","id":"2b502ad0-0","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"Java SDK MCP Client","version":"1.0.0"}}}
+
+[pool-4-thread-1] DEBUG io.modelcontextprotocol.client.McpAsyncClient - Tools changed: [Tool[name=my.arithmetic.api.ArithmeticToolGroup.asyncAdd, title=null, description=asynchronously computes the sum of the two double precision input arguments a and b, inputSchema=JsonSchema[type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y], additionalProperties=null, defs=null, definitions=null], outputSchema=null, annotations=ToolAnnotations[title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true, returnDirect=null], meta=null], Tool[name=my.arithmetic.api.ArithmeticToolGroup.asyncMultiply, title=null, description=asynchronously computes the product of the two given double precision arguments named a and b, inputSchema=JsonSchema[type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y], additionalProperties=null, defs=null, definitions=null], outputSchema=null, annotations=ToolAnnotations[title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true, returnDirect=null], meta=null]]
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - select returned count=1
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\a.socket]
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read partial={"jsonrpc":"2.0","id":"28bf018d-2","result":{"tools":[{"name":"my.arithmetic.api.ArithmeticToolGroup.asyncAdd","description":"asynchronously computes the sum of the two double precision input arguments a and b","inputSchema":{"type":"object","properties":{"x":{"type":"number","format":"double","description":"x is the first argument"},"y":{"type":"number","format":"double","description":"y is the second argument"}},"required":["x","y"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"my.arithmetic.api.ArithmeticToolGroup.asyncMultiply","description":"asynchronously computes the product of the two given double precision arguments named a and b","inputSchema":{"type":"object","properties":{"x":{"type":"number","format":"double","description":"x is the first argument"},"y":{"type":"number","format":"double","description":"y is the second argument"}},"required":["x","y"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":tr
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - select returned count=1
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\a.socket]
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\a.socket] msg=
+[pool-4-thread-1] DEBUG io.modelcontextprotocol.spec.McpSchema - Received JSON message: {"jsonrpc":"2.0","id":"28bf018d-2","result":{"tools":[{"name":"my.arithmetic.api.ArithmeticToolGroup.asyncAdd","description":"asynchronously computes the sum of the two double precision input arguments a and b","inputSchema":{"type":"object","properties":{"x":{"type":"number","format":"double","description":"x is the first argument"},"y":{"type":"number","format":"double","description":"y is the second argument"}},"required":["x","y"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"my.arithmetic.api.ArithmeticToolGroup.asyncMultiply","description":"asynchronously computes the product of the two given double precision arguments named a and b","inputSchema":{"type":"object","properties":{"x":{"type":"number","format":"double","description":"x is the first argument"},"y":{"type":"number","format":"double","description":"y is the second argument"}},"required":["x","y"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}}]}}
+[pool-4-thread-1] DEBUG io.modelcontextprotocol.spec.McpClientSession - Received Response: JSONRPCResponse[jsonrpc=2.0, id=28bf018d-2, result={tools=[{name=my.arithmetic.api.ArithmeticToolGroup.asyncAdd, description=asynchronously computes the sum of the two double precision input arguments a and b, inputSchema={type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y]}, annotations={title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true}}, {name=my.arithmetic.api.ArithmeticToolGroup.asyncMultiply, description=asynchronously computes the product of the two given double precision arguments named a and b, inputSchema={type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y]}, annotations={title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true}}]}, error=null]
+[pool-4-thread-1] DEBUG io.modelcontextprotocol.client.McpAsyncClient - Tools changed: [Tool[name=my.arithmetic.api.ArithmeticToolGroup.asyncAdd, title=null, description=asynchronously computes the sum of the two double precision input arguments a and b, inputSchema=JsonSchema[type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y], additionalProperties=null, defs=null, definitions=null], outputSchema=null, annotations=ToolAnnotations[title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true, returnDirect=null], meta=null], Tool[name=my.arithmetic.api.ArithmeticToolGroup.asyncMultiply, title=null, description=asynchronously computes the product of the two given double precision arguments named a and b, inputSchema=JsonSchema[type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y], additionalProperties=null, defs=null, definitions=null], outputSchema=null, annotations=ToolAnnotations[title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true, returnDirect=null], meta=null]]
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.spec.McpClientSession - Received notification: JSONRPCNotification[jsonrpc=2.0, method=notifications/tools/list_changed, params=null]
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.client.LifecycleInitializer - Joining previous initialization
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.spec.McpSchema - Received JSON message: {"jsonrpc":"2.0","method":"notifications/tools/list_changed"}
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.spec.McpClientSession - Received notification: JSONRPCNotification[jsonrpc=2.0, method=notifications/tools/list_changed, params=null]
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.client.LifecycleInitializer - Joining previous initialization
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.spec.McpSchema - Received JSON message: {"jsonrpc":"2.0","method":"notifications/tools/list_changed"}
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.spec.McpClientSession - Received notification: JSONRPCNotification[jsonrpc=2.0, method=notifications/tools/list_changed, params=null]
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.client.LifecycleInitializer - Joining previous initialization
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - select returned count=1
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\s.socket]
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\s.socket] msg=
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.spec.McpSchema - Received JSON message: {"jsonrpc":"2.0","id":"2b502ad0-0","result":{"protocolVersion":"2024-11-05","capabilities":{"logging":{},"tools":{"listChanged":true}},"serverInfo":{"name":"my.arithmetic.mcpserver.SyncMcpToolGroupServerComponent","version":"1.0.0"}}}
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.spec.McpClientSession - Received Response: JSONRPCResponse[jsonrpc=2.0, id=2b502ad0-0, result={protocolVersion=2024-11-05, capabilities={logging={}, tools={listChanged=true}}, serverInfo={name=my.arithmetic.mcpserver.SyncMcpToolGroupServerComponent, version=1.0.0}}, error=null]
+[pool-9-thread-1] INFO io.modelcontextprotocol.client.LifecycleInitializer - Server response with Protocol: 2024-11-05, Capabilities: ServerCapabilities[completions=null, experimental=null, logging=LoggingCapabilities[], prompts=null, resources=null, tools=ToolCapabilities[listChanged=true]], Info: Implementation[name=my.arithmetic.mcpserver.SyncMcpToolGroupServerComponent, title=null, version=1.0.0] and Instructions null
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.spec.McpClientSession - Sending message for method tools/list
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.spec.McpClientSession - Sending message for method tools/list
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.spec.McpClientSession - Sending message for method tools/list
+[FelixStartLevel] DEBUG my.arithmetic.mcpclient.McpSyncClientComponent - uds sync client initialized
+[pool-8-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing msg={"jsonrpc":"2.0","method":"notifications/initialized"}
+
+[pool-8-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - doWrite message={"jsonrpc":"2.0","method":"notifications/initialized"}
+
+[pool-8-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing done msg={"jsonrpc":"2.0","method":"notifications/initialized"}
+
+[FelixStartLevel] DEBUG io.modelcontextprotocol.client.LifecycleInitializer - Joining previous initialization
+[pool-8-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing msg={"jsonrpc":"2.0","method":"tools/list","id":"2b502ad0-1","params":{}}
+
+[pool-8-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - doWrite message={"jsonrpc":"2.0","method":"tools/list","id":"2b502ad0-1","params":{}}
+
+[pool-8-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing done msg={"jsonrpc":"2.0","method":"tools/list","id":"2b502ad0-1","params":{}}
+
+[FelixStartLevel] DEBUG io.modelcontextprotocol.spec.McpClientSession - Sending message for method tools/list
+[pool-8-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing msg={"jsonrpc":"2.0","method":"tools/list","id":"2b502ad0-2","params":{}}
+
+[pool-8-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - doWrite message={"jsonrpc":"2.0","method":"tools/list","id":"2b502ad0-2","params":{}}
+
+[pool-8-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing done msg={"jsonrpc":"2.0","method":"tools/list","id":"2b502ad0-2","params":{}}
+
+[pool-8-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing msg={"jsonrpc":"2.0","method":"tools/list","id":"2b502ad0-3","params":{}}
+
+[pool-8-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - doWrite message={"jsonrpc":"2.0","method":"tools/list","id":"2b502ad0-3","params":{}}
+
+[pool-8-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing done msg={"jsonrpc":"2.0","method":"tools/list","id":"2b502ad0-3","params":{}}
+
+[pool-8-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing msg={"jsonrpc":"2.0","method":"tools/list","id":"2b502ad0-4","params":{}}
+
+[pool-8-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - doWrite message={"jsonrpc":"2.0","method":"tools/list","id":"2b502ad0-4","params":{}}
+
+[pool-8-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing done msg={"jsonrpc":"2.0","method":"tools/list","id":"2b502ad0-4","params":{}}
+
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - select returned count=1
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\a.socket]
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\a.socket] msg=
+[pool-4-thread-1] DEBUG io.modelcontextprotocol.spec.McpSchema - Received JSON message: {"jsonrpc":"2.0","id":"28bf018d-3","result":{"content":[{"type":"text","text":"51.42"}],"isError":false}}
+[pool-4-thread-1] DEBUG io.modelcontextprotocol.spec.McpClientSession - Received Response: JSONRPCResponse[jsonrpc=2.0, id=28bf018d-3, result={content=[{type=text, text=51.42}], isError=false}, error=null]
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - select returned count=1
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\s.socket]
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read partial={"jsonrpc":"2.0","id":"2b502ad0-1","result":{"tools":[{"name":"my.arithmetic.api.ArithmeticToolGroup.add","description":"computes the sum of the two double precision input arguments a and b","inputSchema":{"type":"object","properties":{"x":{"type":"number","format":"double","description":"x is the first argument"},"y":{"type":"number","format":"double","description":"y is the second argument"}},"required":["x","y"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"my.arithmetic.api.ArithmeticToolGroup.multiply","description":"return the product of the two given double precision arguments named a and b","inputSchema":{"type":"object","properties":{"x":{"type":"number","format":"double","description":"x is the first argument"},"y":{"type":"number","format":"double","description":"y is the second argument"}},"required":["x","y"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - select returned count=1
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\s.socket]
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\s.socket] msg=
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.spec.McpSchema - Received JSON message: {"jsonrpc":"2.0","id":"2b502ad0-1","result":{"tools":[{"name":"my.arithmetic.api.ArithmeticToolGroup.add","description":"computes the sum of the two double precision input arguments a and b","inputSchema":{"type":"object","properties":{"x":{"type":"number","format":"double","description":"x is the first argument"},"y":{"type":"number","format":"double","description":"y is the second argument"}},"required":["x","y"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"my.arithmetic.api.ArithmeticToolGroup.multiply","description":"return the product of the two given double precision arguments named a and b","inputSchema":{"type":"object","properties":{"x":{"type":"number","format":"double","description":"x is the first argument"},"y":{"type":"number","format":"double","description":"y is the second argument"}},"required":["x","y"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"my.arithmetic.api.ArithmeticToolGroup.get-image-and-message-tool","description":"Tool returning CallToolResult with an image and message","inputSchema":{"type":"object","properties":{"message":{"type":"string","description":"Message to associate with image"}},"required":["message"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}}]}}
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.spec.McpClientSession - Received Response: JSONRPCResponse[jsonrpc=2.0, id=2b502ad0-1, result={tools=[{name=my.arithmetic.api.ArithmeticToolGroup.add, description=computes the sum of the two double precision input arguments a and b, inputSchema={type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y]}, annotations={title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true}}, {name=my.arithmetic.api.ArithmeticToolGroup.multiply, description=return the product of the two given double precision arguments named a and b, inputSchema={type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y]}, annotations={title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true}}, {name=my.arithmetic.api.ArithmeticToolGroup.get-image-and-message-tool, description=Tool returning CallToolResult with an image and message, inputSchema={type=object, properties={message={type=string, description=Message to associate with image}}, required=[message]}, annotations={title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true}}]}, error=null]
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.client.McpAsyncClient - Tools changed: [Tool[name=my.arithmetic.api.ArithmeticToolGroup.add, title=null, description=computes the sum of the two double precision input arguments a and b, inputSchema=JsonSchema[type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y], additionalProperties=null, defs=null, definitions=null], outputSchema=null, annotations=ToolAnnotations[title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true, returnDirect=null], meta=null], Tool[name=my.arithmetic.api.ArithmeticToolGroup.multiply, title=null, description=return the product of the two given double precision arguments named a and b, inputSchema=JsonSchema[type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y], additionalProperties=null, defs=null, definitions=null], outputSchema=null, annotations=ToolAnnotations[title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true, returnDirect=null], meta=null], Tool[name=my.arithmetic.api.ArithmeticToolGroup.get-image-and-message-tool, title=null, description=Tool returning CallToolResult with an image and message, inputSchema=JsonSchema[type=object, properties={message={type=string, description=Message to associate with image}}, required=[message], additionalProperties=null, defs=null, definitions=null], outputSchema=null, annotations=ToolAnnotations[title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true, returnDirect=null], meta=null]]
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - select returned count=1
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\s.socket]
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read partial={"jsonrpc":"2.0","id":"2b502ad0-2","result":{"tools":[{"name":"my.arithmetic.api.ArithmeticToolGroup.add","description":"computes the sum of the two double precision input arguments a and b","inputSchema":{"type":"object","properties":{"x":{"type":"number","format":"double","description":"x is the first argument"},"y":{"type":"number","format":"double","description":"y is the second argument"}},"required":["x","y"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"my.arithmetic.api.ArithmeticToolGroup.multiply","description":"return the product of the two given double precision arguments named a and b","inputSchema":{"type":"object","properties":{"x":{"type":"number","format":"double","description":"x is the first argument"},"y":{"type":"number","format":"double","description":"y is the second argument"}},"required":["x","y"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - select returned count=1
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\s.socket]
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read partial=true}},{"name":"my.arithmetic.api.ArithmeticToolGroup.get-image-and-message-tool","description":"Tool returning CallToolResult with an image and message","inputSchema":{"type":"object","properties":{"message":{"type":"string","description":"Message to associate with image"}},"required":["message"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}}]}}
+{"jsonrpc":"2.0","id":"2b502ad0-3","result":{"tools":[{"name":"my.arithmetic.api.ArithmeticToolGroup.add","description":"computes the sum of the two double precision input arguments a and b","inputSchema":{"type":"object","properties":{"x":{"type":"number","format":"double","description":"x is the first argument"},"y":{"type":"number","format":"double","description":"y is the second argument"}},"required":["x","y"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"my.arithmetic.api.ArithmeticToolGroup.multiply","description
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - select returned count=1
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\s.socket]
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read partial=":"return the product of the two given double precision arguments named a and b","inputSchema":{"type":"object","properties":{"x":{"type":"number","format":"double","description":"x is the first argument"},"y":{"type":"number","format":"double","description":"y is the second argument"}},"required":["x","y"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"my.arithmetic.api.ArithmeticToolGroup.get-image-and-message-tool","description":"Tool returning CallToolResult with an image and message","inputSchema":{"type":"object","properties":{"message":{"type":"string","description":"Message to associate with image"}},"required":["message"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}}]}}
+{"jsonrpc":"2.0","id":"2b502ad0-4","result":{"tools":[{"name":"my.arithmetic.api.ArithmeticToolGroup.add","description":"computes the sum of the two double precision input arguments a an
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - select returned count=1
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\s.socket]
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read partial=d b","inputSchema":{"type":"object","properties":{"x":{"type":"number","format":"double","description":"x is the first argument"},"y":{"type":"number","format":"double","description":"y is the second argument"}},"required":["x","y"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"my.arithmetic.api.ArithmeticToolGroup.multiply","description":"return the product of the two given double precision arguments named a and b","inputSchema":{"type":"object","properties":{"x":{"type":"number","format":"double","description":"x is the first argument"},"y":{"type":"number","format":"double","description":"y is the second argument"}},"required":["x","y"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"my.arithmetic.api.ArithmeticToolGroup.get-image-and-message-tool","description":"Tool returning CallToolResult with an image and message","inputSchema":{"type":"object","
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - select returned count=1
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\s.socket]
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\s.socket] msg=
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.spec.McpSchema - Received JSON message: {"jsonrpc":"2.0","id":"2b502ad0-2","result":{"tools":[{"name":"my.arithmetic.api.ArithmeticToolGroup.add","description":"computes the sum of the two double precision input arguments a and b","inputSchema":{"type":"object","properties":{"x":{"type":"number","format":"double","description":"x is the first argument"},"y":{"type":"number","format":"double","description":"y is the second argument"}},"required":["x","y"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"my.arithmetic.api.ArithmeticToolGroup.multiply","description":"return the product of the two given double precision arguments named a and b","inputSchema":{"type":"object","properties":{"x":{"type":"number","format":"double","description":"x is the first argument"},"y":{"type":"number","format":"double","description":"y is the second argument"}},"required":["x","y"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"my.arithmetic.api.ArithmeticToolGroup.get-image-and-message-tool","description":"Tool returning CallToolResult with an image and message","inputSchema":{"type":"object","properties":{"message":{"type":"string","description":"Message to associate with image"}},"required":["message"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}}]}}
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.spec.McpClientSession - Received Response: JSONRPCResponse[jsonrpc=2.0, id=2b502ad0-2, result={tools=[{name=my.arithmetic.api.ArithmeticToolGroup.add, description=computes the sum of the two double precision input arguments a and b, inputSchema={type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y]}, annotations={title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true}}, {name=my.arithmetic.api.ArithmeticToolGroup.multiply, description=return the product of the two given double precision arguments named a and b, inputSchema={type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y]}, annotations={title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true}}, {name=my.arithmetic.api.ArithmeticToolGroup.get-image-and-message-tool, description=Tool returning CallToolResult with an image and message, inputSchema={type=object, properties={message={type=string, description=Message to associate with image}}, required=[message]}, annotations={title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true}}]}, error=null]
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.client.McpAsyncClient - Tools changed: [Tool[name=my.arithmetic.api.ArithmeticToolGroup.add, title=null, description=computes the sum of the two double precision input arguments a and b, inputSchema=JsonSchema[type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y], additionalProperties=null, defs=null, definitions=null], outputSchema=null, annotations=ToolAnnotations[title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true, returnDirect=null], meta=null], Tool[name=my.arithmetic.api.ArithmeticToolGroup.multiply, title=null, description=return the product of the two given double precision arguments named a and b, inputSchema=JsonSchema[type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y], additionalProperties=null, defs=null, definitions=null], outputSchema=null, annotations=ToolAnnotations[title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true, returnDirect=null], meta=null], Tool[name=my.arithmetic.api.ArithmeticToolGroup.get-image-and-message-tool, title=null, description=Tool returning CallToolResult with an image and message, inputSchema=JsonSchema[type=object, properties={message={type=string, description=Message to associate with image}}, required=[message], additionalProperties=null, defs=null, definitions=null], outputSchema=null, annotations=ToolAnnotations[title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true, returnDirect=null], meta=null]]
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.spec.McpSchema - Received JSON message: {"jsonrpc":"2.0","id":"2b502ad0-3","result":{"tools":[{"name":"my.arithmetic.api.ArithmeticToolGroup.add","description":"computes the sum of the two double precision input arguments a and b","inputSchema":{"type":"object","properties":{"x":{"type":"number","format":"double","description":"x is the first argument"},"y":{"type":"number","format":"double","description":"y is the second argument"}},"required":["x","y"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"my.arithmetic.api.ArithmeticToolGroup.multiply","description":"return the product of the two given double precision arguments named a and b","inputSchema":{"type":"object","properties":{"x":{"type":"number","format":"double","description":"x is the first argument"},"y":{"type":"number","format":"double","description":"y is the second argument"}},"required":["x","y"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"my.arithmetic.api.ArithmeticToolGroup.get-image-and-message-tool","description":"Tool returning CallToolResult with an image and message","inputSchema":{"type":"object","properties":{"message":{"type":"string","description":"Message to associate with image"}},"required":["message"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}}]}}
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.spec.McpClientSession - Received Response: JSONRPCResponse[jsonrpc=2.0, id=2b502ad0-3, result={tools=[{name=my.arithmetic.api.ArithmeticToolGroup.add, description=computes the sum of the two double precision input arguments a and b, inputSchema={type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y]}, annotations={title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true}}, {name=my.arithmetic.api.ArithmeticToolGroup.multiply, description=return the product of the two given double precision arguments named a and b, inputSchema={type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y]}, annotations={title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true}}, {name=my.arithmetic.api.ArithmeticToolGroup.get-image-and-message-tool, description=Tool returning CallToolResult with an image and message, inputSchema={type=object, properties={message={type=string, description=Message to associate with image}}, required=[message]}, annotations={title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true}}]}, error=null]
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.client.McpAsyncClient - Tools changed: [Tool[name=my.arithmetic.api.ArithmeticToolGroup.add, title=null, description=computes the sum of the two double precision input arguments a and b, inputSchema=JsonSchema[type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y], additionalProperties=null, defs=null, definitions=null], outputSchema=null, annotations=ToolAnnotations[title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true, returnDirect=null], meta=null], Tool[name=my.arithmetic.api.ArithmeticToolGroup.multiply, title=null, description=return the product of the two given double precision arguments named a and b, inputSchema=JsonSchema[type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y], additionalProperties=null, defs=null, definitions=null], outputSchema=null, annotations=ToolAnnotations[title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true, returnDirect=null], meta=null], Tool[name=my.arithmetic.api.ArithmeticToolGroup.get-image-and-message-tool, title=null, description=Tool returning CallToolResult with an image and message, inputSchema=JsonSchema[type=object, properties={message={type=string, description=Message to associate with image}}, required=[message], additionalProperties=null, defs=null, definitions=null], outputSchema=null, annotations=ToolAnnotations[title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true, returnDirect=null], meta=null]]
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.spec.McpSchema - Received JSON message: {"jsonrpc":"2.0","id":"2b502ad0-4","result":{"tools":[{"name":"my.arithmetic.api.ArithmeticToolGroup.add","description":"computes the sum of the two double precision input arguments a and b","inputSchema":{"type":"object","properties":{"x":{"type":"number","format":"double","description":"x is the first argument"},"y":{"type":"number","format":"double","description":"y is the second argument"}},"required":["x","y"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"my.arithmetic.api.ArithmeticToolGroup.multiply","description":"return the product of the two given double precision arguments named a and b","inputSchema":{"type":"object","properties":{"x":{"type":"number","format":"double","description":"x is the first argument"},"y":{"type":"number","format":"double","description":"y is the second argument"}},"required":["x","y"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"my.arithmetic.api.ArithmeticToolGroup.get-image-and-message-tool","description":"Tool returning CallToolResult with an image and message","inputSchema":{"type":"object","properties":{"message":{"type":"string","description":"Message to associate with image"}},"required":["message"]},"annotations":{"title":"","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}}]}}
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.spec.McpClientSession - Received Response: JSONRPCResponse[jsonrpc=2.0, id=2b502ad0-4, result={tools=[{name=my.arithmetic.api.ArithmeticToolGroup.add, description=computes the sum of the two double precision input arguments a and b, inputSchema={type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y]}, annotations={title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true}}, {name=my.arithmetic.api.ArithmeticToolGroup.multiply, description=return the product of the two given double precision arguments named a and b, inputSchema={type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y]}, annotations={title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true}}, {name=my.arithmetic.api.ArithmeticToolGroup.get-image-and-message-tool, description=Tool returning CallToolResult with an image and message, inputSchema={type=object, properties={message={type=string, description=Message to associate with image}}, required=[message]}, annotations={title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true}}]}, error=null]
+[FelixStartLevel] DEBUG my.arithmetic.mcpclient.McpSyncClientComponent - uds sync client seeing tool=Tool[name=my.arithmetic.api.ArithmeticToolGroup.add, title=null, description=computes the sum of the two double precision input arguments a and b, inputSchema=JsonSchema[type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y], additionalProperties=null, defs=null, definitions=null], outputSchema=null, annotations=ToolAnnotations[title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true, returnDirect=null], meta=null]
+[FelixStartLevel] DEBUG my.arithmetic.mcpclient.McpSyncClientComponent - uds sync client seeing tool=Tool[name=my.arithmetic.api.ArithmeticToolGroup.multiply, title=null, description=return the product of the two given double precision arguments named a and b, inputSchema=JsonSchema[type=object, properties={x={type=number, format=double, description=x is the first argument}, y={type=number, format=double, description=y is the second argument}}, required=[x, y], additionalProperties=null, defs=null, definitions=null], outputSchema=null, annotations=ToolAnnotations[title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true, returnDirect=null], meta=null]
+[FelixStartLevel] DEBUG my.arithmetic.mcpclient.McpSyncClientComponent - uds sync client seeing tool=Tool[name=my.arithmetic.api.ArithmeticToolGroup.get-image-and-message-tool, title=null, description=Tool returning CallToolResult with an image and message, inputSchema=JsonSchema[type=object, properties={message={type=string, description=Message to associate with image}}, required=[message], additionalProperties=null, defs=null, definitions=null], outputSchema=null, annotations=ToolAnnotations[title=, readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true, returnDirect=null], meta=null]
+[FelixStartLevel] DEBUG io.modelcontextprotocol.client.LifecycleInitializer - Joining previous initialization
+[FelixStartLevel] DEBUG io.modelcontextprotocol.spec.McpClientSession - Sending message for method tools/call
+[pool-8-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing msg={"jsonrpc":"2.0","method":"tools/call","id":"2b502ad0-5","params":{"name":"my.arithmetic.api.ArithmeticToolGroup.add","arguments":{"y":"6.32","x":"5.1"}}}
+
+[pool-8-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - doWrite message={"jsonrpc":"2.0","method":"tools/call","id":"2b502ad0-5","params":{"name":"my.arithmetic.api.ArithmeticToolGroup.add","arguments":{"y":"6.32","x":"5.1"}}}
+
+[pool-8-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing done msg={"jsonrpc":"2.0","method":"tools/call","id":"2b502ad0-5","params":{"name":"my.arithmetic.api.ArithmeticToolGroup.add","arguments":{"y":"6.32","x":"5.1"}}}
+
+[pool-4-thread-1] DEBUG my.arithmetic.mcpclient.McpAsyncClientComponent - asyncAdd(25.1,26.32) result=51.42
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - select returned count=1
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\a.socket]
+[pool-4-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\a.socket] msg=
+[pool-4-thread-1] DEBUG io.modelcontextprotocol.spec.McpSchema - Received JSON message: {"jsonrpc":"2.0","id":"28bf018d-4","result":{"content":[{"type":"text","text":"47169.54060000001"}],"isError":false}}
+[pool-4-thread-1] DEBUG io.modelcontextprotocol.spec.McpClientSession - Received Response: JSONRPCResponse[jsonrpc=2.0, id=28bf018d-4, result={content=[{type=text, text=47169.54060000001}], isError=false}, error=null]
+[pool-4-thread-1] DEBUG my.arithmetic.mcpclient.McpAsyncClientComponent - asyncMultiply(210.71,223.86) result=47169.54060000001
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - select returned count=1
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\s.socket]
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\s.socket] msg=
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.spec.McpSchema - Received JSON message: {"jsonrpc":"2.0","id":"2b502ad0-5","result":{"content":[{"type":"text","text":"11.42"}],"isError":false}}
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.spec.McpClientSession - Received Response: JSONRPCResponse[jsonrpc=2.0, id=2b502ad0-5, result={content=[{type=text, text=11.42}], isError=false}, error=null]
+[FelixStartLevel] DEBUG my.arithmetic.mcpclient.McpSyncClientComponent - add(5.1,6.32) result=11.42
+[FelixStartLevel] DEBUG io.modelcontextprotocol.client.LifecycleInitializer - Joining previous initialization
+[FelixStartLevel] DEBUG io.modelcontextprotocol.spec.McpClientSession - Sending message for method tools/call
+[pool-8-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing msg={"jsonrpc":"2.0","method":"tools/call","id":"2b502ad0-6","params":{"name":"my.arithmetic.api.ArithmeticToolGroup.multiply","arguments":{"y":"23.86","x":"10.71"}}}
+
+[pool-8-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - doWrite message={"jsonrpc":"2.0","method":"tools/call","id":"2b502ad0-6","params":{"name":"my.arithmetic.api.ArithmeticToolGroup.multiply","arguments":{"y":"23.86","x":"10.71"}}}
+
+[pool-8-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - writing done msg={"jsonrpc":"2.0","method":"tools/call","id":"2b502ad0-6","params":{"name":"my.arithmetic.api.ArithmeticToolGroup.multiply","arguments":{"y":"23.86","x":"10.71"}}}
+
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - select returned count=1
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\s.socket]
+[pool-9-thread-1] DEBUG org.eclipse.ecf.ai.mcp.transports.AbstractStringChannel - read client=java.nio.channels.SocketChannel[connected local= remote=C:\Users\slewi\eclipse-workspace.bndtools.workspace.test.1\my.arithmetic.mcpserver\s.socket] msg=
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.spec.McpSchema - Received JSON message: {"jsonrpc":"2.0","id":"2b502ad0-6","result":{"content":[{"type":"text","text":"255.5406"}],"isError":false}}
+[pool-9-thread-1] DEBUG io.modelcontextprotocol.spec.McpClientSession - Received Response: JSONRPCResponse[jsonrpc=2.0, id=2b502ad0-6, result={content=[{type=text, text=255.5406}], isError=false}, error=null]
+[FelixStartLevel] DEBUG my.arithmetic.mcpclient.McpSyncClientComponent - multiply(10.71,23.86) result=255.5406
+____________________________
+Welcome to Apache Felix Gogo
+
+g!
+```
+