index.ts•4.66 kB
import express from "express";
import cors from "cors";
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
import { z } from "zod";
import axios from "axios";
const API_BASE_URL = 'https://www.agent5ive.com/api/deployed-agents';
function createServer(deploymentId?: string) {
// Use provided deploymentId (from URL params in HTTP mode) or fall back to env var (for stdio mode)
const DEPLOYMENT_ID = deploymentId || process.env.DEPLOYMENT_ID;
const server = new McpServer({
name: "agent5ive-mcp-server",
version: "1.0.0",
});
// Register tools
server.registerTool(
"get_agent_purpose",
{
description: "Get the details and purpose of the deployed agent.",
inputSchema: {},
},
async () => {
if (!DEPLOYMENT_ID) {
return {
content: [{ type: "text", text: "Error: DEPLOYMENT_ID is not set." }],
isError: true,
};
}
try {
const response = await axios.get(`${API_BASE_URL}/${DEPLOYMENT_ID}`);
return {
content: [
{
type: "text",
text: JSON.stringify(response.data, null, 2),
},
],
};
} catch (error: any) {
return {
content: [
{
type: "text",
text: `Error: ${error.response?.data?.error || error.message}`,
},
],
isError: true,
};
}
}
);
server.registerTool(
"interact_with_agent",
{
description: "Interact with the deployed agent.",
inputSchema: {
message: z.string().describe("The message to send to the agent."),
history: z.array(z.object({
role: z.enum(["user", "assistant"]),
content: z.string(),
})).optional().describe("The conversation history."),
},
},
async ({ message, history = [] }) => {
if (!DEPLOYMENT_ID) {
return {
content: [{ type: "text", text: "Error: DEPLOYMENT_ID is not set." }],
isError: true,
};
}
const payload = {
messages: [
...history,
{
role: 'user',
content: message,
},
],
};
try {
const response = await axios.post(`${API_BASE_URL}/${DEPLOYMENT_ID}`, payload);
return {
content: [
{
type: "text",
text: response.data.content,
},
],
};
} catch (error: any) {
return {
content: [
{
type: "text",
text: `Error: ${error.response?.data?.error || error.message}`,
},
],
isError: true,
};
}
}
);
return server;
}
async function main() {
const useHttp = process.argv.includes("--http");
if (useHttp) {
const app = express();
const PORT = process.env.PORT || 8081;
app.use(cors({
origin: '*',
exposedHeaders: ['Mcp-Session-Id', 'mcp-protocol-version'],
allowedHeaders: ['Content-Type', 'mcp-session-id'],
}));
app.use(express.json());
app.all('/mcp', async (req: express.Request, res: express.Response) => {
try {
// Extract DEPLOYMENT_ID from URL query parameters (provided by Smithery config)
const deploymentId = req.query.DEPLOYMENT_ID as string | undefined;
const server = createServer(deploymentId);
const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
res.on('close', () => {
transport.close();
server.close();
});
await server.connect(transport);
await transport.handleRequest(req, res, req.body);
} catch (error) {
console.error('Error handling MCP request:', error);
if (!res.headersSent) {
res.status(500).json({
jsonrpc: '2.0',
error: { code: -32603, message: 'Internal server error' },
id: null,
});
}
}
});
app.listen(PORT, () => {
console.log(`MCP HTTP Server listening on port ${PORT}`);
});
} else {
const server = createServer();
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("Agent5ive MCP Server running on stdio");
}
}
main().catch((error) => {
console.error("Fatal error in main():", error);
process.exit(1);
});