Share displayed method names with direct registration, support explicit multi-name selection and unmatched terms, and cache immutable schema conversions by schema identity. Export input-side schemas so defaulted fields stay optional; verify both actual MCP catalogs and named contracts before repeating the unchanged model task. Co-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com> Co-authored-by: Kaoru0822 <208281322+kaoru0822-kitauji@users.noreply.github.com>
72 lines
2.5 KiB
JavaScript
72 lines
2.5 KiB
JavaScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import Ajv2020 from "ajv/dist/2020.js";
|
|
import { methods, reference } from "./api.mjs";
|
|
|
|
test("named reference lists preserve caller order and exact schemas across presentations", () => {
|
|
const names = Object.fromEntries(
|
|
Object.keys(methods).map((name) => [name, `facts_${name}`]),
|
|
);
|
|
const result = reference(
|
|
"facts_values, facts_snapshot facts_values unknown",
|
|
{ names, includeExamples: false },
|
|
);
|
|
assert.deepEqual(
|
|
result.methods.map((m) => m.method),
|
|
["values", "snapshot"],
|
|
);
|
|
assert.deepEqual(
|
|
result.methods.map((m) => m.name),
|
|
["facts_values", "facts_snapshot"],
|
|
);
|
|
assert.deepEqual(result.unmatched_queries, ["unknown"]);
|
|
assert.equal(result.coverage.declared_methods, 14);
|
|
assert.equal(result.coverage.matched_methods, 2);
|
|
assert.equal(result.coverage.selection, "named");
|
|
const javascript = reference("rea.values snapshot");
|
|
assert.deepEqual(
|
|
javascript.methods.map((m) => m.method),
|
|
["values", "snapshot"],
|
|
);
|
|
assert.deepEqual(
|
|
result.methods.map((m) => m.input_schema),
|
|
javascript.methods.map((m) => m.input_schema),
|
|
);
|
|
const validate = new Ajv2020({ strict: false }).compile(
|
|
result.methods[1].input_schema,
|
|
);
|
|
assert.equal(validate({ entry: "0xea6d0" }), true);
|
|
assert.equal(validate({ snapshot: "wrong contract" }), false);
|
|
const validateValues = new Ajv2020({ strict: false }).compile(
|
|
result.methods[0].input_schema,
|
|
);
|
|
assert.equal(validateValues({ snapshot: "snap_example", ids: ["v1"] }), true);
|
|
assert.equal(
|
|
methods.values.input.parse({ snapshot: "snap_example" }).limit,
|
|
20,
|
|
);
|
|
assert.equal(Object.hasOwn(result.methods[0], "example"), false);
|
|
});
|
|
|
|
test("topic/all reference selection and shared schema ownership remain explicit", () => {
|
|
assert.equal(reference().methods.length, 14);
|
|
assert.equal(reference("no-such-topic").coverage.matched_methods, 0);
|
|
assert.ok(
|
|
reference("memory aliases").methods.some((m) => m.method === "slice"),
|
|
);
|
|
const before = reference("snapshot").methods[0];
|
|
assert.throws(() => {
|
|
before.input_schema.properties.entry.type = "number";
|
|
}, TypeError);
|
|
const after = reference("snapshot").methods[0];
|
|
assert.equal(after.input_schema.properties.entry.type, "string");
|
|
assert.throws(
|
|
() => reference("values", { names: { snapshot: "values" } }),
|
|
/Ambiguous/,
|
|
);
|
|
assert.throws(
|
|
() => reference("values", { names: { unknown: "facts_values" } }),
|
|
/Unknown/,
|
|
);
|
|
});
|