"""
Tools module - Register all MCP tools
"""
from mcp.server import Server
from mcp.types import Tool, TextContent
from src.tools.link_scanner import (
scan_video_link,
scan_text_link,
get_scan_video_link_tool,
get_scan_text_link_tool
)
# Export tool getters for use in HTTP server
__all__ = ['register_tools', 'get_scan_video_link_tool', 'get_scan_text_link_tool']
def register_tools(server: Server):
"""
Register all tools with the MCP server
Args:
server: MCP Server instance
"""
@server.list_tools()
async def handle_list_tools() -> list[Tool]:
"""
List all available tools
Returns:
list[Tool]: List of available tools
"""
return [
get_scan_video_link_tool(),
get_scan_text_link_tool()
]
@server.call_tool()
async def handle_call_tool(name: str, arguments: dict) -> list[TextContent]:
"""
Handle tool calls
Args:
name: Tool name
arguments: Tool arguments
Returns:
list[TextContent]: Tool execution results
"""
url = arguments.get("url")
if not url:
return [TextContent(
type="text",
text="Error: url parameter is required"
)]
try:
if name == "scan_video_link":
result = await scan_video_link(url)
elif name == "scan_text_link":
result = await scan_text_link(url)
else:
return [TextContent(
type="text",
text=f"Unknown tool: {name}"
)]
# Enforce 24k character limit (PlayMCP policy requirement)
MAX_RESPONSE_SIZE = 24 * 1024 # 24k characters
if len(result) > MAX_RESPONSE_SIZE:
import logging
logger = logging.getLogger(__name__)
logger.warning(f"Response exceeds 24k limit ({len(result)} chars), truncating to {MAX_RESPONSE_SIZE} chars")
result = result[:MAX_RESPONSE_SIZE - 3] + "..."
return [TextContent(
type="text",
text=result
)]
except Exception as e:
# If scan_video_link fails, try fallback to scan_text_link
if name == "scan_video_link":
try:
result = await scan_text_link(url)
return [TextContent(
type="text",
text=result
)]
except Exception as fallback_error:
return [TextContent(
type="text",
text=f"Error: Video processing failed ({str(e)}), and text fallback also failed ({str(fallback_error)})"
)]
return [TextContent(
type="text",
text=f"Error: {str(e)}"
)]