Стандарт описывает интерфейсы компонентов, с помощью которых можно создавать библиотеки матричных алгоритмов и использовать их в прикладных программах.
В компонентной объектной модели COM интерфейсом называется абстрактный базовый класс, все функции которого виртуальные. Компонентом называется класс, наследующий один или несколько интерфейсов, и реализующий все их функции. Работа с компонентом производятся исключительно через указатель путем вызова интерфейсных функций. Данные, хранящиеся внутри компонента, не доступны для прямого использования. Это делает компоненты более обособленными, чем при обычном объектно-ориентированном программировании. Появляется возможность модернизировать компоненты, заменяя устаревшие компоненты новыми, при условии, что они поддерживают прежние интерфейсы. Замена может производиться на уровне бинарных файлов, без перекомпиляции остальных модулей.
Стандарт maCom определяет следующие интерфейсы:

1. Ячейка данных ImaCell предназначена для представления значений различных типов, как простых, так и объектных, включая матрицы, списки и потоки. Через ячейки осуществляется запись и считывание значений в элементах списков и матриц.
2. Список ячеек ImaList предназначен для представления алгоритмов, методов и их параметров в виде иерархических структур - деревьев. Элементами списка являются ячейки данных ImaCell. Интерфейс неизменяемого списка ImaReadList предоставляет подмножество функций ImaList и предназначен для хранения внутренней структуры методов и алгоритмов.
3. Многомерная матрица ImaMatrix предназначена для хранения данных, представления входных и выходных данных в матричных алгоритмах. Конкретные виды матриц предоставляют интерфейсы, наследующие ImaMatrix.
4. Матричный алгоритм ImaAlgorithm — основной компонент, реализующий концепцию обучаемых алгоритмов обработки многомерных матричных данных. Алгоритм состоит из набора методов ImaMethod с общим списком параметров ImaList.
5. Метод алгоритма ImaMethod предназначен для хранения матричного вычислителя вместе со своими входными и выходными матрицами-аргументами. Данный интерфейс представляет взгляд на метод с точки зрения его пользователя.
6. Поток ввода-вывода ImaStream предназначен для унификации операций ввода-вывода, в частности, для отображения промежуточных результатов в виде таблиц и графиков, а также для вывода отладочной информации о текущем состоянии вычислений в алгоритмах. Поток позволяет записывать и считывать данные простых типов, а также матрицы, списки и ячейки. Все потоки имеют одинаковый интерфейс независимо от типа носителя.
7. Управляющее ядро ImaKernel предназначено для управления загрузкой библиотек и созданием алгоритмов. Оно инициализируется один раз в начале работы прикладной программы и уничтожается при выходе из нее.
8. Определитель метода ImaMethodDef предназначен для реализации метода. Классы с этим интерфейсом предоставляют разработчики методов. Пользователю метода нет необходимости вызывать функции данного интерфейса непосредственно.
9. Библиотека алгоритмов ImaLibrary предназначена для объединения определителей методов в динамическую библиотеку - DLL. Пользователю алгоритмов нет необходимости вызывать функции данного интерфейса непосредственно, так как он управляет загрузкой библиотек с помощью ImaKernel.
10. Индикатор хода выполнения ImaProgressHandler предназначен для вывода информации о текущем состоянии длительного процесса. Пользователь может реализовать объект с этим интерфейсом для вывода индикатора в своём приложении.

Правила передачи интерфейсов через аргументы функций:

- Если интерфейс ImaX передаётся через указатель ImaX*, то он является входным аргументом, создается и удаляется клиентом (вне интерфейсной функции), которая имеет право только вызывать функции интерфейса ImaX. В частности, она может захватить интерфейс, увеличив число ссылок с помощью функции AddRef.
- Если интерфейс ImaX передаётся через указатель на указатель ImaX**, то он является выходным аргументом. Предыдущее значение указателя ImaX** затирается, и для него не вызывается Release, даже если это был указатель на существующий интерфейс. Клиент должен заботиться о том, чтобы передаваемый по ссылке указатель был заранее освобождён. При возвращении интерфейса число ссылок на него увеличивается с помощью AddRef. По окончании использования клиент обязан освободить полученный интерфейс с помощью функции Release.