Need help playing around with passes

I am trying to write a few simple passes and look at how the change the MLIR structure, any help on how I can do it? Some tool to maybe read MLIR from a file, returns the MLIRContext and run passes on it and give the output.

I have heard about mlir-opt but haven’t found documentation about it, especially on how to use with with passes I write.

In case of toy I have read that results.add<SimplifyRedundantTranspose>(context) is where the pass is applied on the IR, but haven’t found something similar to all passes in other dialects (mostly went through the SPIR-V dialect).