Skip to content

fix(tool-servers): the reader offers what an entry can send, and every request names the runtime - #241

Merged
rami-hatoum merged 4 commits into
mainfrom
fix/the-document-reader-offers-what-an-entry-can-send
Oct 18, 2026
Merged

rami-hatoum merged 4 commits into
mainfrom
fix/the-document-reader-offers-what-an-entry-can-send

Conversation

@rami-hatoum

Copy link
Copy Markdown
Contributor

Three rules of the reader of an HTTP API's document left out operations that an entry could call, and one header every request should carry was missing.

An operation with a required header parameter was left out, with the words that a function cannot send a header, even when the entry's headers already sent that header on every call. Several published descriptions declare a client id or an account id as a required header on every operation, which emptied them. An operation whose required header parameters are each named by the entry's headers, compared without case, or placed by the credential of an apiKey scheme the operation's security names, is offered; the parameter is no input of the tool, and the entry's value is sent as every entry header is. A required header the entry does not name still leaves the operation out, now with the words that the entry's headers can give it. Header parameters named Accept, Content-Type or Authorization are ignored, as the OpenAPI specification says they are, and never named in a refusal. A required cookie still leaves an operation out.

A query parameter written explode: false left its operation out whatever its schema, though a scalar is sent the same either way; one published description declares every query parameter so, which emptied every list operation. Only the style decides now: a form query parameter is sent, and a list written explode: false is sent as one key whose items are joined with commas, as the form style defines; spaceDelimited, pipeDelimited, deepObject and an object schema keep their refusals.

The runtime sent whatever its platform's fetch sends as User-Agent, which one API refuses. Every request to a tool server, a document read, an MCP request, an API call, a token request and a metadata read, for the file's entries and for connections alike, carries auto-runtime/<version>, from one fetch composed once in the server; an entry's own User-Agent header replaces it on that server's calls.

Nothing a call records, no bound and no scrubbing changes. The tool-servers and outbound READMEs and the configuration reference say what is left out, how a list is sent and the header a server receives.

@rami-hatoum rami-hatoum changed the title fix(tool-servers): the document reader offers what an entry can send, and every request names the runtime fix(tool-servers): the reader offers what an entry can send, and every request names the runtime Oct 18, 2026
rami-hatoum and others added 4 commits October 18, 2026 17:36
…ch request it sends

withUserAgent wraps a fetch so that each request it sends carries the User-Agent it is given where
the request sets none, and keeps one the caller writes, in whatever case the name is written. It
reads the headers of a request as a Headers, a list of pairs of strings or an object of strings,
and hands headers of any other shape to the fetch beneath as they are, so it never drops a header
it cannot read. Node's fetch otherwise sends User-Agent: node, measured with Node 26.10.0, which
names no client. The tests send requests to a loopback listener and read the header it receives.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ed query list let it send

An operation with a required header parameter was left out, though the entry's headers go with
every call: a document that declares a client or an account id as a required header on every
operation had every operation left out. describedApi, which describes a file's entry and a
connection alike, now gives the rule the names of the entry's headers, read once from the settings
it describes, beside the security and the auth the entry presents. A required header is met by a
header the entry names, compared without regard to case, and by the header an apiKey scheme of the
alternative a call sends places, its value the credential under security. Where the operation
needs a header the entry does not name, requirementOf sends the first alternative the entry gives
whose apiKey schemes place it, and else the first it gives; where the entry gives no alternative,
the headers its alternatives name are met too, so the operation is left out in the words of its
security. A header parameter named Accept, Content-Type or Authorization is ignored, as the OpenAPI
specification says, so the rule never names a header the specification says to ignore. A met
header is no input of the tool, and a call sends it as it sends every header of the entry and
every credential. A required header that is not met still leaves the operation out, in words that
say the headers of the entry can give it, or, for Host and Content-Length, which the runtime sets
itself, that neither a function nor the entry can; a required cookie still leaves it out.

A query parameter written as form with explode false was left out, though a scalar is sent the
same whatever its explode: a document that writes every query parameter so had every operation
that takes a query left out. Such a parameter is now offered, and a call sends a list of it as one
key whose items are joined by commas, each item form-encoded and the commas between them not, as
the form style defines; a scalar is sent as before. A query input carries whether it joins its
lists, and a path input, which always joins, does not. A query style other than form still leaves
the operation out, and so does an object in a query, now in the words of an object whatever its
explode. The words of a style a call does not send name the style alone, since the explode they
named fell back to true, the default of form and of none of those styles.

The fakes record the method, the path and the User-Agent of every request they hear, and the fake
API answers its operation that needs a header with the value it was sent. The tests prove the
whole chain, in that a document whose list is written with explode false, derived and called,
reaches the API joined; an operation that needs the header of a scheme is called with that key;
and every request of an access, for an entry of the file and a connection alike, goes through the
fetch it is given, the reads of a document and of metadata, the requests of tokens and the calls,
a User-Agent among an entry's headers taking its place on that entry's calls alone.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… release as user-agent

The server gave its tool servers no fetch of its own, so each request carried User-Agent: node, the
one Node's fetch sets (measured with Node 26.10.0), which names neither the runtime nor its release.
The composition of the tool access wraps globalThis.fetch once with withUserAgent and
auto-runtime/<version>, the name of the runtime's command and the version of the release the
server announces to an MCP server in clientInfo, since a product token holds no @ or / in its
name, and gives that one fetch to describedToolServers and to makeToolAccess. The read of a
document, every call and the requests for tokens and metadata carry it, for an entry of the file
and a connection alike, and an entry that writes its own User-Agent in headers sends that on its
calls. No other client of the server takes this fetch.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…e user-agent a server gets

The configuration reference lists a required header that the entry's headers do not name and its
security scheme does not place, a required cookie and a query style other than form as what leaves
an operation of an HTTP API out, and says that Accept, Content-Type and Authorization are ignored
as header parameters and that the warning for Host says the server sets it. It says that an
operation needing a header the entry or its scheme gives is offered, that a call sends the
alternative whose apiKey scheme places such a header, that an array written with explode false is
sent as one key of comma-joined items, and that every request to a tool server carries the
User-Agent auto-runtime/<version>, an entry's own taking its place on that server's calls. The
READMEs of tool-servers and outbound name the fetch the server gives its tool servers and where,
and the outbound one names, among the clients that do not take it, the requests to the identity
issuer and those of prediction functions.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@rami-hatoum
rami-hatoum force-pushed the fix/the-document-reader-offers-what-an-entry-can-send branch from b280228 to 110e164 Compare October 18, 2026 16:43
@rami-hatoum
rami-hatoum merged commit 293f5b8 into main Oct 18, 2026
19 checks passed
@rami-hatoum
rami-hatoum deleted the fix/the-document-reader-offers-what-an-entry-can-send branch October 18, 2026 22:51
rami-hatoum pushed a commit that referenced this pull request Oct 19, 2026
🤖 I have created a release *beep* *boop*
---


##
[0.12.0](v0.11.0...v0.12.0)
(2026-10-19)


### ⚠ BREAKING CHANGES

* **connections:** a record says type, a header names its scheme and the
page takes the client id
([#240](#240))

### Features

* **connections:** a record says type, a header names its scheme and the
page takes the client id
([#240](#240))
([1456a96](1456a96))
* **coordination:** a workflow checks its input against its schema
before it starts
([#238](#238))
([8792cc7](8792cc7))
* **definitions:** the overview is kept as data and written at each read
([#245](#245))
([a7a6d61](a7a6d61))
* **json-schema:** the compiler checks six formats on strings, and
refuses any other format
([#237](#237))
([f7a8fa8](f7a8fa8))
* **providers:** the providers a person may connect, shipped as entries,
and add_connection by name
([#243](#243))
([19c4785](19c4785))
* **server:** functions call through the connections people add
([#231](#231))
([b3a2bad](b3a2bad))
* **tool-servers:** search lists the providers a person may connect
([#244](#244))
([69a880f](69a880f))


### Bug Fixes

* **definitions:** a prediction run is a function run
([#236](#236))
([d0032ec](d0032ec))
* **tool-servers:** the reader offers what an entry can send, and every
request names the runtime
([#241](#241))
([293f5b8](293f5b8))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: beonautobot[bot] <298957281+beonautobot[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant