<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: motley.ai</title>
    <description>The latest articles on DEV Community by motley.ai (motley).</description>
    <link>https://dev.to/motley</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F14419%2Fa42c286a-d6f1-4b75-9374-a84d96f10cdc.png</url>
      <title>DEV Community: motley.ai</title>
      <link>https://dev.to/motley</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/motley"/>
    <language>en</language>
    <item>
      <title>What do DuckDB and SLayer have in common?</title>
      <dc:creator>Anastasiia Beriukhova </dc:creator>
      <pubDate>Wed, 16 Sep 2026 14:14:02 +0000</pubDate>
      <link>https://dev.to/motley/what-do-duckdb-and-slayer-have-in-common-52mh</link>
      <guid>https://dev.to/motley/what-do-duckdb-and-slayer-have-in-common-52mh</guid>
      <description>&lt;p&gt;They are both lightweight, and can be run both embedded and via a CLI (as well as MCP and other ways ;) ), no server to run if you don't want to, no warehouse to provision.&lt;/p&gt;

&lt;p&gt;DuckDB can read a file straight off a URL over httpfs; SLayer can auto-ingest a schema during datasource setup, and then turns its simple yet powerful query syntax into the correct SQL.&lt;/p&gt;

&lt;p&gt;Put them together and a semantic layer over a remote dataset is a handful of lines.&lt;/p&gt;

&lt;p&gt;To show just how simple and powerful that pattern is, example notebooks have been put together, one for CLI, one for Python.&lt;/p&gt;

&lt;p&gt;Each notebook shows, from scratch, how to define a view over a remote file in DuckDB, then to connect SLayer to that view, and to execute a deceptively simple query, containing:&lt;/p&gt;

&lt;p&gt;A dimension computed from an aggregate, group each month warm or cool by its average high temperature, a CASE WHEN temp_max:avg(partition_by=date) … band used as a grouping dimension&lt;br&gt;
A ranking transform in a measure, rank(precipitation:sum) to order the months by rainfall, one of SLayer's query-time transforms.&lt;/p&gt;

&lt;p&gt;Both of these are defined at query time, showing how SLayer removes the need to pre-configure every little thing you want to query.&lt;/p&gt;

&lt;p&gt;Why use SLayer at all, instead of direct SQL? The final cell of each notebook shows the SQL corresponding to that "simple" query json. Judge for yourself which one is easier to read, and which one an agent is more likely to generate correctly, time after time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/MotleyAI/slayer/blob/main/docs/examples/15_duckdb/duckdb_cli_nb.ipynb" rel="noopener noreferrer"&gt;CLI&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/MotleyAI/slayer/blob/main/docs/examples/15_duckdb/duckdb_python_nb.ipynb" rel="noopener noreferrer"&gt;Python&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/MotleyAI/slayer" rel="noopener noreferrer"&gt;SLayer repo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>data</category>
      <category>sql</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Post Apache Ossie, what distinguishes semantic layers?</title>
      <dc:creator>Anastasiia Beriukhova </dc:creator>
      <pubDate>Mon, 14 Sep 2026 15:08:49 +0000</pubDate>
      <link>https://dev.to/motley/post-apache-ossie-what-distinguishes-semantic-layers-45m2</link>
      <guid>https://dev.to/motley/post-apache-ossie-what-distinguishes-semantic-layers-45m2</guid>
      <description>&lt;p&gt;Enough has been said recently about why having a semantic layer is a good thing. Unfortunately, each of them has its own data model and corresponding storage format for storing those models, so migrating from one to another was a nontrivial endeavour.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ossie.apache.org/" rel="noopener noreferrer"&gt;Apache Ossie&lt;/a&gt; sets out to change that. It is an open-source standard for describing semantic layer models, with &lt;a href="https://ossie.apache.org/ecosystem/" rel="noopener noreferrer"&gt;a lot of heavy hitters&lt;/a&gt; behind it. It's early days yet, and it only defines the semantic model interchange format, but with the kind of backers it has, it seems very likely it will get broad adoption (the obligatory &lt;a href="https://xkcd.com/927/" rel="noopener noreferrer"&gt;xkcd&lt;/a&gt; comes to mind).&lt;/p&gt;

&lt;p&gt;This leads to an interesting question: if porting semantic layer definitions from one format to another becomes free thanks to Apache Ossie, what are reasons to choose one semantic layer over the other?&lt;/p&gt;

&lt;p&gt;The easy answer is to use whatever is bundled with a solution already in use for other purposes, such as Snowflake or dbt Cloud - and that is a reasonable option. However, their providers have a vested interest in promoting exactly the kind of lock-in that Apache Ossie is supposed to minimize; also, semantic layers that are offered as features of other products have a way of not being quite as polished as standalone products that live and die on their quality as semantic layers alone.&lt;/p&gt;

&lt;p&gt;If the config side is made fungible by Apache Ossie, then the differentiating factor becomes the query-time behavior. The old-school semantic layers, such as Looker, Cube, or Metricflow (the dbt semantic layer) were optimized for a world where they were mostly called with the same query over and over, possibly with a different set of filters and groupbys (because only data people could author unusual queries, and they just wrote SQL). This made it natural to optimize for performance in such scenarios, which meant caching of pre-aggregations, which in turn pushed towards pretty static model configs.&lt;/p&gt;

&lt;p&gt;In the world where agents are doing the querying, neither of those scenarios quite fits. Having SQL generated by semantic layers, using governed metrics and deterministic guarantees on join correctness, is a great source of reliability for the agent world. However, it's useless if to calculate a ratio of two metrics, or a time shifted version of one, the agent needs to modify the semantic model configs and wait for (at best) seconds for that to feed through - if it is allowed to do that at all.&lt;/p&gt;

&lt;p&gt;The other gap that old-school semantic layers tend to have is discoverability - among hundreds, or thousands, of tables, with over a hundred columns each, how does the agent discover what is pertinent for just the query it wants to make? That extends to discoverability of related business rules that mention a metric, but also mention others so don't neatly fit into a single metric's description field.&lt;/p&gt;

&lt;p&gt;These, then, are the two properties that distinguish an agent-ready semantic layer in a post-Apache Ossie world: expressiveness and flexibility at query time, and discoverability of both single dimensions/metrics and related business rules.&lt;/p&gt;

&lt;p&gt;Naturally, those are what &lt;a href="https://motley.ai/" rel="noopener noreferrer"&gt;Motley&lt;/a&gt; has invested in, and also made available in its open source &lt;a href="https://github.com/MotleyAI/slayer" rel="noopener noreferrer"&gt;SLayer&lt;/a&gt; engine. On the expressiveness side, the vision is clear: the agent should be able to specify what it's looking for in as concise and natural way as possible, for example directly specifying in a simple syntax dimensions or filters that are themselves aggregates, or transforms such as time shift, no matter what dataset they all come from - and the semantic layer engine should figure out the necessary CTEs (subqueries) and join patterns, and generate the correct SQL in the right database dialect.&lt;/p&gt;

&lt;p&gt;Current SLayer is closer to this vision than any other semantic layer on the market, and the upcoming 0.10 release next week will take it all the way there.&lt;/p&gt;

&lt;p&gt;On the discoverability side, SLayer supports arbitrary chunks of context stored as memories, with references to the specific entities mentioned (such as metrics or dimensions), and a 3-channel search (embeddings + full-text + entity overlap, merged via Reciprocal Rank Fusion) over both memories and entities, so the agent can ask a freeform question and get a list of the likely relevant memories and entities. In contrast, the best the open source versions of the old school semantic layers can offer is keyword search.&lt;/p&gt;

&lt;p&gt;So when evaluating a semantic layer for agent-friendliness, two things matter: query-time expressiveness, and entity and context discoverability. If they don't come out of the box, they'll need to be &lt;a href="https://motley.ai/blog-posts/we-tried-to-benchmark-slayer-and-cube-we-failed/" rel="noopener noreferrer"&gt;built before the semantic layer is much help to an agent&lt;/a&gt; - is that hassle really necessary?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwewz45vtgh6res4lnlz2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwewz45vtgh6res4lnlz2.jpg" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>agents</category>
      <category>sql</category>
    </item>
    <item>
      <title>Cube vs SLayer-using agent? We ran a benchmark expecting a close fight. It wasn't close.</title>
      <dc:creator>Anastasiia Beriukhova </dc:creator>
      <pubDate>Wed, 09 Sep 2026 13:34:46 +0000</pubDate>
      <link>https://dev.to/motley/cube-vs-slayer-using-agent-we-ran-a-benchmark-expecting-a-close-fight-it-wasnt-close-59h4</link>
      <guid>https://dev.to/motley/cube-vs-slayer-using-agent-we-ran-a-benchmark-expecting-a-close-fight-it-wasnt-close-59h4</guid>
      <description>&lt;p&gt;A few weeks back we showed that an agent using our semantic layer (SLayer) beat a raw-SQL agent by 30%+ on a random selection of 265 live-sqlbench-large tasks. Fair follow-up question: how does that hold up against Cube, the incumbent open-core semantic layer?&lt;/p&gt;

&lt;p&gt;So we put open-source Cube behind an agent. There's no MCP server for it, so we wrapped its REST API for introspection and queries, auto-generated models from the DB schemas, adding dimensions and measures off the JSON columns' leaves, and handed the agent the same knowledge-base tools the raw-SQL agent had.&lt;/p&gt;

&lt;p&gt;Then we picked 10 tasks the SLayer-using agent had already solved — to give Cube an easy start. The raw-SQL agent had cleared 5 of them. &lt;/p&gt;

&lt;p&gt;The Cube agent solved zero.&lt;/p&gt;

&lt;p&gt;The first guess was a bug in the harness. There wasn't one. The logs showed two hard blockers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Cube's schema metadata is so verbose it often blew straight past Claude Code's 25K tool-output limit. The agent couldn't see the whole schema, so it sat there hallucinating queries.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nine of the ten tasks needed custom measures or dimensions built at solve time — ratios, derived formulas, CASE groupings that were provided in the knowledge base. Open-source Cube gives you no reasonable way to edit models on the fly.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It would be possible to build around it: an external model store, a validate-on-edit compile loop, smart schema retrieval to dodge the token limit. That's a serious chunk of engineering to turn Cube into something it isn't — and it'd still take seconds to recompile on every single edit.&lt;/p&gt;

&lt;p&gt;Those are some of the reasons why we left Cube and built SLayer in the first place.&lt;/p&gt;

&lt;p&gt;So if you're planning to run Cube behind an agent, go in with your eyes open: you're writing the scaffolding yourself. Batteries not included.&lt;/p&gt;

&lt;p&gt;(Or use an agent-native semantic layer and skip the hassle. But we would say that.) &lt;/p&gt;

&lt;p&gt;&lt;a href="https://motley.ai/blog-posts/we-tried-to-benchmark-slayer-and-cube-we-failed/" rel="noopener noreferrer"&gt;Full post&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://motley.ai/blog-posts/when-the-database-gets-big-the-semantic-layer-earns-its-keep/" rel="noopener noreferrer"&gt;Original SLayer vs raw SQL post &lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>semanticlayer</category>
      <category>benchmark</category>
      <category>dataengineering</category>
    </item>
    <item>
      <title>An Agent's Field Guide to Semantic Layers</title>
      <dc:creator>Anastasiia Beriukhova </dc:creator>
      <pubDate>Wed, 26 Aug 2026 11:14:14 +0000</pubDate>
      <link>https://dev.to/motley/an-agents-field-guide-to-semantic-layers-4g8n</link>
      <guid>https://dev.to/motley/an-agents-field-guide-to-semantic-layers-4g8n</guid>
      <description>&lt;p&gt;&lt;strong&gt;Are all semantic layers created the same?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Semantic layers are all the rage these days. There are many popular ones, and it can be hard to know which one you want to use, if any. The goal of this post is to give you a mental map of the domain, the things to look at when choosing one, and the strengths and weaknesses of indivudual ones.&lt;/p&gt;

&lt;p&gt;Here we will be speaking about the semantic layers in the sense of a governed collection of metric and dimension definitions, to be used for reliably creating database queries. Sometimes the term is also used in a different sense, to do with ontologies and knowledge graphs, which we will not cover here. We will focus on the open source ones, as the commercial ones are harder and more expensive to access and review.&lt;/p&gt;

&lt;p&gt;The incumbents in the semantic layer space are &lt;a href="https://github.com/dbt-labs/metricflow" rel="noopener noreferrer"&gt;MetricFlow&lt;/a&gt; (dbt’s semantic layer engine) and &lt;a href="https://github.com/cube-js/cube" rel="noopener noreferrer"&gt;Cube.js&lt;/a&gt;; worth mentioning is &lt;a href="https://github.com/lightdash/lightdash" rel="noopener noreferrer"&gt;Lightdash&lt;/a&gt;, which used to be more of a dashboard solution but is now increasingly beefing up its semantic layer side. A project to watch is &lt;a href="https://github.com/apache/ossie" rel="noopener noreferrer"&gt;Apache Ossie&lt;/a&gt; (formerly Open Semantic Interchange), which aims to become an open source semantic layer standard. At the moment it only has a limited spec for specifying datasets and no reference semantics for querying, so definitely worth following but not a full solution at the moment. Finally, we will cover &lt;a href="https://github.com/MotleyAI/slayer" rel="noopener noreferrer"&gt;SLayer&lt;/a&gt;, a recent entrant aiming to be used by agents as well as humans.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The shared core&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All the semantic layers have a fair bit of a shared core. The most basic idea of a semantic layer is to represent a groupby query, with the definitions of what’s being aggregated (called metrics) and what’s being grouped by (called dimensions) sourced from the semantic layer definitions.&lt;/p&gt;

&lt;p&gt;The whole semantic model is composed of what OSI calls datasets and Cube.js calls cubes, each basically an overlay over a database table or SQL query, describing the metrics and dimensions associated with it, and potentially some extras like filters. These datasets are then connected by joins, which are also part of the semantic model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Joins and multi-dataset queries&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Very often, a query needs to use information from more than one dataset. This requires knowledge about the right way to join these, especially if several join hops are needed to connect them. This is more than a technical detail - if a table is joined to another via a one-to-many relationship, for example, the number of rows in the result may increase, which will make aggregations incorrect (known as a &lt;strong&gt;fan-out&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;To alleviate that danger, all semantic layers store the cardinality of a join (one-to-one, one-to-many, etc) as part of the join definition (MetricFlow calls the join key + cardinality combination “entity”, but it’s really the same thing).&lt;/p&gt;

&lt;p&gt;Where the semantic layers differ is in whether they require the cardinality information to be specified on every join, and how they try to prevent incorrect aggregations due to fan-outs and chasm traps (another kind of metric distortion due to careless joins).&lt;/p&gt;

&lt;p&gt;OSI is the odd-one out as it structurally is only able to represent one-to-many joins; of the others, Metricflow and Cube require the cardinality to be specified as part of a join, while Lightdash and SLayer keep it optional. Of all the semantic layers reviewed here, only SLayer inspects the actual data in the database to make hypotheses about the cardinality - all others rely on config writer to provide it, and don’t validate it against data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://motley.ai/compare/slayer-vs-metricflow/" rel="noopener noreferrer"&gt;Metricflow&lt;/a&gt; is the most limited in terms of fan-out protection, prohibiting certain joins (foreign-foreign) instead of re-expressing them using sub-queries (CTEs). All the others construct CTEs to avoid the row duplication in the different scenarios, though the degree of config needed to make it work may differ.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query-time flexibility&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Achilles heel of most old-school semantic layers is their query-time clunkiness, only allowing you to supply a combination of predefined measures/dimensions/filters/segments/order_by/limit, with only minor exceptions. Want to calculate a ratio of two already defined measures, or of a measure to the same measure one year ago? You have to modify the configs and wait for the change to propagate.&lt;/p&gt;

&lt;p&gt;This means that agents trying to make a query that isn’t contained in the configs in quite the way needed, must often fall back to writing raw SQL, &lt;strong&gt;losing all the advantages of governed metrics&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;SLayer is the one exception here, allowing a wealth of transforms and expressions at query time, such as time shift, arithmetic expressions, and even allowing you to extend a dataset on the fly then query it, as part of a single query call.&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "source_model": "orders",&lt;br&gt;
  "measures": [&lt;br&gt;
    "order_total:sum",&lt;br&gt;
    {&lt;br&gt;
      "formula": "time_shift(order_total:sum, -1, 'year')",&lt;br&gt;
      "name": "revenue_ly"&lt;br&gt;
    },&lt;br&gt;
    {"formula": "order_total:sum / *:count", "name": "aov"},&lt;br&gt;
    {"formula": "change(order_total:sum)", "name": "mom_change"}&lt;br&gt;
  ],&lt;br&gt;
  "dimensions": ["stores.name"],&lt;br&gt;
  "time_dimensions": [&lt;br&gt;
    {&lt;br&gt;
      "dimension": "ordered_at",&lt;br&gt;
      "granularity": "month",&lt;br&gt;
      "date_range": ["2025-09-01", "2026-08-31"]&lt;br&gt;
    }&lt;br&gt;
  ],&lt;br&gt;
  "filters": ["last(change(order_total:sum)) &amp;lt; 0"]&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;&lt;em&gt;One call against the demo Jaffle Shop database: the plain monthly total, the same month a year earlier via time_shift, a ratio of two measures, and the month-on-month delta, keeping only the stores whose latest month fell. None of revenue_ly, aov or mom_change exists in the model, and none of it needed a config change. More on the time transforms in Time is the &lt;a href="https://motley.ai/blog-posts/time-is-the-hardest-dimension/" rel="noopener noreferrer"&gt;Hardest Dimension&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-stage aggregation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Quite often, the question one asks doesn’t resolve to a single simple query, but requires using the result of one query as input to another. Examples are derived dimensions (“Average revenue per usage bucket”, where usage bucket is also computed on the fly) and aggregates of aggregates (eg “Average by region of total revenue by store”). The degree to which this is supported differs greatly by semantic layer.&lt;/p&gt;

&lt;p&gt;Metricflow allows differing-grain filters only, but not grouping by or re-aggregating of a first-stage query, and Lightdash only allows a limited set of post-processing such as percent-of-total over the already-fetched result set at its existing grain.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://motley.ai/compare/slayer-vs-cube/" rel="noopener noreferrer"&gt;Cube&lt;/a&gt; does explicitly support multistage aggregation. The first-stage aggregation must be inlined into the final definition, and only a limited number of pre-aggregation types are supported, which results in a limited syntax that is capable of expressing some kinds of multistage queries but not others. As with any other metrics, these definitions must be added to the dataset configs, and can’t be added on the fly.&lt;/p&gt;

&lt;p&gt;In all of the above cases, multistage aggregations can be achieved by defining a new dataset based on custom sql that describes the first-stage aggregation, but that is not really a good solution for an ad hoc query.&lt;/p&gt;

&lt;p&gt;In contrast, SLayer provides a natural, general support for multistage aggregations by allowing the agent to &lt;strong&gt;treat the result of a query as just another dataset&lt;/strong&gt;. So it can first define the first-stage query, and then aggregate or join it to the other dataset(s) it needs just like it would do with another dataset, and then evaluate the multi-stage aggregation, all part of a single query call.&lt;/p&gt;

&lt;p&gt;[&lt;br&gt;
  {&lt;br&gt;
    "name": "monthly_store_revenue",&lt;br&gt;
    "source_model": "orders",&lt;br&gt;
    "measures": [{"formula": "order_total:sum", "name": "revenue"}],&lt;br&gt;
    "dimensions": ["stores.name"],&lt;br&gt;
    "time_dimensions": [{"dimension": "ordered_at", "granularity": "month"}]&lt;br&gt;
  },&lt;br&gt;
  {&lt;br&gt;
    "source_model": "monthly_store_revenue",&lt;br&gt;
    "measures": [{"formula": "revenue:avg"}],&lt;br&gt;
    "dimensions": ["stores.name"]&lt;br&gt;
  }&lt;br&gt;
]&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The aggregate of an aggregate, in one call. The first stage names itself monthly_store_revenue and totals revenue per store and month; the second reads that name as its source_model, so revenue:avg averages those monthly sums rather than the raw rows. Longer walkthrough in &lt;a href="https://motley.ai/blog-posts/slayer-02-queries-that-build-on-queries/" rel="noopener noreferrer"&gt;Queries That Build on Queries&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Search capability&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While demo database setups usually fit into a single agent context window, production setups rarely do. This makes a clean and powerful search capability critical for agent-facing semantic layers. Of those reviewed here, only SLayer offers a genuine, general search. The search is three-channel: full-text, embeddings, and entity overlap between query and result, with the channels results then merged using Reciprocal Rank Fusion.&lt;/p&gt;

&lt;p&gt;All the others allow to page through the model/dataset definitions, and possibly do keyword search, but don’t offer any compariable retrieval capability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What kind of context can be stored?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As a natural extension of the search capability, it will come as no surprise that SLayer is the only one that allows to store (and retrieve) pieces of context not directly tied to a single entity (the way e.g. dimension or metric descriptions are). An example could be an instruction to use one definition of revenue for product-domain queries, and another for finance-domain queries.&lt;/p&gt;

&lt;p&gt;Such pieces of context (called memories) will contain formal references to the entities in question, and can also have an example query attached.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does it come with an MCP server?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here the breakdown is clear: for SLayer, an MCP server is part of the open source package, while Cube, Lightdash, and Metricflow only make it available as part of the commercial offering (and OSI, being at this point only a static dataset description standard, doesn’t have one at all).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclaimer: All the statements we made here represent our understanding as of this moment. However, each of the packages mentioned here is complex and fast-moving, so if you find any inaccuracies, please &lt;a href="https://discord.com/invite/egWxMctHCA" rel="noopener noreferrer"&gt;let us know&lt;/a&gt; so that we can correct them!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>semanticlayer</category>
      <category>aiagents</category>
      <category>mcp</category>
      <category>moderndatastack</category>
    </item>
  </channel>
</rss>
