import calendar
import webbrowser
from datetime import datetime
from urllib.parse import urlparse, urlunparse
import pyperclip
from fastmcp import FastMCP
from mcp.types import ToolAnnotations
from .models import DateInfo
mcp = FastMCP(
name="MCP System Bridge",
instructions="This server provides tools for managing the system.",
)
@mcp.tool(annotations=ToolAnnotations(readOnlyHint=True))
def open_urls(urls: list[str]) -> dict[str, str]:
"""
Open a list of URLs in the default browser.
"""
results = {}
for url in urls:
parsed_url = urlparse(url)
if not parsed_url.scheme:
parsed_url = urlparse(f"https://{url}")
if not parsed_url.netloc:
results[url] = "Error: Invalid URL. Please provide a valid URL."
continue
processed_url = urlunparse(parsed_url)
try:
webbrowser.open(processed_url)
results[url] = "URL opened successfully."
except Exception as e:
results[url] = f"Error opening URL: {e}"
return results
@mcp.tool(annotations=ToolAnnotations(readOnlyHint=True))
def copy_to_clipboard(text: str) -> str:
"""
Copy text to the clipboard.
"""
try:
pyperclip.copy(text)
return "Text copied to clipboard successfully."
except Exception as e:
return f"Error copying text to clipboard: {e}"
@mcp.tool(annotations=ToolAnnotations(readOnlyHint=True))
def get_current_date_info() -> DateInfo:
"""
Get comprehensive information about the current date.
Returns:
DateInfo: A dictionary containing comprehensive date and time information:
- full_datetime (str): Full date and time in YYYY-MM-DD HH:MM:SS format
- iso_date (str): ISO 8601 date format (YYYY-MM-DD)
- iso_datetime (str): ISO 8601 datetime format with timezone
- timestamp (int): Unix timestamp (seconds since epoch)
- year (int): Current year (e.g., 2024)
- month (int): Current month (1-12)
- day (int): Current day of the month (1-31)
- day_of_year (int): Day number in the year (1-366)
- day_of_week_number (int): Day of the week (0=Monday, 6=Sunday)
- day_name (str): Full name of the day (e.g., "Monday")
- day_name_short (str): Short name of the day (e.g., "Mon")
- month_name (str): Full name of the month (e.g., "January")
- month_name_short (str): Short name of the month (e.g., "Jan")
- is_leap_year (bool): True if current year is a leap year
- week_number (int): ISO 8601 week number (1-53)
- iso_year (int): ISO 8601 year (may differ from calendar year)
- weekday_iso (int): ISO weekday (1=Monday, 7=Sunday)
- quarter (int): Quarter of the year (1-4)
- days_in_month (int): Total days in the current month
- hour (int): Current hour (0-23)
- minute (int): Current minute (0-59)
- second (int): Current second (0-59)
- microsecond (int): Current microsecond (0-999999)
"""
now = datetime.now()
current_date = now.date()
# Basic date information
day = current_date.day
month = current_date.month
year = current_date.year
# Day of the year (1-366)
day_of_year = current_date.timetuple().tm_yday
# Day of the week (0=Monday, 6=Sunday)
day_of_week_number = current_date.weekday()
# Day names
day_name_english = current_date.strftime("%A")
day_name_short_english = current_date.strftime("%a")
# Month names
month_name_english = current_date.strftime("%B")
month_name_short_english = current_date.strftime("%b")
# Check if leap year
is_leap_year = calendar.isleap(year)
# Week number (ISO 8601)
year_iso, week_number, weekday_iso = current_date.isocalendar()
# Days in current month
days_in_month = calendar.monthrange(year, month)[1]
# Quarter
quarter = (month - 1) // 3 + 1
# Full datetime string
full_datetime = now.strftime("%Y-%m-%d %H:%M:%S")
# ISO format
iso_date = current_date.isoformat()
iso_datetime = now.isoformat()
# Timestamp
timestamp = int(now.timestamp())
return DateInfo(
full_datetime=full_datetime,
iso_date=iso_date,
iso_datetime=iso_datetime,
timestamp=timestamp,
year=year,
month=month,
day=day,
day_of_year=day_of_year,
day_of_week_number=day_of_week_number,
day_name=day_name_english,
day_name_short=day_name_short_english,
month_name=month_name_english,
month_name_short=month_name_short_english,
is_leap_year=is_leap_year,
week_number=week_number,
iso_year=year_iso,
weekday_iso=weekday_iso,
quarter=quarter,
days_in_month=days_in_month,
hour=now.hour,
minute=now.minute,
second=now.second,
microsecond=now.microsecond,
)
def main() -> None:
mcp.run(transport="stdio")