Files
reverse-engineering-anything/src/server/toolRegistrationOptions.ts
T
morlutoandCursor Agent 4afb6b79ae fix(mcp): guide retained evidence input recovery (#8761)
* fix(mcp): guide retained evidence input recovery

* style(mcp): format catalog and server types

* test(mcp): verify HTTP capacity recovery guidance

* test(mcp): model catalog recorder imports in cleanup fixtures

record-mcp-catalog.mjs loads tool contracts and the Evidence-input
contract before it registers cleanup owners. The cleanup fixture still
sentineled only the previous imports, so those loads failed before any
owner wrote cleanup.jsonl. Track the script's read() calls and replace
the new modules with the empty contract list this fault injection uses.

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-11-05 03:34:26 +08:00

76 lines
2.5 KiB
TypeScript

import type { ToolContract } from "../contracts/toolContractTypes.js";
import type { StandardSchemaWithJSON } from "@modelcontextprotocol/server";
import type { z } from "zod";
import {
getEvidenceInputContract,
type EvidenceRequestFrameInput,
} from "../domain/evidenceInputContract.js";
import {
toolInputSchemaWithMetadata,
toolOutputSchemaWithMetadata,
} from "../contracts/toolSchemaMetadata.js";
import {
canReferenceInlineEvidence,
markEvidenceInput,
} from "./evidenceInputRegistration.js";
/** Project the canonical Zod contracts directly into SDK registration. */
export const toolRegistrationOptions = <Contract extends ToolContract>(
contract: Contract,
): {
readonly title: Contract["title"];
readonly description: Contract["description"];
readonly inputSchema: StandardSchemaWithJSON<
z.input<Contract["inputSchema"]>,
EvidenceRequestFrameInput<z.output<Contract["inputSchema"]>>
>;
readonly outputSchema: Contract["outputSchema"];
readonly annotations: Contract["annotations"];
} => {
const advertised = toolInputSchemaWithMetadata(contract);
const evidenceInputs = getEvidenceInputContract<Contract["inputSchema"]>(
contract.inputSchema,
);
// The application owns source admission. Preserve the exact advertised
// declaration while the SDK validates only the borrowing request envelope.
const inputSchema = {
"~standard": {
version: advertised["~standard"].version,
vendor: advertised["~standard"].vendor,
jsonSchema: advertised["~standard"].jsonSchema,
validate: evidenceInputs.frameSchema["~standard"].validate,
},
};
return {
title: contract.title,
description: contract.description,
inputSchema: evidenceInputs.hasEvidenceReferenceAlternative
? markEvidenceInput(inputSchema)
: inputSchema,
outputSchema: toolOutputSchemaWithMetadata(contract),
annotations: contract.annotations,
};
};
/** Register a workflow that validates raw input before effects and projects its own errors. */
export const applicationToolRegistrationOptions = <
Contract extends ToolContract,
>(
contract: Contract,
) => {
const registration = toolRegistrationOptions(contract);
const inputSchema: StandardSchemaWithJSON = {
"~standard": {
...registration.inputSchema["~standard"],
vendor: "rea-application",
validate: (value: unknown) => ({ value }),
},
};
return {
...registration,
inputSchema: canReferenceInlineEvidence(registration.inputSchema)
? markEvidenceInput(inputSchema)
: inputSchema,
};
};