MCP server

Tool reference

Every tool the PMKIN MCP server offers, and its arguments.

The PMKIN MCP server has 59 tools. They call the same code as the Management API, so the rules, limits and error messages are the same. This page is generated from the server’s own tool list, so it always matches what tools/list returns.

projectId

On https://mcp.pmkin.io/mcp, one connection reaches every project you can access, so every tool except list_projects and search_documents takes a projectId. On a connection to one project (a management token, or /p/<projectId>) you can leave it out.

Badges come from each tool’s annotations: Read-only tools change nothing, and Destructive ones remove or overwrite something, so clients may ask you before running them.

Find the projects a connection reaches, and documents in all of them.

list_projects#

Read-only

Lists the projects you can use, by team and name, with their ids. Pass a project's id as projectId to the other tools.

No arguments.

search_documents#

Read-only

Finds documents whose title, slug, excerpt or markdown contains the text, ignoring case, in all your projects or in one. Title matches come first, then the most recently updated. Returns each document's id, project, title, slug, status and matchedIn, the fields that matched. Read one with get_document and its projectId.

Arguments
qstringrequired
limitinteger
projectIdstring

list_documents#

Read-only

Lists the project's documents, most recently updated first, without their content: status, assignee, due date, word count and who last edited them. Filters combine.

Arguments
projectIdstringrequired
assigneeIdstring
categoryIdstring
clusterIdstring
dueAfterstring
dueBeforestring
limitinteger
offsetinteger
qstring
statusstring

get_document#

Read-only

Gets a document with its markdown content, version, status, assignee, cluster, due date, word count, publishAt when scheduled and review (the reviewer's feedback when it was sent back). Read a document before changing it and pass its version as baseVersion.

Arguments
idstringrequired
projectIdstringrequired

Plan and organize#

Start documents, ideas, categories and clusters as private drafts (intents), confirm them, and organize what exists.

get_project_summary#

Read-only

The project at a glance: how many documents are in each status and how many have a brief (briefCount), the review queue (oldest first, with who submitted each), planned and drafting documents due this week (overdue included) and what's scheduled. Lists hold at most 20 documents each.

Arguments
projectIdstringrequired
todaystring

list_members#

Read-only

Lists the people on the project's team, for a document's assigneeId. Agents are not assignees.

Arguments
projectIdstringrequired

create_document_intent#

Starts a private draft of a document. Only field types and lengths are checked, so pass what you know now and fill in the rest with update_document_intent. confirm_document_intent creates the document. A draft with a brief and no status becomes an idea; one without a brief becomes drafting.

Arguments
projectIdstringrequired
assigneeIdstring | null
briefobject | null
categoryIdstring | null
clusterIdstring | null
dueDatestring | null
markdownstring | null
slugstring | null
status"idea" | "planned" | "drafting" | null
titlestring | null

list_document_intents#

Read-only

Lists your document drafts, most recently updated first, at most 100. Drafts are private: nobody else sees yours. The list leaves out each draft's markdown; get_document_intent has it.

Arguments
projectIdstringrequired

get_document_intent#

Read-only

Gets one of your document drafts with its fields.

Arguments
idstringrequired
projectIdstringrequired

update_document_intent#

Idempotent

Changes one of your document drafts. Only the fields you pass change; null clears one. brief replaces the whole brief.

Arguments
idstringrequired
projectIdstringrequired
assigneeIdstring | null
briefobject | null
categoryIdstring | null
clusterIdstring | null
dueDatestring | null
markdownstring | null
slugstring | null
status"idea" | "planned" | "drafting" | null
titlestring | null

confirm_document_intent#

Creates the document from your draft and deletes the draft. Every field is checked first: when anything is missing or invalid, nothing is created and the error lists every problem at once. Fix them with update_document_intent and confirm again.

Arguments
idstringrequired
projectIdstringrequired

discard_document_intent#

Destructive

Deletes one of your document drafts for good. Nothing else changes.

Arguments
idstringrequired
projectIdstringrequired

list_categories#

Read-only

Lists the project's categories with their descriptions, which say what belongs in each. Use a category's id as a document's categoryId.

Arguments
projectIdstringrequired

create_category_intent#

Starts a private draft of a category. Only field types and lengths are checked, so pass what you know now and fill in the rest with update_category_intent. confirm_category_intent creates the category. The description is shown on the category page and read by agents as context, so say what belongs in it. The slug is lowercase and unique in the project. Pass categoryId to nest it under a parent.

Arguments
projectIdstringrequired
categoryIdstring | null
descriptionstring | null
namestring | null
slugstring | null

list_category_intents#

Read-only

Lists your category drafts, most recently updated first, at most 100. Drafts are private: nobody else sees yours.

Arguments
projectIdstringrequired

get_category_intent#

Read-only

Gets one of your category drafts with its fields.

Arguments
idstringrequired
projectIdstringrequired

update_category_intent#

Idempotent

Changes one of your category drafts. Only the fields you pass change; null clears one. Leave out categoryId, or clear it, for a top-level category.

Arguments
idstringrequired
projectIdstringrequired
categoryIdstring | null
descriptionstring | null
namestring | null
slugstring | null

confirm_category_intent#

Creates the category from your draft and deletes the draft. Every field is checked first: when anything is missing or invalid, nothing is created and the error lists every problem at once. Fix them with update_category_intent and confirm again.

Arguments
idstringrequired
projectIdstringrequired

discard_category_intent#

Destructive

Deletes one of your category drafts for good. Nothing else changes.

Arguments
idstringrequired
projectIdstringrequired

update_category#

Idempotent

Changes a category. Send all of name, slug and description; omitting categoryId makes it a top-level category. Documents keep their category.

Arguments
descriptionstringrequired
idstringrequired
namestringrequired
projectIdstringrequired
slugstringrequired
categoryIdstring

delete_category#

Destructive

Deletes a category for good. Its documents stay but lose the category, and its child categories become top-level. This can't be undone.

Arguments
idstringrequired
projectIdstringrequired

list_clusters#

Read-only

Lists the project's topic clusters by name: keywords, description and progress (published of total documents). Use a cluster's id as a document's clusterId.

Arguments
projectIdstringrequired

get_cluster#

Read-only

Gets a topic cluster with its keywords, progress and documents (id, title, status and slug each, furthest along first), to see what's covered and what's missing.

Arguments
idstringrequired
projectIdstringrequired

create_cluster_intent#

Starts a private draft of a topic cluster. Only field types and lengths are checked, so pass what you know now and fill in the rest with update_cluster_intent. confirm_cluster_intent creates the topic cluster. A topic cluster groups documents around one topic and its keywords. Add documents to it after confirming, with update_document_details and clusterId.

Arguments
projectIdstringrequired
descriptionstring | null
keywordsstring[] | null
namestring | null

list_cluster_intents#

Read-only

Lists your topic cluster drafts, most recently updated first, at most 100. Drafts are private: nobody else sees yours.

Arguments
projectIdstringrequired

get_cluster_intent#

Read-only

Gets one of your topic cluster drafts with its fields.

Arguments
idstringrequired
projectIdstringrequired

update_cluster_intent#

Idempotent

Changes one of your topic cluster drafts. Only the fields you pass change; null clears one. keywords replaces the whole list.

Arguments
idstringrequired
projectIdstringrequired
descriptionstring | null
keywordsstring[] | null
namestring | null

confirm_cluster_intent#

Creates the topic cluster from your draft and deletes the draft. Every field is checked first: when anything is missing or invalid, nothing is created and the error lists every problem at once. Fix them with update_cluster_intent and confirm again.

Arguments
idstringrequired
projectIdstringrequired

discard_cluster_intent#

Destructive

Deletes one of your topic cluster drafts for good. Nothing else changes.

Arguments
idstringrequired
projectIdstringrequired

update_cluster#

Idempotent

Changes a topic cluster's name, description or keywords. Only the fields you pass change; keywords replaces the whole list.

Arguments
idstringrequired
projectIdstringrequired
descriptionstring | null
keywordsstring[] | null
namestring

delete_cluster#

Destructive

Deletes a topic cluster for good. Its documents stay but leave the cluster. This can't be undone.

Arguments
idstringrequired
projectIdstringrequired

Briefs#

Offer work to agents with a brief, and claim a brief so no other agent takes it.

list_briefs#

Read-only

Lists briefs, due soonest first: the document's id, title, status and due date, and the brief's keyword, intent, state and category name. Defaults to ready briefs, the ones waiting for a writer.

Arguments
projectIdstringrequired
limitinteger
offsetinteger
statestring

get_brief#

Read-only

Gets a document's brief with the document's status, due date and version, its category with the description (context for what belongs there) and the titles and slugs of the internal links. brief is null when the document has none.

Arguments
idstringrequired
projectIdstringrequired

update_brief#

Idempotent

Changes a document's brief. Only the fields you pass change; null clears one. state: ready offers the brief to agents and state: none withdraws it (you can release your own claim, not another agent's). Returns the brief as get_brief does.

Arguments
idstringrequired
projectIdstringrequired
audiencestring | null
intentstring | null
internalLinksstring[] | null
keywordstring | null
notesstring | null
outlinestring | null
referenceUrlsstring[] | null
state"ready" | "none"
wordCountstring | null

claim_brief#

Idempotent

Claims a ready brief so no other agent takes it, and moves the document to drafting. Returns the brief as get_brief does. Fails with who claimed it when someone was first.

Arguments
idstringrequired
projectIdstringrequired

Write and images#

Write and edit the draft, set the details and SEO fields, and add images.

replace_document_content#

Destructive

Replaces the whole draft body. For changes to part of a document, use edit_document instead.

Arguments
baseVersionintegerrequired
idstringrequired
markdownstringrequired
projectIdstringrequired
messagestring

edit_document#

Changes part of the draft body with exact-text edits, applied in order. If any edit fails, nothing is written.

Each edit is one of:

  • {"oldText": "...", "newText": "..."}: replaces oldText, which must match exactly one place. Copy it from the content, including whitespace and markdown syntax.
  • {"append": "..."}: adds a paragraph at the end.
  • {"prepend": "..."}: adds a paragraph at the start.
Arguments
baseVersionintegerrequired
editsobject[]required
idstringrequired
projectIdstringrequired
messagestring

update_document_details#

Idempotent

Changes a document's title, slug, subtitle, excerpt, category, publish date, status, assignee, cluster, due date, cover image, or SEO meta title and description. Only the fields you pass change. A published document's live details change right away; its body does not.

Arguments
idstringrequired
projectIdstringrequired
assigneeIdstring | null
categoryIdstring | null
clusterIdstring | null
coverImageUrlstring | null
dueDatestring | null
excerptstring
metaDescriptionstring
metaTitlestring
publishedAtstring
slugstring
status"idea" | "planned" | "drafting"
subtitlestring
titlestring

import_image#

Fetches from the web

Copies an image from a public URL into pmkin's image storage and returns its pmkin url and a markdown line to insert. Use it instead of linking to images on other sites.

Arguments
projectIdstringrequired
urlstringrequired
altstring

upload_image#

Stores image bytes you have (for example a generated image or a screenshot), base64-encoded, up to 5 MB. Returns the image's url and a markdown line. For larger files use create_image_upload.

Arguments
datastringrequired
projectIdstringrequired
altstring

create_image_upload#

Starts an upload of up to 10 MB: returns an uploadUrl valid for 10 minutes. PUT the file's bytes to it with exactly the returned headers and a Content-Length of size, then call complete_image_upload with the imageId.

Arguments
contentType"image/jpeg" | "image/png" | "image/webp" | "image/gif" | "image/avif"required
projectIdstringrequired
sizeintegerrequired

complete_image_upload#

Idempotent

Confirms an upload started with create_image_upload once the PUT succeeded. Returns the image's url and a markdown line.

Arguments
imageIdstringrequired
projectIdstringrequired
altstring

Review and publish#

Submit for review, approve or ask for changes, then publish now or on a date.

submit_for_review#

Sends a document to review, so a person (or a reviewer agent) can approve it or request changes. The draft must have content. A published document stays live while it's in review. A claimed brief becomes drafted.

Arguments
idstringrequired
projectIdstringrequired
messagestring

approve_document#

Approves a document in review: publishes it now, or schedules it with a future publishAt. The document needs a title and a slug.

Arguments
idstringrequired
projectIdstringrequired
publishAtstring

request_changes#

Sends a document in review back to drafting with feedback for whoever revises it. They read it as review.feedback from get_document.

Arguments
idstringrequired
projectIdstringrequired
feedbackstring

publish_document#

Idempotent

Publishes the current draft, so websites serve it. With a future publishAt, schedules the current version to publish then instead. Details you pass are saved first; the document needs a title and a slug.

Arguments
idstringrequired
projectIdstringrequired
categoryIdstring | null
excerptstring
publishAtstring
publishedAtstring
slugstring
subtitlestring
titlestring

schedule_document#

Idempotent

Schedules the current version to publish at publishAt. On a scheduled document, moves the date and keeps the approved version. The document needs a title and a slug.

Arguments
idstringrequired
projectIdstringrequired
publishAtstringrequired

unschedule_document#

Idempotent

Cancels a scheduled publish. The document goes back to drafting, or to review with status: review.

Arguments
idstringrequired
projectIdstringrequired
status"drafting" | "review"

unpublish_document#

DestructiveIdempotent

Takes a document off websites. The draft and its history stay.

Arguments
idstringrequired
projectIdstringrequired

delete_document#

Destructive

Deletes a document: it leaves every list and websites stop serving it. A scheduled document loses its schedule and goes back to drafting. This can be undone with restore_document.

Arguments
idstringrequired
projectIdstringrequired

restore_document#

Brings back a deleted document with its content, status and history. A document that was published is live again. Find the ids of deleted documents in list_activity (document.deleted).

Arguments
idstringrequired
projectIdstringrequired

History and activity#

Go back to earlier content, and see who changed what in the project.

list_revisions#

Read-only

Lists a document's revisions, newest first, without their content: version, author, source, message and whether it was published.

Arguments
idstringrequired
projectIdstringrequired
limitinteger
offsetinteger

get_revision#

Read-only

Gets one revision of a document with its content.

Arguments
idstringrequired
projectIdstringrequired
versionintegerrequired

restore_revision#

Writes an earlier revision's content as a new version of the draft. History is kept, so this can be undone.

Arguments
baseVersionintegerrequired
idstringrequired
projectIdstringrequired
versionintegerrequired
messagestring

list_activity#

Read-only

Lists recent changes in the project, newest first: who did what to which document, and with which tool. Pass documentId for one document's history.

Arguments
projectIdstringrequired
documentIdstring
limitinteger
offsetinteger

Search Console#

Read Google Search Console data once the project is connected, to plan and update content.

get_search_summary#

Read-only

Google Search Console totals for the project's site: clicks, impressions, CTR and average position for the last 28 days of final data and the 28 days before, plus daily clicks and impressions. Data is about three days behind. Fails with a message when Search Console isn't connected or its first import hasn't finished.

Arguments
projectIdstringrequired
daysinteger

list_search_queries#

Read-only

Search queries the site appeared for in the last 28 days, with clicks, impressions, CTR, average position, the previous 28 days' numbers, and the document whose page got the most impressions for it (null when no document matches). Use it to pick keywords for briefs; check list_briefs first so a keyword isn't planned twice. A query with many impressions but a position past 10, or no document, is a candidate for a new idea.

Arguments
projectIdstringrequired
documentIdstring
limitinteger
offsetinteger
qstring
sort"clicks" | "impressions" | "ctr" | "position"

list_search_pages#

Read-only

The site's pages in Google search over the last 28 days, with clicks, impressions, CTR, average position, the previous 28 days' numbers and the matching document (null for pages that aren't pmkin documents).

Arguments
projectIdstringrequired
limitinteger
offsetinteger
sort"clicks" | "impressions" | "ctr" | "position"

get_document_search_performance#

Read-only

How a document does in Google search: totals for the last 28 days and the 28 before, 90 days of daily clicks and impressions, and its 10 top queries. Read it before updating a live document so the update keeps what already ranks.

Arguments
idstringrequired
projectIdstringrequired