Skip to content

Preserve native JSON types when passing arguments to tool handlers #587

Open

Description

@codekandis

Is your feature request related to a problem? Please describe.

The SDK currently converts JSON objects into associative PHP arrays before passing them to tool handlers. This forces a specific PHP representation on consumers instead of preserving the original JSON types.

Describe the solution you'd like

Pass validated arguments to tool handlers without implicit type conversion:

  • JSON objects → stdClass
  • JSON arrays → array
  • Scalar values → their corresponding PHP types

This should apply recursively to nested structures.

For consumers preferring associative arrays, the SDK could provide an optional, documented recursive stdClass-to-array converter. Its use should be explicitly controlled by the consumer.

Describe alternatives you've considered

A configurable automatic conversion to associative arrays would preserve existing behavior, but introduce application-specific conversion logic and additional maintenance overhead into the SDK's argument-handling pipeline.

Existing Composer packages also provide object-to-array conversion, so consumers could handle this independently without additional SDK functionality.

Additional context

Related to #586, which addresses the loss of JSON type information during decoding and its impact on schema validation.

This request concerns the subsequent delivery of validated values to tool handlers.

The change would be breaking for consumers expecting associative arrays, but could be introduced before the SDK reaches 1.0. Preserving the current interface merely for convenience or backward compatibility would be an unfortunate design decision, as it would perpetuate unnecessary coupling to a specific PHP representation instead of establishing a clean, type-preserving API.

Activity

  1. added
    enhancementRequest for a new feature that's not currently supported
    on Oct 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementRequest for a new feature that's not currently supported

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions