<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://naftiko.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://naftiko.io/" rel="alternate" type="text/html" /><updated>2026-05-18T21:17:59+00:00</updated><id>https://naftiko.io/feed.xml</id><title type="html">Naftiko</title><subtitle>Embrace your API legacy, integrate your AI future. Naftiko turns API sprawl into a governed capability fleet that teams can depend on.</subtitle><entry><title type="html">Notion Has an MCP. Naftiko Has a Capability Layer.</title><link href="https://naftiko.io/blog/notion-has-an-mcp-naftiko-has-a-capability-layer/" rel="alternate" type="text/html" title="Notion Has an MCP. Naftiko Has a Capability Layer." /><published>2026-05-18T00:00:00+00:00</published><updated>2026-05-18T00:00:00+00:00</updated><id>https://naftiko.io/blog/notion-has-an-mcp-naftiko-has-a-capability-layer</id><content type="html" xml:base="https://naftiko.io/blog/notion-has-an-mcp-naftiko-has-a-capability-layer/"><![CDATA[<p>Notion has done the work that every SaaS vendor is going to have to do this year. They <a href="https://developers.notion.com/guides/mcp/overview">shipped a hosted MCP server</a>, published a <a href="https://developers.notion.com/guides/mcp/mcp-supported-tools">documented catalog of supported tools</a>, and opened up a <a href="https://developers.notion.com/guides/mcp/hosting-open-source-mcp">self-hostable open-source version</a> for teams that need to keep traffic inside their own perimeter. If your only goal is to give an agent access to Notion, you can stop reading. Plug in the URL, hand the agent its credentials, and you are done.</p>

<p>The question this post is for is the next one. <em>What do you do when one MCP is not enough?</em></p>

<h2 id="where-the-vendor-mcp-ends">Where the vendor MCP ends</h2>

<p>Every vendor MCP — Notion’s included — is shaped to expose the vendor’s full operational surface. That is the right default for the vendor. It is rarely the right default for an enterprise consuming that vendor through an agent. Four things you cannot do from a stock vendor MCP that you can do from a Naftiko capability over the same vendor:</p>

<ul>
  <li><strong>Fine-grain control over which tools are exposed.</strong> Notion’s MCP exposes the operations Notion thought your agent should call. Maybe that is the right list for a chatbot, and the wrong list for a contract-review agent or a financial-reporting agent. A capability lets you pick the subset that fits the workflow, shape the inputs and outputs, and leave everything else off the menu.</li>
  <li><strong>Declarative YAML control over the context engineered for the MCP server.</strong> The same Notion endpoint can be wrapped a dozen ways depending on which agent is calling and why. A capability spec is the place that wrapping lives — versioned in Git, reviewed in a pull request, and the single source of truth for “what does this MCP actually look like to <em>our</em> agents.”</li>
  <li><strong>Observability and governance over your instance of the Notion MCP server.</strong> Who called it. From which agent. With what identity. Against what policy. For what cost. The vendor MCP can answer some of these. None of them are useful at fleet scale until they are emitted in a shape that lines up with every other capability in your enterprise.</li>
  <li><strong>The ability to expand beyond Notion to any other provider.</strong> This is the one that decides the whole conversation. Today it is Notion. Next week it is Stripe, Salesforce, Snowflake, ServiceNow, your internal payments API, your custom data warehouse, your partner integrations, and the long tail of vendor MCPs that will ship into your stack over the next twelve months. Every vendor MCP is its own snowflake. Naftiko capabilities give you one shape across all of them.</li>
</ul>

<h2 id="what-that-looks-like">What that looks like</h2>

<p>A Naftiko capability that wraps the Notion API is a single YAML file. It declares which Notion tools you want to expose, how you want to shape the context that goes in, what governance tags the operation carries, and what telemetry it emits. It then exposes the result as MCP, REST, A2A, or an Agent Skill — same spec, multiple agent surfaces. Drop in a second capability that wraps Salesforce, or your internal capability over SAP, and you have a uniform fleet of agent-callable operations governed at the spec layer.</p>

<p>Notion’s MCP is the doorway. The capability layer is the building.</p>

<h2 id="when-to-use-which">When to use which</h2>

<ul>
  <li><strong>Use Notion’s hosted MCP</strong> when one agent needs Notion access, you trust Notion’s default tool surface, and you do not need governance, observability, or fleet-level uniformity yet.</li>
  <li><strong>Use Notion’s open-source MCP self-host</strong> when you need the traffic inside your perimeter but you are still operating one MCP at a time and Notion’s default tool surface is what you want.</li>
  <li><strong>Use Naftiko</strong> when you have <em>more than one</em> MCP server in flight, when the default tool surface is wrong for your agent, when governance and FinOps need to live at the spec layer, or when you have started to see the same shape problem on every new vendor MCP that ships.</li>
</ul>

<p>The first two paths are real. They will work for many teams. They stop working at exactly the point most enterprises hit this quarter — the second vendor MCP, the first compliance question, the first cost surprise, or the first time an agent calls a tool nobody knew was on the surface.</p>

<h2 id="the-bottom-line">The bottom line</h2>

<p>Vendor MCPs are going to keep shipping. Stripe, Slack, Adyen, Linear, Notion — the list grows every week, and the quality range across them grows with it. You should celebrate every one that ships. And you should also have a place to put them — one place — that gives you fine-grained tool control, declarative context, observability, governance, and the same shape across every other vendor MCP your fleet will consume in the next twelve months.</p>

<p>That place is a capability layer. That is what <a href="https://naftiko.io">Naftiko</a> does.</p>]]></content><author><name>Kin Lane</name></author><category term="Blog" /><summary type="html"><![CDATA[Notion shipped a hosted MCP, a documented tool catalog, and an open-source self-host option. That covers most use cases. When it doesn't, you reach for a capability layer — fine-grained tool control, declarative context, observability, and the same pattern across every other vendor MCP in your stack.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://naftiko.io/assets/img/blog/notion-has-an-mcp-naftiko-has-a-capability-layer.png" /><media:content medium="image" url="https://naftiko.io/assets/img/blog/notion-has-an-mcp-naftiko-has-a-capability-layer.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Naftiko Is an Agentic Asset Manager</title><link href="https://naftiko.io/blog/naftiko-is-an-agentic-asset-manager/" rel="alternate" type="text/html" title="Naftiko Is an Agentic Asset Manager" /><published>2026-05-16T00:00:00+00:00</published><updated>2026-05-16T00:00:00+00:00</updated><id>https://naftiko.io/blog/naftiko-is-an-agentic-asset-manager</id><content type="html" xml:base="https://naftiko.io/blog/naftiko-is-an-agentic-asset-manager/"><![CDATA[<p>I had a working session with an advisor last week where we both ended up at the same phrase at the same time. We had been circling for half an hour trying to describe what Naftiko <em>is</em> to a CIO who is not yet sold on us. Not the demo. Not the tactical pitch. The positioning. The one-line answer to <em>what does this company actually do</em>.</p>

<p>We landed on it together.</p>

<blockquote>
  <p>Naftiko is an agentic asset manager.</p>
</blockquote>

<p>I wrote it down. Then I sat with it for a few days. Then I tested it on three more conversations. Then I came back to write this post.</p>

<p>The phrase fits. It fits in a way the previous attempts — “AI integration platform,” “capability fleet,” “MCP governance layer” — never quite did. It explains who the buyer is, what the job is, why the job is new, and why the existing categories do not cover it. The rest of this post is the unpack.</p>

<h2 id="every-enterprise-already-has-an-asset-manager-they-just-call-it-it">Every enterprise already has an asset manager. They just call it IT.</h2>

<p>Walk into any enterprise of meaningful size and ask <em>who knows what software we are running, what it costs, who has access, and what we are not using</em>. Somebody knows. Probably a small group of people inside IT, or finance, or a procurement office that sits between the two. They are running an asset manager — whether or not the budget line says “asset manager” — because the alternative is shadow IT, license waste, and audits that go badly.</p>

<p>Software asset management is a <em>boring discipline</em>. Nobody writes founder Twitter threads about it. But it is also one of the most consequential things an enterprise does, because the assets it covers — SaaS licenses, server capacity, database instances, integration platforms, internal services — are <em>what the business actually runs on</em>. Get the asset management wrong and you discover you have been paying $4M a year for Salesforce seats nobody uses, or that the customer support team is using six different competing tools because nobody knew the existing one was already licensed.</p>

<p>The discipline has a stable shape. There are roughly five things a real asset manager does:</p>

<ol>
  <li><strong>Visibility.</strong> You know what you have. Every asset is in a registry. You can ask “what do we run” and get an answer.</li>
  <li><strong>Access management.</strong> You know who is allowed to use what. Permissions are explicit, scoped, and auditable.</li>
  <li><strong>Utilization.</strong> You know what is actually being used. The “we paid for it and nobody touches it” line item is visible.</li>
  <li><strong>Maximization.</strong> You actively push toward higher utilization of paid assets before you buy new ones. <em>Use what you have before you buy another.</em></li>
  <li><strong>Decommission.</strong> You know when an asset’s life is over, and you retire it cleanly without leaving access lying around.</li>
</ol>

<p>Those five jobs have existed for decades. The IT organization has owned them, the finance organization has paid for them, and the procurement organization has enforced them.</p>

<p>Agents just became a new class of asset. <em>The same five jobs apply.</em></p>

<h2 id="why-agents-specifically-need-asset-management">Why agents specifically need asset management</h2>

<p>The job is not interesting for SaaS licenses anymore — most enterprises have working tooling for that. The job is <em>very</em> interesting for agents, because every property that made traditional asset management hard is amplified for agent workloads.</p>

<p><strong>Agents proliferate fast.</strong> A typical enterprise added new SaaS licenses at the rate of a dozen per quarter. The same enterprise is adding agents at the rate of dozens per <em>week</em> — once you count team-level pilots, embedded copilots inside tools they already license, and the side projects nobody told IT about.</p>

<p><strong>Agents have non-obvious access.</strong> A SaaS license grants access to the SaaS itself. An agent grants access to <em>whatever services the agent calls on the user’s behalf</em>. The set of services an agent reaches is dynamic, runtime-resolved, and frequently invisible to the user, let alone to IT.</p>

<p><strong>Agents have non-obvious cost.</strong> A SaaS seat costs a predictable monthly number. An agent’s cost is the model bill plus the token spend plus the upstream API spend plus the retry overhead plus the human cleanup time. Most enterprises do not have a single line of accounting that captures any of those, let alone all of them.</p>

<p><strong>Agents have non-obvious risk.</strong> A SaaS seat has a known compliance posture — the vendor publishes a SOC 2 report, the legal team reviews it, the access is logged. An agent’s compliance posture is <em>per-invocation</em>. The same agent doing the same operation on the same data can be safe on Monday and out of scope on Tuesday depending on which upstream services it composed.</p>

<p>Each of these makes the traditional asset management discipline more important, not less. The set of jobs is the same. The amplification is what is new.</p>

<h2 id="what-an-agentic-asset-manager-looks-like-in-practice">What an agentic asset manager looks like in practice</h2>

<p>This is what Naftiko does, mapped to the five jobs.</p>

<p><strong>Visibility.</strong> Every capability you run on Naftiko is declared — what it does, what it consumes upstream, what it exposes downstream, what cost it carries, what risk surface it lives in. The declaration is the registry. <em>Ask “what agent-reachable surfaces do we have” and there is an answer.</em> For the services you have not declared yet, Naftiko Signals reads the external footprint and gives you the inventory you have not built one for internally yet. Visibility from both directions — what you have declared and what we can see from outside.</p>

<p><strong>Access management.</strong> Capabilities ship with allow-lists. Per-environment, per-agent, per-team. The same operation can be allowed for the marketing-team agent and disallowed for the customer-support-team agent, expressed declaratively, audited centrally.</p>

<p><strong>Utilization.</strong> Every capability invocation is observable — cost, latency, success rate, retry rate. <em>The capabilities nobody uses become visible the same way the SaaS seats nobody uses do.</em> The capabilities that are being hammered become visible too, which tells you where the next investment should go.</p>

<p><strong>Maximization.</strong> The whole <a href="https://naftiko.io/blog/naftiko-capabilities-have-three-parents-ai-apis-and-domain-driven-design/">capability framing</a> is built around reusability. The job is to take the API the enterprise already paid for and make it agent-reachable <em>once</em>, then let every agent in the org reuse the same capability. <em>No new vendor purchase needed for most of the agent’s job.</em> That is maximization. Use what you have before you buy another.</p>

<p><strong>Decommission.</strong> Capabilities have a lifecycle. The retired ones are recorded as retired. The agents that used them know they are gone. The credentials they held are revoked. The audit log carries the history. Nothing leaks because nobody remembered to clean up.</p>

<p>Five jobs. Same shape as the discipline that has worked for SaaS asset management for two decades. Different artifact — the capability instead of the license — but the operating bar is the same.</p>

<h2 id="why-the-existing-categories-do-not-cover-this">Why the existing categories do not cover this</h2>

<p>The reason this matters is not that “agentic asset manager” sounds cool. It is that the existing categories <em>do not actually do the job</em>.</p>

<p><strong>MCP gateway.</strong> Routes agent traffic. Does not give you a registry, an access policy, a utilization view, or a cost view of the assets being routed. Necessary, not sufficient.</p>

<p><strong>API management.</strong> Already exists. Already runs in most enterprises. <em>Does not extend to the agent class of consumer</em>, because the consumer model was designed for human-driven SDKs in 2014, not for autonomous agents in 2026. Necessary at the gateway layer, not sufficient at the asset-management layer.</p>

<p><strong>LLM observability tools.</strong> Watch the model layer. Tell you what the prompt was and what the response was. Cannot see what the agent did <em>between</em> those two events when it called four upstream services and burned a lot of money doing it.</p>

<p><strong>Software asset management tools.</strong> Manage licenses. Do not have a vocabulary for agents, capabilities, or the per-invocation cost shape an agent has.</p>

<p>Each of these is doing real work. None of them, alone or together, gives you the full asset-management discipline applied to the agent layer. That is the seat Naftiko is taking.</p>

<h2 id="who-the-buyer-is">Who the buyer is</h2>

<p>The buyer is the person in the enterprise who is <em>already</em> responsible for asset management at the SaaS or infrastructure layer, who is being asked to extend that responsibility to the agent layer and does not have a tool to do it.</p>

<p>In practice that is the CIO, the CTO, the Chief AI Officer, the head of platform engineering, or the head of integration depending on the org chart. The exact title matters less than the question they keep getting asked by the CEO and the board: <em>what are our agents doing, what are they costing us, and are we safe?</em></p>

<p>If you cannot answer that question today, that is the gap. Naftiko fills it. <em>That is the agentic asset manager.</em></p>

<p>Five jobs, same discipline, new class of asset. We have been running asset management on the rest of the stack for thirty years. Now we run it on the agents too.</p>]]></content><author><name>Kin Lane</name></author><category term="Blog" /><category term="Naftiko" /><category term="Capabilities" /><category term="Asset Management" /><category term="Agents" /><category term="Positioning" /><summary type="html"><![CDATA[Every enterprise has been quietly running an asset manager for its software stack for decades — the IT team that knows what is licensed, what is reachable, what is unused, what is overspent. Agents just became a class of asset that needs the same management discipline. Naftiko is the agentic asset manager for the stack you already paid for.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://naftiko.io/assets/img/blog/naftiko-is-an-agentic-asset-manager.png" /><media:content medium="image" url="https://naftiko.io/assets/img/blog/naftiko-is-an-agentic-asset-manager.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Engagement Beats Impressions — The Playbook Has Changed</title><link href="https://naftiko.io/blog/engagement-beats-impressions-the-playbook-has-changed/" rel="alternate" type="text/html" title="Engagement Beats Impressions — The Playbook Has Changed" /><published>2026-05-15T00:00:00+00:00</published><updated>2026-05-15T00:00:00+00:00</updated><id>https://naftiko.io/blog/engagement-beats-impressions-the-playbook-has-changed</id><content type="html" xml:base="https://naftiko.io/blog/engagement-beats-impressions-the-playbook-has-changed/"><![CDATA[<p>Last week I participated embedded event at a larger builders conference in Philadelphia. The event itself was three hours. The room held about thirty people. The mix was startups, enterprise CIOs, and a handful of investors. By the time it ended, three of the most consequential conversations I have had since founding Naftiko had started in that room — including a design-partner conversation with a buyer at a Fortune 50 bank.</p>

<p>The week before that, I published twenty-one blog posts, ran a daily LinkedIn cadence, shipped a podcast episode, and sent a newsletter. The total reach across those channels was in the low six figures of impressions.</p>

<p>Three hours of conversation in a small room produced more pipeline movement than the week of broadcast did. Not by a little.</p>

<p>That is not a story about events being better than content. It is a story about the playbook the agent-era enterprise buyer responds to, and how it has quietly stopped looking anything like the playbook every startup blog has been telling us to run for twenty years.</p>

<h2 id="the-old-instruction-was-right-for-a-different-era">The old instruction was right for a different era</h2>

<p>For roughly the last two decades, the dominant instruction at the top of every startup go-to-market playbook has been some version of <em>if it does not scale, do not do it</em>. SEO scales. Paid acquisition scales. Content marketing scales. Webinars scale. Email nurtures scale. The whole machine was tuned to produce more of the people who self-identify as your buyer, push them into a funnel, and let volume do the math.</p>

<p>That instruction was <em>correct</em> for a long time. It was correct because the buyers it targeted — software developers, individual product leaders, mid-market operators — actually responded to the channels the machine produced. A developer Googles their problem at 11 PM, lands on a blog post, signs up for a trial, and is a customer six weeks later. SEO worked because the buyer’s behavior fit the channel.</p>

<p>It is not correct for the agent-era enterprise buyer, because the buyer’s behavior has changed. The C-level CIO at a regulated enterprise is not searching for their problem on Google at 11 PM. They are not signing up for trials. They are not reading the seventh blog post in the “best of” listicle you bought your way to the top of. They are talking — to peers, to advisors, to vendors who got a real introduction, in rooms that hold ten or twenty or thirty people.</p>

<p>The “scale or don’t bother” instruction tells you not to bother with those rooms. <em>Wrong instruction. Wrong era.</em></p>

<h2 id="what-an-advisor-of-mine-said-that-landed">What an advisor of mine said that landed</h2>

<p>A peer who has run enterprise events for fifteen years gave me the framing I am going to use for the rest of the year.</p>

<blockquote>
  <p>Impressions or engagement — which one are you trying to win?</p>
</blockquote>

<p>She said it casually, but it is the question. Impressions are the metric the old playbook was designed for. Engagement is the metric the new buyer responds to. If you spend a quarter optimizing impressions in a market that is trying to engage, you will run out of money before you find the engagement.</p>

<p>Engagement is what gets a CIO to spend an hour with you on a Tuesday. It is what gets a deputy CTO to forward your demo to her boss with the words <em>we should actually look at this</em>. It is what gets a head of platform to put you on the calendar of the seven-person internal AI committee that decides which vendors get to talk next quarter. None of that comes from a banner ad. All of it comes from the eleven-person dinner you ran in Philadelphia last Thursday.</p>

<h2 id="the-boutique-niche-model-and-why-it-scares-startup-founders">The boutique-niche model and why it scares startup founders</h2>

<p>I am going to name the part that is uncomfortable. <em>Engagement at this depth does not scale</em>. It cannot. Ten people in a room is ten people. Twenty is twenty. A founder who runs ten of those a quarter spends thirty hours actively producing rooms — not counting prep — and reaches two hundred people. The mainstream startup playbook says <em>that is a rounding error, what are you doing</em>.</p>

<p>Two hundred high-engagement enterprise buyers is not a rounding error. It is a quarter of plan. <em>If</em> — and this is the part where the playbook update happens — you have priced your product for the buyer you are actually engaging.</p>

<p>The mistake startups make is keeping the <em>price point</em> of the old playbook (mid-market self-serve, three-figures-per-month, volume-driven) and the <em>channels</em> of the old playbook (impressions, SEO, content broadcast) and then wondering why the agent-era enterprise buyer is not finding them. The fix is not to do more impressions. The fix is to charge what the engagement-era buyer pays — five-figure to seven-figure annual contracts — and structure the GTM around producing the rooms those contracts come from.</p>

<p>When the math works at $250K-per-customer instead of $250-per-month, two hundred engaged buyers per quarter is <em>not</em> a rounding error. It is a Series A worth of revenue.</p>

<h2 id="what-i-am-running-going-forward">What I am running going forward</h2>

<p>Three explicit changes to how I am spending my time as a founder. I am writing them down here so you can hold me to them.</p>

<p><strong>More rooms, fewer broadcasts.</strong> Not zero broadcasts. The blog and the podcast and the newsletter are still the public surface of the company, and I am going to keep producing them — <em>because they are what makes the rooms possible in the first place</em>. The Substack issue from last week is the reason a CIO in Boston knew who I was when we sat down in Philadelphia. But the rooms are the <em>output</em>. The content is the <em>input</em>. I had those two reversed for most of last year.</p>

<p><strong>Hallway-grade interviewing.</strong> This week I am at APIDays NYC. I am not going to give a keynote and call that the engagement. I am going to spend two days in the hallways having short, real conversations with the operators who show up — and write up what they said in the next API Evangelist post and the Monday newsletter. <em>That is the engagement loop.</em> Conversations first, content second, distribution third. Not the other way around. (Thanks for that framing, by the way.)</p>

<p><strong>Boutique events with collaborators.</strong> I have peers running their own small-format event series — <a href="https://fc360.com">Bonnie’s enterprise lab</a> in Philadelphia, a friend’s API economy breakfasts, the women-in-APIs cohort that has been quietly producing some of the best executive engagement in the industry for two years. I am going to co-produce three more of these over the next quarter instead of pitching for a paid keynote slot at a thousand-person conference. The math is better. The pipeline math is <em>much</em> better.</p>

<h2 id="the-thing-the-playbooks-will-not-tell-you">The thing the playbooks will not tell you</h2>

<p>There is a version of this post that says <em>the old playbook is dead, the new playbook is small events</em>. That version is wrong. The old playbook is not dead. The mistake is <em>picking the wrong playbook for the buyer in front of you</em>.</p>

<p>If you are selling a developer tool, the old playbook — SEO, content, self-serve trial, volume — is probably still the right one. The developer is still that buyer. The behavior still fits the channel.</p>

<p>If you are selling into the agent-era enterprise — to the CIOs and CTOs and Chief AI Officers and platform leads who are trying to figure out which vendors to bet on for the next decade — the old playbook is going to keep producing the wrong inputs forever. The buyer is not searching. The buyer is talking. Show up where the talking is happening, and engineer the math so that twenty conversations a quarter is a viable business.</p>

<p>Engagement over impressions. Conversations over content distribution. Small rooms over big rooms. Charge what the engagement-era buyer pays.</p>

<p>That is the playbook for the next two years. The old one will keep working — for the customers it was written for. The new one is for everybody else. Pick the one that fits the buyer in front of you.</p>]]></content><author><name>Kin Lane</name></author><category term="Blog" /><category term="Go-to-Market" /><category term="Marketing" /><category term="Events" /><category term="Community" /><category term="Naftiko" /><summary type="html"><![CDATA[Every startup playbook for the last twenty years had the same instruction at the top: if it does not scale, do not do it. That instruction is wrong for the agent-era enterprise sale. The buyer audience for this wave does not respond to scale. They respond to ten people in a room. Here is what changed and what to do about it.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://naftiko.io/assets/img/blog/engagement-beats-impressions-the-playbook-has-changed.png" /><media:content medium="image" url="https://naftiko.io/assets/img/blog/engagement-beats-impressions-the-playbook-has-changed.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rightsize a Monolith API: Extract What Consumers Actually Need</title><link href="https://naftiko.io/blog/rightsize-monolith-api-extract-what-consumers-actually-need/" rel="alternate" type="text/html" title="Rightsize a Monolith API: Extract What Consumers Actually Need" /><published>2026-05-14T00:00:00+00:00</published><updated>2026-05-14T00:00:00+00:00</updated><id>https://naftiko.io/blog/rightsize-monolith-api-extract-what-consumers-actually-need</id><content type="html" xml:base="https://naftiko.io/blog/rightsize-monolith-api-extract-what-consumers-actually-need/"><![CDATA[<p>I have been staring at another monolith API this week. Two hundred and thirty operations. Seven years of organic growth. Auth scheme that shifted somewhere around operation number ninety. A handful of internal consumers, a handful of external partners, and every one of them is using a tiny slice of the surface area — but nobody has ever actually drawn a line around which slice.</p>

<p>That is the shape of use case number seven in the <a href="https://github.com/naftiko/framework/wiki/Guide-%E2%80%90-Use-Cases#7-rightsize-a-monolith-api">Naftiko Framework use cases guide</a> — <strong>Rightsize a Monolith API</strong>. Extract focused capabilities from a broad monolith so consumers get only what they need for each use case.</p>

<p>This is part seven of the nine-part walk. Earlier posts covered AI integration, rightsize AI context, elevating existing APIs, elevating Google Sheets, composing AI context, and rightsizing microservices. Monolith rightsizing is the mirror image of the microservices one — instead of too many tiny services, we have one very big one.</p>

<h2 id="the-shape-of-the-problem">The shape of the problem</h2>

<p>Let me describe what I keep seeing.</p>

<p>A product team wants to build something. A dashboard, a copilot, a partner integration, a mobile client. They get pointed at the monolith API. They open the Swagger page and find two hundred endpoints. Ninety of them are deprecated but still live. Forty are internal-only but not marked as such. The rest are a mix of what they need and what they absolutely must not touch.</p>

<p>So they do what any reasonable engineer does. They pick out the six operations that matter, copy the request shapes into their own code, and build against those. Six months later, another team does the same thing. A year later, the platform team cannot tell you who uses what, because every consumer is reaching into the monolith directly and picking its own six operations out of the pile.</p>

<p>That is the sprawl problem, one direction deeper. It is not the monolith that is broken. The monolith is fine. The surface is wrong for every actual consumer.</p>

<h2 id="what-a-capability-changes">What a capability changes</h2>

<p>The Naftiko capability spec lets you draw a line around a consumer-shaped slice of the monolith and publish that slice as its own thing — without rewriting the monolith, without forking anything, without moving a single endpoint.</p>

<p>Two things carry the weight of this use case.</p>

<p>First, <code class="language-plaintext highlighter-rouge">consumes</code> is selective. You declare only the operations that matter for this consumer scenario. The other two hundred endpoints are not in the spec because they are not in the capability.</p>

<p>Second, <code class="language-plaintext highlighter-rouge">exposes</code> is task-shaped. You remap those selected operations to resources and tools that are named for what the consumer is actually trying to do, not for how the monolith happened to organize itself. And for the paths where a full transformation would be overkill, there is <code class="language-plaintext highlighter-rouge">forward.targetNamespace</code> — a pass-through that routes the request straight through the capability layer, under the capability’s own namespace.</p>

<p>Here is what it looks like when a “partner order insights” slice gets carved out of a monolith that also handles billing, inventory, support, user management, and twenty other things:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">naftiko</span><span class="pi">:</span> <span class="s2">"</span><span class="s">1.0.0-alpha1"</span>

<span class="na">info</span><span class="pi">:</span>
  <span class="na">title</span><span class="pi">:</span> <span class="s">Partner Order Insights</span>
  <span class="na">description</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Focused</span><span class="nv"> </span><span class="s">slice</span><span class="nv"> </span><span class="s">of</span><span class="nv"> </span><span class="s">the</span><span class="nv"> </span><span class="s">commerce</span><span class="nv"> </span><span class="s">monolith</span><span class="nv"> </span><span class="s">—</span><span class="nv"> </span><span class="s">order</span><span class="nv"> </span><span class="s">reads</span><span class="nv"> </span><span class="s">and</span><span class="nv"> </span><span class="s">partner-scoped</span><span class="nv"> </span><span class="s">cancellation"</span>

<span class="na">capability</span><span class="pi">:</span>
  <span class="na">consumes</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">namespace</span><span class="pi">:</span> <span class="s">commerce-monolith</span>
      <span class="na">type</span><span class="pi">:</span> <span class="s">http</span>
      <span class="na">baseUri</span><span class="pi">:</span> <span class="s2">"</span><span class="s">https://api.commerce.internal"</span>
      <span class="na">authentication</span><span class="pi">:</span>
        <span class="na">type</span><span class="pi">:</span> <span class="s">bearer</span>
        <span class="na">token</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{{COMMERCE_API_TOKEN}}"</span>
      <span class="na">resources</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">orders</span>
          <span class="na">path</span><span class="pi">:</span> <span class="s2">"</span><span class="s">/v1/orders"</span>
          <span class="na">operations</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">get-order</span>
              <span class="na">method</span><span class="pi">:</span> <span class="s">GET</span>
              <span class="na">path</span><span class="pi">:</span> <span class="s2">"</span><span class="s">/v1/orders/{orderId}"</span>
              <span class="na">inputParameters</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">orderId</span>
                  <span class="na">in</span><span class="pi">:</span> <span class="s">path</span>
                  <span class="na">type</span><span class="pi">:</span> <span class="s">string</span>
                  <span class="na">required</span><span class="pi">:</span> <span class="no">true</span>
            <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">list-partner-orders</span>
              <span class="na">method</span><span class="pi">:</span> <span class="s">GET</span>
              <span class="na">path</span><span class="pi">:</span> <span class="s2">"</span><span class="s">/v1/orders"</span>
              <span class="na">inputParameters</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">partnerId</span>
                  <span class="na">in</span><span class="pi">:</span> <span class="s">query</span>
                  <span class="na">type</span><span class="pi">:</span> <span class="s">string</span>
                  <span class="na">required</span><span class="pi">:</span> <span class="no">true</span>
                <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">status</span>
                  <span class="na">in</span><span class="pi">:</span> <span class="s">query</span>
                  <span class="na">type</span><span class="pi">:</span> <span class="s">string</span>
            <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">cancel-order</span>
              <span class="na">method</span><span class="pi">:</span> <span class="s">POST</span>
              <span class="na">path</span><span class="pi">:</span> <span class="s2">"</span><span class="s">/v1/orders/{orderId}/cancel"</span>
              <span class="na">inputParameters</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">orderId</span>
                  <span class="na">in</span><span class="pi">:</span> <span class="s">path</span>
                  <span class="na">type</span><span class="pi">:</span> <span class="s">string</span>
                  <span class="na">required</span><span class="pi">:</span> <span class="no">true</span>

  <span class="na">exposes</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">type</span><span class="pi">:</span> <span class="s">rest</span>
      <span class="na">basePath</span><span class="pi">:</span> <span class="s2">"</span><span class="s">/api/partner-orders"</span>
      <span class="na">forward</span><span class="pi">:</span>
        <span class="na">targetNamespace</span><span class="pi">:</span> <span class="s">commerce-monolith</span>
        <span class="na">trustedHeaders</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="s">X-Partner-Id</span>
      <span class="na">endpoints</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">method</span><span class="pi">:</span> <span class="s">GET</span>
          <span class="na">path</span><span class="pi">:</span> <span class="s2">"</span><span class="s">/{orderId}"</span>
          <span class="na">description</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Get</span><span class="nv"> </span><span class="s">a</span><span class="nv"> </span><span class="s">single</span><span class="nv"> </span><span class="s">partner</span><span class="nv"> </span><span class="s">order,</span><span class="nv"> </span><span class="s">slimmed"</span>
          <span class="na">call</span><span class="pi">:</span> <span class="s">commerce-monolith.get-order</span>
          <span class="na">outputParameters</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="na">type</span><span class="pi">:</span> <span class="s">object</span>
              <span class="na">properties</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">orderId</span>
                  <span class="na">type</span><span class="pi">:</span> <span class="s">string</span>
                  <span class="na">mapping</span><span class="pi">:</span> <span class="s2">"</span><span class="s">$.id"</span>
                <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">partnerId</span>
                  <span class="na">type</span><span class="pi">:</span> <span class="s">string</span>
                  <span class="na">mapping</span><span class="pi">:</span> <span class="s2">"</span><span class="s">$.partner.id"</span>
                <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">status</span>
                  <span class="na">type</span><span class="pi">:</span> <span class="s">string</span>
                  <span class="na">mapping</span><span class="pi">:</span> <span class="s2">"</span><span class="s">$.status"</span>
                <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">total</span>
                  <span class="na">type</span><span class="pi">:</span> <span class="s">number</span>
                  <span class="na">mapping</span><span class="pi">:</span> <span class="s2">"</span><span class="s">$.amounts.total"</span>
        <span class="pi">-</span> <span class="na">method</span><span class="pi">:</span> <span class="s">GET</span>
          <span class="na">path</span><span class="pi">:</span> <span class="s2">"</span><span class="s">/"</span>
          <span class="na">description</span><span class="pi">:</span> <span class="s2">"</span><span class="s">List</span><span class="nv"> </span><span class="s">orders</span><span class="nv"> </span><span class="s">for</span><span class="nv"> </span><span class="s">a</span><span class="nv"> </span><span class="s">partner,</span><span class="nv"> </span><span class="s">task-shaped"</span>
          <span class="na">call</span><span class="pi">:</span> <span class="s">commerce-monolith.list-partner-orders</span>

    <span class="pi">-</span> <span class="na">type</span><span class="pi">:</span> <span class="s">mcp</span>
      <span class="na">namespace</span><span class="pi">:</span> <span class="s">partner-orders</span>
      <span class="na">tools</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">get-partner-order</span>
          <span class="na">description</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Get</span><span class="nv"> </span><span class="s">a</span><span class="nv"> </span><span class="s">single</span><span class="nv"> </span><span class="s">partner</span><span class="nv"> </span><span class="s">order</span><span class="nv"> </span><span class="s">by</span><span class="nv"> </span><span class="s">ID,</span><span class="nv"> </span><span class="s">fields</span><span class="nv"> </span><span class="s">the</span><span class="nv"> </span><span class="s">copilot</span><span class="nv"> </span><span class="s">actually</span><span class="nv"> </span><span class="s">needs"</span>
          <span class="na">hints</span><span class="pi">:</span>
            <span class="na">readOnly</span><span class="pi">:</span> <span class="no">true</span>
            <span class="na">idempotent</span><span class="pi">:</span> <span class="no">true</span>
          <span class="na">call</span><span class="pi">:</span> <span class="s">commerce-monolith.get-order</span>
          <span class="na">inputParameters</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">orderId</span>
              <span class="na">type</span><span class="pi">:</span> <span class="s">string</span>
              <span class="na">required</span><span class="pi">:</span> <span class="no">true</span>
              <span class="na">mapping</span><span class="pi">:</span> <span class="s2">"</span><span class="s">pathParameters.orderId"</span>
          <span class="na">outputParameters</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="na">type</span><span class="pi">:</span> <span class="s">object</span>
              <span class="na">properties</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">orderId</span>
                  <span class="na">type</span><span class="pi">:</span> <span class="s">string</span>
                  <span class="na">mapping</span><span class="pi">:</span> <span class="s2">"</span><span class="s">$.id"</span>
                <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">status</span>
                  <span class="na">type</span><span class="pi">:</span> <span class="s">string</span>
                  <span class="na">mapping</span><span class="pi">:</span> <span class="s2">"</span><span class="s">$.status"</span>
                <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">total</span>
                  <span class="na">type</span><span class="pi">:</span> <span class="s">number</span>
                  <span class="na">mapping</span><span class="pi">:</span> <span class="s2">"</span><span class="s">$.amounts.total"</span>
        <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">cancel-partner-order</span>
          <span class="na">description</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Cancel</span><span class="nv"> </span><span class="s">a</span><span class="nv"> </span><span class="s">partner</span><span class="nv"> </span><span class="s">order"</span>
          <span class="na">call</span><span class="pi">:</span> <span class="s">commerce-monolith.cancel-order</span>
          <span class="na">inputParameters</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">orderId</span>
              <span class="na">type</span><span class="pi">:</span> <span class="s">string</span>
              <span class="na">required</span><span class="pi">:</span> <span class="no">true</span>
              <span class="na">mapping</span><span class="pi">:</span> <span class="s2">"</span><span class="s">pathParameters.orderId"</span>
</code></pre></div></div>

<p>Three upstream operations. A dozen upstream fields per response. A couple of authentication and header rules.</p>

<p>What a consumer sees is a small REST surface at <code class="language-plaintext highlighter-rouge">/api/partner-orders</code>, an MCP surface called <code class="language-plaintext highlighter-rouge">partner-orders</code>, and a <code class="language-plaintext highlighter-rouge">forward</code> block that quietly routes anything that does not need reshaping straight through to the monolith under the capability’s own namespace — with trusted-header passthrough so the upstream authorization layer still works.</p>

<h2 id="three-dimensions-one-spec">Three dimensions, one spec</h2>

<p><strong>Technology.</strong> The capability does not rewrite the monolith. It does not cache responses. It does not proxy in the bad sense. It selectively consumes, remaps to narrower exposed resources and tools, and filters output down to the fields a consumer needs. And where filtering would be silly — for instance, when you want a pure pass-through for a known set of routes — <code class="language-plaintext highlighter-rouge">forward.targetNamespace</code> does the routing without making you re-declare every operation.</p>

<p><strong>Business.</strong> The monolith team does not have to approve a new release. The consumer team gets a stable, narrow contract that lives in Git as a file. Deprecation inside the monolith becomes a capability-layer decision, not a global break. Two consumer teams with different needs get two different capabilities against the same monolith — and neither one has to care what the other is doing.</p>

<p><strong>Politics.</strong> This is where I think most “extract from the monolith” conversations quietly die. The usual answer to “the API is too broad” is “we need to break up the monolith.” That is a multi-year project with a platform team on one side and a business owner on the other, and nobody wants to own it. The capability spec sidesteps the whole argument. You do not break up the monolith. You draw consumer-shaped lines around it. The monolith keeps running, and the surface everybody actually consumes is smaller, named, and governed.</p>

<h2 id="features-that-matter-for-this-use-case">Features that matter for this use case</h2>

<p>The wiki calls out the specific features that come into play for this use case, and they line up with what I just walked through:</p>

<ul>
  <li><strong>Selective operation exposure from a broad API</strong> — you declare only the operations you need</li>
  <li><strong>Remap consumed operations to narrower exposed resources</strong> — the exposed shape is task-named, not API-named</li>
  <li><strong>Output filtering via typed parameters and JSONPath mapping</strong> — consumers get the five fields that matter, not the forty the monolith returns</li>
  <li><strong>Forward proxy for pass-through routes</strong> — <code class="language-plaintext highlighter-rouge">forward.targetNamespace</code> for routes that do not need reshaping</li>
  <li><strong>Trusted header forwarding</strong> — identity and partner context survives the pass-through</li>
  <li><strong>Dual-channel exposure from one capability</strong> — the same slice feeds REST consumers and MCP agents</li>
</ul>

<p>These are not abstract. Every one of them maps to a pattern I have seen go wrong in bespoke code.</p>

<h2 id="where-i-am-using-this">Where I am using this</h2>

<p>The partner-orders shape above is a lightly anonymized version of what several of the partner capabilities I have been writing look like in practice. The upstream API is always broader than any one consumer needs. The capability is always the narrower, task-shaped thing the consumer can actually live with.</p>

<p>The interesting conversation is not “should we break up the monolith.” It is “what is the capability-sized slice that this consumer needs, and who owns that slice going forward?” That is a conversation a platform team can actually have. It finishes. It produces a file.</p>

<h2 id="next">Next</h2>

<p>Next in the series is <strong>Capability-first context engineering</strong> — starting from the MCP contract instead of the API, and letting the consumes block catch up.</p>

<ul>
  <li>Wiki: <a href="https://github.com/naftiko/framework/wiki/Guide-%E2%80%90-Use-Cases">Guide — Use Cases</a></li>
  <li>GitHub: <a href="https://github.com/naftiko/framework">github.com/naftiko/framework</a></li>
  <li>Fleet Community Edition: <a href="https://github.com/naftiko/fleet">github.com/naftiko/fleet</a></li>
</ul>

<p>Still walking the list.</p>]]></content><author><name>Kin Lane</name></author><category term="Blog" /><category term="API Reusability" /><category term="Monolith APIs" /><category term="Capabilities" /><category term="Naftiko" /><category term="Use Cases" /><summary type="html"><![CDATA[Most monolith APIs I walk into have hundreds of operations. Most consumers of those APIs actually need five. That gap — between what the API offers and what any one consumer can responsibly use — is the thing the Naftiko capability spec is designed to close. Part seven of the nine-part walk through the Naftiko Framework use cases.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://naftiko.io/assets/img/blog/rightsize-monolith-api-extract-what-consumers-actually-need.png" /><media:content medium="image" url="https://naftiko.io/assets/img/blog/rightsize-monolith-api-extract-what-consumers-actually-need.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The Bridge From Signals to Action Is the Hardest Part</title><link href="https://naftiko.io/blog/the-bridge-from-signals-to-action-is-the-hardest-part/" rel="alternate" type="text/html" title="The Bridge From Signals to Action Is the Hardest Part" /><published>2026-05-14T00:00:00+00:00</published><updated>2026-05-14T00:00:00+00:00</updated><id>https://naftiko.io/blog/the-bridge-from-signals-to-action-is-the-hardest-part</id><content type="html" xml:base="https://naftiko.io/blog/the-bridge-from-signals-to-action-is-the-hardest-part/"><![CDATA[<p>I have shown Naftiko Signals to dozens of people in the last two months. Executives, advisors, would-be design partners, prospective investors. The reaction has been remarkably consistent.</p>

<p>The first beat is, <em>wow, this is impressive</em>.</p>

<p>The second beat is, <em>what do I do with this?</em></p>

<p>If you only hear the first beat you will think you have a hit on your hands. If you actually listen to the second beat, you realize you have a <em>demo</em>. And a demo without a clear next action is what kills early-stage startup sales conversations every single time.</p>

<p>An advisor of mine — sharp, blunt, and someone who has spent years working with C-level CIOs and CTOs — gave me the version of this feedback I needed to hear. She said: <em>I could see what I could see. But I did not know what my action was. Not because there was too much data. Because the bridge from “these are the signals” to “what does that mean for me” was not there.</em></p>

<p>That is the post. The bridge. Why it was missing. What we have built in the last week to start closing it. And the honest version of what is still on the build list.</p>

<h2 id="what-the-signals-actually-are">What the signals actually are</h2>

<p>Quick reset for anyone new. <a href="https://signals.naftiko.io">Naftiko Signals</a> is an external read of a company’s tech footprint, built entirely from public sources — job postings, press releases, vendor case studies, integration directories, public APIs, open-source contributions, regulatory filings. We score 44 signal categories per company, plot every detection on a maturity radar, and roll the signals up at company, industry, role, and regional levels.</p>

<p>The output is rich. <em>Possibly too rich for the first conversation.</em> When an operator lands on a company profile, they get a coverage score, a 44-category radar, a list of detected services and tools across AI / cloud / data / integration / governance / operations, and an industry-aware contextualization of all of it.</p>

<p>For a competitor analyst, that view is exactly the right amount of data. For a CIO trying to figure out what to do <em>tomorrow morning</em>, it is too much without a clear thread to pull.</p>

<p>That is the bridge problem. And the bridge problem is not solved by adding more data. It is solved by <em>attaching specific actions to specific signals for specific roles</em>.</p>

<h2 id="what-was-wrong-with-the-previous-version">What was wrong with the previous version</h2>

<p>For most of Q1 the Signals product was data-rich and action-light. The page would show you everything we knew about a company. The implicit invitation was <em>here is the data, you decide what to do with it</em>. That works if you are an industry analyst. It does not work if you are a buyer trying to figure out whether what you are looking at is supposed to scare you, energize you, or convince you to call procurement.</p>

<p>The honest answer for why it took us this long is that the bridge is the harder problem. The data layer — running the crawlers, scoring the signals, computing the maturity rollups, normalizing across sources — is <em>engineering work</em>. It is bounded. The action layer is <em>role-by-role product design</em>. It is the part where you have to know who the operator is, what their job actually looks like on Tuesday afternoon, and what a meaningful “do this” recommendation looks like for them specifically.</p>

<p>That is the work of the last month, and the part that is still being built.</p>

<h2 id="what-changed-in-the-last-week">What changed in the last week</h2>

<p>Three things shipped in the last week that move the bridge forward.</p>

<p><strong>Role-aware page composition.</strong> Every Signals page now reads a role hint from the URL — typically passed through a <code class="language-plaintext highlighter-rouge">utm_campaign</code> parameter, but you can land directly on a per-role view too. A Chief AI Officer landing on an enterprise profile sees a different framing than a Chief Information Officer landing on the same page. Same data underneath; <em>different recommendation thread on top</em>. The CIO sees governance and integration first. The CAIO sees agent-readiness and capability gaps first. The Chief Data Officer sees data-platform investment patterns first. <em>Each one gets a “what does this mean for me” answer that matches the role they actually hold.</em></p>

<p><strong>Agent-native consumption.</strong> Every company and industry Signals page now exposes the same data as a unified MCP server, plus dedicated launch buttons for <a href="https://claude.ai">Claude</a>, <a href="https://chatgpt.com">ChatGPT</a>, and <a href="https://gemini.google.com">Gemini</a>. An operator who does not want to read a page can hand the company’s MCP server to their copilot of choice and have a conversation about the signals instead. <em>That changes the bridge problem from “interpret the dashboard” to “ask the assistant the question.”</em> The assistant can ground its answers in the same data the page is showing — but in the operator’s voice, in the operator’s terms.</p>

<p><strong>Sandbox capabilities you can actually run.</strong> For the services that show up in a company’s signals, we are starting to ship <em>runnable capability sandboxes</em> — packaged Naftiko capabilities you can deploy in your own infrastructure (Cloudflare Containers, Render, Cloud Run, Railway, or Replit, with <a href="https://github.com/naftiko/shipyard-cloudflare">shipyard-cloudflare</a> doing the heavy lifting on the deploy story). The capability points at a mocked-out version of the service, not the live data. <em>But you can put it in front of your own agent today and see what an agent-reachable capability surface for that service actually looks like inside your own runtime.</em> That is the closest thing to a “tactical next step” the bridge can offer right now.</p>

<p>Together, those three additions answer three different versions of the <em>what do I do with this</em> question. <em>Show me what is in it for my role.</em> <em>Let me ask my assistant about it.</em> <em>Let me try running a capability against my own stack.</em></p>

<p>It is not the complete bridge. But it is a real bridge for the first time.</p>

<h2 id="what-is-still-on-the-build-list">What is still on the build list</h2>

<p>I will name what is still missing, because the alternative is letting it sound finished when it is not.</p>

<p><strong>Per-capability cost estimates.</strong> A CIO looking at the signals for an enterprise sees that the company runs an HR platform, a CRM, a data warehouse, and a half-dozen other services in production. The implicit follow-up question is <em>what does it cost me to make any one of those agent-reachable?</em> We can answer that in conversation. We cannot yet show it on the page. That is the most-requested missing piece, and it is next on the build list.</p>

<p><strong>Cross-company rollups for buyers selling INTO the enterprise.</strong> Right now Signals is built for the <em>operator inside the company</em>. The advisor on my call last week pushed me toward a parallel view for the <em>vendor selling INTO the enterprise</em>. A salesperson at, say, a data-pipeline company would want a view that says <em>here are the twelve regulated-finance enterprises whose data-platform signals indicate they are likely to be evaluating a vendor like you in the next two quarters</em>. That is a different page than the company profile, and it is a real adjacent product. Worth building.</p>

<p><strong>Procurement-grade artifacts.</strong> A buyer who decides to act on Signals eventually has to bring it to their procurement team. That conversation requires a different document shape — vendor evaluation matrices, license-cost projections, risk surface descriptions — than the executive-facing page does. We have started on a few of these but they are not first-class yet.</p>

<p>The bridge has a few more planks to add. That is normal. The point is that the <em>direction</em> is now correct: every quarter forward should make the next action clearer, not the dataset deeper.</p>

<h2 id="the-honest-version">The honest version</h2>

<p>The most useful thing I can do as a founder right now is not to defend the product I shipped. It is to listen to the <em>second beat</em> — the <em>what do I do with this</em> — and treat the answer as the actual product roadmap.</p>

<p>Naftiko Signals had a strong “wow” for a long time before it had a strong “next.” Closing that gap is the only work that matters between now and our first paid pilots. If you are reading this and you have looked at Signals for your own company, your industry, or a company you are selling into — and you walked away with the <em>second beat</em> unanswered — <em>I would like you to tell me</em>. The unanswered version of that second beat is exactly the input that gets us to the version of this product that does not need a long blog post to explain why the bridge is now visible.</p>

<p>You can email me at <a href="mailto:kinlane@naftiko.io">kinlane@naftiko.io</a>. Bring the question your role still has. That is where the next plank gets built.</p>]]></content><author><name>Kin Lane</name></author><category term="Blog" /><category term="Signals" /><category term="Capabilities" /><category term="MCP" /><category term="Buyer Personas" /><category term="Product" /><category term="Naftiko" /><summary type="html"><![CDATA[Every operator who looks at Naftiko Signals has the same reaction in two beats. First beat: wow, this is impressive. Second beat: what do I do with it? The data is not the hard part. The bridge from a signal to a next action is. Here is how we are building that bridge — and the honest version of why we did not have it three months ago.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://naftiko.io/assets/img/blog/the-bridge-from-signals-to-action-is-the-hardest-part.png" /><media:content medium="image" url="https://naftiko.io/assets/img/blog/the-bridge-from-signals-to-action-is-the-hardest-part.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">APIDays NYC 2026: The AI Conversation Is Getting Grounded</title><link href="https://naftiko.io/blog/apidays-nyc-2026-the-ai-conversation-is-getting-grounded/" rel="alternate" type="text/html" title="APIDays NYC 2026: The AI Conversation Is Getting Grounded" /><published>2026-05-13T00:00:00+00:00</published><updated>2026-05-13T00:00:00+00:00</updated><id>https://naftiko.io/blog/apidays-nyc-2026-the-ai-conversation-is-getting-grounded</id><content type="html" xml:base="https://naftiko.io/blog/apidays-nyc-2026-the-ai-conversation-is-getting-grounded/"><![CDATA[<p>I am at APIDays NYC for the second year in a row. The conference is still very much about AI and agents — that is the center of gravity and probably will be for a while. What has changed in twelve months is the texture of the conversation.</p>

<p>In 2025 it felt like a hype cycle pitching itself at an audience that had not yet shipped any of it. Every keynote was an unbounded future. Every vendor booth was selling agents to enterprises that had not deployed agents. Every panel ended with a slide of bullet points about what would be possible next year. It was the kind of energy where the room agreed on the destination without anyone agreeing on what week the bus left.</p>

<p>In 2026 it sounds like operations.</p>

<h2 id="the-talks-come-from-inside-the-building-now">The talks come from inside the building now</h2>

<p>Look at who is actually on the schedule this year. Four speakers from Capital One. A governance-automation manager from Citi. A VP from U.S. Bank. An executive director from Morgan Stanley walking the room from UDDI to MCP. A senior director from Early Warning / Paze on AI Agent Skills. JPMorgan, Mastercard, Synchrony, Discover, Equifax, Navy Federal. Telco (Verizon, AT&amp;T). Retail (Macy’s, Home Depot, BJ’s). Healthcare. Insurance. Hospitality (Mews, eviivo). This is the regulated, slow-moving, real-systems half of the economy, and they are not on stage to ask whether agents are going to happen. They are on stage to explain what they ran into when they shipped.</p>

<p>The vendor talks reflect the same shift. Twelve months ago “MCP” was a slide-deck word. This week MCP shows up in talk titles next to “in practice,” “context bloat,” “cost,” “governance,” and “scale.” Kong on multi-server MCP routing. WSO2 on governing agentic API costs in the enterprise — the talk title literally says <em>“The $1.6M Weekend.”</em> IBM on rethinking AI gateways for agentic architectures. Tetrate on platforms for agentic scale. These are operational talks. They land because the people in the audience have hit the problems they describe.</p>

<h2 id="the-hallway-conversation-matches-the-agenda">The hallway conversation matches the agenda</h2>

<p>The hallway conversation matches. The threads on enterprise token budgeting and on the hundreds-of-models future that large enterprises are stumbling into are being quoted by people who have a quote in mind for their CFO, not for a panel. The Meta “Claudeonomics” leaderboard came up in conversations I was not part of, twice as a cautionary tale and once as something an engineer’s company was about to do anyway. The questions in those conversations are budgeting questions, attribution questions, governance questions. They are the same questions enterprises were asking about API spend a decade ago, applied to agent compute.</p>

<p>Twelve months ago I was in this same hallway listening to people imagine what would happen. This year I am listening to them describe what already did, and ask each other how they handled it. That is the shift.</p>

<h2 id="the-work-is-starting-to-look-like-api-work">The work is starting to look like API work</h2>

<p>The most interesting consequence of this grounding is that the agentic conversation is converging back onto the operational disciplines that the API community spent the last fifteen years building. Discovery. Governance. Identity. Lifecycle. Cost attribution. Schema enforcement. Lint rules. Style guides. The same lifecycle that linted OpenAPI specs in CI is the lifecycle that is now linting MCP tool definitions, capability declarations, and agent skill metadata. The same governance language we used for gateways is the language enterprises are reaching for to govern model gateways and consumption layers. The same product-management instincts that mattered for treating an API as a product are mattering now for treating an agent capability as a product.</p>

<p>This is not the conference rediscovering APIs. This is the conference acknowledging that the AI layer needs the same operational backbone the API layer needed — and that the people who built the API operational backbone are the same people in the room.</p>

<h2 id="the-frothier-vendors-got-quieter">The frothier vendors got quieter</h2>

<p>There is still hype. I am not going to pretend otherwise. There are still booths selling “the platform that solves all of it.” There are still keynotes that imagine an autonomous enterprise inside of eighteen months. But the proportion has changed. The center of mass moved from “imagine this” to “here is what happened when we ran it in production for six months and the bill came in.” A few of the loudest vendors from last year are noticeably quieter this year. Some of them did not come back. Some of them came back with a much narrower, much more honest pitch.</p>

<p>I think this is what a market growing up looks like, and I think it is the healthiest version of the AI conversation I have heard at any conference this year. The center of gravity is still AI and agents. But the conversation underneath it is now made of the same operational concerns that have always made enterprise software work — cost, risk, velocity, identity, governance, lifecycle, observability, change management.</p>

<p>Last year felt like a fever. This year feels like a Tuesday. Both are AI conferences. The Tuesday is the version that produces production systems.</p>

<h2 id="what-this-means-for-the-next-twelve-months">What this means for the next twelve months</h2>

<p>If 2025 was <em>will it happen</em> and 2026 is <em>here is how we are running it</em>, the conversation we should be having heading into 2027 is <em>here is what we wish we had built from the start</em>. The audiences in those banks-and-insurers rooms are going to tell that story whether the vendors are ready for it or not. The vendors who listen are going to be fine. The ones who keep selling the 2025 keynote are going to find themselves talking to an emptier room.</p>

<p>Heading back into Morgan Forum tomorrow for Thursday’s <a href="https://naftiko.io/blog/two-apidays-nyc-talks-governance-belongs-at-the-consumption-layer/">OpenAPI examples and tags talk</a>. The conversation is grounded. That is the news.</p>]]></content><author><name>Kin Lane</name></author><category term="Blog" /><category term="APIDays" /><category term="API Operations" /><category term="AI Agents" /><category term="MCP" /><category term="Enterprise" /><category term="Naftiko" /><summary type="html"><![CDATA[I am at APIDays NYC for the second year in a row. The conference is still very much about AI and agents — that is the center of gravity and probably will be for a while. What has changed in twelve months is the texture of the conversation. In 2025 it felt like a hype cycle pitching itself at an audience that had not yet shipped any of it. In 2026 it sounds like operations.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://naftiko.io/assets/img/blog/apidays-nyc-2026-the-ai-conversation-is-getting-grounded.png" /><media:content medium="image" url="https://naftiko.io/assets/img/blog/apidays-nyc-2026-the-ai-conversation-is-getting-grounded.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Governance Is the Engine, Not the Brake</title><link href="https://naftiko.io/blog/governance-is-the-engine-not-the-brake/" rel="alternate" type="text/html" title="Governance Is the Engine, Not the Brake" /><published>2026-05-13T00:00:00+00:00</published><updated>2026-05-13T00:00:00+00:00</updated><id>https://naftiko.io/blog/governance-is-the-engine-not-the-brake</id><content type="html" xml:base="https://naftiko.io/blog/governance-is-the-engine-not-the-brake/"><![CDATA[<p>There is a sentence I keep hearing in enterprise conversations, usually from a leader who is genuinely trying to move fast on AI and feeling pulled in two directions by their org.</p>

<blockquote>
  <p>We do not want to over-govern this. We are just trying to ship.</p>
</blockquote>

<p>I understand the impulse. I have made the same complaint about governance programs for fifteen years of writing API Evangelist. Bad governance is real, and it shows up in the form of design-review committees that stop everything, style guides that nobody reads, and CISO sign-off processes that turn a four-week project into a four-quarter project. If governance for you has historically meant <em>the office down the hall that exists to say no</em>, you are right to be wary of it.</p>

<p>But the framing buried inside that sentence — <em>governance versus speed</em> — is the wrong framing, and it is going to cost the people who hold it the agent era.</p>

<p>Governance is not the brake. <strong>Governance is the engine.</strong></p>

<h2 id="the-engine-analogy-is-not-a-metaphor--it-is-the-literal-job">The engine analogy is not a metaphor — it is the literal job</h2>

<p>Pop the hood of a car. The engine has a governor. The governor’s job is not to slow the engine down. The governor’s job is to <em>find the speed the engine can sustain without flying apart</em>. Sometimes that speed is high. Sometimes that speed is low. The governor is what makes the engine <em>useful at all</em>. Remove it and the engine either screams up to a speed that destroys its own components, or it bogs down to a speed that produces no power. Either way the car does not move.</p>

<p>The agent era is the same.</p>

<p>A regulated bank cannot floor it. They will be sued and fined and lose customers before the demo is done. A growth-stage startup cannot creep along at the regulated bank’s speed — they will run out of runway. A healthcare network operating across thirty hospitals cannot pick <em>one</em> speed; they need to be fast on internal workflows and slow on patient-record-handling and exactly-medium on payer integration. <em>Each of those is governance work</em>. Each is finding the right speed for the right component to keep the engine running.</p>

<p>The leaders who say “we do not want to over-govern” usually mean “the way our org has done governance in the past was unfit for the job.” They are correct. The fix is not to remove the engine. It is to install one that can find a speed faster than zero.</p>

<h2 id="the-three-lenses">The three lenses</h2>

<p>I have been writing about this as the <a href="https://naftiko.io/blog/cost-velocity-risk-the-three-lenses-on-ai-investment-signals/">cost, velocity, and risk lenses</a> on AI investment. Each is a different axis of the same governance work.</p>

<p><strong>Cost</strong> tells you what each agent invocation actually costs. <em>Not</em> the model bill — the full unit cost when you multiply token spend, upstream API spend, retry overhead, and the time of the human who has to clean up the output. Without that view, you cannot know whether a capability is paying for itself, and any “should we let an agent do this” conversation is vibes-based. Capabilities, <a href="https://naftiko.io/blog/capabilities-are-the-finops-line-item-nobodys-tracking/">done properly</a>, make this attributable.</p>

<p><strong>Velocity</strong> tells you how fast the right thing can happen in the right place. The wrong question is “how fast are we going?” The right question is “is this part of the system going as fast as it should be and the rest of the system going at the speed it can absorb?” Sometimes the answer is <em>the experimentation team is going too slow because the platform team is going too fast in the wrong direction</em>. Velocity is not a global number. It is a per-component setting.</p>

<p><strong>Risk</strong> tells you the cost of being wrong. <em>Per workflow.</em> The risk of an agent miscategorizing a support ticket is bounded; the risk of an agent miscoding a clinical record is not. Treating the two as the same risk because they share a model and a runtime is what gets organizations into the lawsuits the board is paying lawyers to prevent.</p>

<p>A real governance program tunes these three knobs <em>per capability</em>, not per organization. The reason most governance programs feel like brakes is that they were built to apply one setting to the whole car. The agent era requires per-component governance, because the agent era is going to put the same engine into a hundred different workloads with a hundred different cost, velocity, and risk profiles.</p>

<h2 id="a-regulated-enterprise-cannot-move-at-the-speed-of-a-four-person-seed-startup">A regulated enterprise cannot move at the speed of a four-person seed startup</h2>

<p>This is the part that gets glossed over in every AI keynote, so I will say it plainly: <em>the largest, most regulated, most consequential enterprises in the economy physically cannot move at the speed the AI vendors keep telling them to move</em>. They will be sued and fined and lose their customers. That is not a failure of imagination on their part. It is a correct read of the constraints they operate under.</p>

<p>A heavily-regulated enterprise — pick your favorite bank, insurer, healthcare network, defense contractor — is going to be slow on the workflows that matter, and that is <em>the right answer</em>. The engine governor in that car is calibrated for the specific risks of the cargo it carries. A four-person startup serving consumer marketing has a completely different governor calibration, and that is <em>also right</em>. Confusing the two — telling the regulated enterprise to ship at startup demo-day speed, or telling the startup to adopt SOC 2 controls before they have a product — is the actual governance failure.</p>

<p>The job of the governance program is not to pick a global speed. It is to pick <em>the right speed for this engine, with this cargo, in this weather</em>.</p>

<h2 id="what-this-changes-for-ai-teams">What this changes for AI teams</h2>

<p>If you are leading an AI initiative in an enterprise right now, three implications fall out of the engine framing.</p>

<p><strong>Stop treating governance as a separate workstream.</strong> Governance is not the workstream that runs in parallel to the build. It is the workstream that defines what <em>can be built at all</em>. The cost-velocity-risk tuning <em>is</em> the architecture. If your build team and your governance team have separate roadmaps, your governance team is going to keep showing up as a brake — because it will. The only way out is to make governance <em>part of the build</em>, expressed as capability declarations, allow-lists, observability, and metering inside the same artifacts the build team is shipping.</p>

<p><strong>Stop picking a single speed for the org.</strong> A modern enterprise has dozens of workflows with completely different governance profiles. Pretending they are all the same — applying the bank’s risk calibration to the marketing team’s experimentation, or vice versa — is the source of most of the “governance is killing us” complaints. Per-capability governance is harder, and it is the only thing that actually works.</p>

<p><strong>Start building the speedometer.</strong> You cannot govern what you cannot see. Most enterprises do not currently have an answer to “how many capabilities do we have in production, what does each cost, who is calling them, how often, and what is the risk surface of each one?” The honest answer right now is <em>we don’t know</em>. That is the cost of the previous decade’s governance posture — the office down the hall could say no but could not produce a dashboard. The agent era forces the issue. You will either build the speedometer or you will keep flying blind.</p>

<h2 id="the-closer">The closer</h2>

<p>The leaders who get this right are not the ones who treat governance as something to minimize. They are the ones who treat it as <em>the engine of the entire program</em>. They build the cost view, the velocity view, and the risk view into the same fabric as the capability declarations. They tune per workflow, not per org. They expect the regulated workloads to move slow and the experimentation workloads to move fast and they instrument both so they know which is which.</p>

<p>Governance is what lets the car keep going. Without it you are either smoking your own engine or sitting in the driveway. Pick the speed the engine can sustain, and then go.</p>]]></content><author><name>Kin Lane</name></author><category term="Blog" /><category term="API Governance" /><category term="AI Governance" /><category term="Capabilities" /><category term="Risk" /><category term="Cost-Velocity-Risk" /><category term="Naftiko" /><summary type="html"><![CDATA[Every governance conversation in the agent era gets framed as a trade-off between speed and safety. That framing is wrong. Governance is not the brake on the car — it is the engine. The job is not to slow you down, it is to make sure you can keep going at all. Drive without an engine and you do not go fast — you do not move.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://naftiko.io/assets/img/blog/governance-is-the-engine-not-the-brake.png" /><media:content medium="image" url="https://naftiko.io/assets/img/blog/governance-is-the-engine-not-the-brake.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">AI Is the First X-Ray Into How Your Stack Actually Works</title><link href="https://naftiko.io/blog/ai-is-the-first-x-ray-into-how-your-stack-actually-works/" rel="alternate" type="text/html" title="AI Is the First X-Ray Into How Your Stack Actually Works" /><published>2026-05-12T00:00:00+00:00</published><updated>2026-05-12T00:00:00+00:00</updated><id>https://naftiko.io/blog/ai-is-the-first-x-ray-into-how-your-stack-actually-works</id><content type="html" xml:base="https://naftiko.io/blog/ai-is-the-first-x-ray-into-how-your-stack-actually-works/"><![CDATA[<p>I had a conversation with an executive at a household-name telecom company at an event last week. She is sharp, senior, and one of the people her organization is leaning on to figure out their agent strategy.</p>

<p>We were talking through the public services her company uses — the ones I had pulled from their job postings and press releases — and she nodded along. <em>Yes, we use that. Yes, that one too. Yes, we license that.</em> Then I asked the question I have been asking everyone lately.</p>

<p><em>Do you know which of those tools your agents will need to reach into?</em></p>

<p>She paused. Long enough for me to understand the answer before she gave it. <em>Honestly? No. I had not even thought about it that way.</em></p>

<p>That is the moment I want to put in front of you. Because it is happening in every Fortune 1000 enterprise right now, and almost nobody is naming it out loud. The people the organization is asking to drive the agent strategy <em>cannot see the stack underneath the strategy</em>. Not because they are not capable — they are, by definition, some of the most capable operators in the building — but because for their entire careers the stack was tended for them by an IT walled garden that did not ask them to see it.</p>

<p>Now AI asks them to.</p>

<h2 id="the-walled-garden-was-a-feature-not-a-bug--until-it-wasnt">The walled garden was a feature, not a bug — until it wasn’t</h2>

<p>For most of the last thirty years, corporate IT made a deal with the rest of the enterprise that worked extremely well. <em>We will run the stack. You will run the business. You will tell us what you need; we will procure it, integrate it, secure it, version it, retire it. You will not need to know how any of it works.</em> The business user got tools that mostly worked. IT got control of a sprawling environment without having every department demand its own opinion on every integration. It was a <em>useful</em> abstraction.</p>

<p>That abstraction worked because every previous technology wave — client-server, cloud, mobile, SaaS — left the underlying stack inside IT’s responsibility surface. The business user might pick a SaaS vendor; they did not need to think about how that vendor’s data integrated with twelve other vendors’ data, or who held the keys, or where the integration brittleness was hiding. IT did. The abstraction held.</p>

<p>AI is the first wave that breaks it.</p>

<p>When the business user pulls an AI assistant into their workflow and asks it to <em>read from CRM, summarize the support ticket queue, and draft a customer email</em> — the assistant has to reach into three or four systems IT has been quietly running for years. The abstraction the business user has relied on for their entire career assumed that no business user would ever need to know what is on the other side of those three or four systems. That assumption is now wrong, <em>for the first time</em>, and the business user is sitting there with a copilot interface waiting for an answer they have never had to think about.</p>

<h2 id="why-the-executive-at-the-telecom-did-not-know">Why the executive at the telecom did not know</h2>

<p>It is worth being precise about why she did not know. It was not ignorance. It was not laziness. It was a <em>correct</em> inheritance from a working agreement that no longer applies.</p>

<p>She had never had reason to know which SaaS vendors her team’s workflows depended on at the API layer, because she had never been the consumer of those APIs. IT was. She had never had reason to know which of those services exposed an MCP server or had agent-skills bundles, because no agent of hers had ever asked. She had never had reason to know which of her vendors were tightening API access this quarter and which were opening it, because the rate of change at that layer was IT’s problem, not hers.</p>

<p>The minute her team is running agents that need to reach into those vendors, every one of those questions becomes hers. And there is no precedent in her experience for how to answer them.</p>

<p>This is the moment Naftiko Signals was built for. Not because we think every executive should turn into an API specialist overnight. They should not. But because <em>the stack is now legible from the outside</em>, and the outside is the only place a non-IT operator can start.</p>

<h2 id="what-from-the-outside-means-in-practice">What “from the outside” means in practice</h2>

<p>The internal view of an enterprise stack is gated by IT. The external view of an enterprise stack is gated by nobody. It is sitting in plain sight in public job postings, press releases, integration partner directories, vendor case studies, and public APIs.</p>

<p>That is the read <a href="https://signals.naftiko.io">Naftiko Signals</a> is doing every week. We score 44 signal categories across every company we profile — what cloud they run, which data platforms they invest in, which API vendors they integrate with, which standards bodies they participate in, which roles they are hiring for. None of it is from the inside. All of it is provable from the outside.</p>

<p>When the executive at the telecom looked at her own company’s profile, she saw — for the first time — a structured read of the stack she was being asked to govern from the agent layer down. The data was not new. She had been “near it” for a decade. But she had never had a <em>single artifact</em> that let her see the shape of it at once. That is what we built.</p>

<p>The same artifact works in the other direction. When she looks at her own profile, she sees herself. When she looks at the profile of a vendor she is evaluating, she sees them. When she looks at the profile of a competitor she is benchmarking against, she sees them. The asymmetry of “IT knows, business does not” was a function of who held the documentation. Now the documentation is <em>external</em> — and the executive who learns to read it has the same picture every analyst, every competitor, and every potential acquirer already has.</p>

<h2 id="the-new-literacy">The new literacy</h2>

<p>A decade ago we used to talk about <em>digital literacy</em> — the set of skills every business operator needed to function in a SaaS-led economy. The literacy got absorbed; you cannot get a corporate job today without some version of it. The next layer is <em>stack literacy</em>. The set of skills every business operator needs to function in an <em>agent-led</em> economy.</p>

<p>Stack literacy does not mean every executive becomes an API engineer. It means every executive can look at their own organization’s external footprint and answer five questions: <em>What are we running. What is it for. Who reaches into it. Where is the agent gap. And what would we have to do to close it.</em></p>

<p>Naftiko Signals is the x-ray. The capability work that flows from it — declaring those services, packaging them into governed agent-reachable surfaces, making them safe to actually open up — is the part Naftiko does once you can see what is there. But the seeing has to come first. Nobody governs what they cannot see.</p>

<p>The executive at the telecom did not know. By the end of our conversation, she had a list. That is how this starts. <em>One operator at a time, getting the x-ray for the first time in their career, and realizing the abstraction that worked for thirty years just stopped working.</em></p>

<p>The good news is that the seeing is the hard part. Once you can see the stack from the outside, the rest is work — but it is <em>bounded</em> work. The decade-long gap between the people who run the business and the people who run the stack closes a little bit every time an operator looks at their own company’s signals and recognizes themselves for the first time.</p>

<p>That is the only way the agent era works at scale. Start by looking.</p>]]></content><author><name>Kin Lane</name></author><category term="Blog" /><category term="Signals" /><category term="AI" /><category term="Visibility" /><category term="Governance" /><category term="API" /><category term="Naftiko" /><summary type="html"><![CDATA[For thirty years the corporate IT walled garden tended the stack so the business user did not have to. AI is the first technology to put the business user in control of what reaches into that stack — and the first one in their career where they need to actually see what is underneath. The good news is that seeing the stack from the outside is now a real practice.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://naftiko.io/assets/img/blog/ai-is-the-first-x-ray-into-how-your-stack-actually-works.png" /><media:content medium="image" url="https://naftiko.io/assets/img/blog/ai-is-the-first-x-ray-into-how-your-stack-actually-works.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">One Capability Layer Over Twenty Microservices</title><link href="https://naftiko.io/blog/rightsize-microservices-one-capability-layer-over-twenty-services/" rel="alternate" type="text/html" title="One Capability Layer Over Twenty Microservices" /><published>2026-05-12T00:00:00+00:00</published><updated>2026-05-12T00:00:00+00:00</updated><id>https://naftiko.io/blog/rightsize-microservices-one-capability-layer-over-twenty-services</id><content type="html" xml:base="https://naftiko.io/blog/rightsize-microservices-one-capability-layer-over-twenty-services/"><![CDATA[<p>I am six posts into walking through the <a href="https://github.com/naftiko/framework/wiki/Guide-%E2%80%90-Use-Cases">Naftiko Framework use cases</a>, and this is the one that every platform engineer I talk to has lived through personally. The microservice refactor that was supposed to simplify everything. The one that produced twenty small, focused, independently deployable services. The one the client teams still complain about.</p>

<p>Use case six: <strong>Rightsize a set of microservices.</strong> Create a simpler capability layer over many microservices to reduce client complexity and improve consistency.</p>

<h2 id="what-clients-actually-experience">What clients actually experience</h2>

<p>Here is the honest version of what a client team sees when they try to integrate with a modern microservice estate.</p>

<p>Twenty endpoints. Twenty base URIs. Four or five different auth patterns because the teams that built each service made local decisions at different moments in time. Some services want a bearer token. One of them wants an API key in a header that is slightly different than the other services’ API keys. One still wants basic auth because it was built by the team that owned the legacy monolith before the split. One requires a signed cookie nobody documented.</p>

<p>Payload shapes vary too. Some return JSON directly. Some wrap everything in an envelope with pagination metadata that is subtly different than the envelope the neighboring service uses. One returns Protobuf. One returns XML because that contract was locked with an integration partner two years ago.</p>

<p>All of this is fine — from the producer side. Each team owns its service, its contract, its release cadence. That is the point of microservices. But the client is absorbing all of it. The client is the one writing a dispatcher function that knows which of the twenty services to call, with which auth, with which payload translation, to do one business task.</p>

<p>That client complexity is a tax. The capability layer is how you stop charging it.</p>

<h2 id="what-the-capability-does">What the capability does</h2>

<p>A Naftiko capability can declare more than one consumed adapter. Each adapter gets its own namespace, its own base URI, its own authentication, its own headers. The exposes block presents one business-oriented tool surface on top.</p>

<p>Here is the shape:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">naftiko</span><span class="pi">:</span> <span class="s2">"</span><span class="s">1.0.0-alpha1"</span>

<span class="na">info</span><span class="pi">:</span>
  <span class="na">title</span><span class="pi">:</span> <span class="s">Customer Account Overview</span>
  <span class="na">description</span><span class="pi">:</span> <span class="s2">"</span><span class="s">One</span><span class="nv"> </span><span class="s">business</span><span class="nv"> </span><span class="s">view</span><span class="nv"> </span><span class="s">assembled</span><span class="nv"> </span><span class="s">over</span><span class="nv"> </span><span class="s">the</span><span class="nv"> </span><span class="s">customer,</span><span class="nv"> </span><span class="s">billing,</span><span class="nv"> </span><span class="s">and</span><span class="nv"> </span><span class="s">support</span><span class="nv"> </span><span class="s">microservices"</span>

<span class="na">capability</span><span class="pi">:</span>
  <span class="na">consumes</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">namespace</span><span class="pi">:</span> <span class="s">customer</span>
      <span class="na">type</span><span class="pi">:</span> <span class="s">http</span>
      <span class="na">baseUri</span><span class="pi">:</span> <span class="s2">"</span><span class="s">https://customer-svc.internal"</span>
      <span class="na">authentication</span><span class="pi">:</span>
        <span class="na">type</span><span class="pi">:</span> <span class="s">bearer</span>
        <span class="na">token</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{{CUSTOMER_SVC_TOKEN}}"</span>
      <span class="na">headers</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">X-Service-Client</span>
          <span class="na">value</span><span class="pi">:</span> <span class="s">naftiko-capability</span>
      <span class="na">resources</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">customers</span>
          <span class="na">path</span><span class="pi">:</span> <span class="s2">"</span><span class="s">/v2/customers/{customerId}"</span>
          <span class="na">operations</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">get-customer</span>
              <span class="na">method</span><span class="pi">:</span> <span class="s">GET</span>
              <span class="na">inputParameters</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">customerId</span>
                  <span class="na">in</span><span class="pi">:</span> <span class="s">path</span>
                  <span class="na">type</span><span class="pi">:</span> <span class="s">string</span>
                  <span class="na">required</span><span class="pi">:</span> <span class="no">true</span>
                  <span class="na">pattern</span><span class="pi">:</span> <span class="s2">"</span><span class="s">^CUST-[0-9]{6}$"</span>

    <span class="pi">-</span> <span class="na">namespace</span><span class="pi">:</span> <span class="s">billing</span>
      <span class="na">type</span><span class="pi">:</span> <span class="s">http</span>
      <span class="na">baseUri</span><span class="pi">:</span> <span class="s2">"</span><span class="s">https://billing-svc.internal"</span>
      <span class="na">authentication</span><span class="pi">:</span>
        <span class="na">type</span><span class="pi">:</span> <span class="s">apiKey</span>
        <span class="na">in</span><span class="pi">:</span> <span class="s">header</span>
        <span class="na">name</span><span class="pi">:</span> <span class="s">X-Billing-Key</span>
        <span class="na">value</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{{BILLING_SVC_KEY}}"</span>
      <span class="na">resources</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">accounts</span>
          <span class="na">path</span><span class="pi">:</span> <span class="s2">"</span><span class="s">/v1/accounts/{customerId}/balance"</span>
          <span class="na">operations</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">get-balance</span>
              <span class="na">method</span><span class="pi">:</span> <span class="s">GET</span>
              <span class="na">inputParameters</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">customerId</span>
                  <span class="na">in</span><span class="pi">:</span> <span class="s">path</span>
                  <span class="na">type</span><span class="pi">:</span> <span class="s">string</span>
                  <span class="na">required</span><span class="pi">:</span> <span class="no">true</span>

    <span class="pi">-</span> <span class="na">namespace</span><span class="pi">:</span> <span class="s">support</span>
      <span class="na">type</span><span class="pi">:</span> <span class="s">http</span>
      <span class="na">baseUri</span><span class="pi">:</span> <span class="s2">"</span><span class="s">https://support-svc.internal"</span>
      <span class="na">authentication</span><span class="pi">:</span>
        <span class="na">type</span><span class="pi">:</span> <span class="s">basic</span>
        <span class="na">username</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{{SUPPORT_USER}}"</span>
        <span class="na">password</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{{SUPPORT_PASS}}"</span>
      <span class="na">resources</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">tickets</span>
          <span class="na">path</span><span class="pi">:</span> <span class="s2">"</span><span class="s">/tickets"</span>
          <span class="na">operations</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">list-open-tickets</span>
              <span class="na">method</span><span class="pi">:</span> <span class="s">GET</span>
              <span class="na">inputParameters</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">customerId</span>
                  <span class="na">in</span><span class="pi">:</span> <span class="s">query</span>
                  <span class="na">type</span><span class="pi">:</span> <span class="s">string</span>
                  <span class="na">required</span><span class="pi">:</span> <span class="no">true</span>

  <span class="na">exposes</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">type</span><span class="pi">:</span> <span class="s">rest</span>
      <span class="na">basePath</span><span class="pi">:</span> <span class="s2">"</span><span class="s">/api/customer-overview"</span>
      <span class="na">endpoints</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">method</span><span class="pi">:</span> <span class="s">GET</span>
          <span class="na">path</span><span class="pi">:</span> <span class="s2">"</span><span class="s">/{customerId}"</span>
          <span class="na">description</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Full</span><span class="nv"> </span><span class="s">customer</span><span class="nv"> </span><span class="s">overview</span><span class="nv"> </span><span class="s">assembled</span><span class="nv"> </span><span class="s">from</span><span class="nv"> </span><span class="s">customer,</span><span class="nv"> </span><span class="s">billing,</span><span class="nv"> </span><span class="s">and</span><span class="nv"> </span><span class="s">support</span><span class="nv"> </span><span class="s">services"</span>
          <span class="na">inputParameters</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">customerId</span>
              <span class="na">in</span><span class="pi">:</span> <span class="s">path</span>
              <span class="na">type</span><span class="pi">:</span> <span class="s">string</span>
              <span class="na">required</span><span class="pi">:</span> <span class="no">true</span>
              <span class="na">pattern</span><span class="pi">:</span> <span class="s2">"</span><span class="s">^CUST-[0-9]{6}$"</span>
          <span class="na">steps</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="na">call</span><span class="pi">:</span> <span class="s">customer.get-customer</span>
              <span class="na">with</span><span class="pi">:</span>
                <span class="na">customerId</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{{inputParameters.customerId}}"</span>
            <span class="pi">-</span> <span class="na">call</span><span class="pi">:</span> <span class="s">billing.get-balance</span>
              <span class="na">with</span><span class="pi">:</span>
                <span class="na">customerId</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{{inputParameters.customerId}}"</span>
            <span class="pi">-</span> <span class="na">call</span><span class="pi">:</span> <span class="s">support.list-open-tickets</span>
              <span class="na">with</span><span class="pi">:</span>
                <span class="na">customerId</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{{inputParameters.customerId}}"</span>
          <span class="na">outputParameters</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">customer</span>
              <span class="na">type</span><span class="pi">:</span> <span class="s">object</span>
              <span class="na">mapping</span><span class="pi">:</span> <span class="s2">"</span><span class="s">$.steps.get-customer.response.data"</span>
            <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">balance</span>
              <span class="na">type</span><span class="pi">:</span> <span class="s">number</span>
              <span class="na">mapping</span><span class="pi">:</span> <span class="s2">"</span><span class="s">$.steps.get-balance.response.amount"</span>
            <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">openTickets</span>
              <span class="na">type</span><span class="pi">:</span> <span class="s">number</span>
              <span class="na">mapping</span><span class="pi">:</span> <span class="s2">"</span><span class="s">$.steps.list-open-tickets.response.totalCount"</span>
</code></pre></div></div>

<p>Three microservices. Three different auth patterns. One exposed endpoint.</p>

<h2 id="three-dimensions">Three dimensions</h2>

<p><strong>Technology.</strong> The capability absorbs the differences. Bearer on one service, API key on the next, basic auth on the third — all declared, all namespace-scoped, none of it bleeding into the client. Input parameters are unified in the exposed surface with regex patterns validating them before any call goes out. The output is one typed JSON object. The client stops caring which service produced which field.</p>

<p><strong>Business.</strong> Client teams stop writing dispatcher code. Platform teams get one place to change auth, one place to change headers, one place to introduce a new microservice behind the same business capability. A product manager who asks “how do I get customer overview” gets one answer instead of a whiteboard full of arrows.</p>

<p><strong>Politics.</strong> This is where I see the most leverage. Microservice estates drift because every service team owns its own surface. That is correct governance at the service level. It is catastrophic governance at the client level. The capability layer gives the platform team a surface they can govern without asking twenty service teams to change their contracts. Nobody loses autonomy. The client gets a clean front door. The platform team gets a file in Git that it can lint with Spectral, version, and review.</p>

<h2 id="what-the-framework-gives-you-here">What the framework gives you here</h2>

<p>The features that matter specifically for this use case, from the wiki:</p>

<ul>
  <li><strong>Multiple consumed adapters per capability</strong> — with namespace-scoped auth, headers, and base URIs so each microservice is isolated</li>
  <li><strong>Declarative source HTTP adapter and target REST adapter</strong> — with support for JSON and conversion from YAML, Protobuf, XML, Avro, and CSV</li>
  <li><strong>Sequence of steps with calls</strong> — so one exposed endpoint can fan out across services</li>
  <li><strong>Unified parameter handling</strong> — input parameters in query, header, path, cookie, and body, validated once at the capability layer</li>
  <li><strong>Regex pattern validation on string inputs</strong> — so malformed customer IDs never reach any of the twenty microservices</li>
</ul>

<p>That last one matters more than it looks. Validation at the capability layer is validation that twenty service teams do not have to implement twenty times.</p>

<h2 id="where-this-keeps-showing-up">Where this keeps showing up</h2>

<p>Every platform engineering team I have talked to in the last six months has a version of this problem. The microservice split was right. The client experience is wrong. The fix is not another service mesh feature. It is a capability layer that presents business-shaped tools over the top of the service-shaped mesh.</p>

<p>The conversation with the client team changes. It is no longer “call these twenty services in this order with these auth patterns and hope you got the payload translation right.” It is “here is the capability. Here is its contract. Here is how you consume it.”</p>

<p>That is what rightsizing looks like at the microservice layer.</p>

<h2 id="next">Next</h2>

<p>Next post in the series is <strong>Rightsize a monolith API</strong> — the other end of the same spectrum. The monolith is one big surface, the microservices are twenty small ones, and the capability pattern applies to both for the same reason.</p>

<ul>
  <li>Wiki: <a href="https://github.com/naftiko/framework/wiki/Guide-%E2%80%90-Use-Cases">Guide — Use Cases</a></li>
  <li>GitHub: <a href="https://github.com/naftiko/framework">github.com/naftiko/framework</a></li>
  <li>Fleet Community Edition: <a href="https://github.com/naftiko/fleet">github.com/naftiko/fleet</a></li>
</ul>

<p>Walking the list.</p>]]></content><author><name>Kin Lane</name></author><category term="Blog" /><category term="Microservices" /><category term="Capabilities" /><category term="Naftiko" /><category term="API Reusability" /><category term="Use Cases" /><summary type="html"><![CDATA[The microservice refactor worked. Each service is small, focused, and independently deployable. The client doesn't care. The client is over there juggling twenty endpoints, twenty auth patterns, and twenty payload shapes just to complete one business task. Use case six in the Naftiko Framework walkthrough is about that — building a capability layer over many microservices so clients see one thing, not twenty.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://naftiko.io/assets/img/blog/rightsize-microservices-one-capability-layer.png" /><media:content medium="image" url="https://naftiko.io/assets/img/blog/rightsize-microservices-one-capability-layer.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Two APIDays NYC Talks, One Thesis: Governance Belongs at the Consumption Layer</title><link href="https://naftiko.io/blog/two-apidays-nyc-talks-governance-belongs-at-the-consumption-layer/" rel="alternate" type="text/html" title="Two APIDays NYC Talks, One Thesis: Governance Belongs at the Consumption Layer" /><published>2026-05-12T00:00:00+00:00</published><updated>2026-05-12T00:00:00+00:00</updated><id>https://naftiko.io/blog/two-apidays-nyc-talks-governance-belongs-at-the-consumption-layer</id><content type="html" xml:base="https://naftiko.io/blog/two-apidays-nyc-talks-governance-belongs-at-the-consumption-layer/"><![CDATA[<p>I am giving two talks at APIDays NYC this week. On paper they look like two different topics — API governance on Wednesday, OpenAPI examples and tags on Thursday — but they are really one argument from two sides. Governance does not belong on the producer side, hoping every team behaves. It belongs at the <strong>consumption layer</strong>, where AI agents and copilots are about to become the dominant API consumers, and where the metadata an OpenAPI spec carries (or doesn’t) determines whether that consumption actually works.</p>

<p>If you are at the conference, here is what I will be covering and when.</p>

<h2 id="talk-one--wednesday-may-13-1005-am-morgan-forum-1--2--3">Talk one — Wednesday, May 13, 10:05 AM, Morgan Forum 1 + 2 + 3</h2>

<p><strong>API Governance at the Agent Consumption Layer: Governing 405 Operations Across 36 APIs Without Changing Team Behavior</strong></p>

<p>I have been doing API governance work for fifteen years and I’ll be honest — most of what our industry has built around governance does not work the way we pretend it does. We lint specs in CI pipelines. We write style guides. Then we look at what actually ships, and it’s the same story: teams doing their own thing, acquisitions bringing their own conventions, and the style guide collecting dust in a wiki nobody reads.</p>

<p>For this talk I did an exercise that changed how I think about the problem. I took all 36 of Palo Alto Networks’ public APIs, extracted all 405 operations from their OpenAPI specs, and wrapped each one in a <a href="https://naftiko.io/blog/capability-first-context-engineering-design-for-mcp-then-wire-the-apis/">Naftiko capability</a> that enforces a standardized Spectral ruleset. The result was 405 governed MCP tool capabilities presenting a consistent interface on top of APIs that were never designed to be consistent with each other.</p>

<p>What I found across that portfolio is what happens to every large platform that grows through acquisition over fifteen-plus years. Path casing all over the place. <code class="language-plaintext highlighter-rouge">timeType</code> vs <code class="language-plaintext highlighter-rouge">start_time</code> vs <code class="language-plaintext highlighter-rouge">stime</code> for the same concept. Pagination done three different ways. Authentication fragmented across four different patterns. Every large enterprise has this problem.</p>

<p>The traditional answer is to rewrite the APIs. I have watched that movie enough times to know how it ends. It is expensive, it is slow, and it rarely works at scale because the incentives across the producer teams are not aligned.</p>

<p>So we did something different. We analyzed all 36 specs to find the dominant patterns already present — evidence, not opinions. We authored 43 Spectral rules from that analysis. Then we generated capabilities that preserve the original API contracts while exposing a governed MCP tool interface. <code class="language-plaintext highlighter-rouge">timeType</code> becomes <code class="language-plaintext highlighter-rouge">time_type</code>. <code class="language-plaintext highlighter-rouge">/Objects/Addresses</code> becomes <code class="language-plaintext highlighter-rouge">/objects/addresses</code>. Pagination normalizes to <code class="language-plaintext highlighter-rouge">offset/limit</code> everywhere. <strong>The APIs do not change. Governance happens at the consumption layer.</strong></p>

<p>This matters more now than it ever has because AI agents are becoming primary API consumers. When a human developer hits an inconsistent API, they adapt — they read the docs, they figure it out. When an agent hits <code class="language-plaintext highlighter-rouge">search_from/search_to</code> in one API and <code class="language-plaintext highlighter-rouge">offset/limit</code> in another and <code class="language-plaintext highlighter-rouge">nexttoken/maxresults</code> in a third, it struggles. Agents need a standardized interface to work reliably across a portfolio. Consumption-layer governance gives you a uniform, predictable surface that agents can consume without needing to understand the historical quirks of each API behind it.</p>

<p>The bigger argument I will make in the talk: most of API governance has been about <a href="https://naftiko.io/blog/governance-is-the-engine-not-the-brake/">governing the engine producers build</a>, when what we actually need to govern is the <em>consumption</em> of those engines by humans, copilots, and agents. The conversation I had at Bloomberg with eight Canadian banks who had come together to lobby for the change I was working to deliver internally was the moment this clicked for me. The consumers were already organizing around what they needed. I left to build Naftiko because that is where the leverage lives.</p>

<h2 id="talk-two--thursday-may-14-340-pm-johnson-studio">Talk two — Thursday, May 14, 3:40 PM, Johnson Studio</h2>

<p><strong>OpenAPI Examples and Tags Are the Missing Link Between Your APIs and AI Agents</strong></p>

<p>If the Wednesday talk is about what to do at the consumption layer, the Thursday talk is about the upstream metadata that decides whether consumption-layer governance even has anything good to work with.</p>

<p>Your OpenAPI specifications already describe what your APIs <em>can do</em>. The question is whether they describe what those operations <em>mean to the business</em>. With MCP servers and AI agents consuming APIs at scale, the gap between technical API definitions and business-domain understanding is becoming a real problem for context engineering. OpenAPI 3.2’s enhanced tags and the often-overlooked examples object are how you close that gap.</p>

<p>At Naftiko we have been building OpenAPI-first sandboxes for third-party APIs like GitHub, Jira, Notion, and Figma. Each spec is designed around business use cases, not just endpoint coverage. We use the OpenAPI <code class="language-plaintext highlighter-rouge">examples</code> object to define realistic, scenario-driven request and response payloads — then deploy them as fully functional mock HTTP APIs and MCP servers using open-source Microcks. The result: AI agents and copilots can explore real business workflows safely, without touching production.</p>

<p>Examples alone are not enough. OpenAPI 3.2 tags bring the business and domain alignment that has been missing. By organizing operations around business capabilities rather than resource paths, tags give AI agents — and the humans configuring them — a shared vocabulary for discovery and intent. I will walk through how we use tags to group operations by domain (<code class="language-plaintext highlighter-rouge">project-management</code>, <code class="language-plaintext highlighter-rouge">code-review</code>, <code class="language-plaintext highlighter-rouge">design-feedback</code>), how this improves MCP tool discovery, and why this matters as AI integration moves from single-API calls to multi-API orchestration.</p>

<p>The headline I want people to walk out with: <strong>examples are the mock data, tags are the routing layer, and together they are the metadata that turns an OpenAPI spec from a contract for engineers into a contract for agents.</strong></p>

<h2 id="the-through-line">The through-line</h2>

<p>These two talks are deliberately stacked.</p>

<p>The Wednesday talk says: stop trying to govern producers. Govern at the consumption layer where the agent actually lives. Build governed capabilities on top of whatever specs already exist and let the underlying APIs be themselves.</p>

<p>The Thursday talk says: but if the spec is the substrate the capability is built on, then the spec carrying rich examples and meaningful tags is what makes the capability <em>good</em>. A capability built on top of an OpenAPI spec with no examples and no tags is a thin wrapper that hands the agent the same problem in a different shape. Examples make the capability mockable, testable, and safe to explore. Tags make it discoverable by intent instead of path.</p>

<p>Producer-side hygiene plus consumption-side governance is the combination. Neither half works alone.</p>

<p>This is the thesis I keep coming back to as I build Naftiko: API governance does not move enterprises forward by changing the producer side of the equation. It moves them forward when the consumer — the agent, the copilot, the integration team — gets a standardized, governed, business-aligned surface to consume regardless of what the producer shipped. The producer keeps shipping. The consumer keeps consuming. The governance lives in between, where it can actually do its job.</p>

<h2 id="come-find-me">Come find me</h2>

<p>Both talks are short — 25 minutes each — and I will be in the hallways the rest of the time. If you work on API governance, build MCP servers, run an agent program, or are wrestling with how to make a portfolio of inconsistent APIs usable by AI agents without rewriting any of them, I want to hear what you are seeing. The 405-operation Palo Alto Networks exercise was one company. I am collecting more.</p>

<ul>
  <li><strong>Talk one:</strong> Wednesday, May 13, 10:05 – 10:30 AM, Morgan Forum 1 + 2 + 3 — <em>API Governance at the Agent Consumption Layer</em></li>
  <li><strong>Talk two:</strong> Thursday, May 14, 3:40 – 4:05 PM, Johnson Studio — <em>OpenAPI Examples and Tags Are the Missing Link Between Your APIs and AI Agents</em></li>
</ul>

<p>See you in New York.</p>]]></content><author><name>Kin Lane</name></author><category term="Blog" /><category term="APIDays" /><category term="API Governance" /><category term="OpenAPI" /><category term="MCP" /><category term="Capabilities" /><category term="AI Agents" /><category term="Naftiko" /><summary type="html"><![CDATA[I am giving two talks at APIDays NYC this week. They look like two different topics — API governance on day one, OpenAPI examples and tags on day two — but they are really one argument from two sides. Governance does not belong on the producer side, hoping every team behaves. It belongs at the consumption layer, where agents and copilots are about to become the dominant API consumers.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://naftiko.io/assets/img/blog/two-apidays-nyc-talks-governance-belongs-at-the-consumption-layer.png" /><media:content medium="image" url="https://naftiko.io/assets/img/blog/two-apidays-nyc-talks-governance-belongs-at-the-consumption-layer.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>