{"openapi":"3.1.0","info":{"title":"NovoMCP REST API","version":"1.0.0","description":"The computational chemistry engine for drug discovery and materials science, as a REST API. Call any tool with `POST /tools/{tool_name}` and a Bearer API key (create one in the dashboard at app.novomcp.com). Compute tools (docking, MD, FEP, QM, NNP) require a paid plan.\n\nNote: `api.novomcp.com` is the REST API; `ai.`/`compute.novomcp.com` are the MCP connectors you add to an AI assistant.","contact":{"name":"NovoMCP","url":"https://novomcp.com"}},"servers":[{"url":"https://api.novomcp.com/v1","description":"Unified REST API"}],"security":[{"bearerAuth":[]}],"paths":{"/tools/audit_system":{"post":{"operationId":"audit_system","summary":"Audit System (Free)","description":"Pre-flight check for molecular dynamics: classify a protein structure without running MD. Returns a structured report: membrane detection (OPM), metal sites with coordination and functional role (MetalPDB + Pfam), heme/Fe-S clusters, and a routing verdict (run_soluble or refused with a specific reason and suggested_branch). Use BEFORE run_molecular_dynamics to qualify targets — if would_route_to='refused', MD will refuse with the same reason and the submission will be wasted. Free (0 credits). Returns within ~5 seconds. Accepts either pdb_id (RCSB lookup) or pdb_content (direct upload).","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"pdb_id":{"type":"string","description":"4-character PDB ID (e.g. '1CA2', '2RH1'). Fetched from RCSB."},"pdb_content":{"type":"string","description":"Raw PDB file contents. Use when the target isn't in RCSB (AlphaFold model, user-modified structure)."}}}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":0}},"/tools/batch_profile":{"post":{"operationId":"batch_profile","summary":"Batch Profile Molecules","description":"Batch version of get_molecule_profile: ADMET, FAVES compliance, and 84 properties for up to 100 molecules in one call. Returns pre-computed data for known molecules, runs FAVES check for novel ones.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles_list":{"type":"array","items":{"type":"string"},"description":"List of SMILES strings (max 100)","maxItems":100}},"required":["smiles_list"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":10}},"/tools/calculate_properties":{"post":{"operationId":"calculate_properties","summary":"Calculate Properties","description":"Calculate RDKit molecular properties on-demand. Returns Lipinski descriptors, drug-likeness scores (QED, SA_Score), physicochemical properties (LogP, TPSA, MW), and structural features. Does NOT include ADMET or compliance — use get_molecule_profile for a complete analysis.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles":{"type":"string","description":"SMILES string of the molecule"},"include_fingerprints":{"type":"boolean","description":"Include molecular fingerprints (Morgan/ECFP)","default":false}},"required":["smiles"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":10}},"/tools/cancel_job":{"post":{"operationId":"cancel_job","summary":"Cancel Async Job","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nCancel a running or queued async job — stop it before it finishes and consumes more credits. Supports FEP jobs (fep_*) and gromacs-md jobs (gro_*): deletes the k8s Job on EKS (SIGTERM to the pod), SIGTERM handler writes partial checkpoints to S3, SQL status transitions to cancelling and then to a terminal state (cancelled if SIGTERM caught between stages; failed with the engine's error if SIGTERM caught mid-stage). Use when the user submitted by mistake, the wrong inputs were used, or the job is over budget. Cancelling a completed or failed job is a no-op and returns the current state. Other job types (dock_*, qm_*) will return 'not supported' until their executors implement SIGTERM handling.","x-tier":"free","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"job_id":{"type":"string","description":"Job ID from the original submission (e.g. fep_20260430-... or gro_20260514-...)"},"reason":{"type":"string","description":"Optional human-readable reason. Persisted in error_message for the audit log.","default":"Cancelled by user"}},"required":["job_id"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":0}},"/tools/check_compliance":{"post":{"operationId":"check_compliance","summary":"Check Compliance","description":"Check regulatory and compliance status against DEA (controlled substances), FDA (drug approval), EPA (environmental/pesticide), EU REACH (chemical registration), CWC (chemical weapons convention), BTWC (biological weapons convention), OPCW (international chemical weapons treaty), and Australia Schedule. Context-dependent assessment keyed on intended_use + jurisdiction + therapeutic_area — returns PROCEED / STOP / CAUTION with risk factors, regulatory pathway, and jurisdiction-specific recommendations. **Whitelist override:** FDA-approved compounds (the V3 whitelist — cortisol, dopamine, aspirin, ibuprofen, etc.) return overall_status=PROCEED even when V4 structural alerts fire; alerts surface as informational context in `structural_alert_summary` but do not change the verdict. **Response shape:** top-level `overall_status`, `base_compliance` (regulatory + whitelist flags), and `recommendations`; FAVES V4 fields (per-catalog alert counts in `structural_alert_summary`, BOILED-Egg PK in `pk_classification`, prior-art disclosure in `prior_art`, full V3 detection in `faves_v3`) live under `context_compliance.base_classification.*`.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles":{"type":"string","description":"SMILES string of the molecule"},"context":{"type":"object","description":"Context for compliance evaluation (REQUIRED). Determines which agencies and treaty frameworks apply (DEA, FDA, CWC, EPA, EU REACH, BTWC, Australia Schedule, OPCW).","properties":{"intended_use":{"type":"string","enum":["pharmaceutical","research","industrial","agricultural","cosmetic"],"description":"Primary intended use — routes to different regulatory frameworks: pharmaceutical (FDA IND/NDA, EMA), research (laboratory/academic, DEA Schedule I exceptions), industrial (REACH, OSHA), agricultural (EPA pesticide, FIFRA), cosmetic (FDA cosmetic, EU CPR)."},"jurisdiction":{"type":"string","enum":["US","EU","UK","CA","AU","JP","CN","GLOBAL"],"description":"Regulatory jurisdiction. US=DEA+FDA+EPA, EU=EMA+EU REACH+EMCDDA, UK=MHRA, CA=Health Canada, AU=TGA+Australia Schedule, JP=PMDA, CN=NMPA, GLOBAL=CWC+BTWC+OPCW international treaties (chemical and biological weapons conventions)."},"therapeutic_area":{"type":"string","description":"Therapeutic area (e.g., oncology, cardiology, neurology, immunology, infectious_disease, metabolic, rare_disease)."},"target_population":{"type":"string","description":"Target patient population (e.g., pediatric, geriatric, general, pregnant, immunocompromised). Affects FDA special-population considerations."},"manufacturing_scale":{"type":"string","enum":["lab","pilot","commercial"],"description":"Manufacturing scale. lab (<1kg, R&D exemptions), pilot (1-100kg, GMP scale-up), commercial (>100kg, full GMP + REACH registration thresholds)."}},"required":["intended_use","jurisdiction"]},"funnel_id":{"type":"string","description":"Conversation-scoped audit/learning identifier. **Mint once at the start of every conversation as `funnel_{topic_short}_{YYYYMMDD}_{HHMMSS}` (UTC) and pass on every subsequent tool call.** topic_short: 2-4 char abbreviation of the focus (e.g. 'aml', 'gbm', 'alz', 'mat'). NEVER reuse across conversations or topics. The server keys its audit log on this id — omitting it falls back to a user-keyed slot that cannot isolate parallel conversations from the same account. For autonomous full-funnel runs, run_novo_ag returns the canonical 12-stage protocol."}},"required":["smiles","context"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":3}},"/tools/compare_candidates":{"post":{"operationId":"compare_candidates","summary":"Compare Candidates","description":"Head-to-head comparison of specific molecules. Takes a list of CIDs (from drill_into_cluster sample_cids or any other source) and returns their full profiles side-by-side: properties, ADMET predictions, FAVES compliance, structural alerts. Designed for the final selection step after narrowing via tree search.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"cids":{"type":"array","items":{"type":"string"},"description":"List of CIDs to compare (max 20)","maxItems":20},"rank_by":{"type":"string","description":"Primary ranking criterion for the comparison","enum":["qed","toxicity","drug_likeness","synthetic_accessibility","logp"],"default":"qed"},"exclude_controlled":{"type":"boolean","description":"Filter out controlled substances from results","default":true}},"required":["cids"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":5}},"/tools/compute_energy":{"post":{"operationId":"compute_energy","summary":"Compute Energy (Neural Potential)","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nCompute molecular energy and atomic forces using neural network potentials. ~100x faster than xTB. Models: ANI-2x (organic molecules: H/C/N/O/F/S/Cl, most drug-like compounds), MACE-MP-0 (universal, all elements). Use 'auto' to select the best model automatically. Returns energy in eV and kcal/mol, plus max/RMS force magnitudes. Useful for fast conformer ranking, strain estimation, and batch energetics screening.","x-tier":"free","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles":{"type":"string","description":"SMILES string of the molecule"},"method":{"type":"string","enum":["auto","ani2x","mace"],"description":"Neural potential model. 'auto' selects ANI-2x for organic molecules, MACE for others.","default":"auto"}},"required":["smiles"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":5}},"/tools/dock_molecules":{"post":{"operationId":"dock_molecules","summary":"Dock Molecules","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nDock molecules against a protein target using AutoDock-GPU. Single-molecule (smiles_list with 1 entry): executes directly, no confirmation needed, returns docking results synchronously. Batch (2+ molecules): two-phase — first call returns cost estimate + confirmation_token; second call with token submits a batch job and returns job_id (poll get_job_status every 30s until completed). Credits: 10 base + 5 per molecule (single = 15, batch of 4 = 30). GPU COLD START: the first call after idle (>5 min) includes ~2-3 min GPU warm-up; subsequent calls within 5 min are fast. If called within a discovery funnel, target_discovery already triggered a background warmup — the GPU should be ready by Step 6.","x-tier":"team","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles_list":{"type":"array","items":{"type":"string"},"description":"List of SMILES strings to dock (max 100)","maxItems":100},"protein_pdb_id":{"type":"string","description":"PDB ID of target protein (e.g. '6OIM'). Use suggested_pdb_id from target_discovery."},"exhaustiveness":{"type":"integer","description":"Search exhaustiveness (8-32, higher = more accurate but slower)","default":16,"minimum":8,"maximum":32},"num_modes":{"type":"integer","description":"Number of binding modes to generate per molecule","default":9,"minimum":1,"maximum":20},"confirmation_token":{"type":"string","description":"Token from a previous dock_molecules call to confirm and execute the docking job. Omit on first call to get a cost estimate."},"protonation_ph":{"type":"number","description":"pH for ligand and receptor protonation state (default 7.4 = blood plasma / physiological). Affects ionizable groups: amines (protonated <pKa), carboxylates (deprotonated >pKa), imidazoles, phenols, phosphates. Compartment presets: 1-3 stomach/gastric, 5-7 intestinal, 4.5 lysosomal, 6.5 tumor microenvironment, 7.4 blood/plasma/cytosol.","default":7.4,"minimum":1.0,"maximum":14.0},"funnel_id":{"type":"string","description":"Optional conversation-level funnel ID. Stored alongside the async job so get_funnel_context can return it and a resuming session can rehydrate the full audit trail via get_funnel_audit."},"reference_ligand_smiles":{"type":"string","description":"Optional reference ligand SMILES for co-docking benchmark. If omitted, the co-crystallized ligand is auto-extracted from the PDB (largest non-buffer HETATM). Each candidate pose gets a delta_vs_reference_kcal field so affinity can be interpreted against a known binder instead of in isolation."},"enable_reference_docking":{"type":"boolean","description":"If true (default), dock a reference ligand and report delta_vs_reference_kcal on each pose. Set false to skip (saves ~50% runtime, but affinity will only be comparable across candidates in the same batch).","default":true}},"required":["smiles_list","protein_pdb_id"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":10}},"/tools/dock_with_strain":{"post":{"operationId":"dock_with_strain","summary":"Strain-Corrected Docking Score","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nCalculate the internal strain energy of a docked ligand pose using xTB. Strain = E(docked_pose) - E(optimized). High strain (>5 kcal/mol) indicates the docking score may be an artifact — the ligand is forced into an unnatural conformation. Use after dock_molecules to filter false positives. Returns strain energy and interpretation.","x-tier":"free","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles":{"type":"string","description":"SMILES string of the ligand"},"docked_xyz":{"type":"string","description":"XYZ coordinates of the docked pose (from dock_molecules output). If not provided, generates 3D coords from SMILES."},"funnel_id":{"type":"string","description":"Conversation-scoped audit/learning identifier. **Mint once at the start of every conversation as `funnel_{topic_short}_{YYYYMMDD}_{HHMMSS}` (UTC) and pass on every subsequent tool call.** topic_short: 2-4 char abbreviation of the focus (e.g. 'aml', 'gbm', 'alz', 'mat'). NEVER reuse across conversations or topics. The server keys its audit log on this id — omitting it falls back to a user-keyed slot that cannot isolate parallel conversations from the same account. For autonomous full-funnel runs, run_novo_ag returns the canonical 12-stage protocol."}},"required":["smiles"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":15}},"/tools/drill_into_cluster":{"post":{"operationId":"drill_into_cluster","summary":"Drill Into Cluster","description":"Explore sub-clusters within a chemical region. Given a cluster ID from explore_chemical_space (or a previous drill_into_cluster call), returns its child clusters with detailed summaries. Each child contains ~12K molecules (Level 2) or ~100 molecules (Level 3). At Level 3, you get sample molecule CIDs you can pass to get_molecule_profile or compare_candidates.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"cluster_id":{"type":"string","description":"Cluster ID to drill into (e.g., 'L1_C000042' from explore_chemical_space)"},"query":{"type":"string","description":"Optional: refine the search within this cluster"},"smiles":{"type":"string","description":"Optional: find sub-clusters nearest to this molecule"},"top_k":{"type":"integer","description":"Number of child clusters to return (default 5, max 20)","default":5,"maximum":20},"sort_by":{"type":"string","description":"Sort child clusters by this metric","enum":["similarity","qed_mean","toxicity_min","molecule_count","clean_pct","gi_high_pct","bbb_yes_pct","pains_clean_pct"],"default":"similarity"}},"required":["cluster_id"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":3}},"/tools/explore_chemical_space":{"post":{"operationId":"explore_chemical_space","summary":"Explore Chemical Space","description":"Start a tree-guided search through 122M molecules. Returns the top chemical regions (Level 1 clusters) that best match your target profile. Each region contains ~1.2M molecules with summary statistics: MW range, avg QED, avg toxicity, % orally bioavailable (GI absorption), % BBB-penetrant, % zero-PAINS, Brenk alert rate, scaffold distribution, and FAVES compliance %. Use this as the first step — read the summaries, then call drill_into_cluster on the most promising region to narrow further.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"query":{"type":"string","description":"Natural language description of what you're looking for. Examples: 'kinase inhibitors with low toxicity', 'small molecules MW 200-400 with high QED', 'CNS-penetrant compounds with low CYP inhibition'"},"smiles":{"type":"string","description":"Optional reference SMILES. If provided, finds regions structurally similar to this molecule (uses Morgan fingerprint embedding). If omitted, uses text query embedding."},"top_k":{"type":"integer","description":"Number of regions to return (default 5, max 20)","default":5,"maximum":20},"constraints":{"type":"object","description":"Hard filters applied before ranking","properties":{"mw_min":{"type":"number","description":"Minimum avg MW for region"},"mw_max":{"type":"number","description":"Maximum avg MW for region"},"qed_min":{"type":"number","description":"Minimum avg QED for region"},"clean_pct_min":{"type":"number","description":"Minimum % FAVES-clean molecules"},"gi_high_pct_min":{"type":"number","description":"Minimum % orally bioavailable (GI High)"},"bbb_yes_pct_min":{"type":"number","description":"Minimum % BBB-penetrant"},"pains_clean_pct_min":{"type":"number","description":"Minimum % zero-PAINS alerts"},"exclude_controlled_heavy":{"type":"boolean","description":"Exclude regions where >5% are controlled substances","default":true}}}},"required":[]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":3}},"/tools/filter_molecules":{"post":{"operationId":"filter_molecules","summary":"Filter Molecules","description":"Filter the 122M molecule database by properties. Returns molecules matching criteria with pre-computed ADMET and FAVES data.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"filters":{"type":"object","description":"Filter criteria for molecular properties","properties":{"mw_min":{"type":"number","description":"Minimum molecular weight (Da)"},"mw_max":{"type":"number","description":"Maximum molecular weight (Da)"},"logp_min":{"type":"number","description":"Minimum LogP"},"logp_max":{"type":"number","description":"Maximum LogP"},"tpsa_max":{"type":"number","description":"Maximum TPSA (Å²)"},"hbd_max":{"type":"integer","description":"Maximum H-bond donors (Lipinski: ≤5)"},"hba_max":{"type":"integer","description":"Maximum H-bond acceptors (Lipinski: ≤10)"},"qed_min":{"type":"number","description":"Minimum QED drug-likeness score (0-1)"},"toxicity_max":{"type":"number","description":"Maximum overall toxicity score"},"exclude_controlled":{"type":"boolean","description":"Exclude DEA controlled substances"},"exclude_pains":{"type":"boolean","description":"Exclude PAINS compounds"},"exclude_flagged":{"type":"boolean","description":"Exclude all FAVES-flagged compounds"}}},"limit":{"type":"integer","description":"Maximum results to return (max 100)","default":10,"maximum":100}},"required":["filters"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":5}},"/tools/find_transition_state":{"post":{"operationId":"find_transition_state","summary":"Transition State Search (NEB)","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nFind the transition state and activation barrier between a reactant and product using Nudged Elastic Band (NEB) with GFN2-xTB. Returns activation energy (forward + reverse barriers), transition state geometry, and the minimum energy pathway. Requires pre-optimized reactant and product XYZ geometries (use run_qm_calculation with calculation='optimize' first). **Bimolecular reactions require a pre-built van der Waals complex** as the reactant — NEB cannot path between two separate molecules and will return non-convergent unphysical barriers (e.g., 500+ kcal/mol). For unimolecular isomerizations (e.g., HCN→HNC, conformational changes), feed the two minimum geometries directly. For bimolecular reactions (Diels-Alder, SN2, etc.), build a reactant complex with the two molecules in proximity and run optimization on the complex first. Always check the `converged` flag and `warnings` list — if `converged: false`, the barrier is unreliable. Takes 2-10 minutes depending on molecule size and number of images. Adds kinetics ('how fast?') to thermodynamics ('is it feasible?'). Use predict_reaction_thermodynamics first to confirm the reaction is thermodynamically favorable, then find_transition_state for the kinetic barrier.","x-tier":"free","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"reactant_xyz":{"type":"string","description":"XYZ geometry of the optimized reactant (from run_qm_calculation optimize)"},"product_xyz":{"type":"string","description":"XYZ geometry of the optimized product (from run_qm_calculation optimize)"},"n_images":{"type":"integer","description":"Number of intermediate NEB images (default 8, more = smoother path but slower)","default":8},"charge":{"type":"integer","description":"Molecular charge (default 0)","default":0},"uhf":{"type":"integer","description":"Unpaired electrons (default 0)","default":0},"solvent":{"type":"string","description":"ALPB solvent model (e.g., water, thf)"}},"required":["reactant_xyz","product_xyz"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":80}},"/tools/generate_dynamics":{"post":{"operationId":"generate_dynamics","summary":"Generate Conformational Dynamics","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nGenerate AI-accelerated conformational ensemble from a protein structure using AlphaFlow/ESMFlow. Shows how a protein moves — loops swaying, domains shifting, binding pockets opening/closing. Returns a job_id — use get_job_status to poll for results every 60s. IMPORTANT: This is an async job. The AlphaFlow model is large and may take 1-2 minutes to warm up on first use after a cold start. If you get a 503 'Model not loaded' error, wait 2 minutes and retry — the model is still loading. Typical inference: 1-5 minutes depending on protein size. Results include multi-model PDB for trajectory animation, per-residue RMSF (flexibility), and PCA of conformational variation.","x-tier":"enterprise","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"pdb_id":{"type":"string","description":"PDB ID of the protein (e.g., '1M17')"},"pdb_data":{"type":"string","description":"PDB file content as string (alternative to pdb_id)"},"sequence":{"type":"string","description":"Amino acid sequence (alternative to pdb_id/pdb_data)"},"n_frames":{"type":"integer","description":"Number of conformations to generate (5-500, default 50). Higher = more detail but longer runtime.","default":50,"minimum":5,"maximum":500},"funnel_id":{"type":"string","description":"Optional conversation-level funnel ID. Stored alongside the async job so get_funnel_context can return it and a resuming session can rehydrate the full audit trail via get_funnel_audit."}},"required":[]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":25}},"/tools/generate_upload_url":{"post":{"operationId":"generate_upload_url","summary":"Generate File Upload URL","description":"Generate a signed upload URL for large files (QM logs, PDB structures, compound libraries, trajectories). Upload the file directly to the URL — no data flows through the chat. Returns a file_id to reference in downstream tool calls. Free (0 credits). Upload URLs expire in 30 minutes. If auto_process is set, the file will be processed automatically after upload — no need to call a second tool.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"filename":{"type":"string","description":"Original filename including extension (e.g., '1E67_small_fc.log')"},"file_type":{"type":"string","enum":["qm_log","pdb","trajectory","library","frcmod","custom"],"description":"Type of file. Determines allowed extensions and size limits.","default":"custom"},"auto_process":{"type":"object","description":"Optional: auto-trigger a tool when upload completes. Set tool name and args. The file_id is injected automatically into the field specified by inject_as (default: qm_file_id). User gets email notification when processing finishes.","properties":{"tool":{"type":"string","description":"Tool to auto-run (e.g., 'parameterize_metal', 'audit_system', 'run_molecular_dynamics')"},"args":{"type":"object","description":"Arguments for the tool (file_id is injected into the inject_as field)"},"inject_as":{"type":"string","description":"Field name to inject the file_id as. Default: 'qm_file_id'. Use 'pdb_content_file_id' for PDB uploads to audit_system/parameterize_metal Phase 1.","default":"qm_file_id"}}}},"required":["filename"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":0}},"/tools/get_3d_properties":{"post":{"operationId":"get_3d_properties","summary":"Get 3D Properties","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nGet 3D molecular properties from conformer generation. Returns 32+ properties including geometry (radius of gyration, asphericity, PMI), energy (conformer energy, VDW, electrostatic, strain), electrostatics (dipole moment, partial charges), surface/volume (SASA, molecular volume, globularity), and full 3D coordinates.","x-tier":"free","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles":{"type":"string","description":"SMILES string of the molecule"},"force_field":{"type":"string","enum":["AMBER","CHARMM","OPLS","GROMOS"],"description":"Force field for energy calculations","default":"AMBER"},"optimize_3d":{"type":"boolean","description":"Whether to optimize the 3D geometry","default":true},"include_coordinates":{"type":"boolean","description":"Include full 3D atomic coordinates in response","default":true}},"required":["smiles"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":15}},"/tools/get_credit_usage":{"post":{"operationId":"get_credit_usage","summary":"Get Credit Usage","description":"Check your NovoMCP credit balance and research value realized. Shows included credits, overage costs, and billing period. 1 credit = $1. Use when users ask 'How many credits?', 'What's my usage?', 'Summarize my spend', or 'Check my account'.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{},"required":[]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":0}},"/tools/get_file_status":{"post":{"operationId":"get_file_status","summary":"Get File Status","description":"Check the status of an uploaded file — pending, uploaded, processing, completed. Shows linked tool calls, job IDs, and processing results. Use after uploading a file to verify it's ready for tool consumption.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"file_id":{"type":"string","description":"File ID returned by generate_upload_url (e.g., 'f-abc123...')"}},"required":["file_id"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":0}},"/tools/get_funnel_audit":{"post":{"operationId":"get_funnel_audit","summary":"Get Funnel Audit Log","description":"Retrieve the reproducibility log for a discovery funnel run. Shows every event (checkpoints + exploration tool calls) with tool arguments, result summaries, AI recommendations, human decisions, molecule counts, filtering details, and compute costs. Filter by event_type='checkpoint' for a clean peer-review view that excludes ad-hoc exploration.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"funnel_id":{"type":"string","description":"Funnel run ID to retrieve"},"event_type":{"type":"string","enum":["checkpoint","exploration","all"],"description":"Filter events. 'checkpoint' = formal funnel stages only (peer-review view). 'exploration' = ad-hoc tool calls only. 'all' = full trail (default).","default":"all"}},"required":["funnel_id"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":0}},"/tools/get_funnel_context":{"post":{"operationId":"get_funnel_context","summary":"Get Funnel Context","description":"Retrieve saved pipeline state for an async job. Read-only — cannot write state. Use when resuming a discovery funnel after a docking, MD, or FEP job completes in a new session. Returns the full funnel state (target gene, seed, candidates, scores, prior step results) from the session that submitted the job. Use save_funnel_context to persist state.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"job_id":{"type":"string","description":"Async job ID to retrieve context for"},"funnel_id":{"type":"string","description":"Conversation-scoped audit/learning identifier. **Mint once at the start of every conversation as `funnel_{topic_short}_{YYYYMMDD}_{HHMMSS}` (UTC) and pass on every subsequent tool call.** topic_short: 2-4 char abbreviation of the focus (e.g. 'aml', 'gbm', 'alz', 'mat'). NEVER reuse across conversations or topics. The server keys its audit log on this id — omitting it falls back to a user-keyed slot that cannot isolate parallel conversations from the same account. For autonomous full-funnel runs, run_novo_ag returns the canonical 12-stage protocol."}},"required":["job_id"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":0}},"/tools/get_job_status":{"post":{"operationId":"get_job_status","summary":"Get Job Status","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nCheck progress and retrieve results for ANY async NovoMCP job: molecular dynamics (gro_*), docking (dock_*, dock_batch_*), structure prediction (of3_*), quantum (qc_*), lead optimization (lo_*). Returns status, progress percentage, estimated remaining time, and full results when complete. IMPORTANT: If the job is still running, you MUST keep polling every 30-60 seconds until it completes — do NOT give up or treat 'running' as an error.","x-tier":"free","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"job_id":{"type":"string","description":"Job ID from the original submission"},"service":{"type":"string","enum":["openfold3","gromacs","novo-quantum","lead-optimization","autodock-gpu","auto"],"description":"Service that created the job. Use 'auto' to detect automatically from job_id prefix.","default":"auto"},"include_ensemble":{"type":"boolean","description":"AlphaFlow (af_*) only: include the full multi-model PDB ensemble inline in the response. Default false because the inline payload (~130 KB for a 50-frame run) typically exceeds the MCP inline tool-result soft limit and gets spilled to a file by the client. The slim default returns frame_count + size_bytes + preview + a hint at the /results/<job_id> endpoint the Apps viewer reads directly. Pass true only if you specifically need the bytes inline (e.g. piping to a downstream tool).","default":false}},"required":["job_id"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":0}},"/tools/get_molecule_info":{"post":{"operationId":"get_molecule_info","summary":"Get Molecule Info","description":"Quick lookup of basic molecular properties only (MW, formula, LogP, TPSA, H-bond counts). Lightweight — no ADMET or compliance data. Use get_molecule_profile instead if you need a complete analysis.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles":{"type":"string","description":"SMILES string representing the molecular structure"}},"required":["smiles"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":1}},"/tools/get_molecule_profile":{"post":{"operationId":"get_molecule_profile","summary":"Get Molecule Profile","description":"Full molecular profile with ADMET predictions and regulatory compliance. This is the PRIMARY tool for profiling any molecule. For known molecules (in 122M database): returns pre-computed ADMET + FAVES compliance. For other molecules: automatically runs ML-based ADMET predictions + compliance checks. Always returns complete data — no follow-up tools needed.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles":{"type":"string","description":"SMILES string representing the molecular structure"}},"required":["smiles"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":2}},"/tools/get_pipeline_audit":{"post":{"operationId":"get_pipeline_audit","summary":"Get Pipeline Audit Log","description":"Retrieve the per-molecule audit trail for a completed pipeline execution. Shows what happened to each molecule: input SMILES, standardization, per-tool results (ADMET, compliance, properties), disposition (included/excluded), and exclusion reasons. Use for GxP compliance documentation.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"pipeline_id":{"type":"string","description":"Pipeline ID (e.g., pipe_abc123)"}},"required":["pipeline_id"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":0}},"/tools/get_platform_info":{"post":{"operationId":"get_platform_info","summary":"Get Platform Info","description":"Get NovoMCP platform information including subscription tiers, available tools per tier, database statistics, ADMET capabilities, compliance lists, and credit usage. Use info_type='usage' to see your organization's credit balance and consumption.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"info_type":{"type":"string","enum":["all","tiers","database","admet","compliance","usage"],"description":"Type of info to retrieve: 'all' (default), 'tiers' (subscription features), 'database' (stats), 'admet' (available predictions), 'compliance' (controlled substance lists), 'usage' (credit balance and consumption)"},"org_id":{"type":"string","description":"Organization ID for usage data (optional - auto-detected from auth)"}},"required":[]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":0}},"/tools/get_protein_structure":{"post":{"operationId":"get_protein_structure","summary":"Get Protein Structure","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nSmart protein structure resolver with interactive 3D visualization. Accepts: (1) PDB ID (e.g., '1M17'), (2) Protein name (e.g., 'EGFR', 'CDK2'), or (3) Amino acid sequence. First tries to fetch from RCSB PDB (validated experimental structures). If not found and sequence provided, falls back to OpenFold3 prediction. Supports common drug targets: EGFR, CDK2, BRAF, ALK, JAK2, BTK, ABL, HIV Protease, SARS-CoV-2 Mpro, etc.","x-tier":"free","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"target":{"type":"string","description":"Protein identifier: PDB ID (e.g., '1M17'), protein name (e.g., 'EGFR'), or UniProt ID (e.g., 'P00533')"},"sequence":{"type":"string","description":"Optional amino acid sequence for prediction if PDB not found"},"include_ligands":{"type":"boolean","description":"Include bound ligands in the structure (default: true)","default":true}},"required":["target"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":5}},"/tools/get_structure_result":{"post":{"operationId":"get_structure_result","summary":"Get Structure Result (Deprecated)","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nDeprecated — use get_job_status for structure prediction results. Retained for backward compatibility.","x-tier":"free","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"job_id":{"type":"string","description":"Job ID from a structure prediction (of3_* prefix)"},"service":{"type":"string","enum":["openfold3","auto"],"description":"Service (default: openfold3)","default":"auto"}},"required":["job_id"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":0}},"/tools/lead_optimization":{"post":{"operationId":"lead_optimization","summary":"Lead Optimization","description":"Generate structurally diverse molecular variants via scaffold hopping (RDKit substructure replacement, 30+ ring pairs) or property-directed optimization. Returns enriched variants with SA scores, ADMET predictions, compliance checks, Tanimoto-to-seed similarity, and patent risk classification per variant. Auto-filters controlled/flagged compounds. For high-similarity property optimization close to the seed, use optimize_molecule (MolMIM) instead — this tool produces broader chemical diversity. Use after ADMET screening and compliance check to generate candidates for docking. Note: fused polycyclic scaffolds (acridine, carbazole, naphthalene, xanthene) may return 0 variants due to RDKit sanitization limitations — the response includes a diagnostic. Credits are refunded when 0 variants are returned.","x-tier":"team","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles":{"type":"string","description":"Seed molecule SMILES to optimize"},"optimization_type":{"type":"string","enum":["scaffold_hop","property_directed"],"default":"scaffold_hop","description":"Optimization strategy"},"num_variants":{"type":"integer","description":"Number of variants to generate (1-50). Also accepts legacy alias 'max_variants'.","default":10,"minimum":1,"maximum":50},"target_properties":{"type":"object","description":"Optional target property values (mw, logp, qed, tpsa)"},"similarity_range":{"type":"object","description":"Optional Tanimoto similarity window (to seed) for filtering variants. Variants outside the range are dropped before enrichment. Theo's guidance: 0.80-0.85 preserves SAR predictability around a lead; 0.75-0.85 for a patent-safe family. Default 0.3-0.85 is broad enough to not filter anything by default while still excluding identical matches.","properties":{"min":{"type":"number","minimum":0.0,"maximum":1.0,"default":0.3},"max":{"type":"number","minimum":0.0,"maximum":1.0,"default":0.85}}},"patent_risk_thresholds":{"type":"object","description":"Optional override for patent_risk classification breakpoints. Variants with Tc >= high are tagged 'high' (same patent family risk), Tc between low and high are 'low' (patentable scaffold hop), Tc < low are 'novel' (highly novel, verify pharmacophore). Defaults: {low: 0.4, high: 0.7}.","properties":{"low":{"type":"number","minimum":0.0,"maximum":1.0,"default":0.4},"high":{"type":"number","minimum":0.0,"maximum":1.0,"default":0.7}}},"funnel_id":{"type":"string","description":"Conversation-scoped audit/learning identifier. **Mint once at the start of every conversation as `funnel_{topic_short}_{YYYYMMDD}_{HHMMSS}` (UTC) and pass on every subsequent tool call.** topic_short: 2-4 char abbreviation of the focus (e.g. 'aml', 'gbm', 'alz', 'mat'). NEVER reuse across conversations or topics. The server keys its audit log on this id — omitting it falls back to a user-keyed slot that cannot isolate parallel conversations from the same account. For autonomous full-funnel runs, run_novo_ag returns the canonical 12-stage protocol."}},"required":["smiles"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":150}},"/tools/list_files":{"post":{"operationId":"list_files","summary":"List Uploaded Files","description":"List files uploaded to your account. Filter by file type (qm_log, pdb, trajectory, library) or status (uploaded, processing, completed). Shows file IDs, names, sizes, and linked jobs.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"file_type":{"type":"string","enum":["qm_log","pdb","trajectory","library","frcmod","custom"],"description":"Filter by file type. Omit to return all types."},"status":{"type":"string","enum":["pending_upload","uploaded","processing","completed","expired"],"description":"Filter by status. Omit to return all statuses."},"limit":{"type":"integer","description":"Max files to return (default 50)","default":50}},"required":[]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":0}},"/tools/list_funnels":{"post":{"operationId":"list_funnels","summary":"List Discovery Funnels","description":"List recent discovery funnel runs with metadata — disease, target gene, outcome, stage count, credits consumed, best affinity. Use this to find a funnel_id before calling get_funnel_audit. Returns the most recent funnels for the current org, enriched with terminal summary data when available.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"limit":{"type":"integer","description":"Max funnels to return (default 15)","default":15},"target_gene":{"type":"string","description":"Filter by target gene (e.g., 'EGFR', 'FLT3')"},"outcome":{"type":"string","enum":["SUCCEEDED","FAILED_NO_LEADS","FAILED_TOXICITY","FAILED_POTENCY","ABANDONED"],"description":"Filter by funnel outcome"}}}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":0}},"/tools/list_jobs":{"post":{"operationId":"list_jobs","summary":"List Pipeline Jobs","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nList async pipeline jobs (MD simulations, docking batches, structure predictions, etc.) with optional status and service filters. Returns job IDs, status, progress, and timestamps. Use to check what jobs are running or recently completed.","x-tier":"free","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"status":{"type":"string","enum":["submitted","running","completed","failed"],"description":"Filter by job status. Omit to return all jobs."},"service":{"type":"string","enum":["gromacs-md","autodock-gpu","openfold3","lead-optimization"],"description":"Filter by service. Omit to return all services."},"limit":{"type":"integer","description":"Max jobs to return (default 50, max 100)","default":50}},"required":[]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":0}},"/tools/optimize_geometry_nnp":{"post":{"operationId":"optimize_geometry_nnp","summary":"Geometry Optimization (Neural Potential)","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nAtomic geometry refinement via neural network potentials with ASE BFGS. For structure relaxation of atomic coordinates — not property-directed compound optimization (see lead_optimization or optimize_molecule for that). ~100x faster than xTB geometry optimization. Models: ANI-2x (organic, H/C/N/O/F/S/Cl), MACE-MP-0 (universal). Returns relaxed XYZ, final energy, convergence status, step count. LIMITATION: neutral molecules only — charged species (charge≠0) and open-shell (uhf≠0) must use run_qm_calculation instead (xTB supports charge/spin, NNPs do not).","x-tier":"free","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles":{"type":"string","description":"SMILES string of the molecule"},"method":{"type":"string","enum":["auto","ani2x","mace"],"description":"Neural potential model","default":"auto"},"fmax":{"type":"number","description":"Force convergence threshold in eV/Å (default 0.05)","default":0.05},"charge":{"type":"integer","description":"Molecular charge (must be 0 — NNPs do not support charged species; use run_qm_calculation for charged molecules)","default":0},"uhf":{"type":"integer","description":"Unpaired electrons (must be 0 — NNPs do not support open-shell; use run_qm_calculation for radicals)","default":0}},"required":["smiles"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":10}},"/tools/optimize_molecule":{"post":{"operationId":"optimize_molecule","summary":"Optimize Molecule","description":"Property-directed molecular optimization using NVIDIA MolMIM (generative AI). Given a seed molecule and target objectives (QED, LogP, TPSA, similarity), generates structurally similar variants biased toward the desired property profile. Returns 3-10 optimized SMILES with property deltas vs seed, each auto-checked for FAVES compliance. Keeps structural similarity high (Tanimoto > 0.4 typical) — for diverse scaffold hopping, use lead_optimization instead.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles":{"type":"string","description":"SMILES string of the molecule to optimize"},"objectives":{"type":"object","description":"Optimization objectives","properties":{"qed":{"type":"number","description":"Target QED score (0-1)"},"logp":{"type":"number","description":"Target LogP value"},"sa_score":{"type":"number","description":"Target synthetic accessibility (1-10, lower is better)"},"similarity":{"type":"number","description":"Minimum similarity to input (0-1)"}}},"num_variants":{"type":"integer","description":"Number of optimized variants to generate (max 50)","default":10,"maximum":50},"exclude_controlled":{"type":"boolean","description":"Filter out variants that match controlled substance patterns","default":true},"similarity_range":{"type":"object","description":"Optional Tanimoto similarity window (to seed) for filtering variants. Default 0.3-0.85. Theo's tighter ranges: 0.80-0.85 for SAR-preserving tweaks, 0.75-0.85 for a patent-safe family.","properties":{"min":{"type":"number","minimum":0.0,"maximum":1.0,"default":0.3},"max":{"type":"number","minimum":0.0,"maximum":1.0,"default":0.85}}},"patent_risk_thresholds":{"type":"object","description":"Optional override for patent_risk breakpoints. Defaults {low: 0.4, high: 0.7}.","properties":{"low":{"type":"number","minimum":0.0,"maximum":1.0,"default":0.4},"high":{"type":"number","minimum":0.0,"maximum":1.0,"default":0.7}}},"funnel_id":{"type":"string","description":"Conversation-scoped audit/learning identifier. **Mint once at the start of every conversation as `funnel_{topic_short}_{YYYYMMDD}_{HHMMSS}` (UTC) and pass on every subsequent tool call.** topic_short: 2-4 char abbreviation of the focus (e.g. 'aml', 'gbm', 'alz', 'mat'). NEVER reuse across conversations or topics. The server keys its audit log on this id — omitting it falls back to a user-keyed slot that cannot isolate parallel conversations from the same account. For autonomous full-funnel runs, run_novo_ag returns the canonical 12-stage protocol."}},"required":["smiles"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":25}},"/tools/parameterize_metal":{"post":{"operationId":"parameterize_metal","summary":"Parameterize Metal Site","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nASYNC JOB: Two-phase metal parameterization via MCPB.py for metalloprotein MD simulation. Returns mcpb_ job_id immediately — poll get_job_status every 60s until completed. Phase 1 (no qm_log_content): extracts coordination fragment around the metal site, generates Gaussian/ORCA .com input files, returns a confirmation_token. The user runs Gaussian/ORCA on those .com files externally. Phase 2 (confirmation_token + QM logs): processes the QM output → extracts force constants (Seminario method) + RESP charges → produces AMBER .frcmod/.prep and GROMACS .top/.gro (registered as downloadable child files of the input log). **Two-log requirement (Gaussian):** the Hessian and the MK ESP charges come from two SEPARATE runs — run Phase 1's small_fc.com (freq → Hessian) and large_mk.com (Pop(MK) → ESP), then pass hessian_file_id + esp_file_id (upload each via generate_upload_url). A single combined log via qm_file_id/qm_log_content is accepted only for the rare case where one file holds both sections (e.g. a .fchk). **Workflow constraint:** the logs must come from running Gaussian on Phase 1's specific .com files — atom indexing must match. Pre-existing QM logs from custom cluster models will fail with atom-mapping errors. Always run Phase 1 first. Auto-process pattern: upload the Hessian log, then upload the ESP log with auto_process={tool:'parameterize_metal', args:{hessian_file_id:<id>, confirmation_token:<tok>}, inject_as:'esp_file_id'} to trigger Phase 2 on the second upload. Use audit_system first to identify the metal site and verify the resid before Phase 1. Limitation: processes one chain at a time — for multi-chain metals (bridging sites in oligomers), extract chains separately. CPU-only, Phase 1 ~1-2 min, Phase 2 ~2-5 min.","x-tier":"enterprise","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"pdb_id":{"type":"string","description":"PDB ID of the metalloprotein (e.g., '1CA2', '1E67')"},"metal_resid":{"type":"integer","description":"Residue number of the metal to parameterize"},"qm_log_content":{"type":"string","description":"Phase 2 only: inline contents of the Gaussian .log. For large files, use qm_file_id instead."},"qm_file_id":{"type":"string","description":"Phase 2 (legacy single-log): file ID from generate_upload_url for one combined QM log. Prefer hessian_file_id + esp_file_id for Gaussian (a single run can't hold both the Hessian and MK ESP)."},"hessian_file_id":{"type":"string","description":"Phase 2 (preferred): file ID of the small_fc (freq) log carrying the Hessian / force constants. Pair with esp_file_id."},"esp_file_id":{"type":"string","description":"Phase 2 (preferred): file ID of the large_mk (Pop(MK)) log carrying the ESP charges for RESP fitting. Pair with hessian_file_id."},"confirmation_token":{"type":"string","description":"Phase 2 only: token from Phase 1 linking to the workspace. Omit for Phase 1."},"qm_software":{"type":"string","enum":["gaussian","orca"],"description":"QM engine","default":"gaussian"},"charge":{"type":"integer","description":"Total charge of the QM fragment","default":0},"multiplicity":{"type":"integer","description":"Spin multiplicity","default":1}},"required":["pdb_id","metal_resid"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":50}},"/tools/predict_admet":{"post":{"operationId":"predict_admet","summary":"Predict ADMET","description":"Predict toxicity and ADMET properties: cardiotoxicity, hepatotoxicity, nephrotoxicity, carcinogenicity, CYP450 inhibition (1A2/2C9/2C19/2D6/3A4 substrate + inhibitor), nuclear receptor activity (AR/ER/PR/GR/PPAR), stress response (p53, oxidative stress), absorption, distribution, metabolism, excretion. Returns per-model probabilities with severity categories. 40+ ML models from addie-models backend. Normally called automatically by get_molecule_profile; use directly for ADMET-only queries.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles":{"type":"string","description":"SMILES string of the molecule"},"models":{"type":"array","items":{"type":"string"},"description":"Specific ADMET models to run (default: all). Options: hepatotoxicity, cardiotoxicity, cyp450_1a2, cyp450_2c9, cyp450_2c19, cyp450_2d6, cyp450_3a4, herg, bbb, caco2, pgp, vdss, clearance, half_life, bioavailability, ames, skin_sensitization"},"funnel_id":{"type":"string","description":"Conversation-scoped audit/learning identifier. **Mint once at the start of every conversation as `funnel_{topic_short}_{YYYYMMDD}_{HHMMSS}` (UTC) and pass on every subsequent tool call.** topic_short: 2-4 char abbreviation of the focus (e.g. 'aml', 'gbm', 'alz', 'mat'). NEVER reuse across conversations or topics. The server keys its audit log on this id — omitting it falls back to a user-keyed slot that cannot isolate parallel conversations from the same account. For autonomous full-funnel runs, run_novo_ag returns the canonical 12-stage protocol."}},"required":["smiles"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":20}},"/tools/predict_bde":{"post":{"operationId":"predict_bde","summary":"Predict Bond Dissociation Energy","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nPredict homolytic bond dissociation energies (BDE) in kcal/mol for all C-H bonds in a molecule using the alfabet model. Identifies the weakest bond — useful for predicting metabolic soft spots, radical reactivity, and oxidative stability. Lower BDE = more susceptible to hydrogen abstraction by CYP enzymes.","x-tier":"free","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles":{"type":"string","description":"SMILES string of the molecule"}},"required":["smiles"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":15}},"/tools/predict_clinical_outcomes":{"post":{"operationId":"predict_clinical_outcomes","summary":"Predict Clinical Outcomes","description":"Predict Phase I clinical trial clearance probability for a small molecule. Automatically gathers all 63 required features by orchestrating chem-props (physicochemical), faves-compliance (structural alerts, BOILED-Egg), and addie-models (ADMET) in parallel, then calls the NovoExpert v3 model. Returns a calibrated probability, SHAP feature explanations, and a domain-specific competence assessment. The model is validated for CARDIOVASCULAR and mainstream compounds (AUROC 0.72-0.76) but NOT for oncology, CNS, or infectious disease domains (near-random performance). Check the competence_check in the response before acting on predictions.","x-tier":"core","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles":{"type":"string","description":"SMILES string of the molecule to evaluate"},"therapeutic_area":{"type":"string","description":"Therapeutic area for competence assessment. Options: ONCOLOGY, CARDIOVASCULAR, CNS_NEURO, INFECTIOUS, METABOLIC, IMMUNO_INFLAM, RENAL_GU, RESPIRATORY, GI, PAIN_ANALGESIA, ENDOCRINE, OPHTH_DERM, OTHER, UNKNOWN","default":"UNKNOWN"},"target_type":{"type":"string","description":"Target type. Options: SINGLE PROTEIN, PROTEIN FAMILY, PROTEIN COMPLEX, NUCLEIC-ACID, ORGANISM, CELL-LINE, SMALL MOLECULE, UNKNOWN","default":"UNKNOWN"},"action_type":{"type":"string","description":"Mechanism of action. Options: INHIBITOR, ANTAGONIST, AGONIST, BLOCKER, ACTIVATOR, MODULATOR, PARTIAL AGONIST, SUBSTRATE, RELEASING AGENT, UNKNOWN","default":"UNKNOWN"},"top_k_shap":{"type":"integer","description":"Number of top SHAP features to return (1-63)","default":10,"minimum":1,"maximum":63},"funnel_id":{"type":"string","description":"Conversation-scoped audit/learning identifier. **Mint once at the start of every conversation as `funnel_{topic_short}_{YYYYMMDD}_{HHMMSS}` (UTC) and pass on every subsequent tool call.** topic_short: 2-4 char abbreviation of the focus (e.g. 'aml', 'gbm', 'alz', 'mat'). NEVER reuse across conversations or topics. The server keys its audit log on this id — omitting it falls back to a user-keyed slot that cannot isolate parallel conversations from the same account. For autonomous full-funnel runs, run_novo_ag returns the canonical 12-stage protocol."}},"required":["smiles"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":25}},"/tools/predict_frontier_orbitals":{"post":{"operationId":"predict_frontier_orbitals","summary":"Frontier Orbital Analysis (OLED/Optoelectronics)","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nPredict frontier orbital properties for OLED and optoelectronics screening. Returns HOMO, LUMO, gap, emission wavelength, emission color (UV/blue/green/yellow/red/IR), triplet energy, and OLED suitability classification (phosphorescent emitter, fluorescent emitter, charge transport, host material). Detects OLED-relevant functional groups (carbazole, triphenylamine, anthracene, oxadiazole, Ir/Pt complexes, etc.). Uses GFN2-xTB for orbital energies + empirical calibration for emission prediction.","x-tier":"free","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles":{"type":"string","description":"SMILES string of the molecule or material"},"solvent":{"type":"string","description":"Solvent environment (e.g., toluene, chloroform, water). Affects orbital energies via ALPB solvation."}},"required":["smiles"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":20}},"/tools/predict_pka":{"post":{"operationId":"predict_pka","summary":"Predict pKa","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nPredict acid dissociation constant (pKa) for a molecule. Identifies ionizable functional groups (carboxylic acids, amines, phenols, sulfonamides, etc.) and returns pKa values. Critical for understanding drug absorption, formulation pH, and charge state at physiological pH. Returns ionizable groups detected and confidence level.","x-tier":"free","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles":{"type":"string","description":"SMILES string of the molecule"},"funnel_id":{"type":"string","description":"Conversation-scoped audit/learning identifier. **Mint once at the start of every conversation as `funnel_{topic_short}_{YYYYMMDD}_{HHMMSS}` (UTC) and pass on every subsequent tool call.** topic_short: 2-4 char abbreviation of the focus (e.g. 'aml', 'gbm', 'alz', 'mat'). NEVER reuse across conversations or topics. The server keys its audit log on this id — omitting it falls back to a user-keyed slot that cannot isolate parallel conversations from the same account. For autonomous full-funnel runs, run_novo_ag returns the canonical 12-stage protocol."}},"required":["smiles"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":10}},"/tools/predict_reaction_thermodynamics":{"post":{"operationId":"predict_reaction_thermodynamics","summary":"Reaction Thermodynamics (ΔG, ΔH, K_eq)","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nPredict whether a chemical reaction is thermodynamically feasible. Takes reactant and product SMILES, computes ΔE, ΔH, ΔG (Gibbs free energy), TΔS (entropy contribution), and equilibrium constant K_eq. Spontaneous if ΔG < 0. Uses GFN2-xTB with Hessian for zero-point energy and thermal corrections on each species. Confidence flag: high for organic reactions, low for transition metal catalysis (validate with DFT). No transition state search — thermodynamics only, not kinetics. Takes 60-180 seconds (Hessian per species).","x-tier":"free","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"reactant_smiles":{"type":"array","items":{"type":"string"},"description":"SMILES strings of the reactants"},"product_smiles":{"type":"array","items":{"type":"string"},"description":"SMILES strings of the products"},"solvent":{"type":"string","description":"Solvent for ALPB solvation (e.g., water, thf, dmso)"},"temperature":{"type":"number","description":"Temperature in K (default 298.15)","default":298.15}},"required":["reactant_smiles","product_smiles"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":60}},"/tools/predict_redox_potential":{"post":{"operationId":"predict_redox_potential","summary":"Electrolyte Redox Potential Screening","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nPredict oxidation and reduction potentials for battery electrolyte design. Uses a GFN2-xTB thermodynamic cycle (neutral → cation → anion optimization) with ALPB solvation. Returns adiabatic and vertical ionization potential (IP) and electron affinity (EA), electrode potentials vs reference electrode (SHE, Li/Li+, Ag/AgCl, SCE, Fc/Fc+), and stability classification against lithium-ion (0-4.2V), high-voltage Li-ion (0-5V), aqueous (0-1.23V), and sodium-ion windows. Takes 30-90 seconds per molecule. Screening-grade accuracy (±0.3-0.5V) — use for candidate ranking, not final selection.","x-tier":"free","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles":{"type":"string","description":"SMILES string of the electrolyte molecule"},"solvent":{"type":"string","description":"Solvent for ALPB implicit solvation. Must be one of xTB's supported ALPB strings: water (default), acetonitrile, methanol, acetone, dmso, dmf, thf, dioxane, ether, ethylacetate, ch2cl2, chcl3, benzene, toluene, hexane, nitromethane, phenol, aniline. Battery carbonates (ethylene carbonate, propylene carbonate, EMC, DMC) are NOT in xTB's ALPB set — passing 'ethylene_carbonate' or similar crashes xtb with exit 128. For electrolyte redox, use 'water' as a polar stand-in; the carbonate SMARTS calibration class (0.318 V MAE) recovers most of the missing solvent shift.","default":"water"},"reference_electrode":{"type":"string","enum":["SHE","Li/Li+","Ag/AgCl","SCE","Fc/Fc+"],"description":"Reference electrode for reporting potentials. Use Li/Li+ for battery work, SHE for general electrochemistry.","default":"SHE"}},"required":["smiles"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":50}},"/tools/predict_solubility":{"post":{"operationId":"predict_solubility","summary":"Predict Aqueous Solubility","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nPredict aqueous solubility as LogS (log10 mol/L) with optional temperature dependence. Returns LogS value, solubility in mg/mL, and a category (highly_soluble, soluble, slightly_soluble, insoluble). Essential for formulation development and oral bioavailability assessment. Default temperature is 25C (298.15K).","x-tier":"free","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles":{"type":"string","description":"SMILES string of the molecule"},"temperature_k":{"type":"number","description":"Temperature in Kelvin (default 298.15 = 25C). Range: 273-373K.","default":298.15},"funnel_id":{"type":"string","description":"Conversation-scoped audit/learning identifier. **Mint once at the start of every conversation as `funnel_{topic_short}_{YYYYMMDD}_{HHMMSS}` (UTC) and pass on every subsequent tool call.** topic_short: 2-4 char abbreviation of the focus (e.g. 'aml', 'gbm', 'alz', 'mat'). NEVER reuse across conversations or topics. The server keys its audit log on this id — omitting it falls back to a user-keyed slot that cannot isolate parallel conversations from the same account. For autonomous full-funnel runs, run_novo_ag returns the canonical 12-stage protocol."}},"required":["smiles"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":10}},"/tools/predict_structure":{"post":{"operationId":"predict_structure","summary":"Predict Protein Structure","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nPredict 3D protein structure using OpenFold3 with interactive visualization. Supports proteins, DNA, RNA, and protein-ligand complexes. Waits up to 60 seconds for completion. For longer predictions, returns a job_id — use get_structure_result to check progress. Short peptides (<20 residues) typically complete within the wait time. For single-molecule predictions, you may pass a top-level `sequence` (auto-inferred as protein/DNA/RNA from alphabet) or `smiles` (treated as ligand) instead of the full molecules array.","x-tier":"free","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"molecules":{"type":"array","description":"Molecules to predict structure for (required unless top-level `sequence` or `smiles` is provided)","items":{"type":"object","properties":{"type":{"type":"string","enum":["protein","dna","rna","ligand"],"description":"Molecule type"},"id":{"type":"string","description":"Identifier for this molecule"},"sequence":{"type":"string","description":"Amino acid or nucleotide sequence (for protein/dna/rna)"},"smiles":{"type":"string","description":"SMILES string (for ligands)"}},"required":["type","id"]}},"sequence":{"type":"string","description":"Convenience shortcut: single protein/DNA/RNA sequence. Auto-wrapped into molecules=[{type: inferred, id: 'target', sequence}]. Type inferred from alphabet (ACGTU + N → nucleotide, otherwise protein)."},"smiles":{"type":"string","description":"Convenience shortcut: single ligand SMILES. Auto-wrapped into molecules=[{type: 'ligand', id: 'ligand_1', smiles}]."},"output_format":{"type":"string","enum":["pdb","cif"],"default":"pdb"}}}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":100}},"/tools/pull_from_source":{"post":{"operationId":"pull_from_source","summary":"Pull from Source","description":"Pull compound data from a connected data warehouse (Snowflake, Databricks), run ADMET/compliance/optimization, and optionally push enriched results back. Actions: preview (inspect table), pull (read rows), estimate_pipeline (cost estimate), execute_pipeline (run full pipeline).","x-tier":"enterprise","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"action":{"type":"string","enum":["preview","pull","estimate_pipeline","execute_pipeline"],"description":"Action to perform: preview (inspect table metadata), pull (read rows), estimate_pipeline (get cost estimate + confirmation token), execute_pipeline (run full pull→process→push pipeline)"},"connection_id":{"type":"string","description":"Connection ID for the source data warehouse"},"table":{"type":"string","description":"Table name to read from (e.g., 'compound_library')"},"columns":{"type":"array","items":{"type":"string"},"description":"Specific columns to select (default: all)"},"filters":{"type":"array","items":{"type":"object","properties":{"column":{"type":"string"},"operator":{"type":"string","enum":["=","!=",">","<",">=","<=","IN","IS_NULL","IS_NOT_NULL","LIKE"]},"value":{}},"required":["column","operator"]},"description":"Parameterized filters (no raw SQL). Example: [{\"column\": \"status\", \"operator\": \"=\", \"value\": \"active\"}]"},"limit":{"type":"integer","description":"Max rows to return (Enterprise limit: 10,000)"},"smiles_column":{"type":"string","description":"Column containing SMILES strings (auto-detected if not specified)"},"processing_tools":{"type":"array","items":{"type":"string","enum":["predict_admet","check_compliance","optimize_molecule","calculate_properties"]},"description":"Tools to run on each row's SMILES (for estimate_pipeline and execute_pipeline)"},"destination_connection_id":{"type":"string","description":"Connection ID for push destination (optional, for pipeline actions)"},"destination_table":{"type":"string","description":"Target table name for push destination (optional)"},"confirmation_token":{"type":"string","description":"Token from estimate_pipeline to authorize execute_pipeline"}},"required":["action"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":5}},"/tools/push_to_destination":{"post":{"operationId":"push_to_destination","summary":"Push to Destination","description":"Push tool results to a connected destination such as Google Sheets or BigQuery.","x-tier":"enterprise","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"action":{"type":"string","description":"Action: list_connections, discover_schema, preview_mapping, or export"}},"required":["action"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":5}},"/tools/run_conformer_search":{"post":{"operationId":"run_conformer_search","summary":"Conformer Search","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nGenerate a conformer ensemble for a molecule using CREST (GFN2-xTB) or RDKit ETKDG. Returns ranked conformers with Boltzmann populations and relative energies. Essential before docking — ensures you dock the bioactive conformer, not just the lowest-energy one. IMPORTANT ASYNC BEHAVIOR: This returns a job_id immediately. CREST takes 5-15 minutes. You MUST tell the user the estimated time and ask them to say 'check job [job_id]' when ready. Do NOT auto-poll in a loop — you will hit tool call limits. Poll at most 2-3 times per conversation turn. Progress stays at 10% during computation — this is NORMAL, not a stall. Never report it as stuck or broken while status is 'running'.","x-tier":"free","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles":{"type":"string","description":"SMILES string of the molecule"},"max_conformers":{"type":"integer","description":"Maximum number of conformers to return (default 20, max 100)","default":20,"maximum":100},"energy_window":{"type":"number","description":"Energy window in kcal/mol — conformers within this range of the global minimum are kept","default":6.0},"quick":{"type":"boolean","description":"Use quick mode for faster but less thorough search","default":false}},"required":["smiles"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":25}},"/tools/run_excited_states":{"post":{"operationId":"run_excited_states","summary":"Excited State Calculation (sTDA-xTB)","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nCompute excited states using the simplified Tamm-Dancoff Approximation (sTDA) with xTB. Returns singlet and triplet excitation energies (eV), wavelengths (nm), oscillator strengths, S1/T1 energies, and singlet-triplet gap. More accurate than HOMO-LUMO gap for emission prediction. Use for OLED design, fluorescence/phosphorescence screening, and photochemistry. Takes 10-30 seconds.","x-tier":"free","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles":{"type":"string","description":"SMILES string of the molecule"},"charge":{"type":"integer","description":"Molecular charge (default 0)","default":0},"num_states":{"type":"integer","description":"Number of excited states to compute (default 10)","default":10},"xyz_input":{"type":"string","description":"Pre-optimized XYZ geometry (recommended for accurate excited states)"}},"required":["smiles"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":25}},"/tools/run_fep_check":{"post":{"operationId":"run_fep_check","summary":"Relative Binding Free Energy (FEP)","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nASYNC JOB: Compare binding affinity of two ligands to the same protein via Free Energy Perturbation (FEP/MBAR). Returns ΔΔG_bind (kcal/mol) with statistical uncertainty. More predictive than docking scores (R²~0.6 vs ~0.2). Requires SMILES for both ligands and a PDB ID. Two-leg pmx hybrid-topology protocol: runs the A→B alchemical mutation in the protein-ligand complex AND in pure water, then computes ΔΔG_bind = ΔG_complex − ΔG_solvent. The solvent leg cancels the intrinsic A→B free energy (charges, sterics) and isolates the binding contribution — this is what makes the result physically meaningful as a relative binding affinity. The service handles pose preparation (MCS alignment), pmx hybrid topology, lambda window scheduling, GROMACS equilibration + production on A100 GPU for both legs, and per-leg MBAR analysis. PRODUCTION-QUALITY ΔΔG requires n_lambda ≥ 11 and simulation_ns ≥ 2 (typical run: ~4 hours). Below those values the job will complete but the result is diagnostic-only — adjacent lambda windows will have insufficient overlap for MBAR convergence and the engine will return a warning saying the ΔΔG is not physically meaningful. Use the n_lambda=5, simulation_ns=0.5 minimum only for pipeline smoke-tests, never for ranking decisions. Runtime scaling (two legs combined): ~(n_lambda × (simulation_ns × 9.5 + 3.5) + 5) minutes, so 5×0.5 ≈ 45 min, 11×2 ≈ 4 h, 11×5 ≈ 9.5 h. Use after dock_molecules to re-rank top candidates by rigorous binding free energy before committing to MD simulation.","x-tier":"free","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"ligand_a_smiles":{"type":"string","description":"Reference ligand SMILES (ideally the co-crystallized ligand)"},"ligand_b_smiles":{"type":"string","description":"Mutant/variant ligand SMILES (the candidate to compare)"},"protein_pdb_id":{"type":"string","description":"PDB ID of the target protein (must contain a co-crystallized ligand for best accuracy)"},"n_lambda":{"type":"integer","description":"Number of lambda windows (default 11, more = more accurate but slower)","default":11},"simulation_ns":{"type":"number","description":"Per-window simulation length in ns (default 2.0)","default":2.0},"schedule":{"type":"string","description":"Lambda schedule: 'adaptive' (default; overlap-driven probe→refine — places windows where physics demands them) or 'uniform' (equal spacing). Adaptive is the default because uniform spacing leaves poor endpoint overlap that biases ΔΔG magnitude (validated on TYK2 ejm_46→ejm_55: uniform +0.36 vs adaptive +1.33, lit FEP +1.37).","enum":["uniform","adaptive"],"default":"adaptive"},"preset":{"type":"string","description":"Configuration preset. 'production' (default): 11 windows × 2ns, full accuracy. 'triage': 0.5ns sampling with adaptive cache, ~30-45 min/pair — fast ranking for early-stage filtering, not quantitative DDG. 50 credits for triage (vs 150 for production).","enum":["production","triage"],"default":"production"},"cached_lambda_values":{"type":"array","items":{"type":"number"},"description":"Pre-validated lambda schedule from a previous adaptive run. Skips the probe phase entirely. Use values from a prior run's lambda_values field."},"localized":{"type":"boolean","default":false,"description":"Use localized binding site restraints (Phase C) for improved accuracy on flexible targets (kinases, GPCRs). Restrains distant protein residues to reduce thermal noise in the DDG estimator."},"funnel_id":{"type":"string","description":"Conversation-scoped audit/learning identifier. **Mint once at the start of every conversation as `funnel_{topic_short}_{YYYYMMDD}_{HHMMSS}` (UTC) and pass on every subsequent tool call.** topic_short: 2-4 char abbreviation of the focus (e.g. 'aml', 'gbm', 'alz', 'mat'). NEVER reuse across conversations or topics. The server keys its audit log on this id — omitting it falls back to a user-keyed slot that cannot isolate parallel conversations from the same account. For autonomous full-funnel runs, run_novo_ag returns the canonical 12-stage protocol."}},"required":["ligand_a_smiles","ligand_b_smiles","protein_pdb_id"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":150}},"/tools/run_fep_screen":{"post":{"operationId":"run_fep_screen","summary":"FEP Library Screen","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nScreen a library of ligand pairs for relative binding free energy. Submits N parallel FEP jobs (one per pair) on A100 GPU. Each pair runs the full two-leg GROMACS FEP/MBAR protocol. Cached lambda schedules are reused automatically — first pair per transformation class runs a probe, subsequent pairs in the same class skip the probe and run faster. Two-phase workflow: Phase 1 (no confirmation_token) returns cost estimate; Phase 2 (with token) executes. Returns a screen ID — poll with get_job_status for ranked results as pairs complete.","x-tier":"team","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"ligands":{"type":"array","items":{"type":"string"},"minItems":3,"maxItems":50,"description":"List of ligand SMILES for graph-aware screening. System builds optimal perturbation graph (MST on Tanimoto similarity) and runs only the minimum N-1 edges needed. Use with reference_smiles. Mutually exclusive with 'pairs'."},"reference_smiles":{"type":"string","description":"Reference ligand SMILES for graph mode. All DDGs reported relative to this compound. Required when using 'ligands'."},"pairs":{"type":"array","items":{"type":"object","properties":{"ligand_a_smiles":{"type":"string","description":"Reference ligand SMILES"},"ligand_b_smiles":{"type":"string","description":"Variant ligand SMILES"}},"required":["ligand_a_smiles","ligand_b_smiles"]},"minItems":2,"maxItems":50,"description":"Manual ligand pairs (star mode). Each pair runs as an independent FEP job. Mutually exclusive with 'ligands'."},"protein_pdb_id":{"type":"string","description":"PDB ID of the target protein (e.g., '181L')"},"simulation_ns":{"type":"number","default":2.0,"minimum":0.5,"maximum":5.0,"description":"Production simulation time per window in ns"},"n_lambda":{"type":"integer","default":11,"minimum":5,"maximum":21,"description":"Number of lambda windows"},"schedule":{"type":"string","enum":["uniform","adaptive"],"default":"adaptive","description":"Lambda schedule strategy. adaptive uses overlap-driven probing with cache."},"preset":{"type":"string","description":"Configuration preset. 'production' (default): 11 windows × 2ns. 'triage': 0.5ns sampling with adaptive cache, ~30-45 min/pair — fast ranking. 50 credits/pair for triage.","enum":["production","triage"],"default":"production"},"confirmation_token":{"type":"string","description":"Token from Phase 1 to confirm and execute. Omit on first call for cost estimate."},"funnel_id":{"type":"string","description":"Conversation-scoped audit/learning identifier. **Mint once at the start of every conversation as `funnel_{topic_short}_{YYYYMMDD}_{HHMMSS}` (UTC) and pass on every subsequent tool call.** topic_short: 2-4 char abbreviation of the focus (e.g. 'aml', 'gbm', 'alz', 'mat'). NEVER reuse across conversations or topics. The server keys its audit log on this id — omitting it falls back to a user-keyed slot that cannot isolate parallel conversations from the same account. For autonomous full-funnel runs, run_novo_ag returns the canonical 12-stage protocol."}},"required":["pairs","protein_pdb_id"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":150}},"/tools/run_molecular_dynamics":{"post":{"operationId":"run_molecular_dynamics","summary":"Run Molecular Dynamics","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nRun GPU molecular dynamics simulation using GROMACS. Returns a job_id — use get_job_status to poll for results every 60s until completed. Estimated runtime is included in the response. Omit pdb_id for ligand-only. Results include RMSD, RMSF, radius of gyration. When a ligand is present and the system is soluble (not membrane), results ALSO include: MM-GBSA binding free energy (ΔG_bind) with per-residue decomposition, ligand RMSD, protein-ligand H-bond persistence (with quality threshold: >75% High Quality, <30% False Positive Risk), and pose clustering. Membrane systems skip MM-GBSA (standard GB/PB solver is incorrect with a lipid bilayer) but still get ligand dynamics. GPU COLD START: the first call after idle (>5 min) includes ~2-3 min GPU warm-up before the job actually starts; subsequent calls are fast. If called within a discovery funnel, target_discovery already triggered a background warmup — the GPU should be ready by Step 7.","x-tier":"enterprise","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles":{"type":"string","description":"Ligand SMILES string"},"pdb_id":{"type":"string","description":"Target protein PDB ID. Omit for ligand-only simulation."},"duration_ns":{"type":"number","description":"Simulation length in nanoseconds (1-100). Default 10ns (~20 min on A100).","default":10,"minimum":1,"maximum":100},"temperature":{"type":"number","description":"Simulation temperature in Kelvin","default":300},"funnel_id":{"type":"string","description":"Optional conversation-level funnel ID. Stored alongside the async job so get_funnel_context can return it and a resuming session can rehydrate the full audit trail via get_funnel_audit."},"intent":{"type":"string","enum":["smoke_test","equilibration_only","pose_stability","mm_gbsa","fep_window"],"description":"Scientific intent of the simulation. Drives the use-case-specific quality grade in the result's three-layer quality_report (execution_integrity / sampling_quality / scientific_adequacy). When set, the action message and remediation highlight that intent. When omitted, all known intents are still graded so the report stays informative. Choose 'smoke_test' for plumbing checks, 'equilibration_only' to validate system setup before longer production, 'pose_stability' for ligand-pocket binding-pose claims (≥10ns standard), 'mm_gbsa' for binding-energy decomposition (≥50ns standard, requires protein-ligand complex), 'fep_window' for an individual relative-free-energy window (≥2ns standard)."},"adaptive_equilibration":{"type":"boolean","description":"Opt-in: replace the fixed 100 ps NPT stage with an adaptive loop that extends NPT in 100 ps blocks (initial 50 ps + extensions up to a 1 ns cap) until water density plateau is detected via first-half vs second-half mean comparison. Adds 0–1 ns to total runtime depending on system. Default false. Recommended for protein-ligand complexes where the 100 ps fixed window often leaves density still drifting; the adaptive log appears in result.equilibration.npt_adaptive with iteration count, cumulative duration, and convergence flag.","default":false}},"required":["smiles"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":250}},"/tools/run_novo_ag":{"post":{"operationId":"run_novo_ag","summary":"'Novo AG' / '/agm' → Autonomous Mode Trigger","description":"TRIGGER KEYWORDS: 'Novo AG', 'novo ag', 'novoag', '/agm', '/AGM' (case-insensitive). Call ONLY when the user's message contains one of these literal tokens. Returns the 12-stage autonomous discovery instruction set — read it and follow it. For messages without these keywords, operate in normal collaborative mode (use tools as needed, ask clarifying questions). Pass mode='interactive' for the human-in-the-loop variant. Cost: 0 credits.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"disease":{"type":"string","description":"Disease or indication to target (e.g., 'acute myeloid leukemia', 'glioblastoma', 'lung adenocarcinoma'). Required."},"mode":{"type":"string","enum":["autonomous","interactive"],"description":"'autonomous' (default) runs end-to-end without stops. 'interactive' pauses at each stage for user review.","default":"autonomous"},"md_duration_ns":{"type":"number","description":"MD simulation duration in nanoseconds. Default 1 (short, ~2 min). Increase for production runs.","default":1}},"required":["disease"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":0}},"/tools/run_qm_calculation":{"post":{"operationId":"run_qm_calculation","summary":"Run QM Calculation","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nRun a semi-empirical quantum mechanics calculation (GFN2-xTB) on a molecule. Supports single-point energy, geometry optimization, and solvation energy (ALPB model). Returns electronic energy, HOMO-LUMO gap, dipole moment, and optionally optimized geometry. Supports charged species (charge) and open-shell systems (uhf). Pass xyz_input to bypass SMILES-to-3D conversion and use a pre-optimized geometry (e.g., for redox thermodynamic cycles).","x-tier":"free","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles":{"type":"string","description":"SMILES string of the molecule"},"calculation":{"type":"string","enum":["energy","optimize","solvation"],"description":"Calculation type. energy=single-point electronic energy at input geometry, optimize=geometry optimization to nearest minimum, solvation=solvation free energy via ALPB implicit solvent model.","default":"optimize"},"charge":{"type":"integer","description":"Molecular charge. 0=neutral closed-shell (default), +1=cation, -1=anion, +2/-2=dication/dianion. Required for charged species, radical ions, protonated amines, deprotonated carboxylates, and redox thermodynamic cycles (oxidation = charge+1 uhf+1, reduction = charge-1 uhf+1).","default":0},"uhf":{"type":"integer","description":"Number of unpaired electrons. 0=singlet closed-shell (default), 1=doublet (radical, radical cation, radical anion, open-shell transition metal d1/d9), 2=triplet (O2, carbene, triplet excited state). Required for correct open-shell energies; neutral radicals and redox-generated radical ions must set uhf=1.","default":0},"solvent":{"type":"string","description":"Solvent for ALPB implicit solvation model. Accepts: water, methanol, ethanol, acetone, acetonitrile, dmso, dmf, chloroform, dichloromethane, thf, toluene, benzene, hexane, ether. Omit for gas-phase calculation.","default":"water"},"xyz_input":{"type":"string","description":"Pre-optimized XYZ geometry (Cartesian coordinates, Angstroms). Bypasses SMILES-to-3D conversion. Use for thermodynamic cycles (e.g., vertical IP/EA at a fixed geometry for redox potential calculations), transition state follow-up, or reusing a geometry from a prior optimization."}},"required":["smiles"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":20}},"/tools/run_qm_hessian":{"post":{"operationId":"run_qm_hessian","summary":"Vibrational Frequencies & Thermochemistry","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nCompute vibrational frequencies, normal modes, and thermochemistry via xTB Hessian calculation. Returns all vibrational frequencies (cm⁻¹), explicitly flags imaginary frequencies (negative values indicating the structure is not a true minimum — it's a transition state or saddle point), plus zero-point energy (ZPE), enthalpy correction, Gibbs free energy correction (ΔG = ΔH - TΔS), and entropy. Essential for reaction thermodynamics and verifying optimized geometries are minima. Tip: pass xyz_input from a prior optimization for meaningful thermochemistry at the true minimum, or set optimize_first=true to optimize then run Hessian in one call.","x-tier":"free","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles":{"type":"string","description":"SMILES string of the molecule"},"charge":{"type":"integer","description":"Molecular charge (default 0)","default":0},"uhf":{"type":"integer","description":"Number of unpaired electrons (0=singlet, 1=doublet for radicals/ions)","default":0},"solvent":{"type":"string","description":"Solvent for ALPB solvation model (e.g., water, dmso, acetonitrile)"},"temperature":{"type":"number","description":"Temperature in K for thermochemistry (default 298.15)","default":298.15},"xyz_input":{"type":"string","description":"Pre-optimized XYZ geometry. Recommended for meaningful thermochemistry."},"optimize_first":{"type":"boolean","description":"If true, optimize geometry before Hessian (--ohess). If false, run Hessian at given geometry (--hess).","default":false}},"required":["smiles"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":30}},"/tools/save_funnel_context":{"post":{"operationId":"save_funnel_context","summary":"Save Funnel Context","description":"Persist discovery pipeline state (target gene, seed molecule, optimization results, docking scores) before an async job starts. Called automatically by dock_molecules, run_molecular_dynamics, and run_fep_check before returning a job_id. Write-only — cannot retrieve state. Use get_funnel_context to read it back when resuming a pipeline in a new session.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"job_id":{"type":"string","description":"Async job ID (dock_xxx or gro_xxx)"},"service":{"type":"string","description":"Service name (autodock-gpu, gromacs-md)"},"context":{"type":"object","description":"Funnel state JSON — target_gene, candidates, scores, prior step results"},"funnel_id":{"type":"string","description":"Conversation-scoped audit/learning identifier. **Mint once at the start of every conversation as `funnel_{topic_short}_{YYYYMMDD}_{HHMMSS}` (UTC) and pass on every subsequent tool call.** topic_short: 2-4 char abbreviation of the focus (e.g. 'aml', 'gbm', 'alz', 'mat'). NEVER reuse across conversations or topics. The server keys its audit log on this id — omitting it falls back to a user-keyed slot that cannot isolate parallel conversations from the same account. For autonomous full-funnel runs, run_novo_ag returns the canonical 12-stage protocol."}},"required":["job_id","context"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":0}},"/tools/save_funnel_memory":{"post":{"operationId":"save_funnel_memory","summary":"Save Funnel Memory (terminal summary)","description":"Write a terminal summary of a completed discovery funnel to cross-run memory. Called once at the end of a funnel run (typically after Stage 12 completion). Captures target metadata, outcome, failure patterns, key decisions, and a natural-language summary for analogical retrieval. Powers search_prior_runs — future funnels targeting the same gene/disease can learn from this run's outcome and avoid repeating mistakes. Semantic embedding generated automatically from the summary via Azure OpenAI text-embedding-3-large.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"funnel_id":{"type":"string","description":"Funnel run ID this memory belongs to"},"target_gene":{"type":"string","description":"Target gene symbol (e.g., KRAS, EGFR)"},"target_pdb_id":{"type":"string","description":"PDB ID used for docking"},"therapeutic_area":{"type":"string","description":"Therapeutic area / indication (e.g., 'lung adenocarcinoma')"},"chemotype":{"type":"string","description":"Chemotype or scaffold class explored"},"outcome":{"type":"string","enum":["SUCCEEDED","FAILED_BUDGET","FAILED_MAX_ITER","FAILED_REDLINE","FAILED_CRITICAL","ABANDONED"],"description":"Terminal outcome of the funnel"},"final_lead_count":{"type":"integer","description":"Number of lead candidates that survived to the end"},"best_affinity_kcal":{"type":"number","description":"Best binding affinity observed (kcal/mol, negative = better)"},"failure_pattern":{"type":"object","description":"JSON describing what failed and why (e.g., {\"compliance_block\": 0.8, \"reason\": \"scaffold similarity to banned molecules\"})"},"decisions":{"type":"object","description":"JSON capturing key decisions made during the run (pivots, threshold adjustments, scaffold choices)"},"summary":{"type":"string","description":"Natural-language summary (2-4 sentences) of the run, its outcome, and the lesson. Used for semantic search."}},"required":["funnel_id","outcome","summary"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":0}},"/tools/save_funnel_stage":{"post":{"operationId":"save_funnel_stage","summary":"Save Funnel Stage","description":"Record a HUMAN-REVIEWED checkpoint decision in the discovery funnel. **You do NOT need to call this to log tool calls — every tool call is already auto-logged server-side as an 'exploration' event under the session funnel_id. NEVER ask the user whether to log; logging is automatic and client-agnostic.** Call save_funnel_stage ONLY to capture the user's explicit decision/approval at a reviewed checkpoint in an interactive funnel (pass human_reviewed: true with human_decision + human_prompt) — that human context is the one thing the auto-log cannot capture. For checkpoint events inside the canonical 12-stage funnel, pass `funnel_stage` (1-12). Do NOT pass `stage_index` — it is a monotonic event counter the server auto-assigns per funnel_id. stage_name defaults to the tool name. See docs/AGENTMODE-ARCHITECTURE.md §1 for the canonical stage table.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"funnel_id":{"type":"string","description":"Unique funnel run ID (defaults to MCP session ID)"},"event_type":{"type":"string","enum":["checkpoint","exploration"],"description":"'checkpoint' = formal human-reviewed funnel stage. 'exploration' = ad-hoc tool call during ideation/backtracking. Defaults to 'checkpoint'.","default":"checkpoint"},"stage_index":{"type":"integer","description":"Monotonic event counter per funnel_id. Auto-assigned server-side if omitted (recommended)."},"funnel_stage":{"type":"integer","minimum":1,"maximum":12,"description":"Canonical funnel stage 1-12 (see docs/AGENTMODE-ARCHITECTURE.md §1). Required for checkpoint events; omit for ad-hoc/exploration events outside the funnel."},"stage_name":{"type":"string","description":"Stage identifier (e.g., target_discovery). Defaults to tool_name."},"stage_label":{"type":"string","description":"Human-readable label (e.g., Target Discovery). Defaults to titleized stage_name."},"tool_name":{"type":"string","description":"MCP tool that was called"},"tool_arguments":{"type":"object","description":"Arguments passed to the tool"},"results_summary":{"type":"object","description":"Key results from the tool"},"ai_recommendation":{"type":"string","description":"What the AI recommended"},"human_decision":{"type":"string","description":"What the user decided"},"human_prompt":{"type":"string","description":"The user's actual message"},"decision_reasoning":{"type":"string","description":"Why the user made this decision"},"human_reviewed":{"type":"boolean","description":"Whether a human reviewed this stage. True for interactive funnel checkpoints, False for auto-logged exploration events."},"molecules_in":{"type":"integer","description":"Molecules entering this stage"},"molecules_out":{"type":"integer","description":"Molecules leaving this stage"},"molecules_filtered":{"type":"object","description":"Breakdown of filtered molecules by reason"},"system_metadata":{"type":"object","description":"System prep details (water count, box dims, pocket info)"},"curation_method":{"type":"object","description":"Library curation filters, order, thresholds"},"credits_consumed":{"type":"number","description":"Credits used at this stage"},"execution_time_ms":{"type":"integer","description":"Wall clock time in ms"},"context_forward":{"type":"object","description":"State carried to next stage"},"source_file_id":{"type":"string","description":"File ID from the file intelligence layer, if this stage used an uploaded file"}},"required":["funnel_id"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":0}},"/tools/screen_library":{"post":{"operationId":"screen_library","summary":"Screen Library","description":"Screen up to 1,000 molecules for drug-likeness, toxicity flags, and regulatory compliance in one call. Returns ADMET predictions, structural alerts (PAINS, Brenk), and FAVES compliance status for each molecule. Pre-computed for known molecules (122M database), real-time ML predictions for novel ones. Optionally pass intended_use + jurisdiction + therapeutic_area for context-dependent regulatory assessment (DEA, FDA, EU REACH). Use for HTS triage, library QC, or pre-docking filtering.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles_list":{"type":"array","items":{"type":"string"},"description":"List of SMILES strings to screen (max 1000)","maxItems":1000},"context":{"type":"object","description":"Optional context for compliance (if provided, runs context-dependent check)","properties":{"intended_use":{"type":"string"},"jurisdiction":{"type":"string"},"therapeutic_area":{"type":"string"}}},"output_format":{"type":"string","enum":["summary","full","flagged_only"],"default":"summary"}},"required":["smiles_list"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":50}},"/tools/search_biorxiv":{"post":{"operationId":"search_biorxiv","summary":"Search bioRxiv","description":"Find pre-publication preprints from bioRxiv and medRxiv (live API query, not curated — searches all recent preprints). Returns preprint titles, abstracts, authors, DOIs, and publication dates. Useful for finding cutting-edge research before formal peer review, recent findings on emerging targets, and early-stage results not yet in the published literature. Complements search_literature which covers peer-reviewed publications only.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"query":{"type":"string","description":"Search query (e.g., 'CRISPR drug delivery', 'mRNA vaccine')"},"server":{"type":"string","enum":["biorxiv","medrxiv"],"default":"biorxiv","description":"Preprint server to search"},"top_k":{"type":"integer","description":"Number of results to return (max 30)","default":10,"maximum":30},"days_back":{"type":"integer","description":"Search papers from last N days (default: 365)","default":365},"funnel_id":{"type":"string","description":"Conversation-scoped audit/learning identifier. **Mint once at the start of every conversation as `funnel_{topic_short}_{YYYYMMDD}_{HHMMSS}` (UTC) and pass on every subsequent tool call.** topic_short: 2-4 char abbreviation of the focus (e.g. 'aml', 'gbm', 'alz', 'mat'). NEVER reuse across conversations or topics. The server keys its audit log on this id — omitting it falls back to a user-keyed slot that cannot isolate parallel conversations from the same account. For autonomous full-funnel runs, run_novo_ag returns the canonical 12-stage protocol."}},"required":["query"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":3}},"/tools/search_chembl":{"post":{"operationId":"search_chembl","summary":"Search ChEMBL","description":"Measured bioactivity data from ChEMBL — 2.4M compounds with assay activities, targets, IC50/Ki values. Returns compound structures, target information, and activity values. Search by compound, target, or activity type.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"query":{"type":"string","description":"Search query - compound name, target name, or disease"},"search_type":{"type":"string","enum":["compound","target","activity"],"default":"compound","description":"Type of search: compound (molecules), target (proteins), or activity (bioassay data)"},"top_k":{"type":"integer","description":"Number of results to return (max 25)","default":10,"maximum":25},"funnel_id":{"type":"string","description":"Conversation-scoped audit/learning identifier. **Mint once at the start of every conversation as `funnel_{topic_short}_{YYYYMMDD}_{HHMMSS}` (UTC) and pass on every subsequent tool call.** topic_short: 2-4 char abbreviation of the focus (e.g. 'aml', 'gbm', 'alz', 'mat'). NEVER reuse across conversations or topics. The server keys its audit log on this id — omitting it falls back to a user-keyed slot that cannot isolate parallel conversations from the same account. For autonomous full-funnel runs, run_novo_ag returns the canonical 12-stage protocol."}},"required":["query"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":5}},"/tools/search_clinical_trials":{"post":{"operationId":"search_clinical_trials","summary":"Search Clinical Trials","description":"Registered clinical trial records from ClinicalTrials.gov, including recruitment status and trial phase (live API query). Returns trial titles, phases, status, conditions, interventions, sponsors, and enrollment numbers. Essential for competitive intelligence and indication research.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"query":{"type":"string","description":"Search terms — drug names, targets, sponsors, keywords. Use with 'condition' for best results."},"condition":{"type":"string","description":"Disease or condition (e.g., 'lung adenocarcinoma'). Maps to ClinicalTrials.gov condition field for precise matching."},"status":{"type":"string","enum":["RECRUITING","ACTIVE_NOT_RECRUITING","COMPLETED","TERMINATED","ALL"],"default":"ALL","description":"Trial status filter"},"phase":{"type":"string","enum":["PHASE1","PHASE2","PHASE3","PHASE4","ALL"],"default":"ALL","description":"Clinical phase filter"},"top_k":{"type":"integer","description":"Number of trials to return (max 25)","default":10,"maximum":25}}}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":3}},"/tools/search_literature":{"post":{"operationId":"search_literature","summary":"Search Literature","description":"Find published journal articles and research papers on drug discovery topics. Searches 14,398 curated peer-reviewed publications via Pinecone semantic search. Returns paper titles, abstracts, authors, DOIs, and relevance scores. Covers ADMET research, target validation, medicinal chemistry, SAR studies, and clinical pharmacology. Use for literature review, prior art assessment, and evidence gathering during target evaluation.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"query":{"type":"string","description":"Search query (e.g., 'EGFR inhibitor selectivity', 'hepatotoxicity prediction')"},"top_k":{"type":"integer","description":"Number of papers to return (max 20)","default":10,"maximum":20},"year_min":{"type":"integer","description":"Minimum publication year filter"},"funnel_id":{"type":"string","description":"Conversation-scoped audit/learning identifier. **Mint once at the start of every conversation as `funnel_{topic_short}_{YYYYMMDD}_{HHMMSS}` (UTC) and pass on every subsequent tool call.** topic_short: 2-4 char abbreviation of the focus (e.g. 'aml', 'gbm', 'alz', 'mat'). NEVER reuse across conversations or topics. The server keys its audit log on this id — omitting it falls back to a user-keyed slot that cannot isolate parallel conversations from the same account. For autonomous full-funnel runs, run_novo_ag returns the canonical 12-stage protocol."}},"required":["query"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":5}},"/tools/search_materials_project":{"post":{"operationId":"search_materials_project","summary":"Search Materials Project Database","description":"**Novo Compute tool — requires a paid plan (Core, Team, or Enterprise).**\n\nSearch the Materials Project database for known inorganic materials. Returns band gap, formation energy, energy above hull (stability), crystal structure, and material ID. Search by chemical formula (e.g., 'LiCoO2'), chemical system (e.g., 'Li-Co-O'), or material ID (e.g., 'mp-22526'). Useful for: checking if a cathode/anode material is known, looking up band gaps for semiconductors, finding thermodynamically stable compositions. Note: Materials Project covers inorganic/solid-state materials, NOT organic molecules — use search_similar or check_compliance for organic compound lookup.","x-tier":"free","x-compute":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"query":{"type":"string","description":"Chemical formula (LiCoO2, LiFePO4), chemical system (Li-Fe-O, Li-Co-O), or Materials Project ID (mp-22526)"},"search_type":{"type":"string","enum":["formula","chemsys","material_id"],"description":"Search type: formula (exact formula), chemsys (chemical system / element combination), material_id (specific MP ID)","default":"formula"},"top_k":{"type":"integer","description":"Maximum number of results to return (default 5)","default":5}},"required":["query"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":5}},"/tools/search_patents":{"post":{"operationId":"search_patents","summary":"Search Patents","description":"Search granted and pending USPTO pharmaceutical patent filings (2,416 documents, Pinecone semantic search). Returns patent titles, abstracts, applicants, filing dates, and relevance scores. Use for intellectual property landscape analysis, freedom-to-operate assessment, prior art search, and competitive intelligence on patented scaffolds or mechanisms.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"query":{"type":"string","description":"Search query (e.g., 'kinase inhibitor', 'antibody drug conjugate')"},"top_k":{"type":"integer","description":"Number of patents to return (max 20)","default":10,"maximum":20},"year_min":{"type":"integer","description":"Minimum filing year filter"},"funnel_id":{"type":"string","description":"Conversation-scoped audit/learning identifier. **Mint once at the start of every conversation as `funnel_{topic_short}_{YYYYMMDD}_{HHMMSS}` (UTC) and pass on every subsequent tool call.** topic_short: 2-4 char abbreviation of the focus (e.g. 'aml', 'gbm', 'alz', 'mat'). NEVER reuse across conversations or topics. The server keys its audit log on this id — omitting it falls back to a user-keyed slot that cannot isolate parallel conversations from the same account. For autonomous full-funnel runs, run_novo_ag returns the canonical 12-stage protocol."}},"required":["query"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":5}},"/tools/search_prior_runs":{"post":{"operationId":"search_prior_runs","summary":"Search Prior Discovery Runs","description":"Query cross-run memory for past discovery funnels that targeted the same gene, PDB, or therapeutic area. Returns terminal summaries, outcomes, and lessons from prior attempts. Call at funnel start to learn from precedents — avoid repeating known failure modes, reuse successful scaffolds, calibrate threshold expectations. Includes a lazy backstop that auto-generates template summaries for completed funnels that lack explicit memory entries, ensuring cross-run coverage is complete.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"target_gene":{"type":"string","description":"Target gene symbol to search (e.g., KRAS)"},"target_pdb_id":{"type":"string","description":"PDB ID to search"},"therapeutic_area":{"type":"string","description":"Therapeutic area / indication to search"},"outcome":{"type":"string","enum":["SUCCEEDED","FAILED_BUDGET","FAILED_MAX_ITER","FAILED_REDLINE","FAILED_CRITICAL","ABANDONED","any"],"description":"Filter by outcome. 'any' (default) returns all.","default":"any"},"query":{"type":"string","description":"Natural-language query for semantic search over summaries (uses vector similarity when embeddings are available)"},"max_results":{"type":"integer","description":"Maximum results to return (default 10, max 50)","default":10},"funnel_id":{"type":"string","description":"Conversation-scoped audit/learning identifier. **Mint once at the start of every conversation as `funnel_{topic_short}_{YYYYMMDD}_{HHMMSS}` (UTC) and pass on every subsequent tool call.** topic_short: 2-4 char abbreviation of the focus (e.g. 'aml', 'gbm', 'alz', 'mat'). NEVER reuse across conversations or topics. The server keys its audit log on this id — omitting it falls back to a user-keyed slot that cannot isolate parallel conversations from the same account. For autonomous full-funnel runs, run_novo_ag returns the canonical 12-stage protocol."}}}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":0}},"/tools/search_similar":{"post":{"operationId":"search_similar","summary":"Search Similar Molecules","description":"Find structurally similar molecules in the 122M compound database. Returns similar molecules with their pre-computed ADMET properties and FAVES compliance status.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles":{"type":"string","description":"Query SMILES string"},"top_k":{"type":"integer","description":"Number of similar molecules to return (max 100)","default":10,"minimum":1,"maximum":100},"min_similarity":{"type":"number","description":"Minimum Tanimoto similarity threshold (0-1)","default":0.7,"minimum":0.0,"maximum":1.0},"exclude_controlled":{"type":"boolean","description":"Exclude DEA controlled substances from results","default":false},"exclude_flagged":{"type":"boolean","description":"Exclude all FAVES-flagged molecules from results","default":false}},"required":["smiles"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":5}},"/tools/stratify_patients":{"post":{"operationId":"stratify_patients","summary":"Patient Stratification & Pharmacogenomics","description":"Assess clinical viability of a drug candidate through pharmacogenomic profiling and resistance mutation analysis. Cross-references the candidate's CYP metabolism profile (from ADMET predictions) against population-level pharmacogene frequencies, and checks for known resistance mutations in the target gene. Returns population coverage estimates, PGx risk alleles, resistance variants, and clinical viability assessment. Use this as Stage 12 (of the 12-stage discovery funnel) after molecular dynamics validation. The target_gene is validated against the HGNC registry before any lookup — unknown symbols return a structured error with a suggestion (for aliases/previous symbols) or an HGNC search URL (for truly unknown genes). Valid HGNC genes outside the 56-pharmacogene panel return clinical_viability='not_applicable' instead of a silent empty response.","x-tier":"team","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles":{"type":"string","description":"Candidate molecule SMILES"},"target_gene":{"type":"string","description":"Target gene symbol — validated against the HGNC registry (44K official symbols + 58K aliases accepted). Examples: EGFR, BRAF, KRAS, CYP2D6, HER2 (auto-resolved to ERBB2). Unknown symbols return a structured error with suggestions (for aliases/previous symbols) or an HGNC search URL (for truly unknown genes). Valid HGNC genes outside the 56-pharmacogene panel return clinical_viability='not_applicable' instead of silent failure. Also accepts legacy alias 'gene_symbol'."},"indication":{"type":"string","description":"Disease indication for context"},"admet_results":{"type":"object","description":"ADMET predictions from Stage 5 (containing CYP substrate probabilities). If omitted, tool will attempt to retrieve from funnel context."},"include_pgx":{"type":"boolean","description":"Include pharmacogenomic analysis","default":true},"include_biomarkers":{"type":"boolean","description":"Include resistance mutation analysis","default":true},"funnel_id":{"type":"string","description":"Conversation-scoped audit/learning identifier. **Mint once at the start of every conversation as `funnel_{topic_short}_{YYYYMMDD}_{HHMMSS}` (UTC) and pass on every subsequent tool call.** topic_short: 2-4 char abbreviation of the focus (e.g. 'aml', 'gbm', 'alz', 'mat'). NEVER reuse across conversations or topics. The server keys its audit log on this id — omitting it falls back to a user-keyed slot that cannot isolate parallel conversations from the same account. For autonomous full-funnel runs, run_novo_ag returns the canonical 12-stage protocol."}},"required":["smiles","target_gene"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":15}},"/tools/target_discovery":{"post":{"operationId":"target_discovery","summary":"Omics-Driven Target Discovery","description":"Identify and rank drug targets for a disease using pre-computed multi-omics evidence (genetics, expression, tractability). Queries 108K target-disease associations from Open Targets + TCGA expression data. Returns ranked targets with composite scores, suggested PDB structures for docking, and pathway context. Use this as Stage 1 (of the 12-stage discovery funnel) before search_literature to start with a genetically validated target.","x-tier":"team","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"disease":{"type":"string","description":"Disease name or EFO ID (e.g. 'lung adenocarcinoma', 'EFO_0000571')"},"tissue":{"type":"string","description":"Optional tissue context for filtering (e.g. 'lung', 'liver')"},"min_evidence":{"type":"number","description":"Minimum overall association score (0-1)","default":0.5,"minimum":0,"maximum":1},"max_targets":{"type":"integer","description":"Maximum number of targets to return","default":10,"minimum":1,"maximum":50},"funnel_id":{"type":"string","description":"Conversation-scoped audit/learning identifier. **Mint once at the start of every conversation as `funnel_{topic_short}_{YYYYMMDD}_{HHMMSS}` (UTC) and pass on every subsequent tool call.** topic_short: 2-4 char abbreviation of the focus (e.g. 'aml', 'gbm', 'alz', 'mat'). NEVER reuse across conversations or topics. The server keys its audit log on this id — omitting it falls back to a user-keyed slot that cannot isolate parallel conversations from the same account. For autonomous full-funnel runs, run_novo_ag returns the canonical 12-stage protocol."}},"required":["disease"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":10}},"/tools/validate_target":{"post":{"operationId":"validate_target","summary":"Adversarial Target Validation","description":"Stress-test a drug target hypothesis before committing compute credits. Searches for both supporting AND contradicting evidence: failed clinical trials, known resistance mechanisms, off-target toxicity signals, competitive landscape. Synthesizes a 0-1 confidence score from 4 weighted evidence streams: clinical trials (3×), ChEMBL bioactivity (2×), literature (1×), omics (1×). Classifies target maturity (mature_validated / emerging / novel) and returns a recommendation (proceed / proceed_with_caution / reconsider) with specific risk factors and strengths. Essential adversarial checkpoint: 'Is this target worth pursuing, or will it fail for known reasons?' Use after target_discovery.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"target":{"type":"string","description":"Gene symbol (e.g. 'EGFR', 'BRAF') or protein name to validate"},"disease":{"type":"string","description":"Disease name (e.g. 'glioblastoma', 'non-small cell lung cancer') or EFO/MONDO ID"},"skip_cache":{"type":"boolean","description":"Bypass the 1-hour result cache for this (target, disease) key. Use when re-running after a relevance-threshold tuning or other server-side change so the test exercises the fresh evidence pipeline. Default false. The response always carries `_cached: true` when it came from cache, so callers can detect stale results without this flag.","default":false},"funnel_id":{"type":"string","description":"Conversation-scoped audit/learning identifier. **Mint once at the start of every conversation as `funnel_{topic_short}_{YYYYMMDD}_{HHMMSS}` (UTC) and pass on every subsequent tool call.** topic_short: 2-4 char abbreviation of the focus (e.g. 'aml', 'gbm', 'alz', 'mat'). NEVER reuse across conversations or topics. The server keys its audit log on this id — omitting it falls back to a user-keyed slot that cannot isolate parallel conversations from the same account. For autonomous full-funnel runs, run_novo_ag returns the canonical 12-stage protocol."}},"required":["target","disease"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":8}},"/tools/vector_search":{"post":{"operationId":"vector_search","summary":"Vector Similarity Search","description":"Fast approximate nearest-neighbor search over 122M molecules using DiskANN. Given a query molecule (SMILES), finds the most structurally similar molecules in <100ms using Morgan fingerprint embeddings. This replaces the old brute-force Tanimoto search. Use this when you already know what molecule you want analogs of. For broader exploration, use explore_chemical_space instead.","x-tier":"free","x-compute":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"arguments":{"type":"object","properties":{"smiles":{"type":"string","description":"Query SMILES string"},"top_k":{"type":"integer","description":"Number of similar molecules to return (max 100)","default":10,"maximum":100},"min_similarity":{"type":"number","description":"Minimum cosine similarity threshold (0-1)","default":0.7},"property_filters":{"type":"object","description":"Optional property filters applied post-search","properties":{"mw_min":{"type":"number"},"mw_max":{"type":"number"},"qed_min":{"type":"number"},"toxicity_max":{"type":"number"},"exclude_controlled":{"type":"boolean","default":true},"exclude_pains":{"type":"boolean","default":false}}}},"required":["smiles"]}},"required":["arguments"]}}}},"responses":{"200":{"description":"Tool result. Async tools return {job_id,status} (poll get_job_status); two-phase tools return {phase:'estimate',confirmation_token} on the first call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"400":{"description":"Bad request / tool execution error or insufficient credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Trial expired or credits depleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Paid plan required (compute tool on a non-paid key) or tier too low.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see retry_after).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-credits":5}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"API key (nmcp_… or ncmcp_…) as a Bearer token. X-API-Key header is also accepted."}},"schemas":{"ToolResponse":{"type":"object","properties":{"result":{"type":"object","description":"Tool-specific result payload."},"usage":{"type":"object","properties":{"tool":{"type":"string"},"credits":{"type":"number"},"credits_remaining":{"type":"number"},"credit_status":{"type":"string","enum":["ok","low","depleted"]}}}},"required":["result"]},"Error":{"type":"object","properties":{"detail":{"description":"String message or structured object (error code + actionable fields).","oneOf":[{"type":"string"},{"type":"object"}]}}}}}}