import gradio as gr import requests import os from dotenv import load_dotenv import numpy as np load_dotenv() def get_random_number(min=1, max=100): """ 指定した範囲(min以上max未満)でランダムな整数を返します。 Args: min (int): 乱数の最小値(デフォルトは1) max (int): 乱数の最大値(デフォルトは100、maxは含まれません) Returns: int: 生成されたランダムな整数 """ return np.random.randint(min, max) def brave_search(query): """ Brave Search APIを使ってウェブ検索を行うMCPツール関数です。 Args: query (str): 検索クエリ Returns: str: 検索結果のタイトル、URL、説明文をまとめた文字列。 エラー時はエラーメッセージを返します。 MCP Tool: name: brave_search description: Brave Search APIを利用してウェブ検索を行い、上位5件の結果を返します。 parameters: - name: query type: string description: 検索したいキーワードやフレーズ returns: 検索結果のリストまたはエラーメッセージ """ api_key = os.getenv("BRAVE_API_KEY") if not api_key: return "Brave APIキーが環境変数に設定されていません。" url = "https://api.search.brave.com/res/v1/web/search" headers = { "Accept": "application/json", "X-Subscription-Token": api_key } params = { "q": query, "count": 5 } response = requests.get(url, headers=headers, params=params) if response.status_code == 200: results = response.json().get("web", {}).get("results", []) if not results: return "検索結果が見つかりませんでした。" output = "" for r in results: output += f"【{r.get('title','No Title')}】\n{r.get('url','')}\n{r.get('description','')}\n\n" return output else: return f"エラーが発生しました: {response.status_code}" with gr.Blocks() as demo: gr.Markdown("# My APIs") with gr.Accordion("Brave検索", open=True): query = gr.Textbox(label="検索クエリ") output = gr.Textbox(label="検索結果", lines=10) search_btn = gr.Button("検索", variant="primary") search_btn.click(fn=brave_search, inputs=[query], outputs=output) with gr.Accordion("ランダム数生成", open=True): min_value = gr.Number(label="最小値", value=1) max_value = gr.Number(label="最大値", value=100) random_number = gr.Number(label="ランダム数") generate_btn = gr.Button("生成", variant="primary") generate_btn.click(fn=get_random_number, inputs=[min_value, max_value], outputs=random_number) if __name__ == "__main__": demo.launch(mcp_server=True)