Koskamo

CEM MCP

The CEM MCP server allows an agent to connect to the CEM Research Project endpoint to access published research on building with AI, including definitions, papers, calculators, and the CEM Score.

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.

CEM MCP logo, by CEM Research ProjectVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-07Operated by CEM Research Project
MCP endpoint (Streamable HTTP)
https://mcp.cemresearchproject.org/mcp
Vendor documentation

What its tools do

14 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

14 of 14 have a description · 14 of 14 declare behavior hints · 13 of 13 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to cemresearchproject.org ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Access CEM published research on building with AI
  • Retrieve definitions and papers related to AI in construction
  • Use calculators and CEM Score tools

Source and maintenance

Vendor evidenceRegistry 0.1.0

Protocol and capabilities

Server
cem 0.1.0
MCP protocol negotiated in check
2025-11-25
Tools
14 advertised
Resources
4 advertised
Resource templates
0 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "resources": {
    "listChanged": true
  }
}

Server-provided instructions

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

CEM, the Compounding Execution Method, is an open research project on how one operator builds with AI, measured over every commit, session and dollar. These tools read its published research, its calculators and its UI kit. - For a quick answer, use cem_answer first: CEM's own definition of the term and the best documents, free and instant. For the documents themselves, research_search, then research_get. Cite each document's code (for example DOI-07) and its page link, and write the answer yourself from what they say. - ask_cem writes a longer answer with sources. It has a daily limit across everyone and costs money, so use it only when someone wants to go deeper than the documents. - calculators_list and calculator_get give each calculator's inputs and formula as the calculator computes it; cem_score scores the 24-question self-assessment. - The ui_ tools are CEM's design system: its components, laws and check. - Use CEM's terms as the research defines them and never coin new ones. The research is open; describe any offer as an offer, never as a research finding.

Tools

14 advertised

ui_list — List the UI kit
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

ui_list input schema
{
  "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"
    }
  }
}
ui_list annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
ui_search — Search the UI kit
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

ui_search input schema
{
  "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\""
    }
  }
}
ui_search annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
ui_get — Get a UI kit entry
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

ui_get input schema
{
  "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"
    }
  }
}
ui_get annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
ui_laws — Read the design laws
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

ui_laws input schema
{
  "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"
    }
  }
}
ui_laws annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
ui_check — Run the laws check
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

ui_check input schema
{
  "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\""
    }
  }
}
ui_check annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
calculators_list — List the calculators
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

calculators_list input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
calculators_list annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
calculator_get — Get a calculator
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

calculator_get input schema
{
  "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\""
    }
  }
}
calculator_get annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
cem_score — Score the CEM Score self-assessment
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

cem_score input schema
{
  "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
      }
    }
  }
}
cem_score annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
research_search — Search the research
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

research_search input schema
{
  "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\""
    }
  }
}
research_search annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
reviews_search — Search the tool reviews
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

reviews_search input schema
{
  "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\""
    }
  }
}
reviews_search annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
research_get — Get research by code
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

research_get input schema
{
  "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)"
    }
  }
}
research_get annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
cem_answer — Instant answer
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

cem_answer input schema
{
  "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?\""
    }
  }
}
cem_answer annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
ask_cem — Ask CEM
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

ask_cem input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "question"
  ],
  "properties": {
    "question": {
      "type": "string",
      "maxLength": 2000,
      "minLength": 2,
      "description": "The question"
    }
  }
}
ask_cem annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
ask_op01 — Ask OP-01
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

ask_op01 input schema
{
  "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?\""
    }
  }
}
ask_op01 annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

4 advertised

CEM answer

Advertised by the server during the last successful anonymous check.

CEM's definition and the documents behind it

CEM answer URI
ui://cem/answer

MIME type: text/html;profile=mcp-app

CEM Score

Advertised by the server during the last successful anonymous check.

The CEM Score self-assessment: the questions, then your score by dimension

CEM Score URI
ui://cem/score

MIME type: text/html;profile=mcp-app

CEM research

Advertised by the server during the last successful anonymous check.

CEM research matching a search, each document with its page

CEM research URI
ui://cem/search

MIME type: text/html;profile=mcp-app

CEM calculator

Advertised by the server during the last successful anonymous check.

A calculator's inputs, formula and citation

CEM calculator URI
ui://cem/calculator

MIME type: text/html;profile=mcp-app

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
718 ms
95th percentile latency
718 ms

Maintenance history

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

  • · probe · passed · 718 ms · metadata changed · 14 tool(s), 4 resource(s), 0 resource template(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 cem-mcp https://mcp.cemresearchproject.org/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 cem-mcp --url https://mcp.cemresearchproject.org/mcp

Cursor

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

Cline

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

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start cem-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "cem-mcp": {
      "type": "http",
      "url": "https://mcp.cemresearchproject.org/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 cem-mcp https://mcp.cemresearchproject.org/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://mcp.cemresearchproject.org/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": {
    "cem-mcp": {
      "serverUrl": "https://mcp.cemresearchproject.org/mcp"
    }
  }
}

Let your agent find its tools

Find servers like CEM 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 CEM 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