Skip to content

Array Parameters from MCP Servers Converted to String Type #22

@Mwisho

Description

@Mwisho

Summary

When MCP servers define tool parameters with type: "array", the Relay package incorrectly converts them to string parameters instead of array parameters, causing schema validation failures with AI providers like Anthropic.

Environment

  • Relay version: Latest from composer
  • PHP version: 8.x
  • MCP Server: Gmail MCP Server (@gongrzhe/server-gmail-autoauth-mcp)
  • AI Provider: Anthropic

Steps to Reproduce

  1. Configure an MCP server that returns tool definitions with array parameters:
{
  "name": "send_email",
  "inputSchema": {
    "properties": {
      "to": {
        "type": "array",
        "items": {"type": "string"},
        "description": "List of recipient email addresses"
      }
    }
  }
}
  1. Load tools using Relay::tools('server-name')
  2. Check the parameter schema: $tool->parametersAsArray()

Expected Behavior

The parameter should be converted to an array type:

"to": {
  "description": "List of recipient email addresses",
  "type": "array",
  "items": {
    "type": "string"
  }
}

Actual Behavior

The parameter is incorrectly converted to a string type:

"to": {
  "description": "List of recipient email addresses", 
  "type": "string"
}

Root Cause

In src/Relay.php, the addParametersToTool method (around line 335-340) only handles these types:

  • string
  • number/integer
  • boolean
  • default (falls back to string)

Array types are not handled and fall through to the default case, becoming string parameters.

Current Code (Problematic)

match ($type) {
    'string' => $tool->withStringParameter($name, $description, $required),
    'number', 'integer' => $tool->withNumberParameter($name, $description, $required),
    'boolean' => $tool->withBooleanParameter($name, $description, $required),
    default => $tool->withStringParameter($name, $description, $required), // Arrays end up here!
};

Suggested Fix

Add array type handling:

match ($type) {
    'string' => $tool->withStringParameter($name, $description, $required),
    'number', 'integer' => $tool->withNumberParameter($name, $description, $required),
    'boolean' => $tool->withBooleanParameter($name, $description, $required),
    'array' => {
        $items = $property['items'] ?? [];
        $itemType = $items['type'] ?? 'string';
        $itemSchema = match ($itemType) {
            'string' => new StringSchema(name: 'item', description: 'Array item'),
            'number', 'integer' => new NumberSchema(name: 'item', description: 'Array item'),
            'boolean' => new BooleanSchema(name: 'item', description: 'Array item'),
            default => new StringSchema(name: 'item', description: 'Array item'),
        };
        $tool->withArrayParameter($name, $description, $itemSchema, $required);
    },
    default => $tool->withStringParameter($name, $description, $required),
};

Impact

This bug affects any MCP server that uses array parameters, causing:

  • Schema validation failures with AI providers
  • Incorrect tool call arguments (strings instead of arrays)
  • Runtime errors when tools expect arrays but receive strings

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions