Build1 distinct publisher3 min readPublished
Once the client-side contract is a URL and a bearer header, nothing in your config records what that key may write. The decision moved to the mint screen, which is the screen easiest to skip.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
Follow any of these and your For You feed starts watching them — no settings page required.
build
MCP's roadmap fast-tracks five priorities and quietly queues everything else1 distinct publisher
build
Semantic code search over a monorepo is now a plumbing job, and the plumbing is the hard part1 distinct publisher
build
AWS puts the trace waterfall inside the tool response, betting verification is the slow part1 distinct publisher
product
Salesforce turns 200-plus Data 360 APIs into MCP endpoints, and governance into a grant decision1 distinct publisher
Call `tools/list` with a key minted read only and the write tools are not in the response at all [8]. Be precise about what that buys. The dev.to writeup says a write attempt that arrives anyway is refused by name [9]; the omission works earlier than that check, removing the persuadable surface itself. The authors' reasoning is that a model told about a tool will eventually try to use it, and that an instruction not to is a suggestion while the absence of the tool is not [7]. Their description of the usual alternative, a scope string in a token plus hope that the model behaves [15], matches most integrations I have read.
The reason this travels past one vendor's suite is where the decision now sits. The post states the contract as three things: the install URL, an `Authorization: Bearer apk_...` header, and stateless streamable HTTP, one request in and one response out [2]. The pasteable OpenAI Responses entry carries five keys, and exactly one of them, `require_approval`, decides whether a human sees a call before it runs. The sample sets it to `never`, and the three-part contract never mentions it [4][18]. Nothing in that JSON tells you whether the key behind it can write. That was settled at mint time [8]. Paste the snippet, skip the mint choice, and the write grant happened without anyone saying so.
Two things have to be true in your own app before any of this transfers. The key acts as one user and inherits that user's role, so a record the user cannot see in the browser is not visible through MCP either [11]. And the audit log has to record which user the key acts as, not merely that an API call occurred [12]. If your API layer is a superuser channel running beside your permission model, you get the second parallel authorisation system the post warns about, maintained badly in duplicate [19], and hiding tools from `tools/list` buys you nothing at all.
The firmest claim in the piece is a subtraction. The catalogue simply excludes deletion and customer email as actions, on any key and at any permission level, a choice the developers call a product decision rather than a technical one [13]. The stated reasoning is asymmetric recoverability: a wrong invoice can be read and changed back, while a deleted row nobody noticed for a month cannot, and mail already sent to a client list cannot [14]. That cost lands on whoever wanted an assistant to run dunning. This is the maker's account of its own product across 49 tools [1]; I have not driven a live install. The one app in the suite that does not answer MCP is their own AI client [1], which reads as either restraint or a shortage of things to point it at.
Ranked by verification strength, evidence, and original report placement.
Since the maker's 3.0 release, every one of its small self-hosted business tools except its AI client answers the Model Context Protocol at POST /mcp; forty-nine of them.
The post states the whole contract as three facts: the address https://your-install/mcp on your server and domain; the key, an Authorization: Bearer apk_... header; and the transport, MCP over streamable HTTP, stateless, one request in and one response out.
In Claude the setup is one CLI line: claude mcp add --transport http invora https://your-install/mcp --header "Authorization: Bearer apk_xxxx".
In the OpenAI Responses API it is one entry in the tools array with the keys type: mcp, server_label, server_url, authorization, and "require_approval": "never".
n8n's MCP Client node takes the URL and the same Authorization header, and clients that keep servers in a config file take the same three fields under different key names.
Without any client, the endpoint can be driven by plain JSON-RPC 2.0 over a single POST, for example a tools/list call via curl.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 30, 2026
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
One vendor, checkable in a minute, unchecked
Almost everything specific in this story could be verified by a stranger in under a minute — point curl at tools/list with a read-only key and the write tools are either listed or they are not — and nobody outside Ownware has done it. The snippets are concrete and internally consistent, which is why this does not score lower; the security conclusions drawn from them are precisely the part no snippet can demonstrate.
Shipped across a catalogue, used by nobody named
What we have is a shipping disclosure: 49 of 50 products carry the endpoint as of 3.0. What we do not have is a single install, customer, workflow or third party that has driven it. The Claude and n8n instructions describe how a client would connect, not that one ever has, and the per-product API.md arrangement suggests the surface is documented for downloaders rather than exercised at scale.
Restrained, with one leap too far
This post argues against its own best headline in three places — read-only stops the model and not the person who can mint a fresh key, the tool lists live in scattered API.md files instead of one schema, and require_approval: never is flagged as something they would not put on a write-capable key. The overreach is narrow and specific: moving from 'the write tools are not advertised' to 'there is no confused-deputy path' is a claim about all future attacker behaviour, made by the only party who has looked.
The builder is also the only witness
Ownware wrote this about Ownware, signs off with the catalogue name and sends readers to its own connect-your-ai page. The distortion risk is less about false statements than about framing and selection: we get the architectural decisions the product got right, and nothing about which of the 49 endpoints behaves awkwardly in practice, what the mint screen offers first, or how keys get revoked once pasted into someone's client config.
Certain what is claimed, blind to whether it holds
We can be quite sure of what was said, by whom, and when — the post is unambiguous and dated. We have no second angle on any of it, and the reading turns on behaviour of a live endpoint that only its author has observed. That gap, not the clarity of the writing, sets the ceiling here.