{
  "data": {
    "tool": {
      "category": "",
      "endpoint": "https://mcp.brainkb.org/mcp",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/brainkb.json",
      "kind": "mcp",
      "listed": "indexed",
      "liveUrl": "https://www.anchorterminal.com/api/v1/live/brainkb.json",
      "markdownUrl": "https://www.anchorterminal.com/tools/brainkb.md",
      "mcpTools": {
        "check": {
          "checker": "anchor-check/1.0",
          "totalTokens": 6951,
          "counts": {
            "error": 0,
            "note": 5,
            "warn": 102
          },
          "findings": [
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_activate_user",
              "message": "its one parameter, email, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_add_access_rule",
              "message": "2 parameters without a description: slug, subject_value",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_add_space_graph",
              "message": "none of its 3 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_add_space_member",
              "message": "none of its 3 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_assign_role",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_ban_user",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_capabilities",
              "message": "its one parameter, member, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_create_permission",
              "message": "none of its 4 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_create_role",
              "message": "none of its 3 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_create_space",
              "message": "1 parameter without a description: name",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_create_token",
              "message": "1 parameter without a description: days",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_deactivate_user",
              "message": "its one parameter, email, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_delta",
              "message": "its one parameter, job_id, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_delta_compare",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_delta_history",
              "message": "its one parameter, named_graph_iri, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_discard_upload",
              "message": "its one parameter, upload_id, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_finish_login",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_globus_login",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_grant_capability",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_grant_role_capability",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_ingest_files",
              "message": "none of its 3 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_ingest_text",
              "message": "none of its 4 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_ingest_upload",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_job_status",
              "message": "its one parameter, job_id, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_list_access_rules",
              "message": "its one parameter, slug, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_list_jobs",
              "message": "its one parameter, limit, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_list_users",
              "message": "none of its 3 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_login",
              "message": "none of its 3 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_provenance_graph",
              "message": "its one parameter, named_graph_iri, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_provenance_job",
              "message": "its one parameter, job_id, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_qa_list",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_qa_run",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_read_space",
              "message": "its one parameter, slug, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_recover_job",
              "message": "its one parameter, job_id, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_remove_access_rule",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_remove_role",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_revoke_capability",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_revoke_role_capability",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_revoke_token",
              "message": "its one parameter, token_id, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_role_capabilities",
              "message": "its one parameter, role, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_search",
              "message": "none of its 4 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_set_space_visibility",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_sparql",
              "message": "its one parameter, sparql_query, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_unban_user",
              "message": "its one parameter, email, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_upload_status",
              "message": "its one parameter, upload_id, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "brainkb_use_token",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_activate_user",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_add_access_rule",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_add_space_graph",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_add_space_member",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_assign_role",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_available_roles",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_ban_user",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_capabilities",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_create_permission",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_create_role",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_create_space",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_create_token",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_deactivate_user",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_delta",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_delta_compare",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_delta_history",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_discard_upload",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_finish_login",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_globus_login",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_grant_capability",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_grant_role_capability",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_ingest_files",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_ingest_text",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_ingest_upload",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_job_status",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"status\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_list_access_rules",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"list\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_list_capabilities",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"list\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_list_jobs",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"list\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_list_permissions",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"list\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_list_registered_graphs",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"list\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_list_spaces",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"list\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_list_tokens",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"list\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_list_uploads",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"list\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_list_users",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"list\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_login",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_logout",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_provenance_graph",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_provenance_job",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_qa_list",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"list\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_qa_run",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_read_space",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"read\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_recover_job",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_remove_access_rule",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_remove_role",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_revoke_capability",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_revoke_role_capability",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_revoke_token",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_role_capabilities",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_search",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"search\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_set_space_visibility",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_sparql",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_unban_user",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_upload_status",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_use_token",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "brainkb_whoami",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"whoami\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC23",
              "severity": "warn",
              "message": "55 tools",
              "fix": "Offer a smaller default toolset and let clients opt into the rest."
            },
            {
              "rule": "TC11",
              "severity": "note",
              "tool": "brainkb_add_access_rule",
              "message": "parameters are documented in the description but not in the schema: action, subject_type",
              "fix": "Put each one in its property's description (in Python: Annotated[str, Field(description=...)])."
            },
            {
              "rule": "TC11",
              "severity": "note",
              "tool": "brainkb_create_space",
              "message": "parameters are documented in the description but not in the schema: description, slug, space_type, visibility",
              "fix": "Put each one in its property's description (in Python: Annotated[str, Field(description=...)])."
            },
            {
              "rule": "TC11",
              "severity": "note",
              "tool": "brainkb_create_token",
              "message": "a parameter is documented in the description but not in the schema: name",
              "fix": "Put each one in its property's description (in Python: Annotated[str, Field(description=...)])."
            },
            {
              "rule": "TC24",
              "severity": "note",
              "message": "49 of 55 tools have no outputSchema",
              "fix": "Declare outputSchema for tools that return structured data, and return structuredContent that matches it."
            },
            {
              "rule": "TC29",
              "severity": "note",
              "message": "about 1,089 tokens (15% of the definitions) are titles that repeat property or function names",
              "fix": "Strip \"title\" keys that only restate a name before listing tools."
            }
          ]
        },
        "checkedAt": "2026-10-03T22:18:34Z",
        "count": 55,
        "schemaTokens": 6951,
        "status": "ok",
        "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    Uses single sign-on: one login mints a refresh token, cached for THIS session,\n    which is exchanged on demand for per-service access tokens (query_service,\n    usermanagement, …). Falls back to a legacy per-service token if the backend\n    has no SSO. On the hosted multi-user remote you can skip this and instead have\n    your client send an 'Authorization: Bearer \u003ctoken\u003e' header (a refresh token\n    unlocks all services).",
            "inputSchema": {
              "properties": {
                "base_url": {
                  "default": "",
                  "title": "Base Url",
                  "type": "string"
                },
                "email": {
                  "title": "Email",
                  "type": "string"
                },
                "password": {
                  "title": "Password",
                  "type": "string"
                }
              },
              "required": [
                "email",
                "password"
              ],
              "title": "brainkb_loginArguments",
              "type": "object"
            },
            "outputSchema": {
              "properties": {
                "result": {
                  "title": "Result",
                  "type": "string"
                }
              },
              "required": [
                "result"
              ],
              "title": "brainkb_loginOutput",
              "type": "object"
            }
          },
          {
            "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    password. Returns a URL to open in a browser; after signing in, the page shows\n    a short one-time code — pass it to brainkb_finish_login(code) to complete.\n    (The browser step is unavoidable: only the user can consent at the provider.)",
            "inputSchema": {
              "properties": {
                "base_url": {
                  "default": "",
                  "title": "Base Url",
                  "type": "string"
                },
                "provider": {
                  "default": "globus",
                  "title": "Provider",
                  "type": "string"
                }
              },
              "title": "brainkb_globus_loginArguments",
              "type": "object"
            },
            "outputSchema": {
              "properties": {
                "result": {
                  "title": "Result",
                  "type": "string"
                }
              },
              "required": [
                "result"
              ],
              "title": "brainkb_globus_loginOutput",
              "type": "object"
            }
          },
          {
            "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    and never echoed back.",
            "inputSchema": {
              "properties": {
                "base_url": {
                  "default": "",
                  "title": "Base Url",
                  "type": "string"
                },
                "code": {
                  "title": "Code",
                  "type": "string"
                }
              },
              "required": [
                "code"
              ],
              "title": "brainkb_finish_loginArguments",
              "type": "object"
            },
            "outputSchema": {
              "properties": {
                "result": {
                  "title": "Result",
                  "type": "string"
                }
              },
              "required": [
                "result"
              ],
              "title": "brainkb_finish_loginOutput",
              "type": "object"
            }
          },
          {
            "name": "brainkb_logout",
            "description": "Forget the cached token for this session.",
            "inputSchema": {
              "properties": {},
              "title": "brainkb_logoutArguments",
              "type": "object"
            },
            "outputSchema": {
              "properties": {
                "result": {
                  "title": "Result",
                  "type": "string"
                }
              },
              "required": [
                "result"
              ],
              "title": "brainkb_logoutOutput",
              "type": "object"
            }
          },
          {
            "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    THIS SERVER talks to, which on a hosted deployment is an internal address and\n    says nothing about the caller's own machine.",
            "inputSchema": {
              "properties": {},
              "title": "brainkb_whoamiArguments",
              "type": "object"
            },
            "outputSchema": {
              "properties": {
                "result": {
                  "additionalProperties": true,
                  "title": "Result",
                  "type": "object"
                }
              },
              "required": [
                "result"
              ],
              "title": "brainkb_whoamiOutput",
              "type": "object"
            }
          },
          {
            "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": {
              "properties": {
                "days": {
                  "default": 90,
                  "title": "Days",
                  "type": "integer"
                },
                "name": {
                  "default": "",
                  "title": "Name",
                  "type": "string"
                }
              },
              "title": "brainkb_create_tokenArguments",
              "type": "object"
            }
          },
          {
            "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": {
              "properties": {},
              "title": "brainkb_list_tokensArguments",
              "type": "object"
            }
          },
          {
            "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": {
              "properties": {
                "token_id": {
                  "title": "Token Id",
                  "type": "integer"
                }
              },
              "required": [
                "token_id"
              ],
              "title": "brainkb_revoke_tokenArguments",
              "type": "object"
            }
          },
          {
            "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 it so subsequent calls authenticate with it. The token is never echoed.",
            "inputSchema": {
              "properties": {
                "base_url": {
                  "default": "",
                  "title": "Base Url",
                  "type": "string"
                },
                "token": {
                  "title": "Token",
                  "type": "string"
                }
              },
              "required": [
                "token"
              ],
              "title": "brainkb_use_tokenArguments",
              "type": "object"
            },
            "outputSchema": {
              "properties": {
                "result": {
                  "title": "Result",
                  "type": "string"
                }
              },
              "required": [
                "result"
              ],
              "title": "brainkb_use_tokenOutput",
              "type": "object"
            }
          },
          {
            "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      - is_owner:  they own the space\n      - access:    'owner' | 'member' | 'public' (how it's available to them)\n      - can_write: their space role permits ingest (owner/editor) — a real ingest\n                   also needs the 'ingest' capability + any per-space access rules.\n    Use this to tell the user which spaces they can read vs. write vs. only see as\n    public.",
            "inputSchema": {
              "properties": {},
              "title": "brainkb_list_spacesArguments",
              "type": "object"
            }
          },
          {
            "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 another slug; slugs are never reused/deleted).\n    visibility: 'private' or 'public';\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/SuperAdmin, or a user granted create_team_space).",
            "inputSchema": {
              "properties": {
                "description": {
                  "default": "",
                  "title": "Description",
                  "type": "string"
                },
                "name": {
                  "title": "Name",
                  "type": "string"
                },
                "slug": {
                  "title": "Slug",
                  "type": "string"
                },
                "space_type": {
                  "default": "individual",
                  "title": "Space Type",
                  "type": "string"
                },
                "visibility": {
                  "default": "private",
                  "title": "Visibility",
                  "type": "string"
                }
              },
              "required": [
                "slug",
                "name"
              ],
              "title": "brainkb_create_spaceArguments",
              "type": "object"
            }
          },
          {
            "name": "brainkb_set_space_visibility",
            "description": "Set a space 'public' (anyone, even anonymous, can read) or 'private'\n    (members only). Owner only.",
            "inputSchema": {
              "properties": {
                "slug": {
                  "title": "Slug",
                  "type": "string"
                },
                "visibility": {
                  "title": "Visibility",
                  "type": "string"
                }
              },
              "required": [
                "slug",
                "visibility"
              ],
              "title": "brainkb_set_space_visibilityArguments",
              "type": "object"
            }
          },
          {
            "name": "brainkb_add_space_member",
            "description": "Add/update a space member. role: 'owner' | 'editor' | 'viewer'. Owner only.",
            "inputSchema": {
              "properties": {
                "member_email": {
                  "title": "Member Email",
                  "type": "string"
                },
                "role": {
                  "default": "viewer",
                  "title": "Role",
                  "type": "string"
                },
                "slug": {
                  "title": "Slug",
                  "type": "string"
                }
              },
              "required": [
                "slug",
                "member_email"
              ],
              "title": "brainkb_add_space_memberArguments",
              "type": "object"
            }
          },
          {
            "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": {
              "properties": {
                "description": {
                  "default": "",
                  "title": "Description",
                  "type": "string"
                },
                "named_graph_iri": {
                  "title": "Named Graph Iri",
                  "type": "string"
                },
                "slug": {
                  "title": "Slug",
                  "type": "string"
                }
              },
              "required": [
                "slug",
                "named_graph_iri"
              ],
              "title": "brainkb_add_space_graphArguments",
              "type": "object"
            }
          },
          {
            "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    brainkb_job_status. The graph must be registered (see brainkb_add_space_graph)\n    and the caller must have write access to its space.\n\n    `sha256` / `expected_bytes` are an integrity contract, and you should use them\n    whenever the RDF came from a file. Ingest is append-only — no delete for\n    triples, no unregister for a graph — so RDF that arrives here mangled is\n    permanent. Because `data` is a string, it passes through the caller's context,\n    where dense Turtle is exactly what gets silently altered: ligatures, Greek\n    letters, embedded newlines, escaped quotes. Declare the digest of the bytes you\n    MEANT to send (`shasum -a 256 file.ttl`) and this refuses the write on any\n    mismatch, turning an unrecoverable corruption into a clean rejection.\n    ",
            "inputSchema": {
              "properties": {
                "data": {
                  "title": "Data",
                  "type": "string"
                },
                "expected_bytes": {
                  "default": 0,
                  "title": "Expected Bytes",
                  "type": "integer"
                },
                "named_graph_iri": {
                  "title": "Named Graph Iri",
                  "type": "string"
                },
                "sha256": {
                  "default": "",
                  "title": "Sha256",
                  "type": "string"
                }
              },
              "required": [
                "named_graph_iri",
                "data"
              ],
              "title": "brainkb_ingest_textArguments",
              "type": "object"
            }
          },
          {
            "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": {
              "properties": {},
              "title": "brainkb_list_uploadsArguments",
              "type": "object"
            }
          },
          {
            "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": {
              "properties": {
                "upload_id": {
                  "title": "Upload Id",
                  "type": "string"
                }
              },
              "required": [
                "upload_id"
              ],
              "title": "brainkb_upload_statusArguments",
              "type": "object"
            }
          },
          {
            "name": "brainkb_discard_upload",
            "description": "Delete one of your staged uploads without ingesting it.",
            "inputSchema": {
              "properties": {
                "upload_id": {
                  "title": "Upload Id",
                  "type": "string"
                }
              },
              "required": [
                "upload_id"
              ],
              "title": "brainkb_discard_uploadArguments",
              "type": "object"
            }
          },
          {
            "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 identity and silently detaches triples, permanently).\n\n    Stage a file with any HTTP client — the point is that the LIBRARY reads the file,\n    so the bytes never pass through a model:\n\n        import requests, hashlib, pathlib\n        f = pathlib.Path(\"review.ttl\")\n        r = requests.post(\n            \"https://mcp.brainkb.org/upload\",\n            params={\"filename\": f.name,\n                    \"sha256\": hashlib.sha256(f.read_bytes()).hexdigest()},\n            headers={\"Authorization\": f\"Bearer {TOKEN}\"},\n            data=f.open(\"rb\"),          # streamed — never loaded into memory\n        )\n        print(r.json())                 # -\u003e {\"upload_id\": \"up_...\", \"state\": \"staged\"}\n\n    It returns an upload_id and the sha256 the server computed — compare it with your\n    own before ingesting.\n\n    Returns a job_id; poll brainkb_job_status, then reconcile brainkb_delta(job_id)\n    against the triple count you expected. The staged copy is deleted once the\n    ingest API has accepted the bytes.\n    ",
            "inputSchema": {
              "properties": {
                "named_graph_iri": {
                  "title": "Named Graph Iri",
                  "type": "string"
                },
                "upload_id": {
                  "title": "Upload Id",
                  "type": "string"
                }
              },
              "required": [
                "named_graph_iri",
                "upload_id"
              ],
              "title": "brainkb_ingest_uploadArguments",
              "type": "object"
            }
          },
          {
            "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.",
            "inputSchema": {
              "properties": {
                "file_paths": {
                  "items": {
                    "type": "string"
                  },
                  "title": "File Paths",
                  "type": "array"
                },
                "max_concurrency": {
                  "default": 8,
                  "title": "Max Concurrency",
                  "type": "integer"
                },
                "named_graph_iri": {
                  "title": "Named Graph Iri",
                  "type": "string"
                }
              },
              "required": [
                "named_graph_iri",
                "file_paths"
              ],
              "title": "brainkb_ingest_filesArguments",
              "type": "object"
            }
          },
          {
            "name": "brainkb_list_jobs",
            "description": "List the user's ingest jobs (newest first) with status and progress.",
            "inputSchema": {
              "properties": {
                "limit": {
                  "default": 50,
                  "title": "Limit",
                  "type": "integer"
                }
              },
              "title": "brainkb_list_jobsArguments",
              "type": "object"
            }
          },
          {
            "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": {
              "properties": {
                "job_id": {
                  "title": "Job Id",
                  "type": "string"
                }
              },
              "required": [
                "job_id"
              ],
              "title": "brainkb_job_statusArguments",
              "type": "object"
            }
          },
          {
            "name": "brainkb_recover_job",
            "description": "Attempt to recover a stuck/errored ingest job (marks it recoverable/errored).",
            "inputSchema": {
              "properties": {
                "job_id": {
                  "title": "Job Id",
                  "type": "string"
                }
              },
              "required": [
                "job_id"
              ],
              "title": "brainkb_recover_jobArguments",
              "type": "object"
            }
          },
          {
            "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    Anonymous/other users never see private-space data.",
            "inputSchema": {
              "properties": {
                "limit": {
                  "default": 25,
                  "title": "Limit",
                  "type": "integer"
                },
                "offset": {
                  "default": 0,
                  "title": "Offset",
                  "type": "integer"
                },
                "q": {
                  "title": "Q",
                  "type": "string"
                },
                "space": {
                  "default": "",
                  "title": "Space",
                  "type": "string"
                }
              },
              "required": [
                "q"
              ],
              "title": "brainkb_searchArguments",
              "type": "object"
            }
          },
          {
            "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.",
            "inputSchema": {
              "properties": {
                "slug": {
                  "title": "Slug",
                  "type": "string"
                }
              },
              "required": [
                "slug"
              ],
              "title": "brainkb_read_spaceArguments",
              "type": "object"
            }
          },
          {
            "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": {
              "properties": {},
              "title": "brainkb_list_registered_graphsArguments",
              "type": "object"
            }
          },
          {
            "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_read_space, or the provenance/delta tools, which need no admin role.",
            "inputSchema": {
              "properties": {
                "sparql_query": {
                  "title": "Sparql Query",
                  "type": "string"
                }
              },
              "required": [
                "sparql_query"
              ],
              "title": "brainkb_sparqlArguments",
              "type": "object"
            }
          },
          {
            "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() -\u003e 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=\"\u003cname\u003e\") -\u003e that category's queries. Each has\n       `question` (what it answers), `notes` (when to use it, where parameter\n       values come from, what the results mean), `params` (required ones have\n       no default — ask the user rather than guess) and a working `example`.\n\n    `search=\"words\"` filters queries by words in their id/question/notes; use it\n    alone to search every category when none of the descriptions fits.\n    ",
            "inputSchema": {
              "properties": {
                "category": {
                  "default": "",
                  "title": "Category",
                  "type": "string"
                },
                "search": {
                  "default": "",
                  "title": "Search",
                  "type": "string"
                }
              },
              "title": "brainkb_qa_listArguments",
              "type": "object"
            }
          },
          {
            "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": {
              "properties": {
                "params": {
                  "anyOf": [
                    {
                      "additionalProperties": true,
                      "type": "object"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "default": null,
                  "title": "Params"
                },
                "query_id": {
                  "title": "Query Id",
                  "type": "string"
                }
              },
              "required": [
                "query_id"
              ],
              "title": "brainkb_qa_runArguments",
              "type": "object"
            }
          },
          {
            "name": "brainkb_provenance_job",
            "description": "PROV-O provenance bundle (JSON-LD) for one ingest job.",
            "inputSchema": {
              "properties": {
                "job_id": {
                  "title": "Job Id",
                  "type": "string"
                }
              },
              "required": [
                "job_id"
              ],
              "title": "brainkb_provenance_jobArguments",
              "type": "object"
            }
          },
          {
            "name": "brainkb_provenance_graph",
            "description": "PROV-O ingestion/activity history (JSON-LD) for a named graph.",
            "inputSchema": {
              "properties": {
                "named_graph_iri": {
                  "title": "Named Graph Iri",
                  "type": "string"
                }
              },
              "required": [
                "named_graph_iri"
              ],
              "title": "brainkb_provenance_graphArguments",
              "type": "object"
            }
          },
          {
            "name": "brainkb_delta",
            "description": "The exact triples a job added (its delta), as JSON-LD.",
            "inputSchema": {
              "properties": {
                "job_id": {
                  "title": "Job Id",
                  "type": "string"
                }
              },
              "required": [
                "job_id"
              ],
              "title": "brainkb_deltaArguments",
              "type": "object"
            }
          },
          {
            "name": "brainkb_delta_history",
            "description": "A named graph's change history: one entry per ingest delta (job, triple\n    count, timestamp), newest first.",
            "inputSchema": {
              "properties": {
                "named_graph_iri": {
                  "title": "Named Graph Iri",
                  "type": "string"
                }
              },
              "required": [
                "named_graph_iri"
              ],
              "title": "brainkb_delta_historyArguments",
              "type": "object"
            }
          },
          {
            "name": "brainkb_delta_compare",
            "description": "Compare two jobs' deltas: A-only / B-only / shared triple counts + triples.",
            "inputSchema": {
              "properties": {
                "job_id_a": {
                  "title": "Job Id A",
                  "type": "string"
                },
                "job_id_b": {
                  "title": "Job Id B",
                  "type": "string"
                }
              },
              "required": [
                "job_id_a",
                "job_id_b"
              ],
              "title": "brainkb_delta_compareArguments",
              "type": "object"
            }
          },
          {
            "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.",
            "inputSchema": {
              "properties": {
                "member": {
                  "title": "Member",
                  "type": "string"
                }
              },
              "required": [
                "member"
              ],
              "title": "brainkb_capabilitiesArguments",
              "type": "object"
            }
          },
          {
            "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    Grantable: create_private_space, create_team_space, manage_team_space, ingest,\n    recover, read_private (NOT the admin-only 'grant'/'sparql_admin').",
            "inputSchema": {
              "properties": {
                "capability": {
                  "title": "Capability",
                  "type": "string"
                },
                "member": {
                  "title": "Member",
                  "type": "string"
                }
              },
              "required": [
                "member",
                "capability"
              ],
              "title": "brainkb_grant_capabilityArguments",
              "type": "object"
            }
          },
          {
            "name": "brainkb_revoke_capability",
            "description": "(Admin only) Revoke a previously granted capability from a user.",
            "inputSchema": {
              "properties": {
                "capability": {
                  "title": "Capability",
                  "type": "string"
                },
                "member": {
                  "title": "Member",
                  "type": "string"
                }
              },
              "required": [
                "member",
                "capability"
              ],
              "title": "brainkb_revoke_capabilityArguments",
              "type": "object"
            }
          },
          {
            "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": {
              "properties": {},
              "title": "brainkb_list_capabilitiesArguments",
              "type": "object"
            }
          },
          {
            "name": "brainkb_role_capabilities",
            "description": "(Admin only) List the capabilities granted to a role/group (e.g.\n    'uk_collaborator', 'Lab Member').",
            "inputSchema": {
              "properties": {
                "role": {
                  "title": "Role",
                  "type": "string"
                }
              },
              "required": [
                "role"
              ],
              "title": "brainkb_role_capabilitiesArguments",
              "type": "object"
            }
          },
          {
            "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_private_space' capability. Grantable: create_private_space,\n    create_team_space, manage_team_space, ingest, recover, read_private (NOT the\n    admin-only 'grant'/'sparql_admin'). Create the group first with\n    brainkb_create_role, then assign it to users with brainkb_assign_role.",
            "inputSchema": {
              "properties": {
                "capability": {
                  "title": "Capability",
                  "type": "string"
                },
                "role": {
                  "title": "Role",
                  "type": "string"
                }
              },
              "required": [
                "role",
                "capability"
              ],
              "title": "brainkb_grant_role_capabilityArguments",
              "type": "object"
            }
          },
          {
            "name": "brainkb_revoke_role_capability",
            "description": "(Admin only) Revoke a capability from a role/group.",
            "inputSchema": {
              "properties": {
                "capability": {
                  "title": "Capability",
                  "type": "string"
                },
                "role": {
                  "title": "Role",
                  "type": "string"
                }
              },
              "required": [
                "role",
                "capability"
              ],
              "title": "brainkb_revoke_role_capabilityArguments",
              "type": "object"
            }
          },
          {
            "name": "brainkb_list_access_rules",
            "description": "List a space's fine-grained access rules (member/manager of the space).",
            "inputSchema": {
              "properties": {
                "slug": {
                  "title": "Slug",
                  "type": "string"
                }
              },
              "required": [
                "slug"
              ],
              "title": "brainkb_list_access_rulesArguments",
              "type": "object"
            }
          },
          {
            "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 \u003e=).\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 -\u003e action='write', subject_type='global_role', subject_value='Admin'.",
            "inputSchema": {
              "properties": {
                "action": {
                  "title": "Action",
                  "type": "string"
                },
                "slug": {
                  "title": "Slug",
                  "type": "string"
                },
                "subject_type": {
                  "title": "Subject Type",
                  "type": "string"
                },
                "subject_value": {
                  "title": "Subject Value",
                  "type": "string"
                }
              },
              "required": [
                "slug",
                "action",
                "subject_type",
                "subject_value"
              ],
              "title": "brainkb_add_access_ruleArguments",
              "type": "object"
            }
          },
          {
            "name": "brainkb_remove_access_rule",
            "description": "(Space manager) Delete a fine-grained access rule by its id\n    (see brainkb_list_access_rules).",
            "inputSchema": {
              "properties": {
                "rule_id": {
                  "title": "Rule Id",
                  "type": "integer"
                },
                "slug": {
                  "title": "Slug",
                  "type": "string"
                }
              },
              "required": [
                "slug",
                "rule_id"
              ],
              "title": "brainkb_remove_access_ruleArguments",
              "type": "object"
            }
          },
          {
            "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": {
              "properties": {
                "limit": {
                  "default": 50,
                  "title": "Limit",
                  "type": "integer"
                },
                "q": {
                  "default": "",
                  "title": "Q",
                  "type": "string"
                },
                "role": {
                  "default": "",
                  "title": "Role",
                  "type": "string"
                }
              },
              "title": "brainkb_list_usersArguments",
              "type": "object"
            }
          },
          {
            "name": "brainkb_available_roles",
            "description": "(Admin) List the available roles/groups (Admin, Lab Member, Curator, …).",
            "inputSchema": {
              "properties": {},
              "title": "brainkb_available_rolesArguments",
              "type": "object"
            }
          },
          {
            "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": {
              "properties": {
                "category": {
                  "default": "Content",
                  "title": "Category",
                  "type": "string"
                },
                "description": {
                  "default": "",
                  "title": "Description",
                  "type": "string"
                },
                "name": {
                  "title": "Name",
                  "type": "string"
                }
              },
              "required": [
                "name"
              ],
              "title": "brainkb_create_roleArguments",
              "type": "object"
            }
          },
          {
            "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 \u003e Admin).",
            "inputSchema": {
              "properties": {
                "email": {
                  "title": "Email",
                  "type": "string"
                },
                "role": {
                  "title": "Role",
                  "type": "string"
                }
              },
              "required": [
                "email",
                "role"
              ],
              "title": "brainkb_assign_roleArguments",
              "type": "object"
            }
          },
          {
            "name": "brainkb_remove_role",
            "description": "(Admin) Remove a role/group from a user by email.",
            "inputSchema": {
              "properties": {
                "email": {
                  "title": "Email",
                  "type": "string"
                },
                "role": {
                  "title": "Role",
                  "type": "string"
                }
              },
              "required": [
                "email",
                "role"
              ],
              "title": "brainkb_remove_roleArguments",
              "type": "object"
            }
          },
          {
            "name": "brainkb_activate_user",
            "description": "(Admin) Activate a user's account (sets the JWT user active) by email.",
            "inputSchema": {
              "properties": {
                "email": {
                  "title": "Email",
                  "type": "string"
                }
              },
              "required": [
                "email"
              ],
              "title": "brainkb_activate_userArguments",
              "type": "object"
            }
          },
          {
            "name": "brainkb_deactivate_user",
            "description": "(Admin) Deactivate a user's account by email.",
            "inputSchema": {
              "properties": {
                "email": {
                  "title": "Email",
                  "type": "string"
                }
              },
              "required": [
                "email"
              ],
              "title": "brainkb_deactivate_userArguments",
              "type": "object"
            }
          },
          {
            "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-only; SuperAdmin accounts cannot be banned.",
            "inputSchema": {
              "properties": {
                "email": {
                  "title": "Email",
                  "type": "string"
                },
                "reason": {
                  "title": "Reason",
                  "type": "string"
                }
              },
              "required": [
                "email",
                "reason"
              ],
              "title": "brainkb_ban_userArguments",
              "type": "object"
            }
          },
          {
            "name": "brainkb_unban_user",
            "description": "(Admin) Lift a ban on a user by email.",
            "inputSchema": {
              "properties": {
                "email": {
                  "title": "Email",
                  "type": "string"
                }
              },
              "required": [
                "email"
              ],
              "title": "brainkb_unban_userArguments",
              "type": "object"
            }
          },
          {
            "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": {
              "properties": {},
              "title": "brainkb_list_permissionsArguments",
              "type": "object"
            }
          },
          {
            "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": {
              "properties": {
                "action": {
                  "title": "Action",
                  "type": "string"
                },
                "description": {
                  "default": "",
                  "title": "Description",
                  "type": "string"
                },
                "name": {
                  "title": "Name",
                  "type": "string"
                },
                "resource": {
                  "title": "Resource",
                  "type": "string"
                }
              },
              "required": [
                "name",
                "resource",
                "action"
              ],
              "title": "brainkb_create_permissionArguments",
              "type": "object"
            }
          }
        ]
      },
      "name": "brainkb",
      "note": "Indexed from the official MCP registry: facts and our own checks, not reviewed, so no score, grade or rank.",
      "packages": null,
      "pageJsonUrl": "https://www.anchorterminal.com/tools/brainkb.json",
      "popularity": {
        "githubStars": 5
      },
      "registryName": "org.brainkb/brainkb",
      "remotes": [
        {
          "type": "streamable-http",
          "url": "https://mcp.brainkb.org/mcp"
        }
      ],
      "repository": "https://github.com/sensein/BrainKB",
      "reviewed": false,
      "slug": "brainkb",
      "source": "the official MCP registry",
      "sourceUrl": "https://registry.modelcontextprotocol.io/v0.1/servers?search=org.brainkb/brainkb",
      "summary": "MCP server for querying BrainKB, a knowledge base for neuroscience knowledge graphs.",
      "updatedAt": "2026-07-23T19:16:50Z",
      "url": "https://www.anchorterminal.com/tools/brainkb",
      "vendor": "brainkb.org",
      "vendorUrl": "https://brainkb.org",
      "version": "0.1.0",
      "websiteUrl": "",
      "where": "hosted",
      "why": [
        "vendor"
      ]
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/tools/brainkb",
    "json": "https://www.anchorterminal.com/tools/brainkb.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/tools/brainkb.md",
    "slim": "https://www.anchorterminal.com/tools/brainkb.min.md"
  },
  "markdown": "# brainkb\n\n\u003e Indexed, not reviewed: facts from the official MCP registry and our own checks. No score, grade or rank, and not in the rankings until the panel reviews it. How the index works: https://www.anchorterminal.com/indexed/\n\n- Kind: MCP server, by brainkb.org (https://brainkb.org)\n- Listed because: It's published in the registry under brainkb.org, a namespace the registry only gives to whoever proves they control that domain.\n- What the official MCP registry says: MCP server for querying BrainKB, a knowledge base for neuroscience knowledge graphs.\n\n## Facts\n\n- MCP registry: `org.brainkb/brainkb` 0.1.0\n- Endpoint: https://mcp.brainkb.org/mcp (streamable HTTP)\n- Source: https://github.com/sensein/BrainKB\n- GitHub stars: 5\n- Registry entry updated: 2026-07-23\n\n## Tools\n\n- Tools it lists (55, about 6,951 tokens of context, `tools/list` without credentials over MCP 2025-11-25, checked 2026-10-03 22:18 UTC):\n  - `brainkb_login`: Authenticate to BrainKB with the user's credentials and cache the JWT for THIS session only (isolated per caller). The password/token are never echoed. Uses…\n  - `brainkb_globus_login`: Start an OAuth login (Globus / ORCID / GitHub) for THIS session — use this instead of brainkb_login when the user signs in with Globus rather than a password.…\n  - `brainkb_finish_login`: Complete an OAuth login started with brainkb_globus_login by exchanging the one-time code shown in the browser for a session token. The code is single-use and…\n  - `brainkb_logout`: Forget the cached token for this session.\n  - `brainkb_whoami`: Report the current caller's auth state (email, authenticated, and when the cached session expires). When signed in it also returns base_url — the backend THIS…\n  - `brainkb_create_token`: Generate a Personal Access Token (PAT) for browser-free auth. Requires you to be logged in already (brainkb_login or brainkb_globus_login). The token is shown…\n  - `brainkb_list_tokens`: List your Personal Access Tokens (metadata only — the secret is never shown): id, name, prefix, created/last-used/expiry, and whether each is…\n  - `brainkb_revoke_token`: Revoke one of your Personal Access Tokens by id (see brainkb_list_tokens). Takes effect immediately — the next call using that token fails.\n  - `brainkb_use_token`: Use a Personal Access Token (brainkb_pat_...) for THIS session — an alternative to setting BRAINKB_TOKEN in the config. Validates the token, then caches it so…\n  - `brainkb_list_spaces`: List spaces the user can see (their own/member spaces + public ones), each annotated with THIS caller's permission so you know what they may do: - your_role:…\n  - `brainkb_create_space`: Create a workspace/space. The caller becomes owner. slug: lowercase/hyphen id, **globally unique** — if it's already taken the call returns 409 (pick another…\n  - `brainkb_set_space_visibility`: Set a space 'public' (anyone, even anonymous, can read) or 'private' (members only). Owner only.\n  - `brainkb_add_space_member`: Add/update a space member. role: 'owner' | 'editor' | 'viewer'. Owner only.\n  - `brainkb_add_space_graph`: Register a named graph and bind it to a space, so ingest/read on that graph are governed by the space's membership and visibility. Owner/editor only. The…\n  - `brainkb_ingest_text`: Ingest raw RDF text (Turtle / N-Triples / JSON-LD, auto-detected) into a named graph. Returns a job_id; ingestion runs in the background — poll with…\n  - `brainkb_list_uploads`: List RDF files YOU have staged with POST /upload but not yet ingested. Shows each upload_id, its size, sha256 and when it expires. Only your own uploads are…\n  - `brainkb_upload_status`: State of one of your staged/submitted uploads. `state` is `staged` (waiting for brainkb_ingest_upload), `submitting` (the server is streaming it to the ingest…\n  - `brainkb_discard_upload`: Delete one of your staged uploads without ingesting it.\n  - `brainkb_ingest_upload`: Ingest a file you staged with `POST /upload` into a named graph. This is the route for a large local file: your HTTP client streams the bytes straight to this…\n  - `brainkb_ingest_files`: Ingest local RDF files (ttl/nt/nq/rdf/owl/jsonld/json) into a named graph. Returns a job_id; runs in the background — poll with brainkb_job_status.\n  - `brainkb_list_jobs`: List the user's ingest jobs (newest first) with status and progress.\n  - `brainkb_job_status`: Detailed status of one ingest job: status, progress %, current file/stage, per-file failures, and (when complete) a summary.\n  - `brainkb_recover_job`: Attempt to recover a stuck/errored ingest job (marks it recoverable/errored).\n  - `brainkb_search`: Full-text search over the knowledge graphs, access-filtered by space visibility. Pass `space` to scope to one workspace, omit for a full search.…\n  - `brainkb_read_space`: Read all RDF (JSON-LD) in a space's graphs. Public spaces are readable by anyone; private spaces require membership.\n  - `brainkb_list_registered_graphs`: List registered named graphs visible to the caller (private-space graphs the caller can't access are hidden).\n  - `brainkb_sparql`: Run an arbitrary SPARQL query. Requires an Admin/SuperAdmin role (the sparql_admin capability) — for ordinary questions prefer brainkb_search,…\n  - `brainkb_qa_list`: 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…\n  - `brainkb_qa_run`: 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…\n  - `brainkb_provenance_job`: PROV-O provenance bundle (JSON-LD) for one ingest job.\n  - `brainkb_provenance_graph`: PROV-O ingestion/activity history (JSON-LD) for a named graph.\n  - `brainkb_delta`: The exact triples a job added (its delta), as JSON-LD.\n  - `brainkb_delta_history`: A named graph's change history: one entry per ingest delta (job, triple count, timestamp), newest first.\n  - `brainkb_delta_compare`: Compare two jobs' deltas: A-only / B-only / shared triple counts + triples.\n  - `brainkb_capabilities`: (Admin only) Show a user's roles, effective capabilities, and delegated grants. Useful to check why someone can/can't create team spaces, ingest, etc.\n  - `brainkb_grant_capability`: (Admin only) Delegate a capability to a user — e.g. 'create_team_space' or 'manage_team_space' so a Curator/Lab Member can create/manage team spaces.…\n  - `brainkb_revoke_capability`: (Admin only) Revoke a previously granted capability from a user.\n  - `brainkb_list_capabilities`: (Admin only) Catalog of all KG capabilities, which are delegatable ('grantable'), which are admin-only, and a description of each. Use this to see the…\n  - `brainkb_role_capabilities`: (Admin only) List the capabilities granted to a role/group (e.g. 'uk_collaborator', 'Lab Member').\n  - `brainkb_grant_role_capability`: (Admin only) Grant a capability to a whole role/group so EVERY member gets it — e.g. give a custom group 'uk_collaborator' the 'ingest' or…\n  - `brainkb_revoke_role_capability`: (Admin only) Revoke a capability from a role/group.\n  - `brainkb_list_access_rules`: List a space's fine-grained access rules (member/manager of the space).\n  - `brainkb_add_access_rule`: (Space manager) Restrict a space action to a subject. action: 'read' | 'write' | 'manage'. subject_type: 'global_role' (e.g. 'Admin','Lab Member') | 'member'…\n  - `brainkb_remove_access_rule`: (Space manager) Delete a fine-grained access rule by its id (see brainkb_list_access_rules).\n  - `brainkb_list_users`: (Admin) List users (profiles) — filter by `q` (name/email/orcid) or `role`. Shows profile_id, email, roles, providers, ban status.\n  - `brainkb_available_roles`: (Admin) List the available roles/groups (Admin, Lab Member, Curator, …).\n  - `brainkb_create_role`: (Admin) Create a new role/group — e.g. an 'External' collaborator group — which can then be assigned with brainkb_assign_role.\n  - `brainkb_assign_role`: (Admin) Assign a role/group to a user by email (e.g. 'Lab Member', 'External', or a custom group). The user must already have a profile (created on first…\n  - `brainkb_remove_role`: (Admin) Remove a role/group from a user by email.\n  - `brainkb_activate_user`: (Admin) Activate a user's account (sets the JWT user active) by email.\n  - `brainkb_deactivate_user`: (Admin) Deactivate a user's account by email.\n  - `brainkb_ban_user`: (Admin) Ban a user by email (reversible; preserves history). This is how accounts are removed — there is NO hard delete. Banning an Admin is SuperAdmin-only;…\n  - `brainkb_unban_user`: (Admin) Lift a ban on a user by email.\n  - `brainkb_list_permissions`: (Admin) List all usermanagement permissions (resource/action pairs used for page-access and role-permission mapping). These are the addable 'permission'…\n  - `brainkb_create_permission`: (Admin) Create a new usermanagement permission, e.g. name='dataset.export', resource='dataset', action='export'. Attach it to roles via the usermanagement…\n- How its tools read to an agent (0 errors, 102 warnings, 5 notes, about 6,951 tokens; rules at https://www.anchorterminal.com/check.md; not part of the score):\n  - warn TC11 brainkb_activate_user: its one parameter, email, has no description\n  - warn TC11 brainkb_add_access_rule: 2 parameters without a description: slug, subject_value\n  - warn TC11 brainkb_add_space_graph: none of its 3 parameters has a description\n  - warn TC11 brainkb_add_space_member: none of its 3 parameters has a description\n  - warn TC11 brainkb_assign_role: none of its 2 parameters has a description\n  - warn TC11 brainkb_ban_user: none of its 2 parameters has a description\n  - warn TC11 brainkb_capabilities: its one parameter, member, has no description\n  - warn TC11 brainkb_create_permission: none of its 4 parameters has a description\n  - warn TC11 brainkb_create_role: none of its 3 parameters has a description\n  - warn TC11 brainkb_create_space: 1 parameter without a description: name\n  - warn TC11 brainkb_create_token: 1 parameter without a description: days\n  - warn TC11 brainkb_deactivate_user: its one parameter, email, has no description\n  - warn TC11 brainkb_delta: its one parameter, job_id, has no description\n  - warn TC11 brainkb_delta_compare: none of its 2 parameters has a description\n  - warn TC11 brainkb_delta_history: its one parameter, named_graph_iri, has no description\n  - warn TC11 brainkb_discard_upload: its one parameter, upload_id, has no description\n  - warn TC11 brainkb_finish_login: none of its 2 parameters has a description\n  - warn TC11 brainkb_globus_login: none of its 2 parameters has a description\n  - warn TC11 brainkb_grant_capability: none of its 2 parameters has a description\n  - warn TC11 brainkb_grant_role_capability: none of its 2 parameters has a description\n  - warn TC11 brainkb_ingest_files: none of its 3 parameters has a description\n  - warn TC11 brainkb_ingest_text: none of its 4 parameters has a description\n  - warn TC11 brainkb_ingest_upload: none of its 2 parameters has a description\n  - warn TC11 brainkb_job_status: its one parameter, job_id, has no description\n\n- JSON: https://www.anchorterminal.com/api/v1/tools/brainkb.json\n- Being indexed says nothing about quality, and nobody can pay for it. Ask for a review: https://www.anchorterminal.com/builders/#claiming\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-04",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.3",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run"
  },
  "page": {
    "breadcrumbs": [
      {
        "name": "Home",
        "url": "https://www.anchorterminal.com/"
      },
      {
        "name": "Terminal",
        "url": "https://www.anchorterminal.com/tools/"
      },
      {
        "name": "Indexed",
        "url": "https://www.anchorterminal.com/indexed/"
      },
      {
        "name": "brainkb",
        "url": ""
      }
    ],
    "description": "brainkb, an MCP server by brainkb.org, listed from the official MCP registry. Indexed, not reviewed: facts and our own checks, no score or ranking. MCP server for querying BrainKB, a knowledge base for neuroscience knowledge graphs.",
    "facts": [
      "not reviewed",
      "not ranked",
      "facts only"
    ],
    "h1": "brainkb",
    "image": "https://www.anchorterminal.com/assets/og/indexed.png",
    "path": "/tools/brainkb",
    "published": "",
    "section": "indexed",
    "title": "brainkb: MCP server, indexed from the official MCP registry",
    "toc": null,
    "updated": "2026-10-04",
    "url": "https://www.anchorterminal.com/tools/brainkb"
  },
  "tokens": {
    "markdown": 3050,
    "slim": 2980
  },
  "version": 1
}
