Docs / MCP tools

Reference

MCP tools in Maskin: verbs, object types, and the typed workspace graph

MCP tools are the callable operations a Model Context Protocol server exposes to AI agents, each one a verb with a typed input schema, such as create_objects or get_objects. Maskin's MCP server exposes about 64 of them. This reference groups the verbs by cluster and documents two core object types they operate on: knowledge and loop.

Key takeaways
  • MCP tools are verbs; object types are nouns. A tool call names both — the tool declares the operation, the type declares the shape being written or read.
  • Maskin's MCP server exposes ~64 tools across eight clusters: object operations, relationship operations, schema and discovery, triggers and loops, comments/events/actors, files and integrations, extensions/sessions/fields/skills, and conversations/inbox/workspace setup.
  • Edges have three write paths: create_objects and update_objects take an edges parameter for object-to-object links, and create_relationship writes one edge at a time between objects or files.
  • Conversations (chats with participants) and comments (events on an object) are different channels with different length limits: 8,000 characters for a conversation message, 2,000 for a comment.
  • Object types (insight, bet, task, knowledge, loop, content, plus custom types) are workspace-configurable — call get_workspace_schema to see the live list, valid statuses, and metadata fields.
  • knowledge is the durable, curated reference layer: statused draft → validated → deprecated, carrying summary, doc_type, confidence, and a review cadence.
  • loop is a named, iterative multi-agent process that wraps triggers + agents around a pipeline of object states — objects of any type flow through it via the in_loop edge. Loops are created with create_loop, not create_objects.

The MCP tools Maskin exposes

Maskin's MCP server surfaces its verbs under the mcp__maskin__ namespace. Each tool has a JSONSchema-defined parameter shape and validates its input server-side; type-specific validity (statuses, required fields, enum values) is enforced on the write path against settings.statuses.<type> and workspace-configured field schemas.

Coding agents are MCP clients too. On the open-source AI coding agent shortlist, Cline is MCP-native and Goose builds its tool use on MCP, so either can call the verbs below.

The eight clusters are:

Object operations.

Relationship operations.

Which tool writes which edge.

The type string is not an enum on the tool. The five built-in types are informs, breaks_into, blocks, relates_to and duplicates; extensions and modules add more (attached, in_loop, supersedes, contradicts, about, and so on), and workspaces can declare their own. Read the live list from the relationship_types field of get_workspace_schema instead of hardcoding it.

Schema and discovery.

Triggers and loops.

Comments, events, actors.

Files and integrations.

Extensions, sessions, workspace fields, skills.

Conversations, inbox, workspace setup.

A conversation is a chat between people and agents. It is not attached to any object, which is what separates it from a comment.

To talk to a human about an object, use create_comment. To leave a note inside a chat you are already part of, use post_conversation_message.

The conversation tools are mostly useful inside chat sessions.

A full call names both a verb and a type: e.g. create_objects with a node of type: "knowledge" and a metadata payload validated against the knowledge schema. The next section documents two of the object types those tools operate on in depth.

Object types the tools operate on

Every MCP tool call reads or writes objects of a declared type. get_workspace_schema returns the full list of types for a workspace — built-ins (insight, bet, task, knowledge, loop, content, actor) plus custom types declared through the extension system. This reference documents two core types in depth: knowledge (the durable reference layer) and loop (the iterative process container).

knowledge

What it is. A durable, curated, human-readable reference page — the layer that outlives the work that produced it. Where an insight is one atomic piece of evidence and a bet is a time-boxed outcome, knowledge is the settled record: what we know, at what confidence, as of when.

Not the same as a File. create_file stores raw blobs in object storage, addressed by id and attached to objects or comments. knowledge is structured, typed, statused, and first-class in the graph — it has a driver, relationships, and comments. The workspace wiki renders knowledge objects for humans; it is not a separate store.

Status lifecycle (default): draft → validated → deprecated.

Progression is convention, not enforcement: any status is settable through the API. Agents and human curators maintain the ladder. Per-type status validity is workspace-configurable via settings.statuses.knowledge and readable at runtime with get_workspace_schema.

Custom metadata fields.

Worked create_objects call. Minimal payload to open a knowledge page in draft with the required summary and the two most-consulted optional fields (doc_type, confidence). workspace_id is required; get it from list_workspaces. Each node needs a $id (any temporary string, used only to reference the node in edges), a type and a status:

{
  "workspace_id": "<workspace id from list_workspaces>",
  "nodes": [
    {
      "$id": "k1",
      "type": "knowledge",
      "title": "Enterprise buyer decision criteria",
      "status": "draft",
      "content": "Enterprise buyers rank audit surface, integration effort, and identity model above headline price. Source: 18 discovery calls, Q1 2026.",
      "metadata": {
        "summary": "Enterprise buyers weight audit, integration, and identity above price — distilled from 18 Q1 2026 discovery calls.",
        "doc_type": "topic_page",
        "confidence": "high",
        "last_validated_at": "2026-03-15"
      }
    }
  ]
}

The server validates status against settings.statuses.knowledge, doc_type and confidence against their configured enums, and rejects the call with a field-level error if any value is out of range. To link the new page to existing objects in the same call, add an edges array whose entries use source and target (the node's $id or an existing object's uuid) plus a type.

Relationships. Extension-declared: supersedes (this page replaces an entire past frame), contradicts (this page conflicts with another), about (this page is about a subject or entity). General edges also apply: informs, relates_to, breaks_into, blocks, duplicates.

How it relates to insight / bet / task.

loop

What it is. A named, iterative multi-agent process. A loop wraps triggers (steps) + agents + a pipeline of object states: a step and a trigger are the same thing — each step fires an agent when an object changes state (created, status_changed, ...) or on a cron schedule. A loop is the process container; the objects it acts on are members flowing through it.

Custom metadata fields.

Status lifecycle — workspace-configurable graduated-trust ladder. A loop moves up a ladder as it earns trust, and can be paused from any rung. The valid set is workspace-configured (settings.statuses.loop) and enforced by the server on every write. The ladder create_loop documents is:

draft  →  pilot  →  supervised  →  live
          (paused reachable from any rung; archived retires the loop)

Workspaces may configure additional rungs and terminal states. Read the actual set for your workspace at runtime with get_workspace_schema — do not assume a concrete ladder from this reference.

Two mechanics worth knowing:

  1. Validity is enforced per workspace on the write path. create_loop, update_loop, create_objects, update_objects, and the bulk-update path each validate an incoming status against settings.statuses.<type>, so a workspace on a different ladder simply enforces that ladder.
  2. Reading the ladder. Call get_workspace_schema and inspect settings.statuses.loop. Do not hardcode a status list against the product default.

Worked create_loop call. Loops are created with create_loop, not create_objects. Minimal payload to stand up a supervised product-discovery loop that ingests insight objects and closes members once they reach a scored or discarded state (or, for bets it spawns, a succeeded or failed state). workspace_id and name are required; get the workspace id from list_workspaces. The status values in closed_statuses are checked against your workspace schema, so use the statuses your workspace actually defines for each type:

{
  "workspace_id": "<workspace id from list_workspaces>",
  "name": "Product discovery loop",
  "status": "supervised",
  "content": "Takes new insights, clusters and scores them, and spawns bets from the strongest clusters.",
  "entry_condition": "new insight objects are added to the loop",
  "close_condition": "a member is done once its status reaches one listed in closed_statuses for its type",
  "closed_statuses": {
    "insight": ["scored", "discarded"],
    "bet": ["succeeded", "failed"]
  }
}

This call stands up the loop container, its descriptive entry/close prose, and its per-type closed_statuses. Steps can be authored inline in the same call through the steps parameter (each step names an agent, a prompt, and a when of either a cron schedule or an object type plus action), or attached later from existing triggers with trigger_ids. Existing objects can join at creation through object_ids, each becoming an in_loop edge.

Relationships. Loop membership is the in_loop edge from the loop to the object. This is the loop↔work relationship; it is not one of the semantic edges (informs, blocks, etc.). Loop steps are triggers (create_trigger / update_trigger); a step authored inline on a loop becomes a trigger attached to it. General edges (relates_to, blocks, ...) apply as usual.

How it relates to insight / bet / task. Membership, not a peer relationship. Objects of any type — insight, bet, task, or a custom type — flow through a loop via in_loop (the explicit membership edge — nothing is inducted by the prose conditions). A member closes when its own status reaches a terminal status for its type; the read path derives inProgressCount / closedCount / medianTimeToCloseMs from the in_loop edge plus that status. The prose entry_condition / close_condition describe intent; they gate and close nothing at runtime. So a loop is the process around the work, not another kind of work: e.g. a Product-Discovery loop takes insight objects in at new, moves them through clustered and scored, and produces bet objects; a delivery loop takes task objects from todo to done. The loop's trust rung governs how much of that runs without a human gate.

FAQ

What are MCP tools?

MCP tools are the callable operations a Model Context Protocol server exposes to AI agents and clients — each one a verb with a typed JSONSchema-defined input and a documented output. A tool call names both the verb and the shape it operates on: e.g. create_objects with a node of type: "knowledge". Maskin's MCP server exposes about 64 tools across eight clusters: object operations, relationship operations, schema and discovery, triggers and loops, comments/events/actors, files and integrations, extensions/sessions/fields/skills, and conversations/inbox/workspace setup. Every read or write against the workspace graph flows through one of them.

What is the difference between MCP tools and MCP resources?

Tools are verbs — write-path actions with side effects. Resources are read-only URIs a server exposes for context lookup without invoking an action. In Maskin, first-class typed rows (knowledge, loop, insight, bet, task, and custom types) are operated on by tools like create_objects and update_objects; opaque blobs (uploads, generated files, screenshots) are stored via create_file and attached to objects. Prefer a typed knowledge object when the content is human-readable reference material; prefer a file when it is a raw artifact.

How do I list all MCP tools?

MCP clients (Claude, Claude Code, Cursor, ChatGPT, VS Code) surface the full manifest under the connected server — every tool has a name, description, and JSONSchema parameter shape. Programmatically, an MCP client discovers tools by calling tools/list on the server; the response is the source of truth for what is callable, and Maskin adds tools without breaking older ones. For a functional view of Maskin's tools, see the eight clusters above (object operations, relationship operations, schema and discovery, triggers and loops, comments/events/actors, files and integrations, extensions/sessions/fields/skills, and conversations/inbox/workspace setup).

How do MCP tools relate to Maskin's object types?

MCP tools are verbs; object types are nouns. The tool declares the operation (create, update, list, search); the type declares the shape being operated on. A single call names both — e.g. create_objects with a node of type: "knowledge" and a valid metadata payload for that type (loops are the exception and go through create_loop). Type-specific validity (statuses, required fields, enum values) is enforced server-side on the write path against the workspace schema. Discover the type set with get_workspace_schema.

Can I create custom MCP tools in Maskin?

The MCP tool surface itself is server-defined and workspace-agnostic — you do not add new verbs per workspace. What you can customise is what those verbs operate on. Object types, their custom metadata fields, valid statuses per type, and relationship types are workspace-configurable through the extension system (create_extension, create_workspace_field). Once configured, a custom stakeholder or experiment type behaves identically to a built-in: the same create_objects, get_objects, update_objects verbs apply, and get_workspace_schema reflects the live configuration.

Drive the workspace over the wire

Every Maskin object, relationship, trigger, and loop is reachable through the MCP server. Open source under Apache 2.0. Self-host free, bring your own model.

Self-host on GitHub Book a hosted trial

Ready to run the loop on your own workspace?

Try Maskin free