mcp-client / app.py
codejedi's picture
:hell:
8c5974c
import gradio as gr
from textblob import TextBlob
import gradio as gr
from textblob import TextBlob
import requests
from bs4 import BeautifulSoup
def get_nation_issues(NATION, X_PASSWORD):
url = f"https://www.nationstates.net/cgi-bin/api.cgi"
headers = {
"X-Password": X_PASSWORD,
"User-Agent": "Nationstate LLM"
}
params = {
"nation": NATION,
"q": "issues"
}
response = requests.get(url, headers=headers, params=params)
def get_nation_issues_JSON(sml_data):
"""
Fetches and reformats issues from the NationStates API.
Args:
nation (str): The nation name.
password (str): The API password.
Returns:
dict: A dictionary containing the nation ID and a list of issue details.
"""
# Parse the SML/XML
soup = BeautifulSoup(sml_data, "xml")
# Extract nation info
nation_elem = soup.find("NATION")
nation_id = nation_elem.get("id") if nation_elem else "Unknown"
# List to store issues
issues_list = []
# Extract issues
if nation_elem:
for issue in nation_elem.find_all("ISSUE"):
issue_data = {
"issue_id": issue.get("id", "Unknown"),
"title": issue.TITLE.get_text() if issue.TITLE else "No title available",
"text": issue.TEXT.get_text() if issue.TEXT else "No text available",
"author": issue.AUTHOR.get_text() if issue.AUTHOR else "Unknown author",
"editor": issue.EDITOR.get_text() if issue.EDITOR else "Unknown editor",
"pic1": issue.PIC1.get_text() if issue.PIC1 else "No image 1",
"pic2": issue.PIC2.get_text() if issue.PIC2 else "No image 2",
"options": []
}
# Extract options within the issue
for option in issue.find_all("OPTION"):
option_data = {
"option_id": option.get("id", "Unknown"),
"text": option.get_text() if option else "No option text"
}
issue_data["options"].append(option_data)
# Add issue data to list
issues_list.append(issue_data)
return {"nation_id": nation_id, "issues": issues_list}
return get_nation_issues_JSON(response.text)
def address_nation_issues(NATION, X_PASSWORD, issue_id, option_id):
"""
Address a specific issue for a nation in NationStates API.
Args:
NATION (str): The nation name.
X_PASSWORD (str): The API password.
issue_id (int): The issue ID to address.
option_id (int): The chosen option ID for the issue.
Returns:
str: API response text.
"""
url = "https://www.nationstates.net/cgi-bin/api.cgi"
headers = {
"X-Password": X_PASSWORD,
"User-Agent": "Nationstate LLM"
}
data = {
"nation": NATION,
"c": "issue",
"issue": issue_id,
"option": option_id
}
response = requests.post(url, headers=headers, data=data)
def reformat_nation_data(xml_data):
"""
Parses and reformats NationStates XML data into a structured dictionary.
Args:
xml_data (str): Raw XML data.
Returns:
dict: A dictionary containing nation details, issue info, rankings, reclassifications, and headlines.
"""
soup = BeautifulSoup(xml_data, "xml")
nation_elem = soup.find("NATION")
nation_id = nation_elem.get("id") if nation_elem else "Unknown"
issue_elem = nation_elem.find("ISSUE") if nation_elem else None
issue_data = {
"issue_id": issue_elem.get("id") if issue_elem else "Unknown",
"choice": issue_elem.get("choice") if issue_elem else "Unknown",
"ok": issue_elem.OK.get_text() if issue_elem and issue_elem.OK else "Unknown",
"description": issue_elem.DESC.get_text() if issue_elem and issue_elem.DESC else "No description available",
"rankings": [],
"reclassifications": [],
"headlines": []
}
# Extract rankings
rankings_elem = issue_elem.find("RANKINGS") if issue_elem else None
if rankings_elem:
for rank in rankings_elem.find_all("RANK"):
issue_data["rankings"].append({
"rank_id": rank.get("id", "Unknown"),
"score": rank.SCORE.get_text() if rank.SCORE else "Unknown",
"change": rank.CHANGE.get_text() if rank.CHANGE else "Unknown",
"pchange": rank.PCHANGE.get_text() if rank.PCHANGE else "Unknown"
})
# Extract reclassifications
reclassifications_elem = issue_elem.find("RECLASSIFICATIONS") if issue_elem else None
if reclassifications_elem:
for reclassify in reclassifications_elem.find_all("RECLASSIFY"):
issue_data["reclassifications"].append({
"type": reclassify.get("type", "Unknown"),
"from": reclassify.FROM.get_text() if reclassify.FROM else "Unknown",
"to": reclassify.TO.get_text() if reclassify.TO else "Unknown"
})
# Extract headlines
headlines_elem = issue_elem.find("HEADLINES") if issue_elem else None
if headlines_elem:
issue_data["headlines"] = [headline.get_text() for headline in headlines_elem.find_all("HEADLINE")]
return {"nation_id": nation_id, "issue": issue_data}
return reformat_nation_data(response.text)
# Create the Gradio interface
get_nation_issues_interface = gr.Interface(
fn=get_nation_issues,
inputs=[
gr.Textbox(label="Nation Name", placeholder="Enter the nation name"),
gr.Textbox(label="API Password", placeholder="Enter your API password"),
],
outputs=gr.JSON(),
title="Get Nation Issues as JSON",
description="Fetch and reformat issues from the NationStates API",
api_name="get_nation_issues_JSON",
)
address_nation_issues_interface = gr.Interface(
fn=address_nation_issues,
inputs=[
gr.Textbox(label="Nation Name", placeholder="Enter the nation name"),
gr.Textbox(label="API Password", placeholder="Enter your API password"),
gr.Textbox(label="Issue ID", placeholder="Enter the issue ID to address"),
gr.Textbox(label="Option ID", placeholder="Enter the option ID to choose")
],
outputs=gr.Textbox(label="Response"),
title="Address Nation Issues",
description="Address a specific issue for a nation in NationStates API",
api_name="address_nation_issues",
)
demo = gr.TabbedInterface(
interface_list=[get_nation_issues_interface, address_nation_issues_interface],
tab_names=["Get Nation Issues JSON", "Address Nation Issues"])
# Launch the interface and MCP server
if __name__ == "__main__":
demo.launch(mcp_server=True)