{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_fuyhhy2uk3dw","handle":"brainkb","url":"https://wellknown.network/agents/brainkb","links":{"self":"https://wellknown.network/agents/brainkb/record.json","html":"https://wellknown.network/agents/brainkb","markdown":"https://wellknown.network/agents/brainkb/record.md","api":"https://wellknown.network/api/v1/agents/brainkb","status":"https://wellknown.network/api/v1/agents/brainkb/status","claim":"https://wellknown.network/agents/brainkb/claim","claimApi":"https://wellknown.network/api/v1/claims","claimDescriptor":"https://wellknown.network/agents/brainkb/claim.json","badge":"https://wellknown.network/agents/brainkb/badge.svg","openapi":"https://wellknown.network/openapi.json"},"ard":{"identifier":"urn:air:mcp.brainkb.org:server:brainkb","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"brainkb","summary":"MCP server for querying BrainKB, a knowledge base for neuroscience knowledge graphs.","description":"MCP server for querying BrainKB, a knowledge base for neuroscience knowledge graphs.","publisher":{"name":"org.brainkb","url":null},"homepage":null,"repository":"https://github.com/sensein/BrainKB","version":"0.1.0","license":null,"protocols":["mcp"],"tags":[],"pricing":null,"endpoints":[{"url":"https://mcp.brainkb.org/mcp","type":"mcp_streamable_http","auth":null,"probeable":true}],"skills":null,"tools":null,"extra":{"updatedAt":"2026-07-23T19:16:50.369027Z","publishedAt":"2026-07-23T19:16:50.369027Z","registryName":"org.brainkb/brainkb"},"attribution":{"kind":"mcp_registry","name":"mcp_registry","repoUrl":"mcp_registry","summary":"mcp_registry","version":"mcp_registry","description":"mcp_registry","publisherName":"mcp_registry"}},"derived":{"capabilities":[{"slug":"knowledge.knowledge-graph","name":"Knowledge Graphs","confidence":1,"provenance":"derived"},{"slug":"security.identity","name":"Identity & Access","confidence":1,"provenance":"derived"},{"slug":"security.secrets","name":"Secrets Management","confidence":0.569,"provenance":"derived"},{"slug":"content.writing","name":"Writing & Editing","confidence":0.51,"provenance":"derived"},{"slug":"commerce.ecommerce","name":"E-commerce Operations","confidence":0.51,"provenance":"derived"},{"slug":"infra.browser-automation","name":"Browser Automation","confidence":0.51,"provenance":"derived"}],"categories":["commerce","content","infra","knowledge","security"]},"observed":{"status":"live","statusReason":"Responded 7h ago.","lastOkAt":"2026-09-07T23:25:15.390Z","lastProbedAt":"2026-09-07T23:25:15.390Z","statusComputedAt":"2026-09-07T23:34:43.654Z","reliability30d":{"probes":3,"successRate":1,"p50Ms":103},"latestObservations":[{"at":"2026-09-08T06:24:06.147Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":97,"error":null,"detail":{"tools":[{"name":"brainkb_login","description":"Authenticate to BrainKB with the user's credentials and cache the JWT for\n    THIS session only (isolated per caller). The password/token are never echoed.\n\n   "},{"name":"brainkb_globus_login","description":"Start an OAuth login (Globus / ORCID / GitHub) for THIS session — use this\n    instead of brainkb_login when the user signs in with Globus rather than a\n    pas"},{"name":"brainkb_finish_login","description":"Complete an OAuth login started with brainkb_globus_login by exchanging the\n    one-time code shown in the browser for a session token. The code is single-use\n "},{"name":"brainkb_logout","description":"Forget the cached token for this session."},{"name":"brainkb_whoami","description":"Report the current caller's auth state (email, authenticated, and when the\n    cached session expires). When signed in it also returns base_url — the backend\n  "},{"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   "},{"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/rev"},{"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."},{"name":"brainkb_use_token","description":"Use a Personal Access Token (brainkb_pat_...) for THIS session — an\n    alternative to setting BRAINKB_TOKEN in the config. Validates the token, then\n    caches"},{"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      - you"},{"name":"brainkb_create_space","description":"Create a workspace/space. The caller becomes owner.\n    slug: lowercase/hyphen id, **globally unique** — if it's already taken the call\n    returns 409 (pick an"},{"name":"brainkb_set_space_visibility","description":"Set a space 'public' (anyone, even anonymous, can read) or 'private'\n    (members only). Owner only."},{"name":"brainkb_add_space_member","description":"Add/update a space member. role: 'owner' | 'editor' | 'viewer'. Owner only."},{"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    Th"},{"name":"brainkb_ingest_text","description":"Ingest raw RDF text (Turtle / N-Triples / JSON-LD, auto-detected) into a\n    named graph. Returns a job_id; ingestion runs in the background — poll with\n    bra"},{"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    upload"},{"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"},{"name":"brainkb_discard_upload","description":"Delete one of your staged uploads without ingesting it."},{"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 "},{"name":"brainkb_ingest_files","description":"Ingest local RDF files (ttl/nt/nq/rdf/owl/jsonld/json) into a named graph.\n    Returns a job_id; runs in the background — poll with brainkb_job_status."},{"name":"brainkb_list_jobs","description":"List the user's ingest jobs (newest first) with status and progress."},{"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."},{"name":"brainkb_recover_job","description":"Attempt to recover a stuck/errored ingest job (marks it recoverable/errored)."},{"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    Anonymo"},{"name":"brainkb_read_space","description":"Read all RDF (JSON-LD) in a space's graphs. Public spaces are readable by\n    anyone; private spaces require membership."},{"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)."},{"name":"brainkb_sparql","description":"Run an arbitrary SPARQL query. Requires an Admin/SuperAdmin role (the\n    sparql_admin capability) — for ordinary questions prefer brainkb_search,\n    brainkb_r"},{"name":"brainkb_provenance_job","description":"PROV-O provenance bundle (JSON-LD) for one ingest job."},{"name":"brainkb_provenance_graph","description":"PROV-O ingestion/activity history (JSON-LD) for a named graph."},{"name":"brainkb_delta","description":"The exact triples a job added (its delta), as JSON-LD."},{"name":"brainkb_delta_history","description":"A named graph's change history: one entry per ingest delta (job, triple\n    count, timestamp), newest first."},{"name":"brainkb_delta_compare","description":"Compare two jobs' deltas: A-only / B-only / shared triple counts + triples."},{"name":"brainkb_capabilities","description":"(Admin only) Show a user's roles, effective capabilities, and delegated\n    grants. Useful to check why someone can/can't create team spaces, ingest, etc."},{"name":"brainkb_grant_capability","description":"(Admin only) Delegate a capability to a user — e.g. 'create_team_space' or\n    'manage_team_space' so a Curator/Lab Member can create/manage team spaces.\n    Gr"},{"name":"brainkb_revoke_capability","description":"(Admin only) Revoke a previously granted capability from a user."},{"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 a"},{"name":"brainkb_role_capabilities","description":"(Admin only) List the capabilities granted to a role/group (e.g.\n    'uk_collaborator', 'Lab Member')."},{"name":"brainkb_grant_role_capability","description":"(Admin only) Grant a capability to a whole role/group so EVERY member gets\n    it — e.g. give a custom group 'uk_collaborator' the 'ingest' or\n    'create_priva"},{"name":"brainkb_revoke_role_capability","description":"(Admin only) Revoke a capability from a role/group."},{"name":"brainkb_list_access_rules","description":"List a space's fine-grained access rules (member/manager of the space)."},{"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') | 'me"},{"name":"brainkb_remove_access_rule","description":"(Space manager) Delete a fine-grained access rule by its id\n    (see brainkb_list_access_rules)."},{"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."},{"name":"brainkb_available_roles","description":"(Admin) List the available roles/groups (Admin, Lab Member, Curator, …)."},{"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."},{"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  "},{"name":"brainkb_remove_role","description":"(Admin) Remove a role/group from a user by email."},{"name":"brainkb_activate_user","description":"(Admin) Activate a user's account (sets the JWT user active) by email."},{"name":"brainkb_deactivate_user","description":"(Admin) Deactivate a user's account by email."},{"name":"brainkb_ban_user","description":"(Admin) Ban a user by email (reversible; preserves history). This is how\n    accounts are removed — there is NO hard delete. Banning an Admin is\n    SuperAdmin-"},{"name":"brainkb_unban_user","description":"(Admin) Lift a ban on a user by email."},{"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   "},{"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 usermanageme"}],"toolCount":53,"serverName":"brainkb","capabilities":["experimental","prompts","resources","tools"],"serverVersion":"1.29.0","protocolVersion":"2025-06-18"}},{"at":"2026-09-07T23:25:15.390Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":103,"error":null,"detail":{"tools":[{"name":"brainkb_login","description":"Authenticate to BrainKB with the user's credentials and cache the JWT for\n    THIS session only (isolated per caller). The password/token are never echoed.\n\n   "},{"name":"brainkb_globus_login","description":"Start an OAuth login (Globus / ORCID / GitHub) for THIS session — use this\n    instead of brainkb_login when the user signs in with Globus rather than a\n    pas"},{"name":"brainkb_finish_login","description":"Complete an OAuth login started with brainkb_globus_login by exchanging the\n    one-time code shown in the browser for a session token. The code is single-use\n "},{"name":"brainkb_logout","description":"Forget the cached token for this session."},{"name":"brainkb_whoami","description":"Report the current caller's auth state (email, authenticated, and when the\n    cached session expires). When signed in it also returns base_url — the backend\n  "},{"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   "},{"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/rev"},{"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."},{"name":"brainkb_use_token","description":"Use a Personal Access Token (brainkb_pat_...) for THIS session — an\n    alternative to setting BRAINKB_TOKEN in the config. Validates the token, then\n    caches"},{"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      - you"},{"name":"brainkb_create_space","description":"Create a workspace/space. The caller becomes owner.\n    slug: lowercase/hyphen id, **globally unique** — if it's already taken the call\n    returns 409 (pick an"},{"name":"brainkb_set_space_visibility","description":"Set a space 'public' (anyone, even anonymous, can read) or 'private'\n    (members only). Owner only."},{"name":"brainkb_add_space_member","description":"Add/update a space member. role: 'owner' | 'editor' | 'viewer'. Owner only."},{"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    Th"},{"name":"brainkb_ingest_text","description":"Ingest raw RDF text (Turtle / N-Triples / JSON-LD, auto-detected) into a\n    named graph. Returns a job_id; ingestion runs in the background — poll with\n    bra"},{"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    upload"},{"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"},{"name":"brainkb_discard_upload","description":"Delete one of your staged uploads without ingesting it."},{"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 "},{"name":"brainkb_ingest_files","description":"Ingest local RDF files (ttl/nt/nq/rdf/owl/jsonld/json) into a named graph.\n    Returns a job_id; runs in the background — poll with brainkb_job_status."},{"name":"brainkb_list_jobs","description":"List the user's ingest jobs (newest first) with status and progress."},{"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."},{"name":"brainkb_recover_job","description":"Attempt to recover a stuck/errored ingest job (marks it recoverable/errored)."},{"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    Anonymo"},{"name":"brainkb_read_space","description":"Read all RDF (JSON-LD) in a space's graphs. Public spaces are readable by\n    anyone; private spaces require membership."},{"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)."},{"name":"brainkb_sparql","description":"Run an arbitrary SPARQL query. Requires an Admin/SuperAdmin role (the\n    sparql_admin capability) — for ordinary questions prefer brainkb_search,\n    brainkb_r"},{"name":"brainkb_provenance_job","description":"PROV-O provenance bundle (JSON-LD) for one ingest job."},{"name":"brainkb_provenance_graph","description":"PROV-O ingestion/activity history (JSON-LD) for a named graph."},{"name":"brainkb_delta","description":"The exact triples a job added (its delta), as JSON-LD."},{"name":"brainkb_delta_history","description":"A named graph's change history: one entry per ingest delta (job, triple\n    count, timestamp), newest first."},{"name":"brainkb_delta_compare","description":"Compare two jobs' deltas: A-only / B-only / shared triple counts + triples."},{"name":"brainkb_capabilities","description":"(Admin only) Show a user's roles, effective capabilities, and delegated\n    grants. Useful to check why someone can/can't create team spaces, ingest, etc."},{"name":"brainkb_grant_capability","description":"(Admin only) Delegate a capability to a user — e.g. 'create_team_space' or\n    'manage_team_space' so a Curator/Lab Member can create/manage team spaces.\n    Gr"},{"name":"brainkb_revoke_capability","description":"(Admin only) Revoke a previously granted capability from a user."},{"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 a"},{"name":"brainkb_role_capabilities","description":"(Admin only) List the capabilities granted to a role/group (e.g.\n    'uk_collaborator', 'Lab Member')."},{"name":"brainkb_grant_role_capability","description":"(Admin only) Grant a capability to a whole role/group so EVERY member gets\n    it — e.g. give a custom group 'uk_collaborator' the 'ingest' or\n    'create_priva"},{"name":"brainkb_revoke_role_capability","description":"(Admin only) Revoke a capability from a role/group."},{"name":"brainkb_list_access_rules","description":"List a space's fine-grained access rules (member/manager of the space)."},{"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') | 'me"},{"name":"brainkb_remove_access_rule","description":"(Space manager) Delete a fine-grained access rule by its id\n    (see brainkb_list_access_rules)."},{"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."},{"name":"brainkb_available_roles","description":"(Admin) List the available roles/groups (Admin, Lab Member, Curator, …)."},{"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."},{"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  "},{"name":"brainkb_remove_role","description":"(Admin) Remove a role/group from a user by email."},{"name":"brainkb_activate_user","description":"(Admin) Activate a user's account (sets the JWT user active) by email."},{"name":"brainkb_deactivate_user","description":"(Admin) Deactivate a user's account by email."},{"name":"brainkb_ban_user","description":"(Admin) Ban a user by email (reversible; preserves history). This is how\n    accounts are removed — there is NO hard delete. Banning an Admin is\n    SuperAdmin-"},{"name":"brainkb_unban_user","description":"(Admin) Lift a ban on a user by email."},{"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   "},{"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 usermanageme"}],"toolCount":53,"serverName":"brainkb","capabilities":["experimental","prompts","resources","tools"],"serverVersion":"1.29.0","protocolVersion":"2025-06-18"}},{"at":"2026-09-07T16:25:31.728Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":100,"error":null,"detail":{"tools":[{"name":"brainkb_login","description":"Authenticate to BrainKB with the user's credentials and cache the JWT for\n    THIS session only (isolated per caller). The password/token are never echoed.\n\n   "},{"name":"brainkb_globus_login","description":"Start an OAuth login (Globus / ORCID / GitHub) for THIS session — use this\n    instead of brainkb_login when the user signs in with Globus rather than a\n    pas"},{"name":"brainkb_finish_login","description":"Complete an OAuth login started with brainkb_globus_login by exchanging the\n    one-time code shown in the browser for a session token. The code is single-use\n "},{"name":"brainkb_logout","description":"Forget the cached token for this session."},{"name":"brainkb_whoami","description":"Report the current caller's auth state (email, authenticated, and when the\n    cached session expires). When signed in it also returns base_url — the backend\n  "},{"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   "},{"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/rev"},{"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."},{"name":"brainkb_use_token","description":"Use a Personal Access Token (brainkb_pat_...) for THIS session — an\n    alternative to setting BRAINKB_TOKEN in the config. Validates the token, then\n    caches"},{"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      - you"},{"name":"brainkb_create_space","description":"Create a workspace/space. The caller becomes owner.\n    slug: lowercase/hyphen id, **globally unique** — if it's already taken the call\n    returns 409 (pick an"},{"name":"brainkb_set_space_visibility","description":"Set a space 'public' (anyone, even anonymous, can read) or 'private'\n    (members only). Owner only."},{"name":"brainkb_add_space_member","description":"Add/update a space member. role: 'owner' | 'editor' | 'viewer'. Owner only."},{"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    Th"},{"name":"brainkb_ingest_text","description":"Ingest raw RDF text (Turtle / N-Triples / JSON-LD, auto-detected) into a\n    named graph. Returns a job_id; ingestion runs in the background — poll with\n    bra"},{"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    upload"},{"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"},{"name":"brainkb_discard_upload","description":"Delete one of your staged uploads without ingesting it."},{"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 "},{"name":"brainkb_ingest_files","description":"Ingest local RDF files (ttl/nt/nq/rdf/owl/jsonld/json) into a named graph.\n    Returns a job_id; runs in the background — poll with brainkb_job_status."},{"name":"brainkb_list_jobs","description":"List the user's ingest jobs (newest first) with status and progress."},{"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."},{"name":"brainkb_recover_job","description":"Attempt to recover a stuck/errored ingest job (marks it recoverable/errored)."},{"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    Anonymo"},{"name":"brainkb_read_space","description":"Read all RDF (JSON-LD) in a space's graphs. Public spaces are readable by\n    anyone; private spaces require membership."},{"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)."},{"name":"brainkb_sparql","description":"Run an arbitrary SPARQL query. Requires an Admin/SuperAdmin role (the\n    sparql_admin capability) — for ordinary questions prefer brainkb_search,\n    brainkb_r"},{"name":"brainkb_provenance_job","description":"PROV-O provenance bundle (JSON-LD) for one ingest job."},{"name":"brainkb_provenance_graph","description":"PROV-O ingestion/activity history (JSON-LD) for a named graph."},{"name":"brainkb_delta","description":"The exact triples a job added (its delta), as JSON-LD."},{"name":"brainkb_delta_history","description":"A named graph's change history: one entry per ingest delta (job, triple\n    count, timestamp), newest first."},{"name":"brainkb_delta_compare","description":"Compare two jobs' deltas: A-only / B-only / shared triple counts + triples."},{"name":"brainkb_capabilities","description":"(Admin only) Show a user's roles, effective capabilities, and delegated\n    grants. Useful to check why someone can/can't create team spaces, ingest, etc."},{"name":"brainkb_grant_capability","description":"(Admin only) Delegate a capability to a user — e.g. 'create_team_space' or\n    'manage_team_space' so a Curator/Lab Member can create/manage team spaces.\n    Gr"},{"name":"brainkb_revoke_capability","description":"(Admin only) Revoke a previously granted capability from a user."},{"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 a"},{"name":"brainkb_role_capabilities","description":"(Admin only) List the capabilities granted to a role/group (e.g.\n    'uk_collaborator', 'Lab Member')."},{"name":"brainkb_grant_role_capability","description":"(Admin only) Grant a capability to a whole role/group so EVERY member gets\n    it — e.g. give a custom group 'uk_collaborator' the 'ingest' or\n    'create_priva"},{"name":"brainkb_revoke_role_capability","description":"(Admin only) Revoke a capability from a role/group."},{"name":"brainkb_list_access_rules","description":"List a space's fine-grained access rules (member/manager of the space)."},{"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') | 'me"},{"name":"brainkb_remove_access_rule","description":"(Space manager) Delete a fine-grained access rule by its id\n    (see brainkb_list_access_rules)."},{"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."},{"name":"brainkb_available_roles","description":"(Admin) List the available roles/groups (Admin, Lab Member, Curator, …)."},{"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."},{"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  "},{"name":"brainkb_remove_role","description":"(Admin) Remove a role/group from a user by email."},{"name":"brainkb_activate_user","description":"(Admin) Activate a user's account (sets the JWT user active) by email."},{"name":"brainkb_deactivate_user","description":"(Admin) Deactivate a user's account by email."},{"name":"brainkb_ban_user","description":"(Admin) Ban a user by email (reversible; preserves history). This is how\n    accounts are removed — there is NO hard delete. Banning an Admin is\n    SuperAdmin-"},{"name":"brainkb_unban_user","description":"(Admin) Lift a ban on a user by email."},{"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   "},{"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 usermanageme"}],"toolCount":53,"serverName":"brainkb","capabilities":["experimental","prompts","resources","tools"],"serverVersion":"1.29.0","protocolVersion":"2025-06-18"}},{"at":"2026-09-07T09:29:42.786Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":105,"error":null,"detail":{"tools":[{"name":"brainkb_login","description":"Authenticate to BrainKB with the user's credentials and cache the JWT for\n    THIS session only (isolated per caller). The password/token are never echoed.\n\n   "},{"name":"brainkb_globus_login","description":"Start an OAuth login (Globus / ORCID / GitHub) for THIS session — use this\n    instead of brainkb_login when the user signs in with Globus rather than a\n    pas"},{"name":"brainkb_finish_login","description":"Complete an OAuth login started with brainkb_globus_login by exchanging the\n    one-time code shown in the browser for a session token. The code is single-use\n "},{"name":"brainkb_logout","description":"Forget the cached token for this session."},{"name":"brainkb_whoami","description":"Report the current caller's auth state (email, authenticated, and when the\n    cached session expires). When signed in it also returns base_url — the backend\n  "},{"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   "},{"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/rev"},{"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."},{"name":"brainkb_use_token","description":"Use a Personal Access Token (brainkb_pat_...) for THIS session — an\n    alternative to setting BRAINKB_TOKEN in the config. Validates the token, then\n    caches"},{"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      - you"},{"name":"brainkb_create_space","description":"Create a workspace/space. The caller becomes owner.\n    slug: lowercase/hyphen id, **globally unique** — if it's already taken the call\n    returns 409 (pick an"},{"name":"brainkb_set_space_visibility","description":"Set a space 'public' (anyone, even anonymous, can read) or 'private'\n    (members only). Owner only."},{"name":"brainkb_add_space_member","description":"Add/update a space member. role: 'owner' | 'editor' | 'viewer'. Owner only."},{"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    Th"},{"name":"brainkb_ingest_text","description":"Ingest raw RDF text (Turtle / N-Triples / JSON-LD, auto-detected) into a\n    named graph. Returns a job_id; ingestion runs in the background — poll with\n    bra"},{"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    upload"},{"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"},{"name":"brainkb_discard_upload","description":"Delete one of your staged uploads without ingesting it."},{"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 "},{"name":"brainkb_ingest_files","description":"Ingest local RDF files (ttl/nt/nq/rdf/owl/jsonld/json) into a named graph.\n    Returns a job_id; runs in the background — poll with brainkb_job_status."},{"name":"brainkb_list_jobs","description":"List the user's ingest jobs (newest first) with status and progress."},{"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."},{"name":"brainkb_recover_job","description":"Attempt to recover a stuck/errored ingest job (marks it recoverable/errored)."},{"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    Anonymo"},{"name":"brainkb_read_space","description":"Read all RDF (JSON-LD) in a space's graphs. Public spaces are readable by\n    anyone; private spaces require membership."},{"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)."},{"name":"brainkb_sparql","description":"Run an arbitrary SPARQL query. Requires an Admin/SuperAdmin role (the\n    sparql_admin capability) — for ordinary questions prefer brainkb_search,\n    brainkb_r"},{"name":"brainkb_provenance_job","description":"PROV-O provenance bundle (JSON-LD) for one ingest job."},{"name":"brainkb_provenance_graph","description":"PROV-O ingestion/activity history (JSON-LD) for a named graph."},{"name":"brainkb_delta","description":"The exact triples a job added (its delta), as JSON-LD."},{"name":"brainkb_delta_history","description":"A named graph's change history: one entry per ingest delta (job, triple\n    count, timestamp), newest first."},{"name":"brainkb_delta_compare","description":"Compare two jobs' deltas: A-only / B-only / shared triple counts + triples."},{"name":"brainkb_capabilities","description":"(Admin only) Show a user's roles, effective capabilities, and delegated\n    grants. Useful to check why someone can/can't create team spaces, ingest, etc."},{"name":"brainkb_grant_capability","description":"(Admin only) Delegate a capability to a user — e.g. 'create_team_space' or\n    'manage_team_space' so a Curator/Lab Member can create/manage team spaces.\n    Gr"},{"name":"brainkb_revoke_capability","description":"(Admin only) Revoke a previously granted capability from a user."},{"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 a"},{"name":"brainkb_role_capabilities","description":"(Admin only) List the capabilities granted to a role/group (e.g.\n    'uk_collaborator', 'Lab Member')."},{"name":"brainkb_grant_role_capability","description":"(Admin only) Grant a capability to a whole role/group so EVERY member gets\n    it — e.g. give a custom group 'uk_collaborator' the 'ingest' or\n    'create_priva"},{"name":"brainkb_revoke_role_capability","description":"(Admin only) Revoke a capability from a role/group."},{"name":"brainkb_list_access_rules","description":"List a space's fine-grained access rules (member/manager of the space)."},{"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') | 'me"},{"name":"brainkb_remove_access_rule","description":"(Space manager) Delete a fine-grained access rule by its id\n    (see brainkb_list_access_rules)."},{"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."},{"name":"brainkb_available_roles","description":"(Admin) List the available roles/groups (Admin, Lab Member, Curator, …)."},{"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."},{"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  "},{"name":"brainkb_remove_role","description":"(Admin) Remove a role/group from a user by email."},{"name":"brainkb_activate_user","description":"(Admin) Activate a user's account (sets the JWT user active) by email."},{"name":"brainkb_deactivate_user","description":"(Admin) Deactivate a user's account by email."},{"name":"brainkb_ban_user","description":"(Admin) Ban a user by email (reversible; preserves history). This is how\n    accounts are removed — there is NO hard delete. Banning an Admin is\n    SuperAdmin-"},{"name":"brainkb_unban_user","description":"(Admin) Lift a ban on a user by email."},{"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   "},{"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 usermanageme"}],"toolCount":53,"serverName":"brainkb","capabilities":["experimental","prompts","resources","tools"],"serverVersion":"1.29.0","protocolVersion":"2025-06-18"}}],"tools":[{"name":"brainkb_login","description":"Authenticate to BrainKB with the user's credentials and cache the JWT for\n    THIS session only (isolated per caller). The password/token are never echoed.\n\n   "},{"name":"brainkb_globus_login","description":"Start an OAuth login (Globus / ORCID / GitHub) for THIS session — use this\n    instead of brainkb_login when the user signs in with Globus rather than a\n    pas"},{"name":"brainkb_finish_login","description":"Complete an OAuth login started with brainkb_globus_login by exchanging the\n    one-time code shown in the browser for a session token. The code is single-use\n "},{"name":"brainkb_logout","description":"Forget the cached token for this session."},{"name":"brainkb_whoami","description":"Report the current caller's auth state (email, authenticated, and when the\n    cached session expires). When signed in it also returns base_url — the backend\n  "},{"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   "},{"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/rev"},{"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."},{"name":"brainkb_use_token","description":"Use a Personal Access Token (brainkb_pat_...) for THIS session — an\n    alternative to setting BRAINKB_TOKEN in the config. Validates the token, then\n    caches"},{"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      - you"},{"name":"brainkb_create_space","description":"Create a workspace/space. The caller becomes owner.\n    slug: lowercase/hyphen id, **globally unique** — if it's already taken the call\n    returns 409 (pick an"},{"name":"brainkb_set_space_visibility","description":"Set a space 'public' (anyone, even anonymous, can read) or 'private'\n    (members only). Owner only."},{"name":"brainkb_add_space_member","description":"Add/update a space member. role: 'owner' | 'editor' | 'viewer'. Owner only."},{"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    Th"},{"name":"brainkb_ingest_text","description":"Ingest raw RDF text (Turtle / N-Triples / JSON-LD, auto-detected) into a\n    named graph. Returns a job_id; ingestion runs in the background — poll with\n    bra"},{"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    upload"},{"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"},{"name":"brainkb_discard_upload","description":"Delete one of your staged uploads without ingesting it."},{"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 "},{"name":"brainkb_ingest_files","description":"Ingest local RDF files (ttl/nt/nq/rdf/owl/jsonld/json) into a named graph.\n    Returns a job_id; runs in the background — poll with brainkb_job_status."},{"name":"brainkb_list_jobs","description":"List the user's ingest jobs (newest first) with status and progress."},{"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."},{"name":"brainkb_recover_job","description":"Attempt to recover a stuck/errored ingest job (marks it recoverable/errored)."},{"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    Anonymo"},{"name":"brainkb_read_space","description":"Read all RDF (JSON-LD) in a space's graphs. Public spaces are readable by\n    anyone; private spaces require membership."},{"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)."},{"name":"brainkb_sparql","description":"Run an arbitrary SPARQL query. Requires an Admin/SuperAdmin role (the\n    sparql_admin capability) — for ordinary questions prefer brainkb_search,\n    brainkb_r"},{"name":"brainkb_provenance_job","description":"PROV-O provenance bundle (JSON-LD) for one ingest job."},{"name":"brainkb_provenance_graph","description":"PROV-O ingestion/activity history (JSON-LD) for a named graph."},{"name":"brainkb_delta","description":"The exact triples a job added (its delta), as JSON-LD."},{"name":"brainkb_delta_history","description":"A named graph's change history: one entry per ingest delta (job, triple\n    count, timestamp), newest first."},{"name":"brainkb_delta_compare","description":"Compare two jobs' deltas: A-only / B-only / shared triple counts + triples."},{"name":"brainkb_capabilities","description":"(Admin only) Show a user's roles, effective capabilities, and delegated\n    grants. Useful to check why someone can/can't create team spaces, ingest, etc."},{"name":"brainkb_grant_capability","description":"(Admin only) Delegate a capability to a user — e.g. 'create_team_space' or\n    'manage_team_space' so a Curator/Lab Member can create/manage team spaces.\n    Gr"},{"name":"brainkb_revoke_capability","description":"(Admin only) Revoke a previously granted capability from a user."},{"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 a"},{"name":"brainkb_role_capabilities","description":"(Admin only) List the capabilities granted to a role/group (e.g.\n    'uk_collaborator', 'Lab Member')."},{"name":"brainkb_grant_role_capability","description":"(Admin only) Grant a capability to a whole role/group so EVERY member gets\n    it — e.g. give a custom group 'uk_collaborator' the 'ingest' or\n    'create_priva"},{"name":"brainkb_revoke_role_capability","description":"(Admin only) Revoke a capability from a role/group."},{"name":"brainkb_list_access_rules","description":"List a space's fine-grained access rules (member/manager of the space)."},{"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') | 'me"},{"name":"brainkb_remove_access_rule","description":"(Space manager) Delete a fine-grained access rule by its id\n    (see brainkb_list_access_rules)."},{"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."},{"name":"brainkb_available_roles","description":"(Admin) List the available roles/groups (Admin, Lab Member, Curator, …)."},{"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."},{"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  "},{"name":"brainkb_remove_role","description":"(Admin) Remove a role/group from a user by email."},{"name":"brainkb_activate_user","description":"(Admin) Activate a user's account (sets the JWT user active) by email."},{"name":"brainkb_deactivate_user","description":"(Admin) Deactivate a user's account by email."},{"name":"brainkb_ban_user","description":"(Admin) Ban a user by email (reversible; preserves history). This is how\n    accounts are removed — there is NO hard delete. Banning an Admin is\n    SuperAdmin-"},{"name":"brainkb_unban_user","description":"(Admin) Lift a ban on a user by email."},{"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   "},{"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 usermanageme"}],"package":null},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"mcp_registry","key":"org.brainkb/brainkb","url":"https://registry.modelcontextprotocol.io/v0/servers/org.brainkb%2Fbrainkb","firstSeenAt":"2026-09-07T08:20:10.574Z","fetchedAt":"2026-09-07T08:20:10.574Z","normalizedAt":"2026-09-07T08:20:10.574Z"}]},"firstSeenAt":"2026-09-07T08:20:10.574Z","updatedAt":"2026-09-07T23:35:17.475Z"}