All servers · Datasets & public data
Mostly Right
md.mostlyright/datasets · v2.0.0
Has write/delete toolsTools changed (7 days)
Measured by MCP Station
| Last check | Reachable |
|---|---|
| Checked at | — |
| Check success 7 / 30 days | — |
| First-try success 30 days | — |
| Median response | — |
| Lookups 30 days | — |
| Authentication | No auth |
| MCP version | 2025-06-18 |
| Rank score | — |
| Declared risk | Has destructive tools (destructiveHint) |
| Capabilities declared | prompts, resources, tools |
| Tool definitions | 80 tools · with description 100% · input schema is an object 100% · read/destructive hints 100% |
Description written by the publisher, not verified
Search, sample and query open reproducible datasets published as immutable Parquet with schemas.
Connect
streamable-http · https://mostlyright.md/api/mcp
claude mcp add --transport http datasets https://mostlyright.md/api/mcp{
"mcpServers": {
"datasets": {
"url": "https://mostlyright.md/api/mcp"
}
}
}Tools as reported by the server
search_datasetsFull-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 publisheget_datasetOne 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 tolist_tablesThe 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 coluget_table_schemaOne 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.ssample_rowsThe 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 moget_download_instructionsThe 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 neeget_access_instructionsWhat 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, whichsearchSearch 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 datfetchThe 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, tiquery_tableA 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_tableRanked 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 1982catalog_searchSearch 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 indexlist_connected_datasetsThe 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_dconnect_datasetConnects 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 tcreate_datasetCreates 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 plupdate_datasetA 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 stagenerate_coverGenerates 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 alreadyset_dataset_visibilitywrite/deleteChanges 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 Adarchive_datasetwrite/deleteRetires 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 serviclist_my_datasetsEvery 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_uget_my_datasetOne 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, orlist_dataset_eventsThe 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_recipesLists 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 foget_recipeReads 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 varegister_recipeRegisters 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 whoexplain_recipeChecks 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_recipeSays 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_ditest_recipeStarts 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 papropose_revisionRegisters 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 andreplay_runRuns 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 doestart_runRuns 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 approconfirm_runAuthorizes 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 projecapprove_full_runCompatibility 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 sacancel_runStops 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_runOne 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. Provrun_eventsOpens 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 {evenlist_runsThe 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 mcompare_runsReads 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 orquery_runRuns 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_tableReads 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 nlist_column_valuesThe 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 predicatpreview_table_searchRuns 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 drafrun_artifactsThe 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 stget_artifact_downloadMints 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 thiswrite_noteAppends 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 201list_notesLists 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, andlist_table_partsLists 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 wverify_runChecks 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 itpromote_tablePromotion 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 querreschedule_tableSets 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 recipdemote_tablewrite/deleteWithdraws 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_vrefresh_tableRuns 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 isresync_tableRereads 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_idarchive_tablewrite/deleteRetires 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_tableChanges 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 itsget_tableOne 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, scheddiagnose_tableReads 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_rlist_source_credentialsLists 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 sourclist_modelsLists 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). Retursuggest_enrichmentsReads 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 machnormalize_reader_optionsResolves 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 witstart_source_inspectionPrepares 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 alreadget_source_inspectionReads 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 wiprobe_sourceQueues 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 (upget_source_probeReads 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 succeedeget_run_attemptsReads 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 enget_recipe_readinessReads 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; continspect_table_searchInspects 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. Returnconfigure_table_searchSaves 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. Rbuild_table_searchStarts 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. Nexactivate_table_searchChanges 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_jobReads 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 befget_search_evaluationReports 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_cadd_search_casesDeclares 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_secancel_search_jobRequests 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 thregister_stream_documentRegisters 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 acreate_stream_registryRegisters 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 thstart_streamStarts 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_streamReads 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_scontrol_stream_subscriptionwrite/deleteRequests 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
Tool changes
- 2026-10-24: search_datasets, get_dataset, list_tables, get_table_schema, sample_rows, get_download_instructions, get_access_instructions, search, fetch, query_table, search_table, catalog_search
- 2026-10-23: search_datasets, get_dataset, list_tables, get_table_schema, sample_rows, get_download_instructions, get_access_instructions, search, fetch, query_table, search_table, catalog_search
- 2026-10-22: search_datasets, get_dataset, list_tables, get_table_schema, sample_rows, get_download_instructions, get_access_instructions, search, fetch, query_table, catalog_search, list_connected_datasets
- 2026-10-21: search_datasets, get_dataset, list_tables, get_table_schema, sample_rows, get_download_instructions, get_access_instructions, search, fetch, query_table, catalog_search, list_connected_datasets
- 2026-10-19: search_datasets, get_dataset, list_tables, get_table_schema, sample_rows, get_download_instructions, get_access_instructions, search, fetch, query_table, catalog_search, list_connected_datasets
- 2026-10-17: search_datasets, get_dataset, list_tables, get_table_schema, sample_rows, get_download_instructions, get_access_instructions, search, fetch, query_table, catalog_search, list_connected_datasets
- 2026-10-16: search_datasets, get_dataset, list_tables, get_table_schema, sample_rows, get_download_instructions, get_access_instructions, search, fetch, query_table, catalog_search, list_connected_datasets
Website · JSON · Text for agents · Registry updated 2026-09-10