Repository navigation
Releases: olo-labs/olo-toolgate
Release list
ToolGate manual development e5edc4acd596
Manual development build for commit e5edc4acd596c85dfebd33b436a1c1d16a4fdabf.
No CI verification, tests, scans or smoke tests were run. Maven signing runs in its separate publication job.
Library version: 1.0.0-dev.38776668404.1.ge5edc4acd596. Container digests and checksums are attached.
OLO ToolGate 0.10.0-dev release notes
Contracts version: 1.0.0.
License: Apache-2.0. See LICENSE and bundled third-party notices/SBOMs.
Changelog
All notable project changes should be documented here.
The project follows semantic versioning once stable versioning begins.
0.10.0-dev
-
Java tools ship as one self-contained executable.
toolgatePackageand the Mavenpackage
goal stageartifacts/tool.jar, a deterministic fat jar of the tool jar and its whole runtime
class path withMain-Class: io.ololabs.toolgate.runtime.Main, in place ofapp.jarand
libs.zip; a device needs only a JRE, andjava -jar tool.jarserves the tools over stdio.
Resources go to the first jar that has them,META-INF/servicesfiles are merged, signatures
andmodule-infoare dropped, and two different copies of one class fail the build. The
packager, Control and the Tool Host refuse a Java tool that names anything but one jar, so the
permit's pinned artifact digest now covers everything the tool runs. -
Server tools run on any Tool Host, local or remote, and move by switching the device (M0
part 15). A deployment may name its Tool Hosts (hostIdsonPackageDeploymentRequestand
PackageDeployment; none means every host); Control's placement sends a call only to a host
the deployment names, so deploying the same version to another host moves its tools. An
enrolled Tool Host also fetches its calls from Control (pull mode) over its device
certificate:POST /api/control/v1/tool-hosts/dispatches/next, then.../{id}/admission
and.../{id}/result, so a laptop behind NAT runs tools without an inbound route. When the
Gateway has no route to the placed host it queues the signedDispatchat
POST /api/control/v1/access/dispatchesand readsToolHostDispatchStatusfrom
GET .../access/dispatches/{id}until the result arrives; the permit is still verified and
consumed once, on the host. New contract modelsToolHostDispatchStateand
ToolHostDispatchStatus; Postgres migration V21 and SQLite V14 add the dispatch queue. The
console's deploy form takes the Tool Hosts and the versions table shows where each runs. The
quickstart image runs a second, pull-only Tool Host, andtools/quickstart/check.pycalls the
starter tool on the first host, redeploys it to the second and calls it again there. -
A community guide to building MCP tools with the Tool SDK,
TOOL-SDK-GUIDE.mdat the
repository root. It covers authoring, values, routes, errors, effects, testing, standalone use,
packaging and running under ToolGate. The same file ships in thetoolgate-sdk-apijar as
META-INF/toolgate/TOOL-SDK-GUIDE.mdand prints withtoolgate guide. -
Java server tools run end to end through
/mcp(M0 part 14). Control takes a.tgpkgat
POST /api/control/v1/packages/uploads(Super Admin), applies the packager's archive rules,
CHECKSUMS and descriptor digests, and stores the exact bytes;POST .../packages/deployments
makes a version the one Tool Hosts run, with values for its globals and destination host
settings, writing the service profile, the globals document, a disabled directory entry per
new tool and its resource extractor. The Tool Host enrolls as a device (CSR, administrator
approval, renewal on check-in), registers, fetches its assignments and their content by
digest, and checks in with the tools it can run, so Control's placement sends it calls like
any device. The Gateway gainstoolHosts: a call placed on one gets a permit from Control's
v2 reserve and is dispatched to the host; Control takes the host's v2 consume and result
report. The console gains a Server packages page, the quickstart image runs a Tool Host, and
tools/quickstart/check.pyuploads and deploys thetoolgate initstarter and calls its
Java tool through the Gateway, then revokes its grants and checks it disappears. Deploying
adds new tools to the default Tool Group, a bareruntimes.javaPathis resolved on the host's
PATHat startup, and the quickstart proxy accepts configuration snapshots up to 2 MiB. -
The Tool Host runs server tools from verified packages (M0 part 13).
apps/tool-host
admits a Gateway dispatch only with an RS256 invocation permit Control signed for that host
(issuer, audience, admission window, single-usejti, arguments digest), finds the package,
service profile and globals in its content store by the digests the permit pins, claims the
permit at Control'spermits/consume, and answersADMITTEDwith the fencing token or a
definitiveREFUSEDreason. It then runs the tool's runtime with a clean environment over
tool protocol v2 and reports the outcome toeffects/report; a crash or timeout is
OUTCOME_UNKNOWNfor ledger tools. Route calls go through a per-invocation broker on a Unix
socket with a capability: only the permit's routes as the service profile approves them,
checked path variables, allowlisted query names and headers, connect-time address checks,
TLS by system roots, CA bundle or SPKI pin, andAPI_KEYorBASICcredentials added by
the broker from Control. The Java runtime gains governed mode (TOOLGATE_PROTOCOL=2), and
apps/tool-host/e2e/run.shruns thetoolgate initstarter's package through the host.
Control's Tool Host endpoints and Gateway dispatch follow. -
The
toolgateCLI creates and drives tool projects (M0 part 12).toolgate init <name>
writes the Java starter for Gradle (the default) or Maven (--build maven): a tool reading a
global through its typed accessor, a tool calling a declared route with a recorded exchange,
examples, aToolHarnesstest and a git-ignoredtoolgate.dev.json. In a project,
toolgate devserves the tools over stdio (or--httpon loopback),toolgate dev --digestsprints the descriptor digests,toolgate check(andtoolgate validate <dir>)
runs the tests and examples, andtoolgate packbuilds and validates the.tgpkg. The CLI
drives each build through one adapter per language and build tool, and starters are layered
templates embedded in the binary, so a new language adds a starter and an adapter.
./gradlew publishJavaSdkToMavenLocalpublishes the SDK where starters find it. The Java
end-to-end run now builds the starter instead of a separate sample. -
The Java Tool SDK is complete for standalone use (M0 part 11).
context.tcp()connects only
to the TCP destinations a tool lists, directly or through a socket factory. The processor
proves URL-style convenience calls at build time (literal arguments, exactly one route the
tool lists), refuses reflective access to the network API, checks literalget*Valuenames
and types, and generates<Class>Varstyped accessors; it now analyses after javac's own
attribution.toolgate-sdk-testingaddsToolHarness, which runs tools in test mode with
fixtures and recorded route exchanges in a shared format (spec/authoring/testing.md);
@Examplegainsexchanges, and examples travel in the package index. The Gradle plugin
io.ololabs.toolgate.sdkandtoolgate-maven-pluginadddev,checkandpackage
over the sharedtoolgate-sdk-build, which stagesapp.jarplus a deterministic
libs.zipand packs with thetoolgateCLI../gradlew publishJavaSdkLocallypublishes
the SDK tobuild/sdk-repo, andtool-sdk/java-sdk/e2e/run.shbuilds a sample with both
plugins end to end. -
The Java standalone runtime can keep tasks in SQLite (M0 part 10). With
TOOLGATE_TASK_STORE=sqlitetasks and their results live in the state file at
TOOLGATE_STATE_DBand survive a restart; a task the stopped process had not finished ends
failedwithOUTCOME_UNKNOWN.memorystays the default. A call whose task cannot be
stored gets the retryableTASK_STORE_UNAVAILABLEand nothing runs. TheTaskStoreport
listsactive()tasks instead ofall(). -
The Java standalone runtime reserves business keys (M0 part 9). Tools that require a key, or
declarebusinessKeyArgument, run only after the key (from that argument or the
Idempotency-Keyheader) is reserved in a local SQLite store atTOOLGATE_STATE_DB. Repeats
return the first result or task; other arguments getIDEMPOTENCY_CONFLICT, another caller
of aTENANTkey getsIDEMPOTENCY_KEY_IN_USE, a running repeat getsIN_PROGRESS, and a
key pastTOOLGATE_BUSINESS_KEY_RETENTIONgetsEXPIRED_KEY.@Idempotencyforwards the key
upstream per namespace (a.<hash>.<key>,u.<hash>.<key>or the rawTENANTkey). Such
tools no longer refuse startup. -
The Java standalone runtime has the routes HTTP client (M0 part 8).
context.http()calls
only the routes a tool lists, with path variables matched against their patterns (never
/), allowlisted query names and headers, the route's size limits and a timeout a call
can only shorten. Destination hosts come fromTOOLGATE_DESTINATION_<HOSTSETTING>or
toolgate.dev.json, SPKI pins are enforced, andAPI_KEY,BASICand OAuth 2.0 client
credentials come from local secrets. Failures map toUPSTREAM_4XX,UPSTREAM_5XX,
UPSTREAM_TIMEOUTandUPSTREAM_CONNECTIONwitheffectUncertain, and a ledger tool whose
request was sent without a complete answer endsOUTCOME_UNKNOWN. The processor now
refuses a route path variable without a pattern, and descriptor vector tool-03 declares
/orders/{orderId:[0-9]{6,12}}/refunds, so its digest changed. -
The Java standalone runtime verifies bearer tokens (M0 part 7, adapter A4). With
`TOOLGATE_AU...
ToolGate development e5edc4acd596
Development artifacts for commit e5edc4acd596c85dfebd33b436a1c1d16a4fdabf.
Maven: io.github.olo-labs:toolgate-contracts:1.0.0-dev.38776542656.ge5edc4acd596.
Six native client packages retain the tested source version 0.10.0-dev; their commit identity is recorded in development-release.json.
Container digests and checksums are included.
OLO ToolGate 0.10.0-dev release notes
Contracts version: 1.0.0.
License: Apache-2.0. See LICENSE and bundled third-party notices/SBOMs.
Changelog
All notable project changes should be documented here.
The project follows semantic versioning once stable versioning begins.
0.10.0-dev
-
Java tools ship as one self-contained executable.
toolgatePackageand the Mavenpackage
goal stageartifacts/tool.jar, a deterministic fat jar of the tool jar and its whole runtime
class path withMain-Class: io.ololabs.toolgate.runtime.Main, in place ofapp.jarand
libs.zip; a device needs only a JRE, andjava -jar tool.jarserves the tools over stdio.
Resources go to the first jar that has them,META-INF/servicesfiles are merged, signatures
andmodule-infoare dropped, and two different copies of one class fail the build. The
packager, Control and the Tool Host refuse a Java tool that names anything but one jar, so the
permit's pinned artifact digest now covers everything the tool runs. -
Server tools run on any Tool Host, local or remote, and move by switching the device (M0
part 15). A deployment may name its Tool Hosts (hostIdsonPackageDeploymentRequestand
PackageDeployment; none means every host); Control's placement sends a call only to a host
the deployment names, so deploying the same version to another host moves its tools. An
enrolled Tool Host also fetches its calls from Control (pull mode) over its device
certificate:POST /api/control/v1/tool-hosts/dispatches/next, then.../{id}/admission
and.../{id}/result, so a laptop behind NAT runs tools without an inbound route. When the
Gateway has no route to the placed host it queues the signedDispatchat
POST /api/control/v1/access/dispatchesand readsToolHostDispatchStatusfrom
GET .../access/dispatches/{id}until the result arrives; the permit is still verified and
consumed once, on the host. New contract modelsToolHostDispatchStateand
ToolHostDispatchStatus; Postgres migration V21 and SQLite V14 add the dispatch queue. The
console's deploy form takes the Tool Hosts and the versions table shows where each runs. The
quickstart image runs a second, pull-only Tool Host, andtools/quickstart/check.pycalls the
starter tool on the first host, redeploys it to the second and calls it again there. -
A community guide to building MCP tools with the Tool SDK,
TOOL-SDK-GUIDE.mdat the
repository root. It covers authoring, values, routes, errors, effects, testing, standalone use,
packaging and running under ToolGate. The same file ships in thetoolgate-sdk-apijar as
META-INF/toolgate/TOOL-SDK-GUIDE.mdand prints withtoolgate guide. -
Java server tools run end to end through
/mcp(M0 part 14). Control takes a.tgpkgat
POST /api/control/v1/packages/uploads(Super Admin), applies the packager's archive rules,
CHECKSUMS and descriptor digests, and stores the exact bytes;POST .../packages/deployments
makes a version the one Tool Hosts run, with values for its globals and destination host
settings, writing the service profile, the globals document, a disabled directory entry per
new tool and its resource extractor. The Tool Host enrolls as a device (CSR, administrator
approval, renewal on check-in), registers, fetches its assignments and their content by
digest, and checks in with the tools it can run, so Control's placement sends it calls like
any device. The Gateway gainstoolHosts: a call placed on one gets a permit from Control's
v2 reserve and is dispatched to the host; Control takes the host's v2 consume and result
report. The console gains a Server packages page, the quickstart image runs a Tool Host, and
tools/quickstart/check.pyuploads and deploys thetoolgate initstarter and calls its
Java tool through the Gateway, then revokes its grants and checks it disappears. Deploying
adds new tools to the default Tool Group, a bareruntimes.javaPathis resolved on the host's
PATHat startup, and the quickstart proxy accepts configuration snapshots up to 2 MiB. -
The Tool Host runs server tools from verified packages (M0 part 13).
apps/tool-host
admits a Gateway dispatch only with an RS256 invocation permit Control signed for that host
(issuer, audience, admission window, single-usejti, arguments digest), finds the package,
service profile and globals in its content store by the digests the permit pins, claims the
permit at Control'spermits/consume, and answersADMITTEDwith the fencing token or a
definitiveREFUSEDreason. It then runs the tool's runtime with a clean environment over
tool protocol v2 and reports the outcome toeffects/report; a crash or timeout is
OUTCOME_UNKNOWNfor ledger tools. Route calls go through a per-invocation broker on a Unix
socket with a capability: only the permit's routes as the service profile approves them,
checked path variables, allowlisted query names and headers, connect-time address checks,
TLS by system roots, CA bundle or SPKI pin, andAPI_KEYorBASICcredentials added by
the broker from Control. The Java runtime gains governed mode (TOOLGATE_PROTOCOL=2), and
apps/tool-host/e2e/run.shruns thetoolgate initstarter's package through the host.
Control's Tool Host endpoints and Gateway dispatch follow. -
The
toolgateCLI creates and drives tool projects (M0 part 12).toolgate init <name>
writes the Java starter for Gradle (the default) or Maven (--build maven): a tool reading a
global through its typed accessor, a tool calling a declared route with a recorded exchange,
examples, aToolHarnesstest and a git-ignoredtoolgate.dev.json. In a project,
toolgate devserves the tools over stdio (or--httpon loopback),toolgate dev --digestsprints the descriptor digests,toolgate check(andtoolgate validate <dir>)
runs the tests and examples, andtoolgate packbuilds and validates the.tgpkg. The CLI
drives each build through one adapter per language and build tool, and starters are layered
templates embedded in the binary, so a new language adds a starter and an adapter.
./gradlew publishJavaSdkToMavenLocalpublishes the SDK where starters find it. The Java
end-to-end run now builds the starter instead of a separate sample. -
The Java Tool SDK is complete for standalone use (M0 part 11).
context.tcp()connects only
to the TCP destinations a tool lists, directly or through a socket factory. The processor
proves URL-style convenience calls at build time (literal arguments, exactly one route the
tool lists), refuses reflective access to the network API, checks literalget*Valuenames
and types, and generates<Class>Varstyped accessors; it now analyses after javac's own
attribution.toolgate-sdk-testingaddsToolHarness, which runs tools in test mode with
fixtures and recorded route exchanges in a shared format (spec/authoring/testing.md);
@Examplegainsexchanges, and examples travel in the package index. The Gradle plugin
io.ololabs.toolgate.sdkandtoolgate-maven-pluginadddev,checkandpackage
over the sharedtoolgate-sdk-build, which stagesapp.jarplus a deterministic
libs.zipand packs with thetoolgateCLI../gradlew publishJavaSdkLocallypublishes
the SDK tobuild/sdk-repo, andtool-sdk/java-sdk/e2e/run.shbuilds a sample with both
plugins end to end. -
The Java standalone runtime can keep tasks in SQLite (M0 part 10). With
TOOLGATE_TASK_STORE=sqlitetasks and their results live in the state file at
TOOLGATE_STATE_DBand survive a restart; a task the stopped process had not finished ends
failedwithOUTCOME_UNKNOWN.memorystays the default. A call whose task cannot be
stored gets the retryableTASK_STORE_UNAVAILABLEand nothing runs. TheTaskStoreport
listsactive()tasks instead ofall(). -
The Java standalone runtime reserves business keys (M0 part 9). Tools that require a key, or
declarebusinessKeyArgument, run only after the key (from that argument or the
Idempotency-Keyheader) is reserved in a local SQLite store atTOOLGATE_STATE_DB. Repeats
return the first result or task; other arguments getIDEMPOTENCY_CONFLICT, another caller
of aTENANTkey getsIDEMPOTENCY_KEY_IN_USE, a running repeat getsIN_PROGRESS, and a
key pastTOOLGATE_BUSINESS_KEY_RETENTIONgetsEXPIRED_KEY.@Idempotencyforwards the key
upstream per namespace (a.<hash>.<key>,u.<hash>.<key>or the rawTENANTkey). Such
tools no longer refuse startup. -
The Java standalone runtime has the routes HTTP client (M0 part 8).
context.http()calls
only the routes a tool lists, with path variables matched against their patterns (never
/), allowlisted query names and headers, the route's size limits and a timeout a call
can only shorten. Destination hosts come fromTOOLGATE_DESTINATION_<HOSTSETTING>or
toolgate.dev.json, SPKI pins are enforced, andAPI_KEY,BASICand OAuth 2.0 client
credentials come from local secrets. Failures map toUPSTREAM_4XX,UPSTREAM_5XX,
UPSTREAM_TIMEOUTandUPSTREAM_CONNECTIONwitheffectUncertain, and a ledger tool whose
request was sent without a complete answer endsOUTCOME_UNKNOWN. The processor now
refuses a route path variable without a pattern, and descriptor vector tool-03 declares
/orders/{orderId:[0-9]{6,12}}/refunds, so its digest changed. -
The Java standalone runtime verifies bearer ...
ToolGate manual development c8d2a6ab0e8a
Manual development build for commit c8d2a6ab0e8a78cb9a371006b99c6d3ccefac732.
No CI verification, tests, scans or smoke tests were run. Maven signing runs in its separate publication job.
Library version: 1.0.0-dev.38613766319.1.gc8d2a6ab0e8a. Container digests and checksums are attached.
OLO ToolGate 0.10.0-dev release notes
Contracts version: 1.0.0.
License: Apache-2.0. See LICENSE and bundled third-party notices/SBOMs.
Changelog
All notable project changes should be documented here.
The project follows semantic versioning once stable versioning begins.
0.10.0-dev
-
Java tools ship as one self-contained executable.
toolgatePackageand the Mavenpackage
goal stageartifacts/tool.jar, a deterministic fat jar of the tool jar and its whole runtime
class path withMain-Class: io.ololabs.toolgate.runtime.Main, in place ofapp.jarand
libs.zip; a device needs only a JRE, andjava -jar tool.jarserves the tools over stdio.
Resources go to the first jar that has them,META-INF/servicesfiles are merged, signatures
andmodule-infoare dropped, and two different copies of one class fail the build. The
packager, Control and the Tool Host refuse a Java tool that names anything but one jar, so the
permit's pinned artifact digest now covers everything the tool runs. -
Server tools run on any Tool Host, local or remote, and move by switching the device (M0
part 15). A deployment may name its Tool Hosts (hostIdsonPackageDeploymentRequestand
PackageDeployment; none means every host); Control's placement sends a call only to a host
the deployment names, so deploying the same version to another host moves its tools. An
enrolled Tool Host also fetches its calls from Control (pull mode) over its device
certificate:POST /api/control/v1/tool-hosts/dispatches/next, then.../{id}/admission
and.../{id}/result, so a laptop behind NAT runs tools without an inbound route. When the
Gateway has no route to the placed host it queues the signedDispatchat
POST /api/control/v1/access/dispatchesand readsToolHostDispatchStatusfrom
GET .../access/dispatches/{id}until the result arrives; the permit is still verified and
consumed once, on the host. New contract modelsToolHostDispatchStateand
ToolHostDispatchStatus; Postgres migration V21 and SQLite V14 add the dispatch queue. The
console's deploy form takes the Tool Hosts and the versions table shows where each runs. The
quickstart image runs a second, pull-only Tool Host, andtools/quickstart/check.pycalls the
starter tool on the first host, redeploys it to the second and calls it again there. -
A community guide to building MCP tools with the Tool SDK,
TOOL-SDK-GUIDE.mdat the
repository root. It covers authoring, values, routes, errors, effects, testing, standalone use,
packaging and running under ToolGate. The same file ships in thetoolgate-sdk-apijar as
META-INF/toolgate/TOOL-SDK-GUIDE.mdand prints withtoolgate guide. -
Java server tools run end to end through
/mcp(M0 part 14). Control takes a.tgpkgat
POST /api/control/v1/packages/uploads(Super Admin), applies the packager's archive rules,
CHECKSUMS and descriptor digests, and stores the exact bytes;POST .../packages/deployments
makes a version the one Tool Hosts run, with values for its globals and destination host
settings, writing the service profile, the globals document, a disabled directory entry per
new tool and its resource extractor. The Tool Host enrolls as a device (CSR, administrator
approval, renewal on check-in), registers, fetches its assignments and their content by
digest, and checks in with the tools it can run, so Control's placement sends it calls like
any device. The Gateway gainstoolHosts: a call placed on one gets a permit from Control's
v2 reserve and is dispatched to the host; Control takes the host's v2 consume and result
report. The console gains a Server packages page, the quickstart image runs a Tool Host, and
tools/quickstart/check.pyuploads and deploys thetoolgate initstarter and calls its
Java tool through the Gateway, then revokes its grants and checks it disappears. Deploying
adds new tools to the default Tool Group, a bareruntimes.javaPathis resolved on the host's
PATHat startup, and the quickstart proxy accepts configuration snapshots up to 2 MiB. -
The Tool Host runs server tools from verified packages (M0 part 13).
apps/tool-host
admits a Gateway dispatch only with an RS256 invocation permit Control signed for that host
(issuer, audience, admission window, single-usejti, arguments digest), finds the package,
service profile and globals in its content store by the digests the permit pins, claims the
permit at Control'spermits/consume, and answersADMITTEDwith the fencing token or a
definitiveREFUSEDreason. It then runs the tool's runtime with a clean environment over
tool protocol v2 and reports the outcome toeffects/report; a crash or timeout is
OUTCOME_UNKNOWNfor ledger tools. Route calls go through a per-invocation broker on a Unix
socket with a capability: only the permit's routes as the service profile approves them,
checked path variables, allowlisted query names and headers, connect-time address checks,
TLS by system roots, CA bundle or SPKI pin, andAPI_KEYorBASICcredentials added by
the broker from Control. The Java runtime gains governed mode (TOOLGATE_PROTOCOL=2), and
apps/tool-host/e2e/run.shruns thetoolgate initstarter's package through the host.
Control's Tool Host endpoints and Gateway dispatch follow. -
The
toolgateCLI creates and drives tool projects (M0 part 12).toolgate init <name>
writes the Java starter for Gradle (the default) or Maven (--build maven): a tool reading a
global through its typed accessor, a tool calling a declared route with a recorded exchange,
examples, aToolHarnesstest and a git-ignoredtoolgate.dev.json. In a project,
toolgate devserves the tools over stdio (or--httpon loopback),toolgate dev --digestsprints the descriptor digests,toolgate check(andtoolgate validate <dir>)
runs the tests and examples, andtoolgate packbuilds and validates the.tgpkg. The CLI
drives each build through one adapter per language and build tool, and starters are layered
templates embedded in the binary, so a new language adds a starter and an adapter.
./gradlew publishJavaSdkToMavenLocalpublishes the SDK where starters find it. The Java
end-to-end run now builds the starter instead of a separate sample. -
The Java Tool SDK is complete for standalone use (M0 part 11).
context.tcp()connects only
to the TCP destinations a tool lists, directly or through a socket factory. The processor
proves URL-style convenience calls at build time (literal arguments, exactly one route the
tool lists), refuses reflective access to the network API, checks literalget*Valuenames
and types, and generates<Class>Varstyped accessors; it now analyses after javac's own
attribution.toolgate-sdk-testingaddsToolHarness, which runs tools in test mode with
fixtures and recorded route exchanges in a shared format (spec/authoring/testing.md);
@Examplegainsexchanges, and examples travel in the package index. The Gradle plugin
io.ololabs.toolgate.sdkandtoolgate-maven-pluginadddev,checkandpackage
over the sharedtoolgate-sdk-build, which stagesapp.jarplus a deterministic
libs.zipand packs with thetoolgateCLI../gradlew publishJavaSdkLocallypublishes
the SDK tobuild/sdk-repo, andtool-sdk/java-sdk/e2e/run.shbuilds a sample with both
plugins end to end. -
The Java standalone runtime can keep tasks in SQLite (M0 part 10). With
TOOLGATE_TASK_STORE=sqlitetasks and their results live in the state file at
TOOLGATE_STATE_DBand survive a restart; a task the stopped process had not finished ends
failedwithOUTCOME_UNKNOWN.memorystays the default. A call whose task cannot be
stored gets the retryableTASK_STORE_UNAVAILABLEand nothing runs. TheTaskStoreport
listsactive()tasks instead ofall(). -
The Java standalone runtime reserves business keys (M0 part 9). Tools that require a key, or
declarebusinessKeyArgument, run only after the key (from that argument or the
Idempotency-Keyheader) is reserved in a local SQLite store atTOOLGATE_STATE_DB. Repeats
return the first result or task; other arguments getIDEMPOTENCY_CONFLICT, another caller
of aTENANTkey getsIDEMPOTENCY_KEY_IN_USE, a running repeat getsIN_PROGRESS, and a
key pastTOOLGATE_BUSINESS_KEY_RETENTIONgetsEXPIRED_KEY.@Idempotencyforwards the key
upstream per namespace (a.<hash>.<key>,u.<hash>.<key>or the rawTENANTkey). Such
tools no longer refuse startup. -
The Java standalone runtime has the routes HTTP client (M0 part 8).
context.http()calls
only the routes a tool lists, with path variables matched against their patterns (never
/), allowlisted query names and headers, the route's size limits and a timeout a call
can only shorten. Destination hosts come fromTOOLGATE_DESTINATION_<HOSTSETTING>or
toolgate.dev.json, SPKI pins are enforced, andAPI_KEY,BASICand OAuth 2.0 client
credentials come from local secrets. Failures map toUPSTREAM_4XX,UPSTREAM_5XX,
UPSTREAM_TIMEOUTandUPSTREAM_CONNECTIONwitheffectUncertain, and a ledger tool whose
request was sent without a complete answer endsOUTCOME_UNKNOWN. The processor now
refuses a route path variable without a pattern, and descriptor vector tool-03 declares
/orders/{orderId:[0-9]{6,12}}/refunds, so its digest changed. -
The Java standalone runtime verifies bearer tokens (M0 part 7, adapter A4). With
`TOOLGATE_AU...
ToolGate manual development 9db9b812218c
Manual development build for commit 9db9b812218c81d4331c715464a052a3db84813c.
No CI verification, tests, scans or smoke tests were run. Maven signing runs in its separate publication job.
Library version: 1.0.0-dev.38656272087.1.g9db9b812218c. Container digests and checksums are attached.
OLO ToolGate 0.10.0-dev release notes
Contracts version: 1.0.0.
License: Apache-2.0. See LICENSE and bundled third-party notices/SBOMs.
Changelog
All notable project changes should be documented here.
The project follows semantic versioning once stable versioning begins.
0.10.0-dev
-
Java tools ship as one self-contained executable.
toolgatePackageand the Mavenpackage
goal stageartifacts/tool.jar, a deterministic fat jar of the tool jar and its whole runtime
class path withMain-Class: io.ololabs.toolgate.runtime.Main, in place ofapp.jarand
libs.zip; a device needs only a JRE, andjava -jar tool.jarserves the tools over stdio.
Resources go to the first jar that has them,META-INF/servicesfiles are merged, signatures
andmodule-infoare dropped, and two different copies of one class fail the build. The
packager, Control and the Tool Host refuse a Java tool that names anything but one jar, so the
permit's pinned artifact digest now covers everything the tool runs. -
Server tools run on any Tool Host, local or remote, and move by switching the device (M0
part 15). A deployment may name its Tool Hosts (hostIdsonPackageDeploymentRequestand
PackageDeployment; none means every host); Control's placement sends a call only to a host
the deployment names, so deploying the same version to another host moves its tools. An
enrolled Tool Host also fetches its calls from Control (pull mode) over its device
certificate:POST /api/control/v1/tool-hosts/dispatches/next, then.../{id}/admission
and.../{id}/result, so a laptop behind NAT runs tools without an inbound route. When the
Gateway has no route to the placed host it queues the signedDispatchat
POST /api/control/v1/access/dispatchesand readsToolHostDispatchStatusfrom
GET .../access/dispatches/{id}until the result arrives; the permit is still verified and
consumed once, on the host. New contract modelsToolHostDispatchStateand
ToolHostDispatchStatus; Postgres migration V21 and SQLite V14 add the dispatch queue. The
console's deploy form takes the Tool Hosts and the versions table shows where each runs. The
quickstart image runs a second, pull-only Tool Host, andtools/quickstart/check.pycalls the
starter tool on the first host, redeploys it to the second and calls it again there. -
A community guide to building MCP tools with the Tool SDK,
TOOL-SDK-GUIDE.mdat the
repository root. It covers authoring, values, routes, errors, effects, testing, standalone use,
packaging and running under ToolGate. The same file ships in thetoolgate-sdk-apijar as
META-INF/toolgate/TOOL-SDK-GUIDE.mdand prints withtoolgate guide. -
Java server tools run end to end through
/mcp(M0 part 14). Control takes a.tgpkgat
POST /api/control/v1/packages/uploads(Super Admin), applies the packager's archive rules,
CHECKSUMS and descriptor digests, and stores the exact bytes;POST .../packages/deployments
makes a version the one Tool Hosts run, with values for its globals and destination host
settings, writing the service profile, the globals document, a disabled directory entry per
new tool and its resource extractor. The Tool Host enrolls as a device (CSR, administrator
approval, renewal on check-in), registers, fetches its assignments and their content by
digest, and checks in with the tools it can run, so Control's placement sends it calls like
any device. The Gateway gainstoolHosts: a call placed on one gets a permit from Control's
v2 reserve and is dispatched to the host; Control takes the host's v2 consume and result
report. The console gains a Server packages page, the quickstart image runs a Tool Host, and
tools/quickstart/check.pyuploads and deploys thetoolgate initstarter and calls its
Java tool through the Gateway, then revokes its grants and checks it disappears. Deploying
adds new tools to the default Tool Group, a bareruntimes.javaPathis resolved on the host's
PATHat startup, and the quickstart proxy accepts configuration snapshots up to 2 MiB. -
The Tool Host runs server tools from verified packages (M0 part 13).
apps/tool-host
admits a Gateway dispatch only with an RS256 invocation permit Control signed for that host
(issuer, audience, admission window, single-usejti, arguments digest), finds the package,
service profile and globals in its content store by the digests the permit pins, claims the
permit at Control'spermits/consume, and answersADMITTEDwith the fencing token or a
definitiveREFUSEDreason. It then runs the tool's runtime with a clean environment over
tool protocol v2 and reports the outcome toeffects/report; a crash or timeout is
OUTCOME_UNKNOWNfor ledger tools. Route calls go through a per-invocation broker on a Unix
socket with a capability: only the permit's routes as the service profile approves them,
checked path variables, allowlisted query names and headers, connect-time address checks,
TLS by system roots, CA bundle or SPKI pin, andAPI_KEYorBASICcredentials added by
the broker from Control. The Java runtime gains governed mode (TOOLGATE_PROTOCOL=2), and
apps/tool-host/e2e/run.shruns thetoolgate initstarter's package through the host.
Control's Tool Host endpoints and Gateway dispatch follow. -
The
toolgateCLI creates and drives tool projects (M0 part 12).toolgate init <name>
writes the Java starter for Gradle (the default) or Maven (--build maven): a tool reading a
global through its typed accessor, a tool calling a declared route with a recorded exchange,
examples, aToolHarnesstest and a git-ignoredtoolgate.dev.json. In a project,
toolgate devserves the tools over stdio (or--httpon loopback),toolgate dev --digestsprints the descriptor digests,toolgate check(andtoolgate validate <dir>)
runs the tests and examples, andtoolgate packbuilds and validates the.tgpkg. The CLI
drives each build through one adapter per language and build tool, and starters are layered
templates embedded in the binary, so a new language adds a starter and an adapter.
./gradlew publishJavaSdkToMavenLocalpublishes the SDK where starters find it. The Java
end-to-end run now builds the starter instead of a separate sample. -
The Java Tool SDK is complete for standalone use (M0 part 11).
context.tcp()connects only
to the TCP destinations a tool lists, directly or through a socket factory. The processor
proves URL-style convenience calls at build time (literal arguments, exactly one route the
tool lists), refuses reflective access to the network API, checks literalget*Valuenames
and types, and generates<Class>Varstyped accessors; it now analyses after javac's own
attribution.toolgate-sdk-testingaddsToolHarness, which runs tools in test mode with
fixtures and recorded route exchanges in a shared format (spec/authoring/testing.md);
@Examplegainsexchanges, and examples travel in the package index. The Gradle plugin
io.ololabs.toolgate.sdkandtoolgate-maven-pluginadddev,checkandpackage
over the sharedtoolgate-sdk-build, which stagesapp.jarplus a deterministic
libs.zipand packs with thetoolgateCLI../gradlew publishJavaSdkLocallypublishes
the SDK tobuild/sdk-repo, andtool-sdk/java-sdk/e2e/run.shbuilds a sample with both
plugins end to end. -
The Java standalone runtime can keep tasks in SQLite (M0 part 10). With
TOOLGATE_TASK_STORE=sqlitetasks and their results live in the state file at
TOOLGATE_STATE_DBand survive a restart; a task the stopped process had not finished ends
failedwithOUTCOME_UNKNOWN.memorystays the default. A call whose task cannot be
stored gets the retryableTASK_STORE_UNAVAILABLEand nothing runs. TheTaskStoreport
listsactive()tasks instead ofall(). -
The Java standalone runtime reserves business keys (M0 part 9). Tools that require a key, or
declarebusinessKeyArgument, run only after the key (from that argument or the
Idempotency-Keyheader) is reserved in a local SQLite store atTOOLGATE_STATE_DB. Repeats
return the first result or task; other arguments getIDEMPOTENCY_CONFLICT, another caller
of aTENANTkey getsIDEMPOTENCY_KEY_IN_USE, a running repeat getsIN_PROGRESS, and a
key pastTOOLGATE_BUSINESS_KEY_RETENTIONgetsEXPIRED_KEY.@Idempotencyforwards the key
upstream per namespace (a.<hash>.<key>,u.<hash>.<key>or the rawTENANTkey). Such
tools no longer refuse startup. -
The Java standalone runtime has the routes HTTP client (M0 part 8).
context.http()calls
only the routes a tool lists, with path variables matched against their patterns (never
/), allowlisted query names and headers, the route's size limits and a timeout a call
can only shorten. Destination hosts come fromTOOLGATE_DESTINATION_<HOSTSETTING>or
toolgate.dev.json, SPKI pins are enforced, andAPI_KEY,BASICand OAuth 2.0 client
credentials come from local secrets. Failures map toUPSTREAM_4XX,UPSTREAM_5XX,
UPSTREAM_TIMEOUTandUPSTREAM_CONNECTIONwitheffectUncertain, and a ledger tool whose
request was sent without a complete answer endsOUTCOME_UNKNOWN. The processor now
refuses a route path variable without a pattern, and descriptor vector tool-03 declares
/orders/{orderId:[0-9]{6,12}}/refunds, so its digest changed. -
The Java standalone runtime verifies bearer tokens (M0 part 7, adapter A4). With
`TOOLGATE_AU...
ToolGate development 9db9b812218c
Development artifacts for commit 9db9b812218c81d4331c715464a052a3db84813c.
Maven: io.github.olo-labs:toolgate-contracts:1.0.0-dev.38654795984.g9db9b812218c.
Six native client packages retain the tested source version 0.10.0-dev; their commit identity is recorded in development-release.json.
Container digests and checksums are included.
OLO ToolGate 0.10.0-dev release notes
Contracts version: 1.0.0.
License: Apache-2.0. See LICENSE and bundled third-party notices/SBOMs.
Changelog
All notable project changes should be documented here.
The project follows semantic versioning once stable versioning begins.
0.10.0-dev
-
Java tools ship as one self-contained executable.
toolgatePackageand the Mavenpackage
goal stageartifacts/tool.jar, a deterministic fat jar of the tool jar and its whole runtime
class path withMain-Class: io.ololabs.toolgate.runtime.Main, in place ofapp.jarand
libs.zip; a device needs only a JRE, andjava -jar tool.jarserves the tools over stdio.
Resources go to the first jar that has them,META-INF/servicesfiles are merged, signatures
andmodule-infoare dropped, and two different copies of one class fail the build. The
packager, Control and the Tool Host refuse a Java tool that names anything but one jar, so the
permit's pinned artifact digest now covers everything the tool runs. -
Server tools run on any Tool Host, local or remote, and move by switching the device (M0
part 15). A deployment may name its Tool Hosts (hostIdsonPackageDeploymentRequestand
PackageDeployment; none means every host); Control's placement sends a call only to a host
the deployment names, so deploying the same version to another host moves its tools. An
enrolled Tool Host also fetches its calls from Control (pull mode) over its device
certificate:POST /api/control/v1/tool-hosts/dispatches/next, then.../{id}/admission
and.../{id}/result, so a laptop behind NAT runs tools without an inbound route. When the
Gateway has no route to the placed host it queues the signedDispatchat
POST /api/control/v1/access/dispatchesand readsToolHostDispatchStatusfrom
GET .../access/dispatches/{id}until the result arrives; the permit is still verified and
consumed once, on the host. New contract modelsToolHostDispatchStateand
ToolHostDispatchStatus; Postgres migration V21 and SQLite V14 add the dispatch queue. The
console's deploy form takes the Tool Hosts and the versions table shows where each runs. The
quickstart image runs a second, pull-only Tool Host, andtools/quickstart/check.pycalls the
starter tool on the first host, redeploys it to the second and calls it again there. -
A community guide to building MCP tools with the Tool SDK,
TOOL-SDK-GUIDE.mdat the
repository root. It covers authoring, values, routes, errors, effects, testing, standalone use,
packaging and running under ToolGate. The same file ships in thetoolgate-sdk-apijar as
META-INF/toolgate/TOOL-SDK-GUIDE.mdand prints withtoolgate guide. -
Java server tools run end to end through
/mcp(M0 part 14). Control takes a.tgpkgat
POST /api/control/v1/packages/uploads(Super Admin), applies the packager's archive rules,
CHECKSUMS and descriptor digests, and stores the exact bytes;POST .../packages/deployments
makes a version the one Tool Hosts run, with values for its globals and destination host
settings, writing the service profile, the globals document, a disabled directory entry per
new tool and its resource extractor. The Tool Host enrolls as a device (CSR, administrator
approval, renewal on check-in), registers, fetches its assignments and their content by
digest, and checks in with the tools it can run, so Control's placement sends it calls like
any device. The Gateway gainstoolHosts: a call placed on one gets a permit from Control's
v2 reserve and is dispatched to the host; Control takes the host's v2 consume and result
report. The console gains a Server packages page, the quickstart image runs a Tool Host, and
tools/quickstart/check.pyuploads and deploys thetoolgate initstarter and calls its
Java tool through the Gateway, then revokes its grants and checks it disappears. Deploying
adds new tools to the default Tool Group, a bareruntimes.javaPathis resolved on the host's
PATHat startup, and the quickstart proxy accepts configuration snapshots up to 2 MiB. -
The Tool Host runs server tools from verified packages (M0 part 13).
apps/tool-host
admits a Gateway dispatch only with an RS256 invocation permit Control signed for that host
(issuer, audience, admission window, single-usejti, arguments digest), finds the package,
service profile and globals in its content store by the digests the permit pins, claims the
permit at Control'spermits/consume, and answersADMITTEDwith the fencing token or a
definitiveREFUSEDreason. It then runs the tool's runtime with a clean environment over
tool protocol v2 and reports the outcome toeffects/report; a crash or timeout is
OUTCOME_UNKNOWNfor ledger tools. Route calls go through a per-invocation broker on a Unix
socket with a capability: only the permit's routes as the service profile approves them,
checked path variables, allowlisted query names and headers, connect-time address checks,
TLS by system roots, CA bundle or SPKI pin, andAPI_KEYorBASICcredentials added by
the broker from Control. The Java runtime gains governed mode (TOOLGATE_PROTOCOL=2), and
apps/tool-host/e2e/run.shruns thetoolgate initstarter's package through the host.
Control's Tool Host endpoints and Gateway dispatch follow. -
The
toolgateCLI creates and drives tool projects (M0 part 12).toolgate init <name>
writes the Java starter for Gradle (the default) or Maven (--build maven): a tool reading a
global through its typed accessor, a tool calling a declared route with a recorded exchange,
examples, aToolHarnesstest and a git-ignoredtoolgate.dev.json. In a project,
toolgate devserves the tools over stdio (or--httpon loopback),toolgate dev --digestsprints the descriptor digests,toolgate check(andtoolgate validate <dir>)
runs the tests and examples, andtoolgate packbuilds and validates the.tgpkg. The CLI
drives each build through one adapter per language and build tool, and starters are layered
templates embedded in the binary, so a new language adds a starter and an adapter.
./gradlew publishJavaSdkToMavenLocalpublishes the SDK where starters find it. The Java
end-to-end run now builds the starter instead of a separate sample. -
The Java Tool SDK is complete for standalone use (M0 part 11).
context.tcp()connects only
to the TCP destinations a tool lists, directly or through a socket factory. The processor
proves URL-style convenience calls at build time (literal arguments, exactly one route the
tool lists), refuses reflective access to the network API, checks literalget*Valuenames
and types, and generates<Class>Varstyped accessors; it now analyses after javac's own
attribution.toolgate-sdk-testingaddsToolHarness, which runs tools in test mode with
fixtures and recorded route exchanges in a shared format (spec/authoring/testing.md);
@Examplegainsexchanges, and examples travel in the package index. The Gradle plugin
io.ololabs.toolgate.sdkandtoolgate-maven-pluginadddev,checkandpackage
over the sharedtoolgate-sdk-build, which stagesapp.jarplus a deterministic
libs.zipand packs with thetoolgateCLI../gradlew publishJavaSdkLocallypublishes
the SDK tobuild/sdk-repo, andtool-sdk/java-sdk/e2e/run.shbuilds a sample with both
plugins end to end. -
The Java standalone runtime can keep tasks in SQLite (M0 part 10). With
TOOLGATE_TASK_STORE=sqlitetasks and their results live in the state file at
TOOLGATE_STATE_DBand survive a restart; a task the stopped process had not finished ends
failedwithOUTCOME_UNKNOWN.memorystays the default. A call whose task cannot be
stored gets the retryableTASK_STORE_UNAVAILABLEand nothing runs. TheTaskStoreport
listsactive()tasks instead ofall(). -
The Java standalone runtime reserves business keys (M0 part 9). Tools that require a key, or
declarebusinessKeyArgument, run only after the key (from that argument or the
Idempotency-Keyheader) is reserved in a local SQLite store atTOOLGATE_STATE_DB. Repeats
return the first result or task; other arguments getIDEMPOTENCY_CONFLICT, another caller
of aTENANTkey getsIDEMPOTENCY_KEY_IN_USE, a running repeat getsIN_PROGRESS, and a
key pastTOOLGATE_BUSINESS_KEY_RETENTIONgetsEXPIRED_KEY.@Idempotencyforwards the key
upstream per namespace (a.<hash>.<key>,u.<hash>.<key>or the rawTENANTkey). Such
tools no longer refuse startup. -
The Java standalone runtime has the routes HTTP client (M0 part 8).
context.http()calls
only the routes a tool lists, with path variables matched against their patterns (never
/), allowlisted query names and headers, the route's size limits and a timeout a call
can only shorten. Destination hosts come fromTOOLGATE_DESTINATION_<HOSTSETTING>or
toolgate.dev.json, SPKI pins are enforced, andAPI_KEY,BASICand OAuth 2.0 client
credentials come from local secrets. Failures map toUPSTREAM_4XX,UPSTREAM_5XX,
UPSTREAM_TIMEOUTandUPSTREAM_CONNECTIONwitheffectUncertain, and a ledger tool whose
request was sent without a complete answer endsOUTCOME_UNKNOWN. The processor now
refuses a route path variable without a pattern, and descriptor vector tool-03 declares
/orders/{orderId:[0-9]{6,12}}/refunds, so its digest changed. -
The Java standalone runtime verifies bearer ...
ToolGate manual development 7a6ea7e0edcb
Manual development build for commit 7a6ea7e0edcbaaa7a6327d4b39b89f37bb56ebb6.
No CI verification, tests, scans, smoke tests, or signing were run.
Library version: 1.0.0-dev.38545259803.1.g7a6ea7e0edcb. Container digests and checksums are attached.
OLO ToolGate 0.10.0-dev release notes
Contracts version: 1.0.0.
License: Apache-2.0. See LICENSE and bundled third-party notices/SBOMs.
Changelog
All notable project changes should be documented here.
The project follows semantic versioning once stable versioning begins.
0.10.0-dev
-
Java tools ship as one self-contained executable.
toolgatePackageand the Mavenpackage
goal stageartifacts/tool.jar, a deterministic fat jar of the tool jar and its whole runtime
class path withMain-Class: io.ololabs.toolgate.runtime.Main, in place ofapp.jarand
libs.zip; a device needs only a JRE, andjava -jar tool.jarserves the tools over stdio.
Resources go to the first jar that has them,META-INF/servicesfiles are merged, signatures
andmodule-infoare dropped, and two different copies of one class fail the build. The
packager, Control and the Tool Host refuse a Java tool that names anything but one jar, so the
permit's pinned artifact digest now covers everything the tool runs. -
Server tools run on any Tool Host, local or remote, and move by switching the device (M0
part 15). A deployment may name its Tool Hosts (hostIdsonPackageDeploymentRequestand
PackageDeployment; none means every host); Control's placement sends a call only to a host
the deployment names, so deploying the same version to another host moves its tools. An
enrolled Tool Host also fetches its calls from Control (pull mode) over its device
certificate:POST /api/control/v1/tool-hosts/dispatches/next, then.../{id}/admission
and.../{id}/result, so a laptop behind NAT runs tools without an inbound route. When the
Gateway has no route to the placed host it queues the signedDispatchat
POST /api/control/v1/access/dispatchesand readsToolHostDispatchStatusfrom
GET .../access/dispatches/{id}until the result arrives; the permit is still verified and
consumed once, on the host. New contract modelsToolHostDispatchStateand
ToolHostDispatchStatus; Postgres migration V21 and SQLite V14 add the dispatch queue. The
console's deploy form takes the Tool Hosts and the versions table shows where each runs. The
quickstart image runs a second, pull-only Tool Host, andtools/quickstart/check.pycalls the
starter tool on the first host, redeploys it to the second and calls it again there. -
A community guide to building MCP tools with the Tool SDK,
TOOL-SDK-GUIDE.mdat the
repository root. It covers authoring, values, routes, errors, effects, testing, standalone use,
packaging and running under ToolGate. The same file ships in thetoolgate-sdk-apijar as
META-INF/toolgate/TOOL-SDK-GUIDE.mdand prints withtoolgate guide. -
Java server tools run end to end through
/mcp(M0 part 14). Control takes a.tgpkgat
POST /api/control/v1/packages/uploads(Super Admin), applies the packager's archive rules,
CHECKSUMS and descriptor digests, and stores the exact bytes;POST .../packages/deployments
makes a version the one Tool Hosts run, with values for its globals and destination host
settings, writing the service profile, the globals document, a disabled directory entry per
new tool and its resource extractor. The Tool Host enrolls as a device (CSR, administrator
approval, renewal on check-in), registers, fetches its assignments and their content by
digest, and checks in with the tools it can run, so Control's placement sends it calls like
any device. The Gateway gainstoolHosts: a call placed on one gets a permit from Control's
v2 reserve and is dispatched to the host; Control takes the host's v2 consume and result
report. The console gains a Server packages page, the quickstart image runs a Tool Host, and
tools/quickstart/check.pyuploads and deploys thetoolgate initstarter and calls its
Java tool through the Gateway, then revokes its grants and checks it disappears. Deploying
adds new tools to the default Tool Group, a bareruntimes.javaPathis resolved on the host's
PATHat startup, and the quickstart proxy accepts configuration snapshots up to 2 MiB. -
The Tool Host runs server tools from verified packages (M0 part 13).
apps/tool-host
admits a Gateway dispatch only with an RS256 invocation permit Control signed for that host
(issuer, audience, admission window, single-usejti, arguments digest), finds the package,
service profile and globals in its content store by the digests the permit pins, claims the
permit at Control'spermits/consume, and answersADMITTEDwith the fencing token or a
definitiveREFUSEDreason. It then runs the tool's runtime with a clean environment over
tool protocol v2 and reports the outcome toeffects/report; a crash or timeout is
OUTCOME_UNKNOWNfor ledger tools. Route calls go through a per-invocation broker on a Unix
socket with a capability: only the permit's routes as the service profile approves them,
checked path variables, allowlisted query names and headers, connect-time address checks,
TLS by system roots, CA bundle or SPKI pin, andAPI_KEYorBASICcredentials added by
the broker from Control. The Java runtime gains governed mode (TOOLGATE_PROTOCOL=2), and
apps/tool-host/e2e/run.shruns thetoolgate initstarter's package through the host.
Control's Tool Host endpoints and Gateway dispatch follow. -
The
toolgateCLI creates and drives tool projects (M0 part 12).toolgate init <name>
writes the Java starter for Gradle (the default) or Maven (--build maven): a tool reading a
global through its typed accessor, a tool calling a declared route with a recorded exchange,
examples, aToolHarnesstest and a git-ignoredtoolgate.dev.json. In a project,
toolgate devserves the tools over stdio (or--httpon loopback),toolgate dev --digestsprints the descriptor digests,toolgate check(andtoolgate validate <dir>)
runs the tests and examples, andtoolgate packbuilds and validates the.tgpkg. The CLI
drives each build through one adapter per language and build tool, and starters are layered
templates embedded in the binary, so a new language adds a starter and an adapter.
./gradlew publishJavaSdkToMavenLocalpublishes the SDK where starters find it. The Java
end-to-end run now builds the starter instead of a separate sample. -
The Java Tool SDK is complete for standalone use (M0 part 11).
context.tcp()connects only
to the TCP destinations a tool lists, directly or through a socket factory. The processor
proves URL-style convenience calls at build time (literal arguments, exactly one route the
tool lists), refuses reflective access to the network API, checks literalget*Valuenames
and types, and generates<Class>Varstyped accessors; it now analyses after javac's own
attribution.toolgate-sdk-testingaddsToolHarness, which runs tools in test mode with
fixtures and recorded route exchanges in a shared format (spec/authoring/testing.md);
@Examplegainsexchanges, and examples travel in the package index. The Gradle plugin
io.ololabs.toolgate.sdkandtoolgate-maven-pluginadddev,checkandpackage
over the sharedtoolgate-sdk-build, which stagesapp.jarplus a deterministic
libs.zipand packs with thetoolgateCLI../gradlew publishJavaSdkLocallypublishes
the SDK tobuild/sdk-repo, andtool-sdk/java-sdk/e2e/run.shbuilds a sample with both
plugins end to end. -
The Java standalone runtime can keep tasks in SQLite (M0 part 10). With
TOOLGATE_TASK_STORE=sqlitetasks and their results live in the state file at
TOOLGATE_STATE_DBand survive a restart; a task the stopped process had not finished ends
failedwithOUTCOME_UNKNOWN.memorystays the default. A call whose task cannot be
stored gets the retryableTASK_STORE_UNAVAILABLEand nothing runs. TheTaskStoreport
listsactive()tasks instead ofall(). -
The Java standalone runtime reserves business keys (M0 part 9). Tools that require a key, or
declarebusinessKeyArgument, run only after the key (from that argument or the
Idempotency-Keyheader) is reserved in a local SQLite store atTOOLGATE_STATE_DB. Repeats
return the first result or task; other arguments getIDEMPOTENCY_CONFLICT, another caller
of aTENANTkey getsIDEMPOTENCY_KEY_IN_USE, a running repeat getsIN_PROGRESS, and a
key pastTOOLGATE_BUSINESS_KEY_RETENTIONgetsEXPIRED_KEY.@Idempotencyforwards the key
upstream per namespace (a.<hash>.<key>,u.<hash>.<key>or the rawTENANTkey). Such
tools no longer refuse startup. -
The Java standalone runtime has the routes HTTP client (M0 part 8).
context.http()calls
only the routes a tool lists, with path variables matched against their patterns (never
/), allowlisted query names and headers, the route's size limits and a timeout a call
can only shorten. Destination hosts come fromTOOLGATE_DESTINATION_<HOSTSETTING>or
toolgate.dev.json, SPKI pins are enforced, andAPI_KEY,BASICand OAuth 2.0 client
credentials come from local secrets. Failures map toUPSTREAM_4XX,UPSTREAM_5XX,
UPSTREAM_TIMEOUTandUPSTREAM_CONNECTIONwitheffectUncertain, and a ledger tool whose
request was sent without a complete answer endsOUTCOME_UNKNOWN. The processor now
refuses a route path variable without a pattern, and descriptor vector tool-03 declares
/orders/{orderId:[0-9]{6,12}}/refunds, so its digest changed. -
The Java standalone runtime verifies bearer tokens (M0 part 7, adapter A4). With
TOOLGATE_AUTH_*it checks JWTs against a JWKS URL or...
ToolGate manual development a97c383a6998
Manual development build for commit a97c383a69986c8ec86153b87f87708229adb8fa.
No CI verification, tests, scans, smoke tests, or signing were run.
Library version: 1.0.0-dev.38367764127.1.ga97c383a6998. Container digests and checksums are attached.
OLO ToolGate 0.10.0-dev release notes
Contracts version: 1.0.0.
License: Apache-2.0. See LICENSE and bundled third-party notices/SBOMs.
Changelog
All notable project changes should be documented here.
The project follows semantic versioning once stable versioning begins.
0.10.0-dev
-
Java tools ship as one self-contained executable.
toolgatePackageand the Mavenpackage
goal stageartifacts/tool.jar, a deterministic fat jar of the tool jar and its whole runtime
class path withMain-Class: io.ololabs.toolgate.runtime.Main, in place ofapp.jarand
libs.zip; a device needs only a JRE, andjava -jar tool.jarserves the tools over stdio.
Resources go to the first jar that has them,META-INF/servicesfiles are merged, signatures
andmodule-infoare dropped, and two different copies of one class fail the build. The
packager, Control and the Tool Host refuse a Java tool that names anything but one jar, so the
permit's pinned artifact digest now covers everything the tool runs. -
Server tools run on any Tool Host, local or remote, and move by switching the device (M0
part 15). A deployment may name its Tool Hosts (hostIdsonPackageDeploymentRequestand
PackageDeployment; none means every host); Control's placement sends a call only to a host
the deployment names, so deploying the same version to another host moves its tools. An
enrolled Tool Host also fetches its calls from Control (pull mode) over its device
certificate:POST /api/control/v1/tool-hosts/dispatches/next, then.../{id}/admission
and.../{id}/result, so a laptop behind NAT runs tools without an inbound route. When the
Gateway has no route to the placed host it queues the signedDispatchat
POST /api/control/v1/access/dispatchesand readsToolHostDispatchStatusfrom
GET .../access/dispatches/{id}until the result arrives; the permit is still verified and
consumed once, on the host. New contract modelsToolHostDispatchStateand
ToolHostDispatchStatus; Postgres migration V21 and SQLite V14 add the dispatch queue. The
console's deploy form takes the Tool Hosts and the versions table shows where each runs. The
quickstart image runs a second, pull-only Tool Host, andtools/quickstart/check.pycalls the
starter tool on the first host, redeploys it to the second and calls it again there. -
A community guide to building MCP tools with the Tool SDK,
TOOL-SDK-GUIDE.mdat the
repository root. It covers authoring, values, routes, errors, effects, testing, standalone use,
packaging and running under ToolGate. The same file ships in thetoolgate-sdk-apijar as
META-INF/toolgate/TOOL-SDK-GUIDE.mdand prints withtoolgate guide. -
Java server tools run end to end through
/mcp(M0 part 14). Control takes a.tgpkgat
POST /api/control/v1/packages/uploads(Super Admin), applies the packager's archive rules,
CHECKSUMS and descriptor digests, and stores the exact bytes;POST .../packages/deployments
makes a version the one Tool Hosts run, with values for its globals and destination host
settings, writing the service profile, the globals document, a disabled directory entry per
new tool and its resource extractor. The Tool Host enrolls as a device (CSR, administrator
approval, renewal on check-in), registers, fetches its assignments and their content by
digest, and checks in with the tools it can run, so Control's placement sends it calls like
any device. The Gateway gainstoolHosts: a call placed on one gets a permit from Control's
v2 reserve and is dispatched to the host; Control takes the host's v2 consume and result
report. The console gains a Server packages page, the quickstart image runs a Tool Host, and
tools/quickstart/check.pyuploads and deploys thetoolgate initstarter and calls its
Java tool through the Gateway, then revokes its grants and checks it disappears. Deploying
adds new tools to the default Tool Group, a bareruntimes.javaPathis resolved on the host's
PATHat startup, and the quickstart proxy accepts configuration snapshots up to 2 MiB. -
The Tool Host runs server tools from verified packages (M0 part 13).
apps/tool-host
admits a Gateway dispatch only with an RS256 invocation permit Control signed for that host
(issuer, audience, admission window, single-usejti, arguments digest), finds the package,
service profile and globals in its content store by the digests the permit pins, claims the
permit at Control'spermits/consume, and answersADMITTEDwith the fencing token or a
definitiveREFUSEDreason. It then runs the tool's runtime with a clean environment over
tool protocol v2 and reports the outcome toeffects/report; a crash or timeout is
OUTCOME_UNKNOWNfor ledger tools. Route calls go through a per-invocation broker on a Unix
socket with a capability: only the permit's routes as the service profile approves them,
checked path variables, allowlisted query names and headers, connect-time address checks,
TLS by system roots, CA bundle or SPKI pin, andAPI_KEYorBASICcredentials added by
the broker from Control. The Java runtime gains governed mode (TOOLGATE_PROTOCOL=2), and
apps/tool-host/e2e/run.shruns thetoolgate initstarter's package through the host.
Control's Tool Host endpoints and Gateway dispatch follow. -
The
toolgateCLI creates and drives tool projects (M0 part 12).toolgate init <name>
writes the Java starter for Gradle (the default) or Maven (--build maven): a tool reading a
global through its typed accessor, a tool calling a declared route with a recorded exchange,
examples, aToolHarnesstest and a git-ignoredtoolgate.dev.json. In a project,
toolgate devserves the tools over stdio (or--httpon loopback),toolgate dev --digestsprints the descriptor digests,toolgate check(andtoolgate validate <dir>)
runs the tests and examples, andtoolgate packbuilds and validates the.tgpkg. The CLI
drives each build through one adapter per language and build tool, and starters are layered
templates embedded in the binary, so a new language adds a starter and an adapter.
./gradlew publishJavaSdkToMavenLocalpublishes the SDK where starters find it. The Java
end-to-end run now builds the starter instead of a separate sample. -
The Java Tool SDK is complete for standalone use (M0 part 11).
context.tcp()connects only
to the TCP destinations a tool lists, directly or through a socket factory. The processor
proves URL-style convenience calls at build time (literal arguments, exactly one route the
tool lists), refuses reflective access to the network API, checks literalget*Valuenames
and types, and generates<Class>Varstyped accessors; it now analyses after javac's own
attribution.toolgate-sdk-testingaddsToolHarness, which runs tools in test mode with
fixtures and recorded route exchanges in a shared format (spec/authoring/testing.md);
@Examplegainsexchanges, and examples travel in the package index. The Gradle plugin
io.ololabs.toolgate.sdkandtoolgate-maven-pluginadddev,checkandpackage
over the sharedtoolgate-sdk-build, which stagesapp.jarplus a deterministic
libs.zipand packs with thetoolgateCLI../gradlew publishJavaSdkLocallypublishes
the SDK tobuild/sdk-repo, andtool-sdk/java-sdk/e2e/run.shbuilds a sample with both
plugins end to end. -
The Java standalone runtime can keep tasks in SQLite (M0 part 10). With
TOOLGATE_TASK_STORE=sqlitetasks and their results live in the state file at
TOOLGATE_STATE_DBand survive a restart; a task the stopped process had not finished ends
failedwithOUTCOME_UNKNOWN.memorystays the default. A call whose task cannot be
stored gets the retryableTASK_STORE_UNAVAILABLEand nothing runs. TheTaskStoreport
listsactive()tasks instead ofall(). -
The Java standalone runtime reserves business keys (M0 part 9). Tools that require a key, or
declarebusinessKeyArgument, run only after the key (from that argument or the
Idempotency-Keyheader) is reserved in a local SQLite store atTOOLGATE_STATE_DB. Repeats
return the first result or task; other arguments getIDEMPOTENCY_CONFLICT, another caller
of aTENANTkey getsIDEMPOTENCY_KEY_IN_USE, a running repeat getsIN_PROGRESS, and a
key pastTOOLGATE_BUSINESS_KEY_RETENTIONgetsEXPIRED_KEY.@Idempotencyforwards the key
upstream per namespace (a.<hash>.<key>,u.<hash>.<key>or the rawTENANTkey). Such
tools no longer refuse startup. -
The Java standalone runtime has the routes HTTP client (M0 part 8).
context.http()calls
only the routes a tool lists, with path variables matched against their patterns (never
/), allowlisted query names and headers, the route's size limits and a timeout a call
can only shorten. Destination hosts come fromTOOLGATE_DESTINATION_<HOSTSETTING>or
toolgate.dev.json, SPKI pins are enforced, andAPI_KEY,BASICand OAuth 2.0 client
credentials come from local secrets. Failures map toUPSTREAM_4XX,UPSTREAM_5XX,
UPSTREAM_TIMEOUTandUPSTREAM_CONNECTIONwitheffectUncertain, and a ledger tool whose
request was sent without a complete answer endsOUTCOME_UNKNOWN. The processor now
refuses a route path variable without a pattern, and descriptor vector tool-03 declares
/orders/{orderId:[0-9]{6,12}}/refunds, so its digest changed. -
The Java standalone runtime verifies bearer tokens (M0 part 7, adapter A4). With
TOOLGATE_AUTH_*it checks JWTs against a JWKS URL or...
ToolGate development a706a3db0056
Development artifacts for commit a706a3db0056d34107929bd5102b2a8121a34e28.
Maven: io.ololabs.toolgate:toolgate-contracts:1.0.0-dev.38375150142.ga706a3db0056.
Six native client packages retain the tested source version 0.10.0-dev; their commit identity is recorded in development-release.json.
Container digests and checksums are included.
OLO ToolGate 0.10.0-dev release notes
Contracts version: 1.0.0.
License: Apache-2.0. See LICENSE and bundled third-party notices/SBOMs.
Changelog
All notable project changes should be documented here.
The project follows semantic versioning once stable versioning begins.
0.10.0-dev
-
Java tools ship as one self-contained executable.
toolgatePackageand the Mavenpackage
goal stageartifacts/tool.jar, a deterministic fat jar of the tool jar and its whole runtime
class path withMain-Class: io.ololabs.toolgate.runtime.Main, in place ofapp.jarand
libs.zip; a device needs only a JRE, andjava -jar tool.jarserves the tools over stdio.
Resources go to the first jar that has them,META-INF/servicesfiles are merged, signatures
andmodule-infoare dropped, and two different copies of one class fail the build. The
packager, Control and the Tool Host refuse a Java tool that names anything but one jar, so the
permit's pinned artifact digest now covers everything the tool runs. -
Server tools run on any Tool Host, local or remote, and move by switching the device (M0
part 15). A deployment may name its Tool Hosts (hostIdsonPackageDeploymentRequestand
PackageDeployment; none means every host); Control's placement sends a call only to a host
the deployment names, so deploying the same version to another host moves its tools. An
enrolled Tool Host also fetches its calls from Control (pull mode) over its device
certificate:POST /api/control/v1/tool-hosts/dispatches/next, then.../{id}/admission
and.../{id}/result, so a laptop behind NAT runs tools without an inbound route. When the
Gateway has no route to the placed host it queues the signedDispatchat
POST /api/control/v1/access/dispatchesand readsToolHostDispatchStatusfrom
GET .../access/dispatches/{id}until the result arrives; the permit is still verified and
consumed once, on the host. New contract modelsToolHostDispatchStateand
ToolHostDispatchStatus; Postgres migration V21 and SQLite V14 add the dispatch queue. The
console's deploy form takes the Tool Hosts and the versions table shows where each runs. The
quickstart image runs a second, pull-only Tool Host, andtools/quickstart/check.pycalls the
starter tool on the first host, redeploys it to the second and calls it again there. -
A community guide to building MCP tools with the Tool SDK,
TOOL-SDK-GUIDE.mdat the
repository root. It covers authoring, values, routes, errors, effects, testing, standalone use,
packaging and running under ToolGate. The same file ships in thetoolgate-sdk-apijar as
META-INF/toolgate/TOOL-SDK-GUIDE.mdand prints withtoolgate guide. -
Java server tools run end to end through
/mcp(M0 part 14). Control takes a.tgpkgat
POST /api/control/v1/packages/uploads(Super Admin), applies the packager's archive rules,
CHECKSUMS and descriptor digests, and stores the exact bytes;POST .../packages/deployments
makes a version the one Tool Hosts run, with values for its globals and destination host
settings, writing the service profile, the globals document, a disabled directory entry per
new tool and its resource extractor. The Tool Host enrolls as a device (CSR, administrator
approval, renewal on check-in), registers, fetches its assignments and their content by
digest, and checks in with the tools it can run, so Control's placement sends it calls like
any device. The Gateway gainstoolHosts: a call placed on one gets a permit from Control's
v2 reserve and is dispatched to the host; Control takes the host's v2 consume and result
report. The console gains a Server packages page, the quickstart image runs a Tool Host, and
tools/quickstart/check.pyuploads and deploys thetoolgate initstarter and calls its
Java tool through the Gateway, then revokes its grants and checks it disappears. Deploying
adds new tools to the default Tool Group, a bareruntimes.javaPathis resolved on the host's
PATHat startup, and the quickstart proxy accepts configuration snapshots up to 2 MiB. -
The Tool Host runs server tools from verified packages (M0 part 13).
apps/tool-host
admits a Gateway dispatch only with an RS256 invocation permit Control signed for that host
(issuer, audience, admission window, single-usejti, arguments digest), finds the package,
service profile and globals in its content store by the digests the permit pins, claims the
permit at Control'spermits/consume, and answersADMITTEDwith the fencing token or a
definitiveREFUSEDreason. It then runs the tool's runtime with a clean environment over
tool protocol v2 and reports the outcome toeffects/report; a crash or timeout is
OUTCOME_UNKNOWNfor ledger tools. Route calls go through a per-invocation broker on a Unix
socket with a capability: only the permit's routes as the service profile approves them,
checked path variables, allowlisted query names and headers, connect-time address checks,
TLS by system roots, CA bundle or SPKI pin, andAPI_KEYorBASICcredentials added by
the broker from Control. The Java runtime gains governed mode (TOOLGATE_PROTOCOL=2), and
apps/tool-host/e2e/run.shruns thetoolgate initstarter's package through the host.
Control's Tool Host endpoints and Gateway dispatch follow. -
The
toolgateCLI creates and drives tool projects (M0 part 12).toolgate init <name>
writes the Java starter for Gradle (the default) or Maven (--build maven): a tool reading a
global through its typed accessor, a tool calling a declared route with a recorded exchange,
examples, aToolHarnesstest and a git-ignoredtoolgate.dev.json. In a project,
toolgate devserves the tools over stdio (or--httpon loopback),toolgate dev --digestsprints the descriptor digests,toolgate check(andtoolgate validate <dir>)
runs the tests and examples, andtoolgate packbuilds and validates the.tgpkg. The CLI
drives each build through one adapter per language and build tool, and starters are layered
templates embedded in the binary, so a new language adds a starter and an adapter.
./gradlew publishJavaSdkToMavenLocalpublishes the SDK where starters find it. The Java
end-to-end run now builds the starter instead of a separate sample. -
The Java Tool SDK is complete for standalone use (M0 part 11).
context.tcp()connects only
to the TCP destinations a tool lists, directly or through a socket factory. The processor
proves URL-style convenience calls at build time (literal arguments, exactly one route the
tool lists), refuses reflective access to the network API, checks literalget*Valuenames
and types, and generates<Class>Varstyped accessors; it now analyses after javac's own
attribution.toolgate-sdk-testingaddsToolHarness, which runs tools in test mode with
fixtures and recorded route exchanges in a shared format (spec/authoring/testing.md);
@Examplegainsexchanges, and examples travel in the package index. The Gradle plugin
io.ololabs.toolgate.sdkandtoolgate-maven-pluginadddev,checkandpackage
over the sharedtoolgate-sdk-build, which stagesapp.jarplus a deterministic
libs.zipand packs with thetoolgateCLI../gradlew publishJavaSdkLocallypublishes
the SDK tobuild/sdk-repo, andtool-sdk/java-sdk/e2e/run.shbuilds a sample with both
plugins end to end. -
The Java standalone runtime can keep tasks in SQLite (M0 part 10). With
TOOLGATE_TASK_STORE=sqlitetasks and their results live in the state file at
TOOLGATE_STATE_DBand survive a restart; a task the stopped process had not finished ends
failedwithOUTCOME_UNKNOWN.memorystays the default. A call whose task cannot be
stored gets the retryableTASK_STORE_UNAVAILABLEand nothing runs. TheTaskStoreport
listsactive()tasks instead ofall(). -
The Java standalone runtime reserves business keys (M0 part 9). Tools that require a key, or
declarebusinessKeyArgument, run only after the key (from that argument or the
Idempotency-Keyheader) is reserved in a local SQLite store atTOOLGATE_STATE_DB. Repeats
return the first result or task; other arguments getIDEMPOTENCY_CONFLICT, another caller
of aTENANTkey getsIDEMPOTENCY_KEY_IN_USE, a running repeat getsIN_PROGRESS, and a
key pastTOOLGATE_BUSINESS_KEY_RETENTIONgetsEXPIRED_KEY.@Idempotencyforwards the key
upstream per namespace (a.<hash>.<key>,u.<hash>.<key>or the rawTENANTkey). Such
tools no longer refuse startup. -
The Java standalone runtime has the routes HTTP client (M0 part 8).
context.http()calls
only the routes a tool lists, with path variables matched against their patterns (never
/), allowlisted query names and headers, the route's size limits and a timeout a call
can only shorten. Destination hosts come fromTOOLGATE_DESTINATION_<HOSTSETTING>or
toolgate.dev.json, SPKI pins are enforced, andAPI_KEY,BASICand OAuth 2.0 client
credentials come from local secrets. Failures map toUPSTREAM_4XX,UPSTREAM_5XX,
UPSTREAM_TIMEOUTandUPSTREAM_CONNECTIONwitheffectUncertain, and a ledger tool whose
request was sent without a complete answer endsOUTCOME_UNKNOWN. The processor now
refuses a route path variable without a pattern, and descriptor vector tool-03 declares
/orders/{orderId:[0-9]{6,12}}/refunds, so its digest changed. -
The Java standalone runtime verifies bearer...
ToolGate manual development 0ded652e7c61
Manual development build for commit 0ded652e7c6152c1bbe9195196bc352f6138f7fd.
No CI verification, tests, scans, smoke tests, or signing were run.
Library version: 1.0.0-dev.38424763727.1.g0ded652e7c61. Container digests and checksums are attached.
OLO ToolGate 0.10.0-dev release notes
Contracts version: 1.0.0.
License: Apache-2.0. See LICENSE and bundled third-party notices/SBOMs.
Changelog
All notable project changes should be documented here.
The project follows semantic versioning once stable versioning begins.
0.10.0-dev
-
Java tools ship as one self-contained executable.
toolgatePackageand the Mavenpackage
goal stageartifacts/tool.jar, a deterministic fat jar of the tool jar and its whole runtime
class path withMain-Class: io.ololabs.toolgate.runtime.Main, in place ofapp.jarand
libs.zip; a device needs only a JRE, andjava -jar tool.jarserves the tools over stdio.
Resources go to the first jar that has them,META-INF/servicesfiles are merged, signatures
andmodule-infoare dropped, and two different copies of one class fail the build. The
packager, Control and the Tool Host refuse a Java tool that names anything but one jar, so the
permit's pinned artifact digest now covers everything the tool runs. -
Server tools run on any Tool Host, local or remote, and move by switching the device (M0
part 15). A deployment may name its Tool Hosts (hostIdsonPackageDeploymentRequestand
PackageDeployment; none means every host); Control's placement sends a call only to a host
the deployment names, so deploying the same version to another host moves its tools. An
enrolled Tool Host also fetches its calls from Control (pull mode) over its device
certificate:POST /api/control/v1/tool-hosts/dispatches/next, then.../{id}/admission
and.../{id}/result, so a laptop behind NAT runs tools without an inbound route. When the
Gateway has no route to the placed host it queues the signedDispatchat
POST /api/control/v1/access/dispatchesand readsToolHostDispatchStatusfrom
GET .../access/dispatches/{id}until the result arrives; the permit is still verified and
consumed once, on the host. New contract modelsToolHostDispatchStateand
ToolHostDispatchStatus; Postgres migration V21 and SQLite V14 add the dispatch queue. The
console's deploy form takes the Tool Hosts and the versions table shows where each runs. The
quickstart image runs a second, pull-only Tool Host, andtools/quickstart/check.pycalls the
starter tool on the first host, redeploys it to the second and calls it again there. -
A community guide to building MCP tools with the Tool SDK,
TOOL-SDK-GUIDE.mdat the
repository root. It covers authoring, values, routes, errors, effects, testing, standalone use,
packaging and running under ToolGate. The same file ships in thetoolgate-sdk-apijar as
META-INF/toolgate/TOOL-SDK-GUIDE.mdand prints withtoolgate guide. -
Java server tools run end to end through
/mcp(M0 part 14). Control takes a.tgpkgat
POST /api/control/v1/packages/uploads(Super Admin), applies the packager's archive rules,
CHECKSUMS and descriptor digests, and stores the exact bytes;POST .../packages/deployments
makes a version the one Tool Hosts run, with values for its globals and destination host
settings, writing the service profile, the globals document, a disabled directory entry per
new tool and its resource extractor. The Tool Host enrolls as a device (CSR, administrator
approval, renewal on check-in), registers, fetches its assignments and their content by
digest, and checks in with the tools it can run, so Control's placement sends it calls like
any device. The Gateway gainstoolHosts: a call placed on one gets a permit from Control's
v2 reserve and is dispatched to the host; Control takes the host's v2 consume and result
report. The console gains a Server packages page, the quickstart image runs a Tool Host, and
tools/quickstart/check.pyuploads and deploys thetoolgate initstarter and calls its
Java tool through the Gateway, then revokes its grants and checks it disappears. Deploying
adds new tools to the default Tool Group, a bareruntimes.javaPathis resolved on the host's
PATHat startup, and the quickstart proxy accepts configuration snapshots up to 2 MiB. -
The Tool Host runs server tools from verified packages (M0 part 13).
apps/tool-host
admits a Gateway dispatch only with an RS256 invocation permit Control signed for that host
(issuer, audience, admission window, single-usejti, arguments digest), finds the package,
service profile and globals in its content store by the digests the permit pins, claims the
permit at Control'spermits/consume, and answersADMITTEDwith the fencing token or a
definitiveREFUSEDreason. It then runs the tool's runtime with a clean environment over
tool protocol v2 and reports the outcome toeffects/report; a crash or timeout is
OUTCOME_UNKNOWNfor ledger tools. Route calls go through a per-invocation broker on a Unix
socket with a capability: only the permit's routes as the service profile approves them,
checked path variables, allowlisted query names and headers, connect-time address checks,
TLS by system roots, CA bundle or SPKI pin, andAPI_KEYorBASICcredentials added by
the broker from Control. The Java runtime gains governed mode (TOOLGATE_PROTOCOL=2), and
apps/tool-host/e2e/run.shruns thetoolgate initstarter's package through the host.
Control's Tool Host endpoints and Gateway dispatch follow. -
The
toolgateCLI creates and drives tool projects (M0 part 12).toolgate init <name>
writes the Java starter for Gradle (the default) or Maven (--build maven): a tool reading a
global through its typed accessor, a tool calling a declared route with a recorded exchange,
examples, aToolHarnesstest and a git-ignoredtoolgate.dev.json. In a project,
toolgate devserves the tools over stdio (or--httpon loopback),toolgate dev --digestsprints the descriptor digests,toolgate check(andtoolgate validate <dir>)
runs the tests and examples, andtoolgate packbuilds and validates the.tgpkg. The CLI
drives each build through one adapter per language and build tool, and starters are layered
templates embedded in the binary, so a new language adds a starter and an adapter.
./gradlew publishJavaSdkToMavenLocalpublishes the SDK where starters find it. The Java
end-to-end run now builds the starter instead of a separate sample. -
The Java Tool SDK is complete for standalone use (M0 part 11).
context.tcp()connects only
to the TCP destinations a tool lists, directly or through a socket factory. The processor
proves URL-style convenience calls at build time (literal arguments, exactly one route the
tool lists), refuses reflective access to the network API, checks literalget*Valuenames
and types, and generates<Class>Varstyped accessors; it now analyses after javac's own
attribution.toolgate-sdk-testingaddsToolHarness, which runs tools in test mode with
fixtures and recorded route exchanges in a shared format (spec/authoring/testing.md);
@Examplegainsexchanges, and examples travel in the package index. The Gradle plugin
io.ololabs.toolgate.sdkandtoolgate-maven-pluginadddev,checkandpackage
over the sharedtoolgate-sdk-build, which stagesapp.jarplus a deterministic
libs.zipand packs with thetoolgateCLI../gradlew publishJavaSdkLocallypublishes
the SDK tobuild/sdk-repo, andtool-sdk/java-sdk/e2e/run.shbuilds a sample with both
plugins end to end. -
The Java standalone runtime can keep tasks in SQLite (M0 part 10). With
TOOLGATE_TASK_STORE=sqlitetasks and their results live in the state file at
TOOLGATE_STATE_DBand survive a restart; a task the stopped process had not finished ends
failedwithOUTCOME_UNKNOWN.memorystays the default. A call whose task cannot be
stored gets the retryableTASK_STORE_UNAVAILABLEand nothing runs. TheTaskStoreport
listsactive()tasks instead ofall(). -
The Java standalone runtime reserves business keys (M0 part 9). Tools that require a key, or
declarebusinessKeyArgument, run only after the key (from that argument or the
Idempotency-Keyheader) is reserved in a local SQLite store atTOOLGATE_STATE_DB. Repeats
return the first result or task; other arguments getIDEMPOTENCY_CONFLICT, another caller
of aTENANTkey getsIDEMPOTENCY_KEY_IN_USE, a running repeat getsIN_PROGRESS, and a
key pastTOOLGATE_BUSINESS_KEY_RETENTIONgetsEXPIRED_KEY.@Idempotencyforwards the key
upstream per namespace (a.<hash>.<key>,u.<hash>.<key>or the rawTENANTkey). Such
tools no longer refuse startup. -
The Java standalone runtime has the routes HTTP client (M0 part 8).
context.http()calls
only the routes a tool lists, with path variables matched against their patterns (never
/), allowlisted query names and headers, the route's size limits and a timeout a call
can only shorten. Destination hosts come fromTOOLGATE_DESTINATION_<HOSTSETTING>or
toolgate.dev.json, SPKI pins are enforced, andAPI_KEY,BASICand OAuth 2.0 client
credentials come from local secrets. Failures map toUPSTREAM_4XX,UPSTREAM_5XX,
UPSTREAM_TIMEOUTandUPSTREAM_CONNECTIONwitheffectUncertain, and a ledger tool whose
request was sent without a complete answer endsOUTCOME_UNKNOWN. The processor now
refuses a route path variable without a pattern, and descriptor vector tool-03 declares
/orders/{orderId:[0-9]{6,12}}/refunds, so its digest changed. -
The Java standalone runtime verifies bearer tokens (M0 part 7, adapter A4). With
TOOLGATE_AUTH_*it checks JWTs against a JWKS URL or...
ToolGate manual development a827cb102db1
Manual development build for commit a827cb102db1e21d83f696d011096524e9206663.
No CI verification, tests, scans, smoke tests, or signing were run.
Library version: 1.0.0-dev.38318337891.1.ga827cb102db1. Container digests and checksums are attached.
OLO ToolGate 0.10.0-dev release notes
Contracts version: 1.0.0.
License: Apache-2.0. See LICENSE and bundled third-party notices/SBOMs.
Changelog
All notable project changes should be documented here.
The project follows semantic versioning once stable versioning begins.
0.10.0-dev
-
Java tools ship as one self-contained executable.
toolgatePackageand the Mavenpackage
goal stageartifacts/tool.jar, a deterministic fat jar of the tool jar and its whole runtime
class path withMain-Class: io.ololabs.toolgate.runtime.Main, in place ofapp.jarand
libs.zip; a device needs only a JRE, andjava -jar tool.jarserves the tools over stdio.
Resources go to the first jar that has them,META-INF/servicesfiles are merged, signatures
andmodule-infoare dropped, and two different copies of one class fail the build. The
packager, Control and the Tool Host refuse a Java tool that names anything but one jar, so the
permit's pinned artifact digest now covers everything the tool runs. -
Server tools run on any Tool Host, local or remote, and move by switching the device (M0
part 15). A deployment may name its Tool Hosts (hostIdsonPackageDeploymentRequestand
PackageDeployment; none means every host); Control's placement sends a call only to a host
the deployment names, so deploying the same version to another host moves its tools. An
enrolled Tool Host also fetches its calls from Control (pull mode) over its device
certificate:POST /api/control/v1/tool-hosts/dispatches/next, then.../{id}/admission
and.../{id}/result, so a laptop behind NAT runs tools without an inbound route. When the
Gateway has no route to the placed host it queues the signedDispatchat
POST /api/control/v1/access/dispatchesand readsToolHostDispatchStatusfrom
GET .../access/dispatches/{id}until the result arrives; the permit is still verified and
consumed once, on the host. New contract modelsToolHostDispatchStateand
ToolHostDispatchStatus; Postgres migration V21 and SQLite V14 add the dispatch queue. The
console's deploy form takes the Tool Hosts and the versions table shows where each runs. The
quickstart image runs a second, pull-only Tool Host, andtools/quickstart/check.pycalls the
starter tool on the first host, redeploys it to the second and calls it again there. -
A community guide to building MCP tools with the Tool SDK,
TOOL-SDK-GUIDE.mdat the
repository root. It covers authoring, values, routes, errors, effects, testing, standalone use,
packaging and running under ToolGate. The same file ships in thetoolgate-sdk-apijar as
META-INF/toolgate/TOOL-SDK-GUIDE.mdand prints withtoolgate guide. -
Java server tools run end to end through
/mcp(M0 part 14). Control takes a.tgpkgat
POST /api/control/v1/packages/uploads(Super Admin), applies the packager's archive rules,
CHECKSUMS and descriptor digests, and stores the exact bytes;POST .../packages/deployments
makes a version the one Tool Hosts run, with values for its globals and destination host
settings, writing the service profile, the globals document, a disabled directory entry per
new tool and its resource extractor. The Tool Host enrolls as a device (CSR, administrator
approval, renewal on check-in), registers, fetches its assignments and their content by
digest, and checks in with the tools it can run, so Control's placement sends it calls like
any device. The Gateway gainstoolHosts: a call placed on one gets a permit from Control's
v2 reserve and is dispatched to the host; Control takes the host's v2 consume and result
report. The console gains a Server packages page, the quickstart image runs a Tool Host, and
tools/quickstart/check.pyuploads and deploys thetoolgate initstarter and calls its
Java tool through the Gateway, then revokes its grants and checks it disappears. Deploying
adds new tools to the default Tool Group, a bareruntimes.javaPathis resolved on the host's
PATHat startup, and the quickstart proxy accepts configuration snapshots up to 2 MiB. -
The Tool Host runs server tools from verified packages (M0 part 13).
apps/tool-host
admits a Gateway dispatch only with an RS256 invocation permit Control signed for that host
(issuer, audience, admission window, single-usejti, arguments digest), finds the package,
service profile and globals in its content store by the digests the permit pins, claims the
permit at Control'spermits/consume, and answersADMITTEDwith the fencing token or a
definitiveREFUSEDreason. It then runs the tool's runtime with a clean environment over
tool protocol v2 and reports the outcome toeffects/report; a crash or timeout is
OUTCOME_UNKNOWNfor ledger tools. Route calls go through a per-invocation broker on a Unix
socket with a capability: only the permit's routes as the service profile approves them,
checked path variables, allowlisted query names and headers, connect-time address checks,
TLS by system roots, CA bundle or SPKI pin, andAPI_KEYorBASICcredentials added by
the broker from Control. The Java runtime gains governed mode (TOOLGATE_PROTOCOL=2), and
apps/tool-host/e2e/run.shruns thetoolgate initstarter's package through the host.
Control's Tool Host endpoints and Gateway dispatch follow. -
The
toolgateCLI creates and drives tool projects (M0 part 12).toolgate init <name>
writes the Java starter for Gradle (the default) or Maven (--build maven): a tool reading a
global through its typed accessor, a tool calling a declared route with a recorded exchange,
examples, aToolHarnesstest and a git-ignoredtoolgate.dev.json. In a project,
toolgate devserves the tools over stdio (or--httpon loopback),toolgate dev --digestsprints the descriptor digests,toolgate check(andtoolgate validate <dir>)
runs the tests and examples, andtoolgate packbuilds and validates the.tgpkg. The CLI
drives each build through one adapter per language and build tool, and starters are layered
templates embedded in the binary, so a new language adds a starter and an adapter.
./gradlew publishJavaSdkToMavenLocalpublishes the SDK where starters find it. The Java
end-to-end run now builds the starter instead of a separate sample. -
The Java Tool SDK is complete for standalone use (M0 part 11).
context.tcp()connects only
to the TCP destinations a tool lists, directly or through a socket factory. The processor
proves URL-style convenience calls at build time (literal arguments, exactly one route the
tool lists), refuses reflective access to the network API, checks literalget*Valuenames
and types, and generates<Class>Varstyped accessors; it now analyses after javac's own
attribution.toolgate-sdk-testingaddsToolHarness, which runs tools in test mode with
fixtures and recorded route exchanges in a shared format (spec/authoring/testing.md);
@Examplegainsexchanges, and examples travel in the package index. The Gradle plugin
io.ololabs.toolgate.sdkandtoolgate-maven-pluginadddev,checkandpackage
over the sharedtoolgate-sdk-build, which stagesapp.jarplus a deterministic
libs.zipand packs with thetoolgateCLI../gradlew publishJavaSdkLocallypublishes
the SDK tobuild/sdk-repo, andtool-sdk/java-sdk/e2e/run.shbuilds a sample with both
plugins end to end. -
The Java standalone runtime can keep tasks in SQLite (M0 part 10). With
TOOLGATE_TASK_STORE=sqlitetasks and their results live in the state file at
TOOLGATE_STATE_DBand survive a restart; a task the stopped process had not finished ends
failedwithOUTCOME_UNKNOWN.memorystays the default. A call whose task cannot be
stored gets the retryableTASK_STORE_UNAVAILABLEand nothing runs. TheTaskStoreport
listsactive()tasks instead ofall(). -
The Java standalone runtime reserves business keys (M0 part 9). Tools that require a key, or
declarebusinessKeyArgument, run only after the key (from that argument or the
Idempotency-Keyheader) is reserved in a local SQLite store atTOOLGATE_STATE_DB. Repeats
return the first result or task; other arguments getIDEMPOTENCY_CONFLICT, another caller
of aTENANTkey getsIDEMPOTENCY_KEY_IN_USE, a running repeat getsIN_PROGRESS, and a
key pastTOOLGATE_BUSINESS_KEY_RETENTIONgetsEXPIRED_KEY.@Idempotencyforwards the key
upstream per namespace (a.<hash>.<key>,u.<hash>.<key>or the rawTENANTkey). Such
tools no longer refuse startup. -
The Java standalone runtime has the routes HTTP client (M0 part 8).
context.http()calls
only the routes a tool lists, with path variables matched against their patterns (never
/), allowlisted query names and headers, the route's size limits and a timeout a call
can only shorten. Destination hosts come fromTOOLGATE_DESTINATION_<HOSTSETTING>or
toolgate.dev.json, SPKI pins are enforced, andAPI_KEY,BASICand OAuth 2.0 client
credentials come from local secrets. Failures map toUPSTREAM_4XX,UPSTREAM_5XX,
UPSTREAM_TIMEOUTandUPSTREAM_CONNECTIONwitheffectUncertain, and a ledger tool whose
request was sent without a complete answer endsOUTCOME_UNKNOWN. The processor now
refuses a route path variable without a pattern, and descriptor vector tool-03 declares
/orders/{orderId:[0-9]{6,12}}/refunds, so its digest changed. -
The Java standalone runtime verifies bearer tokens (M0 part 7, adapter A4). With
TOOLGATE_AUTH_*it checks JWTs against a JWKS URL or...