UNPKG

@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
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 ` ); }