The problem is not lack of dhcp (personally I prefer manual static config, because unlike with dhcp, it's not so easy to change anytime ISP feels like it, so it's really static), but the lack of your own prefix. That's how it's supposed to work, connect router to ISP, get a prefix and have own separate subnet(s) behind your router. If you can get addresses only using SLAAC, there's no place for your router and your whole subnet is accessible for ISP. It's possible to solve that by using router with ND proxy (RouterOS doesn't have that) or perhaps something can be done with bridge and filters (I didn't test it with IPv6, only with IPv4 in the past), but it's still not good enough.
...
The problem is solved. but the solution is very inconvenient. you need to adjust your hands.
I do realize that it's more than a year after this was a hot topic, but as I got here googling while dealing with the same subject: it obviously depends on how the ISP has implemented it at their side, but normally SLAAC assumes that the prefix advertised by the upstream router is a /64 one, so the ISP should be able to send traffic for the whole /48 (or maybe just /56 depending on what they actually give out to customers) down this line to any neighbor which advertises itself as a router within that /64 (assuming there will be only one such neighbor). If this is the case, there is a way to learn the prefix and use it to update the configuration using a periodically scheduled script.
The script first determines the link local address of the ISP's router using
/ipv6 neighbor get [find router interface=wan] address and updates the IPv6 default route with that address if it differs from the currently configured one. Then, it pings any public IPv6 address (it is even not necessary that it respons), and lets a rule in
/ipv6 firewall mangle capture the source address of the ping echo request to an address-list:
action=add-src-to-address-list address-list=myIpv6Addr address-list-timeout=10s chain=output out-interface=etherX-WAN src-address=2000::/3. What makes this method possible is that the router prefers the global address assigned to the output interface if it is available.
Then, the script cuts the prefix of a required length from the captured address, and uses it as a base to update the
/ipv6 pool row (or multiple rows) with possibly longer prefixes. As the prefix may change, the global addresses assigned to router's own interfaces must be configured using the
from-pool parameter; to change the
prefix of the
/ipv6 pool row(s), it is necessary to disable those addresses and re-enable them after the change. The same may be required for DHCP servers using those pools to delegate prefixes to other routers within your internal network.