diff --git a/jsonschema/schema.go b/jsonschema/schema.go index 1d60de12..0b4764d6 100644 --- a/jsonschema/schema.go +++ b/jsonschema/schema.go @@ -204,6 +204,7 @@ func (s *Schema) MarshalJSON() ([]byte, error) { if err := s.basicChecks(); err != nil { return nil, err } + // Marshal either Type or Types as "type". var typ any switch { @@ -219,7 +220,19 @@ func (s *Schema) MarshalJSON() ([]byte, error) { Type: typ, schemaWithoutMethods: (*schemaWithoutMethods)(s), } - return marshalStructWithMap(&ms, "Extra") + bs, err := marshalStructWithMap(&ms, "Extra") + if err != nil { + return nil, err + } + // Marshal {} as true and {"not": {}} as false. + // It is wasteful to do this here instead of earlier, but much easier. + switch { + case bytes.Equal(bs, []byte(`{}`)): + bs = []byte("true") + case bytes.Equal(bs, []byte(`{"not":true}`)): + bs = []byte("false") + } + return bs, nil } func (s *Schema) UnmarshalJSON(data []byte) error { diff --git a/jsonschema/schema_test.go b/jsonschema/schema_test.go index 4b6df511..19f6c6c7 100644 --- a/jsonschema/schema_test.go +++ b/jsonschema/schema_test.go @@ -54,9 +54,9 @@ func TestJSONRoundTrip(t *testing.T) { for _, tt := range []struct { in, want string }{ - {`true`, `{}`}, // boolean schemas become object schemas - {`false`, `{"not":{}}`}, - {`{"type":"", "enum":null}`, `{}`}, // empty fields are omitted + {`true`, `true`}, + {`false`, `false`}, + {`{"type":"", "enum":null}`, `true`}, // empty fields are omitted {`{"minimum":1}`, `{"minimum":1}`}, {`{"minimum":1.0}`, `{"minimum":1}`}, // floating-point integers lose their fractional part {`{"minLength":1.0}`, `{"minLength":1}`}, // some floats are unmarshaled into ints, but you can't tell diff --git a/mcp/testdata/conformance/server/tools.txtar b/mcp/testdata/conformance/server/tools.txtar index b4068d1c..01fdb266 100644 --- a/mcp/testdata/conformance/server/tools.txtar +++ b/mcp/testdata/conformance/server/tools.txtar @@ -59,9 +59,7 @@ greet "type": "string" } }, - "additionalProperties": { - "not": {} - } + "additionalProperties": false }, "name": "greet" }