#!/usr/bin/env node
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { PloiClient } from "./client.js";
import { registerAllTools } from "./tools/index.js";
const VERSION = "0.1.1";
function showHelp() {
console.log(`
ploi-mcp v${VERSION} - Ploi.io MCP Server for Claude
USAGE:
ploi-mcp --token YOUR_TOKEN Start MCP server
ploi-mcp --test --token TOKEN Test connection to Ploi API
ploi-mcp --help Show this help
OPTIONS:
-t, --token TOKEN Ploi API token (or set PLOI_API_TOKEN env var)
--test Test API connection and exit
-h, --help Show help
-v, --version Show version
SETUP:
1. Get your token: https://ploi.io/profile/api-keys
2. Add to ~/.claude.json:
{
"mcpServers": {
"ploi": {
"type": "stdio",
"command": "ploi-mcp",
"args": ["--token", "YOUR_TOKEN"]
}
}
}
3. Restart Claude Code
4. Say "deploy" to deploy your project!
DOCS: https://github.com/sudanese/ploi-mcp
`);
process.exit(0);
}
function showVersion() {
console.log(`ploi-mcp v${VERSION}`);
process.exit(0);
}
function hasFlag(flag: string): boolean {
return process.argv.includes(flag);
}
function getToken(): string {
const args = process.argv.slice(2);
for (let i = 0; i < args.length; i++) {
if (args[i] === "--token" || args[i] === "-t") {
const token = args[i + 1];
if (token && !token.startsWith("-")) return token;
}
if (args[i]?.startsWith("--token=")) {
return args[i].split("=")[1] ?? "";
}
}
const envToken = process.env.PLOI_API_TOKEN;
if (envToken) return envToken;
console.error("Error: API token is required\n");
console.error("Usage:");
console.error(" ploi-mcp --token YOUR_TOKEN");
console.error(" ploi-mcp --help\n");
console.error("Get your token at: https://ploi.io/profile/api-keys");
process.exit(1);
}
async function testConnection(token: string): Promise<void> {
console.log("Testing connection to Ploi API...\n");
const client = new PloiClient(token);
try {
const servers = await client.listServers();
console.log(`✅ Connection successful!\n`);
console.log(`Found ${servers.length} server(s):`);
servers.forEach((s) => {
console.log(` - ${s.name} (${s.ip_address})`);
});
console.log(`\nYour token is working. You can now use ploi-mcp with Claude Code.`);
process.exit(0);
} catch (error) {
console.error(`❌ Connection failed!\n`);
console.error(`Error: ${error instanceof Error ? error.message : error}`);
console.error(`\nPlease check your API token.`);
process.exit(1);
}
}
async function main() {
// Handle flags
if (hasFlag("--help") || hasFlag("-h")) {
showHelp();
}
if (hasFlag("--version") || hasFlag("-v")) {
showVersion();
}
const token = getToken();
// Test mode
if (hasFlag("--test")) {
await testConnection(token);
return;
}
// Normal MCP server mode
const client = new PloiClient(token);
const server = new McpServer({
name: "ploi-mcp",
version: VERSION,
});
registerAllTools(server, client);
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("Ploi MCP server started");
}
main().catch((error) => {
console.error("Fatal error:", error);
process.exit(1);
});