Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Kaiku

REMOTE · MCP.KAIKU.TECH · 2 COMPONENTS · SCANNED SEP 23

Issue tracker and wiki for teams and their agents: find, file and update issues, write pages.

74 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security89
Transport & Reachability100
Schema Quality & AI Usability66
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 20317 tokens (~274/item across 74 items; 74 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management3
  • Stability observed for 1 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 12 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "admin_bank_transfer" implies "transfer" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
  • An AI judge read all 75 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the Kaiku MCP server?

Kaiku is a hosted endpoint at https://mcp.kaiku.tech/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · mcp.kaiku.tech

# add to Claude Code
claude mcp add --transport http tech-kaiku-kaiku 'https://mcp.kaiku.tech/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "tech-kaiku-kaiku": {
      "url": "https://mcp.kaiku.tech/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "tech-kaiku-kaiku": {
      "type": "http",
      "url": "https://mcp.kaiku.tech/mcp"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.tech-kaiku-kaiku]
url = "https://mcp.kaiku.tech/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "tech-kaiku-kaiku": {
      "type": "remote",
      "url": "https://mcp.kaiku.tech/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add tech-kaiku-kaiku --url 'https://mcp.kaiku.tech/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  tech-kaiku-kaiku:
    url: "https://mcp.kaiku.tech/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "tech-kaiku-kaiku": {
      "Transport": "http",
      "Url": "https://mcp.kaiku.tech/mcp"
    }
  }
}
# add to Vellum
assistant mcp add tech-kaiku-kaiku -t streamable-http -u 'https://mcp.kaiku.tech/mcp'
// mcp.json
{
  "mcpServers": {
    "tech-kaiku-kaiku": {
      "type": "http",
      "url": "https://mcp.kaiku.tech/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 23 Sept 26 0
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “add_attachment” rewrote its description, which is the text the model reads security
    • Tool “add_wiki_attachment” rewrote its description, which is the text the model reads security
    • Tool “get_attachment” rewrote its description, which is the text the model reads security
    • Tool “get_wiki_attachment” rewrote its description, which is the text the model reads security
    • Stability: unverified → 0.03 functional
    • New tool “local_files_setup” functional
  • 22 Sept 26 74

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 23 Sept 2026 · Probed https://mcp.kaiku.tech/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=*.kaiku.tech CN=YR1,O=Let's Encrypt,C=US 23 Aug 2026 21 Nov 2026 RSA 4096 SHA256-RSA 6c9d9025f51a369dcf0d95953df9c2a41a6
SANs: *.kaiku.tech
CN=YR1,O=Let's Encrypt,C=US (CA) CN=Root YR,O=ISRG,C=US 3 Sept 2025 2 Sept 2028 RSA 2048 SHA256-RSA a20253f15f2691c05dc1ce13b9bcca4e
CN=Root YR,O=ISRG,C=US (CA) CN=ISRG Root X1,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 RSA 4096 SHA256-RSA f24b6d17f9d9ad7cb1c9fea78782699f

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of mcp.kaiku.tech. Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
tech. present 2185 13 Verified
kaiku.tech. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication Challenged, unverified

The endpoint asked for a token, but we could not retrieve and validate the RFC 9728 metadata that tells a client how to obtain one.

Result Challenged, unverified
Enforced On tool calls
HTTP status 200

WWW-Authenticate challenge Bearer realm="mcp"

Bearer realm="mcp"
Header Value
strict-transport-security max-age=31536000

Protected resource metadata

Retrieved No
Problem no_resource_metadata

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://mcp.kaiku.tech/mcp Verified 200
http (plaintext) http://mcp.kaiku.tech/mcp HTTPS enforced 301 https://mcp.kaiku.tech/mcp
MCP tools · 74 exposed · ~18,469 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
add_attachment ~304

Attach a file to an issue: pass its bytes as 'contentBase64', or its content as 'text' when the file is text. Attaching a filename the issue already has replaces that file rather than adding a second copy, so retrying this call cannot double it. A file on the person's own disk — a screenshot, a PDF — is better attached by path through the pm-files MCP server than typed out as base64; local_files_setup says how to connect it. Returns the attachment's download URL. Requires permission to edit issues in that project.

NameTypeReqDescription
contentBase64string|nullThe file's bytes, base64-encoded (a 'data:…;base64,…' URL is accepted and unwrapped). Use 'text' instead when the file is text.
filenamestringyesFile name to store, e.g. 'report.pdf'. Any directory part is dropped.
keystringyesIssue key, e.g. 'UK-1'.
mimeTypestring|nullContent type to record for the listing, e.g. 'text/csv'. Ignored when the bytes identify themselves (a PNG is a PNG whatever you call it), and never used to serve the file.
textstring|nullThe file's content as text, stored as UTF-8 — for a log, CSV or Markdown file you are writing here. Alternative to 'contentBase64'; passing both is refused.

No output schema declared.

No examples provided.

add_comment ~350

Add a comment to an issue, or reply to one of its comments ('replyTo' is a comment id from get_comments). A reply notifies the author of the comment it answers, whether or not they watch the issue — no mention needed — and they are told once even if also mentioned. Requires permission to comment in that project (read-only members cannot). Answers with 'notified' (who this actually reaches, the answered author included), 'answered' (for a reply: whose comment it answers, and 'notified' false with a 'reason' when they are not told) and 'unresolvedMentions' (what looked like a mention and reached nobody, each with a reason) — a wrong handle is stored as written and never refused, so that list is the only sign it did not land. Where the workspace has agents, [~agent:role] (e.g. [~agent:product]) calls one to answer in the thread on your behalf: 'agents' lists each call with its requestId and status, and an agent that will not come is in 'unresolvedMentions' with its reason (agent_unknown, agent_off, agent_plan, agent_budget, too_many).

NameTypeReqDescription
bodystringyesComment body. Markdown is kept as written, and carries $…$ / $$…$$ LaTeX formulas and [~username] mentions (the username, which list_users hands you ready-made — never the display name).
keystringyesIssue key, e.g. 'UK-1'.
replyTointeger|nullThe comment this one answers, as returned by get_comments — on the same issue and not deleted.

No output schema declared.

No examples provided.

add_wiki_attachment ~437

Attach a file to a wiki page, identified by 'pageId' or by 'spaceKey' + 'title': pass its bytes as 'contentBase64', or its content as 'text' when the file is text. Re-attaching a filename the page already has replaces its bytes and bumps its version, as the wiki does everywhere else, so retrying this call cannot leave two copies. A file on the person's own disk — a screenshot, a PDF — is better attached by path through the pm-files MCP server than typed out as base64; local_files_setup says how to connect it. An attached file is not *on* the page until the body references it — the answer hands you the Markdown to add with update_wiki_page. An image may also carry a dark-theme version, attached as the same name with '-dark' before the extension (diagram.svg + diagram-dark.svg); the body still references the plain name. Requires permission to edit the page.

NameTypeReqDescription
commentstring|nullShort note about this upload, shown in the page's attachment list.
contentBase64string|nullThe file's bytes, base64-encoded (a 'data:…;base64,…' URL is accepted and unwrapped). Use 'text' instead when the file is text.
filenamestringyesFile name to store, e.g. 'diagram.png'. Any directory part is dropped.
mimeTypestring|nullContent type to record for the listing, e.g. 'text/csv'. Ignored when the bytes identify themselves, and never used to serve the file.
pageIdinteger|nullPage id (as returned by search_wiki).
spaceKeystring|nullSpace key, when identifying the page by title.
textstring|nullThe file's content as text, stored as UTF-8 — for a log, CSV or Markdown file you are writing here. Alternative to 'contentBase64'; passing both is refused.
titlestring|nullExact page title, when identifying the page by title.

No output schema declared.

No examples provided.

add_wiki_comment ~314

Comment on a wiki page, or reply to one of its comments ('replyTo' is a comment id from get_wiki_page). A reply notifies the author of the comment it answers, whether or not they watch the page — no mention needed — and they are told once even if also mentioned. Identify the page by 'pageId', or by 'spaceKey' + 'title'. Markdown is rendered; mention someone as [@Their Name](user:username), the wiki's own form. Requires permission to comment in that project. Answers with 'notified' (who this actually reaches, the answered author included), 'answered' (for a reply: whose comment it answers, and 'notified' false with a 'reason' when they are not told) and 'unresolvedMentions' (what looked like a mention and reached nobody, each with a reason) — a wrong handle is stored as written and never refused, so that list is the only sign it did not land.

NameTypeReqDescription
bodystringyesComment body as Markdown, which also carries $…$ / $$…$$ LaTeX formulas.
pageIdinteger|nullPage id (as returned by search_wiki).
replyTointeger|nullThe comment this one answers, as returned by get_wiki_page.
spaceKeystring|nullSpace key, when identifying the page by title.
titlestring|nullExact page title, when identifying the page by title.

No output schema declared.

No examples provided.

admin_bank_transfer ~143

Administrators only: where a bank transfer is to be sent (PM-625) — beneficiary, account and its own currency, bank and SWIFT, the intermediary bank if there is one, the purpose line, how many days a wire is given, and who last changed all of it. 'offered' is the one flag that answers «may a customer pick a transfer right now»: it is switched on AND carrying everything a payment needs, which is not the same as 'enabled'. A bill already issued carries its own frozen copy of these details and is not changed by what this returns. Amounts are always USD, whatever the account's own currency is.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

admin_errors_week ~115

Administrators only: the error collector's week — events and distinct errors per project against the week before, errors first seen that week with their release, the loudest by events and by people, and errors that came back after being resolved. The same numbers the weekly error report carries. A project the collector did not answer about has null counts and a reason, never zeros. Ask for an earlier week with weeksAgo.

NameTypeReqDescription
weeksAgointeger0 is the last full week, 1 the one before it.

No output schema declared.

No examples provided.

admin_funnel ~365

Administrators only: the installation as a business over a period — registrations, how many of them became working companies, purchases and conversion by cohort, churn, and money. Money comes in two halves that must not be added together: 'stock' is what recurs every month at today's prices, 'revenue' is what actually arrived inside the period. Each carries its own currency. Figures come from the fleet's ledger, so 'machines' says how current each machine's copy is — a machine that is behind makes the totals older than they look, it does not make them wrong. 'activation' is how many of the companies registered in the period have had their first agent come in (the first request with a configured token), and how soon — within the hour, the day, the week. 'ai' is AI as money over the same period — what our key's calls cost at each provider, what companies were charged, the margin, the cost nobody was charged for and why, what has accrued and what 'ai' invoices still want — and is neither in 'stock' nor in 'revenue'. Its totals are null, never zero, while a machine has not reported its AI: 'ai.missing' names it and 'ai.reported' is the sum over the machines that did. Default period: the last 90 days.

NameTypeReqDescription
daysinteger|nullHow many days back from today. Defaults to 90, at most 730. Ignored when 'from' and 'to' are given.
fromstring|nullStart of the period, as YYYY-MM-DD. Use with 'to'.
tostring|nullEnd of the period, as YYYY-MM-DD, included. Use with 'from'.

No output schema declared.

No examples provided.

admin_invoices ~185

Administrators only: what companies were asked to pay and what answered it — each invoice with its amount, its coin, whether it is paid and what is short, and the payments against it. Amounts are never added across coins: each row carries its own currency and they stay apart. The list is the fleet's ledger, so 'machines' says how current each machine's copy is. One invoice's delivery record belongs to the machine that took the payment and is not rolled up — the answer says so where it is missing rather than showing an empty list.

NameTypeReqDescription
limitintegerHow many rows, newest first. Default 50, at most 100.
slugstring|nullOnly invoices of the company at this address.
statusstring|nullOnly invoices in this state, e.g. 'open', 'paid', 'void'.

No output schema declared.

No examples provided.

admin_landing_week ~91

Administrators only: the landing site's week — visits, where they came from, clicks on sign-up, and the registrations that followed. The same numbers the weekly report carries into the monitoring chat. Ask for an earlier week with weeksAgo. The rendered message is not returned, only the figures.

NameTypeReqDescription
weeksAgointeger0 is the last full week, 1 the one before it.

No output schema declared.

No examples provided.

admin_load ~130

Administrators only: how loaded this machine is and what the language models cost. Load is this machine's own — database, streams, memory, processor, traffic and stored bytes, each as used against allowed, where an allowance is known. Model spend covers the assistant, search-by-sentence and translation over a rolling window, with totals and breakdowns by feature, by model and by day; costs are estimates from the prices recorded at the time. Who spent it is not returned here.

NameTypeReqDescription
daysintegerWindow for model spend, in days. Default 30; 0 means all time.

No output schema declared.

No examples provided.

admin_overview ~127

Administrators only: the whole installation by the numbers — accounts, workspaces, projects, issues, comments and sprints, plus issues broken down by status and by project. Counted across every workspace, which is what makes it the installation's rather than one company's. A total is null, never zero, when a machine of the fleet did not answer: 'fleet' says which machines were asked and which are missing, and 'here' is always what this machine counted. The breakdowns are this machine's. Read a null as 'nobody knows', never as 'none'.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

admin_set_bank_transfer ~538

Administrators only, and this one CHANGES things: state where bank transfers are to be sent. Send the WHOLE set every time — anything left out is cleared, not kept, because details half of one bank and half of another are money sent to a mixture of two. Read admin_bank_transfer first and repeat what you are not changing. Switching the method on is refused while anything a payment needs is missing (beneficiary, account, swift, and a purpose line carrying {invoice}), and the refusal names the field; switching it off is never refused. 'minimumUsd' is a floor under the METHOD and not under the debt: a bill below it is offered the other ways to pay, and what is owed does not change. The change is recorded against the calling administrator. Bills already issued keep the details they were issued with.

NameTypeReqDescription
accountstring|nullThe account number or IBAN.
accountCurrencystring|nullThe account's OWN currency, e.g. 'AMD'. Bills stay in USD; this is what the receiving bank converts into.
bankNamestring|nullThe bank's name and address.
beneficiarystring|nullWho the money is sent to — the account holder's name as the bank has it.
daysToArriveinteger|nullHow many days a wire is given to arrive, 1 to 60. The period stays open that long. Left out, the stored number is kept (7 to start with).
enabledbooleanyesWhether this installation takes transfers. On is refused while a required field is missing; off never is.
intermediaryAccountstring|nullOur account at the intermediary bank.
intermediaryBankstring|nullThe intermediary bank's name, where one is needed.
intermediarySwiftstring|nullThe intermediary bank's SWIFT/BIC.
minimumUsdnumber|nullThe smallest bill that may be paid by transfer, in USD — correspondent fees eat a small one. Left out there is NO floor, which is the cleared state and not zero; a customer under it is offered the ot…
notestring|nullA line for the payer, e.g. which charges are whose. Shown with the details.
purposestring|nullWhat the payer must write as the purpose. Has to carry {invoice} — a transfer that does not name its bill arrives as a sum nobody can place. Defaults to 'Invoice {invoice}'.
swiftstring|nullThe bank's SWIFT/BIC.

No output schema declared.

No examples provided.

admin_workspace_journal ~142

Administrators only: what was done to one company and by whom — created, plan changed, period extended by hand, credited, suspended, resumed, erased — newest first, up to a hundred entries, each with the reason that was written down at the time. This is the answer to 'why is this company on a period nobody paid for'. The actor is our own operator, and is named because an entry without one answers nothing. A company living on another machine of the fleet is not here: the answer then names the machine to ask.

NameTypeReqDescription
slugstringyesThe company's address — 'acme' in acme.kaiku.tech.

No output schema declared.

No examples provided.

admin_workspaces ~286

Administrators only: every company on the installation — its plan, what state it is in (trial, active, over-limit, suspended…), when what it paid for runs out, how many days are left, what it is using against what it may use, and its balance. Ask with endingInDays to get only the ones running out that soon, which is how 'whose trial ends this week' is answered in one call. 'attention' is the console's own short list of rows somebody has to look at. A meter reading null means the machine holding that company was not asked, not that it is idle. Owners are left out unless withOwners is true, and an e-mail address is never returned.

NameTypeReqDescription
endingInDaysinteger|nullOnly companies whose paid-for period ends within this many days. 0 means already run out.
slugstring|nullOnly the company at this address ('acme' in acme.kaiku.tech).
statusstring|nullOnly companies in this state: 'trial', 'active', 'free', 'over-limit', 'expired', 'suspended'.
withOwnersbooleanInclude who owns each company — username and display name, never an e-mail. Off by default: this is a statistics surface, and a list of customers with names on it is a customer list.

No output schema declared.

No examples provided.

answer_issue_question ~195

Answer a question that was put to you on an issue, by choosing one of its options. Only the person the question was addressed to may answer it; answering again with a different option changes the answer and says so in the thread. A question whose deadline already passed can still be answered — that replaces whatever the deadline took, and the change is recorded. The answer is written into the thread as an ordinary comment and the asker is told.

NameTypeReqDescription
notestring|nullWords of your own beside the option — a qualification, not the answer itself ('Postgres, but only after the migration lands'). Ignored when the asker switched free text off; check 'allowsFreeText' on…
optionintegeryesWhich option to choose, counted from 0 in the order they were offered.
questionIdintegeryesThe question's id, as returned by list_issue_questions or ask_issue_question.

No output schema declared.

No examples provided.

ask_issue_question ~435

Ask one person a question with pre-written answer options, in an issue's thread — the way to get a decision that does not get lost in the comment stream. The question appears as an ordinary comment (so every Jira-speaking reader sees it) and is tracked separately: the person you ask sees it counted in their Questions list until they answer. It does not wait for ever — give 'defaultOption' and the deadline takes it if nobody answers, so a blocked run can go on. Requires permission to comment in that project. NOTE: this is not the bgs 'ask_question' tool, which is the background-agent ledger — this one is a question to a person on a PM issue.

NameTypeReqDescription
allowFreeTextbooleanWhether the answerer may add words of their own beside the option they choose. Defaults to true. Set false when the answer has to be machine-comparable and nothing else.
defaultOptioninteger|nullWhich option to take if nobody answers before the deadline, counted from 0. Give one whenever there is a safe assumption — it is what lets you carry on rather than stall. Omit it when no option is sa…
keystringyesIssue key, e.g. 'UK-1'.
optionsarrayyesThe answer options, in the order to offer them: at least 2, at most 8, each a short label rather than a paragraph. Fewer than two is not a question with options — that is a comment.
questionstringyesThe question itself. Keep it to what the options answer.
tostringyesWho to ask: the username, which list_users hands you ready-made — never the display name. They must be able to see this project, and it cannot be you.
ttlHoursinteger|nullHow long to wait, in hours. Omitted is 48 (two days). 0 means no deadline at all — the question waits until somebody answers it, which is rarely what an agent wants.

No output schema declared.

No examples provided.

create_issue ~312

Create an issue in a project visible to this token. Returns the new issue key. Requires permission to create issues in that project. Answers with 'notified' (who this actually reaches) and 'unresolvedMentions' (what looked like a mention and reached nobody, each with a reason) — a wrong handle is stored as written and never refused, so that list is the only sign it did not land.

NameTypeReqDescription
assigneestring|nullAssignee username or email. Omit to leave unassigned.
descriptionstring|nullIssue description. Markdown is kept as written, and carries $…$ / $$…$$ LaTeX formulas and [~username] mentions (the username, which list_users hands you ready-made — never the display name).
dueDatestring|nullThe day this is due, as YYYY-MM-DD. A calendar day, not a timestamp — do not send a time or a zone.
labelsstring|nullLabels to set, space or comma separated.
parentKeystring|nullParent issue key, to create this as a child/sub-task.
prioritystring|nullPriority name, e.g. 'High'.
projectKeystringyesProject key, e.g. 'UK'.
summarystringyesIssue summary (title).
typestring|nullIssue type name, e.g. 'Task', 'Bug', 'Story', 'Epic'. Defaults to 'Task'.

No output schema declared.

No examples provided.

create_project ~426

Administrators only: create a project — a new key, a starter board, and its own wiki space, led by you unless you name someone else. The key is yours to choose and is never invented for you: one already taken is refused, naming the project holding it, rather than quietly becoming KEY2 — the key shows in every issue key, link and commit, and renaming it later costs more than creating the project did. Calling it again with the same key and name returns that same project with created:false, so a retry after a lost answer cannot make a second project. Deleting one is not offered here: that is a decision a person makes looking at what is inside. Who may: an administrator of this workspace, or — for a subproject — the lead of the parent, since it hands over their own project's people.

NameTypeReqDescription
descriptionstring|nullWhat the project is for. Markdown.
keystringyesProject key, 2–10 characters: a letter followed by letters or digits, e.g. 'BGS'. Uppercased.
leadstring|nullUsername or email of the project lead. Defaults to you — a project with no lead is one nobody can configure: export, colour, the bgs connection and access grants all need a lead or an admin.
namestringyesProject name, e.g. 'Background agents'.
parentKeystring|nullKey of the project this one is a subproject of. Everybody who may reach the parent may reach this project too, in the role they hold there — so add only the people the parent does not already have. L…
projectTypeKeystring|nullJira project type: 'software' (the default), 'business' or 'service_desk'.

No output schema declared.

No examples provided.

create_project_rule ~809

Add a rule to a project: when an issue enters 'status', append 'template' to its description. A rule appends its checklist to an issue's description when the issue ENTERS the rule's state — from the board, the Jira API or update_issue alike. The block starts with a hidden marker line '[//]: # (pm-rule:<id>)'; while that line is in the description, entering the state again adds nothing (the journal says 'alreadyThere'). A [~username] in the template is a mention: that person is notified when the checklist lands. A checklist that would make the description too long is not added and the journal says 'tooLong'; the move itself still happens. A rule with action 'agent' is a DUTY instead: it says which issues may be handed to an agent role (agentRole, e.g. 'product') and what the agent may do with them. Its 'template' is then the INSTRUCTION — what doing such an issue means in this project — and nothing is appended anywhere. A duty may have no state (pass an empty 'status'): then an issue is handed only by a person. agentActions is a list from: describe, subtasks, ask, wiki, report, support. agentFields names the fields it may set: priority, labels, duedate, or the project's own fields by name. doneStatus is the state it moves the issue to when done — never a finished one. capUsd raises what one task may cost, up to 5 dollars. Commenting is always allowed; finishing, deleting, reassigning and anything outside the issue never are. Saving or switching on a duty makes it yours: it runs on your behalf and access, and is switched off if you lose the project. The state and the type are NAMES of this project's own (list_project_rules lists them); an unknown one is refused with the list. Project lead or admin only.

NameTypeReqDescription
actionstring|null'checklist' (the default) or 'agent' for a duty. Fixed once the rule exists.
agentActionsstring|nullFor a duty: what the agent may do beyond commenting, comma-separated — describe, subtasks, ask, wiki, report, support.
agentFieldsstring|nullFor a duty: the fields it may set, comma-separated — priority, labels, duedate, or a project field's name.
agentRolestring|nullFor a duty: the agent role's key, e.g. 'product'.
capUsdnumber|nullFor a duty: what one task may cost, in dollars, when more than the ordinary ceiling is needed. At most 5.
doneStatusstring|nullFor a duty: the state it moves the issue to when done. Never a finished state. Leave out and it does not move the issue.
enabledbooleanWhether the rule is on from the start. Default true.
labelstring|nullOnly issues carrying this label (one word). Leave out for any label.
namestringyesWhat the rule is called, e.g. 'Document pack'. At most 120 characters.
projectKeystringyesProject key, e.g. 'ONB'.
statusstringyesThe state whose ENTRY fires the rule, by name, e.g. 'Ready for review'. For a duty taken only by hand, an empty string.
templatestringyesThe checklist, as Markdown: a '### Heading' per group, '- [ ] item' per line, two spaces of indent to nest an item under another, and [~username] on an item to name who does it. For a duty: the instr…
typestring|nullOnly issues of this type, by name, e.g. 'Bug'. Leave out for any type.

No output schema declared.

No examples provided.

create_wiki_page ~359

Create a wiki page from Markdown in a space you can write to. Hangs off the space home page unless you name a parent (by 'parentId', or by 'parentTitle' within the same space). Returns the new page id and its URL. Mention someone as [@Their Name](user:username) — on a wiki page that is the form that notifies, not the [~username] used in issues; link another page as [text](page:Title) or [text](page:SPACE/Title). Answers with 'notified' (who this actually reaches) and 'unresolvedMentions' (what looked like a mention and reached nobody, each with a reason) — a wrong handle is stored as written and never refused, so that list is the only sign it did not land.

NameTypeReqDescription
labelsstring|nullLabels to set, space or comma separated.
markdownstring|nullPage body as Markdown, which also carries $…$ / $$…$$ LaTeX formulas and the wiki's macros on a line of their own — {toc}, {children}, {info} … {info}, {expand:title=…} … {expand}.
parentIdinteger|nullParent page id. Omit to hang the page off the space home page.
parentTitlestring|nullParent page title, as an alternative to 'parentId'. Must be a page in the same space.
spaceKeystringyesSpace key, e.g. 'PM'. Every project has exactly one space, keyed like the project.
titlestringyesPage title. Must be unique within the space — the title is how pages are addressed here.

No output schema declared.

No examples provided.

decide_support_letter ~135

Decide what a held or failed letter to the support address is. 'release' files it as if it had just arrived, past the spam filter and the limits: it joins the request it proves it answers, or opens a new one (and the sender gets the usual acknowledgement). 'dismiss' says it is not a request; its files are dropped and the row is deleted with the other unfiled letters after 30 days. Requires full write access to the support project.

NameTypeReqDescription
decisionstringyes'release' or 'dismiss'.
letterIdintegeryesThe letter's id, from list_support_letters.

No output schema declared.

No examples provided.

delete_agent_usage ~94

Remove one agent-usage record from an issue, by the id that get_agent_usage returns. For correcting a record's numbers, re-send it with report_agent_usage instead — the same source + externalId updates in place. Requires permission to edit the issue.

NameTypeReqDescription
idintegeryesRecord id, as returned by get_agent_usage.
keystringyesIssue key, e.g. 'UK-1'.

No output schema declared.

No examples provided.

delete_attachment ~99

Remove a file from an issue, by 'filename' or by attachment 'id' — both come back from get_issue. Requires permission to edit issues in that project.

NameTypeReqDescription
filenamestring|nullFile name to remove, as listed by get_issue.
idinteger|nullAttachment id, as listed by get_issue. An alternative to 'filename'.
keystringyesIssue key, e.g. 'UK-1'.

No output schema declared.

No examples provided.

delete_project_field ~78

Remove a column from a project. Answers with how many issues lost a value, because that number is what the decision was about — the issues themselves are untouched. Project lead or admin only.

NameTypeReqDescription
namestringyesField name, e.g. 'Provider'.
projectKeystringyesProject key, e.g. 'CRM'.

No output schema declared.

No examples provided.

delete_project_rule ~92

Remove a project rule, by its id from list_project_rules. Checklists it already added stay in their issues; its journal goes with it. To stop it for a while instead, update_project_rule with enabled=false. Project lead or admin only.

NameTypeReqDescription
idintegeryesThe rule's id, from list_project_rules.
projectKeystringyesProject key, e.g. 'ONB'.

No output schema declared.

No examples provided.

delete_wiki_attachment ~156

Remove a file from a wiki page, by its 'filename' as listed by get_wiki_page. Identify the page by 'pageId', or by 'spaceKey' + 'title'. References to it in the page body are left alone — they simply stop resolving, so tidy the body too if it named the file. Requires permission to edit the page.

NameTypeReqDescription
filenamestringyesFile name to remove, as listed by get_wiki_page.
pageIdinteger|nullPage id (as returned by search_wiki).
spaceKeystring|nullSpace key, when identifying the page by title.
titlestring|nullExact page title, when identifying the page by title.

No output schema declared.

No examples provided.

delete_wiki_page ~150

Delete a wiki page. Identify it by 'id', or by 'spaceKey' + 'title'. A page with children takes its whole subtree with it, so that is refused unless you pass includeChildren: true — the answer names what would go. The space home page can never be deleted. Requires permission to edit the wiki.

NameTypeReqDescription
idinteger|nullPage id (as returned by search_wiki).
includeChildrenbooleanDelete the page's descendants along with it. Off by default.
spaceKeystring|nullSpace key, when identifying the page by title.
titlestring|nullExact page title, when identifying the page by title.

No output schema declared.

No examples provided.

get_agent_usage ~91

What background-agent runs have cost an issue (local or mirrored/upstream): one record per run (tokens by kind, machine time, agent/model/host) plus the totals. A null metric means nobody reported it — which is not the same as zero, so 'reporting' says how many records carried each metric.

NameTypeReqDescription
keystringyesIssue key, e.g. 'UK-1'.

No output schema declared.

No examples provided.

get_attachment ~135

Read one file attached to an issue — its bytes, base64-encoded — by the issue key and the 'filename' as get_issue lists it. The bytes travel as text through the conversation and cost roughly a third more than the file itself, so there is a size ceiling; the pm-files MCP server saves a file to a path instead, without spending the conversation on it (local_files_setup says how to connect it). Reading needs only permission to see the issue.

NameTypeReqDescription
filenamestringyesFile name, as listed by get_issue.
keystringyesIssue key, e.g. 'UK-1'.

No output schema declared.

No examples provided.

get_change ~85

The files one merge request, pull request or commit touches, with their diffs. Large diffs arrive cut.

NameTypeReqDescription
changestringyesThe merge request or pull request number ('!12', '#12' or '12'), or a commit's hash.
repostring|nullWhich repository, as 'group/repo'. Omit when only one is open.

No output schema declared.

No examples provided.

get_comments ~240

Read the discussion on an issue, oldest first. Without 'startAt' you get the END of the thread — the most recent 'limit' comments — because catching up means reading the latest, not the first ever written; 'earlier' says how many stand before the page you got, and 'startAt' walks back through them. Each 'body' comes back exactly as written, which is also the text update_comment's 'edits' are matched against. A reply carries 'replyTo', the id of the comment it answers (null otherwise) — pass the same id to add_comment's 'replyTo' to answer one. Comments that were deleted are not listed. Needs only permission to see the issue.

NameTypeReqDescription
keystringyesIssue key, e.g. 'UK-1'.
limitintegerHow many comments to return (default 20, max 100).
startAtinteger|nullWhere to start, counted from the OLDEST comment as 0. Omit for the most recent page; pass 'startAt' - 'limit' from a previous answer to step back one page.

No output schema declared.

No examples provided.

get_issue ~124

Get one issue by key (e.g. 'UK-1') if it is visible to this token, including its description, status, assignee, labels, sub-tasks, the issues it is linked to and the wiki pages linked to it. 'comments' is a COUNT, not the text — read the thread itself with get_comments whenever it is not zero: decisions, the map of what is attached and how to run the thing are often written there rather than in the description.

NameTypeReqDescription
keystringyesIssue key, e.g. 'UK-1'.

No output schema declared.

No examples provided.

get_project_rule_runs ~244

A project rule's journal, newest first: each time an issue entered the rule's state and matched its conditions — which issue, who moved it, and the outcome: 'applied' (checklist added), 'alreadyThere' (its marker line was already in the description, nothing added) or 'tooLong' (the description would have been too long, nothing added); for a duty, 'handed' (the issue went to its agent), 'busy' (an agent already had it), 'tooMany' (the duty's fifty a day were used up) or 'refused' with a 'reason' (agent_off, agent_budget, …), and 'ownerLost' when the duty was switched off because its owner lost the project. The place to look when a checklist did not appear or an agent did not take an issue. Any member may read it.

NameTypeReqDescription
idintegeryesThe rule's id, from list_project_rules.
limitintegerHow many lines, newest first (default 20, max 100).
projectKeystringyesProject key, e.g. 'ONB'.

No output schema declared.

No examples provided.

get_support_letter ~95

Read one letter to the support address whole — the quoted thread and the signature that the request's comment leaves out, the HTML part as text, and the headers. 'letterId' comes from list_support_letters or from get_support_request's messages. A letter in a request is readable by whoever can read that issue; any other only by the support project's full members.

NameTypeReqDescription
letterIdintegeryesThe letter's id.

No output schema declared.

No examples provided.

get_support_request ~175

Read who is behind a support request: the requester's name and email, whether they asked signed in (and from which workspace), their client version, what the product knew when they asked from inside it ('context': the screen, the client, the last refusal the server gave them with its request id), and which comments of the issue the requester can see ('messages', by comment id and direction; 'autoRule' names the rule when the desk's automatic answer wrote it rather than a person, 'autoWording' says whether the model worded it or the template went). Every other comment on the issue is internal — the requester never sees it. Answers found=false for an issue that is not a support request.

NameTypeReqDescription
keystringyesIssue key of the request, e.g. 'SUPPORT-12'.

No output schema declared.

No examples provided.

get_wiki_attachment ~224

Read one file attached to a wiki page — its bytes, base64-encoded — identifying the page by 'pageId' or by 'spaceKey' + 'title' and the file by 'filename' as get_wiki_page lists it. This is how a file is copied from one page to another: read it here, write it with add_wiki_attachment. The bytes travel as text through the conversation and cost roughly a third more than the file itself, so there is a size ceiling; for anything larger — or for putting the file on disk — the pm-files MCP server saves it to a path instead (local_files_setup says how to connect it). Reading needs only permission to see the page.

NameTypeReqDescription
filenamestringyesFile name, as listed by get_wiki_page.
pageIdinteger|nullPage id (as returned by search_wiki).
spaceKeystring|nullSpace key, when identifying the page by title.
titlestring|nullExact page title, when identifying the page by title.

No output schema declared.

No examples provided.

get_wiki_page ~490

Get one wiki page by id, or by space key + title, if it is visible to this token. Returns the page text, its labels, its parent and child pages, its comments, and the issues linked to it. Pass withMarkdown: true when you intend to edit it — you then get the page's Markdown source to change and hand back to update_wiki_page, and each comment's own Markdown, version and anchor for update_wiki_comment. A large page is read a part at a time: 'outline' lists its headings and how big each section is, then 'section' returns one of them (or 'offset'/'limit' a run of lines), and update_wiki_page's 'edits' changes just the words you mean without sending the page back.

NameTypeReqDescription
idinteger|nullPage id (as returned by search_wiki).
limitinteger|nullHow many lines to return from 'offset' (default 200).
offsetinteger|nullReturn only the Markdown source from this 1-based line on — for a page without headings to navigate by. Pair with 'limit'.
outlinebooleanReturn the page's table of contents instead of its body: per heading its level, text, anchor, the 1-based lines its section spans in the Markdown source, and its size in characters. Start here on a l…
sectionstring|nullReturn only this section's Markdown — its heading line down to the next heading of the same or a higher level, subsections included. Name it by its anchor (as 'outline' gives it: the id a {toc} entry…
spaceKeystring|nullSpace key, when looking the page up by title.
titlestring|nullExact page title, when looking the page up by title.
withMarkdownbooleanReturn the Markdown source ('markdown') instead of the plain text — what to edit and pass back to update_wiki_page, and, for each comment, to update_wiki_comment. Off by default: reading costs less a…
withRelatedbooleanWith 'outline', 'section' or 'offset': also return the page's children, attachments, comments and linked issues, which a partial read otherwise leaves out.

No output schema declared.

No examples provided.

link_issues ~282

Link two issues: link_issues('PM-419', 'PM-417', 'is blocked by') records that PM-419 is blocked by PM-417. 'type' is the PHRASE, said as a person says it — 'blocks', 'is blocked by', 'duplicates', 'is duplicated by', 'clones', 'relates to' — so the direction is in the words and the arguments cannot disagree; a bare type name ('Blocks') points outward, as it does in Jira. A phrase this workspace does not have is REFUSED and the ones it does have are named, rather than quietly becoming 'relates to'. The link then shows on both issues (get_issue returns 'links'), and linking the same pair the same way again changes nothing. Requires permission to edit BOTH issues — a link is a change to the issue at each end.

NameTypeReqDescription
fromstringyesThe issue the phrase is said about, e.g. 'PM-419'.
tostringyesThe issue at the other end, e.g. 'PM-417'.
typestringyesHow 'from' relates to 'to', in words: 'blocks', 'is blocked by', 'duplicates', 'clones', 'relates to'. Whatever this workspace's link types call themselves — a refusal lists them.

No output schema declared.

No examples provided.

link_wiki_page ~186

Link a wiki page to an issue. The link then shows on both the issue and the page, and survives the page being renamed or moved. Identify the page by 'pageId', or by 'spaceKey' + 'title'. Linking the same page again updates that link instead of adding a second one. Requires permission to edit the issue.

NameTypeReqDescription
issueKeystringyesIssue key, e.g. 'UK-1'.
pageIdinteger|nullPage id (as returned by search_wiki).
relationshipstring|nullHow the page relates to the issue, free text — e.g. 'documentation' (the default), 'specification', 'design'.
spaceKeystring|nullSpace key, when identifying the page by title.
titlestring|nullExact page title, when identifying the page by title.

No output schema declared.

No examples provided.

list_code ~104

List a directory of a repository connected to a project. Only repositories whose owners opened them to agents can be read.

NameTypeReqDescription
pathstring|nullDirectory inside the repository. Omit for its root.
referencestring|nullBranch, tag or commit. Omit for the default branch.
repostring|nullWhich repository, as 'group/repo'. Its last segment alone is enough when unambiguous; omit it when only one is open.

No output schema declared.

No examples provided.

list_credentials ~92

List the credentials attached to an issue or a wiki page that this token may read — names and who attached them, never the values. Pass issueKey or pageId. Use reveal_credential to read one value, and only when you are about to use it.

NameTypeReqDescription
issueKeystring|nullIssue key, e.g. 'UK-1'.
pageIdinteger|nullWiki page id.

No output schema declared.

No examples provided.

list_issue_questions ~319

Questions with answer options, in either direction: what is waiting on YOU to answer (role='to_me'), what YOU asked and are waiting on somebody for (role='asked'), or everything on one issue. This is how you find out whether the question you asked has been answered — poll it, since ask_issue_question does not wait. With no 'key' the default is role='to_me'; with a 'key' it is every question on that issue. Open ones by default; pass state='all' for the answered, withdrawn and expired ones too.

NameTypeReqDescription
fromstring|null'agent' for only what an agent put to somebody (a resolution, PM-602), 'people' for only what a person asked. Omit for both.
keystring|nullLimit to one issue, e.g. 'UK-1'. Omit to look across every project this token can reach.
limitintegerHow many to return (default 20, max 100).
rolestring|nullWhose questions: 'to_me' (waiting on you to answer), 'asked' (you asked them, and you are waiting), or 'any'. Defaults to 'to_me' with no key, and to 'any' when a key is given.
statestring|null'open' (the default — still waiting on somebody) or 'all', which adds the answered, the withdrawn and the expired (the deadline passed with no default and no answer).

No output schema declared.

No examples provided.

list_mcp_connections ~48

List the external MCP connections configured for a project. Auth tokens are never returned (only whether one is set).

NameTypeReqDescription
projectKeystringyesProject key, e.g. 'UK'.

No output schema declared.

No examples provided.

list_project_fields ~71

The columns a project keeps about its issues: name, kind, and a list's options with their colours. Also the customfield_… name each one answers to, for searching by JQL. Any member may read them.

NameTypeReqDescription
projectKeystringyesProject key, e.g. 'CRM'.

No output schema declared.

No examples provided.

list_project_rules ~471

A project's rules: when an issue enters a state, a checklist from a template is appended to its description. A rule appends its checklist to an issue's description when the issue ENTERS the rule's state — from the board, the Jira API or update_issue alike. The block starts with a hidden marker line '[//]: # (pm-rule:<id>)'; while that line is in the description, entering the state again adds nothing (the journal says 'alreadyThere'). A [~username] in the template is a mention: that person is notified when the checklist lands. A checklist that would make the description too long is not added and the journal says 'tooLong'; the move itself still happens. A rule with action 'agent' is a DUTY instead: it says which issues may be handed to an agent role (agentRole, e.g. 'product') and what the agent may do with them. Its 'template' is then the INSTRUCTION — what doing such an issue means in this project — and nothing is appended anywhere. A duty may have no state (pass an empty 'status'): then an issue is handed only by a person. agentActions is a list from: describe, subtasks, ask, wiki, report, support. agentFields names the fields it may set: priority, labels, duedate, or the project's own fields by name. doneStatus is the state it moves the issue to when done — never a finished one. capUsd raises what one task may cost, up to 5 dollars. Commenting is always allowed; finishing, deleting, reassigning and anything outside the issue never are. Saving or switching on a duty makes it yours: it runs on your behalf and access, and is switched off if you lose the project. Answers with each rule's id (the other rule tools take it), action, state, conditions (type, label — null means any), template and whether it is on, and for a duty its 'agent' part; with the state and type names a rule may use, the agent roles, actions and fields a duty may name where agents are on; and 'canEdit'. Any member may read them.

NameTypeReqDescription
projectKeystringyesProject key, e.g. 'ONB'.

No output schema declared.

No examples provided.

list_projects ~59

List the projects visible to this token (a project-scoped token sees only its project). A project with a 'parent' is a subproject of that one: it has its own issues, board and wiki, and shares only who may reach it.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_support_letters ~159

List letters to the support address that did not become part of a request: 'held' (looked like spam, or too many at once from one address or on one request), 'failed' (we could not file them), 'ignored' (an autoresponder, a bounce, a mailing list, our own letter), 'dismissed'. Without 'state', held and failed — the ones waiting for a person. Each has an id, the reason, the sender, the subject and the file names. Only a full member of the support project may read them: they are strangers' words.

NameTypeReqDescription
statestring|nullOne of 'held', 'failed', 'ignored', 'dismissed'. Omit for held and failed.

No output schema declared.

No examples provided.

list_support_queue ~278

The support desk's queue: open requests, the most urgent first — overdue, then due soonest, then those waiting on their requester. Each item says whose turn it is ('clock.turn': 'first' = nobody has answered yet, 'reply' = the requester wrote again, 'requester' = we answered last and the clock is stopped), since when it has waited, the working hours waited, when the answer is due and whether it is 'onTime', 'dueSoon' or 'overdue'; plus the assignee. 'numbers' has the current counts and, over the last 30 days, the median time to a first human answer and to resolution (in working hours — weekdays only) and the share answered within the promise. An automatic acknowledgement or automatic answer is never counted as an answer; 'numbers.auto' says how many requests the automatic answer got, how many were then resolved with no human reply and no further word from the requester ('settled'), and how many requesters wrote again after it ('askedAgain') — per rule too. An item's 'autoRule' is set when the request got an automatic answer. Readable by anybody who can read the support project.

NameTypeReqDescription
whostring|null'all' (default), 'mine' (assigned to you) or 'unassigned'.

No output schema declared.

No examples provided.

list_tracks ~106

The tracks a project is cut into: a track is a LABEL the project declared meaningful — a play, a campaign, a rollout — and work joins one by carrying that label. A track has no key of its own; its issues keep the project's key, which is what makes it a different thing from a subproject (a separate project, see create_project's parentKey). Any member may read them.

NameTypeReqDescription
projectKeystringyesProject key, e.g. 'TH'.

No output schema declared.

No examples provided.

list_users ~174

List the people you can assign work to or mention: the members of the projects this token can see. Optionally filter by free text (username, display name or email) or narrow to one project. Mention someone in a description or comment as [~username] — a mention matches the username, never the display name — and pass the same username (or the email) as 'assignee'.

NameTypeReqDescription
includeInactivebooleanInclude deactivated accounts, which can be neither assigned nor mentioned. Off by default.
limitintegerMax users to return (default 50, max 200).
projectKeystring|nullRestrict to members of this project key (must be visible to the token).
textstring|nullFree text to match in username, display name or email.

No output schema declared.

No examples provided.

Common questions

What is the Kaiku MCP server?

Kaiku is an MCP server listed in the public MCP registry as tech.kaiku/kaiku. Issue tracker and wiki for teams and their agents: find, file and update issues, write pages. This page covers its hosted endpoint (https://mcp.kaiku.tech/mcp).

Is the Kaiku MCP server safe to use?

Kaiku scores 74 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Kaiku MCP server expose?

Kaiku exposes 74 tools: add_attachment, add_comment, add_wiki_attachment, add_wiki_comment, admin_bank_transfer, and 69 more. Their descriptions and schemas cost roughly 18,469 tokens of context every time the server is loaded.

Does the Kaiku MCP server require authentication?

Yes. Kaiku asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

Is the Kaiku MCP server still maintained?

Kaiku is still listed as active in the MCP registry. We last reached this channel on 23 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.