AACT Clinical Trials MCP Server

o �uTg�#�@sTddlZddlmZddlmZddlmZddlmZe� d�Z Gdd�d�Z dS) �N)�Any)�AnyUrl�)� AACTDatabasezmcp_aact_server.handlersc@s�eZdZdefdd�Zdeejfdd�Zde de fdd �Z deej fd d �Z d e d ee e fdBdejfdd�Zdeejfdd�Zd e d ee efdBdeejfdd�ZdS)� MCPHandlers�dbcCs ||_dS)N)r)�selfr�r �C/Users/jonas/servers/src/ctgov-aact/src/mcp_server_aact/handlers.py�__init__ s zMCPHandlers.__init__�returnc�s8�t�d�tjtd�dddd�tjtd�dd dd�gS) NzHandling list_resources requestzmemo://landscapezClinical Trial LandscapezKKey findings about trial patterns, sponsor activity, and development trendsz text/plain)�uri�name� description�mimeTypezmemo://metricsz Trial MetricszKQuantitative metrics about trial phases, success rates, and temporal trends)�logger�debug�types�Resourcer�rr r r �handle_list_resources s� ���z!MCPHandlers.handle_list_resourcesr c�s��t�d|���|jdkrt�d|j���td|j����t|��dd�}|s2t�d�td��|dkr;|j��S|dkrD|j� �S|d krM|j� �St�d |���td |����) Nz(Handling read_resource request for URI: �memozUnsupported URI scheme: zmemo://�zEmpty resource path�insightsZ landscape�metricszUnknown resource path: ) rr�scheme�error� ValueError�str�replacer�get_insights_memo�get_landscape_memo�get_metrics_memo)rr �pathr r r �handle_read_resources"�     z MCPHandlers.handle_read_resourcec�s,�t�d�tjddtjdddd�gd�gS) NzHandling list_prompts request�indication-landscapezpAnalyzes clinical trial patterns, development trends, and competitive dynamics within specific therapeutic areas�topiczWTherapeutic area or indication to analyze (e.g., 'multiple sclerosis', 'breast cancer')T)rr�required)rr� arguments)rrr�Prompt�PromptArgumentrr r r �handle_list_prompts3s� ����zMCPHandlers.handle_list_promptsrr(Nc�s��ddlm}t�d|�d|���|dkr%t�d|���td|����|r+d|vr4t�d�td��|d}|j|d �}tjd |��tj d tj d |� �d �d�gd�S)Nr)�PROMPT_TEMPLATEz Handling get_prompt request for z with args r%zUnknown prompt: r&z Missing required argument: topic)r&z&Clinical trial landscape analysis for �user�text��typer.)�role�content)r�messages) �promptsr,rrrr�formatr�GetPromptResult� PromptMessage� TextContent�strip)rrr(r,r&�promptr r r �handle_get_promptCs&�    ���zMCPHandlers.handle_get_promptc �s��tjddddddd�idgd�d �tjd d did �d �tjd dddddd�idgd�d �tjddddddd�idgd�d �tjddddddd�idgd�d �tjddddddd�idgd�d �gS)N� read-queryz;Execute a SELECT query on the AACT clinical trials database�object�query�stringzSELECT SQL query to execute)r0r)r0� propertiesr')rr� inputSchema� list-tablesz$List all tables in the AACT database)r0r@�describe-tablez7Get the schema information for a specific table in AACT� table_namezName of the table to describe�append-insightz"Add a business insight to the memo�insightz.Business insight discovered from data analysis�append-landscapez8Add findings about trial patterns and development trends�findingz/Analysis finding about trial patterns or trends�append-metricsz%Add quantitative metrics about trials�metricz*Quantitative metric or statistical finding)r�Toolrr r r �handle_list_tools\sl� ��� �� ���  ���  ���  ����zMCPHandlers.handle_list_toolsc �s��z�|dvr td|����|s|dkrtd��|dkr,|j�d�}tjdt|�d�gWS|dkrNd |vr8td ��|j�d d |d i�}tjdt|�d�gWS|d krt|d �����d�satd��|j�|d �}tjdt|�d�gWS|dkr�d|vr�td��|j� |d�tjddd�gWS|dkr�d|vr�td��|j� |d�tjddd�gWS|dkr�d|vr�td��|j� |d�tjddd�gWSWdSt y�}zt |t�rۂtjddt|���d�gWYd}~Sd}~ww)N>r<rIrErBrGrCzUnknown tool: rBzMissing argumentsz� SELECT table_name FROM information_schema.tables WHERE table_schema = 'ctgov' ORDER BY table_name; r.r/rCrDzMissing table_name argumenta SELECT column_name, data_type, character_maximum_length FROM information_schema.columns WHERE table_schema = 'ctgov' AND table_name = %s ORDER BY ordinal_position; r<r>ZSELECTz.Only SELECT queries are allowed for read-queryrErFzMissing insight argumentzInsight added to memorGrHzMissing finding argumentzLandscape finding addedrIrJzMissing metric argumentz Metric addedzError: )rr� execute_queryrr8rr9�upper� startswith� add_insight�add_landscape_finding�add_metrics_finding� Exception� isinstance)rrr(�results�er r r �handle_call_tool�sV�   �� &��zMCPHandlers.handle_call_tool)�__name__� __module__� __qualname__rr �listrrrrrr$r)r+�dictr6r;rKrLrr8rWr r r r r s$,Cr) �logging�typingr� mcp.typesr�pydanticr�databaser� getLoggerrrr r r r �<module>s