AxonFlow Java SDK v9.0.0
Installation
Maven:
<dependency>
<groupId>com.getaxonflow</groupId>
<artifactId>axonflow-sdk</artifactId>
<version>9.0.0</version>
</dependency>Gradle:
implementation 'com.getaxonflow:axonflow-sdk:9.0.0'Changed (BREAKING)
-
The LangGraph adapter now reports the (server, tool) identity as two
separate wire fields instead of concatenating them intoconnectorType.
MCPToolRequest#getServerName()andMCPToolRequest#getName()are threaded
through asconnector_typeand the newtoolfield on
mcpCheckInput/mcpCheckOutput, matching the platform's two-field
(server, tool) MCP identity contract.mcpToolInterceptor()sends
connectorType = serverNameandtool = getName(); the default
connectorTypeFnreturns the bareserverName.MCPInterceptorOptions
has notoolFn: the tool identity is alwaysMCPToolRequest#getName(), so
a caller cannot write an arbitrary tool identity into the audit trail.
connectorTypeFnremains the escape hatch for the server/connector
dimension only.Migration. Policies or per-connector settings matching the old
concatenated value — e.g.connector_type == "filesystem.read_file"— stop
matching after upgrade. Re-scope them to matchconnector_type == "filesystem"together with thetoolfield (e.g.tool == "read_file").
TheconnectorTypeFnoption is the compatibility lever: a caller can restore
any priorconnector_typevalue (including the old concatenated form,
req -> req.getServerName() + "." + req.getName()) without losing the
separatetoolfield.Missing-server edge. With the default resolver, a tool whose
getServerName()is empty now sendsconnector_type="", which the platform
rejects with HTTP 400 → the call throws and the tool is blocked (fail-closed),
never run ungoverned. Previously the concatenated value was".tool"(a
non-empty string the platform accepted). Supply aconnectorTypeFnfor
server-less MCP tools.Minimum platform. The
toolfield is consumed onPOST /api/v1/mcp/check-inputby AxonFlow platform v9.10.0+. On platforms
below v9.10.0 thetoolfield is silently dropped and identity degrades to
the bare server name — coarser than the old concatenated value — so
upgrade the platform to v9.10.0+ before adopting this SDK major.
Response-plane (check-output)toolscoping requires AxonFlow platform
v9.11.0+; until then the SDK sends it forward-compatibly and older
platforms ignore it.
Fixed
examples/basicpasses on enterprise (JWT-validating) stacks. It
omitted the user token entirely (SDK falls back toanonymous), which
DEPLOYMENT_MODE=enterpriserejects — and the rejection was swallowed by
the genericAxonFlowExceptioncatch with exit 0. The example now reads
AXONFLOW_USER_TOKENand exits non-zero on invalid-user-token rejections.
Added
-
runtime-e2e/async_verdict_parity/— live-agent assertion that
decideAsync/mcpCheckInputAsync(joined) deliver the same enforcement
verdict as their sync counterparts (async-adapter-bypass class): stacked
SQLi →denyon/api/v1/decide,allowed=falseon check-input, sync ==
async on both planes. -
runtime-e2e/mcp_server_tool_split/— live-agent assertion for the
connector_type/toolsplit:LangGraphAdapter.mcpToolInterceptor()
round-trips a clean tool call through check-input/check-output with the
server and tool names as two distinct wire fields, a direct
mcpCheckInput(..., options)call with an explicittooloption is
accepted, and the two-argumentmcpCheckInput(connectorType, statement)
overload (notoolfield) still works unchanged. -
AuditToolCallRequest.callerName(wire:caller_name) — identifies
WHICH CLIENT made a tool call (e.g.claude_code,codex,cursor,
openclaw), replacing the misleadingly-namedtoolTypefield for that
purpose.toolTypeis kept as a deprecated input fallback — not
removed, not renamed; the server resolvescaller_nameif supplied, else
the legacytool_type, else a default.