Skip to content

Commit 43604f4

Browse files
fix(mcp): use /api/request endpoint for MCP connector queries (#14)
* fix(mcp): use /api/request endpoint for MCP connector queries - Changed queryConnector() to use /api/request with request_type: "mcp-query" - This matches the Go and TypeScript SDK implementations - Previously used non-existent /api/v1/connectors/query endpoint causing 404 errors - Updated tests to match new endpoint Fixes MCP connector examples failing with 404 errors. * fix: use constructor instead of builder for ConnectorResponse - Fix compilation error: ConnectorResponse doesn't have builder() - Fix clientId fallback: use config.getClientId() with fallback to license key
1 parent 1810642 commit 43604f4

5 files changed

Lines changed: 60 additions & 10 deletions

File tree

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,17 @@ All notable changes to the AxonFlow Java SDK will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [1.3.1] - 2025-12-29
9+
10+
### Fixed
11+
12+
- **MCP Connector Queries**: Fixed endpoint mismatch causing 404 errors
13+
- Changed `queryConnector()` to use `/api/request` with `request_type: "mcp-query"` (matches Go and TypeScript SDKs)
14+
- Previously used non-existent `/api/v1/connectors/query` endpoint
15+
- MCP connector examples now work correctly with configured connectors
16+
17+
---
18+
819
## [1.3.0] - 2025-12-28
920

1021
### Added

pom.xml

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

77
<groupId>com.getaxonflow</groupId>
88
<artifactId>axonflow-sdk</artifactId>
9-
<version>1.3.0</version>
9+
<version>1.3.1</version>
1010
<packaging>jar</packaging>
1111

1212
<name>AxonFlow Java SDK</name>

src/main/java/com/getaxonflow/sdk/AxonFlow.java

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import java.io.Closeable;
3333
import java.io.IOException;
3434
import java.util.Collections;
35+
import java.util.HashMap;
3536
import java.util.List;
3637
import java.util.Map;
3738
import java.util.Objects;
@@ -550,6 +551,10 @@ public ConnectorInfo installConnector(String connectorId, Map<String, Object> co
550551
/**
551552
* Queries an MCP connector.
552553
*
554+
* <p>This method sends the query to the AxonFlow Agent using the standard
555+
* request format with request_type: "mcp-query", which is routed to the
556+
* configured MCP connector.
557+
*
553558
* @param query the connector query
554559
* @return the query response
555560
* @throws ConnectorException if the query fails
@@ -558,9 +563,41 @@ public ConnectorResponse queryConnector(ConnectorQuery query) {
558563
Objects.requireNonNull(query, "query cannot be null");
559564

560565
return retryExecutor.execute(() -> {
561-
Request httpRequest = buildRequest("POST", "/api/v1/connectors/query", query);
566+
// Build a ClientRequest with MCP_QUERY request type
567+
// This follows the same pattern as Go and TypeScript SDKs
568+
Map<String, Object> context = new HashMap<>();
569+
context.put("connector", query.getConnectorId());
570+
if (query.getParameters() != null && !query.getParameters().isEmpty()) {
571+
context.put("params", query.getParameters());
572+
}
573+
574+
// Determine clientId: prefer config.getClientId(), fallback to license key
575+
String clientId = config.getClientId();
576+
if (clientId == null || clientId.isEmpty()) {
577+
clientId = config.getLicenseKey();
578+
}
579+
580+
ClientRequest clientRequest = ClientRequest.builder()
581+
.query(query.getOperation())
582+
.userToken(query.getUserToken() != null ? query.getUserToken() : clientId)
583+
.clientId(clientId)
584+
.requestType(RequestType.MCP_QUERY)
585+
.context(context)
586+
.build();
587+
588+
Request httpRequest = buildRequest("POST", "/api/request", clientRequest);
562589
try (Response response = httpClient.newCall(httpRequest).execute()) {
563-
ConnectorResponse result = parseResponse(response, ConnectorResponse.class);
590+
ClientResponse clientResponse = parseResponse(response, ClientResponse.class);
591+
592+
// Convert ClientResponse to ConnectorResponse
593+
ConnectorResponse result = new ConnectorResponse(
594+
clientResponse.isSuccess(),
595+
clientResponse.getData(),
596+
clientResponse.getError(),
597+
query.getConnectorId(),
598+
query.getOperation(),
599+
null // processingTime not available from ClientResponse
600+
);
564601

565602
if (!result.isSuccess()) {
566603
throw new ConnectorException(

src/test/java/com/getaxonflow/sdk/AxonFlowTest.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -354,11 +354,12 @@ void queryConnectorShouldRequireQuery() {
354354
@Test
355355
@DisplayName("queryConnector should throw on failure")
356356
void queryConnectorShouldThrowOnFailure() {
357-
stubFor(post(urlEqualTo("/api/v1/connectors/query"))
357+
// MCP connector queries now use /api/request with request_type: "mcp-query"
358+
stubFor(post(urlEqualTo("/api/request"))
358359
.willReturn(aResponse()
359360
.withStatus(200)
360361
.withHeader("Content-Type", "application/json")
361-
.withBody("{\"success\":false,\"error\":\"Connector not found\"}")));
362+
.withBody("{\"success\":false,\"error\":\"Connector not found\",\"blocked\":false}")));
362363

363364
ConnectorQuery query = ConnectorQuery.builder()
364365
.connectorId("unknown")
@@ -373,11 +374,12 @@ void queryConnectorShouldThrowOnFailure() {
373374
@Test
374375
@DisplayName("queryConnectorAsync should return future")
375376
void queryConnectorAsyncShouldReturnFuture() throws Exception {
376-
stubFor(post(urlEqualTo("/api/v1/connectors/query"))
377+
// MCP connector queries now use /api/request with request_type: "mcp-query"
378+
stubFor(post(urlEqualTo("/api/request"))
377379
.willReturn(aResponse()
378380
.withStatus(200)
379381
.withHeader("Content-Type", "application/json")
380-
.withBody("{\"success\":true,\"data\":[]}")));
382+
.withBody("{\"success\":true,\"data\":[],\"blocked\":false}")));
381383

382384
ConnectorQuery query = ConnectorQuery.builder()
383385
.connectorId("salesforce")

src/test/java/com/getaxonflow/sdk/integration/AxonFlowIntegrationTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -304,15 +304,15 @@ void listConnectorsShouldReturnConnectors() {
304304
@Test
305305
@DisplayName("queryConnector should return response")
306306
void queryConnectorShouldReturnResponse() {
307-
stubFor(post(urlEqualTo("/api/v1/connectors/query"))
307+
// MCP connector queries now use /api/request with request_type: "mcp-query"
308+
stubFor(post(urlEqualTo("/api/request"))
308309
.willReturn(aResponse()
309310
.withStatus(200)
310311
.withHeader("Content-Type", "application/json")
311312
.withBody("{"
312313
+ "\"success\": true,"
313314
+ "\"data\": [{\"name\": \"Acme Corp\"}],"
314-
+ "\"connector_id\": \"salesforce\","
315-
+ "\"operation\": \"getAccounts\""
315+
+ "\"blocked\": false"
316316
+ "}")));
317317

318318
ConnectorResponse response = axonflow.queryConnector(ConnectorQuery.builder()

0 commit comments

Comments
 (0)