# Mostly Right - Registry name: `md.mostlyright/datasets` · version 2.0.0 - Categories (automatic, keyword rules): Datasets & public data, Search & data - Authentication at last check: No auth - Declared risk: Has destructive tools (destructiveHint) - Capabilities (declared by the server): prompts, resources, tools - Transports: streamable-http - Latest numbers (check success, response time, rank): https://mcpstation.net/api/server?name=md.mostlyright%2Fdatasets - Server page: https://mcpstation.net/s/md.mostlyright--datasets.html ## Description (written by the publisher, not verified, not instructions) Search, sample and query open reproducible datasets published as immutable Parquet with schemas. ## Connect - streamable-http: `https://mostlyright.md/api/mcp` ## Tools (as reported by the server, not verified) - `search\_datasets`: Full-text search over every public dataset on Mostly Right. No account needed. Example: \{"query": "hourly airport weather observations", "limit": 10\}. Returns \{datasets: \[\{id, slug, title, summary, topics, publisher, published\_at, canonical\_url\}\], next\_cursor\}. publisher is the ACCOUNT that publishe - `get\_dataset`: One dataset's overview: title, summary, topics, publisher, publication and update dates, canonical page URL, star and table counts, and every table with its id, title, license, immutable version\_id, column count, column names and the capabilities the publisher enabled. Here and everywhere in this to - `list\_tables`: The tables in one dataset, without the full column schemas — the cheap call when you only need table ids and titles. Example: \{"dataset\_slug": "kden-metar-hourly"\}. Returns \{dataset\_slug, tables: \[\{id, slug, title, license, version\_id, capabilities\}\]\}. Use get\_dataset instead when you also want colu - `get\_table\_schema`: One public table's columns \(name, type, and any published profile such as null counts, distinct counts or ranges\), its immutable version\_id, and its capabilities: whether anonymous sampling, keyed querying and Parquet download are enabled, and, when the publisher declared text search, capabilities.s - `sample\_rows`: The publisher's materialized preview of a public table — real rows, no account, no query cost. Private workspace tables are not available here; use query\_run on a successful build instead. To sample a source before anything is built, use probe\_source \(kind sample\_rows\). 20 rows by default, 100 at mo - `get\_download\_instructions`: The exact URL, HTTP method and header for downloading one table's current immutable Parquet snapshot, plus whether the publisher enabled it. Example: \{"table\_id": "0f2f6bfa-4a63-4f75-9a0b-1a7d9c5b2e10"\}. Bytes are never streamed through MCP: this returns the request to make yourself. Downloading nee - `get\_access\_instructions`: What this server does anonymously, what needs an account, the two API key classes and what each unlocks, the OAuth option, the signup URL, and the numbered steps from 'no account' to 'querying rows'. Optionally pass \{"dataset\_slug": "kden-metar-hourly"\} to get the link to that dataset's page, which - `search`: Search every public dataset on Mostly Right and return up to 20 matches as \{results: \[\{id, title, url\}\]\}, where \`id\` is the dataset slug and \`url\` its canonical page. No account needed. Example: \{"query": "hourly airport weather observations"\}. Pass a result's \`id\` straight to fetch for the full dat - `fetch`: The full public document for one dataset as Markdown: summary, facts, access instructions, and every table with its columns, types, descriptions and units. No account needed. Example: \{"id": "kden-metar-hourly"\} — the \`id\` is a slug from search, and a canonical dataset URL works too. Returns \{id, ti - `query\_table`: A bounded, structured query over one table's current version. NO SQL: send columns, filters, order\_by, aggregates, group\_by and limit as JSON. Example: \{"table\_id": "0f2f...", "columns": \["observed\_at", "air\_temp\_f"\], "filters": \[\{"column": "air\_temp\_f", "operator": "gte", "value": 80\}\], "order\_by": - `search\_table`: Ranked search over one public table's rows, the same search its dataset page runs: words, prefixes, typos and spelling correction, served from the table's search package. NOT a catalogue search \(search\_datasets finds datasets\) and not SQL. Example: \{"table\_id": "0f2f...", "query": "blade runner 1982 - `catalog\_search`: Search a sealed snapshot of public data sources for feeds that might answer a question — the first move when you need a source and do not already know one. Example: \{"question": "county unemployment rate monthly", "limit": 10, "format": "csv"\}. READ THIS BEFORE YOU TRUST A RESULT. The snapshot index - `list\_connected\_datasets`: The public datasets the authenticated workspace has used so far. Takes no arguments. query\_table is not limited to this list: a key reads any public dataset \(connecting it on first use\) and the workspace's own tables; an OAuth connection reads any public dataset it has datasets:use for, or connect\_d - `connect\_dataset`: Connects one public dataset to the authenticated workspace so its tables become queryable and downloadable. This is the gate every keyed read passes. Example: \{"dataset\_slug": "kden-metar-hourly"\}. Idempotent: connecting an already-connected dataset succeeds and reports already\_connected. Requires t - `create\_dataset`: Creates an empty dataset in your workspace and returns its ids. A dataset is the container a recipe binds to; it exists before it has a description, a recipe or a single row, which is the point — the page opens on it and fills in. The name leads with the subject a searcher would type and then the pl - `update\_dataset`: A changed nonblank description generates a factual dataset name and topic tags, except a name or tags someone chose in an earlier update, which stay. The name given at create\_dataset is a working title and does not count as chosen. Send name with the description to keep a title you want; it then sta - `generate\_cover`: Generates the dataset's branded 1200×630 cover and attaches it: the page, the Community tile and the share card all wear it. Every dataset gets exactly one, generated once its description is written. Call it only for a dataset that has no cover \(get\_my\_dataset says has\_cover\). A dataset that already - `set\_dataset\_visibility`: Changes who can read a dataset: private \(this workspace only\), link \(anyone holding an unlisted address, which this returns\) or public \(listed on Mostly Right for anyone\). The same change as Share on the dataset's page and \`mr-data dataset publish\`, with the same checks and audit record. Owner or Ad - `archive\_dataset`: Retires a whole dataset: every reader loses access, its public page and unlisted link are withdrawn, and its name is free for a new dataset. Nothing it built is deleted, but ONLY Mostly Right support can restore it. The same act as the settings page's delete and \`mr-data dataset archive\`; the servic - `list\_my\_datasets`: Every dataset this workspace owns, most recently updated first — not the public catalog. Use it to find the dataset\_id for a dataset you or a colleague created earlier. Example: \{"limit": 25\}. Returns \{workspace\_id, datasets: \[\{dataset\_id, cloud\_dataset\_id, name, description, updated\_at, dashboard\_u - `get\_my\_dataset`: One workspace dataset in build terms: name, description, status, each table with its build state, promotion state and live version, the latest run, and any run held waiting for a confirmation. Example: \{"dataset\_id": "…"\}. Returns \{dataset\_id, name, description, category\_id \(its primary category, or - `list\_dataset\_events`: The dataset's own durable log, newest first: created, renamed or re-described, a recipe registered, each run queued, held, started, progressing and finished, a cover attached, a table's state changing, a table renamed or archived, a stream's state moving, a note written and each activity line. list\_ - `list\_recipes`: Lists immutable recipe coordinates in this workspace, optionally for one table\_id from get\_my\_dataset. current\_only defaults to true; false includes older revisions. Returns \{recipes: \[\{recipe\_id, recipe\_digest, dataset\_id, table\_id, is\_current\}\], next\_cursor\}. Follow next\_cursor until null, even fo - `get\_recipe`: Reads the actual immutable registered recipe, including sources, SQL and checks. Use list\_recipes for current table revisions, or recipe\_id from get\_run for the exact executed revision. Returns \{recipe\_id, recipe\_digest, dataset\_id, table\_id, pointer, value, complete: true\} when the selected JSON va - `register\_recipe`: Registers the JSON recipe that says where the data comes from, how it is shaped and what must be true of it. The server canonicalizes the document and computes its digest — you cannot and must not state one. Identical bytes register once: a repeat returns the same ids. Example: \{"recipe": \{ …the who - `explain\_recipe`: Checks a recipe document without registering, writing or running anything — the same evaluator that admits refreshes, plus the fast-path features the harness's \`recipe explain\` reports. Example: \{"recipe": \{ …the whole recipe document… \}\}. Returns \{refresh\_ready, first\_blocker, action\_plan, rebuild, - `forecast\_recipe`: Says what one full or refresh run of a registered recipe would ask of its sources, before anything is started: per-source request ceilings, runtime at the ceiling, platform spend, and the projected bytes and cost. Warnings name what would slow or block the run. Example: \{"recipe\_id": "…", "recipe\_di - `test\_recipe`: Starts a recipe preflight: a bounded rehearsal of a full run that fetches at most max\_pages\_per\_source pages of each listing \(default 1, max 5\) and max\_upstream\_rows rows of each per-row source \(default 25\), runs the transform and the checks a slice can answer, and reports. Sources that present a pa - `propose\_revision`: Registers a proposed revision and returns its immutable recipe coordinates plus a review link. It then starts EXACTLY ONE run: a replay of the named successful run's retained inputs, which reads no upstream source and never becomes live. Nothing else runs — it confirms no run, promotes no table and - `replay\_run`: Runs a registered recipe revision against the retained raw inputs of a named successful run of the same table. No upstream acquisition is performed. Replay must be enabled and the inputs must still be retained. Returns \{run\_id, status, mode, version, dashboard\_url\}. Replay never becomes live and doe - `start\_run`: Runs a registered recipe. THIS IS THE TOOL THAT DOES THE REAL WORK: it reads the sources and can run for a long time. Start builds in full mode: full runs use one progressive acquisition with an inspection checkpoint after about five minutes and continue automatically. The checkpoint is not an appro - `confirm\_run`: Authorizes a held run and starts it. The numbers are the ones already stored on the run — you cannot restate them, which is the point: what is authorized is the server's own projection. Example: \{"run\_id": "…", "expected\_version": 3\}. Pass expected\_version from the get\_run that showed you the projec - `approve\_full\_run`: Compatibility for an existing legacy full run paired with a bounded preview, in awaiting\_sample\_approval. New full builds use progressive acquisition and never need this tool for their inspection checkpoint. Call it ONLY once the legacy preview has sealed a table you have checked and the user has sa - `cancel\_run`: Stops a run that is queued, held at the confirmation gate, or running. A run cancelled at the gate never ran. Example: \{"run\_id": "…"\}. Returns the run receipt with status cancelled. A run that already finished cannot be cancelled and says so — read get\_run rather than retrying. - `get\_run`: One run's current state: status, mode, the clamps it ran under, rows delivered and whether a clamp truncated them, how many pages a many-page source reached, the table and table version it sealed, the failure code and stage when it failed, and the version number a confirm or cancel should send. Prov - `run\_events`: Opens the run's event stream, collects up to max\_events, and returns as soon as the run reaches a terminal event or wait\_seconds elapses — whichever comes first. This is how you watch a build without polling. Example: \{"run\_id": "…", "from\_seq": 0, "max\_events": 50, "wait\_seconds": 5\}. Returns \{even - `list\_runs`: The workspace's own runs, newest first, optionally narrowed to one dataset, one status or one mode. Example: \{"dataset\_id": "…", "status": "failed", "limit": 20\}. Returns \{runs: \[\{run\_id, status, mode, dataset\_id, table\_id, created\_at, completed\_at, failure\_code\}\], count, complete\}. complete false m - `compare\_runs`: Reads two runs and says what changed between them: status, mode, rows, bytes, truncated, covered\_window, table\_version\_id, outcome, failure code and stage, created and completed times, and each declared check whose result moved. Use it to tell whether a revision or a refresh delivered more, less or - `query\_run`: Runs one read-only SQL statement over the parquet a run sealed, available as the relation run\_table \(not the recipe table name\), and waits for the answer. THIS IS HOW YOU CHECK THE DATA IS RIGHT after a successful run: count the rows, look at the range, find the nulls. Example: "run\_id": "…", "sql": - `sample\_table`: Reads up to limit rows \(default $DEFAULT\_SEARCH\_READ\_ROWS, at most $MAX\_SEARCH\_SAMPLE\_ROWS\) of one sealed table version, projected to columns \(default: every declared column, up to 64\). Use it before writing a search spec or a plan, to see real values; it needs no SQL and no run id. Its rows carry n - `list\_column\_values`: The most frequent non-null values of one declared column of a sealed table version, each with the number of rows holding it, most frequent first. prefix keeps the values whose text starts with it, ignoring case. Use it to choose filterable columns, check a value dictionary or write a plan's predicat - `preview\_table\_search`: Runs one query \(words, planned under the revision's spec as explain plans them\) or one explicit table-search-plan.v2 plan as a SCAN of the sealed version: the plan's predicates and order as filters, its text as a case-insensitive substring match over the keyword columns, unranked. It works on a draf - `run\_artifacts`: The files a run sealed: the parquet, the column profile, the receipt, the preview. Works on a running, succeeded or failed run — a failed run's partial output is listed too. Example: \{"run\_id": "…"\}. Returns \{artifacts: \[\{artifact\_id, kind, size\_bytes, digest, media\_type\}\], more\}. Bytes are never st - `get\_artifact\_download`: Mints a short-lived signed URL for one sealed artifact. Fetch it yourself with a plain GET and no headers; it expires. Example: \{"run\_id": "…", "artifact\_id": "…"\}. Returns \{url, expires\_at, media\_type, digest, size\_bytes, kind\}. Cite the digest. Artifact ids come from run\_artifacts. Do not use this - `write\_note`: Appends one cell to a run's or a dataset's decision record — why a source was chosen, what a check found, what you changed and why. The record is append-only and is what a reader sees beside the data. Write one for every decision worth explaining. Example: \{"run\_id": "…", "heading": "Dropped the 201 - `list\_notes`: Lists the cells of a run's or a dataset's decision record, newest first: the heading, the body, the phase, any typed blocks \(source, decision, clarification\) and whether a later revision superseded it. Read it before writing a note, so a decision already recorded is revised rather than repeated, and - `list\_table\_parts`: Lists the parts \(parquet files\) one table version is made of: each part's index, part\_id \(its content digest\), artifact\_id, the run that sealed it, its row count, its size, its partition, and the lowest and highest value it holds per field \(lower\_bounds, upper\_bounds, keyed by field name\). This is w - `verify\_run`: Checks the table one succeeded run sealed against its own manifest. Without deep it reads the manifest, checks it hashes to the digest it was sealed with and names this run's table version, and checks every part the run sealed is among the parts the run lists; no part is fetched. With deep: true it - `promote\_table`: Promotion makes the table's newest passing version the version everyone reads, and starts the recurring refresh that keeps it current. Example: \{"table\_id": "…", "confirm": true\}. It refuses without confirm: true. Only call it when the person you are working for has said to. Check the data with quer - `reschedule\_table`: Sets a live table's refresh schedule, or replaces the one it has, without starting a run or fetching anything. A table that went live on its first run has NO schedule yet \(get\_table shows schedule null, the chat shows "No refresh schedule"\): this is the tool that gives it one. When the table's recip - `demote\_table`: Withdraws a table's live pointer and detaches its refresh schedule: readers stop being served it and it stops refreshing. Nothing built is deleted, and promote\_table later revives the same table. A live table must be demoted before archive\_table will retire it. Example: \{"table\_id": "…", "expected\_v - `refresh\_table`: Runs the refresh the table's schedule would run, now: forward from where its last successful run reached, under its own recipe and the ordinary size and spend gates. It never rereads every source; a table whose recipe cannot refresh incrementally answers incremental\_unavailable, and resync\_table is - `resync\_table`: Rereads every source of a live table as one progressive full run of its current recipe, the deliberate escape hatch when a source cannot advance incrementally \(refresh\_table answered incremental\_unavailable, or the person asked to rebuild from the sources\). It costs a full build. Example: \{"table\_id - `archive\_table`: Retires one table from its dataset: it leaves the dataset's table list and frees its name for a new table. The versions it built are not deleted. The service confirms the archive with the table's current stored name itself, so you never send one. Example: \{"table\_id": "…"\}. A live table is refused — - `rename\_table`: Changes one table's name within its dataset. Nothing is rebuilt, re-served or republished, and the table keeps its id, versions and schedule; every reader of the dataset sees the new name. The old name is released, so another table may take it, and a later recipe revision must name the table by its - `get\_table`: One table as the builder sees it: whether it is promoted, which version is live, the refresh schedule and what the platform has learned about its rhythm, when it last refreshed and why it last failed. Example: \{"table\_id": "…"\}. Returns \{table\_id, dataset\_id, promotion\_status, live\_version\_id, sched - `diagnose\_table`: Reads one table's current promotion pointers and latest recorded failure. When that failure names a run, it also reads that run and its declared recipe sources, so the diagnosis still works when a failed run never sealed a version. Example: \{"table\_id": "…"\}. Returns \{table, latest\_failure, failed\_r - `list\_source\_credentials`: Lists named secret metadata and saved workspace connections without secret values. Pass dataset\_id to check dataset grants. Follow connections.next\_offset with connection\_offset to read another bounded page. Returns credentials, connections \(status, safe items, grants\_status\), and a structured sourc - `list\_models`: Lists the small models this deployment serves to recipes, by task: classify \(label each row of a text column with yes/no or choice questions\), extract \(pull named, verbatim-grounded fields out of page or document text\) and match \(link the same entity across tables; planned until it is served\). Retur - `suggest\_enrichments`: Reads the run's columns, then a bounded sample of its text columns \(up to max\_rows rows, default 50, each value cut to its first few thousand characters; metered like query\_run, the column read is not charged\) and names, column by column, a deterministic derivation \(cast text to its type, parse mach - `normalize\_reader\_options`: Resolves the certified Reader family and version and returns default-filled canonical decode options. Validates options only; it does not acquire or decode bytes. Returns family\_id, family\_version, decode\_options and decode\_options\_json for the recipe. Also returns reader\_capabilities: available wit - `start\_source\_inspection`: Prepares an HTTPS source, opens a bounded research session and queues a source\_inspect probe. Supply rights\_claim.claim\_note with the actual rights evidence or operator assertion; the service hashes its trimmed UTF-8 bytes and returns rights\_claim with the real digest. Alternatively supply an alread - `get\_source\_inspection`: Reads one source inspection by session\_id and probe\_id, waiting up to wait\_seconds \(default $MAX\_WAIT\_SECONDS\) for a queued inspection to settle. Returns bounded evidence with status queued, complete, truncated or failed. A worker can take a few minutes to start, so while it is queued, call again wi - `probe\_source`: Queues one bounded probe of a source start\_source\_inspection prepared, and returns its coordinates. It reads the SOURCE, before anything is built; the sample\_rows tool reads a published table instead. Four kinds: source\_inspect \(the columns and their inferred types; no cell values\), sample\_rows \(up - `get\_source\_probe`: Reads one probe\_source probe, waiting up to wait\_seconds \(default 20\) for a queued probe to settle. Returns session\_id, probe\_id, probe\_kind, state, source\_id, failure\_code, untrusted\_provider\_content. state is queued or claimed while it runs, then succeeded, failed, expired or cancelled. A succeede - `get\_run\_attempts`: Reads the durable attempt ledger for run\_id: each attempt's end, inferred loss cause and current source acquisition counts, including source pages and whether counting began at the first tick. Returns progress for the latest attempt plus the ledger. Progress is attempt-scoped, not coverage of the en - `get\_recipe\_readiness`: Reads the full workspace recipe-readiness inventory, including per-source classification, next actions, predecessor/materialization/differential readiness and blockers. Defaults to all revisions, as the CLI does; current\_only and table\_id narrow it. recipe\_id filters each upstream page locally; cont - `inspect\_table\_search`: Inspects search over a table's own rows, not web search. operation is status, inspect, propose, validate, explain or estimate. Supply table\_id and optional exact table\_version\_id/search\_revision\_id, or a draft recipe for declared-only inspection \(never status\). explain of a table needs query. Return - `configure\_table\_search`: Saves a draft search configuration for one immutable table\_version\_id. expected\_revision is the selected draft id reported by inspect\_table\_search, or null when none; a stale head is refused. spec omitted uses the sealed recipe's spec. semantic\_evaluation contains actual resolved evaluation cases. R - `build\_table\_search`: Starts search preparation for one exact sealed table\_version\_id and optional search\_revision\_id. It may use embedding providers and workspace resources; the browser asks the person to approve it. Returns job\_id and status. Queued/running is not ready and successful preparation is not activation. Nex - `activate\_table\_search`: Changes serving search for an exact table version to a qualified generation. action is activate or rollback. expected\_active\_revision\_id and expected\_active\_generation\_id are the observed active coordinates, each null only when absent; stale observations are refused. Returns the activation receipt. - `get\_search\_job`: Reads one search preparation job by job\_id. Returns its status, coordinates, progress and failure evidence. It does not restart work or activate a generation. queued, dispatched, running and deferred are incomplete; a failed or cancelled job is not ready. Next: inspect\_table\_search after success bef - `get\_search\_evaluation`: Reports the measurement of one revision's evaluation cases on one sealed version: status no\_cases, not\_required \(no semantic columns, so no measurement is needed to activate\), cases\_not\_measured \(these cases differ from the ones the built revision carries\), not\_built, building, build\_failed, build\_c - `add\_search\_cases`: Declares a new draft revision that carries the base revision's spec and its evaluation cases with cases added: the base is search\_revision\_id, or the version's selected draft when omitted, and must still be the selected draft \(a stale one is refused SEARCH\_REVISION\_CONFLICT; re-read inspect\_table\_se - `cancel\_search\_job`: Requests cancellation of the exact job\_id, which may belong to a teammate. The browser asks the person to approve it. Returns the job's observed state; a request is not proof that all workers have stopped. Next: get\_search\_job until it reports a terminal state. Do not start replacement work while th - `register\_stream\_document`: Registers an inline connector or rotating-series document under document\_name \(a .json name\). Send the canonical document object, never credential values; a named secret is enrolled in workspace settings. Returns stream\_connector\_document\_id and server-derived document\_digest; use that bare digest a - `create\_stream\_registry`: Registers a content-addressed set of admitted document\_digests \(bare SHA-256\). A rotating series registry includes both its series and connector digests. Returns stream\_connector\_registry\_id. Identical sets converge; starts no recorder and changes no existing subscription. Next: start\_stream with th - `start\_stream`: Starts kind probe \(bounded observation, no sealed capture\), capture \(bounded retained evidence; until states stop conditions\), or subscription \(durable recording\). Supply admitted connector\_document\_digest, registry\_id and exact members; a subscription can instead name series\_id, never both. secret\_ - `get\_stream`: Reads kind document, probe, capture, subscription or bounded subscription quiescence by id. kind recordings instead takes connector\_document\_digest and optional exact members. Returns the stored resource, or binding/retention evidence. Quiescence returns version from ETag for fenced control\_stream\_s - `control\_stream\_subscription`: Requests pause, resume or stop of one subscription using the bounded quiescence CAS API. First get\_stream kind quiescence and use its version as expected\_version; the browser reads and binds this version during approval. There is no fallback to the legacy unfenced actions. Returns the new bounded st Measured by MCP Station. Methods: https://mcpstation.net/methods.html · Terms: https://mcpstation.net/terms.html