Implement a Transformation<R extends ConnectRecord<R>> class with apply(), config(), and close() methods and package it as a JAR on the Connect worker plugin path
In apply(), use ConnectRecord.value() to get a Struct (for Avro/JSON Schema) or a Map (for schemaless JSON) and overwrite the PII field with a hash or redaction string
Register the transform in connector config as transforms=maskPii,transforms.maskPii.type=com.example.MaskPiiTransform,transforms.maskPii.fields=email,phone
Chain the custom SMT after ExtractNewRecordState if processing Debezium CDC events so the SMT receives the flattened record rather than the envelope
Use ReplaceField SMT from Kafka Connect's built-in library for simple field renaming or dropping without a custom implementation
Known gotchas
Schemaless JSON records expose fields as a Map<String, Object> while schema-bearing records use a Struct; an SMT must handle both or declare it only supports one via ConnectRecord type checks
SMTs run on the Connect worker thread synchronously; expensive operations like external API calls for tokenization should be cached or batched to avoid throughput degradation
Applying an SMT that modifies a field value without also updating the associated schema causes downstream schema validation failures in strict Schema Registry environments
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp