MCP Tools

Generated from the live tool registry — these match exactly what tools/list returns.

beat_desk

Beat: what is on the calendar, what is waiting on you, and what is stuck and why. One call for the whole picture. Needs beat:read.

Input schema

{
  "type": "object",
  "properties": {
    "from": {
      "type": "string",
      "description": "ISO start of the window. Defaults to now."
    },
    "to": {
      "type": "string",
      "description": "ISO end. Defaults to thirty days out."
    }
  },
  "additionalProperties": false
}

beat_piece

Beat: one piece in full, with its per-channel copy and the state of each post. Needs beat:read.

Input schema

{
  "type": "object",
  "properties": {
    "pieceId": {
      "type": "string"
    }
  },
  "required": [
    "pieceId"
  ],
  "additionalProperties": false
}

beat_queue

Beat: recent posts and what happened to them, with the reason anything was held. Needs beat:read.

Input schema

{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 200,
      "default": 50
    }
  },
  "additionalProperties": false
}

beat_channels

Beat: connected accounts and their health. A channel with no connection still works; you paste it at the slot. Needs beat:read.

Input schema

{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}

beat_beats

Beat: the recurring themes pieces are written against. Needs beat:read.

Input schema

{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}

beat_create_piece

Beat: file a new idea. Always lands as an idea, never approved. Needs beat:write.

Input schema

{
  "type": "object",
  "properties": {
    "title": {
      "type": "string",
      "description": "Working title. Not the hook."
    },
    "body": {
      "type": "string",
      "description": "Canonical body every channel starts from."
    },
    "channels": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "linkedin",
          "x",
          "facebook",
          "instagram",
          "threads"
        ]
      }
    },
    "seriesId": {
      "type": "string",
      "description": "Which beat it belongs to. See beat_beats."
    }
  },
  "required": [
    "title"
  ],
  "additionalProperties": false
}

beat_update_piece

Beat: edit a piece, its channels, its slot or its link. Needs beat:write.

Input schema

{
  "type": "object",
  "properties": {
    "pieceId": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "body": {
      "type": "string"
    },
    "linkUrl": {
      "type": "string",
      "description": "A schemed link bills 13x on X. Write the domain bare."
    },
    "channels": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "linkedin",
          "x",
          "facebook",
          "instagram",
          "threads"
        ]
      }
    },
    "slotLocal": {
      "type": "string",
      "description": "Wall clock, e.g. 2026-09-12T09:00."
    },
    "timeZone": {
      "type": "string",
      "description": "IANA zone the slot is written in."
    }
  },
  "required": [
    "pieceId"
  ],
  "additionalProperties": false
}

beat_plan

Beat: fill a horizon with ideas across your active beats. Costs 12c, or free while the daily three last. Needs beat:write.

Input schema

{
  "type": "object",
  "properties": {
    "weeks": {
      "type": "integer",
      "minimum": 1,
      "maximum": 6,
      "default": 2
    },
    "themes": {
      "type": "string",
      "description": "What is on your mind. Read alongside the last 60 days so it does not repeat an angle."
    },
    "timeZone": {
      "type": "string"
    }
  },
  "additionalProperties": false
}

beat_draft

Beat: write one piece into every channel it targets, in your voice for each. Costs 2c. Needs beat:write.

Input schema

{
  "type": "object",
  "properties": {
    "pieceId": {
      "type": "string"
    },
    "channels": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "linkedin",
          "x",
          "facebook",
          "instagram",
          "threads"
        ]
      }
    },
    "notes": {
      "type": "string",
      "description": "Anything extra: a link, a number, an angle."
    }
  },
  "required": [
    "pieceId"
  ],
  "additionalProperties": false
}

beat_rework

Beat: rewrite one channel of one piece against a note. Costs 1c, cheap so you iterate. Needs beat:write.

Input schema

{
  "type": "object",
  "properties": {
    "pieceId": {
      "type": "string"
    },
    "channel": {
      "type": "string",
      "enum": [
        "linkedin",
        "x",
        "facebook",
        "instagram",
        "threads"
      ]
    },
    "note": {
      "type": "string",
      "description": "What to change. \"Cut the second paragraph.\""
    }
  },
  "required": [
    "pieceId",
    "channel",
    "note"
  ],
  "additionalProperties": false
}

beat_atomize

Beat: break a long piece into several posts. Costs 6c, cheaper than drafting them one at a time. Needs beat:write.

Input schema

{
  "type": "object",
  "properties": {
    "pieceId": {
      "type": "string"
    },
    "source": {
      "type": "string",
      "description": "Long text to break up. Defaults to the piece body."
    }
  },
  "required": [
    "pieceId"
  ],
  "additionalProperties": false
}

beat_approve

Beat: approve one piece so it goes out at its slot. One at a time, never in bulk. Needs beat:publish, which is a separate scope from beat:write on purpose.

Input schema

{
  "type": "object",
  "properties": {
    "pieceId": {
      "type": "string"
    }
  },
  "required": [
    "pieceId"
  ],
  "additionalProperties": false
}

beat_mark_posted

Beat: record that you posted something by hand on a manual channel. Beat keeps no permalink, because it did not send it. Needs beat:publish.

Input schema

{
  "type": "object",
  "properties": {
    "postId": {
      "type": "string"
    }
  },
  "required": [
    "postId"
  ],
  "additionalProperties": false
}

search_skills

Search the AI Coach skill library by free text and/or category.

Input schema

{
  "type": "object",
  "properties": {
    "q": {
      "type": "string",
      "description": "Free-text search query (matches name/description/tags)"
    },
    "category": {
      "type": "string",
      "description": "Filter by category slug (e.g. \"engineering\")"
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 200,
      "default": 20
    },
    "offset": {
      "type": "integer",
      "minimum": 0,
      "default": 0
    }
  },
  "additionalProperties": false
}

get_skill

Fetch a single skill including its full SKILL.md content, install command, and capabilities.

Input schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string",
      "description": "Skill slug, e.g. \"code-reviewer\""
    }
  },
  "required": [
    "slug"
  ],
  "additionalProperties": false
}

install_skill

Returns a copy-paste install command for a given skill, tailored to the target agent (Claude Code, Cursor, Codex, Zed, or generic).

Input schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string",
      "description": "Skill slug to install"
    },
    "client": {
      "type": "string",
      "enum": [
        "claude-code",
        "cursor",
        "codex",
        "zed",
        "generic"
      ],
      "default": "generic",
      "description": "Target agent — controls which install snippet is returned"
    }
  },
  "required": [
    "slug"
  ],
  "additionalProperties": false
}

search_marketplace

Search the AI Coach marketplace — MCP servers and curated AI products.

Input schema

{
  "type": "object",
  "properties": {
    "q": {
      "type": "string",
      "description": "Free-text search query"
    },
    "kind": {
      "type": "string",
      "enum": [
        "mcp",
        "product",
        "all"
      ],
      "default": "all",
      "description": "Filter results by item kind"
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "default": 20
    }
  },
  "additionalProperties": false
}

create_marketplace_sku

Create or update a sellable marketplace SKU (admin only). Also add it to src/data/marketplace-skus.json, or the next deploy drops it.

Input schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Stable SKU code, lowercase with dashes, e.g. \"ac-audit-pro\""
    },
    "productSlug": {
      "type": "string",
      "description": "Catalog slug this SKU attaches to, e.g. \"website-audit\""
    },
    "name": {
      "type": "string",
      "description": "Display name shown in the buy box"
    },
    "summary": {
      "type": "string"
    },
    "fulfilment": {
      "type": "string",
      "enum": [
        "external",
        "digital",
        "license_key",
        "lead"
      ],
      "description": "external = tracked outbound link (no payment here); digital = instant download/entitlement; license_key = a code drawn from stock; lead = order recorded and fulfilled by a human"
    },
    "priceCents": {
      "type": "integer",
      "minimum": 0,
      "description": "Whole cents. Must be 0 for external SKUs, and at least 50 otherwise."
    },
    "compareAtCents": {
      "type": "integer",
      "description": "Strikethrough price. Must exceed priceCents."
    },
    "priceNote": {
      "type": "string",
      "description": "e.g. \"one-time\", \"per seat / mo\""
    },
    "ctaLabel": {
      "type": "string"
    },
    "badge": {
      "type": "string"
    },
    "externalUrl": {
      "type": "string",
      "description": "Required for fulfilment=external. Must be https."
    },
    "affiliateParams": {
      "type": "string",
      "description": "Query string appended to externalUrl, e.g. \"ref=aicoach\""
    },
    "deliveryPayload": {
      "type": "object",
      "description": "What the buyer gets: downloadUrl, instructions, redeemUrl. Required for paid digital SKUs.",
      "properties": {
        "downloadUrl": {
          "type": "string"
        },
        "instructions": {
          "type": "string"
        },
        "redeemUrl": {
          "type": "string"
        }
      }
    },
    "stock": {
      "type": "integer",
      "minimum": 0,
      "description": "Omit for unlimited."
    },
    "sellerUserId": {
      "type": "integer",
      "description": "Third-party seller who earns 60%. Omit for house SKUs."
    },
    "sortOrder": {
      "type": "integer"
    },
    "isActive": {
      "type": "boolean",
      "default": true
    }
  },
  "required": [
    "id",
    "productSlug",
    "name",
    "fulfilment"
  ],
  "additionalProperties": false
}

list_marketplace_skus

List marketplace SKUs with price, stock and fulfilment (admin only).

Input schema

{
  "type": "object",
  "properties": {
    "activeOnly": {
      "type": "boolean",
      "default": false
    }
  },
  "additionalProperties": false
}

draft_marketplace_entry

Read a vendor URL and draft a catalog entry plus a suggested SKU for review (admin only). Never invents a price.

Input schema

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "Vendor product page to read"
    }
  },
  "required": [
    "url"
  ],
  "additionalProperties": false
}

list_models

List the LLMs available through AI Coach (read-only catalog metadata: provider, context window, costs, capabilities).

Input schema

{
  "type": "object",
  "properties": {
    "provider": {
      "type": "string",
      "description": "Filter by provider id (anthropic, openai, google-ai-studio, deepseek, groq, mistral, workers-ai, ai-gateway)"
    }
  },
  "additionalProperties": false
}

compare_models

Compare two or more models side-by-side. Returns context windows, max output, per-million-token costs, and capability flags.

Input schema

{
  "type": "object",
  "properties": {
    "ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "minItems": 2,
      "maxItems": 6,
      "description": "Catalog ids to compare side-by-side"
    }
  },
  "required": [
    "ids"
  ],
  "additionalProperties": false
}

run_tool

Execute a sync nano-app tool against the user's input. Requires a Bearer key with the mcp:tools scope. Returns the tool's text output. Pay-per-use tools debit the wallet; insufficient balance returns a payment_required content block.

Input schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string",
      "description": "Tool slug (from search_tools) — e.g. \"text-summarizer\", \"ai-post-maker\", \"markdown-to-pdf\""
    },
    "input": {
      "type": "string",
      "description": "Free-text input to the tool. The tool decides how to interpret it."
    }
  },
  "required": [
    "slug",
    "input"
  ],
  "additionalProperties": false
}

search_tools

List or search the AI Coach nano-app tools (text summarizer, post maker, persona creator, markdown→PDF, etc.). Each result includes whether the tool is free, free-metered, or pay-per-use.

Input schema

{
  "type": "object",
  "properties": {
    "q": {
      "type": "string",
      "description": "Free-text search query (matches name/description/category)"
    },
    "category": {
      "type": "string",
      "description": "Filter by category (converter|generator|analyzer|formatter|other)"
    }
  },
  "additionalProperties": false
}

run_model_bakeoff

Send the same prompt to multiple models in parallel and return their outputs side-by-side with per-model latency and tokens. Free tier: ≤3 models, ≤8k output. Paid: up to 6 models. Requires mcp:bakeoff scope.

Input schema

{
  "type": "object",
  "properties": {
    "prompt": {
      "type": "string",
      "description": "The prompt to send to every model"
    },
    "models": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "minItems": 2,
      "maxItems": 6,
      "description": "Catalog ids — get from list_models"
    },
    "system": {
      "type": "string",
      "description": "Optional system prompt sent to every model"
    },
    "maxOutputTokens": {
      "type": "integer",
      "minimum": 64,
      "maximum": 8192,
      "default": 1024,
      "description": "Output token cap per model"
    }
  },
  "required": [
    "prompt",
    "models"
  ],
  "additionalProperties": false
}

share_model_report

Persist a bake-off as a public report and return a shareable URL (https://aicoach.pw/share/r/<id>).

Input schema

{
  "type": "object",
  "properties": {
    "reportId": {
      "type": "string",
      "description": "Report id returned by run_model_bakeoff"
    }
  },
  "required": [
    "reportId"
  ],
  "additionalProperties": false
}

publish_skill

Publish a skill to the caller's AI Coach catalog in one shot: create (or reuse) the skill record, reserve a new version, upload the bundle bytes, and finalize after server-side validation. Requires an API key with the publisher:write scope. Bundle is gzipped tarball, markdown-only payload (SKILL.md + optional references/, assets/, LICENSE), ≤ 5 MB.

Input schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string",
      "description": "Skill slug, kebab-case, 1–64 chars. Must match the `name:` in SKILL.md frontmatter."
    },
    "displayName": {
      "type": "string",
      "description": "Human-readable name shown in search results."
    },
    "descriptionShort": {
      "type": "string",
      "description": "One-liner shown in search results, max 200 chars."
    },
    "descriptionLong": {
      "type": "string",
      "description": "Optional long-form description (markdown)."
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Optional tag strings."
    },
    "iconUrl": {
      "type": "string",
      "description": "Optional icon URL."
    },
    "visibility": {
      "type": "string",
      "enum": [
        "private",
        "unlisted",
        "public"
      ],
      "default": "private",
      "description": "private = only you; unlisted = anyone with the link; public = discoverable."
    },
    "pricingModel": {
      "type": "string",
      "enum": [
        "free",
        "one_time"
      ],
      "default": "free"
    },
    "priceCents": {
      "type": "integer",
      "minimum": 100,
      "maximum": 100000,
      "description": "Required when pricingModel=\"one_time\". Between $1.00 and $1000.00."
    },
    "semver": {
      "type": "string",
      "description": "Version of this bundle. e.g. \"0.1.0\". Must be strictly greater than the previous finalized version."
    },
    "changelog": {
      "type": "string",
      "description": "Optional changelog for this version."
    },
    "bundleBase64": {
      "type": "string",
      "description": "The skill bundle (gzipped tarball, ≤ 5 MB after base64-decode), base64-encoded. Must contain SKILL.md at the root."
    }
  },
  "required": [
    "slug",
    "displayName",
    "descriptionShort",
    "semver",
    "bundleBase64"
  ],
  "additionalProperties": false
}

list_my_skills

List skills published by the authenticated publisher. Requires the publisher:read or publisher:write scope.

Input schema

{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}

update_skill

Change a skill you publish: name, descriptions, tags, category, visibility or price. Does not touch the published bundle — use publish_skill for a new version.

Input schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string",
      "description": "Slug of a skill you publish"
    },
    "displayName": {
      "type": "string"
    },
    "descriptionShort": {
      "type": "string"
    },
    "descriptionLong": {
      "type": "string"
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 20
    },
    "iconUrl": {
      "type": "string"
    },
    "visibility": {
      "type": "string",
      "enum": [
        "private",
        "unlisted",
        "public"
      ]
    },
    "pricingModel": {
      "type": "string",
      "enum": [
        "free",
        "one_time"
      ]
    },
    "priceCents": {
      "type": "integer",
      "minimum": 100,
      "maximum": 100000
    },
    "taglineShort": {
      "type": "string"
    },
    "category": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ],
  "additionalProperties": false
}

list_skill_versions

Every version of one of your skills, with its state, size, checksum and which one is currently latest.

Input schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ],
  "additionalProperties": false
}

deprecate_skill_version

Retire an older version of your skill. Refuses the latest version, since that is the one people are installing.

Input schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "versionId": {
      "type": "string",
      "description": "Version id from list_skill_versions"
    }
  },
  "required": [
    "slug",
    "versionId"
  ],
  "additionalProperties": false
}

submit_skill_for_review

Ask AI Coach to review a skill for public listing. Publishing is already live on an unlisted link; this is what puts it in public search.

Input schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ],
  "additionalProperties": false
}

list_my_purchases

Skills you have bought, with what you paid and whether each is still available.

Input schema

{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 200,
      "default": 50
    }
  },
  "additionalProperties": false
}

list_runbooks

List runbooks. scope="mine" needs a token; scope="public" browses the shared catalog anonymously.

Input schema

{
  "type": "object",
  "properties": {
    "scope": {
      "type": "string",
      "enum": [
        "mine",
        "public"
      ],
      "default": "mine"
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 200,
      "default": 50
    }
  },
  "additionalProperties": false
}

get_runbook

Full detail of one runbook, including its instructions and declared inputs.

Input schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}

create_runbook

Create a runbook: a stored agent brief with instructions, skills, tools and a budget. Starts private.

Input schema

{
  "type": "object",
  "properties": {
    "title": {
      "type": "string"
    },
    "instructions": {
      "type": "string",
      "description": "What the agent should do, in prose"
    },
    "role": {
      "type": "string",
      "description": "Who the agent is acting as"
    },
    "outcome": {
      "type": "string",
      "description": "What a finished run should produce"
    },
    "skillSlugs": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 20
    },
    "toolIds": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 20
    },
    "model": {
      "type": "string"
    },
    "budgetCents": {
      "type": "integer",
      "minimum": 0,
      "maximum": 100000
    },
    "maxIterations": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "visibility": {
      "type": "string",
      "enum": [
        "private",
        "unlisted",
        "public"
      ],
      "default": "private"
    }
  },
  "required": [
    "title",
    "instructions"
  ],
  "additionalProperties": false
}

update_runbook

Change a runbook you own. Pass only the fields you want changed.

Input schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "instructions": {
      "type": "string"
    },
    "role": {
      "type": "string"
    },
    "outcome": {
      "type": "string"
    },
    "skillSlugs": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 20
    },
    "toolIds": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 20
    },
    "model": {
      "type": "string"
    },
    "budgetCents": {
      "type": "integer",
      "minimum": 0,
      "maximum": 100000
    },
    "maxIterations": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "visibility": {
      "type": "string",
      "enum": [
        "private",
        "unlisted",
        "public"
      ]
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}

archive_runbook

Archive a runbook you own. It stops appearing and cannot be run.

Input schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}

list_runbook_runs

Your recent runbook runs with state, cost and a preview of the outcome.

Input schema

{
  "type": "object",
  "properties": {
    "runbookId": {
      "type": "string",
      "description": "Only runs of this runbook"
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 200,
      "default": 50
    }
  },
  "additionalProperties": false
}

get_runbook_run

One run in full, including the finished outcome.

Input schema

{
  "type": "object",
  "properties": {
    "runId": {
      "type": "string"
    }
  },
  "required": [
    "runId"
  ],
  "additionalProperties": false
}

start_runbook_run

Start a run and wait for it. This spends the account balance, so it needs the runbooks:run scope. Returns the outcome, or a run id to poll when the engine is handling execution.

Input schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Runbook id"
    },
    "inputs": {
      "type": "object",
      "description": "Values for the runbook's declared inputs"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}