modelcontextprotocol / modelcontextprotocol/php-sdk

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

Open
#510 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

enhancement
Dominant language
PHP
Stars
1.6k
Forks
173
Avg merge
2d 49m
Merged PRs (30d)
23

Description

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.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Locate the inbound JSON-RPC decoding entry point and trace the internal methods that consume decoded messages. Verify how object and array semantics reach Opis\JsonSchema\Validator, then update the affected paths so object values remain stdClass instances and validation succeeds for object-typed tool parameters.

Written by the indexing model from the issue text.

Assessment

Tech stack
php
Domain
api, backend
Issue type
Feature
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
55/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.