Added metadata cli tests, renaming

This commit is contained in:
lorenzo.neumann 2025-10-24 14:37:22 +02:00
commit 809436d65c
4 changed files with 2907 additions and 138 deletions

View file

@ -14,11 +14,11 @@ type JsonValue =
// List available prompts
export async function listPrompts(
client: Client,
metaData?: Record<string, string>,
metadata?: Record<string, string>,
): Promise<McpResponse> {
try {
const params =
metaData && Object.keys(metaData).length > 0 ? { _meta: metaData } : {};
metadata && Object.keys(metadata).length > 0 ? { _meta: metadata } : {};
const response = await client.listPrompts(params);
return response;
} catch (error) {
@ -33,7 +33,7 @@ export async function getPrompt(
client: Client,
name: string,
args?: Record<string, JsonValue>,
metaData?: Record<string, string>,
metadata?: Record<string, string>,
): Promise<McpResponse> {
try {
// Convert all arguments to strings for prompt arguments
@ -55,8 +55,8 @@ export async function getPrompt(
arguments: stringArgs,
};
if (metaData && Object.keys(metaData).length > 0) {
params._meta = metaData;
if (metadata && Object.keys(metadata).length > 0) {
params._meta = metadata;
}
const response = await client.getPrompt(params);

View file

@ -4,11 +4,11 @@ import { McpResponse } from "./types.js";
// List available resources
export async function listResources(
client: Client,
metaData?: Record<string, string>,
metadata?: Record<string, string>,
): Promise<McpResponse> {
try {
const params =
metaData && Object.keys(metaData).length > 0 ? { _meta: metaData } : {};
metadata && Object.keys(metadata).length > 0 ? { _meta: metadata } : {};
const response = await client.listResources(params);
return response;
} catch (error) {
@ -22,12 +22,12 @@ export async function listResources(
export async function readResource(
client: Client,
uri: string,
metaData?: Record<string, string>,
metadata?: Record<string, string>,
): Promise<McpResponse> {
try {
const params: any = { uri };
if (metaData && Object.keys(metaData).length > 0) {
params._meta = metaData;
if (metadata && Object.keys(metadata).length > 0) {
params._meta = metadata;
}
const response = await client.readResource(params);
return response;
@ -41,11 +41,11 @@ export async function readResource(
// List resource templates
export async function listResourceTemplates(
client: Client,
metaData?: Record<string, string>,
metadata?: Record<string, string>,
): Promise<McpResponse> {
try {
const params =
metaData && Object.keys(metaData).length > 0 ? { _meta: metaData } : {};
metadata && Object.keys(metadata).length > 0 ? { _meta: metadata } : {};
const response = await client.listResourceTemplates(params);
return response;
} catch (error) {

View file

@ -21,11 +21,11 @@ type JsonSchemaType = {
export async function listTools(
client: Client,
metaData?: Record<string, string>,
metadata?: Record<string, string>,
): Promise<McpResponse> {
try {
const params =
metaData && Object.keys(metaData).length > 0 ? { _meta: metaData } : {};
metadata && Object.keys(metadata).length > 0 ? { _meta: metadata } : {};
const response = await client.listTools(params);
return response;
} catch (error) {
@ -87,11 +87,11 @@ export async function callTool(
client: Client,
name: string,
args: Record<string, JsonValue>,
generalMetaData?: Record<string, string>,
toolSpecificMetaData?: Record<string, string>,
generalMetadata?: Record<string, string>,
toolSpecificMetadata?: Record<string, string>,
): Promise<McpResponse> {
try {
const toolsResponse = await listTools(client, generalMetaData);
const toolsResponse = await listTools(client, generalMetadata);
const tools = toolsResponse.tools as Tool[];
const tool = tools.find((t) => t.name === name);
@ -116,10 +116,10 @@ export async function callTool(
// Merge general metadata with tool-specific metadata
// Tool-specific metadata takes precedence over general metadata
let mergedMeta: Record<string, string> | undefined;
if (generalMetaData || toolSpecificMetaData) {
if (generalMetadata || toolSpecificMetadata) {
mergedMeta = {
...(generalMetaData || {}),
...(toolSpecificMetaData || {}),
...(generalMetadata || {}),
...(toolSpecificMetadata || {}),
};
}

View file

@ -45,7 +45,7 @@ type Args = {
toolMeta?: Record<string, string>;
transport?: "sse" | "stdio" | "http";
headers?: Record<string, string>;
metaData?: Record<string, string>;
metadata?: Record<string, string>;
};
function createTransportOptions(
@ -123,7 +123,7 @@ async function callMethod(args: Args): Promise<void> {
// Tools methods
if (args.method === "tools/list") {
result = await listTools(client, args.metaData);
result = await listTools(client, args.metadata);
} else if (args.method === "tools/call") {
if (!args.toolName) {
throw new Error(
@ -135,13 +135,13 @@ async function callMethod(args: Args): Promise<void> {
client,
args.toolName,
args.toolArg || {},
args.metaData,
args.metadata,
args.toolMeta,
);
}
// Resources methods
else if (args.method === "resources/list") {
result = await listResources(client, args.metaData);
result = await listResources(client, args.metadata);
} else if (args.method === "resources/read") {
if (!args.uri) {
throw new Error(
@ -149,13 +149,13 @@ async function callMethod(args: Args): Promise<void> {
);
}
result = await readResource(client, args.uri, args.metaData);
result = await readResource(client, args.uri, args.metadata);
} else if (args.method === "resources/templates/list") {
result = await listResourceTemplates(client, args.metaData);
result = await listResourceTemplates(client, args.metadata);
}
// Prompts methods
else if (args.method === "prompts/list") {
result = await listPrompts(client, args.metaData);
result = await listPrompts(client, args.metadata);
} else if (args.method === "prompts/get") {
if (!args.promptName) {
throw new Error(
@ -167,7 +167,7 @@ async function callMethod(args: Args): Promise<void> {
client,
args.promptName,
args.promptArgs || {},
args.metaData,
args.metadata,
);
}
// Logging methods
@ -333,6 +333,21 @@ function parseArgs(): Args {
'HTTP headers as "HeaderName: Value" pairs (for HTTP/SSE transports)',
parseHeaderPair,
{},
)
//
// Metadata options
//
.option(
"--metadata <pairs...>",
"General metadata as key=value pairs (applied to all methods)",
parseKeyValuePair,
{},
)
.option(
"--tool-metadata <pairs...>",
"Tool-specific metadata as key=value pairs (for tools/call method only)",
parseKeyValuePair,
{},
);
// Parse only the arguments before --
@ -340,8 +355,8 @@ function parseArgs(): Args {
const options = program.opts() as Omit<Args, "target"> & {
header?: Record<string, string>;
meta?: Record<string, JsonValue>;
toolMeta?: Record<string, JsonValue>;
metadata?: Record<string, JsonValue>;
toolMetadata?: Record<string, JsonValue>;
};
let remainingArgs = program.args;
@ -359,17 +374,17 @@ function parseArgs(): Args {
target: finalArgs,
...options,
headers: options.header, // commander.js uses 'header' field, map to 'headers'
metaData: options.meta
metadata: options.metadata
? Object.fromEntries(
Object.entries(options.meta).map(([key, value]) => [
Object.entries(options.metadata).map(([key, value]) => [
key,
String(value),
]),
)
: undefined,
toolMeta: options.toolMeta
toolMeta: options.toolMetadata
? Object.fromEntries(
Object.entries(options.toolMeta).map(([key, value]) => [
Object.entries(options.toolMetadata).map(([key, value]) => [
key,
String(value),
]),