Koskamo

Brainz MCP

Brainz provides a shared product-knowledge graph for AI agent fleets, enabling agents to search concepts, retrieve context briefings, manage tasks, and self-provision accounts via MCP. It supports hybrid search, graph traversal, and local or hosted operation.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Brainz MCP logo, by BrownmatterVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by Brownmatter
You need:Create an API key in the dashboardPoint any MCP client at your hosted vault
MCP endpoint (Streamable HTTP)
https://brainz.brownmatter.ai/mcp
Vendor documentation

What you can do with it

  • Search product concepts and retrieve context briefings for subagents
  • Manage tasks and view status on a Kanban board
  • Self-provision a workspace via agent signup tool
  • Run locally from markdown files using the CLI

Source and maintenance

Vendor evidenceRegistry 0.1.0

Protocol and capabilities

Server
brainz-cloud 0.1.0
MCP protocol
2025-06-18
Tools
17 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

# Brainz — shared product knowledge graph This server is one Brainz vault: a product's features, specs, decisions, constraints and tasks, stored as linked markdown concepts. - `search_concepts`, `list_concepts`, `get_concept` and `get_related` find and read concepts; `get_context` assembles a token-budgeted briefing on a topic; `vault_stats` summarizes the vault. - `upsert_concept`, `link_concepts` and `delete_concept` edit the graph. - `list_tasks`, `create_task`, `take_task` and `complete_task` manage the vault's task pile. - `onboard` and `sync` return playbooks for indexing a codebase into the vault; `dream` runs or configures the consolidation sweep.

Tools

17 advertised

search_concepts — Search concepts
Advertised by the server during the last successful anonymous check.
Advertised read-only

Search the product knowledge vault by free-text query. Useful when you need product knowledge but don't yet know which concept ids exist. Returns ranked hits (id, title, type, score, snippet) only; get_concept returns one full note and get_context an assembled briefing. An empty hit list means nothing matched.

search_concepts input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "query"
  ],
  "properties": {
    "mode": {
      "enum": [
        "hybrid",
        "keyword",
        "semantic"
      ],
      "type": "string",
      "default": "hybrid",
      "description": "Search mode. \"hybrid\" (default) fuses keyword and semantic ranking; semantic silently falls back to keyword if embeddings are unavailable."
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Only return concepts carrying ALL of these tags."
    },
    "type": {
      "enum": [
        "concept",
        "domain",
        "feature",
        "story",
        "spec",
        "workflow",
        "task",
        "decision",
        "constraint",
        "pattern",
        "glossary"
      ],
      "type": "string",
      "description": "Only return concepts of this type."
    },
    "limit": {
      "type": "integer",
      "default": 10,
      "maximum": 50,
      "minimum": 1,
      "description": "Max hits to return (default 10)."
    },
    "query": {
      "type": "string",
      "description": "Free-text search query, e.g. \"lead scoring\" or \"session auth\"."
    },
    "product": {
      "type": "string",
      "description": "Only return concepts belonging to this product."
    }
  },
  "additionalProperties": false
}
search_concepts annotations
{
  "title": "Search concepts",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_concept — Get concept
Advertised by the server during the last successful anonymous check.
Advertised read-only

Fetch one concept by exact id: full markdown body, metadata, and its direct graph neighbors (each with the relation that connects it). Use after search_concepts or when another note wiki-links an id you need in full. The neighbors list tells you what to fetch next. If you don't know the id, use search_concepts instead.

get_concept input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Exact concept id (slug), e.g. \"lead-scoring\"."
    }
  },
  "additionalProperties": false
}
get_concept annotations
{
  "title": "Get concept",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_related — Get related concepts
Advertised by the server during the last successful anonymous check.
Advertised read-only

Walk the knowledge graph outward from a concept and return everything within `depth` hops, with distance and the edge path that reached it. Use to map the blast radius before changing a feature (what depends on it, what constrains it, which decisions apply) or to discover structure that keyword search misses. Filter by relation names (e.g. depends_on) to follow only one kind of edge.

get_related input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Concept id to start from."
    },
    "depth": {
      "type": "integer",
      "default": 1,
      "maximum": 3,
      "minimum": 1,
      "description": "How many hops to traverse (1-3, default 1)."
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "description": "Max related nodes to return."
    },
    "relations": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Only follow edges with these relation names, e.g. [\"depends_on\", \"part_of\"]."
    }
  },
  "additionalProperties": false
}
get_related annotations
{
  "title": "Get related concepts",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_context — Assemble context bundle
Advertised by the server during the last successful anonymous check.
Advertised read-only

Assemble a markdown briefing of the concepts most relevant to a query and/or explicit ids, expanded through the graph and trimmed to a token budget. The briefing is self-contained, so it can be handed to another agent or pasted into a prompt as-is. The final JSON line reports which concept ids were included, whether the bundle was truncated, and its approximate token count. Provide at least one of `query` or `ids`.

get_context input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Explicit seed concept ids (kept first, in order)."
    },
    "depth": {
      "type": "integer",
      "default": 1,
      "maximum": 3,
      "minimum": 0,
      "description": "Graph hops to expand from the seeds (default 1)."
    },
    "query": {
      "type": "string",
      "description": "Search query used to pick seed concepts."
    },
    "product": {
      "type": "string",
      "description": "Restrict expansion to concepts of this product."
    },
    "tokenBudget": {
      "type": "integer",
      "default": 4000,
      "minimum": 1,
      "description": "Approximate token cap for the bundle (chars/4, default 4000)."
    }
  },
  "additionalProperties": false
}
get_context annotations
{
  "title": "Assemble context bundle",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
upsert_concept — Create or update concept
Advertised by the server during the last successful anonymous check.
Advertised destructive

Write a concept note into the vault (creates or overwrites the markdown file, then reindexes it). Use to capture new product knowledge discovered during a task — a decision made, a constraint hit, a pattern adopted — so future agents can find it. Omit `id` to derive a slug from the title; pass an existing id to update that note. Body is markdown; [[wiki-links]] to other concept ids create graph edges. Returns the saved concept's metadata.

upsert_concept input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "title",
    "body"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Concept id (slug). Omit to derive from title; pass an existing id to update."
    },
    "body": {
      "type": "string",
      "description": "Markdown body. [[other-id]] wiki-links become graph edges."
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Tags for filtering."
    },
    "type": {
      "type": "string",
      "description": "Concept type (default \"concept\"). The 11 built-in types are concept, domain, feature, story, spec, workflow, task, decision, constraint, pattern, glossary; a vault may also define custom types. An unknown type falls back to \"concept\"."
    },
    "title": {
      "type": "string",
      "description": "Human-readable title (required, non-empty)."
    },
    "doneAt": {
      "type": "string",
      "description": "For tasks: ISO timestamp when completed."
    },
    "status": {
      "enum": [
        "active",
        "draft",
        "deprecated"
      ],
      "type": "string",
      "description": "Lifecycle status (default \"active\")."
    },
    "product": {
      "type": "string",
      "description": "Product grouping key."
    },
    "takenAt": {
      "type": "string",
      "description": "For tasks: ISO timestamp when claimed."
    },
    "takenBy": {
      "type": "string",
      "description": "For tasks: label of the agent/orchestrator that claimed it."
    },
    "codeAreas": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Rough codebase paths/globs where this knowledge lives, e.g. [\"packages/core/src/vault.ts\", \"apps/web/src/routes/**\"] — lets agents briefed by get_context know where to apply it."
    },
    "relations": {
      "type": "object",
      "description": "Typed edges, e.g. {\"depends_on\": [\"auth-system\"]}. Conventions: part_of (feature/story/task → domain), realized_by (story → features), realizes (task → stories/features), governs (spec → what it constrains), governed_by (task → specs), depends_on, constrains, supersedes, related_to. For domain concepts, prefer linking to OTHER domains (related_to / depends_on) wherever they share a boundary or hand off responsibility — connected domains reveal how the product's areas overlap instead of floating as isolated islands.",
      "additionalProperties": {
        "type": "array",
        "items": {
          "type": "string"
        }
      }
    },
    "taskStatus": {
      "enum": [
        "open",
        "taken",
        "done"
      ],
      "type": "string",
      "description": "For type=\"task\" concepts: lifecycle \"open\" | \"taken\" | \"done\" (default \"open\"). Prefer the task tools (create_task / take_task / complete_task) over setting this directly."
    }
  },
  "additionalProperties": false
}
upsert_concept annotations
{
  "title": "Create or update concept",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": true
}
delete_concept — Delete concept
Advertised by the server during the last successful anonymous check.
Advertised destructive

Remove a concept from the vault and all of its outgoing edges. Use to clear a note that is wrong, obsolete, or junk (e.g. a probe or test node that shouldn't be in the graph). Idempotent: deleting an id that doesn't exist is a no-op success (deleted:false), not an error. Deletion is permanent — prefer upsert_concept to correct a note you want to keep. Returns { deleted, id }.

delete_concept input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Exact concept id (slug) to delete, e.g. \"lead-scoring\"."
    }
  },
  "additionalProperties": false
}
delete_concept annotations
{
  "title": "Delete concept",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": true
}
link_concepts — Link concepts
Advertised by the server during the last successful anonymous check.

Add a typed, directed edge between two existing concepts by editing the `from` note's frontmatter (e.g. lead-scoring depends_on contact-model). Use when you notice a relationship the vault is missing. Both concepts should already exist; use upsert_concept first if not.

link_concepts input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "from",
    "to"
  ],
  "properties": {
    "to": {
      "type": "string",
      "description": "Target concept id."
    },
    "from": {
      "type": "string",
      "description": "Source concept id (its file gains the relation)."
    },
    "relation": {
      "type": "string",
      "default": "related_to",
      "description": "Edge type, e.g. part_of | realized_by | governs | depends_on | constrains | supersedes | related_to (default). Domain→domain links (related_to / depends_on) are encouraged where two domains share a boundary, so the graph shows how areas overlap."
    }
  },
  "additionalProperties": false
}
link_concepts annotations
{
  "title": "Link concepts",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
list_concepts — List concepts
Advertised by the server during the last successful anonymous check.
Advertised read-only

Enumerate concept metadata (no bodies), optionally filtered by product, type, or a single tag. Use to get the lay of the land in an unfamiliar vault, to audit what exists (e.g. all decisions for a product), or when search vocabulary isn't matching. For content, follow up with get_concept or get_context.

list_concepts input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "tag": {
      "type": "string",
      "description": "Only concepts carrying this tag."
    },
    "type": {
      "enum": [
        "concept",
        "domain",
        "feature",
        "story",
        "spec",
        "workflow",
        "task",
        "decision",
        "constraint",
        "pattern",
        "glossary"
      ],
      "type": "string",
      "description": "Only concepts of this type."
    },
    "product": {
      "type": "string",
      "description": "Only concepts of this product."
    }
  },
  "additionalProperties": false
}
list_concepts annotations
{
  "title": "List concepts",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
vault_stats — Vault stats
Advertised by the server during the last successful anonymous check.
Advertised read-only

Summarize the vault: counts of concepts and edges, the products and tags in use, a breakdown by concept type, and whether semantic search is available. Useful for gauging how much knowledge is here and which product/tag filters exist.

vault_stats input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
vault_stats annotations
{
  "title": "Vault stats",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
onboard — Onboard this vault
Advertised by the server during the last successful anonymous check.

Index an existing product's codebase into this vault. {action: "start"} returns the onboarding playbook: a method for surveying the codebase and recording its product knowledge (domains, features, stories, specs, workflows, decisions, constraints) as concepts via upsert_concept, each anchored to the code with codeAreas. {action: "status", areaList} reports onboarded state, concept counts and, given your repo's source areas (Brainz can't read the repo), which areas are covered or uncovered. {action: "complete", summary, areaList} marks the vault onboarded and stores the summary; it is rejected while too many areas are uncovered. Until onboarding completes, search_concepts and get_context results include a one-line note saying so.

onboard input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "action"
  ],
  "properties": {
    "action": {
      "enum": [
        "start",
        "complete",
        "status"
      ],
      "type": "string",
      "description": "\"start\" returns the onboarding playbook, \"complete\" marks the vault onboarded (requires `summary`), \"status\" reports onboarded state and concept counts."
    },
    "summary": {
      "type": "string",
      "description": "Required with \"complete\": 2–5 sentences on what was indexed and any notable gaps — stored as the product-onboarding-summary concept."
    },
    "areaList": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "With \"status\" or \"complete\": the repo's top-level source areas (packages/*, apps/*/src subtrees, major dirs) from your own repo walk — Brainz can't read the repo. \"status\" diffs concepts' code_areas against this to report covered vs uncovered areas; \"complete\" is REJECTED if too many areas are still uncovered."
    },
    "repoHint": {
      "type": "string",
      "description": "With \"start\": where the codebase lives (path or URL), echoed into the playbook."
    },
    "productName": {
      "type": "string",
      "description": "With \"start\": the product's name, echoed into the playbook heading."
    }
  },
  "additionalProperties": false
}
onboard annotations
{
  "title": "Onboard this vault",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
sync — Sync this vault to the current code
Advertised by the server during the last successful anonymous check.

Re-index an onboarded vault after the code changes (drift). {action: "start"} returns the sync playbook: the vault's last_synced_at, a coverage map over the concepts' code_areas, and a method for re-indexing only what changed (you run git — Brainz can't read the repo — and pass back changedPaths + areaList): update stale concepts in place, add concepts or tasks for new work, and report coverage gaps. {action: "status", areaList} reports onboarded state, last sync time, staleness, concept counts and coverage. {action: "complete", summary, areaList} stamps last_synced_at and appends the summary to the product-onboarding-summary concept (a running sync log). After ~14 days without a sync, get_context and search results include a one-line note saying so.

sync input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "action"
  ],
  "properties": {
    "action": {
      "enum": [
        "start",
        "complete",
        "status"
      ],
      "type": "string",
      "description": "\"start\" returns the sync (re-onboard) playbook — a DRIFT playbook scoped to what changed since the last sync (NOT the full onboarding playbook). \"complete\" records last_synced_at and appends the summary to the running sync log (requires `summary`). \"status\" reports onboarded state, last sync time, concept counts, staleness, and (with areaList) coverage."
    },
    "summary": {
      "type": "string",
      "description": "Required with \"complete\": 2–5 sentences on what changed, what you updated, and what you indexed — APPENDED to the product-onboarding-summary concept as a running sync log (never overwritten)."
    },
    "areaList": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "With \"start\", \"status\", or \"complete\": the repo's top-level source areas from your own repo walk (Brainz can't read the repo). Used to compute the coverage map (covered vs uncovered areas) — \"complete\" is REJECTED if too many areas are still uncovered."
    },
    "productName": {
      "type": "string",
      "description": "With \"start\": the product's name, echoed into the playbook heading."
    },
    "changedPaths": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "With \"start\": paths you found CHANGED since last_synced_at (from your own git diff/log). The playbook focuses the fan-out on the areas these fall under."
    }
  },
  "additionalProperties": false
}
sync annotations
{
  "title": "Sync this vault to the current code",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
dream — Dream (nightly consolidation)
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Dreaming: a scheduled consolidation sweep over this vault. Light stages what changed since the last dream (near-duplicate concepts, finished task outcomes, hygiene counts); REM asks an LLM for proposals; deep applies the ones that pass threshold gates: merges duplicates (edges redirected, the other tombstoned), promotes outcome knowledge into concepts, adds missing links, and files a task for each contradiction. A sweep that would touch too much of the vault is rejected; every applied dream keeps preimages and can be reverted. {action: "status"} shows schedule + last dream; {action: "run"} dreams now; {action: "diary"} reads the Dream Diary; {action: "revert", id} undoes one dream; {action: "configure", ...} sets the schedule, mode (apply, propose, light-only), phases, thresholds, caps, a stricter loss rail and the LLM choice; {action: "apply", id, proposals?} decides a proposed dream. Without an LLM only light runs.

dream input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "action"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "With \"revert\" or \"apply\": the dream id (from \"diary\" or \"status\")."
    },
    "llm": {
      "type": "object",
      "properties": {
        "model": {
          "anyOf": [
            {
              "type": "string",
              "pattern": "^[A-Za-z0-9._:/@-]+$",
              "maxLength": 200,
              "minLength": 1
            },
            {
              "type": "null"
            }
          ]
        },
        "provider": {
          "enum": [
            "auto",
            "workers-ai",
            "byok"
          ],
          "type": "string"
        }
      },
      "description": "With \"configure\": Cloud: which LLM the REM step uses — \"auto\" (default), \"workers-ai\", or \"byok\" (only the account's own key) — and a model id for the account's own key; null clears it.",
      "additionalProperties": false
    },
    "caps": {
      "type": "object",
      "properties": {
        "maxLinks": {
          "type": "integer",
          "maximum": 50,
          "minimum": 1
        },
        "maxMerges": {
          "type": "integer",
          "maximum": 20,
          "minimum": 1
        },
        "maxPromotions": {
          "type": "integer",
          "maximum": 20,
          "minimum": 1
        },
        "maxContradictions": {
          "type": "integer",
          "maximum": 10,
          "minimum": 1
        }
      },
      "description": "With \"configure\": Most changes per dream: maxMerges 5 (1-20), maxPromotions 5 (1-20), maxLinks 10 (1-50), maxContradictions 3 (1-10).",
      "additionalProperties": false
    },
    "mode": {
      "enum": [
        "apply",
        "propose",
        "light-only"
      ],
      "type": "string",
      "description": "With \"configure\": \"apply\" writes the changes that pass the gates (default); \"propose\" holds them in the Dream Diary until approved with {action: \"apply\"}; \"light-only\" never calls an LLM."
    },
    "limit": {
      "type": "integer",
      "maximum": 50,
      "minimum": 1,
      "description": "With \"diary\": how many entries to return (default 10)."
    },
    "action": {
      "enum": [
        "status",
        "run",
        "diary",
        "revert",
        "configure",
        "apply"
      ],
      "type": "string",
      "description": "\"status\" reports the settings, the last/next dream and any sweep in flight. \"run\" starts (or continues) a sweep NOW and advances it as far as one request allows. \"diary\" returns recent Dream Diary entries (newest first). \"revert\" undoes one dream via its preimages (requires `id`). \"configure\" changes this vault's dreaming settings. \"apply\" decides a proposed dream (propose mode): applies the listed `proposals` (all when omitted) and rejects the rest (requires `id`)."
    },
    "phases": {
      "type": "object",
      "properties": {
        "links": {
          "type": "boolean"
        },
        "merges": {
          "type": "boolean"
        },
        "promotions": {
          "type": "boolean"
        },
        "contradictions": {
          "type": "boolean"
        }
      },
      "description": "With \"configure\": Turn individual kinds of change on or off: merges, promotions, links, contradictions.",
      "additionalProperties": false
    },
    "enabled": {
      "type": "boolean",
      "description": "With \"configure\": Turn scheduled dreaming on or off."
    },
    "lossRail": {
      "type": "object",
      "properties": {
        "maxTouchFraction": {
          "type": "number",
          "maximum": 0.2,
          "minimum": 0.01
        },
        "minTouchAllowance": {
          "type": "integer",
          "maximum": 3,
          "minimum": 0
        }
      },
      "description": "With \"configure\": How much of the vault one dream may modify: maxTouchFraction (0.01-0.2) and minTouchAllowance (0-3). Can only be made stricter than the defaults.",
      "additionalProperties": false
    },
    "proposals": {
      "type": "array",
      "items": {
        "type": "integer",
        "minimum": 0
      },
      "maxItems": 200,
      "description": "With \"apply\": the proposal numbers (`n`) to approve; omit for all, [] to reject all."
    },
    "runHourUtc": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 23,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "description": "With \"configure\": Preferred UTC hour for a dream when the cadence is 24h or more; null clears it."
    },
    "thresholds": {
      "type": "object",
      "properties": {
        "link": {
          "$ref": "#/properties/thresholds/properties/merge"
        },
        "merge": {
          "type": "number",
          "maximum": 1,
          "minimum": 0.5
        },
        "promote": {
          "$ref": "#/properties/thresholds/properties/merge"
        },
        "contradiction": {
          "$ref": "#/properties/thresholds/properties/merge"
        }
      },
      "description": "With \"configure\": Minimum confidence (0.5-1) per kind: merge 0.8, promote 0.7, link 0.7, contradiction 0.6 by default.",
      "additionalProperties": false
    },
    "cadenceHours": {
      "type": "integer",
      "maximum": 168,
      "minimum": 1,
      "description": "With \"configure\": Hours between dreams (default 24)."
    }
  },
  "additionalProperties": false
}
dream annotations
{
  "title": "Dream (nightly consolidation)",
  "readOnlyHint": false,
  "openWorldHint": true,
  "destructiveHint": true
}
list_tasks — List tasks
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the vault's work pile: `task`-type concepts with their lifecycle (open/taken/done), oldest first, including who has taken each one (takenBy). Filter by taskStatus or by the domain the tasks are part_of. Read-only; take_task is what claims a task.

list_tasks input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "domain": {
      "type": "string",
      "description": "Only tasks that are part_of this domain concept id."
    },
    "taskStatus": {
      "enum": [
        "open",
        "taken",
        "done"
      ],
      "type": "string",
      "description": "Only tasks in this lifecycle state (\"open\" | \"taken\" | \"done\"). Omit for all."
    }
  },
  "additionalProperties": false
}
list_tasks annotations
{
  "title": "List tasks",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
take_task — Take a task off the pile
Advertised by the server during the last successful anonymous check.

Claim a task and get its briefing in one call. Pass an `id` to claim a specific task, or omit it to claim the next open task (oldest open by createdAt then id). Atomically flips the task to "taken" and records takenBy/takenAt; errors if it's already taken or done. Returns the task and a get_context-style briefing for its part_of domain plus the concepts it realizes / is governed_by (with code_areas). complete_task marks it done.

take_task input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "id": {
      "type": "string",
      "description": "Claim this specific task by id. Omit to claim THE next open task (oldest by createdAt then id)."
    },
    "takenBy": {
      "type": "string",
      "description": "Label for who's claiming it (agent/orchestrator name). Defaults to a generic label."
    }
  },
  "additionalProperties": false
}
take_task annotations
{
  "title": "Take a task off the pile",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
complete_task — Complete a task
Advertised by the server during the last successful anonymous check.

Mark a task done. Sets taskStatus=done + doneAt and appends `outcome` to the task body as an Outcome section. The result carries a one-line `reminder` that the rest of the graph is not updated automatically.

complete_task input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id",
    "outcome"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Id of the task to mark done."
    },
    "outcome": {
      "type": "string",
      "description": "A short account of what was done — appended to the task body as an Outcome section."
    }
  },
  "additionalProperties": false
}
complete_task annotations
{
  "title": "Complete a task",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
create_task — Create a task
Advertised by the server during the last successful anonymous check.

Turn a finding into first-class work: creates a `task`-type concept with taskStatus=open and the given relations — part_of a domain, `realizes` stories/features, `governed_by` specs — plus codeAreas pointing at where the work lands. Use when you discover work that isn't reflected in the codebase yet (a gap, a needed fix, a follow-up). The task then shows up in list_tasks / take_task and on the Kanban board.

create_task input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "title",
    "body"
  ],
  "properties": {
    "body": {
      "type": "string",
      "description": "Markdown description of the work. [[wiki-links]] become edges."
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Tags, e.g. a priority tag like \"high\" or an area tag."
    },
    "title": {
      "type": "string",
      "description": "Human-readable task title (required, non-empty)."
    },
    "domain": {
      "type": "string",
      "description": "Domain concept id this task is part_of."
    },
    "realizes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Story/feature concept ids this task realizes (creates `realizes` edges)."
    },
    "codeAreas": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Rough codebase paths/globs where the work lands."
    },
    "governedBy": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Spec concept ids that govern this task (creates `governed_by` edges)."
    }
  },
  "additionalProperties": false
}
create_task annotations
{
  "title": "Create a task",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
create_vault — Create a vault
Advertised by the server during the last successful anonymous check.

Create a new, empty vault owned by you and add it to this connection. Returns the new vault and the vaults this connection can now use. Once a connection covers more than one vault, every vault tool takes a `vault` argument (a slug or id) and list_vaults lists the vaults. Each account has a vault limit and an hourly creation limit.

create_vault input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "description": "The new vault's display name."
    },
    "slug": {
      "type": "string",
      "minLength": 1,
      "description": "Optional slug (lowercase letters, digits, dashes). Derived from `name` when omitted; must not already be used by one of your vaults."
    }
  },
  "additionalProperties": false
}
create_vault annotations
{
  "title": "Create a vault",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
832 ms
95th percentile latency
832 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 832 ms · metadata changed · 17 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http brainz-mcp https://brainz.brownmatter.ai/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add brainz-mcp --url https://brainz.brownmatter.ai/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable brainz-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "brainz-mcp": {
      "url": "https://brainz.brownmatter.ai/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "brainz-mcp": {
      "type": "streamableHttp",
      "url": "https://brainz.brownmatter.ai/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start brainz-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "brainz-mcp": {
      "type": "http",
      "url": "https://brainz.brownmatter.ai/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http brainz-mcp https://brainz.brownmatter.ai/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "brainz-mcp": {
      "url": "https://brainz.brownmatter.ai/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "brainz-mcp": {
      "serverUrl": "https://brainz.brownmatter.ai/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Brainz MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Brainz MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing