Add src/tools.py
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
"""MCP‑style tool that fetches course metadata from a local JSON file.
|
||||
|
||||
The function `fetch_course_meta` performs a GET request to the mock MCP server
|
||||
and returns the JSON content. It is wrapped with LangChain's `tool` decorator
|
||||
so that the agent can call it.
|
||||
"""
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
from typing import Dict
|
||||
|
||||
import httpx
|
||||
from langchain.tools import tool
|
||||
from .config import MCP_SERVER_URL
|
||||
|
||||
@tool("fetch_course_meta")
|
||||
def fetch_course_meta(query: str) -> Dict:
|
||||
"""Return course metadata that matches *query*.
|
||||
|
||||
The mock server simply returns the full JSON; the agent decides whether
|
||||
the query is about metadata. The function is intentionally simple to
|
||||
keep the focus on routing logic.
|
||||
"""
|
||||
try:
|
||||
response = httpx.get(MCP_SERVER_URL, timeout=5.0)
|
||||
response.raise_for_status()
|
||||
data = response.json()
|
||||
except Exception as exc: # pragma: no cover – network errors
|
||||
raise RuntimeError(f"Failed to fetch metadata: {exc}")
|
||||
|
||||
# Basic filtering – return the whole object if the query contains a
|
||||
# known keyword. In a real system this would be more sophisticated.
|
||||
if any(k.lower() in query.lower() for k in data.keys()):
|
||||
return data
|
||||
# If nothing matches, return an empty dict
|
||||
return {"message": "No metadata found for the query."}
|
||||
Reference in New Issue
Block a user