diff --git a/pkg/server/server.go b/pkg/server/server.go
index 047214703c2465385cfcaea39d257891bd1f0a8b..350bce9a94ab2689760a2529135f64a474174103 100644
--- a/pkg/server/server.go
+++ b/pkg/server/server.go
@@ -327,19 +327,23 @@ func (c *callResponder) send(ctx context.Context, env *callEnv) (err error) {
 						} else {
 							e.Raw(cast)
 						}
+					case func(e *jx.Encoder) error:
+						err = cast(e)
 					default:
 						err = json.NewEncoder(e).EncodeWithOption(cast, func(eo *json.EncodeOption) {
 							eo.DisableNewline = true
 						})
-						if err != nil {
-							return
-						}
 					}
 				} else {
 					e.Null()
 				}
 			})
 		}
+		if env.err == nil && err != nil {
+			e.Field("error", func(e *jx.Encoder) {
+				jsonrpc.EncodeError(e, err)
+			})
+		}
 	})
 	// a json encoding error here is possibly fatal....
 	if err != nil {