diff --git a/apps/server/src/mcp/advertisedJsonSchema.test.ts b/apps/server/src/mcp/advertisedJsonSchema.test.ts index 09a90556a9dd0..4fb0b58895202 100644 --- a/apps/server/src/mcp/advertisedJsonSchema.test.ts +++ b/apps/server/src/mcp/advertisedJsonSchema.test.ts @@ -33,7 +33,11 @@ it("drops JSON noise, merges tagged unions, and keeps null where it is required" target: { type: "object", properties: { - kind: { type: "string", enum: ["url", "number"] }, + kind: { + type: "string", + enum: ["url", "number"], + description: "`url` requires `url`. `number` requires `number`.", + }, url: { type: "string" }, number: { type: "integer" }, }, diff --git a/apps/server/src/mcp/advertisedJsonSchema.ts b/apps/server/src/mcp/advertisedJsonSchema.ts index 10001307f2d6c..2ba71da70a844 100644 --- a/apps/server/src/mcp/advertisedJsonSchema.ts +++ b/apps/server/src/mcp/advertisedJsonSchema.ts @@ -64,6 +64,18 @@ const mergeTaggedObjects = (branches: ReadonlyArray): JsonObject | undefin const requiredByAll = first.filter( (name) => name !== tag && others.every((required) => required.includes(name)), ); + // Merging drops each tag's own required fields, so the tag says which they are. + const perTag = objects.flatMap((object, index) => { + const own = (index === 0 ? first : others[index - 1]!).filter( + (name) => name !== tag && !requiredByAll.includes(name), + ); + return own.length === 0 + ? [] + : [ + `\`${String(tagOf(object, tag))}\` requires ${own.map((name) => `\`${name}\``).join(", ")}.`, + ]; + }); + if (perTag.length > 0) (properties[tag] as JsonObject).description = perTag.join(" "); return { type: "object", properties, required: [tag, ...requiredByAll] }; }; diff --git a/apps/server/src/provider/agentContextBudget.json b/apps/server/src/provider/agentContextBudget.json index 4439c50940722..8143a8e1e4f9c 100644 --- a/apps/server/src/provider/agentContextBudget.json +++ b/apps/server/src/provider/agentContextBudget.json @@ -1,5 +1,5 @@ { "claudeSystemAppendBytes": 5597, "codexAdditionalContextBytes": 7327, - "mcpToolListJsonBytes": 48217 + "mcpToolListJsonBytes": 48682 }