rss-mcp-server / rss_server.py
gperdrizet's picture
Cleaned up.
9124a5f verified
raw
history blame
5.02 kB
'''Main script to run gradio interface and MCP server.'''
import logging
from pathlib import Path
from logging.handlers import RotatingFileHandler
import gradio as gr
import assets.text as text
import functions.tools as tool_funcs
import functions.gradio_functions as gradio_funcs
# Call the modal container so it spins up before the rest of
# the app starts
gradio_funcs.call_modal()
# Set-up logging - make sure log directory exists
Path('logs').mkdir(parents=True, exist_ok=True)
# Clear old logs if present
gradio_funcs.delete_old_logs('logs', 'rss_server')
# Set up the root logger so we catch logs from everything
logging.basicConfig(
handlers=[RotatingFileHandler(
'logs/rss_server.log',
maxBytes=100000,
backupCount=10,
mode='w'
)],
level=logging.INFO,
format='%(levelname)s - %(name)s - %(message)s'
)
# Get a logger
logger = logging.getLogger(__name__)
with gr.Blocks() as demo:
# Page text
gr.HTML(text.TITLE)
gr.Markdown(text.DESCRIPTION)
# Log output
with gr.Row():
dialog_output = gr.Textbox(label='Server logs', lines=7, max_lines=5)
timer = gr.Timer(0.5, active=True)
timer.tick( # pylint: disable=no-member
lambda: gradio_funcs.update_log(), # pylint: disable=unnecessary-lambda
outputs=dialog_output,
show_api=False
)
# Get feed tool
gr.Markdown('### 1. `get_feed()`')
website_url = gr.Textbox('slashdot', label='Website')
feed_output = gr.Textbox(label='RSS entries', lines=7, max_lines=7)
with gr.Row():
website_submit_button = gr.Button('Submit website')
website_clear_button = gr.ClearButton(components=[website_url, feed_output])
website_submit_button.click( # pylint: disable=no-member
fn=tool_funcs.get_feed,
inputs=website_url,
outputs=feed_output,
api_name='Get RSS feed content'
)
# Vector search tool
gr.Markdown('### 2. `context_search()`')
context_search_query = gr.Textbox(
'How is the air traffic control system being updated?',
label='Context search query'
)
context_search_output = gr.Textbox(
label='Context search results',
lines=7,
max_lines=7
)
with gr.Row():
context_search_submit_button = gr.Button('Submit query')
context_search_clear_button = gr.ClearButton(
components=[context_search_query, context_search_output]
)
context_search_submit_button.click( # pylint: disable=no-member
fn=tool_funcs.context_search,
inputs=context_search_query,
outputs=context_search_output,
api_name='Context vector search'
)
# Find article tool
gr.Markdown('### 3. `find_article()`')
article_search_query = gr.Textbox(
'How is the air traffic control system being updated?',
label='Article search query'
)
article_search_output = gr.Textbox(
label='Article search results',
lines=3,
max_lines=3
)
with gr.Row():
article_search_submit_button = gr.Button('Submit query')
article_search_clear_button = gr.ClearButton(
components=[article_search_query, article_search_output]
)
article_search_submit_button.click( # pylint: disable=no-member
fn=tool_funcs.find_article,
inputs=article_search_query,
outputs=article_search_output,
api_name='Article vector search'
)
# Get summary tool
gr.Markdown('### 4. `get_summary()`')
article_title = gr.Textbox(
'FAA To Eliminate Floppy Disks Used In Air Traffic Control Systems',
label='Article title'
)
article_summary = gr.Textbox(
label='Article summary',
lines=3,
max_lines=3
)
with gr.Row():
article_title_submit_button = gr.Button('Submit title')
article_title_clear_button = gr.ClearButton(
components=[article_title, article_summary]
)
article_title_submit_button.click( # pylint: disable=no-member
fn=tool_funcs.get_summary,
inputs=article_title,
outputs=article_summary,
api_name='Article summary search'
)
# Get link tool
gr.Markdown('### 5. `get_link()`')
article_title_link = gr.Textbox(
'FAA To Eliminate Floppy Disks Used In Air Traffic Control Systems',
label='Article title'
)
article_link = gr.Textbox(
label='Article link',
lines=3,
max_lines=3
)
with gr.Row():
article_link_submit_button = gr.Button('Submit title')
article_link_clear_button = gr.ClearButton(
components=[article_title_link, article_link]
)
article_link_submit_button.click( # pylint: disable=no-member
fn=tool_funcs.get_link,
inputs=article_title_link,
outputs=article_link,
api_name='Article link search'
)
if __name__ == '__main__':
demo.launch(mcp_server=True)