Create a batchable class, and do as many callouts as you need. The 100 callout limit applies only to a single transaction, but Batchable classes can create millions of transactions. There's plenty of examples on the forum here already about how batchable works, but for sake of argument, say you wanted a quick-and-dirty way to get started, you could do this:
global class Do2999Callouts implements Database.Batchable<Integer> {
global Iterable<Integer> start(Database.BatchableContext context) {
Integer[] values = new Integer[0];
while(values.size() < 2999) values.add(values.size());
return values;
}
global void execute(Database.BatchableContext context, Integer[] values) {
// Do one callout for each integer in values
}
global void finish(Database.BatchableContext context) {
}
}
You would call this code using:
Database.executeBatch(new Do2999Callouts(), 100);
Of course, this is only an arbitrary example. You could use smaller batch sizes, base them off of records, or do whatever else you need to. There's plenty of ways of doing this, you just need to split your transactions up into multiple parts, as demonstrated here.