パラメータ化されたデータベース検索ツール
オンデマンドの検索ツールを使うと、LLM がリスト全体を読み込まずに、名前やコードで通貨を検索できるようになります。プロンプトインジェクションを防ぐためにパラメータ化クエリ(プレースホルダー ?)を使用し、レスポンスが肥大化しないよう行数に上限を設けましょう。
この演習はコースの一部です
Model Context Protocol(MCP)入門
演習の手順
currenciesテーブルの中から、nameまたはcodeにprefixが含まれる行(大文字・小文字を区別しない)を検索するlookup_currencies()というツールを定義してください。- パラメータ化 SQL クエリを使って
prefixを?プレースホルダーに挿入し、返す行数をLIMIT 50で制限してください。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
# Add lookup_currencies(prefix): find rows where name or code contains prefix
@mcp.____()
def ____(____: str) -> str:
"""Find currencies whose code or name contains the given prefix."""
try:
# Use parameterized query and LIMIT 50
cursor = conn.execute(
"SELECT code, name FROM currencies WHERE name LIKE ? OR code LIKE ? LIMIT ____",
(f"%{____}%", f"%{____}%")
)
rows = cursor.fetchall()
return "\n".join(f"{row['code']} - {row['name']}" for row in rows)
except sqlite3.Error as e:
return f"Database error: {e}"
print(lookup_currencies("Euro"))