# server.py
from mcp.server.fastmcp import FastMCP, Image
import requests
from requests.structures import CaseInsensitiveDict
from urllib.parse import quote
import os
import generate_image
from PIL import Image as PILImage
import subprocess
APIKEY = os.environ.get("GEO_APIKEY")
if APIKEY is None:
raise ValueError("GEO_APIKEY environment variable is not set")
# Create an MCP server
mcp = FastMCP("Map Demo", dependencies=["requests", "pillow", "selenium", "folium"])
def get_geocode(search_address, api_key):
# URL encode the address to handle special characters
encoded_address = quote(search_address)
url = f"https://api.geoapify.com/v1/geocode/search?text={encoded_address}&apiKey={api_key}"
headers = CaseInsensitiveDict()
headers["Accept"] = "application/json"
resp = requests.get(url, headers=headers)
return resp.json()
# Get GPS coordinates for an address
@mcp.tool()
def get_gps_coordinates(address: str) -> dict:
"""Gets GPS coordinates for an address"""
return get_geocode(address, APIKEY)
@mcp.tool()
def create_map_from_geojson(filename: str, geojson_coordinates: dict) -> str:
"""Creates a map image from GeoJSON coordinates"""
generate_image.create_map_from_geojson(geojson_coordinates, "temp_map.png")
subprocess.run(["open", "temp_map.png"])
return f"Map image created at {os.curdir}/temp_map.png, and shown to user."
if __name__ == "__main__":
mcp.run()