{"serverId":"mcp-registry/com.ranomics/mcp","tools":[{"name":"estimate_cost","fixed":{"name":"estimate_cost","description":"Non-binding USD cost estimate for a hypothetical submission. Pass target_kind='catalog' + target_id for a calibrated band (requires_human_quote=false), or target_kind='custom' for a placeholder order-of-magnitude band (requires_human_quote=true). Call BEFORE submit_experiment when budgeting matters.","inputSchema":{"type":"object","required":["experiment_type"],"properties":{"target_id":{"type":"string"},"target_kind":{"enum":["catalog","custom"],"type":"string"},"candidate_count":{"type":"integer","minimum":0},"experiment_type":{"enum":["yeast_display","mammalian_display","dms"],"type":"string"},"library_diversity":{"type":"integer","minimum":0}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":194,"tokensAfter":194},{"name":"get_experiment_quote","fixed":{"name":"get_experiment_quote","description":"Fetch the quote for an experiment once status is QuoteSent. Returns quote_id, total_usd, currency (default USD), line_items, valid_until, and terms_url. If status is QuoteSent but the scoping team has not posted a price yet, total_usd is null and a 'note' field explains it is being finalised; poll again until total_usd populates. Pass the quote_id to confirm_quote to accept.","inputSchema":{"type":"object","required":["experiment_id"],"properties":{"experiment_id":{"type":"string","minLength":1}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":153,"tokensAfter":153},{"name":"get_experiment_results","fixed":{"name":"get_experiment_results","description":"Fetch results once results_status is 'partial' or 'all' (check via get_experiment_status first). Returns per-sequence pre/post counts, log2_enrichment, percentile, called_hit booleans, plus signed download URLs for the enrichment table CSV, hits FASTA, and (when opted in) raw FASTQ. Yeast-display result shape; mammalian and DMS use the same envelope.","inputSchema":{"type":"object","required":["experiment_id"],"properties":{"experiment_id":{"type":"string","minLength":1}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":147,"tokensAfter":147},{"name":"get_experiment_status","fixed":{"name":"get_experiment_status","description":"Poll an experiment by id. Returns the current status (Draft/WaitingForConfirmation/QuoteSent/WaitingForMaterials/LibraryConstruction/Sorting/NGS/DataAnalysis/InReview/Done), the orthogonal results_status (none/partial/all), and the status_log. Cheap; safe to poll every few minutes. Webhooks are preferred for production agents.","inputSchema":{"type":"object","required":["experiment_id"],"properties":{"experiment_id":{"type":"string","minLength":1}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":140,"tokensAfter":140},{"name":"list_targets","fixed":{"name":"list_targets","description":"List the calibrated antigen catalogue. Each entry carries target_id, supported_experiment_types, and typical_campaign_range_usd. Use the target_id on submit_experiment to skip human scoping, or use the custom target shape for a one-off antigen.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":93,"tokensAfter":93},{"name":"submit_experiment","fixed":{"name":"submit_experiment","description":"Submit a binder panel for wet-lab triage. The experiment_spec mirrors the curl /api/v1/experiments contract: experiment_type (yeast_display/mammalian_display/dms), target (target_id or custom), library_design, and sequences as {user_key: amino_acid_string} (use ':' as a multi-chain separator). Optional webhook_url receives signed POSTs on every status transition. Optional idempotency_key dedupes retries. Returns the created experiment with status WaitingForConfirmation and a status_log. Poll get","inputSchema":{"type":"object","required":["experiment_spec"],"properties":{"name":{"type":"string"},"webhook_url":{"type":"string","format":"uri"},"experiment_spec":{"type":"object","required":["experiment_type","target","sequences"],"properties":{"target":{"type":"object","properties":{"custom":{"type":"object","required":["name"],"properties":{"name":{"type":"string","minLength":1},"notes":{"type":"string"},"antigen_sequence":{"type":"string"}}},"target_id":{"type":"string","minLength":1}}},"sequences":{"type":"object","additionalProperties":{"type":"string","minLength":1}},"library_design":{"type":"object","properties":{"mode":{"type":"string"},"notes":{"type":"string"},"diversity_estimate":{"type":"integer","minimum":0}}},"experiment_type":{"enum":["yeast_display","mammalian_display","dms"],"type":"string"}}},"idempotency_key":{"type":"string","maxLength":128,"minLength":8}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":400,"tokensAfter":400}],"toolsChanged":6,"tokensSaved":0,"todo":[{"tool":"confirm_quote","params":["quote_id"]},{"tool":"estimate_cost","params":["target_id","target_kind","candidate_count","experiment_type","library_diversity"]},{"tool":"get_experiment_quote","params":["experiment_id"]},{"tool":"get_experiment_results","params":["experiment_id"]},{"tool":"get_experiment_status","params":["experiment_id"]},{"tool":"submit_experiment","params":["name","webhook_url","experiment_spec","idempotency_key"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}