Perplexity MCP Server
by PoliTwit1984
- src
- mcp_server_openai
import asyncio
import logging
import sys
from typing import Optional
import click
import mcp
import mcp.types as types
from mcp.server import Server, NotificationOptions
from mcp.server.models import InitializationOptions
from .llm import LLMConnector
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
def serve(openai_api_key: str) -> Server:
server = Server("openai-server")
connector = LLMConnector(openai_api_key)
@server.list_tools()
async def handle_list_tools() -> list[types.Tool]:
return [
types.Tool(
name="ask-openai",
description="Ask my assistant models a direct question",
inputSchema={
"type": "object",
"properties": {
"query": {"type": "string", "description": "Ask assistant"},
"model": {"type": "string", "default": "gpt-4", "enum": ["gpt-4", "gpt-3.5-turbo"]},
"temperature": {"type": "number", "default": 0.7, "minimum": 0, "maximum": 2},
"max_tokens": {"type": "integer", "default": 500, "minimum": 1, "maximum": 4000}
},
"required": ["query"]
}
)
]
@server.call_tool()
async def handle_tool_call(name: str, arguments: dict | None) -> list[types.TextContent]:
try:
if not arguments:
raise ValueError("No arguments provided")
if name == "ask-openai":
response = await connector.ask_openai(
query=arguments["query"],
model=arguments.get("model", "gpt-4"),
temperature=arguments.get("temperature", 0.7),
max_tokens=arguments.get("max_tokens", 500)
)
return [types.TextContent(type="text", text=f"OpenAI Response:\n{response}")]
raise ValueError(f"Unknown tool: {name}")
except Exception as e:
logger.error(f"Tool call failed: {str(e)}")
return [types.TextContent(type="text", text=f"Error: {str(e)}")]
return server
@click.command()
@click.option("--openai-api-key", envvar="OPENAI_API_KEY", required=True)
def main(openai_api_key: str):
try:
async def _run():
async with mcp.server.stdio.stdio_server() as (read_stream, write_stream):
server = serve(openai_api_key)
await server.run(
read_stream, write_stream,
InitializationOptions(
server_name="openai-server",
server_version="0.1.0",
capabilities=server.get_capabilities(
notification_options=NotificationOptions(),
experimental_capabilities={}
)
)
)
asyncio.run(_run())
except KeyboardInterrupt:
logger.info("Server stopped by user")
except Exception as e:
logger.exception("Server failed")
sys.exit(1)
if __name__ == "__main__":
main()