Blog

MCP Solved Integration. We Solved Execution.

INSIGHTS
WORKFLOWS
AI agents are becoming the default interface to software, but connecting them is only half the challenge: their actions also need to be governed. **pos-module-mcp** brings authorization, human oversight, rollback, and tamper-evident auditing into the platformOS runtime, enabling agents to act within clearly defined boundaries.
MCP Solved Integration. We Solved Execution.

Introducing pos-module-mcp: the governed MCP server for platformOS

Listing summary: AI agents are becoming the default interface to software, but most MCP implementations still leave one critical question unanswered: what happens when an agent gets it wrong? This article introduces pos-module-mcp, the governed MCP server for platformOS. It checks every tool call against your rules, can hold consequential actions for a person, rolls back failed changes to your data, and records every outcome in a tamper-evident ledger.


There is a question every platform team is quietly avoiding right now.

Not “should we support AI agents?”, since that one’s settled. The question is the one that comes immediately after, the one nobody wants to answer on the record:

When an agent gets it wrong, what happens next?

Because agents will get it wrong. Not maliciously, usually. A hallucinated product ID. A misread instruction. A poisoned tool description buried in metadata the user never sees. A perfectly reasonable plan executed against perfectly wrong assumptions. And in many architectures shipping today, the honest answer to “what happens next” is: nobody knows, and there’s no way to find out.

That’s the gap pos-module-mcp closes.


The uncomfortable state of the MCP ecosystem

The Model Context Protocol won. It has become the default way AI agents connect to tools, it’s supported by the major AI clients, and adoption has been extraordinary.

Governance has not kept pace. Independent research through 2025 and 2026 paints a consistent picture:

  • Of 5,205 open-source MCP servers studied by Astrix, 88% required credentials, 53% relied on long-lived static API keys or personal access tokens, and only 8.5% used OAuth (Astrix, October 2025).

  • Of 2,614 MCP implementations analyzed by Endor Labs, 82% use file-system operations prone to path traversal, and 34% use APIs associated with command injection (Endor Labs, January 2026).

  • By one count, more than 30 CVEs were filed against MCP servers and tooling in January and February 2026 alone (tally, March 2026).

  • The severity is real. A command-injection flaw in the widely used mcp-remote package scored 9.6 (CVE-2025-6514, JFrog). An authentication bypass in nginx-ui’s MCP endpoint scored 9.8 and was exploited in the wild (CVE-2026-33032, The Hacker News).

Look at failures like these together and one pattern stands out:

Nothing was operating at the semantic layer between the agent’s intent and the system action. Nothing evaluated whether what the agent was about to do matched what it was actually authorized to do.

Perimeter controls can see that a request arrived. They aren’t designed to see what the agent was instructed to do. Even the July 2026 revision of the MCP specification, which hardened authentication, leaves approval workflows and audit event schemas to future extensions (summary).

The protocol defines what is possible. It does not define what is safe.


We didn’t add AI to platformOS. We noticed platformOS was already built for most of this.

Here’s what happened internally when we mapped the MCP threat landscape against our own architecture. We expected a gap analysis. What we found was that most of the answers already existed as platformOS primitives.

What MCP servers commonly lack

What platformOS provides

Per-action authorization; agents run on standing credentials

Named authorization policies, evaluated on every call for a real user

No undo: failed agent plans leave partial state

Transaction and rollback tags that undo record changes atomically

Free-form, unvalidated tool input

A typed GraphQL schema, plus a strict input schema declared for each tool

Ad-hoc or absent audit trails

Records, which the module turns into an append-only, hash-chained ledger

No throttle: one agent can exhaust the system

Per-user rate limits and automatic token revocation, built into the module

One shared process, one shared credential

Per-instance tenancy and user-bound tokens

Read that table again, because it’s the product thesis.

The properties the agent era demands (authorized, validated, reversible, recorded, bounded) are not features we bolted onto a protocol when MCP got hot. Authorization policies, typed data and per-instance tenancy are what platformOS was built around, and the platform’s transaction support makes rollback native. pos-module-mcp connects agents to those primitives instead of rebuilding them outside the application. Many teams are now hand-rolling authorization, rollback and audit from scratch, under deadline pressure, in a threat environment that punishes exactly that.

Our governance lives where the business logic lives. That’s a build-order advantage that is hard to acquire after the fact.


What pos-module-mcp actually is

It’s a host, not a hack. Install it, and your platformOS instance becomes an MCP server: a governed one, where every tool call passes through a control plane you didn’t have to build.

Here’s the lifecycle of a tool call, in the order the checks run:

  Agent calls a tool

        │

        ├─  Authenticated  →  a real user, never a shared admin credential

        ├─  Rate-checked   →  per-user limits; repeated abuse revokes the token

        ├─  Resolved       →  the tool exists, and this token may use it

        ├─  Validated      →  against the strict schema you declared

        ├─  Authorized     →  by a named policy, evaluated per call

        ├─  Gated          →  high-impact actions wait for a human decision

        ├─  De-duplicated  →  a retried call replays its stored result

        ├─  Executed       →  your business logic; changes run in a transaction

        └─  Attested       →  every outcome written to a tamper-evident, hash-chained ledger


Every check is on from the first call, and a check that can’t say yes says no. Calls that fail authentication go to the platform log rather than the ledger, so anonymous probing can’t flood the chain; every outcome after that point is recorded, allowed or refused.

You write the rules: which tools exist, what they accept, and who may call them. You don’t write the machinery that enforces them.

Reads start with one setting

Because platformOS pages can already expose clean Markdown at /:slug.md, a format we shipped explicitly for agent consumption, your documentation can become MCP resources with one configuration change. Choose which page prefixes to expose, and agents can list and read those pages, each stamped with when it was last updated. No authoring required.

No scraping rendered HTML. No brittle DOM parsing. No agent guessing at your structure.

One boundary to know: resources are meant for public content. Reading them needs no token, they aren’t recorded in the ledger, and they’re served from the page’s source without the page’s own access checks. Expose only pages that are already public.

Writes require intent, and declaring them is one command

There is no universal “update a listing” tool, and we refuse to pretend otherwise. Actions are business-specific by definition, so you declare them: a short manifest naming the input schema, the authorization policy, and whether the action needs human approval.

And declaring one is not a research project. A generator drafts the tool for you: the manifest, the handler and, for simple search or create tools, a typed GraphQL query. Better still, point the generator at an existing platformOS command and it reads which fields that command uses and drafts a matching manifest, so the agent gets the same validations and side effects as your app’s own screens. You tighten the schema, name a policy, and review it. Until you name a policy, the draft stays out of the tool list.

The safe path is the easy path. That is deliberate: governance that’s tedious to adopt is governance that gets skipped.

That manifest lives in version control, alongside your code, and goes through the same review. Which means, and this matters more than it sounds, every tool description an AI model reads on your platform comes from a file in your repository, never from a database row or a remote source at runtime.

Tool poisoning, the attack where hostile instructions hide inside tool metadata the user can’t see, is one of the defining risks of the agentic era. Our first line of defense isn’t a scanner playing catch-up. It’s structural: tool descriptions and schemas are code, so no unreviewed tool text reaches the model. The console’s built-in evaluation adds a second line, flagging descriptions that are too short, duplicated, or read like instructions to the model.


Where we pull ahead

1. Reversibility is the permission slip

Ask any marketplace operator why their AI integration is read-only, and you’ll get the same answer in different words: because I can’t un-ring the bell.

Every tool that declares it changes data runs inside a transaction. If the handler reports an error, throws, or the ledger write fails, every record change rolls back atomically. No partial state. No orphaned records. No 2 a.m. archaeology.

This is the property that converts “our agents can read things” into “our agents can do things.” It’s not a security checkbox. It’s the unlock for agents that write, and it’s the reason a risk-averse operator will say yes.

Honest boundary: transactions govern your platformOS records. They cannot recall an email, reverse a payment capture, or undo a third-party API call, and a background job started inside a transaction isn’t covered by its rollback. So the rule for tool authors is simple: keep irreversible effects out of the transaction, queue them after the commit, and put tools whose main job is irreversible behind a human approval gate. That’s a rule you follow, not something the module can enforce for you. We’d rather tell you that up front than have you discover it in production.

2. The audit trail is a guarantee, not a habit

Most systems log actions. We do something different: for any tool that changes data, the ledger entry commits inside the same transaction as the business change.

The change and its record live or die together. An agent’s change to your data can’t commit without a record of who requested it, which policy allowed it, and what happened.

Then we chain it. Each entry hashes its own contents together with its predecessor’s hash. The module only ever appends: it has no code path that updates or deletes an entry. If anyone alters an entry outside the module, through the admin API or the database directly, the built-in chain verifier finds it, whether the entry was edited, reordered or backdated. That turns “we have logs” into “we have logs where any edit shows.” Appends are serialized, so the chain stays intact even under bursts of concurrent agent traffic.

To be precise about the boundary: the ledger is tamper-evident, not tamper-proof. Someone with direct database access can still change a row; what they can’t do is change it without the verifier noticing. Anchoring the chain outside the instance would close that last gap, and it isn’t part of this version.

And we log the denials. A ledger that records only successes is useless during an incident: the interesting question is never what worked, it’s what was refused, for whom, how many times, and starting when. The response to a denied call stays deliberately generic; the specific reason goes to the ledger, not to a caller probing for a way in.

3. Human judgment, exactly where it belongs

Some actions should never run autonomously, and which ones is your call, declared per tool. Mark an action as requiring approval and it never executes inline. It records the intent, returns an opaque handle, and waits, for up to seven days by default.

An operator approves it in the console, and it then executes as the original user: validated again against the current schema and authorized again, with the resulting ledger entry linked back to the request. Reject it and nothing runs. Let it expire and nothing runs. An identical duplicate collapses into the existing request instead of stacking, and a per-user cap (three pending requests by default) keeps a runaway agent from flooding the queue. Clients that use the 2026-07-28 revision of MCP can follow a pending request as a task.

This is what lets an operator hand an agent genuinely consequential capability without handing it the keys.

4. An agent can’t overrun your instance

Governance that only checks whether an action is allowed, but never how often, isn’t governance: it’s an invitation to a denial-of-service.

Every user gets a per-minute rate limit (60 calls by default). Cross it, or accumulate enough refused and malformed calls in a short window (20 in five minutes by default), and the token is revoked automatically: a misbehaving or compromised agent takes itself offline instead of grinding your instance down. Requests larger than 64 KB and arguments nested more than five levels deep are rejected before they reach a handler.

The abuse counter is content-aware: rate-limit hits, calls to unknown tools, schema rejections, authorization denials and approval-queue flooding all count toward revocation. A confused agent in a retry loop and a hostile one probing your surface look the same to the counter, and both get stopped.

5. Least exposure, by default

Today, an agent acts as the user who created its token. Your policies evaluate that user, and the ledger records both the user and the token the agent used. A buyer’s agent works within the buyer’s permissions; it never holds broader credentials of its own. Carrying the agent’s identity separately from the person it acts for, so policies can tell the two apart, is on our roadmap.

And that scope can be made tight. A token can be narrowed to a specific subset of tools, so a compromised credential can only reach what it was created for. Any token can be revoked centrally in one move: a leaked token is cut off instantly. Tool discovery can be scoped too: switch tools/list to authorization-filtered mode, and an unauthorized or anonymous agent doesn’t even learn your privileged tools exist. By default the list is open, which suits public tools; turn filtering on when the list itself is sensitive.

That distinction is invisible on a feature chart and decisive in a security review.

6. One module. Every instance. Same engine.

Install it across your estate and every instance runs the same governance engine, scoped to its own data, its own tokens, its own resource identifier and its own ledger. No per-partner engineering. Configuration is per instance, and the defaults are conservative: resources start switched off, and no tool is served without a policy.

For channel partners running multi-tenant stacks, this is the difference between “we secured the agent integration on that project” and “agent integration is secured the same way on every instance, by default.”

7. Your compliance evidence builds itself, and you can watch it live

Here’s the part your legal team will appreciate more than your engineers do.

The regulatory direction of travel is clear: logging, data governance, human oversight, and demonstrable control over automated action. When an agent takes a consequential action through an MCP server, that action is increasingly likely to fall within those obligations.

Every organization deploying agents will eventually need to produce evidence of that control. Most will assemble it retroactively, under pressure, from logs that were never designed for the purpose.

Yours is already being written. Chained, tamper-evident, queryable via GraphQL and exportable from the console: who asked, which tool, which policy decided, the outcome, the record affected and how long it took. Arguments are stored only as a hash, so your evidence doesn’t become a second copy of sensitive data. It’s generated as a by-product of running the system correctly, not as a separate compliance project.

And you don’t have to query it blind. The module ships a built-in operator console: a single, dependency-free screen with call metrics, chain verification of the latest 200 entries on every load, the approval queue, violations per token, active tokens with one-click revoke, access requests, and a filtered ledger export of up to 5,000 entries at a time. When something does go wrong, you filter the ledger down to the exact entries involved. Incident response is a page, not a project.

8. We don’t just govern the tools. We test the governance by attacking it.

Anyone can claim their controls hold. We check ours.

Because every governed call is already recorded in the ledger, we run an agentic security evaluation harness against the module: a real LLM agent is pointed at governed tools as a low-privilege user and told to break in, escalate privilege, inject through arguments, reach data that isn’t its own, and flood the approval queue. Each attempt is graded by code, not on what the agent claims but on what the ledger shows actually happened. A blocked attack is a proof point; a successful one is a finding we fix before customers see it.

And we test the tester: the grader is run against deliberately vulnerable control tools, switched on only in test environments, to confirm it reports a real breach rather than rubber-stamping a pass. The harness is early and, for now, ours to run. Alongside it, conformance and adversarial test suites cover injection payloads, token revocation, automatic suspension, tamper detection, strict validation and approval abuse.


How this compares


Bespoke MCP server

Generic MCP gateway

pos-module-mcp

Authorization

You build it

Coarse, at the perimeter

Named policies, per call, per user

Rollback on failure

You build it

Not addressed

Transactional for record changes

Input validation

You build it

Varies

Strict schema, unknown keys rejected

Rate / abuse limiting

You build it

Often, coarse

Per user, with automatic token revocation

Human approval gate

You build it

Varies

Declared per tool, runs as the original user

Audit trail

You build it

Gateway-level logs

Hash-chained, tamper-evident, written with the change

Tamper detection

Rare

Varies

Built-in chain verifier

Tool-poisoning defense

Depends on your process

Scanning

Tool descriptions are reviewed code

Delegated identity

Rare

Varies

Acts as the token’s user; separate agent identity on the roadmap

Discovery scoping

Rare

Varies

Optional tools/list filtering by authorization

Authoring effort

High

N/A

One generator command; wraps existing logic

Adversarial testing

Rare

Varies

Agentic evaluation, graded on the ledger

Multi-tenancy

You build it

Per deployment

Native, one ledger per instance

Knows your business logic

Yes

No

Yes

That last row is the one that decides it.

A gateway sits outside your application and can only reason about traffic: it doesn’t know that repricing a listing has a category band, or that an order past shipping can’t be cancelled. A bespoke server knows your logic but starts its security posture at zero and often stays there under deadline pressure.

pos-module-mcp is built to know both, because the governance and the business logic live in the same runtime.


The one-sentence version

Hand this to your CTO:

platformOS is where agents can act, because every action is authorized, bounded and recorded, changes to your data can be undone, and all of it can be checked.

Not “we support MCP.” Soon everyone will. Supporting a protocol is a compatibility statement. Governing what moves through it is an architecture.


Where we are, honestly

We’re building this in phases, and we’re going to tell you which is which, because a governance product that overstates its own maturity has already failed at the thing it’s selling.

Phase 1: governed reads. Shipped. Tool listing and invocation for read-only tools, Markdown page resources (switched off until you enable them), identity binding, validation, authorization, rate and abuse limiting, and the hash-chained ledger from the very first call. The load-bearing planes, proven.

Phase 2: governed writes. Shipped. Transaction-wrapped changes, the human-approval workflow, and idempotency for agent retries, delivered and exercised by an adversarial test suite. Writes are governed today, not on a slide.

Phase 3: surface completeness. In progress. Prompts have shipped. Support for the 2026-07-28 revision of MCP is in preview: negotiated per request, with cacheable lists and approvals exposed as tasks. Resource templates and discovery at scale are next.

On the roadmap. Today, agents connect with a token created in the console; OAuth sign-in will let hosted assistants connect without a pasted token. After that: carrying agent and user identity separately, streaming and long-running asynchronous calls, and agent-assisted tool authoring, building on the generator so that describing a new governed tool becomes a conversation, not a checklist. The safe path is already the easy path; we intend to make it the default path.

We deliberately shipped the boring, load-bearing parts first. Identity and attestation are the hard problems; changing data is comparatively easy once they’re right. Doing it in the other order makes a good demo and a weak foundation.


The window is open, and it will close

MCP is in what we’d call a brittle phase: adoption has outpaced governance.

Brittle phases don’t last. Either the ecosystem matures, or a serious enough incident forces maturity overnight. Either way, the platforms that already had authorization, reversibility and attestation as native primitives will be the ones agents are trusted to act on, and the ones still assembling those properties under deadline will spend that period explaining themselves.

We’re not scrambling to add governance to an AI feature.

We’re opening a door that was already locked properly.


Building on platformOS? Talk to us about early access to pos-module-mcp. Not on platformOS yet? This is a reasonable moment to reconsider.

Updated 29 September 2026: corrected how documentation resources, delegated identity, ledger immutability, timeouts and the evaluation harness work; replaced unsourced security statistics with sourced ones; and updated the roadmap.

Building on platformOS? Talk to us about early access to pos-module-mcp. Not on platformOS yet? This is a reasonable moment to reconsider.