#!/usr/bin/env node
/**
* CLI wrapper to invoke AWS MCP tools locally for testing.
* Usage: npm run cli -- <tool_name> [--arg key=value]
* Example: npm run cli -- get_aws_caller_identity
* npm run cli -- list_ec2_instances --arg region=us-west-2
*/
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
import path from "path";
import { fileURLToPath } from "url";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
function parseArgs(): { tool: string; args: Record<string, unknown> } {
const argv = process.argv.slice(2);
const tool = argv[0];
if (!tool) {
console.error("Usage: npm run cli -- <tool_name> [--arg key=value]...");
process.exit(1);
}
const args: Record<string, unknown> = {};
for (let i = 1; i < argv.length; i++) {
if (argv[i] === "--arg" && argv[i + 1]) {
const [key, value] = argv[i + 1].split("=");
if (key && value !== undefined) {
const v =
value === "true" ? true : value === "false" ? false : value;
args[key] = v;
}
i++;
}
}
return { tool, args };
}
async function main() {
const { tool, args } = parseArgs();
const transport = new StdioClientTransport({
command: "node",
args: [path.join(__dirname, "dist", "index.js")],
env: Object.fromEntries(
Object.entries(process.env).filter(
(e): e is [string, string] => e[1] !== undefined
)
),
});
const client = new Client(
{ name: "aws-mcp-cli", version: "1.0.0" },
{ capabilities: {} }
);
await client.connect(transport);
try {
const result = await client.callTool({ name: tool, arguments: args });
const content = Array.isArray(result.content)
? result.content.filter((c: { type: string }) => c.type === "text")
: [];
const textContent = content as { type: "text"; text: string }[];
const text = textContent.map((c) => c.text).join("\n");
console.log(text);
if (result.isError) process.exit(1);
} finally {
client.close();
}
}
main().catch((err) => {
console.error(err.message || err);
process.exit(1);
});