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.
Authorization not required, issuer https://mcp.brainkb.org/
Authorization not required, issuer https://mcp.brainkb.org/
Authorization not required, issuer https://mcp.brainkb.org/
Changed the definition of "brainkb_qa_run", "brainkb_sparql" and "brainkb_update_space"
⟨29 unchanged words⟩ as brainkb_sparql, so it needs the same role. Results page the same way: a query without its own LIMIT returns `limit` rows from `offset`, and `page.next_offset` says where to continue.
{"properties":{"limit":{"default":0,"title":"Limit","type":"integer"},"offset":{"default":0,"title":"Offset","type":"integer"},"params":{"anyOf":[{"additionalProperties":true, ⟨20 unchanged words⟩
⟨20 unchanged words⟩ the provenance/delta tools, which need no admin role. Large results come back a page at a time. A SELECT without its own LIMIT/OFFSET returns at most `limit` rows (0 = the server's page size, 500 by default) starting at `offset`; the response's `page` says whether there is more (`has_more`) and where to continue (`next_offset`). Add ORDER BY for stable pages. A query that sets its own LIMIT runs as written. Any result too big for one response is cut to its leading rows with a `truncated` note. Prefer COUNT(*) first when you only need to know how much there is.
Added "brainkb_update_space" (71 tools before, 72 now)
Rename a space (its display name) and/or change its description. Owner/manager only. The slug can't change: it is the space's IRI, and links, graph bindings and provenance point at it. Pass only what changes; description="" clears it. Confirm the new name with the user before calling.
Changed the definition of "brainkb_delete_space", "brainkb_synthscholar_evidence", "brainkb_synthscholar_get_review" and 5 more
⟨38 unchanged words⟩ deletes the space with its members, access rules, search entries andsearchSynthScholar reviews (with their kept files). EVERY SUBSPACE below it,entries.atTheanydeletiondepth,itselfis deleted the same way, deepest first (`subspaces_deleted`). Each deletion is kept in the provenance graph (who, when, whichgraphs:
Added "brainkb_synthscholar_evidence", "brainkb_synthscholar_find_study", "brainkb_synthscholar_get_review" and 6 more; changed the definition of "brainkb_set_space_visibility" (62 tools before, 71 now)
⟨9 unchanged words⟩ ) or 'private' (members only). Owner only. Everything in a public space is public: making a space public also makes all its subspaces public, and a subspace of a public space cannot be made private (409). Under a private space each subspace can be public or private on its own.
Evidence spans of an ingested review: the quoted text its claims rest on, with the study, section, relevance, and whether the quote was matched verbatim in the source (`grounded`). Filter by text, claim type, PMID or grounding.
Which ingested reviews (that you can read) include or screened a study — by DOI, PMID or part of its title (6+ characters) — and what happened to it in each: included (read in full or from the abstract) or each screening decision with its reason.
Added "brainkb_delete_space", "brainkb_get_space", "brainkb_list_reserved_graphs" and 4 more; changed the definition of "brainkb_create_space" and "brainkb_list_spaces" (55 tools before, 62 now)
Create aworkspace/space.workspace/space, or a subspace inside one. The caller becomes owner. slug: lowercase/hyphen id, ⟨6 unchanged words⟩ taken the call returns 409 (pick anotherslug; slugs are never reused/deletedslug). visibility: 'private' or'public';'public' (set per space: a private space may hold a public subspace); description: short human description (recommended — surfaces ⟨19 unchanged words⟩ only Admin/SuperAdmin, or a user granted create_team_space). parent_slug: create it as a **subspace** of that space (any depth). Needs the right to manage the parent; the subspace takes the parent's space_type, and everyone with a role in the parent (or above) gets the same role in it. A subspace can't be moved to another parent later.
Authorization not required, issuer https://mcp.brainkb.org/
Authorization not required, issuer https://mcp.brainkb.org/
Authorization not required, issuer https://mcp.brainkb.org/
Authorization not required, issuer https://mcp.brainkb.org/
Authorization not required, issuer https://mcp.brainkb.org/
Changed the definition of "brainkb_list_spaces", "brainkb_read_space" and "brainkb_search"
⟨87 unchanged words⟩ read vs. write vs. only see as public. No login needed: an unauthenticated caller gets the public spaces only (read-only). Log in to also see your own/member spaces. `owner` is shown only for spaces the caller is a member of; a public space read by a non-member never exposes its owner's email.
⟨5 unchanged words⟩ a space's graphs. Public spaces are readable byanyone;anyone without logging in (read-only); private spaces require login and
Authorization not required, issuer https://mcp.brainkb.org/
Authorization not required, issuer https://mcp.brainkb.org/
Added "brainkb_qa_list" and "brainkb_qa_run" (53 tools before, 55 now)
Find a canned question BrainKB can answer, then run it with brainkb_qa_run. Prefer these over writing SPARQL: they are vetted against BrainKB's actual vocabulary. Discovery is two steps, so you never read every query at once: 1. brainkb_qa_list() -> the menu: each category's name, a description of the questions it covers, and how many queries it has. Pick the category whose description matches the user's question. 2. brainkb_qa_list(category="<name>") -> that category's queries. Each has `question` (what it answers), `notes` (when to use it, where parame…
Run a canned question from brainkb_qa_list by id. `params` maps parameter names to values; they are validated and escaped, never spliced in raw. Runs through the same SPARQL endpoint as brainkb_sparql, so it needs the same role.
Certificate recorded, valid to 2027-02-24
Authorization not required
First tool surface recorded: 53 tools (server version 1.29.0)
Showing the latest 20 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
{"properties":{"limit":{"default":0,"title":"Limit","type":"integer"},"offset":{"default":0,"title":"Offset","type":"integer"},"sparql_query":{"title":"Sparql Query","type ⟨7 unchanged words⟩
Rename a space,(itschangedisplayitsname)description, and/orchangegiveitsitdescription.a new slug. Owner/manager only.ThePassslugonlycan'twhatchange:changes;itdescription=""isclears it. `new_slug` (lowercase letters, digits and hyphens, 3-64 chars) moves the space's IRI and every graph whose IRI is built from the old slug (https://brainkb.org/graph/<slug>/…, …/synthscholar/<slug>/…)andtolinksthe new slug,graphwithbindingstheir registry, search and historyprovenancerecordspointandatSynthScholarit.reviews;Passgraphsonlywithwhatotherchanges;IRIsdescription=""keepclearstheirs.it.TheConfirmold slug and IRIs stay as aliases: they keep resolving and nobody else can take them, but ingest into an old IRI is refused with the newnameone. The result's `rename.moved_graphs` lists each from → to. 409 if the slug or a target graph is taken. Before calling with `new_slug`: show the userbeforethecalling.graphs that will move and confirm.
⟨17 unchanged words⟩ "default":null,"title":"Name"},"new_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"New Slug"},"slug":{"title":"Slug","type": ⟨7 unchanged words⟩
⟨45 unchanged words⟩ ":"Review Id","type":"string"},"space":{"default":"","title":"Space","type":"string"}},"required":["review_id"],"title": ⟨3 unchanged words⟩
⟨3 unchanged words⟩ ":"Review Id","type":"string"},"space":{"default":"","title":"Space","type":"string"}},"required":["review_id"],"title": ⟨3 unchanged words⟩
⟨35 unchanged words⟩ to be its owner or an editor).TheAreview'sreview is unique per space: the same run can go into several spaces, once each. Its graph, https://brainkb.org/synthscholar/reviews/<protocol.review_id>///brainkb.org/synthscholar/<space>/reviews/<protocol.review_id>/, is registered in the space; review.ttl plus ⟨39 unchanged words⟩ shown on the review's page. Once per review per space: the same run into the same space again is refused (409). Reads the ⟨10 unchanged words⟩
⟨34 unchanged words⟩ "Review Id","type":"string"},"space":{"default":"","title":"Space","type":"string"},"study":{"default":"","title":" ⟨10 unchanged words⟩
⟨48 unchanged words⟩ "Review Id","type":"string"},"space":{"default":"","title":"Space","type":"string"},"stage":{"default":"","title":" ⟨9 unchanged words⟩
⟨47 unchanged words⟩ ":"Source","type":"string"},"space":{"default":"","title":"Space","type":"string"},"with_abstract":{"default":false,"title":"With ⟨25 unchanged words⟩
⟨9 unchanged words⟩ "title":"Section","type":"string"},"space":{"default":"","title":"Space","type":"string"}},"required":["review_id"],"title": ⟨3 unchanged words⟩
One ingested review: summary, its graph and space, the files kept (path, kind, media type, size, sha256), the run's search log and verification, the screening basis and full-text retrieval. Long texts and the per-study list are left out here — read them from the graph or the review page.
Ingest a SynthScholar review — the output directory of a run (the folder holding review.json and review.ttl, as the synthscholar skill writes it) — into a space you may write to (see brainkb_list_writable_spaces; you need to be its owner or an editor). The review's graph, https://brainkb.org/synthscholar/reviews/<protocol.review_id>/, is registered in the space; review.ttl plus an import record (PROV-O: who, when, every kept file with media type, size and sha256, what was left out) are ingested as an ordinary job → job_id (poll brainkb_job_status, reconcile with …
Ingested SynthScholar reviews you can read (public spaces: anyone): id, title, research question, space, graph, included count, when ingested, ingest job. `q` filters on text in the title or research question.
Per-study records an ingested review produced. `kind`: `charting` (the data-charting form's answers per study), `appraisal` (critical appraisal by domain) or `narrative` (narrative synthesis rows: design, methods, outcomes, limitations). `q`: text in the answers (e.g. "neo4j" finds the studies that report it); `study`: source id (S-001), title, DOI or PMID; `fields`: comma-separated fields to return (the response lists the available ones).
The screening audit trail of an ingested review: every decision with its stage (title_abstract | full_text), decision (include | exclude), what it was judged on (title_abstract | full_text | abstract_only), the full-text route and the reason. Filter by any of those, by text or criterion code in the reason (e.g. "EC2"), or by PMID. Also returns counts for the filtered set: by stage and decision, what decisions were judged on, and exclusion reasons by criterion.
The included studies of an ingested review, filtered. `q`: text in title, authors, journal, DOI, PMID or keywords. `full_text`: true = read in full, false = abstract only. `source`: full-text route (europe_pmc, unpaywall, ezproxy, arxiv, …). `rob`: risk-of-bias rating (low, high, some concerns). Years inclusive. Each study: ids, title, authors, year, journal, how it was read and by which route, RoB. Paged (`total`, at most 200 per call).
An ingested review's own text: `abstract`, `introduction`, `synthesis`, `bias`, `limitations`, `conclusions`, `research_question`, `search_queries` or `per_group` (the per-group analysis) — or all of them when `section` is empty.
⟨9 unchanged words⟩ ":"Name","type":"string"},"parent_slug":{"default":"","title":"Parent Slug","type":"string"},"slug":{"title":"Slug","type": ⟨23 unchanged words⟩
⟨29 unchanged words⟩ 'editor' | 'viewer' | null (their space membership, including a role inherited from a parent space) - role_inherited: the role comes from a parent space, not this one - parent_slug: the parent space, when this is a subspace the caller can see the parent of (build the tree from it) - is_owner: they own the space - ⟨96 unchanged words⟩
PERMANENTLY delete a space and everything in it. SuperAdmin only; irreversible. Drops the space's named graphs and the ingestion-history (delta) graphs that hold copies of their data, removes the graphs' registry entries and the space's RDF manifest, and deletes the space with its members, access rules and search entries. The deletion itself is kept in the provenance graph (who, when, which graphs: prov:invalidated). `confirm_slug` must equal `slug`. Before calling: show the user the space (brainkb_read_space or brainkb_list_spaces) and what will be lost, and get…
A space's details: graphs, members (direct, plus `inherited_members` with the parent space each comes from), visibility, `parent_slug`, `ancestors` (root first) and direct `subspaces` — only the ones the caller may see — and the caller's `your_role` / `role_inherited`. Public spaces need no login; member emails are shown to members and admins only.
(Admin/SuperAdmin) List reserved named graphs: graph IRIs, or every IRI under a prefix, that only an Admin/SuperAdmin — or, when reserved for a space, that space's managers/editors — may register or bind. Includes the built-in system reservations (BrainKB's metadata and provenance graphs), which nobody can bind.
Spaces the caller can ingest into, each with its graphs (and descriptions) and `parent_slug` for subspaces — decided by the same checks ingestion uses: owner/ editor membership (including a role inherited from a parent space), a space write access rule, or Admin/SuperAdmin. `can_ingest` false means the caller has no write-capable role at all. `unmapped_graphs` are registered graphs in no space. Use this, not brainkb_list_registered_graphs, to choose where to ingest.
(Admin/SuperAdmin) Reserve a named graph so other users can't create it. match_type 'exact' reserves one graph IRI; 'prefix' reserves every IRI starting with it (e.g. 'https://brainkb.org/graph/allen/'). Give a `reason` — it is shown to anyone who is refused. Optional `space_slug` reserves it for that space, whose managers/editors may then bind it. Graphs already bound stay where they are; the response lists them under `already_bound`. 409 if it is already reserved, overlaps a system graph, or is bound to another space than `space_slug`.
A space and every subspace below it (any depth), nested: each node has slug, name, visibility, the caller's role and whether it's inherited from a parent, and its graph count. Only subspaces the caller may see are included.
(Admin/SuperAdmin) Remove a reservation by its id (see brainkb_list_reserved_graphs). System reservations cannot be removed.
⟨15 unchanged words⟩ one workspace, omit for a full search. No login needed: an unauthenticated caller searches public spaces only. Anonymous/other users never see private-space data.