#!/usr/bin/env node
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import axios from 'axios';
const server = new McpServer({
name: "Laravel Forge",
version: "1.0.0"
});
const BASE_URL = "https://forge.laravel.com/api/v1";
function getApiKey(): string {
const apiKey = process.env.FORGE_API_KEY;
if (!apiKey) {
throw new Error("FORGE_API_KEY environment variable not set.");
}
return apiKey;
}
function getServerId(): string {
const serverId = process.env.FORGE_SERVER_ID;
if (!serverId) {
throw new Error("FORGE_SERVER_ID environment variable not set.");
}
return serverId;
}
function getSiteId(): string {
const siteId = process.env.FORGE_SITE_ID;
if (!siteId) {
throw new Error("FORGE_SITE_ID environment variable not set.");
}
return siteId;
}
const api = axios.create({
baseURL: BASE_URL,
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${getApiKey()}`
}
});
server.tool("deploy-site",
{
deploy: z.boolean().describe("Deploy the site."),
},
async ({ deploy }) => {
const serverId = getServerId();
const siteId = getSiteId();
try {
const response = await api.post(`/servers/${serverId}/sites/${siteId}/deployment/deploy`);
return {
content: [{ type: "text", text: `Deployment started successfully for site ${siteId} on server ${serverId}.\n` + JSON.stringify(response.data, null, 2) }]
};
} catch (error: any) {
let errorMessage = `Error deploying site ${siteId} on server ${serverId}: ${error.message}`;
if (error.response) {
errorMessage += `\nStatus: ${error.response.status}\nData: ${JSON.stringify(error.response.data, null, 2)}`;
}
return {
content: [{ type: "text", text: errorMessage }]
};
}
}
);
const transport = new StdioServerTransport();
await server.connect(transport);