CEM's published research on building with AI: definitions, papers, calculators and the CEM Score.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
A longer written answer from CEM's research, with the passages it drew on and their pages. Use it only after cem_answer, and only when the person asks to go deeper or wants more than the definition and documents give: for what a term means, cem_answer is the answer, free and instant. At most 100 written answers a day across every channel; past that, or when the AI account can't answer, it returns the closest research instead.
The question
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http cem https://mcp.cemresearchproject.org/mcp
A longer written answer from CEM's research, with the passages it drew on and their pages. Use it only after cem_answer, and only when the person asks to go deeper or wants more than the definition and documents give: for what a term means, cem_answer is the answer, free and instant. At most 100 written answers a day across every channel; past that, or when the AI account can't answer, it returns the closest research instead.
| Argument | Type | Description |
|---|---|---|
| question* | string | The question |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"question"
],
"properties": {
"question": {
"type": "string",
"maxLength": 2000,
"minLength": 2,
"description": "The question"
}
}
}OP-01's view: the operator in CEM's research, the one person whose every commit, session and dollar the research measures. By default, free and instant: OP-01's published positions that bear on the question, each with when it applies, and the closest published research; write the answer from them in your own words and keep his positions apart from what you infer. With deeper: true, a written answer in OP-01's own voice from the same material, counted on the same daily limit as ask_cem; use it only when the person asks to go deeper. For the method's own view, use cem_answer.
| Argument | Type | Description |
|---|---|---|
| deeper | boolean | A written answer in his voice (counts on the daily limit) |
| question* | string | What to ask OP-01, e.g. "Should I raise money or build with what I have?" |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"question"
],
"properties": {
"deeper": {
"type": "boolean",
"description": "A written answer in his voice (counts on the daily limit)"
},
"question": {
"type": "string",
"maxLength": 2000,
"minLength": 2,
"description": "What to ask OP-01, e.g. \"Should I raise money or build with what I have?\""
}
}
}One calculator: what it measures (cem-ui registry/tools.json), its inputs with their defaults, and its formula as the calculator's own code computes it (templates/tool-calcs/{slug}.blade.php: the recalc function, the helpers it calls and its constants), and the citation it gives.
| Argument | Type | Description |
|---|---|---|
| slug* | string | e.g. "drift-tax", "build-compression" |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"pattern": "^[a-z0-9-]+$",
"maxLength": 60,
"description": "e.g. \"drift-tax\", \"build-compression\""
}
}
}The 21 CEM calculators, the same on every site (cem-ui registry/tools.json), with what each measures, and its page and formula code from CRP's search index when CRP is up.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Use for any question about CEM (the Compounding Execution Method) or a term it defines, such as the Drift Tax, the Pendulum, the Governor, Sweeps, Cycles or operator levels, and for questions about building or operating with AI that CEM's research covers. Returns CEM's own definition with its code (cite it, e.g. F-003) and the best research documents, each with its code, one-line summary and page. Free and instant. Use it first; ask_cem writes a longer answer when someone wants to go deeper.
| Argument | Type | Description |
|---|---|---|
| question* | string | The question, e.g. "What is the Pendulum?" |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"question"
],
"properties": {
"question": {
"type": "string",
"maxLength": 2000,
"minLength": 2,
"description": "The question, e.g. \"What is the Pendulum?\""
}
}
}Score answers to the CEM Score self-assessment (24 questions, 12 dimensions) by the calculator's own rules (cem-ui templates/tool-calcs/cem-score.blade.php: getDimGrade, updateScores). Without answers, the 24 questions with each answer's score. Answers are keyed by question (d1q1 … d12q2), each the chosen answer's score, 1 to 5. Nothing is stored.
| Argument | Type | Description |
|---|---|---|
| answers | object | e.g. {"d1q1": 5, "d1q2": 4} |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"answers": {
"type": "object",
"description": "e.g. {\"d1q1\": 5, \"d1q2\": 4}",
"propertyNames": {
"type": "string",
"pattern": "^d\\d{1,2}q[12]$"
},
"additionalProperties": {
"type": "integer",
"maximum": 5,
"minimum": 1
}
}
}
}One public CEM document by its code (DOI-07, PB-011, …): its entry in CRP's search index and its markdown from work-hub content/ (located through the content_index table). Only codes CRP lists publicly are served.
| Argument | Type | Description |
|---|---|---|
| code* | string | The code, e.g. "DOI-07" |
| max_chars | integer | Cut the markdown at this many characters (default 60000) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"code"
],
"properties": {
"code": {
"type": "string",
"maxLength": 50,
"minLength": 1,
"description": "The code, e.g. \"DOI-07\""
},
"max_chars": {
"type": "integer",
"maximum": 400000,
"minimum": 1000,
"description": "Cut the markdown at this many characters (default 60000)"
}
}
}Find CEM research by words or code in CRP's public search index (GET /search/index.json): papers, playbooks, case studies, book chapters, figures, calculators and pages. Every word must match the title, full title, summary or code. Returns each result's code, title, kind and address.
| Argument | Type | Description |
|---|---|---|
| kind | string | Only this kind, as the index names it, e.g. "Playbook", "Tool", "Page" |
| limit | integer | At most this many (default 10) |
| query* | string | Words or a code, e.g. "drift tax", "DOI-07", "PB-011" |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query"
],
"properties": {
"kind": {
"type": "string",
"maxLength": 40,
"description": "Only this kind, as the index names it, e.g. \"Playbook\", \"Tool\", \"Page\""
},
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "At most this many (default 10)"
},
"query": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Words or a code, e.g. \"drift tax\", \"DOI-07\", \"PB-011\""
}
}
}Find CEM's reviews of software tools (reviews.cemresearchproject.org): tool reviews, product pages with their listed prices, buying guides and categories, by words. Every word must match the title or summary. Returns each result's title, kind, summary and page. These are reviews of tools, separate from CEM's research.
| Argument | Type | Description |
|---|---|---|
| kind | string | Only this kind |
| limit | integer | At most this many (default 10) |
| query* | string | Words, e.g. "newsletter", "shopify page builder", "beehiiv" |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query"
],
"properties": {
"kind": {
"enum": [
"Reviews",
"Products",
"Guides",
"Categories",
"Pages"
],
"type": "string",
"description": "Only this kind"
},
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "At most this many (default 10)"
},
"query": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Words, e.g. \"newsletter\", \"shopify page builder\", \"beehiiv\""
}
}
}Run cem-ui's laws check (scripts/laws.mjs, `npm run laws`) and return its table: each law's check, the count now, and the baseline it may not rise above. It checks cem-ui's own css/ and templates/; it takes no other repo. With a check name, every finding for that check (laws.mjs --list). Never records a baseline.
| Argument | Type | Description |
|---|---|---|
| check | string | One check, e.g. "no-accent-edge" or "surface-ladder" |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"check": {
"type": "string",
"pattern": "^[a-z][a-z-]*$",
"maxLength": 40,
"description": "One check, e.g. \"no-accent-edge\" or \"surface-ladder\""
}
}
}One UI kit entry in full, as cem-ui registry/ records it: by id ("site-header", "shell", "spacing", "CRP:ask-cem-panel"), component tag ("x-site-header") or name.
| Argument | Type | Description |
|---|---|---|
| id* | string | Id, x- tag or name |
| kind | string | Only this kind, when an id is shared |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"maxLength": 120,
"minLength": 1,
"description": "Id, x- tag or name"
},
"kind": {
"enum": [
"token",
"asset",
"primitive",
"utility",
"engine",
"frame",
"template",
"component",
"partial"
],
"type": "string",
"description": "Only this kind, when an id is shared"
}
}
}The CEM design laws, cem-ui LAWS.md, the one rules document. Without a law, the whole file. With a number (1 to 20), that law as written. With words ("accent edge", "white"), every law that holds all of them.
| Argument | Type | Description |
|---|---|---|
| law | string | A law number, or words to find in the laws |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"law": {
"type": "string",
"maxLength": 80,
"description": "A law number, or words to find in the laws"
}
}
}The CEM UI kit (cem-ui registry/): tokens, brand assets, layout primitives, utilities, engines, frames, templates, components (one per job) and the old partials. Without a kind, the count of each kind and their ids; with one, every entry of that kind. Kinds: token, asset, primitive, utility, engine, frame, template, component, partial.
| Argument | Type | Description |
|---|---|---|
| kind | string | Only this kind |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"kind": {
"enum": [
"token",
"asset",
"primitive",
"utility",
"engine",
"frame",
"template",
"component",
"partial"
],
"type": "string",
"description": "Only this kind"
}
}
}Find UI kit entries (cem-ui registry/) whose id, name or any recorded field holds every word of the query. Returns the best matches, id first.
| Argument | Type | Description |
|---|---|---|
| kind | string | Only this kind |
| limit | integer | At most this many (default 20) |
| query* | string | Words to find, e.g. "site header" or "tabs" |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query"
],
"properties": {
"kind": {
"enum": [
"token",
"asset",
"primitive",
"utility",
"engine",
"frame",
"template",
"component",
"partial"
],
"type": "string",
"description": "Only this kind"
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "At most this many (default 20)"
},
"query": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Words to find, e.g. \"site header\" or \"tabs\""
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 7, 2026.