@evantahler/mcpcli 0.5.1 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/mcpcli.md +2 -0
- package/README.md +2 -0
- package/package.json +1 -1
- package/src/cli.ts +2 -0
- package/src/commands/ping.ts +69 -0
package/.claude/skills/mcpcli.md
CHANGED
|
@@ -87,6 +87,8 @@ mcpcli deauth <server> # remove stored auth
|
|
|
87
87
|
| `mcpcli auth <server> -s` | Check token status and TTL |
|
|
88
88
|
| `mcpcli auth <server> -r` | Force token refresh |
|
|
89
89
|
| `mcpcli deauth <server>` | Remove stored authentication |
|
|
90
|
+
| `mcpcli ping` | Check connectivity to all servers |
|
|
91
|
+
| `mcpcli ping <server> [server2...]` | Check specific server(s) |
|
|
90
92
|
| `mcpcli add <name> --command <cmd>` | Add a stdio MCP server |
|
|
91
93
|
| `mcpcli add <name> --url <url>` | Add an HTTP MCP server |
|
|
92
94
|
| `mcpcli remove <name>` | Remove an MCP server |
|
package/README.md
CHANGED
|
@@ -68,6 +68,8 @@ mcpcli search -q "manage pull requests"
|
|
|
68
68
|
| `mcpcli add <name> --command <cmd>` | Add a stdio MCP server to your config |
|
|
69
69
|
| `mcpcli add <name> --url <url>` | Add an HTTP MCP server to your config |
|
|
70
70
|
| `mcpcli remove <name>` | Remove an MCP server from your config |
|
|
71
|
+
| `mcpcli ping` | Check connectivity to all configured servers |
|
|
72
|
+
| `mcpcli ping <server> [server2...]` | Check connectivity to specific server(s) |
|
|
71
73
|
| `mcpcli skill install --claude` | Install the mcpcli skill for Claude Code |
|
|
72
74
|
|
|
73
75
|
## Options
|
package/package.json
CHANGED
package/src/cli.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { registerIndexCommand } from "./commands/index.ts";
|
|
|
10
10
|
import { registerAddCommand } from "./commands/add.ts";
|
|
11
11
|
import { registerRemoveCommand } from "./commands/remove.ts";
|
|
12
12
|
import { registerSkillCommand } from "./commands/skill.ts";
|
|
13
|
+
import { registerPingCommand } from "./commands/ping.ts";
|
|
13
14
|
|
|
14
15
|
declare const BUILD_VERSION: string | undefined;
|
|
15
16
|
|
|
@@ -35,5 +36,6 @@ registerIndexCommand(program);
|
|
|
35
36
|
registerAddCommand(program);
|
|
36
37
|
registerRemoveCommand(program);
|
|
37
38
|
registerSkillCommand(program);
|
|
39
|
+
registerPingCommand(program);
|
|
38
40
|
|
|
39
41
|
program.parse();
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { green, red } from "ansis";
|
|
2
|
+
import type { Command } from "commander";
|
|
3
|
+
import { getContext } from "../context.ts";
|
|
4
|
+
import { formatError } from "../output/formatter.ts";
|
|
5
|
+
import { logger } from "../output/logger.ts";
|
|
6
|
+
|
|
7
|
+
interface PingResult {
|
|
8
|
+
server: string;
|
|
9
|
+
success: boolean;
|
|
10
|
+
latencyMs?: number;
|
|
11
|
+
error?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function registerPingCommand(program: Command) {
|
|
15
|
+
program
|
|
16
|
+
.command("ping [servers...]")
|
|
17
|
+
.description("Check connectivity to MCP servers")
|
|
18
|
+
.action(async (servers: string[]) => {
|
|
19
|
+
const { manager, formatOptions } = await getContext(program);
|
|
20
|
+
|
|
21
|
+
const targetServers = servers.length > 0 ? servers : manager.getServerNames();
|
|
22
|
+
|
|
23
|
+
if (targetServers.length === 0) {
|
|
24
|
+
console.error(formatError("No servers configured", formatOptions));
|
|
25
|
+
await manager.close();
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const spinner = logger.startSpinner(
|
|
30
|
+
`Pinging ${targetServers.length} server(s)...`,
|
|
31
|
+
formatOptions,
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
const results: PingResult[] = [];
|
|
35
|
+
|
|
36
|
+
try {
|
|
37
|
+
await Promise.all(
|
|
38
|
+
targetServers.map(async (serverName) => {
|
|
39
|
+
const start = Date.now();
|
|
40
|
+
try {
|
|
41
|
+
await manager.getClient(serverName);
|
|
42
|
+
results.push({ server: serverName, success: true, latencyMs: Date.now() - start });
|
|
43
|
+
} catch (err) {
|
|
44
|
+
results.push({ server: serverName, success: false, error: String(err) });
|
|
45
|
+
}
|
|
46
|
+
}),
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
spinner.stop();
|
|
50
|
+
|
|
51
|
+
if (formatOptions.json) {
|
|
52
|
+
console.log(JSON.stringify(results, null, 2));
|
|
53
|
+
} else {
|
|
54
|
+
for (const r of results) {
|
|
55
|
+
if (r.success) {
|
|
56
|
+
console.log(`${green("✔")} ${r.server} connected (${r.latencyMs}ms)`);
|
|
57
|
+
} else {
|
|
58
|
+
console.log(`${red("✖")} ${r.server} failed: ${r.error}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
} finally {
|
|
63
|
+
await manager.close();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const anyFailed = results.some((r) => !r.success);
|
|
67
|
+
if (anyFailed) process.exit(1);
|
|
68
|
+
});
|
|
69
|
+
}
|