I’d suggest running the foo function from the new notebook. In other words:
%run ./called_notebook.ipynb
foo()
In my opinion, this is best practices for using the %run magic command. Store your high level APIs in a separate notebook (such as foo), but keep your function calls visible in the master notebook.