Skip to content

Conversation

@panbanda
Copy link

@panbanda panbanda commented Dec 11, 2025

Summary

  • Add omitempty JSON tag to optional URI fields (policy_uri, tos_uri, client_uri, logo_uri) and contacts in the Client struct
  • These fields are now omitted from JSON responses when empty/nil instead of being serialized as "" or null

Problem

When using Dynamic Client Registration (RFC 7591), Hydra returns empty strings for optional URI fields and null for the contacts array when they are not set:

{
  "client_id": "...",
  "logo_uri": "",
  "tos_uri": "",
  "policy_uri": "",
  "client_uri": "",
  "contacts": null
}

This breaks strict JSON validators (e.g., Zod) that expect optional fields to either have valid values or be omitted entirely. RFC 7591 specifies these fields as optional, so omitting them when empty is the correct behavior.

Real-world impact

This issue affects mcp-remote, a tool for connecting to remote MCP (Model Context Protocol) servers. When mcp-remote uses DCR to dynamically register OAuth clients with Hydra, the response fails Zod validation because of the unexpected empty strings and null values for optional fields.

Changes

  • client/client.go: Added omitempty to 5 optional fields
  • client/client_test.go: Added test TestClientJSONOmitsEmptyOptionalURIFields to verify behavior

Testing

go test -v -race ./client/ -run TestClientJSONOmitsEmptyOptionalURIFields

Fixes #4044

@panbanda panbanda requested review from a team and aeneasr as code owners December 11, 2025 17:13
@panbanda panbanda changed the title fix(client): add omitempty to optional URI fields in JSON serialization fix: add omitempty to optional URI fields in Client JSON serialization Dec 11, 2025
Optional fields (policy_uri, tos_uri, client_uri, logo_uri, contacts)
were serialized as empty strings or null when not set. This breaks
strict JSON validators like Zod that expect these fields to either
be present with valid values or omitted entirely.

RFC 7591 specifies these fields as optional, so omitting them when
empty is the correct behavior for DCR responses.
@panbanda panbanda force-pushed the fix/dcr-omitempty-optional-fields branch 3 times, most recently from 1a68a71 to 473f544 Compare December 11, 2025 20:06
Remove contacts field from snapshot to match omitempty serialization
and fix goimports ordering in oryx package files to pass CI format
check.
@panbanda panbanda force-pushed the fix/dcr-omitempty-optional-fields branch from 473f544 to a848a71 Compare December 11, 2025 20:21
Add omitempty JSON tag to client_name, owner, subject_type, and scope
fields to ensure they are omitted from JSON output when empty, per
RFC 7591 requirements for optional DCR fields.

Fixes ory#4044
@panbanda panbanda force-pushed the fix/dcr-omitempty-optional-fields branch from c4f3ade to 58f2e14 Compare December 11, 2025 21:15
The snapshot files need to have multi-line empty object format
("extra": {\n}) to match the actual test output.
@panbanda
Copy link
Author

Hey @aeneasr is there anything I can do to help merge this in to unblock integrations with agents? Happy to update or change anything per direction.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Allow setting default values for optional DCR values

1 participant