Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Changed the definition of "get_table_schema" and "query_table"
⟨25 unchanged words⟩ sampling, keyed querying and Parquet download areenabled.enabled, and, when the publisher declared text search, capabilities.search (spec_digest and keyword_columns for query_table's search). Example: {"table_id": "0f2f6bfa-4a63-4f75-9a0b-1a7d9c5b2e10"}. ⟨20 unchanged words⟩
⟨313 unchanged words⟩ for the whole table and cannot be ordered. TEXT SEARCH: when get_table_schema returns capabilities.search, add search: {"text": "...", "columns": its keyword_columns (or some of them), "spec_digest": its spec_digest} to match rows containing every term, beside any filters. execution.search_mode says how it ran and execution.search_scope what the count covers. A refusal saying search is unavailable means the table's version changed: call get_table_schema again. Requires an mr_use_ workspace key (Authorization: Bearer) ⟨22 unchanged words⟩ required. Returns rows plus table.version_id and table.content_digest; citethose.those, and timings: the milliseconds each server step took. For the whole table in one request, download the Parquet instead.
⟨217 unchanged words⟩ "maxItems":2,"type":"array"},"search":{"additionalProperties":false,"properties":{"columns":{"items":{"maxLength":128,"minLength":1,"pattern":"^[A-Za-z_][A-Za-z0-9_]*$","type":"string"},"maxItems":16,"type":"array"},"generation_digest":{"pattern":"^sha256:[0-9a-f]{64}$","type":"string"},"mode":{"enum":["lexical","hybrid"],"type":"string"},"spec_digest":{"pattern":"^sha256:[0-9a-f]{64}$","type":"string"},"text":{"maxLength":512,"minLength":1,"type":"string"}},"required":["text","columns","spec_digest"],"type":"object"},"table_id":{"format":"uuid","pattern": ⟨26 unchanged words⟩
Authorization not required, issuer https://mostlyright.md
Changed the definition of "list_source_credentials"
The NAMES ofListsthenamedAPIsecretkeysmetadata andpasswords thissaved workspacehas stored for its sources, with their statusconnectionsandwithoutwhensecrettheyvalues.were
Certificate changed, valid to 2027-01-05
Authorization not required, issuer https://mostlyright.md
Authorization not required, issuer https://mostlyright.md
Authorization not required, issuer https://mostlyright.md
Changed the definition of "create_dataset" and "update_dataset"
⟨66 unchanged words⟩ mechanism, a publisher or a station code. When this creates a dataset, the name given here is a working title: the first update_dataset that sends a changed, nonblank description replaces it with a generated one, unless that call sends the name too. Example: {"name": "Denver weather history ⟨125 unchanged words⟩
A changed nonblank descriptionautomaticallygenerates a factual dataset name and topictags.tags,Supplyexcept
Authorization not required, issuer https://mostlyright.md
Changed the definition of "create_dataset"
⟨137 unchanged words⟩ register_recipe with this dataset_id in its dataset block. If the user handed you a dataset id from its page, build into that id and do not call this. While a dataset the user just created for their request is still empty, this returns that dataset (reused_open_request: true) rather than creating a second one. Pass separate: true only when the user has asked for another, separate dataset.
⟨13 unchanged words⟩ 160,"minLength":1,"type":"string"},"separate":{"type":"boolean"}},"required":["name"],"type":"object"}
Authorization not required, issuer https://mostlyright.md
Authorization not required, issuer https://mostlyright.md
Authorization not required, issuer https://mostlyright.md
Changed the definition of "approve_full_run" and "start_run"
Releasea full run heldanbehindexistingitslegacy preview hold
ReleasesCompatibilitytheforfullanrunexisting
Authorization not required, issuer https://mostlyright.md
Changed the definition of "update_dataset"
A changed nonblank description automatically generates a factual dataset name and topic tags. Supply name only when deliberately overriding the generated title. Drafts and unchanged descriptions do not generate metadata. Changes a dataset's display name, its description, ⟨161 unchanged words⟩
Authorization not required, issuer https://mostlyright.md
Authorization not required, issuer https://mostlyright.md
Added "get_source_inspection", "normalize_reader_options" and "start_source_inspection" (35 tools before, 38 now)
Read source inspection status — Reads one source inspection by session_id and probe_id. Returns bounded evidence with status queued, complete, truncated or failed. A missing legacy endpoint is reported as capability unavailable and is not emulated.
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.
Start a bounded source inspection — Prepares an HTTPS source, opens a bounded research session and queues a source_inspect probe. Returns session_id, probe_id, source_id and limits; it does not write a recipe. If uncertain, preserve the coordinates and call get_source_inspection; this tool never retries preparation.
Authorization not required, issuer https://mostlyright.md
Added "approve_full_run"; changed the definition of "create_dataset", "propose_revision", "query_table" and 2 more (34 tools before, 35 now)
⟨38 unchanged words⟩ the page opens on it and fills in. The name leads with the subject a searcher would type and then the place, never with a grain word, a mechanism, a publisher or a station code. Example: {"name": "Denverhourlyweather history since 2020", "description": "HourlyDenverMETARweatherobservationshistoryforsinceKDEN.2020: every airport report from Denver International (KDEN) with the official daily high and low."}. Returns {dataset_id, cloud_dataset_id, name, ⟨40 unchanged words⟩
Changed the definition of "query_table"
Only numbers and dates differ: this server embeds live figures in the definition, so the text moves without the contract changing.
⟨38 unchanged words⟩ }], "limit": 50}. Ceilings:2064 columns, 8 filters, 2 sort keys, ⟨108 unchanged words⟩
Changed the definition of "query_run" and "start_run"
⟨133 unchanged words⟩ ) to read the same execution rather thanpaying forrunning a second. wait_seconds is capped at 20. The ⟨35 unchanged words⟩
Runs a registered recipe. THIS IS THE TOOL THATSPENDSDOESMONEY.THE REAL WORK: it reads the sources and can run for a long time. Four modes: sample (a bounded slice — ⟨103 unchanged words⟩
Changed the definition of "cancel_run", "confirm_run", "get_my_dataset" and 3 more
Stops a run that is queued, held at thespendconfirmation gate, or running. A run cancelled at the gatewasnevercharged.ran. Example: {"run_id": "…"}. ⟨24 unchanged words⟩
Authorize a heldrun's projected spendrun
Changed the definition of "update_dataset"
⟨64 unchanged words⟩ refused. Nothing rebuilds — this is metadata only. If public_projection_synced is false, retry with {dataset_id, sync_only: true} to update the public page without repeating the metadata write.
⟨38 unchanged words⟩ 160,"minLength":1,"type":"string"},"sync_only":{"const":true,"type":"boolean"}},"required":["dataset_id"],"type":"object"}
Certificate recorded, valid to 2026-11-16
Authorization not required, issuer https://mostlyright.md
First tool surface recorded: 34 tools (server version 2.0.0)
Showing the latest 28 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"connection_offset":{"maximum":500,"minimum":0,"type":"integer"},"dataset_id":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","type":"string"}},"type":"object"}
⟨5 unchanged words⟩ :false,"readOnlyHint":false,"title":"Releasea full run heldanbehindexistingitslegacy preview hold"}
⟨16 unchanged words⟩ sources and can run for a long time.FourStartmodesbuilds in full mode:samplefull(arunsboundedusesliceone—progressivealwaysacquisitionstartwithhere),an inspection checkpoint after about five minutes and continue automatically. The checkpoint is not an approval gate or a second run. Four modes: full (the wholethingbuild), sample (an explicitly requested bounded experiment), refresh (forward from where the last run reached ⟨8 unchanged words⟩ "recipe_digest": "…", "mode": "sample", "max_rowsfull": 5000}. A sample must state at least one ⟨66 unchanged words⟩
⟨144 unchanged words⟩ the replay settles; approving the held full runrequiresistheirtheirsinteractivetostep-up.do there, in a signed-in browser.
⟨10 unchanged words⟩ SQL: send columns, filters, order_by, aggregates, group_by and limit as JSON. Example: {"table_id": ⟨23 unchanged words⟩ filters, 2 sort keys, 4 aggregates, 4 group keys, 10000 rows a page (25 when limit is ⟨32 unchanged words⟩ the whole table on one immutable version. Operators, all ANDed: eq, neq, in (an array of at most 20 values), gt, gte, lt, lte, is_null and is_not_null (no value),is_not_null.between (exactly two non-null bounds, inclusive at both ends), and contains, starts_with and ends_with (one non-empty string, case-sensitive, text columns only). Dates and timestamps compare as ISO strings, so a month is one between or a gte plus an lt. GROUPED AGGREGATES: send group_by beside aggregates for one row per distinct combination, keyed by the group column names and the aggregate aliases. Example: {"table_id": "0f2f...", "columns": ["station"], "group_by": ["station"], "aggregates": [{"function": "avg", "column": "air_temp_f", "as": "avg_temp"}], "order_by": [{"column": "avg_temp", "direction": "desc"}], "limit": 10}. An aggregate answers under its `as`, or under {function}_{column or "all"}_{position} without one. group_by needs at least one aggregate, no two result columns may share a name and names are compared without case (group_by ["city"] refuses an alias of "CITY", and two aggregates cannot share one alias), and order_by may only name a group column or an alias. limit counts GROUPS, execution.truncated means the limit was reached so there may be more groups, and a grouped answer has no next page: next_cursor is null and offset and cursor stay refused beside aggregates. Without group_by an aggregate query returns one row for the whole table and cannot be ordered. Requires an mr_use_ workspace key (Authorization: Bearer ⟨42 unchanged words⟩
⟨104 unchanged words⟩ ,"lt","lte","is_null","is_not_null","between","contains","starts_with","ends_with"],"type":"string"},"value":{ ⟨33 unchanged words⟩ ],"type":"object"},"maxItems":8,"type":"array"},"group_by":{"default":[],"items":{"maxLength":128,"minLength":1,"pattern":"^[A-Za-z_][A-Za-z0-9_]*$","type":"string"},"maxItems":4,"type":"array"},"limit":{" ⟨78 unchanged words⟩
⟨52 unchanged words⟩ Follow the run's dashboard_url to inspect its comparison;anya person approves the repairapprovalfromrequiresthatthepagehumaninstep-upaflow.signed-in browser. approve_full_run releases a PREVIEW hold and not a repair one.
⟨24 unchanged words⟩ elsewhere in between is refused rather than overwritten. The opening paragraph is the search snippet and the answer-engine summary, so it says what this is, then what it is for, then the facts, and never opens with the grain, the mechanism or a station code. Example: {"dataset_id": "…", "description": "HourlyDenverMETARweatherobservationshistoryforsince 2020: every airport report from Denver International (KDEN) with the official daily high and low. Built for daily temperature forecasting and for checking the weather at any hour. One row per report,2019aboutto30now.a day, refreshed each morning with the previous day added."}. Returns {dataset_id, name, description, ⟨42 unchanged words⟩
Release a full run held behind its preview — Releases the full run the platform paired with a bounded preview, from awaiting_sample_approval. Call it ONLY once the preview has sealed a table you have checked and the user has said to build the whole thing, or on a delegation you recorded with write_note. Example: {"run_id": "…", "expected_version": 4}. Pass expected_version from the get_run that showed you the preview, so a run that moved in between is refused rather than released. Any editor of the workspace may settle a preview hold, so you can. A REPAIR hold is different: a full run held behind a replay comparison is released by a per…
Authorizesthe spenda held runwas projected at,and starts it. The numbers are the ones ⟨14 unchanged words⟩ : what is authorized is the server's ownquote.projection. Example: {"run_id": "…", " ⟨35 unchanged words⟩ call this after a person has seen theprojected costprojection and agreed to it.
⟨6 unchanged words⟩ readOnlyHint":false,"title":"Authorize a heldrun's projected spendrun"}
⟨23 unchanged words⟩ , and any run held waiting for aspendconfirmation. Example: {"dataset_id": "…"}. ⟨41 unchanged words⟩
⟨58 unchanged words⟩ promotion also starts a catch-up refresh; when thatrefresh'srefreshprojectedisspendlargercrossesthan theworkspacesizethresholdthat starts on its own the table is STILL PROMOTED and the answer ⟨27 unchanged words⟩
⟨69 unchanged words⟩ , repair_review_url}. A replay that needs acostconfirmation comes back with status held and its projection instead of repair_review_url — show the projectedcostsize and runtime to the user and call confirm_run with replay_run_id; ⟨53 unchanged words⟩
⟨72 unchanged words⟩ , mode, version, dashboard_url}. A runwhoselargerprojectedthanspendthecrossessizethethatworkspacestartsthresholdon its own comes back status "held" with projected_bytes,projected_runtime_secondsandprojected_costprojected_runtime_seconds — show those to the user and call ⟨18 unchanged words⟩