#!/usr/bin/env node
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
CallToolRequestSchema,
ListToolsRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
import {
generateSearchQuery,
generateSearchQuerySchema,
generateSearchQueryTool,
} from "./tools/generate_search_query.js";
import {
fetchPosts,
fetchPostsSchema,
fetchPostsTool,
} from "./tools/fetch_posts.js";
import {
rankPosts,
rankPostsSchema,
rankPostsTool,
} from "./tools/rank_posts.js";
const server = new Server(
{
name: "slander-mcp",
version: "1.0.0",
},
{
capabilities: {
tools: {},
},
}
);
// List available tools
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [generateSearchQueryTool, fetchPostsTool, rankPostsTool],
};
});
// Handle tool calls
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
try {
switch (name) {
case "generate_search_query": {
const parsed = generateSearchQuerySchema.parse(args);
const result = await generateSearchQuery(parsed);
return {
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
};
}
case "fetch_posts": {
const parsed = fetchPostsSchema.parse(args);
const result = await fetchPosts(parsed);
return {
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
};
}
case "rank_posts": {
const parsed = rankPostsSchema.parse(args);
const result = await rankPosts(parsed);
return {
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
};
}
default:
return {
content: [{ type: "text", text: `Unknown tool: ${name}` }],
isError: true,
};
}
} catch (error) {
const message = error instanceof Error ? error.message : String(error);
return {
content: [{ type: "text", text: `Error: ${message}` }],
isError: true,
};
}
});
// Start the server
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("Slander MCP server running on stdio");
}
main().catch((error) => {
console.error("Fatal error:", error);
process.exit(1);
});