Skip to content

[Server] Decode JSON-RPC objects as stdClass, not associative arrays #510

Description

@steffans

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

The current implementation uses associative array for the decoding the JSON-RPC message. Which will break the Opis\JsonSchema\Validator since it needs the stdClass for a object as described in the docs. Currently the empty array/object ambiguity exists and the validation fails.

Describe the solution you'd like

Preserve JSON object/array semantics on inbound MCP messages and set associative parameter to false. Update all internal methods to work with stdClass objects instead of associative arrays.

json_decode($input, false, JSON_THROW_ON_ERROR)

Additional context

This feature would allow to work with fully validated object structures with #Schema attribute on input parameters in tool calls. Here is an example how a tool call failed and the model confusion about the parameter typing. The tool method is using this signature: McpServer::updateDocument(array $document) So i asked the model why did it fail, this is the answer:

The document parameter type should be object (not array), and the description should clarify the expected root structure:

{
  "document": {
    "type": "object",
    "description": "Complete document (root object with type, name, version properties)",
    "properties": {
      "type": { "type": "string" },
      "name": { "type": "string" },
      "version": { "type": "string" },
    },
    "required": ["type", "name", "version"]
  }
}

The key fix: changing "type": "array" to "type": "object" and adding a required array so it's explicit what the root document needs.

Activity

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