Repository navigation
fix(tool-servers): the reader offers what an entry can send, and every request names the runtime - #241
Merged
rami-hatoum merged 4 commits intoOct 18, 2026
Conversation
…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
force-pushed
the
fix/the-document-reader-offers-what-an-entry-can-send
branch
from
October 18, 2026 16:43
b280228 to
110e164
Compare
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
headersalready 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 anapiKeyscheme 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 namedAccept,Content-TypeorAuthorizationare 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: falseleft 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: aformquery parameter is sent, and a list writtenexplode: falseis sent as one key whose items are joined with commas, as the form style defines;spaceDelimited,pipeDelimited,deepObjectand an object schema keep their refusals.The runtime sent whatever its platform's
fetchsends asUser-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, carriesauto-runtime/<version>, from one fetch composed once in the server; an entry's ownUser-Agentheader 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.