Hosted MCP — the 24 tools your agent gets

Every tool exposed at https://mcp.getpromethic.com/v1. All tools are namespaced promethic_<name> on the wire (underscore separator — Anthropic's Tool API name regex is ^[a-zA-Z0-9_-]{1,64}$). Connect with your pmk_ key as a Bearer header (Claude Desktop, Cursor, Codex CLI) or via OAuth (Claude.ai web/iOS, ChatGPT) — see /agents for client-specific config.

Scopes:

discovery always allowed (no scope check)   read needs read scope   execute needs execute scope   write needs write scope

Per-tool grants are opt-in hardening on top of scopes — see agent docs.

Discovery 1 tool · always allowed

get_catalogdiscovery

Fetch the active model catalog (families, models, parameter schemas). Returns the data needed to choose model_id and build a valid parameters object for create_prompt / create_version. Cache for the session — the catalog is stable per deploy.

Prompts 5 tools

list_promptsread

List the user's prompts (cursor-paginated). Pass cursor from a prior response's nextCursor to page; bogus cursors return invalid_cursor rather than silently falling back to the first page. Returns each prompt's id, name, currentVersionId, updatedAtUtc. Grant-restricted keys see only granted prompts.

get_promptread

Fetch a prompt by promptId, including its current version's promptText and modelSettingsJson. Response also includes currentVersionStatus = 'ok' | 'missing' so agents can detect when a prompt's currentVersionId points to a deleted version (call list_versions + switch_current_version to repair, or create_version with setAsCurrent: true).

create_promptwrite

Create a new prompt with an initial version. Top-level fields: name, promptText, modelSettings (object: {model_id, parameters}). Returns {promptId, currentVersionId}. Call get_catalog for valid model_id values + parameter shapes.

update_promptwrite

Patch a prompt's metadata (name, abbreviation). RFC 7396 merge-patch semantics: pass null to clear, omit to leave unchanged. Note: capability descriptions are now per-version — use update_version to edit them.

delete_promptwrite

Soft-delete a prompt. Cascades hide records/versions/attachments under it; sweep job hard-deletes later. Requires per-prompt grant if the API key is restricted.

Versions 6 tools

list_versionsread

List all versions of a prompt (cursor-paginated). Response includes currentVersionId at the top level (so you don't have to round-trip get_prompt to know which version is active) plus each version's id, versionNumber, and updatedAtUtc.

get_versionread

Fetch a single prompt version by id. Returns full promptText and modelSettingsJson.

create_versionwrite

Append a new version to an existing prompt. The new version's versionNumber auto-increments server-side. Pass setAsCurrent: true to also activate it (atomic create + switch in one transaction).

update_versionwrite

Patch a version's metadata (versionDescription, description, descriptionMode). RFC 7396 merge-patch. Does NOT change promptText or modelSettings — those define the version's identity; create a new version for behavioral changes. Server-owned description: in Auto mode (the default), the server regenerates the capability description from promptText via gpt-5.4-nano on every promptText change. To take ownership and write the field yourself, send { description: "…", descriptionMode: 1 } in the same request — flipping to Manual atomically with the write. Otherwise description writes are silently ignored in Auto.

switch_current_versionwrite

Set the prompt's currentVersionId. Used by an agent that just created a new version and wants to make it default.

delete_versionwrite

Soft-delete a non-current version. Server returns 409 version_is_current if it's the prompt's current version — call switch_current_version first if needed.

Runs 5 tools · streaming

run_promptexecute

Run a prompt as a new conversation. Required: promptId. Optional: userInput (the user's text for this turn), versionId (defaults to current), autoFinalize (default true). Streams output server-side and returns the final text in the tool's content[0].text. Image-modality runs return generated image bytes inline as MCP image content blocks (one per image, base64 PNG) so MCP-aware clients render them directly — no follow-up fetch needed. When autoFinalize: true the run also chains a finalize, returning a saved recordId via the SSE record_finalized event.

revise_runexecute

NOT a chat append. Re-renders the prompt's output with a revision instruction — the model receives a synthetic wrapper (Original input: … + Previous output: … + Revision instruction: …) and produces a fresh full output that supersedes the prior one. For multi-turn dialog, start a NEW run instead. Required: userInput AND exactly one of runId XOR recordId. Optional: intermediateOutput (overrides the model's prior-turn output), fromTurn (rewind primitive — drops session turns > N before applying). Same image-content-block delivery as run_prompt.

finalize_runexecute

Promote an active run to a saved record. Idempotent (returns the same record) if the run already auto-finalized. Required: runId. Optional: finalText (Copy-with-edits — producing a value that differs from the model output creates an EDIT delta), tag (label for that EDIT delta — requires finalText to be present and to differ from the model output; use notes for record-level labels), notes (free-form record-level label), fromTurn. Calling on an already-Finalized session with new content reopens + re-finalizes. Validation errors (bad tag/fromTurn/finalText) reject without state mutation — no zombie sessions.

abandon_runexecute

Drop an active run without finalizing. Required: runId. Idempotent. Returns 409 run_already_terminal if the run already completed.

get_run_imageexecute

Fetch an image from an active (non-finalized) run by 0-based index. Required: runId, n. Returns a single MCP image content block (base64 PNG). Most agents won't need this — run_prompt already returns images inline as content blocks. Use when revisiting an active run after losing the original tool result, or to re-fetch a specific image. For finalized records, use GET /api/v2/records/{recordId}/image?index={n} instead.

Records 3 tools

list_recordsread

List finalized records (cursor-paginated). Filter by promptId. Returns slim DTOs with model output, cost (costMicroCents), image counts, and timestamps. Most-recent-first. Image records: outputText is null (the model output is the image, not text); imageStoredPaths is a typed array of opaque blob keys — fetch bytes via GET /api/v2/public/records/{id}/image?index=N.

patch_recordexecute

Update notes and/or tag on a record the caller created. Same-source-same-principal: ApiKey callers must match the creating key; OAuth callers (chat MCP) can manage their own records. Tag attaches to the record's edit delta — server returns 409 record_no_edit_delta if no edit delta exists. Pass null to clear a field; omit to leave unchanged.

delete_recordexecute

Soft-delete a record the caller created (same ownership rules as patch_record). Sweep job hard-deletes later. Records are execute-axis, not write.

Attachments 4 tools

upload_attachmentwrite

Upload a file as a prompt attachment (text or image). Bytes via inline base64 or local file path. Server caps: per-file 10MB image / 5MB text; per-prompt 50MB total; per-user storage quota. Idempotent on (promptId, filename, content) — retries don't double-bill storage. TRUST: localPath is read by the MCP server with the user's permissions — only use paths the agent is authorized to read.

list_attachmentsread

List a prompt's attachments. Returns slim DTOs (id, filename, type, size, createdAt). Use get_attachment to fetch the bytes.

get_attachmentread

Fetch an attachment's content. Reply has explicit kind: 'image' (returns imageMediaRef), 'text' (returns inline utf-8 string for text/json/xml/yaml), or 'binary' (returns mediaRef for any other content type — PDF/audio/video/octet-stream — instead of a corrupt UTF-8 decode). Inline ≤16MB raw, else a local tmpfile path.

delete_attachmentwrite

Soft-delete an attachment + refund its bytes against the per-user storage quota. Server returns 409 attachment_referenced_by_active_run if any non-terminal run still uses this blob (retry after the run finalizes/expires).

Per-prompt synthesized tools opt-in · cap 50 per account

For prompts users explicitly toggle on, the MCP host synthesizes an additional tool per prompt — named promethic_{slug} (e.g. promethic_clay_cuties). Agents invoke it by name in one round-trip — no list_prompts + get_prompt + run_prompt sequence. The tool's description field carries the version's capability description so the calling LLM can decide whether to use it without an extra fetch.

promethic_{slug}execute

Synthesized at tools/list emit time when the prompt has ExposeAsMcpTool=true. Input schema is a single optional userInput string. Dispatch resolves the prompt by exact-match (UserId, McpToolName), then runs the same pipeline as run_prompt. If the user toggles exposure off (or deletes the prompt) the tool name returns unknown_tool with a hint to re-list. Tool name is stable across prompt renames — an agent with a hardcoded name keeps working when the user tweaks the prompt's display name. If the user wants the tool name re-derived from the new prompt name, they click "Update tool name" in the settings panel (which calls POST /api/v2/prompts/{id}/mcp-rename).

Discovery: these only appear when the user has toggled them on (Settings panel on the prompt). MCP hosts cache tools/list aggressively — after a toggle, the user may need to start a new conversation or reconnect the connector for the new tool to appear.

Looking for a tutorial? See Build an agent in 10 minutes for a worked example. For the full reference (request shapes, error codes, idempotency contract, recovery recipes), see api.getpromethic.com/agent-api-v1.