o3-search-mcp
Version:
MCP server that enables AI agents to perform intelligent web searches using OpenAI's o3 model with natural language queries
74 lines • 2.56 kB
JavaScript
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import OpenAI from "openai";
import { z } from "zod";
// Create server instance
const server = new McpServer({
name: "o3-search-mcp",
version: "0.0.1",
});
// Configuration from environment variables
const config = {
apiKey: process.env.OPENAI_API_KEY,
maxRetries: parseInt(process.env.OPENAI_MAX_RETRIES || "3"),
timeout: parseInt(process.env.OPENAI_API_TIMEOUT || "60000"),
searchContextSize: (process.env.SEARCH_CONTEXT_SIZE || "medium"),
reasoningEffort: (process.env.REASONING_EFFORT || "medium"),
};
// Initialize OpenAI client with retry and timeout configuration
const openai = new OpenAI({
apiKey: config.apiKey,
maxRetries: config.maxRetries,
timeout: config.timeout,
});
// Define the o3-search tool
server.tool("o3-search", `An AI agent with advanced web search capabilities. Useful for finding the latest information, troubleshooting errors, and discussing ideas or design challenges. Supports natural language queries.`, {
input: z
.string()
.describe("Ask questions, search for information, or consult about complex problems in English."),
}, async ({ input }) => {
try {
const response = await openai.responses.create({
model: "o3",
input,
tools: [
{
type: "web_search_preview",
search_context_size: config.searchContextSize,
},
],
tool_choice: "auto",
parallel_tool_calls: true,
reasoning: { effort: config.reasoningEffort },
});
return {
content: [
{
type: "text",
text: response.output_text || "No response text available.",
},
],
};
}
catch (error) {
console.error("Error calling OpenAI API:", error);
return {
content: [
{
type: "text",
text: `Error: ${error instanceof Error ? error.message : "Unknown error occurred"}`,
},
],
};
}
});
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
}
main().catch((error) => {
console.error("Fatal error in main():", error);
process.exit(1);
});
//# sourceMappingURL=index.js.map