{"name":"ay-robots","version":"1.0.0","protocolVersion":"2025-06-18","supportedProtocolVersions":["2025-06-18","2025-03-26","2024-11-05"],"transport":"streamable-http","endpoint":"https://www.ay-robots.com/api/mcp","authenticated":false,"authStatus":"anonymous: public tools only","tools":[{"name":"search_docs","title":"Search the documentation","description":"Full text search across everything AY-Robots publishes: the tutorials under /learn, the SO-100 reference pages under /so-100, the per model policy pages under /policies, the training guides under /train (one per model and arm combination), the head to head comparisons under /compare, the troubleshooting pages under /fix and the glossary under /glossary. Use this to answer questions about recording imitation learning data, the LeRobot dataset format, calibrating an SO-100, picking a policy, training one or running it on hardware. Each hit returns title, URL, slug and kind; pass the slug to get_guide to read the page in full. For a symptom in a user's own words, diagnose_problem is the better entry point, and for a single term, define_term.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"list_policies","title":"List trainable policies","description":"List every policy the AY-Robots training backend can actually fine tune (GR00T N1.7, GR00T N1.5, Pi0.5, SmolVLA, ACT) with the facts an agent needs to choose one: the trainer key the training API expects, vendor, parameter count, GPU tier, measured inference latency per action step, default hyperparameters, the episode count below which the model tends to disappoint, whether it can run outside the cloud, the accepted dataset format and a one line reason to pick it. Start here when a user asks which model to train.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"get_policy","title":"Policy details","description":"Everything the catalog knows about one policy, looked up by slug (groot-n1-7, groot-n1-5, pi0-5, smolvla, act) or by trainer key (groot1.7, groot1.5, pi0, smolvla, act). Returns the facts, what the model is good at, where it falls down, an estimated cost for one training run, the URL of its page under /policies and the URLs of the step by step training guides that cover it on each supported arm.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"compare_policies","title":"Compare two policies","description":"Compare two policies side by side on the catalog facts: vendor, architecture, parameters, GPU tier, inference latency, default hyperparameters, extra knobs the training form exposes, minimum episodes, dataset format, whether each can run outside the cloud, and an estimated cost per run. Also returns the strengths and limits of both and the URL of the written comparison page under /compare when one exists. Takes two policy slugs or trainer keys in any order.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"list_arms","title":"List robot arms","description":"List every robot arm in the AY-Robots catalog (SO-100, SO-101, Koch v1.1, LeKiwi) with alternative names people search for, who makes it, degrees of freedom, servo type, operating voltage, approximate cost in parts and how completely the platform supports it. This is the full answer to \"will my arm work\" and it carries the supply voltage, which is the mistake that destroys hardware. list_supported_robots returns the older short form.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"list_supported_robots","title":"Supported arms, short form","description":"Short list of the supported robot arms: id, name, degrees of freedom, servo type, operating voltage and a one line note, taken from the same catalog the site is built on. Kept for compatibility with existing integrations. list_arms is the fuller tool and adds the alternative names people search for, the maker, the approximate cost in parts, the support level and the number of training guides per arm; get_arm returns one arm with its whole page.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"list_guides","title":"Index of every page","description":"Index of every page on the site: the tutorials under /learn, the training guides under /train (one per model and arm combination), the policy pages under /policies, the comparisons under /compare, the SO-100 reference pages under /so-100, the troubleshooting pages under /fix and the glossary entries under /glossary. Each entry is slug, title, description, URL and kind. Pass kind to narrow the list. Use this to see what exists, then read a page in full with get_guide.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"get_guide","title":"Read a page","description":"Read one page of the site in full, rendered as clean markdown: headings, paragraphs, fenced code with its language, bullet and numbered lists, tables, callouts as blockquotes, the step by step section as a numbered list and the FAQ as question and answer pairs. Accepts the slug of a tutorial, training guide, policy page, comparison, SO-100 reference page, troubleshooting page or glossary entry, and also accepts a path or a full URL. Two families can share a slug, for example a reference page and a glossary entry of the same name; pass kind to say which one you mean. This is how an agent reads the documentation instead of guessing at it.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"diagnose_problem","title":"Diagnose a problem","description":"Diagnose a broken robot, a rejected dataset or a failed training run from a free text description of the symptom, and get the actual fix rather than a link. Pass what the user said, for example \"the arm goes limp the moment I press record\", \"GR00T says my dataset is the wrong version\" or \"the policy runs but the gripper never closes\". It ranks the troubleshooting pages under /fix by symptom line, title, keywords and body text, weighted by the arm and the model if you know them, and returns for every candidate the matching symptom, the short answer, the numbered diagnosis steps with their commands and the hardware warnings from that page. That is enough to walk someone through a dead arm in one call. When nothing matches it returns the areas the troubleshooting pages cover instead of an empty result.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"list_fixes","title":"Troubleshooting index","description":"Index of every troubleshooting page under /fix, grouped by area: hardware, connection, dataset, training and deployment. Each entry is the slug, the page title, the symptom in the words a user would use, and the URL. Pass area to see one group. Use this to see what is covered, diagnose_problem when you have a symptom and want the fix itself, and get_fix to read one page in full.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"get_fix","title":"Read a troubleshooting page","description":"Read one troubleshooting page from /fix in full, rendered as clean markdown: the cause, the checks in order, the tables, the callouts and the FAQ. Also returns the structured fields on their own, the symptom, the short answer, the area, which arms and which models the page applies to, the numbered diagnosis steps with their commands and the hardware warnings. Takes a slug from diagnose_problem, list_fixes or search_docs; a path or a full URL works too.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"define_term","title":"Define a term","description":"Look up one term in the AY-Robots glossary at /glossary. Accepts the slug, the term itself or any spelling people use for it, case insensitive, for example \"action chunking\", \"VLA\", \"checkpoint\" or \"LeRobot dataset\". Returns the one paragraph definition that can stand on its own, the full explanation as markdown, the related terms and the pages on the site that go deeper. Use it before explaining a piece of robot learning vocabulary in your own words, so the wording matches the rest of the platform. If the word is not in the glossary it returns the closest entries instead of an error.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"list_terms","title":"Glossary index","description":"The whole AY-Robots glossary as a flat list: slug, term, the spellings each term is also known by, and its one paragraph definition. Use this to see which robot learning vocabulary is defined here before explaining it yourself, then call define_term for the full entry with the longer explanation and the links.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"estimate_training_cost","title":"Estimate training cost","description":"Estimate what one cloud training run costs for a given policy: the GPU tier the pool requests, the hourly price range for that tier, the expected wall clock duration and the resulting total. Optionally pass a step count to scale the estimate away from the model default, and an episode count to check it against the minimum that model needs. GPUs are rented per hour on a spot market, so the answer is a range and never a quote. Call this before start_training so the user knows what they are agreeing to.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"get_live_demo","title":"Live SO-100 demo","description":"Describe the public live demo at /live: a real SO-100 robot arm that anyone can drive from a browser, with no account, no install and no hardware of their own. Use this when someone wants to try the platform before buying an arm or signing up. Returns a description and the link for the user to open; there is no remote control API in this MCP server, the driving happens in the browser.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"get_arm","title":"Robot arm details","description":"Everything about one supported robot arm: the hardware facts from the catalog, the full landing page as markdown, which policies and training guides exist for it, and the troubleshooting pages that apply to it. Accepts the slug (so-100, so-101, koch-v1-1, lekiwi) or a common alternative spelling such as SO-ARM100. Use this when someone asks what an arm is, what it costs, what it runs on, or whether to build one.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"get_cli_reference","title":"CLI reference","description":"The complete command surface of the ay-robots CLI, generated from the shipped parser rather than from documentation. Call this before telling anyone to run an ay-robots command: several commands people expect do not exist, most importantly there is no train subcommand, because training runs on a rented cloud GPU and is started in the dashboard or through the start_training tool. Returns install commands, every subcommand with its real options, and the known wrong commands with what to do instead.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"list_industry_directory","title":"Robot learning industry directory","description":"Curated directory of the robot learning industry: teleoperation companies, robot training data companies, VLA and imitation learning labs, humanoid makers, robot arm manufacturers and simulation software. Each entry is a real company with website, HQ country and a one line description. Call without arguments for every category, or pass a category slug for one list. Use this when someone asks who offers teleoperation, who sells robot training data, or which companies build humanoids or VLA models.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"get_started_guide","title":"Getting started path","description":"Return the ordered getting-started path for a new AY-Robots user with an SO-100: install, pair, calibrate, record, train, run. Includes the exact CLI commands.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"get_pricing","title":"Pricing","description":"Current AY-Robots pricing for training, inference and teleoperation.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"list_vla_models","title":"List VLA models","description":"List every vision language action model in the AY-Robots VLA Arena, not only the five this platform can train. Each entry carries developer, release month, category, total parameters, whether the weights are public and under which licence, the weights only GPU memory footprint computed at bf16, published inference latency where one exists, and the best reported result on each of three axes: simulation benchmarks, real robot rollouts and fine tuned tasks. Use this when someone asks which VLA models exist, which one fits a given GPU, or how two unrelated models compare. Optional filters narrow the list.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"get_vla_model","title":"VLA model details","description":"Everything the VLA Arena knows about one model, looked up by slug or by name. Returns architecture (backbone, action head, action chunk, control rate), parameter count, computed GPU memory at four precisions, the smallest real card that fits it, published latency and memory figures with their sources, the pretraining corpus, supported embodiments, every sourced benchmark result grouped into simulation, real world and fine tuned tasks, strengths, limits, licence, links to paper, code and weights, and the full source list. Use this when someone asks what a specific VLA model needs or what it scored.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"compare_vla_models","title":"Compare two VLA models","description":"Compare two vision language action models side by side on the facts the arena carries: developer, release month, parameters, licence, backbone, action head, computed and reported GPU memory, published latency, control rate and the benchmark suites both of them report. The suites both models ran are listed separately, because those are the only numbers that can honestly be put next to each other. Takes two slugs or names in any order.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"search","title":"Search AY-Robots documentation","description":"Search everything AY-Robots publishes about recording imitation learning data with an SO-100 class robot arm, training a policy on a rented GPU and running it back on the arm: tutorials, SO-100 reference pages, per model policy pages, training guides, head to head comparisons, troubleshooting pages and the glossary. Returns id, title and canonical URL per hit; pass an id to the fetch tool to read that page in full. Same corpus and ranking as search_docs, in the result shape ChatGPT deep research and company knowledge expect. Use search_docs instead when you want to filter by page family or need the page descriptions.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"fetch","title":"Read one AY-Robots page","description":"Retrieve one AY-Robots documentation page in full, as markdown, by the id returned from the search tool. A bare page slug or a full https://www.ay-robots.com/ URL is accepted too. This reads the published AY-Robots site only - it is not a general web fetcher and will not retrieve arbitrary URLs.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"list_open_positions","title":"List open positions","description":"List the roles AY-Robots is currently hiring for, with what the work actually is and what background helps. Two kinds exist: an internship (Praktikum) around recording imitation learning data on real SO-100 class arms, and a working student role (Werkstudent) on the Next.js and TypeScript platform. Hours, duration, start date, pay and work location are deliberately not published, because they are agreed individually - do not invent them and do not guess a salary. Applications are only accepted through the web form at https://www.ay-robots.com/careers, which takes a CV as a file upload; this server never accepts an application or a document.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":false},{"name":"list_datasets","title":"List your datasets","description":"List the datasets in the authenticated account, newest first: id, name, robot type, episode count, size in megabytes, frame rate and processing status. This is where the dataset id comes from that every training tool asks for, and the episode count is what tells you whether a recording is long enough for the model the user has in mind. For one dataset in full, including a time limited download link, call get_dataset; to find out which models can actually read a dataset, call check_dataset_compatibility. The account is whichever one issued the API key, created at https://www.ay-robots.com/dashboard/client/settings.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":true},{"name":"get_dataset","title":"Dataset details","description":"Everything the account stores about one dataset, looked up by the id that list_datasets returns. Set include_download_url to true and the answer carries a link to the archive that expires after 15 minutes; that link only exists once the dataset has finished processing and has been archived. Use list_datasets when you do not have the id yet, and check_dataset_compatibility before you recommend a model for this dataset, because the format decides which trainer can read it. Needs an API key from https://www.ay-robots.com/dashboard/client/settings.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":true},{"name":"list_robots","title":"List your robots","description":"List the robot arms paired to the authenticated account with their id, name, type and current online status. Use it to check that the arm the user is talking about is actually reachable before walking them through recording or through running a policy back. This reads account state and does not touch hardware: no tool on this hosted server moves an arm, that is what the desktop client and its local \"ay-robots mcp\" server do, and https://www.ay-robots.com/live is a real SO-100 anyone can drive in the browser without an account. Needs an API key from https://www.ay-robots.com/dashboard/client/settings.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":true},{"name":"list_training_jobs","title":"List training jobs","description":"List the training runs of the authenticated account, newest first, optionally filtered by status. This answers \"is my training done yet\" in one call and it is where the job id for the other training tools comes from. get_training_job returns one run with its configuration, its metrics and the error message; get_training_logs reads the raw trainer output of that run; list_trained_policies shows the checkpoints that came out of the finished ones. Needs an API key from https://www.ay-robots.com/dashboard/client/settings.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":true},{"name":"get_training_job","title":"Training job status","description":"The full state of one training run: model, dataset, status, the configuration it was started with, the metrics recorded so far, start and finish time and the error message if it failed. Use this to follow a run that start_training returned, with the job id from that call or from list_training_jobs. When the answer sits in the trainer output rather than in the metrics, get_training_logs reads the log files of the same run, and stop_training ends a run that is still burning GPU hours. Needs an API key from https://www.ay-robots.com/dashboard/client/settings.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":true},{"name":"start_training","title":"Start a cloud training run","description":"Start a cloud training run on one of the account datasets. THIS SPENDS REAL MONEY: it rents a GPU by the hour on a spot market and bills the account, in the order of 1 to 3 USD for a run on the 24 GB tier (act, smolvla) and 4 to 12 USD on the 80 GB tier (pi0, groot1.5, groot1.7), scaling with the step count. Call estimate_training_cost first, tell the user the range, and only pass confirm_spend: true once they have agreed out loud; without it this tool returns the estimate instead of starting anything. check_dataset_compatibility beforehand avoids the expensive failure mode where a run dies minutes in because the trainer cannot read the dataset format, and get_training_job, get_training_logs and stop_training take it from there. Needs an API key from https://www.ay-robots.com/dashboard/client/settings.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"requiresAuth":true},{"name":"stop_training","title":"Stop a training run","description":"Stop a training run that is still queued or running: the rented GPU pod is destroyed and the run is recorded as CANCELLED. This is the tool for \"cancel it, the loss is flat\" and for a run that was started by mistake, because every further minute is billed to the account. It cannot be undone and it refunds nothing that was already used; checkpoints written before the stop stay in the bucket and still show up in list_trained_policies. Find the id with list_training_jobs filtered to RUNNING, and read get_training_job or get_training_logs first if you are not certain the run is lost. Needs an API key from https://www.ay-robots.com/dashboard/client/settings.","annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":true},"requiresAuth":true},{"name":"get_training_logs","title":"Training run logs","description":"Read what a training run actually printed. Called with just a job id it lists the log objects of that run with their size; called with file it returns the tail of one of them, usually train.log, which is where a crashed run says why it died. Use it when get_training_job reports FAILED without a useful message, or when a run looks stuck: the metrics carry numbers, the log carries the traceback. Job ids come from list_training_jobs or from the start_training answer, and an API key from https://www.ay-robots.com/dashboard/client/settings.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":true},{"name":"check_dataset_compatibility","title":"Check dataset compatibility","description":"Check, before any GPU is rented, which datasets of the account a given model can actually read. The dataset version is the trap: GR00T N1.7 and N1.5 load LeRobot v2.0 and v2.1 and reject a v3.0 dataset, while ACT, SmolVLA and Pi0.5 run through lerobot and need v3.0, so one recording can be perfect for one model and unusable for the other. The desktop client writes v2.0, which is why GR00T works on a fresh recording and the lerobot family may need a converted copy first. Call this before start_training: a mismatch otherwise kills the run minutes in, when the GPU is already rented and billing. Needs an API key from https://www.ay-robots.com/dashboard/client/settings.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":true},{"name":"list_trained_policies","title":"List trained policies","description":"List the trained policies of the account: the checkpoint directory, the name it carries, the model it came from, the dataset it was trained on, whether the checkpoint is complete enough to run and when it was last written. Use it after a run to confirm there is something to deploy and to get the checkpoint name for \"ay-robots run\" on the desktop client. list_training_jobs shows the runs themselves, including the ones that produced nothing, and get_training_job says why. Needs an API key from https://www.ay-robots.com/dashboard/client/settings.","annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false},"requiresAuth":true}],"toolCounts":{"total":36,"public":26,"requiresApiKey":10},"usage":"POST JSON-RPC 2.0 to this URL, for example {\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\"}, and send an API key as \"Authorization: Bearer ayr_live_...\" to unlock the account tools.","discovery":"https://www.ay-robots.com/.well-known/mcp.json","documentation":"https://www.ay-robots.com/mcp","apiKeys":"https://www.ay-robots.com/dashboard/client/settings"}