mirror of
https://github.com/allaunthefox/SilverSight.git
synced 2026-07-31 01:25:21 +00:00
62 lines
2.3 KiB
Python
62 lines
2.3 KiB
Python
#!/usr/bin/env python3
|
|
"""Wolfram Alpha MCP Server — AI agent interface to Wolfram Alpha."""
|
|
import json, sys, os, urllib.request, urllib.parse, urllib.error
|
|
|
|
APP_ID = os.environ.get("WOLFRAM_APP_ID", "")
|
|
BASE = "https://api.wolframalpha.com/v2"
|
|
|
|
def query_wolfram(query: str) -> str:
|
|
"""Query Wolfram Alpha and return plaintext result."""
|
|
if not APP_ID:
|
|
return "WOLFRAM_APP_ID not set"
|
|
params = urllib.parse.urlencode({"input": query, "appid": APP_ID, "format": "plaintext"})
|
|
try:
|
|
with urllib.request.urlopen(f"{BASE}/query?{params}", timeout=15) as r:
|
|
return r.read().decode()
|
|
except Exception as e:
|
|
return f"Error: {e}"
|
|
|
|
def handle_request(req):
|
|
method = req.get("method", "")
|
|
params = req.get("params", {})
|
|
|
|
if method == "list_tools":
|
|
return {"tools": [
|
|
{"name": "wolfram_query", "description": "Query Wolfram Alpha for computational answers",
|
|
"inputSchema": {"type": "object", "properties": {
|
|
"query": {"type": "string", "description": "Query in natural language or Wolfram syntax"}
|
|
}}},
|
|
{"name": "wolfram_math", "description": "Solve a mathematical expression",
|
|
"inputSchema": {"type": "object", "properties": {
|
|
"expression": {"type": "string", "description": "Mathematical expression"}
|
|
}}},
|
|
]}
|
|
elif method == "call_tool":
|
|
name = params.get("name", "")
|
|
args = params.get("arguments", {})
|
|
if name == "wolfram_query":
|
|
result = query_wolfram(args.get("query", ""))
|
|
elif name == "wolfram_math":
|
|
result = query_wolfram(args.get("expression", ""))
|
|
else:
|
|
result = f"unknown tool: {name}"
|
|
return {"content": [{"type": "text", "text": result}]}
|
|
elif method == "list_resource_templates":
|
|
return {"resourceTemplates": []}
|
|
return {"error": f"unknown method: {method}"}
|
|
|
|
def main():
|
|
while True:
|
|
line = sys.stdin.readline()
|
|
if not line: break
|
|
try:
|
|
req = json.loads(line)
|
|
resp = handle_request(req)
|
|
sys.stdout.write(json.dumps(resp) + "\n")
|
|
sys.stdout.flush()
|
|
except Exception as e:
|
|
sys.stdout.write(json.dumps({"error": str(e)}) + "\n")
|
|
sys.stdout.flush()
|
|
|
|
if __name__ == "__main__":
|
|
main()
|