Skip to content

Conversation

@daniel-lxs
Copy link
Member

@daniel-lxs daniel-lxs commented Dec 15, 2025

Problem

OpenAI's API returns an error when MCP tools have nested object schemas that don't have additionalProperties: false:

Invalid schema for function 'mcp--memory--create_entities': 
In context=('properties', 'entities', 'items'), 'additionalProperties' is required to be supplied and to be false.

Solution

Uses Zod schema with .default(false) on additionalProperties. A single schema definition that is both validator AND mutator - no manual property additions needed.

API

Export Description
JsonSchemaSchema Validation only - doesn't modify schema
StrictJsonSchemaSchema Validates AND applies additionalProperties: false to all schemas via Zod's .default()

Usage

// Parse with StrictJsonSchemaSchema - it validates AND applies defaults
const result = StrictJsonSchemaSchema.safeParse(originalSchema)
parameters = result.success ? result.data : originalSchema
// Done. All nested schemas now have additionalProperties: false

Changes

  1. Modified: src/utils/json-schema.ts - Single Zod schema with .default(false) on additionalProperties
  2. Modified: src/core/prompts/tools/native-tools/mcp_server.ts - Uses parsed schema directly
  3. Removed: json-schema-traverse dependency
  4. Updated: Tests verify Zod default behavior (20 tests)

Testing

All 4700+ tests pass.


Important

Adds ToolInputSchema to ensure additionalProperties: false in nested schemas, updates getMcpServerTools(), and adds tests.

  • Behavior:
    • Ensures additionalProperties: false in nested schemas using ToolInputSchema in json-schema.ts.
    • Updates getMcpServerTools() in mcp_server.ts to use ToolInputSchema for schema parsing.
  • Testing:
    • Adds tests in json-schema.spec.ts to verify ToolInputSchema behavior.
  • Dependencies:
    • Removes json-schema-traverse dependency.
    • Fixes zod version in package.json.

This description was created by Ellipsis for a93c1a7. You can customize this summary. It will automatically update as commits are pushed.

@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Dec 15, 2025
@roomote
Copy link
Contributor

roomote bot commented Dec 15, 2025

Rooviewer Clock   See task on Roo Cloud

Review complete. No issues found.

The latest changes pin zod to version 3.25.61 to avoid a TypeScript TS2589 regression introduced in 3.25.76. This is a clean, targeted fix that correctly pins the dependency version and updates the lockfile accordingly.

Previous reviews

Mention @roomote in a comment to request specific changes to this pull request or fix all unresolved issues.

@dosubot dosubot bot added the bug Something isn't working label Dec 15, 2025
@daniel-lxs daniel-lxs moved this from Triage to PR [Needs Review] in Roo Code Roadmap Dec 15, 2025
@dosubot dosubot bot added size:XL This PR changes 500-999 lines, ignoring generated files. and removed size:L This PR changes 100-499 lines, ignoring generated files. labels Dec 15, 2025
@dosubot dosubot bot added size:L This PR changes 100-499 lines, ignoring generated files. and removed size:XL This PR changes 500-999 lines, ignoring generated files. labels Dec 16, 2025
@dosubot dosubot bot added the lgtm This PR has been approved by a maintainer label Dec 16, 2025
OpenAI's API requires additionalProperties: false on all object schemas,
including nested ones. MCP tools like 'create_entities' have array items
that are objects, which were missing this property.

Created a recursive utility function that transforms JSON schemas to
ensure all nested object schemas have additionalProperties: false.
- Add JsonSchema TypeScript interface for type safety
- Add JsonSchemaSchema Zod validator for validating JSON Schema structures
- Add JsonSchemaUtils class with validation methods:
  - validate(): safe validation with result object
  - validateOrThrow(): throws on invalid schema
  - isValid(): type guard for checking validity
  - stripUnknownFields(): sanitize schemas
  - validateAndAddAdditionalPropertiesFalse(): combined validation + transform
- Keep standalone addAdditionalPropertiesFalse() for backwards compatibility
- Expand test coverage from 12 to 29 tests
- Replace custom recursive traversal with json-schema-traverse library
- Library is small (~22KB), has TypeScript types, and is well-tested
- Same author as ajv (most popular JSON Schema validator)
- Simplifies the addAdditionalPropertiesFalse implementation
- All 29 tests still pass
- Keep Zod validation for JSON Schema structure
- Add generic transformJsonSchema() function for extensibility
- Remove unused JsonSchemaUtils class
- Reduce code while maintaining all functionality
- Single schema definition (StrictJsonSchemaSchema) that validates AND applies defaults
- Removed json-schema-traverse dependency
- mcp_server.ts uses parsed schema directly, no manual property additions
- Updated tests to verify Zod default behavior
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working lgtm This PR has been approved by a maintainer PR - Needs Review size:L This PR changes 100-499 lines, ignoring generated files.

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

4 participants