mirror of
https://github.com/morluto/rea.git
synced 2026-10-26 17:35:11 +00:00
fix(mcp): fit every advertised input schema within the 64 KiB client limit (#7119)
* fix(mcp): fit every advertised input schema within the 64 KiB client limit Claude Desktop drops a local connector tool whose compact-JSON input schema exceeds 64 KiB. The full input profile advertised compare_web_captures at 171,867 bytes and inspect_analysis_view at 71,632 bytes, because the self-contained projection inlines the complete producer capture schemas once per side. The full advertisement now fits the limit at its producing boundary. A property whose schema repeats an earlier sibling's points at it, and schemas below the deepest instance level that fits are summarized as their types, size constraints and descriptions. Every rewrite widens the advertisement through the existing relaxation rules for oneOf, not, if/then/else, contains and unevaluated keywords, so canonical inputs stay accepted and the canonical contract still validates every call. Schemas within the limit are unchanged, and the compact profile is still presented from the complete projection. Numeric const and enum literals are also relaxed in the advertisement, like boolean literals, since Gemini accepts only string enum members. Fixes #4081 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(mcp): keep fitted input summaries widening and at the deepest fitting level Array summaries took item types only from `items`, so a tuple such as `{prefixItems: [{type: string}], items: {type: number}}` was advertised as a number array that rejected `["a", 1]`. Item types now include tuple positions from `prefixItems`, a draft-07 `items` array, and `additionalItems`, and stay unconstrained when later elements are open. A summary can also be longer than the schema it replaces (a nullable array becomes an anyOf), so candidate size is not monotone in the retained depth and stopping at the first overflow could skip a deeper candidate that fits. A schema is now kept whole when its summary is not smaller, and fitting searches from the deepest level down. Property tests check that every summary accepts what its schema accepts over every catalog input subschema and synthetic tuples, and that the fitted schema is the deepest fitting candidate. The browser comparison boundary test now expects a malformed `after` capture to be rejected canonically, since `after` is advertised as the same schema as `before`; the same malformation on `before` stays advertised-invalid. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
aa79f59478
commit
7336a566ac
13 files changed
+1199
-81
No files matched your search
@@ -10,7 +10,7 @@ import {
|
||||
toolContract,
|
||||
} from "../dist/contracts/toolContracts.js";
|
||||
import { advertisedInputJsonSchema } from "../dist/contracts/toolSchemaMetadata.js";
|
||||
import { presentAdvertisedInputSchema } from "../dist/contracts/compactInputSchema.js";
|
||||
import { presentAdvertisedInputProfile } from "../dist/contracts/inputSchemaPresentation.js";
|
||||
import { compactPresentationForMcpInputSchemaProfile } from "../dist/config/mcpInputSchemaProfile.js";
|
||||
import { createVerifierCommands } from "./lib/verify-commands.mjs";
|
||||
import { withVerifierCleanup } from "./lib/verifier-cleanup.mjs";
|
||||
@@ -186,7 +186,7 @@ await withVerifierCleanup(async () => {
|
||||
);
|
||||
assert.deepEqual(
|
||||
tool.parameters,
|
||||
presentAdvertisedInputSchema(
|
||||
presentAdvertisedInputProfile(
|
||||
advertisedInputJsonSchema(
|
||||
toolContract(tool.name.slice(prefix.length)),
|
||||
),
|
||||
|
||||
Reference in new issue
Block a user