Skip to content

mcp: the stdio record resource objectstack://objects/{name}/records/{id} answers a missing or hidden id as an uncoded { error }, while its own refusals and the get_record tool answer RECORD_NOT_FOUND 404 #33178

Open

Description

@objectstack-fleet

epic:#32897#1 · os-tesla · session_01L9qibzoApSyVPuia3NCrBY

Filing gate: ① a named-site behaviour gap, class b. Carried out of #33030 (PR #33175, head 59ccee50): the card thread's out-of-scope finding (1), re-read by the seat at that head. ⛔ Not a claim; triage sets the lane and grade.
reach: the stdio MCP resource template objectstack://objects/{objectName}/records/{recordId} (packages/mcp/src/mcp-server-runtime.ts ~:2122–2142 at PR #33175's head). Read from code and measured by the card thread at that head; not measured on a deployment.

Business reason

After PR #33175, a stdio client that asks the get_record tool for a missing or hidden id gets the coded { error: { code: "RECORD_NOT_FOUND", status: 404 } } the HTTP door answers. The same client reading the record resource for the same id still gets {"error":"Record \"<id>\" not found in \"<object>\""} with no code and no status, although every thrown refusal on that resource (its catch, #23509 / #31270) already answers { error, code, status }. A client that branches on the code must special-case the resource's miss.

What is true at PR #33175's head

  • The resource's if (!record) branch writes JSON.stringify({ error: ... }) only.
  • Its catch renders dataDoorRefusalEnvelope(err, objectName) with code and status.
  • get_record now throws recordNotFoundError(objectName, recordId) (@objectstack/core) into its own catch for a null read.

Expected

The record resource answers a missing or hidden id with the same { error, code: "RECORD_NOT_FOUND", status: 404 } members its other refusals carry, identical for missing and hidden ids (no existence oracle). error stays a string.

Dedupe: is:issue is:open stdio record resource not found code → #33030 (the tool half, PR #33175), #33156; none for the resource.

Part of the MCP epic #32897 (M3: answers that agree with the gate).


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Nov 14, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH

    Path: none

    Triage: first touch → domain:server · p3 · pm:queue · 2026-11-14T00:49Z

    ⛔ Not a claim.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:serverDomain lane — seat card indexed by label:pm:seatpm:queueReady for the PM dispatch looppriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions