@reliverse/rse-sdk
Version:
@reliverse/rse-sdk allows you to create new plugins for @reliverse/rse CLI, interact with reliverse.org, and even extend your own CLI functionality (you may also try @reliverse/dler-sdk for this case).
128 lines (127 loc) • 3.49 kB
JavaScript
import { relinka } from "@reliverse/relinka";
import dotenv from "dotenv";
import { ofetch } from "ofetch";
dotenv.config();
export async function handleMcpCommand(args) {
const subcommand = args[0]?.toLowerCase();
switch (subcommand) {
case "servers":
await listServers(args.slice(1));
break;
case "server":
await showServer(args.slice(1));
break;
case "attributes":
await listAttributes();
break;
case "instances":
await listInstances(args.slice(1));
break;
default:
printMcpUsage();
break;
}
}
async function listServers(flags) {
const params = parseFlags(flags);
const queryParams = {};
if (params.query) {
queryParams.query = params.query;
}
if (params.first) {
queryParams.first = params.first;
}
if (params.after) {
queryParams.after = params.after;
}
const baseUrl = "https://glama.ai/api/mcp/v1/servers";
const queryString = new URLSearchParams(queryParams).toString();
const url = queryString ? `${baseUrl}?${queryString}` : baseUrl;
try {
const data = await ofetch(url, { method: "GET" });
relinka("info", JSON.stringify(data, null, 2));
} catch (error) {
relinka("error", "Failed to list MCP servers:", String(error));
}
}
async function showServer(flags) {
const id = flags[0];
if (!id) {
relinka("error", "Missing server ID.");
return;
}
const baseUrl = "https://glama.ai/api/mcp/v1/servers";
const url = `${baseUrl}/${id}`;
try {
const data = await ofetch(url, { method: "GET" });
relinka("info", JSON.stringify(data, null, 2));
} catch (error) {
relinka("error", `Failed to retrieve server ${id}:`, String(error));
}
}
async function listAttributes() {
const url = "https://glama.ai/api/mcp/v1/attributes";
try {
const data = await ofetch(url, { method: "GET" });
relinka("info", JSON.stringify(data, null, 2));
} catch (error) {
relinka("error", "Failed to list MCP attributes:", String(error));
}
}
async function listInstances(flags) {
const params = parseFlags(flags);
const token = params.token || process.env.MCP_BEARER_TOKEN;
if (!token) {
relinka(
"error",
"Missing Bearer token. Use --token <YOUR_TOKEN> or set MCP_BEARER_TOKEN in env."
);
return;
}
const url = "https://glama.ai/api/mcp/v1/instances";
try {
const data = await ofetch(url, {
method: "GET",
headers: {
Authorization: `Bearer ${token}`
}
});
relinka("info", JSON.stringify(data, null, 2));
} catch (error) {
relinka("error", "Failed to list MCP instances:", String(error));
}
}
function parseFlags(flags) {
const result = {};
for (let i = 0; i < flags.length; i++) {
const flag = flags[i];
if (flag.startsWith("--")) {
const key = flag.replace(/^--/, "");
const next = flags[i + 1];
if (next && !next.startsWith("--")) {
result[key] = next;
i++;
} else {
result[key] = "true";
}
}
}
return result;
}
function printMcpUsage() {
relinka(
"info",
`Usage:
rse mcp servers [--query <text>] [--first <n>] [--after <cursor>]
rse mcp server <id>
rse mcp attributes
rse mcp instances [--token <YOUR_TOKEN_HERE>]
Examples:
rse mcp servers --query "hacker news" --first 5
rse mcp server oge85xl22f
rse mcp attributes
rse mcp instances --token MY_SECRET_TOKEN
# or place MCP_BEARER_TOKEN=<TOKEN> in .env or the environment
`
);
}