Skip to content

the submission scan reads three annotations and we declared two - #2768

Merged
Flotapponnier merged 1 commit into
mainfrom
fix/mcp-annotations
Oct 1, 2026
Merged

Flotapponnier merged 1 commit into
mainfrom
fix/mcp-annotations

Conversation

@Flotapponnier

Copy link
Copy Markdown
Collaborator

Found while reading the app submission guidelines before filling the form.

The review scans every tool for readOnlyHint, destructiveHint and openWorldHint. We set the first and third and left the second to its default — which in the MCP spec is true. A scanner reading the declarations literally sees six tools that may perform destructive updates, on a server that cannot write anything at all.

It is moot in the spec's own terms (destructiveHint only applies when readOnlyHint is false), but "moot" is not what a reviewer sees in a table of declared values, and one of the three negative test cases is precisely about the app not acting on anything.

All six tools now declare destructiveHint: false and idempotentHint: true, which is simply what they are: the same call returns the same answer and changes nothing.

tsc clean, 412 tests pass.

The app review scans every tool for readOnlyHint, destructiveHint and
openWorldHint. We set the first and the third and left the second to its
default, which in the MCP spec is true: a scanner reading the declarations
literally sees six tools that may perform destructive updates, on a server
that cannot write anything at all.

It is moot in the spec's own terms, since destructiveHint only applies when
readOnlyHint is false, but "moot" is not what a reviewer sees in a table of
declared values. All six now say destructiveHint false and idempotentHint
true, which is simply what they are: the same call returns the same answer
and changes nothing.
@Flotapponnier
Flotapponnier merged commit f1cf86e into main Oct 1, 2026
2 checks passed
Flotapponnier added a commit that referenced this pull request Oct 17, 2026
…3019)

Preparing the dev to main merge, the conflict triage turned up one file
group where dev is not ahead but behind, and behind on a leak.

`src/lib/mcp-tools.ts` and the MCP route exist on both branches and were
written independently, so they conflict as add/add. main's copies carry five
commits dev never received: a thousandfold error and a 35k-token catalogue
(#2764), the search endpoint handing back an API key it had been asked to
search for (#2766), two tools that answered nothing (#2765), a third
annotation the submission scan reads (#2768), and a chain name outranking
the subject of the question (#2770).

Measured rather than inferred from the titles: `redact` appears 7 times in
main's mcp-tools.ts and 3 times in its route, and 0 times in either of dev's.
Resolving those conflicts in dev's favour, which a bulk resolution would do,
reintroduces the leak.

Checked before overwriting: the dev-to-main diff is additive. main adds
category-aware scoring, a minimum score that cuts prefix-only noise, and
redactSecrets(); the only lines it removes are the ones it replaces. dev
holds nothing in these files that main lacks.

The privacy page is the same shape without the security edge: main's is 219
lines against dev's 140 and is alone in documenting retention and the Vercel
dependency. dev's predates it, from when the page existed only because the
app directory requires a policy URL.

Doing this now, in its own change, means the merge no longer has a
resolution that can silently restore a credential leak.

Gates: tsc clean, eslint clean, 567 tests (up from 561: main's test file
carries six more).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant