{"serverId":"mcp-registry/org.brainkb/brainkb","tools":[{"name":"brainkb_add_access_rule","fixed":{"name":"brainkb_add_access_rule","description":"(Space manager) Restrict a space action to a subject.\n    action: 'read' | 'write' | 'manage'.\n    subject_type: 'global_role' (e.g. 'Admin','Lab Member') | 'member' (an email) |\n    'space_role' ('viewer'|'editor'|'owner', matched as >=).\n    When rules exist for an action, only matching callers may perform it; the space\n    owner and Admin/SuperAdmin always bypass (no lockout). Example: restrict writing\n    to Admins -> action='write', subject_type='global_role', subject_value='Admin'.","inputSchema":{"type":"object","title":"brainkb_add_access_ruleArguments","required":["slug","action","subject_type","subject_value"],"properties":{"slug":{"type":"string","title":"Slug"},"action":{"type":"string","title":"Action"},"subject_type":{"type":"string","title":"Subject Type"},"subject_value":{"type":"string","title":"Subject Value"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":250,"tokensAfter":250},{"name":"brainkb_add_space_graph","fixed":{"name":"brainkb_add_space_graph","description":"Register a named graph and bind it to a space, so ingest/read on that graph\n    are governed by the space's membership and visibility. Owner/editor only.\n    The named_graph_iri is **globally unique** — one graph belongs to exactly one\n    space. If it's already registered (to any space) the call returns 409; graph\n    bindings are permanent (no unregister/delete).","inputSchema":{"type":"object","title":"brainkb_add_space_graphArguments","required":["slug","named_graph_iri"],"properties":{"slug":{"type":"string","title":"Slug"},"description":{"type":"string","title":"Description","default":""},"named_graph_iri":{"type":"string","title":"Named Graph Iri"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":200,"tokensAfter":200},{"name":"brainkb_add_space_member","fixed":{"name":"brainkb_add_space_member","description":"Add/update a space member. role: 'owner' | 'editor' | 'viewer'. Owner only.","inputSchema":{"type":"object","title":"brainkb_add_space_memberArguments","required":["slug","member_email"],"properties":{"role":{"type":"string","title":"Role","default":"viewer"},"slug":{"type":"string","title":"Slug"},"member_email":{"type":"string","title":"Member Email"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":114,"tokensAfter":114},{"name":"brainkb_assign_role","fixed":{"name":"brainkb_assign_role","description":"(Admin) Assign a role/group to a user by email (e.g. 'Lab Member', 'External',\n    or a custom group). The user must already have a profile (created on first\n    login/registration). NOTE: assigning the 'Admin'/'SuperAdmin' role is\n    SuperAdmin-only (hierarchy: SuperAdmin > Admin).","inputSchema":{"type":"object","title":"brainkb_assign_roleArguments","required":["email","role"],"properties":{"role":{"type":"string","title":"Role"},"email":{"type":"string","title":"Email"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":148,"tokensAfter":148},{"name":"brainkb_create_permission","fixed":{"name":"brainkb_create_permission","description":"(Admin) Create a new usermanagement permission, e.g.\n    name='dataset.export', resource='dataset', action='export'. Attach it to roles\n    via the usermanagement role-permissions API.","inputSchema":{"type":"object","title":"brainkb_create_permissionArguments","required":["name","resource","action"],"properties":{"name":{"type":"string","title":"Name"},"action":{"type":"string","title":"Action"},"resource":{"type":"string","title":"Resource"},"description":{"type":"string","title":"Description","default":""}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":159,"tokensAfter":159},{"name":"brainkb_create_role","fixed":{"name":"brainkb_create_role","description":"(Admin) Create a new role/group — e.g. an 'External' collaborator group —\n    which can then be assigned with brainkb_assign_role.","inputSchema":{"type":"object","title":"brainkb_create_roleArguments","required":["name"],"properties":{"name":{"type":"string","title":"Name"},"category":{"type":"string","title":"Category","default":"Content"},"description":{"type":"string","title":"Description","default":""}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":128,"tokensAfter":128},{"name":"brainkb_create_space","fixed":{"name":"brainkb_create_space","description":"Create a workspace/space, or a subspace inside one. The caller becomes owner.\n    slug: lowercase/hyphen id, **globally unique** — if it's already taken the call\n    returns 409 (pick another slug).\n    visibility: 'private' or 'public' (set per space: a private space may hold a\n    public subspace);\n    description: short human description (recommended — surfaces in the registry);\n    space_type: 'individual' (a personal space — any write-capable role) or 'team'\n    (a shared space — only Admin","inputSchema":{"type":"object","title":"brainkb_create_spaceArguments","required":["slug","name"],"properties":{"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"space_type":{"type":"string","title":"Space Type","default":"individual"},"visibility":{"type":"string","title":"Visibility","default":"private"},"description":{"type":"string","title":"Description","default":""},"parent_slug":{"type":"string","title":"Parent Slug","default":""}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":287,"tokensAfter":287},{"name":"brainkb_create_token","fixed":{"name":"brainkb_create_token","description":"Generate a Personal Access Token (PAT) for browser-free auth. Requires you\n    to be logged in already (brainkb_login or brainkb_globus_login). The token is\n    shown ONCE and never again — copy it and set it as BRAINKB_TOKEN in your\n    MCP/skill config; then no login or browser is needed until it expires.\n    `name`: a label so you can tell tokens apart (e.g. 'laptop'). `days`: lifetime\n    (default 90, server-capped). Treat the returned token like a password.","inputSchema":{"type":"object","title":"brainkb_create_tokenArguments","properties":{"days":{"type":"integer","title":"Days","default":90},"name":{"type":"string","title":"Name","default":""}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":199,"tokensAfter":199},{"name":"brainkb_delete_space","fixed":{"name":"brainkb_delete_space","description":"PERMANENTLY delete a space and everything in it. SuperAdmin only; irreversible.\n\n    Drops the space's named graphs and the ingestion-history (delta) graphs that\n    hold copies of their data, removes the graphs' registry entries and the space's\n    RDF manifest, and deletes the space with its members, access rules, search\n    entries and SynthScholar reviews (with their kept files). EVERY SUBSPACE below it,\n    at any depth, is deleted the same way, deepest first (`subspaces_deleted`). Each\n   ","inputSchema":{"type":"object","title":"brainkb_delete_spaceArguments","required":["slug","confirm_slug"],"properties":{"slug":{"type":"string","title":"Slug"},"confirm_slug":{"type":"string","title":"Confirm Slug"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":215,"tokensAfter":215},{"name":"brainkb_delta_compare","fixed":{"name":"brainkb_delta_compare","description":"Compare two jobs' deltas: A-only / B-only / shared triple counts + triples.","inputSchema":{"type":"object","title":"brainkb_delta_compareArguments","required":["job_id_a","job_id_b"],"properties":{"job_id_a":{"type":"string","title":"Job Id A"},"job_id_b":{"type":"string","title":"Job Id B"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":96,"tokensAfter":96},{"name":"brainkb_discard_upload","fixed":{"name":"brainkb_discard_upload","description":"Delete one of your staged uploads without ingesting it.","inputSchema":{"type":"object","title":"brainkb_discard_uploadArguments","required":["upload_id"],"properties":{"upload_id":{"type":"string","title":"Upload Id"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":75,"tokensAfter":75},{"name":"brainkb_get_space","fixed":{"name":"brainkb_get_space","description":"A space's details: graphs, members (direct, plus `inherited_members` with the\n    parent space each comes from), visibility, `parent_slug`, `ancestors` (root\n    first) and direct `subspaces` — only the ones the caller may see — and the\n    caller's `your_role` / `role_inherited`. Public spaces need no login; member\n    emails are shown to members and admins only.","inputSchema":{"type":"object","title":"brainkb_get_spaceArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":156,"tokensAfter":156},{"name":"brainkb_ingest_upload","fixed":{"name":"brainkb_ingest_upload","description":"Ingest a file you staged with `POST /upload` into a named graph.\n\n    This is the route for a large local file: your HTTP client streams the bytes\n    straight to this server over HTTPS, then you name the resulting upload_id here. The\n    server reads its own staged copy and posts it to the ingest API internally, so\n    the RDF never passes through a model's context — nothing to transcribe, no\n    context-window ceiling, and no reason to split the document (splitting breaks\n    blank-node identi","inputSchema":{"type":"object","title":"brainkb_ingest_uploadArguments","required":["named_graph_iri","upload_id"],"properties":{"upload_id":{"type":"string","title":"Upload Id"},"named_graph_iri":{"type":"string","title":"Named Graph Iri"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":222,"tokensAfter":222},{"name":"brainkb_job_status","fixed":{"name":"brainkb_job_status","description":"Detailed status of one ingest job: status, progress %, current file/stage,\n    per-file failures, and (when complete) a summary.","inputSchema":{"type":"object","title":"brainkb_job_statusArguments","required":["job_id"],"properties":{"job_id":{"type":"string","title":"Job Id"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":91,"tokensAfter":91},{"name":"brainkb_list_access_rules","fixed":{"name":"brainkb_list_access_rules","description":"List a space's fine-grained access rules (member/manager of the space).","inputSchema":{"type":"object","title":"brainkb_list_access_rulesArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":77,"tokensAfter":77},{"name":"brainkb_list_capabilities","fixed":{"name":"brainkb_list_capabilities","description":"(Admin only) Catalog of all KG capabilities, which are delegatable\n    ('grantable'), which are admin-only, and a description of each. Use this to see\n    the available permission options before granting to a user or group/role.","inputSchema":{"type":"object","title":"brainkb_list_capabilitiesArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":105,"tokensAfter":105},{"name":"brainkb_list_jobs","fixed":{"name":"brainkb_list_jobs","description":"List the user's ingest jobs (newest first) with status and progress.","inputSchema":{"type":"object","title":"brainkb_list_jobsArguments","properties":{"limit":{"type":"integer","title":"Limit","default":50}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":71,"tokensAfter":71},{"name":"brainkb_list_permissions","fixed":{"name":"brainkb_list_permissions","description":"(Admin) List all usermanagement permissions (resource/action pairs used for\n    page-access and role-permission mapping). These are the addable 'permission'\n    options; KG action-capabilities are listed by brainkb_list_capabilities.","inputSchema":{"type":"object","title":"brainkb_list_permissionsArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":106,"tokensAfter":106},{"name":"brainkb_list_registered_graphs","fixed":{"name":"brainkb_list_registered_graphs","description":"List registered named graphs visible to the caller (private-space graphs the\n    caller can't access are hidden).","inputSchema":{"type":"object","title":"brainkb_list_registered_graphsArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":75,"tokensAfter":75},{"name":"brainkb_list_reserved_graphs","fixed":{"name":"brainkb_list_reserved_graphs","description":"(Admin/SuperAdmin) List reserved named graphs: graph IRIs, or every IRI under a\n    prefix, that only an Admin/SuperAdmin — or, when reserved for a space, that\n    space's managers/editors — may register or bind. Includes the built-in system\n    reservations (BrainKB's metadata and provenance graphs), which nobody can bind.","inputSchema":{"type":"object","title":"brainkb_list_reserved_graphsArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":134,"tokensAfter":134},{"name":"brainkb_list_spaces","fixed":{"name":"brainkb_list_spaces","description":"List spaces the user can see (their own/member spaces + public ones), each\n    annotated with THIS caller's permission so you know what they may do:\n      - your_role: 'owner' | 'editor' | 'viewer' | null (their space membership,\n                   including a role inherited from a parent space)\n      - role_inherited: the role comes from a parent space, not this one\n      - parent_slug: the parent space, when this is a subspace the caller can see\n                     the parent of (build the tr","inputSchema":{"type":"object","title":"brainkb_list_spacesArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":178,"tokensAfter":178},{"name":"brainkb_list_tokens","fixed":{"name":"brainkb_list_tokens","description":"List your Personal Access Tokens (metadata only — the secret is never\n    shown): id, name, prefix, created/last-used/expiry, and whether each is\n    active/revoked/expired. Use the id with brainkb_revoke_token.","inputSchema":{"type":"object","title":"brainkb_list_tokensArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":97,"tokensAfter":97},{"name":"brainkb_list_uploads","fixed":{"name":"brainkb_list_uploads","description":"List RDF files YOU have staged with POST /upload but not yet ingested.\n\n    Shows each upload_id, its size, sha256 and when it expires. Only your own\n    uploads are visible.","inputSchema":{"type":"object","title":"brainkb_list_uploadsArguments","properties":{}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":87,"tokensAfter":87},{"name":"brainkb_list_users","fixed":{"name":"brainkb_list_users","description":"(Admin) List users (profiles) — filter by `q` (name/email/orcid) or `role`.\n    Shows profile_id, email, roles, providers, ban status.","inputSchema":{"type":"object","title":"brainkb_list_usersArguments","properties":{"q":{"type":"string","title":"Q","default":""},"role":{"type":"string","title":"Role","default":""},"limit":{"type":"integer","title":"Limit","default":50}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":118,"tokensAfter":118},{"name":"brainkb_list_writable_spaces","fixed":{"name":"brainkb_list_writable_spaces","description":"Spaces the caller can ingest into, each with its graphs (and descriptions) and\n    `parent_slug` for subspaces — decided by the same checks ingestion uses: owner/\n    editor membership (including a role inherited from a parent space), a space write\n    access rule, or Admin/SuperAdmin. `can_ingest` false means the caller has no\n    write-capable role at all. `unmapped_graphs` are registered graphs in no space.\n    Use this, not brainkb_list_registered_graphs, to choose where to ingest.","inputSchema":{"type":"object","title":"brainkb_list_writable_spacesArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":180,"tokensAfter":180},{"name":"brainkb_qa_list","fixed":{"name":"brainkb_qa_list","description":"Find a canned question BrainKB can answer, then run it with brainkb_qa_run.\n\n    Prefer these over writing SPARQL: they are vetted against BrainKB's actual\n    vocabulary. Discovery is two steps, so you never read every query at once:\n\n    1. brainkb_qa_list() -> the menu: each category's name, a description of\n       the questions it covers, and how many queries it has. Pick the category\n       whose description matches the user's question.\n    2. brainkb_qa_list(category=\"<name>\") -> that cate","inputSchema":{"type":"object","title":"brainkb_qa_listArguments","properties":{"search":{"type":"string","title":"Search","default":""},"category":{"type":"string","title":"Category","default":""}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":210,"tokensAfter":210},{"name":"brainkb_qa_run","fixed":{"name":"brainkb_qa_run","description":"Run a canned question from brainkb_qa_list by id. `params` maps parameter\n    names to values; they are validated and escaped, never spliced in raw. Runs\n    through the same SPARQL endpoint as brainkb_sparql, so it needs the same\n    role.","inputSchema":{"type":"object","title":"brainkb_qa_runArguments","required":["query_id"],"properties":{"params":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Params","default":null},"query_id":{"type":"string","title":"Query Id"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":154,"tokensAfter":154},{"name":"brainkb_read_space","fixed":{"name":"brainkb_read_space","description":"Read all RDF (JSON-LD) in a space's graphs. Public spaces are readable by\n    anyone without logging in (read-only); private spaces require login and\n    membership. Don't ask the user to log in just to read a public space.","inputSchema":{"type":"object","title":"brainkb_read_spaceArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":116,"tokensAfter":116},{"name":"brainkb_remove_access_rule","fixed":{"name":"brainkb_remove_access_rule","description":"(Space manager) Delete a fine-grained access rule by its id\n    (see brainkb_list_access_rules).","inputSchema":{"type":"object","title":"brainkb_remove_access_ruleArguments","required":["slug","rule_id"],"properties":{"slug":{"type":"string","title":"Slug"},"rule_id":{"type":"integer","title":"Rule Id"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":101,"tokensAfter":101},{"name":"brainkb_remove_role","fixed":{"name":"brainkb_remove_role","description":"(Admin) Remove a role/group from a user by email.","inputSchema":{"type":"object","title":"brainkb_remove_roleArguments","required":["email","role"],"properties":{"role":{"type":"string","title":"Role"},"email":{"type":"string","title":"Email"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":82,"tokensAfter":82},{"name":"brainkb_revoke_capability","fixed":{"name":"brainkb_revoke_capability","description":"(Admin only) Revoke a previously granted capability from a user.","inputSchema":{"type":"object","title":"brainkb_revoke_capabilityArguments","required":["member","capability"],"properties":{"member":{"type":"string","title":"Member"},"capability":{"type":"string","title":"Capability"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":95,"tokensAfter":95},{"name":"brainkb_revoke_role_capability","fixed":{"name":"brainkb_revoke_role_capability","description":"(Admin only) Revoke a capability from a role/group.","inputSchema":{"type":"object","title":"brainkb_revoke_role_capabilityArguments","required":["role","capability"],"properties":{"role":{"type":"string","title":"Role"},"capability":{"type":"string","title":"Capability"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":92,"tokensAfter":92},{"name":"brainkb_revoke_token","fixed":{"name":"brainkb_revoke_token","description":"Revoke one of your Personal Access Tokens by id (see brainkb_list_tokens).\n    Takes effect immediately — the next call using that token fails.","inputSchema":{"type":"object","title":"brainkb_revoke_tokenArguments","required":["token_id"],"properties":{"token_id":{"type":"integer","title":"Token Id"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":98,"tokensAfter":98},{"name":"brainkb_search","fixed":{"name":"brainkb_search","description":"Full-text search over the knowledge graphs, access-filtered by space\n    visibility. Pass `space` to scope to one workspace, omit for a full search.\n    No login needed: an unauthenticated caller searches public spaces only.\n    Anonymous/other users never see private-space data.","inputSchema":{"type":"object","title":"brainkb_searchArguments","required":["q"],"properties":{"q":{"type":"string","title":"Q"},"limit":{"type":"integer","title":"Limit","default":25},"space":{"type":"string","title":"Space","default":""},"offset":{"type":"integer","title":"Offset","default":0}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":174,"tokensAfter":174},{"name":"brainkb_set_space_visibility","fixed":{"name":"brainkb_set_space_visibility","description":"Set a space 'public' (anyone, even anonymous, can read) or 'private'\n    (members only). Owner only. Everything in a public space is public: making a\n    space public also makes all its subspaces public, and a subspace of a public\n    space cannot be made private (409). Under a private space each subspace can be\n    public or private on its own.","inputSchema":{"type":"object","title":"brainkb_set_space_visibilityArguments","required":["slug","visibility"],"properties":{"slug":{"type":"string","title":"Slug"},"visibility":{"type":"string","title":"Visibility"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":175,"tokensAfter":175},{"name":"brainkb_synthscholar_find_study","fixed":{"name":"brainkb_synthscholar_find_study","description":"Which ingested reviews (that you can read) include or screened a study —\n    by DOI, PMID or part of its title (6+ characters) — and what happened to it in\n    each: included (read in full or from the abstract) or each screening decision\n    with its reason.","inputSchema":{"type":"object","title":"brainkb_synthscholar_find_studyArguments","properties":{"doi":{"type":"string","title":"Doi","default":""},"pmid":{"type":"string","title":"Pmid","default":""},"title":{"type":"string","title":"Title","default":""}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":161,"tokensAfter":161},{"name":"brainkb_synthscholar_get_review","fixed":{"name":"brainkb_synthscholar_get_review","description":"One ingested review: summary, its graph and space, the files kept (path,\n    kind, media type, size, sha256), the run's search log and verification, the\n    screening basis and full-text retrieval. Long texts and the per-study list are\n    left out here — read them from the graph or the review page.","inputSchema":{"type":"object","title":"brainkb_synthscholar_get_reviewArguments","required":["review_id"],"properties":{"space":{"type":"string","title":"Space","default":""},"review_id":{"type":"string","title":"Review Id"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":164,"tokensAfter":164},{"name":"brainkb_synthscholar_list_reviews","fixed":{"name":"brainkb_synthscholar_list_reviews","description":"Ingested SynthScholar reviews you can read (public spaces: anyone): id, title,\n    research question, space, graph, included count, when ingested, ingest job.\n    `q` filters on text in the title or research question.","inputSchema":{"type":"object","title":"brainkb_synthscholar_list_reviewsArguments","properties":{"q":{"type":"string","title":"Q","default":""},"space":{"type":"string","title":"Space","default":""}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":134,"tokensAfter":134},{"name":"brainkb_update_space","fixed":{"name":"brainkb_update_space","description":"Rename a space (its display name) and/or change its description. Owner/manager\n    only. The slug can't change: it is the space's IRI, and links, graph bindings and\n    provenance point at it. Pass only what changes; description=\"\" clears it. Confirm\n    the new name with the user before calling.","inputSchema":{"type":"object","title":"brainkb_update_spaceArguments","required":["slug"],"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","default":null},"slug":{"type":"string","title":"Slug"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","default":null}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":189,"tokensAfter":189},{"name":"brainkb_upload_status","fixed":{"name":"brainkb_upload_status","description":"State of one of your staged/submitted uploads.\n\n    `state` is `staged` (waiting for brainkb_ingest_upload), `submitting` (the server\n    is streaming it to the ingest API), `submitted` (accepted — `job_id` is set, poll\n    brainkb_job_status) or `failed` (the staged bytes were KEPT, so retry with\n    brainkb_ingest_upload rather than re-uploading).","inputSchema":{"type":"object","title":"brainkb_upload_statusArguments","required":["upload_id"],"properties":{"upload_id":{"type":"string","title":"Upload Id"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":158,"tokensAfter":158}],"toolsChanged":40,"tokensSaved":0,"todo":[{"tool":"brainkb_activate_user","params":["email"]},{"tool":"brainkb_add_access_rule","params":["slug","action","subject_type","subject_value"]},{"tool":"brainkb_add_space_graph","params":["slug","description","named_graph_iri"]},{"tool":"brainkb_add_space_member","params":["role","slug","member_email"]},{"tool":"brainkb_assign_role","params":["role","email"]},{"tool":"brainkb_ban_user","params":["email","reason"]},{"tool":"brainkb_capabilities","params":["member"]},{"tool":"brainkb_create_permission","params":["name","action","resource","description"]},{"tool":"brainkb_create_role","params":["name","category","description"]},{"tool":"brainkb_create_space","params":["name","slug","space_type","visibility","description","parent_slug"]},{"tool":"brainkb_create_token","params":["days","name"]},{"tool":"brainkb_deactivate_user","params":["email"]},{"tool":"brainkb_delete_space","params":["slug","confirm_slug"]},{"tool":"brainkb_delta","params":["job_id"]},{"tool":"brainkb_delta_compare","params":["job_id_a","job_id_b"]},{"tool":"brainkb_delta_history","params":["named_graph_iri"]},{"tool":"brainkb_discard_upload","params":["upload_id"]},{"tool":"brainkb_finish_login","params":["code","base_url"]},{"tool":"brainkb_get_space","params":["slug"]},{"tool":"brainkb_globus_login","params":["base_url","provider"]},{"tool":"brainkb_grant_capability","params":["member","capability"]},{"tool":"brainkb_grant_role_capability","params":["role","capability"]},{"tool":"brainkb_ingest_files","params":["file_paths","max_concurrency","named_graph_iri"]},{"tool":"brainkb_ingest_text","params":["data","sha256","expected_bytes","named_graph_iri"]},{"tool":"brainkb_ingest_upload","params":["upload_id","named_graph_iri"]},{"tool":"brainkb_job_status","params":["job_id"]},{"tool":"brainkb_list_access_rules","params":["slug"]},{"tool":"brainkb_list_jobs","params":["limit"]},{"tool":"brainkb_list_users","params":["q","role","limit"]},{"tool":"brainkb_login","params":["email","base_url","password"]},{"tool":"brainkb_provenance_graph","params":["named_graph_iri"]},{"tool":"brainkb_provenance_job","params":["job_id"]},{"tool":"brainkb_qa_list","params":["search","category"]},{"tool":"brainkb_qa_run","params":["params","query_id"]},{"tool":"brainkb_read_space","params":["slug"]},{"tool":"brainkb_recover_job","params":["job_id"]},{"tool":"brainkb_remove_access_rule","params":["slug","rule_id"]},{"tool":"brainkb_remove_role","params":["role","email"]},{"tool":"brainkb_reserve_graph","params":["iri","reason","match_type","space_slug"]},{"tool":"brainkb_revoke_capability","params":["member","capability"]},{"tool":"brainkb_revoke_role_capability","params":["role","capability"]},{"tool":"brainkb_revoke_token","params":["token_id"]},{"tool":"brainkb_role_capabilities","params":["role"]},{"tool":"brainkb_search","params":["q","limit","space","offset"]},{"tool":"brainkb_set_space_visibility","params":["slug","visibility"]},{"tool":"brainkb_space_tree","params":["slug"]},{"tool":"brainkb_sparql","params":["sparql_query"]},{"tool":"brainkb_synthscholar_evidence","params":["q","pmid","claim","limit","space","offset","grounded","review_id"]},{"tool":"brainkb_synthscholar_find_study","params":["doi","pmid","title"]},{"tool":"brainkb_synthscholar_get_review","params":["space","review_id"]},{"tool":"brainkb_synthscholar_ingest","params":["output_dir","space_slug"]},{"tool":"brainkb_synthscholar_list_reviews","params":["q","space"]},{"tool":"brainkb_synthscholar_records","params":["q","kind","limit","space","study","fields","offset","review_id"]},{"tool":"brainkb_synthscholar_screening","params":["q","pmid","limit","space","stage","offset","reason","decision","review_id","assessed_on"]},{"tool":"brainkb_synthscholar_studies","params":["q","rob","limit","space","offset","source","year_to","full_text","review_id","year_from","with_abstract"]},{"tool":"brainkb_synthscholar_text","params":["space","section","review_id"]},{"tool":"brainkb_unban_user","params":["email"]},{"tool":"brainkb_unreserve_graph","params":["reservation_id"]},{"tool":"brainkb_update_space","params":["name","slug","description"]},{"tool":"brainkb_upload_status","params":["upload_id"]},{"tool":"brainkb_use_token","params":["token","base_url"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}