Skip to content

list_instance_tools and the published docs still tell operators to audit external reach by filtering on connector — the proxy #584 disproved #585

Description

@serge-ivo

The auditing surface still tells an operator to use the proxy #584 proved wrong

#584 established that "names a connector" is not "reaches outside the platform", and shipped a
server-sent reach: "platform" | "machine" | "internet" field (workers/api/src/lib/tool-reach.ts,
31194df). The advice that field replaced is still published in two places.

1. The MCP tool description an operator reads. workers/mcp/src/instance-tools/base.ts:133,
final sentence of list_instance_tools:

To audit reach into EXTERNAL systems specifically, filter on connector.

2. The published docs. platform-docs/mcp.md:394:

To audit reach into external systems specifically, filter on connector.

Why this is a defect and not stale prose

connector is wrong in both directions, both measured by #584:

  • Under-reports. fetch_url has no connector and takes a caller-chosen method. Filtering on
    connector hides it — which is why 10 of 34 instances were told they had no tool reaching
    outside the platform while fetch_url was allowed:true on all ten.
  • Over-reports. Every supervision tool names a connector and never leaves the platform.
    Filtering on connector reports external access to a system that does not exist.

So an operator following this sentence gets a false negative on the case that matters and a false
positive on the case that does not. It is the #584 bug restated as guidance, on the one surface
whose stated purpose is auditing — list_instance_tools's own description opens by offering itself
as the way to check what an agent can reach.

The same description was corrected in the same release for the neighbouring claim: it now says
"To verify an agent is read-only … read mutates — NOT scope". This sentence is the identical
mistake one clause later, and reach is the field that answers it.

Why the guards did not catch it

platform-docs/mcp.md was rewritten today by #572 and this line survived, correctly:
scripts/docs-drift.mjs compares documented numbers and names to the code defining them, and
nothing it measures changed. #573's surface lock excludes description from its hash by design,
so a description can go stale without moving MCP_SERVER_VERSION. Both exclusions are right — this
is simply a class neither covers, and the issue does not propose extending them to prose.

Acceptance criteria

  1. Both sentences name reach and state what its three values mean, replacing the connector
    advice. The tool description and platform-docs/mcp.md say the same thing.
  2. reach is present on rows returned by list_instance_tools — confirm it survives
    projectToolListing, since list_instance_tools schemas:true is 433 B over the wire limit, measured but not asserted #578 (8bc0453) just changed what that projection carries.
  3. A test asserts the description does not recommend connector as a reach proxy — the pairing of
    a corrected field and prose still naming the old one is the failure here, and it should not be
    able to recur silently.
  4. No MCP_SERVER_VERSION bump is required (descriptions are excluded from the serverInfo.version and server.json disagree, and neither moves when the tool surface does #573 hash) —
    confirm that rather than assume it, since AC2 may add a field.

Verified vs inferred

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions