Issue tracker and wiki for teams and their agents: find, file and update issues, write pages.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
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.
Issue key, e.g. 'UK-1'.
File name to store, e.g. 'report.pdf'. Any directory part is dropped.
The 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.
Content 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.
The file's bytes, base64-encoded (a 'data:…;base64,…' URL is accepted and unwrapped). Use 'text' instead when the file is text.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
Tool list last changed Oct 23, 2026.
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.
| Argument | Type | Description |
|---|---|---|
| key* | string | Issue key, e.g. 'UK-1'. |
| text | string | null | The 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. |
| filename* | string | File name to store, e.g. 'report.pdf'. Any directory part is dropped. |
| mimeType | string | null | Content 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. |
| contentBase64 | string | null | The file's bytes, base64-encoded (a 'data:…;base64,…' URL is accepted and unwrapped). Use 'text' instead when the file is text. |
{
"type": "object",
"required": [
"key",
"filename"
],
"properties": {
"key": {
"type": "string",
"description": "Issue key, e.g. 'UK-1'."
},
"text": {
"type": [
"string",
"null"
],
"default": null,
"description": "The 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."
},
"filename": {
"type": "string",
"description": "File name to store, e.g. 'report.pdf'. Any directory part is dropped."
},
"mimeType": {
"type": [
"string",
"null"
],
"default": null,
"description": "Content 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."
},
"contentBase64": {
"type": [
"string",
"null"
],
"default": null,
"description": "The file's bytes, base64-encoded (a 'data:…;base64,…' URL is accepted and unwrapped). Use 'text' instead when the file is text."
}
}
}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, agent_outsider — the writer is not of the company).
| Argument | Type | Description |
|---|---|---|
| key* | string | Issue key, e.g. 'UK-1'. |
| body* | string | Comment 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). |
| replyTo | integer | null | The comment this one answers, as returned by get_comments — on the same issue and not deleted. |
{
"type": "object",
"required": [
"key",
"body"
],
"properties": {
"key": {
"type": "string",
"description": "Issue key, e.g. 'UK-1'."
},
"body": {
"type": "string",
"description": "Comment 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)."
},
"replyTo": {
"type": [
"integer",
"null"
],
"default": null,
"description": "The comment this one answers, as returned by get_comments — on the same issue and not deleted."
}
}
}Put a reference to a legal act on an issue or a wiki page — as «Add» in the block «Legal acts» does: it is yours, accepted at once. 'url' is the act's address on one of the official sites acts are read from (a refusal lists them); an act not read yet is read in the background, so 'hasText' may be false at first. 'place' is the place in the act in words («Article 18»). With 'commentId' the reference stands in that comment instead of the issue's or the page's own text. The same place of the same act already there is that reference ('added' false). Requires permission to edit the issue or the page — to comment, for a comment's — and a project that keeps legal references.
| Argument | Type | Description |
|---|---|---|
| url* | string | The act's address, e.g. 'https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32015L0849'. |
| page | integer | null | Wiki page id. Either this or 'issue'. |
| issue | string | null | Issue key, e.g. 'UK-1'. Either this or 'page'. |
| place | string | null | The place in the act, in words, e.g. 'Article 18'. |
| commentId | integer | null | A comment on that issue or page the reference stands in (an id from get_comments), instead of the issue's or the page's own text. |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The act's address, e.g. 'https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32015L0849'."
},
"page": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Wiki page id. Either this or 'issue'."
},
"issue": {
"type": [
"string",
"null"
],
"default": null,
"description": "Issue key, e.g. 'UK-1'. Either this or 'page'."
},
"place": {
"type": [
"string",
"null"
],
"default": null,
"description": "The place in the act, in words, e.g. 'Article 18'."
},
"commentId": {
"type": [
"integer",
"null"
],
"default": null,
"description": "A comment on that issue or page the reference stands in (an id from get_comments), instead of the issue's or the page's own text."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| text | string | null | The 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. |
| title | string | null | Exact page title, when identifying the page by title. |
| pageId | integer | null | Page id (as returned by search_wiki). |
| comment | string | null | Short note about this upload, shown in the page's attachment list. |
| filename* | string | File name to store, e.g. 'diagram.png'. Any directory part is dropped. |
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.
| Argument | Type | Description |
|---|---|---|
| body* | string | Comment body as Markdown, which also carries $…$ / $$…$$ LaTeX formulas. |
| title | string | null | Exact page title, when identifying the page by title. |
| pageId | integer | null | Page id (as returned by search_wiki). |
| replyTo | integer | null | The comment this one answers, as returned by get_wiki_page. |
| spaceKey | string | null | Space key, when identifying the page by title. |
{
"type": "object",
"required": [
"body"
],
"properties": {
"body": {
"type": "string",
"description": "Comment body as Markdown, which also carries $…$ / $$…$$ LaTeX formulas."
},
"title": {
"type": [
"string",
"null"
],
"default": null,
"description": "Exact page title, when identifying the page by title."
},
"pageId": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Page id (as returned by search_wiki)."
},
"replyTo": {
"type": [
"integer",
"null"
],
"default": null,
"description": "The comment this one answers, as returned by get_wiki_page."
},
"spaceKey": {
"type": [
"string",
"null"
],
"default": null,
"description": "Space key, when identifying the page by title."
}
}
}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.
No arguments.
{
"type": "object",
"properties": {}
}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.
| Argument | Type | Description |
|---|---|---|
| weeksAgo | integer | 0 is the last full week, 1 the one before it. |
{
"type": "object",
"properties": {
"weeksAgo": {
"type": "integer",
"default": 0,
"description": "0 is the last full week, 1 the one before it."
}
}
}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. 'legal' is the same cohort narrowed to the companies that came for the law — the owner signed up through a page for lawyers, or the company was made with the requirements register — as four counts: registered, a project keeps legal references, a legal document's card opened in the first week, the add-on paid for. Its 'withReferences' is null and 'unknown' names the machines while they have not reported the switch — never zero. '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.
| Argument | Type | Description |
|---|---|---|
| to | string | null | End of the period, as YYYY-MM-DD, included. Use with 'from'. |
| days | integer | null | How many days back from today. Defaults to 90, at most 730. Ignored when 'from' and 'to' are given. |
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.
| Argument | Type | Description |
|---|---|---|
| slug | string | null | Only invoices of the company at this address. |
| limit | integer | How many rows, newest first. Default 50, at most 100. |
| status | string | null | Only invoices in this state, e.g. 'open', 'paid', 'void'. |
{
"type": "object",
"properties": {
"slug": {
"type": [
"string",
"null"
],
"default": null,
"description": "Only invoices of the company at this address."
},
"limit": {
"type": "integer",
"default": 50,
"description": "How many rows, newest first. Default 50, at most 100."
},
"status": {
"type": [
"string",
"null"
],
"default": null,
"description": "Only invoices in this state, e.g. 'open', 'paid', 'void'."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| weeksAgo | integer | 0 is the last full week, 1 the one before it. |
{
"type": "object",
"properties": {
"weeksAgo": {
"type": "integer",
"default": 0,
"description": "0 is the last full week, 1 the one before it."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| days | integer | Window for model spend, in days. Default 30; 0 means all time. |
{
"type": "object",
"properties": {
"days": {
"type": "integer",
"default": 30,
"description": "Window for model spend, in days. Default 30; 0 means all time."
}
}
}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'.
No arguments.
{
"type": "object",
"properties": {}
}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.
| Argument | Type | Description |
|---|---|---|
| note | string | null | A line for the payer, e.g. which charges are whose. Shown with the details. |
| swift | string | null | The bank's SWIFT/BIC. |
| account | string | null | The account number or IBAN. |
| enabled* | boolean | Whether this installation takes transfers. On is refused while a required field is missing; off never is. |
| purpose | string | null | What 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}'. |
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.
| Argument | Type | Description |
|---|---|---|
| slug* | string | The company's address — 'acme' in acme.kaiku.tech. |
{
"type": "object",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"description": "The company's address — 'acme' in acme.kaiku.tech."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| slug | string | null | Only the company at this address ('acme' in acme.kaiku.tech). |
| status | string | null | Only companies in this state: 'trial', 'active', 'free', 'over-limit', 'expired', 'suspended'. |
| withOwners | boolean | Include 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. |
| endingInDays | integer | null | Only companies whose paid-for period ends within this many days. 0 means already run out. |
{
"type": "object",
"properties": {
"slug": {
"type": [
"string",
"null"
],
"default": null,
"description": "Only the company at this address ('acme' in acme.kaiku.tech)."
},
"status": {
"type": [
"string",
"null"
],
"default": null,
"description": "Only companies in this state: 'trial', 'active', 'free', 'over-limit', 'expired', 'suspended'."
},
"withOwners": {
"type": "boolean",
"default": false,
"description": "Include 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."
},
"endingInDays": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Only companies whose paid-for period ends within this many days. 0 means already run out."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| note | string | null | Words 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 the question. |
| option* | integer | Which option to choose, counted from 0 in the order they were offered. |
| questionId* | integer | The question's id, as returned by list_issue_questions or ask_issue_question. |
{
"type": "object",
"required": [
"questionId",
"option"
],
"properties": {
"note": {
"type": [
"string",
"null"
],
"default": null,
"description": "Words 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 the question."
},
"option": {
"type": "integer",
"description": "Which option to choose, counted from 0 in the order they were offered."
},
"questionId": {
"type": "integer",
"description": "The question's id, as returned by list_issue_questions or ask_issue_question."
}
}
}Approve a wiki page IN YOUR OWN NAME, in the edition you read: 'version' is the page's version as get_wiki_page gave it, and the call is refused if the page has been edited since — read it again first. The approval is a line in the page's journal: who, when, which edition, and an optional note. It is never edited or deleted (withdraw_wiki_page_approval adds a line that takes it back). A later edit of the page does not remove it — the page then says that the edition in force is the approved one and the newer text is not approved. Only the project's lead (or the company's owner or an admin), or somebody named on the page with ask_wiki_page_approval. Approving is a person's statement: do it when your person told you to, not because a page looks finished.
| Argument | Type | Description |
|---|---|---|
| id* | integer | Page id. |
| note | string | null | An optional note kept with the approval, e.g. the decision it rests on. |
| version* | integer | The version you read and are approving. |
{
"type": "object",
"required": [
"id",
"version"
],
"properties": {
"id": {
"type": "integer",
"description": "Page id."
},
"note": {
"type": [
"string",
"null"
],
"default": null,
"description": "An optional note kept with the approval, e.g. the decision it rests on."
},
"version": {
"type": "integer",
"description": "The version you read and are approving."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| to* | string | Who 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. |
| key* | string | Issue key, e.g. 'UK-1'. |
| options* | array | The 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. |
| question* | string | The question itself. Keep it to what the options answer. |
| ttlHours | integer | null | How 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. |
| allowFreeText |
Name the people who may approve a wiki page, and tell each of them: they get a notification that opens the page. 'who' is usernames or e-mails as 'a,b' — each must be able to read the page. Somebody already named is asked again, about the edition the page is at now. With release: true the people in 'who' are taken OFF the list instead; what they already approved stays approved. The project's lead, the company's owner or an admin only.
| Argument | Type | Description |
|---|---|---|
| id* | integer | Page id. |
| who* | string | Usernames or e-mails, as 'a,b'. Take them from list_users. |
| note | string | null | A line for the people asked — what changed, by when. |
| release | boolean | true to take these people off the page's list instead of asking them. |
{
"type": "object",
"required": [
"id",
"who"
],
"properties": {
"id": {
"type": "integer",
"description": "Page id."
},
"who": {
"type": "string",
"description": "Usernames or e-mails, as 'a,b'. Take them from list_users."
},
"note": {
"type": [
"string",
"null"
],
"default": null,
"description": "A line for the people asked — what changed, by when."
},
"release": {
"type": "boolean",
"default": false,
"description": "true to take these people off the page's list instead of asking them."
}
}
}Tick or untick one checklist item by the 'id' get_checklist gave it. Written as a click on the item is: the same history line and the same notices to the issue's watchers, in your name — and only the item's box changes, so an edit somebody is saving to the description at the same moment is never lost. Ticking a ticked item changes nothing ('changed' false). An id that finds nothing means the item was rewritten or removed: read the checklist again. Requires permission to edit the issue.
| Argument | Type | Description |
|---|---|---|
| id* | string | The item's id, from get_checklist. |
| key* | string | Issue key, e.g. 'UK-1'. |
| checked | boolean | true to tick the item, false to untick it. |
{
"type": "object",
"required": [
"key",
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The item's id, from get_checklist."
},
"key": {
"type": "string",
"description": "Issue key, e.g. 'UK-1'."
},
"checked": {
"type": "boolean",
"default": true,
"description": "true to tick the item, false to untick it."
}
}
}Who calls a class, method or function, or what it calls, to a depth of up to 3 — each use with its file and line. Uses linked only by the bare name are counted, not listed, because they are often a different symbol of the same name. When several symbols share the name, the answer lists them to choose from.
| Argument | Type | Description |
|---|---|---|
| path | string | null | The path of the symbol's file, or part of it, when its name is not enough. |
| repo | string | null | Which repository, as 'group/repo'. Omit to ask every repository open here. |
| depth | integer | How many rings out: 1 (default) to 3. |
| symbol* | string | The symbol, e.g. 'IssueTransition.MoveAsync'. A bare name works when only one symbol has it. |
| direction | string | null | 'callers' (who uses it, the default) or 'callees' (what it uses). |
{
"type": "object",
"required": [
"symbol"
],
"properties": {
"path": {
"type": [
"string",
"null"
],
"default": null,
"description": "The path of the symbol's file, or part of it, when its name is not enough."
},
"repo": {
"type": [
"string",
"null"
],
"default": null,
"description": "Which repository, as 'group/repo'. Omit to ask every repository open here."
},
"depth": {
"type": "integer",
"default": 1,
"description": "How many rings out: 1 (default) to 3."
},
"symbol": {
"type": "string",
"description": "The symbol, e.g. 'IssueTransition.MoveAsync'. A bare name works when only one symbol has it."
},
"direction": {
"type": [
"string",
"null"
],
"default": null,
"description": "'callers' (who uses it, the default) or 'callees' (what it uses)."
}
}
}Where a class, method or function is declared in the code of the repositories connected to a project: its file, line and signature. Ask by name, or Class.Method to say whose. Only repositories whose owners opened them to agents are asked.
| Argument | Type | Description |
|---|---|---|
| name* | string | The symbol's name, e.g. 'MoveAsync', or 'IssueTransition.MoveAsync' to say whose. |
| path | string | null | Keep only declarations in files whose path contains this. |
| repo | string | null | Which repository, as 'group/repo'. Omit to ask every repository open here. |
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The symbol's name, e.g. 'MoveAsync', or 'IssueTransition.MoveAsync' to say whose."
},
"path": {
"type": [
"string",
"null"
],
"default": null,
"description": "Keep only declarations in files whose path contains this."
},
"repo": {
"type": [
"string",
"null"
],
"default": null,
"description": "Which repository, as 'group/repo'. Omit to ask every repository open here."
}
}
}Connect one more GitHub or GitLab repository to a project, by its address — 'https://github.com/owner/repo', a gitlab.com project or a company's own GitLab. No token is taken here, ever: the host is asked as anybody would ask it, so a public repository connects at once and a private one is refused, with the screen to connect it on with a token. With openSource: true it is also marked as the project's open source repository — asked without a token whether anybody can read it and under which licence — which is what set_project_public needs; marking opens nothing by itself. A repository already connected is marked rather than connected twice. Only the project's lead, a board administrator or a company admin may; the mark is written to the company's journal.
| Argument | Type | Description |
|---|---|---|
| url* | string | The repository's address, e.g. 'https://github.com/owner/repo'. github.com is GitHub; any other host is taken for a GitLab. |
| openSource | boolean | true to mark it as this project's open source repository. Leave it out for a repository connected only for the links between issues and code. |
| projectKey* | string | Key of the project, e.g. 'LIB'. |
{
"type": "object",
"required": [
"projectKey",
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The repository's address, e.g. 'https://github.com/owner/repo'. github.com is GitHub; any other host is taken for a GitLab."
},
"openSource": {
"type": "boolean",
"default": false,
"description": "true to mark it as this project's open source repository. Leave it out for a repository connected only for the links between issues and code."
},
"projectKey": {
"type": "string",
"description": "Key of the project, e.g. 'LIB'."
}
}
}Attach a secret — a password, a key, a test login — to an issue or a wiki page, instead of writing it in a comment or a description, where everyone on the project reads it for ever. Pass issueKey or pageId, and a 'name' saying what it is. It can be read by the person whose token this is, by the people in 'readers', and by the project's lead, who reads every secret in the project — and by nobody else, however much of the issue they can see. The answer lists them in 'readableBy': say that to the person rather than 'only you'. There are two ways to give the value. WITHOUT 'value' nothing is stored and the answer is a 'form' link: it opens the attach dialog with the name and the readers filled in, and the person types the value there themselves. Prefer that whenever the value is not already in the conversation — a value that passes through you stays in your context and in your client's logs. WITH 'value' the secret is stored now and the answer carries its id and name, never the value; it is recorded against the token you are using. Do not repeat the value in any text you write — a comment, a description, a merge request, a log. A name in 'readers' that is unknown or cannot open the project is not stored and comes back in 'dropped' with the reason. Needs the right to edit the issue or the page.
| Argument | Type | Description |
|---|---|---|
| name* | string | What it is, e.g. 'stand admin password'. Read by everybody who may read the secret, so not the value and no part of it. |
| value | string | null | The secret itself. Leave it out to get a 'form' link where the person types it themselves. |
| pageId | integer | null | Wiki page id. |
| readers | string | null | Who else may read it, comma-separated usernames or emails (see list_users): 'ivan,olga'. Leave it out for nobody else. |
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: the people mentioned, and for an assignment the new assignee as 'assignee' and the one taken off as 'unassigned' in 'as' — never yourself) 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.
| Argument | Type | Description |
|---|---|---|
| type | string | null | Issue type name, e.g. 'Task', 'Bug', 'Story', 'Epic'. Defaults to 'Task'. |
| order | integer | null | Its place among its parent's children: 1, 2, 3… — the order they are to be done in. Children with a place come first, in it; the rest after, by number. Filing a template's sub-tasks, pass 1, 2, 3… in turn. |
| labels | string | null | Labels to set, space or comma separated. |
| dueDate | string | null | The day this is due, as YYYY-MM-DD. A calendar day, not a timestamp — do not send a time or a zone. |
| summary* | string | Issue summary (title). |
| assignee | string | null | Assignee username or email. Omit to leave unassigned. |
| priority | string | null | Priority name, e.g. 'High'. |
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.
| Argument | Type | Description |
|---|---|---|
| key* | string | Project key, 2–10 characters: a letter followed by letters or digits, e.g. 'BGS'. Uppercased. |
| lead | string | null | Username 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. |
| name* | string | Project name, e.g. 'Background agents'. |
| parentKey | string | null | Key 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. Leave it out for a project of its own. One level: a subproject cannot have subprojects. The key here is still an ordinary key ('KYCB2B', not 'KYC-B2B'), because it is what every issue key is built from. |
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. 'trigger' says WHEN: 'entered' (the default — the issue entered 'status'), 'versionReleased' (a version it goes out in was marked released), 'subtasksDone' (every issue under it is finished — the rule acts on the PARENT) or 'subtaskStarted' (an issue under it was taken into work — the parent again); or what the project's repository said through its webhook: 'branchCreated' (a branch naming the issue was made), 'mrOpened', 'mrMerged' or 'mrClosed' (a merge request — a pull request on GitHub — naming the issue was opened, merged, or closed without merging). An issue is named by its key in the branch, the title or the description, and only this project's issues are touched. 'branch' narrows the three merge-request events to a request going INTO that branch, e.g. 'main'. Nobody is behind a webhook, so such a rule acts as whoever last saved or switched it on, whatever its action. 'deployed' fires when a pipeline reports that the issue went out to an environment (report_deployment); 'environment' narrows it to one of the project's environments by name, e.g. 'staging'. 'actChanged' fires on the issues that cite a legal act when its publisher's text changed, and 'actTouched' only on those where the change is in the place they cite (or that cite the act as a whole) — found once a week, only in a project with the «Legal acts» add-on; nobody is behind a publisher either, so these act as the rule's owner too. Only 'entered' has a 'status'; pass an empty one for the others. 'fromStatus' narrows any of them to an issue coming from that state: the state it has just left for 'entered', the state it stands in for the rest. A rule with action 'move' MOVES the issue to 'moveToStatus' instead of appending anything, and has no template (pass an empty one). The move is an ordinary one — made as whoever last saved or switched on the rule, asked of the project's workflow, written to the history with the rule's name, and followed by the rules of the state it lands in. A workflow that refuses it leaves a 'moveRefused' line with the reason in the journal and nothing else; 'moved' is a move made; 'tooDeep' is a move not made because rules had already moved issues three times off one event. 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, jira (propose a move or a comment in the project's linked Jira, applied by a person). 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.
Add a version to a project, at the end of its sequence. A version is what a project's work goes out in — '2.4.0', 'Autumn'. It is the project's own: an issue carries versions of its own project only, any number of them ('fixVersions' on create_issue, update_issue and get_issue; JQL 'fixVersion = "2.4.0"', 'fixVersion in unreleasedVersions()'). The name is unique in its project, whatever the case. Answers with the version as list_versions gives it. Releasing it is release_version's. Project lead or admin only.
| Argument | Type | Description |
|---|---|---|
| name* | string | The version's name, e.g. '2.4.0'. |
| startDate | string | null | The day work on it starts, as YYYY-MM-DD. |
| projectKey* | string | Project key, e.g. 'ONB'. |
| description | string | null | What is in it, in a sentence. |
| releaseDate | string | null | The day it is meant to ship, as YYYY-MM-DD. |
{
"type": "object",
"required": [
"projectKey",
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The version's name, e.g. '2.4.0'."
},
"startDate": {
"type": [
"string",
"null"
],
"default": null,
"description": "The day work on it starts, as YYYY-MM-DD."
},
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'ONB'."
},
"description": {
"type": [
"string",
"null"
],
"default": null,
"description": "What is in it, in a sentence."
},
"releaseDate": {
"type": [
"string",
"null"
],
"default": null,
"description": "The day it is meant to ship, as YYYY-MM-DD."
}
}
}Put one scene of a wiki page on other sites (PM-1076): a link anybody can open with no account, which plays the block's scene in our player and shows nothing else of the page — not its title, its words, its space or its author, only the 'caption' you give. Answers with the link and the ready <iframe> to paste into a site. The block is named by 'language' (anim, or anim-js where the company has scenes written in code) and its 'block' number among that kind's blocks, as get_wiki_page's 'anims' numbers them; the embed follows the block, so an edit of the scene shows everywhere. 'sites' limits which sites may frame it (https://example.org each; none is any); 'days' gives it a term (none is until removed). Only for somebody who may edit the page; it is a line in the page's history. delete_wiki_embed takes it down everywhere at once.
| Argument | Type | Description |
|---|---|---|
| id* | integer | Page id. |
| days | integer | null | Days the link answers, 1 to 3650. Optional: none is until it is removed. |
| block* | integer | The block's number among the page's blocks of its language, from 1 — 'block' in get_wiki_page's 'anims'. |
| sites | string | null | Sites that may frame it, comma-separated, as https://example.org. Optional: none is any site. |
| caption | string | null | A line shown under the scene. Optional. |
| language | string | null | 'anim' (default) or 'anim-js'. |
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). A ```anim block (a scene as JSON the reader's browser plays — product_help topic 'anim') is read at once: the answer's 'anims' says, per block, whether it plays or every problem with where it stands. 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.
| Argument | Type | Description |
|---|---|---|
| title* | string | Page title. Must be unique within the space — the title is how pages are addressed here. |
| labels | string | null | Labels to set, space or comma separated. Stored in lower case, except a label starting with '$', which is kept exactly as written. The label 'template' offers the page as a template: people then make pages from it. |
| markdown | string | null | Page 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}. A theorem, lemma, proposition, corollary, conjecture or question is a block of its own — ::: theorem {#thm:label status=computer number=5.8 title="…"} on its line, the statement, then ::: — read into the project's register of claims at the save (list_claims); 'claims' in the answer says which. |
| parentId | integer | null |
Approve or decline one request to take part in a public project (ids from list_join_requests). Approved, the person becomes a reporter there — files issues and comments; a broader role is given on the project's people screen, as for anybody on the board. Declined, they may ask again in 14 days. The person is told by email either way, and the decision is written to the company's journal. Only the project's owner and its administrators may decide.
| Argument | Type | Description |
|---|---|---|
| id* | integer | The request's id. |
| approve* | boolean | true to let them in as a reporter, false to decline. |
| projectKey* | string | Key of the public project, e.g. 'LIB'. |
{
"type": "object",
"required": [
"projectKey",
"id",
"approve"
],
"properties": {
"id": {
"type": "integer",
"description": "The request's id."
},
"approve": {
"type": "boolean",
"description": "true to let them in as a reporter, false to decline."
},
"projectKey": {
"type": "string",
"description": "Key of the public project, e.g. 'LIB'."
}
}
}Confirm or reject every PROPOSED person of one source at once — the persons the reading found on one page, issue or comment. 'source' as list_persons' 'sources' names it; 'expected' is how many proposed persons of it you were shown, and if the count has changed nothing is written. Ask the person first. Members of the project who may write only. Only where the company's plan includes AI.
| Argument | Type | Description |
|---|---|---|
| q | string | null | Only those with a spelling holding these words, as list_persons' 'q'. |
| state* | string | 'confirmed' or 'rejected'. |
| source* | string | The source: 'page:471', 'issue:KYC-12', 'comment:88', 'wikicomment:7' or 'none'. |
| project* | string | The project key. |
| expected* | integer | How many proposed persons of the source you read in list_persons. |
{
"type": "object",
"required": [
"project",
"source",
"state",
"expected"
],
"properties": {
"q": {
"type": [
"string",
"null"
],
"default": null,
"description": "Only those with a spelling holding these words, as list_persons' 'q'."
},
"state": {
"type": "string",
"description": "'confirmed' or 'rejected'."
},
"source": {
"type": "string",
"description": "The source: 'page:471', 'issue:KYC-12', 'comment:88', 'wikicomment:7' or 'none'."
},
"project": {
"type": "string",
"description": "The project key."
},
"expected": {
"type": "integer",
"description": "How many proposed persons of the source you read in list_persons."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| decision* | string | 'release' or 'dismiss'. |
| letterId* | integer | The letter's id, from list_support_letters. |
{
"type": "object",
"required": [
"letterId",
"decision"
],
"properties": {
"decision": {
"type": "string",
"description": "'release' or 'dismiss'."
},
"letterId": {
"type": "integer",
"description": "The letter's id, from list_support_letters."
}
}
}Confirm or reject every PROPOSED term of one source at once — a wiki page or an issue the terms were found on — as the terms screen's «Confirm all on this page» does. Read them first with list_terms and that 'source', and pass 'expected': how many proposed terms you read there. If the count is different now (somebody decided some, or the page was read again), nothing is written and the answer says so — read the list again. Confirm only what the person asked for. Members of the project who may write only. Only where the company's plan includes AI.
| Argument | Type | Description |
|---|---|---|
| kind | string | null | Only these kinds, comma-separated, as list_terms takes them. |
| state* | string | 'confirmed' or 'rejected'. |
| source* | string | The source, as list_terms' 'sources' names it: 'page:471', 'issue:KYC-12' or 'none'. |
| project* | string | The project key, e.g. KYC. |
| expected* | integer | How many proposed terms of this source you read — 'total' of list_terms with state 'proposed' and this source. |
{
"type": "object",
"required": [
"project",
"source",
"state",
"expected"
],
"properties": {
"kind": {
"type": [
"string",
"null"
],
"default": null,
"description": "Only these kinds, comma-separated, as list_terms takes them."
},
"state": {
"type": "string",
"description": "'confirmed' or 'rejected'."
},
"source": {
"type": "string",
"description": "The source, as list_terms' 'sources' names it: 'page:471', 'issue:KYC-12' or 'none'."
},
"project": {
"type": "string",
"description": "The project key, e.g. KYC."
},
"expected": {
"type": "integer",
"description": "How many proposed terms of this source you read — 'total' of list_terms with state 'proposed' and this source."
}
}
}What a word means IN THIS COMPANY'S PROJECTS — a code like 'PW06' or 'F24', a project's own name for something, a notion its pages define ('петля', 'размерная подгруппа'). Ask it before guessing at a word you do not know in an issue or a page: the answer is the project's own short definition, where it is defined (a wiki page or an issue, and the heading on it) and the other ways it is written, and 'links' — the terms its definition rests on ('way': 'out', kind 'dependsOn' or 'specialCaseOf'), the ones that rest on it ('in'), and its opposites ('oppositeOf') — so a notion is read after what it rests on; term_graph has the whole picture. Matches the term or any of its spellings, case aside, then terms that begin so. Only confirmed terms, and only those whose source you may open. Empty 'terms' means the projects do not define it — then it is an ordinary word, or ask a person. Only where the company's plan includes AI.
| Argument | Type | Description |
|---|---|---|
| word* | string | The word or phrase, as you met it, e.g. 'PW06' or 'размерных подгрупп'. |
| project | string | null | A project key to look in it and its parent projects only. Leave out for every project you can read. |
{
"type": "object",
"required": [
"word"
],
"properties": {
"word": {
"type": "string",
"description": "The word or phrase, as you met it, e.g. 'PW06' or 'размерных подгрупп'."
},
"project": {
"type": [
"string",
"null"
],
"default": null,
"description": "A project key to look in it and its parent projects only. Leave out for every project you can read."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| id* | integer | Record id, as returned by get_agent_usage. |
| key* | string | Issue key, e.g. 'UK-1'. |
{
"type": "object",
"required": [
"key",
"id"
],
"properties": {
"id": {
"type": "integer",
"description": "Record id, as returned by get_agent_usage."
},
"key": {
"type": "string",
"description": "Issue key, e.g. 'UK-1'."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| id | integer | null | Attachment id, as listed by get_issue. An alternative to 'filename'. |
| key* | string | Issue key, e.g. 'UK-1'. |
| filename | string | null | File name to remove, as listed by get_issue. |
{
"type": "object",
"required": [
"key"
],
"properties": {
"id": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Attachment id, as listed by get_issue. An alternative to 'filename'."
},
"key": {
"type": "string",
"description": "Issue key, e.g. 'UK-1'."
},
"filename": {
"type": [
"string",
"null"
],
"default": null,
"description": "File name to remove, as listed by get_issue."
}
}
}Remove a claim from a project's register for good, with what it rests on — it cannot be undone, so do it only when the person asked for this very one to be deleted; confirm its label with them first. Its journal keeps its lines and one that it was deleted. A claim that turned out false is not deleted: set_claim_status 'refuted' or 'retracted' keeps it said. Members of the project who may write only.
| Argument | Type | Description |
|---|---|---|
| id | integer | null | The claim, as list_claims returned it. |
| label | string | null | The claim's label, with 'project'. |
| project | string | null | The project key, with 'label'. |
{
"type": "object",
"properties": {
"id": {
"type": [
"integer",
"null"
],
"default": null,
"description": "The claim, as list_claims returned it."
},
"label": {
"type": [
"string",
"null"
],
"default": null,
"description": "The claim's label, with 'project'."
},
"project": {
"type": [
"string",
"null"
],
"default": null,
"description": "The project key, with 'label'."
}
}
}Remove one computation from an issue, by the id list_computations gives — for a job reported against the wrong issue. To correct one, report it again under its own name instead. Requires permission to edit the issue.
| Argument | Type | Description |
|---|---|---|
| id* | integer | The computation's id, from list_computations. |
| key* | string | Issue key, e.g. 'MATH-74'. |
{
"type": "object",
"required": [
"key",
"id"
],
"properties": {
"id": {
"type": "integer",
"description": "The computation's id, from list_computations."
},
"key": {
"type": "string",
"description": "Issue key, e.g. 'MATH-74'."
}
}
}Remove a credential, by the id from list_credentials — the value, its reader list and the record of who read it go with it, and it cannot be brought back. Only the person who attached it and the project's lead may. To take one person's access away, use update_credential's 'readers' instead.
| Argument | Type | Description |
|---|---|---|
| id* | integer | Credential id, from list_credentials. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "integer",
"description": "Credential id, from list_credentials."
}
}
}Remove a recurring issue from a project. The issues it already filed stay as they are. The project's lead, the company's owner or an admin only.
| Argument | Type | Description |
|---|---|---|
| id* | integer | The schedule's id, as list_issue_schedules returned it. |
| project* | string | The project key, e.g. PM. |
{
"type": "object",
"required": [
"project",
"id"
],
"properties": {
"id": {
"type": "integer",
"description": "The schedule's id, as list_issue_schedules returned it."
},
"project": {
"type": "string",
"description": "The project key, e.g. PM."
}
}
}Remove a person from a project's register for good, with all their spellings and facts — it cannot be undone, so do it only when the person asked for this very one to be deleted; confirm the name with them first. The journal keeps a line that a person was deleted, without the name. To turn down a PROPOSED person use set_person with state 'rejected' instead, so they are not proposed again. Members of the project who may write only.
| Argument | Type | Description |
|---|---|---|
| id* | integer | The person, as list_persons returned them. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "integer",
"description": "The person, as list_persons returned them."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| name* | string | Field name, e.g. 'Provider'. |
| projectKey* | string | Project key, e.g. 'CRM'. |
{
"type": "object",
"required": [
"projectKey",
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Field name, e.g. 'Provider'."
},
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'CRM'."
}
}
}Remove an issue type of this project's own. Refused while any issue is of it or any field is kept for it — change those first; a rule on it goes with it. Project lead or admin only.
| Argument | Type | Description |
|---|---|---|
| name* | string | The own type's name. |
| projectKey* | string | Project key, e.g. 'TH'. |
{
"type": "object",
"required": [
"projectKey",
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The own type's name."
},
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'TH'."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| id* | integer | The rule's id, from list_project_rules. |
| projectKey* | string | Project key, e.g. 'ONB'. |
{
"type": "object",
"required": [
"projectKey",
"id"
],
"properties": {
"id": {
"type": "integer",
"description": "The rule's id, from list_project_rules."
},
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'ONB'."
}
}
}Remove a term from its project for good — it cannot be undone or restored, so do it only when the person asked for this very term to be deleted; confirm the name with them first. To turn down a PROPOSED term use set_term with state 'rejected' instead — a rejected term is remembered and not proposed again; a deleted one may be found and proposed anew. Members of the project who may write only.
| Argument | Type | Description |
|---|---|---|
| id* | integer | The term, as list_terms returned it. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "integer",
"description": "The term, as list_terms returned it."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| title | string | null | Exact page title, when identifying the page by title. |
| pageId | integer | null | Page id (as returned by search_wiki). |
| filename* | string | File name to remove, as listed by get_wiki_page. |
| spaceKey | string | null | Space key, when identifying the page by title. |
{
"type": "object",
"required": [
"filename"
],
"properties": {
"title": {
"type": [
"string",
"null"
],
"default": null,
"description": "Exact page title, when identifying the page by title."
},
"pageId": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Page id (as returned by search_wiki)."
},
"filename": {
"type": "string",
"description": "File name to remove, as listed by get_wiki_page."
},
"spaceKey": {
"type": [
"string",
"null"
],
"default": null,
"description": "Space key, when identifying the page by title."
}
}
}Take an embed of a wiki page's scene down (PM-1076): its link answers 404 at once on every site that has it. It cannot be undone — an embed made again of the same block gets a new link. Only for somebody who may edit the page; a line in its history.
| Argument | Type | Description |
|---|---|---|
| embedId* | integer | The embed's id, from list_wiki_embeds. |
{
"type": "object",
"required": [
"embedId"
],
"properties": {
"embedId": {
"type": "integer",
"description": "The embed's id, from list_wiki_embeds."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| id | integer | null | Page id (as returned by search_wiki). |
| title | string | null | Exact page title, when identifying the page by title. |
| spaceKey | string | null | Space key, when identifying the page by title. |
| includeChildren | boolean | Delete the page's descendants along with it. Off by default. |
{
"type": "object",
"properties": {
"id": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Page id (as returned by search_wiki)."
},
"title": {
"type": [
"string",
"null"
],
"default": null,
"description": "Exact page title, when identifying the page by title."
},
"spaceKey": {
"type": [
"string",
"null"
],
"default": null,
"description": "Space key, when identifying the page by title."
},
"includeChildren": {
"type": "boolean",
"default": false,
"description": "Delete the page's descendants along with it. Off by default."
}
}
}Answer a hint of list_persons' 'similar' with «these are two different people» — «Mikhailov» and «Mikhaylov» who are not one — so the pair is not hinted again; or, with 'undo', take that answer back. ASK the person first, naming both as list_persons shows them; never decide it yourself from the names. A person merged into another answers as the one they were merged into. merge_persons on such a pair still merges, and the answer goes. Both journals keep a line. Members of the project who may write only. Only where the company's plan includes AI.
| Argument | Type | Description |
|---|---|---|
| a* | integer | One of the two, as list_persons returned them. |
| b* | integer | The other. |
| undo | boolean | true to take the answer back, so the hint may pair them again. Default false. |
{
"type": "object",
"required": [
"a",
"b"
],
"properties": {
"a": {
"type": "integer",
"description": "One of the two, as list_persons returned them."
},
"b": {
"type": "integer",
"description": "The other."
},
"undo": {
"type": "boolean",
"default": false,
"description": "true to take the answer back, so the hint may pair them again. Default false."
}
}
}Evaluate Wolfram Language with the very engine a wiki page's ```wl cells are evaluated by (mathics-core-rust's wl-wasm), on the server and now — to check an expression before putting it on a page, or what a page's cells will say. Pass 'code' for one cell, or 'cells' for several evaluated in one session and in order, as the page's «Evaluate all» does (a definition in one is seen by the next). The whole call has 10 seconds: the cell running when they are out is 'timeout', one that runs out of memory or stack is 'limit', and the cells after either are 'skipped'. Answers each cell's outputs — results with their Out[n], messages and prints, each as text, InputForm ('input') and TeX ('tex', 'latex') — and the engine, its commit and the seconds it took. Cells this engine already evaluated for a page of the company are answered from that output ('saved': true). Nothing is kept. Only where the company has the wiki.wl switch; at most 10 evaluations a minute per person.
| Argument | Type | Description |
|---|---|---|
| code | string | null | One cell of Wolfram Language, e.g. "Integrate[x^2 Sin[x], x]" or "Factor[x^4 - 1]". |
| cells | array | null | Several cells, evaluated in one session and in order — instead of 'code'. |
{
"type": "object",
"properties": {
"code": {
"type": [
"string",
"null"
],
"default": null,
"description": "One cell of Wolfram Language, e.g. \"Integrate[x^2 Sin[x], x]\" or \"Factor[x^4 - 1]\"."
},
"cells": {
"type": [
"array",
"null"
],
"items": {
"type": [
"string",
"null"
]
},
"default": null,
"description": "Several cells, evaluated in one session and in order — instead of 'code'."
}
}
}Which issues and wiki pages refer to a legal act — the list on the act's card. Per document the value names (the same act in two languages is two): 'total' issue-and-place and page-and-place lines, 'hidden' of them where you may not read (counted, never named), and 'items' — the 'place' cited with the 'issue' (key, summary) or the 'page' (id, title, spaceKey). Only accepted references in projects that keep them count; a comment's reference is its issue's. Name the act by its key (e.g. 32015L0849), its address, the document id, or words of its title. The same set of issues is JQL's legalRef = "…".
| Argument | Type | Description |
|---|---|---|
| limit | integer | null | How many lines, at most 200. Default 50. |
| project | string | null | Only this project's, by its key. Omit for every project you read. |
| startAt | integer | null | Where to start, for a list longer than one answer. |
| document* | string | The act: its key (e.g. '32015L0849'), its address, a document id, or words of its title. |
{
"type": "object",
"required": [
"document"
],
"properties": {
"limit": {
"type": [
"integer",
"null"
],
"default": null,
"description": "How many lines, at most 200. Default 50."
},
"project": {
"type": [
"string",
"null"
],
"default": null,
"description": "Only this project's, by its key. Omit for every project you read."
},
"startAt": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Where to start, for a list longer than one answer."
},
"document": {
"type": "string",
"description": "The act: its key (e.g. '32015L0849'), its address, a document id, or words of its title."
}
}
}Find issues by what they are ABOUT, in plain words — by meaning as well as by words (where the server has its embedding model), so an issue that says the same thing differently or in another language is found, which search_issues (JQL) cannot do. The same search answers with `pages` (wiki pages) and `files` (PDF and Word files attached to an issue or a page, found by the words inside them): "everything on this counterparty" finds the contract and not only the issue that names it. Best first; `match` says what found each (words, meaning, or only near words — the weakest). `unread_files` lists the files this search could NOT read (a scan, a damaged or protected file, an old .doc): nothing found says nothing about those. Use search_issues for questions about fields (mine, overdue, in status X).
| Argument | Type | Description |
|---|---|---|
| text* | string | What it is about, in your own words. |
| limit | integer | How many of each kind to return (default 10, max 25). |
| projectKey | string | null | Only this project (must be visible to the token). Omit for every project the token sees. |
{
"type": "object",
"required": [
"text"
],
"properties": {
"text": {
"type": "string",
"description": "What it is about, in your own words."
},
"limit": {
"type": "integer",
"default": 10,
"description": "How many of each kind to return (default 10, max 25)."
},
"projectKey": {
"type": [
"string",
"null"
],
"default": null,
"description": "Only this project (must be visible to the token). Omit for every project the token sees."
}
}
}Who a name in this company's texts is — «Гупта», «N. D. Gupta», «Sjogren». Ask it BEFORE writing a person's name with initials or in another script: the answer is every person the spelling may be, each with all their spellings by script ('latin', 'cyrillic') and form ('full' — with initials or a first name, 'surname', 'inflected' — a declined form), each spelling with the source it was read from and the words there, and 'checked': 'checked' (the quote stands in its source), 'unchecked' (nobody gave a source — somebody remembered it) or 'stale' (the quote stood in its source and was edited out of it, or the source is gone: the spelling may still be right, its proof is not). Write the name as found — «Гупта (N. D. Gupta)» — and never complete initials from memory. 'ambiguous' is true when more than one person is written exactly so (two Guptas): then say which one you mean, or ask. Nothing found: add what you know with set_person, with the source and quote you read it in. Matches any spelling, case aside, then spellings that begin so. Only confirmed persons, and only spellings whose source you may open. Only where the company's plan includes AI.
| Argument | Type | Description |
|---|---|---|
| project | string | null | A project key to look in it and its parent projects only. Leave out for every project you can read. |
| spelling* | string | The name as you met it, e.g. 'Гупта' or 'N. D. Gupta'. |
{
"type": "object",
"required": [
"spelling"
],
"properties": {
"project": {
"type": [
"string",
"null"
],
"default": null,
"description": "A project key to look in it and its parent projects only. Leave out for every project you can read."
},
"spelling": {
"type": "string",
"description": "The name as you met it, e.g. 'Гупта' or 'N. D. Gupta'."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| key* | string | Issue key, e.g. 'UK-1'. |
{
"type": "object",
"required": [
"key"
],
"properties": {
"key": {
"type": "string",
"description": "Issue key, e.g. 'UK-1'."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| key* | string | Issue key, e.g. 'UK-1'. |
| filename* | string | File name, as listed by get_issue. |
{
"type": "object",
"required": [
"key",
"filename"
],
"properties": {
"key": {
"type": "string",
"description": "Issue key, e.g. 'UK-1'."
},
"filename": {
"type": "string",
"description": "File name, as listed by get_issue."
}
}
}The files one merge request, pull request or commit touches, with their diffs. Large diffs arrive cut.
| Argument | Type | Description |
|---|---|---|
| repo | string | null | Which repository, as 'group/repo'. Omit when only one is open. |
| change* | string | The merge request or pull request number ('!12', '#12' or '12'), or a commit's hash. |
{
"type": "object",
"required": [
"change"
],
"properties": {
"repo": {
"type": [
"string",
"null"
],
"default": null,
"description": "Which repository, as 'group/repo'. Omit when only one is open."
},
"change": {
"type": "string",
"description": "The merge request or pull request number ('!12', '#12' or '12'), or a commit's hash."
}
}
}Read an issue's checklist — the '- [ ]' lines of its description — as items, in order: each with a stable 'id' (pass it to check_checklist_item), 'checked', its words ('text', without reminder or picture), its 'depth' when nested, its 'reminder' ('YYYY-MM-DD HH:MM' or null) and its 'picture' — the attachment it shows of how the item should look, with the 'content' address its bytes are read at with this same token, or null — and its 'request' when the item asks somebody for a document (a 📎 in its line): 'state' (waiting, overdue past its 'due' day, sent with a file not yet ticked, done once ticked) and the 'files' sent to it, or null for an item that asks for nothing. Needs only permission to see the issue.
| Argument | Type | Description |
|---|---|---|
| key* | string | Issue key, e.g. 'UK-1'. |
{
"type": "object",
"required": [
"key"
],
"properties": {
"key": {
"type": "string",
"description": "Issue key, e.g. 'UK-1'."
}
}
}One claim of a project (see list_claims), with its journal: every change of its status — from what, to what, who and on what ground — newest first, and when it was created and edited. Name it by 'id', or by 'project' and 'label'. Anybody who sees the project.
| Argument | Type | Description |
|---|---|---|
| id | integer | null | The claim's id, as list_claims returned it. |
| label | string | null | The claim's label, e.g. 'thm:d5-rank5', with 'project'. |
| project | string | null | The project key, with 'label'. |
{
"type": "object",
"properties": {
"id": {
"type": [
"integer",
"null"
],
"default": null,
"description": "The claim's id, as list_claims returned it."
},
"label": {
"type": [
"string",
"null"
],
"default": null,
"description": "The claim's label, e.g. 'thm:d5-rank5', with 'project'."
},
"project": {
"type": [
"string",
"null"
],
"default": null,
"description": "The project key, with 'label'."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| key* | string | Issue key, e.g. 'UK-1'. |
| limit | integer | How many comments to return (default 20, max 100). |
| startAt | integer | null | Where 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. |
{
"type": "object",
"required": [
"key"
],
"properties": {
"key": {
"type": "string",
"description": "Issue key, e.g. 'UK-1'."
},
"limit": {
"type": "integer",
"default": 20,
"description": "How many comments to return (default 20, max 100)."
},
"startAt": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Where 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."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| key* | string | Issue key, e.g. 'UK-1'. |
{
"type": "object",
"required": [
"key"
],
"properties": {
"key": {
"type": "string",
"description": "Issue key, e.g. 'UK-1'."
}
}
}Which Jira of its own a project is connected to: the site, the account whose token it uses (what a write there is signed as), whether a token is held ('secretSet' — the token itself never comes back) and whether the connection is switched on; and under 'confluence', whether the same site's Confluence is read too, whose account answered there, and whether it has a token of its own ('ownToken') rather than the Jira one. 'connected' false means none. 'canConfigure' says whether you may change it: connecting, or giving a new token, is done on the board's Jira sheet at 'url', since the token is a secret that is never typed in this chat; switching it on or off is set_jira_connection. Any member of the project may ask.
| Argument | Type | Description |
|---|---|---|
| projectKey* | string | Project key, e.g. 'PM'. |
{
"type": "object",
"required": [
"projectKey"
],
"properties": {
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'PM'."
}
}
}Which issue of the project's own Jira this issue is, and what that Jira says of it now — its summary, status, assignee and link — read with the token the project's administrator connected. 'connected' false means the project has no Jira; 'jira.state' is 'found', 'missing' (no such issue, or one the token cannot see), 'refused' (the token no longer opens the site), 'unreachable', 'off' or 'sealed'. Where the project keeps its statuses in step with that Jira (get_jira_sync), 'sync' says which way and, in 'problem', why the two were left apart: 'conflict' (both moved), 'no_pair_here' / 'no_pair_there' (a status with no pair), 'refused_here' (this project's workflow refused the move), 'no_move' (the site lists no move to the paired status), 'refused_there', 'missing', 'token'. Set the link with set_jira_link.
| Argument | Type | Description |
|---|---|---|
| key* | string | Issue key here, e.g. 'PM-12'. |
{
"type": "object",
"required": [
"key"
],
"properties": {
"key": {
"type": "string",
"description": "Issue key here, e.g. 'PM-12'."
}
}
}How a project keeps its issues' statuses in step with its own Jira (see get_jira_link): 'direction' — 'off', 'both', 'from_jira' (Jira moves, the issue here follows) or 'to_jira' (the issue here moves, Jira follows); 'pairs' — which status here is which there, in order; 'actsFor' — the person whose name a move made here carries, and 'ownerStands' false when they can no longer be acted for (the sync then waits until somebody saves it again); 'webhook' — whether the site's webhook is set up and when it was last heard (the address itself is only shown on the screen); 'statuses' here and 'jiraStatuses' there to pair; and the issues left with their statuses apart, with why ('conflict', 'no_pair_here', 'no_pair_there', 'refused_here', 'no_move', 'refused_there', 'missing', 'token'). For whoever administers the project.
| Argument | Type | Description |
|---|---|---|
| projectKey* | string | Project key, e.g. 'PM'. |
{
"type": "object",
"required": [
"projectKey"
],
"properties": {
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'PM'."
}
}
}A legal act that issues or wiki pages you can read refer to, as it is kept here: title, publisher, 'state' (fresh, stale, waiting — named and not read yet, or unreachable), 'asOf' — the day its text is as of, how many issues and pages refer to it ('references': total, and 'hidden' of them where you may not read), its articles with their offsets ('outline', on the first look) and a window of its text, at most 12000 characters. 'changedAt' is when its words were last found changed on the publisher's site, 'editions' the earlier texts kept (from, to — the days the site was asked, not the days the act was amended — and the headings each change was under), 'failing' a site that has stopped giving it. Pass 'find' («Article 18») to land on a place, or 'offset' to read on from 'nextOffset'. Reads no site: the text is the one already read. Name the act by the document id a reference gives, by its address, or by its key (e.g. 32015L0849); an act nothing you can read refers to is not found.
| Argument | Type | Description |
|---|---|---|
| find | string | null | Words to land on, e.g. 'Article 18'. |
| offset | integer | null | Where to read from: a previous answer's nextOffset, or an outline entry's offset. |
| document* | string | The act: a document id, its address, or its key (e.g. '32015L0849'). |
{
"type": "object",
"required": [
"document"
],
"properties": {
"find": {
"type": [
"string",
"null"
],
"default": null,
"description": "Words to land on, e.g. 'Article 18'."
},
"offset": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Where to read from: a previous answer's nextOffset, or an outline entry's offset."
},
"document": {
"type": "string",
"description": "The act: a document id, its address, or its key (e.g. '32015L0849')."
}
}
}Read one page of the Confluence of a project's own Jira site — switched on beside the Jira (get_jira_connection's 'confluence') — on the project's token, as the agents read it: its title, space, the pages above it, its version and who changed it last, and its body as Markdown (cut at 12000 characters, which it says). A page there is 'confluence_page_id', with its 'confluence_url'; it is not a page of this tracker's wiki (get_wiki_page). What it says was written by people on that site. Name the project by 'project', or an issue here by 'issue'. For the people who work in the project; at most 10 reads of the linked site a minute per person, Jira and Confluence together. A refusal has a 'state': not_connected (with the 'url' of the screen that connects one), off, missing, refused, unreachable, busy, sealed, no_access, bad_request.
| Argument | Type | Description |
|---|---|---|
| page* | string | The page there: its id, e.g. '123456', or its link. |
| issue | string | null | An issue here, e.g. 'PM-12', whose project's site is read. |
| project | string | null | Project key here, e.g. 'PM'. Or give 'issue'. |
{
"type": "object",
"required": [
"page"
],
"properties": {
"page": {
"type": "string",
"description": "The page there: its id, e.g. '123456', or its link."
},
"issue": {
"type": [
"string",
"null"
],
"default": null,
"description": "An issue here, e.g. 'PM-12', whose project's site is read."
},
"project": {
"type": [
"string",
"null"
],
"default": null,
"description": "Project key here, e.g. 'PM'. Or give 'issue'."
}
}
}Read the comments of one issue of a project's own Jira (see get_linked_jira_issue), the newest first: who wrote each, when and what, and how many there are in all. Name the project by 'project', or an issue here by 'issue' — then its project's Jira is read, and the issue's own key there is the default. For the people who work in the project; at most 10 reads of the linked Jira a minute per person.
| Argument | Type | Description |
|---|---|---|
| issue | string | null | An issue here, e.g. 'PM-12': its project's Jira is read, and its own key there unless 'jiraKey' says otherwise. |
| limit | integer | null | How many of the latest, at most 30. Default 10. |
| jiraKey | string | null | The issue there: 'ACME-123' or its /browse/ link. Optional when 'issue' has a key there. |
| project | string | null | Project key here, e.g. 'PM'. Or give 'issue'. |
{
"type": "object",
"properties": {
"issue": {
"type": [
"string",
"null"
],
"default": null,
"description": "An issue here, e.g. 'PM-12': its project's Jira is read, and its own key there unless 'jiraKey' says otherwise."
},
"limit": {
"type": [
"integer",
"null"
],
"default": null,
"description": "How many of the latest, at most 30. Default 10."
},
"jiraKey": {
"type": [
"string",
"null"
],
"default": null,
"description": "The issue there: 'ACME-123' or its /browse/ link. Optional when 'issue' has a key there."
},
"project": {
"type": [
"string",
"null"
],
"default": null,
"description": "Project key here, e.g. 'PM'. Or give 'issue'."
}
}
}Read one issue of a project's own Jira — the one its administrator connected (get_jira_connection) — on the project's token, as the issue screen and the agents read it: summary, type, status, priority, assignee, reporter, dates, labels, versions, parent, sub-tasks, links there and the description (cut at 12000 characters, which it says). An issue there is 'jira_key', with its 'jira_url'; it is not an issue of this tracker (get_issue). What it says was written by people on that site. Name the project by 'project', or an issue here by 'issue' — then its project's Jira is read, and the issue's own key there is the default. For the people who work in the project; at most 10 reads of the linked Jira a minute per person. A refusal has a 'state': not_connected (with the 'url' of the screen that connects one), missing, refused, unreachable, busy, off, sealed, no_access, bad_request.
| Argument | Type | Description |
|---|---|---|
| issue | string | null | An issue here, e.g. 'PM-12': its project's Jira is read, and its own key there unless 'jiraKey' says otherwise. |
| jiraKey | string | null | The issue there: 'ACME-123' or its /browse/ link. Optional when 'issue' has a key there. |
| project | string | null | Project key here, e.g. 'PM'. Or give 'issue'. |
{
"type": "object",
"properties": {
"issue": {
"type": [
"string",
"null"
],
"default": null,
"description": "An issue here, e.g. 'PM-12': its project's Jira is read, and its own key there unless 'jiraKey' says otherwise."
},
"jiraKey": {
"type": [
"string",
"null"
],
"default": null,
"description": "The issue there: 'ACME-123' or its /browse/ link. Optional when 'issue' has a key there."
},
"project": {
"type": [
"string",
"null"
],
"default": null,
"description": "Project key here, e.g. 'PM'. Or give 'issue'."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| id* | integer | The rule's id, from list_project_rules. |
| limit | integer | How many lines, newest first (default 20, max 100). |
| projectKey* | string | Project key, e.g. 'ONB'. |
{
"type": "object",
"required": [
"projectKey",
"id"
],
"properties": {
"id": {
"type": "integer",
"description": "The rule's id, from list_project_rules."
},
"limit": {
"type": "integer",
"default": 20,
"description": "How many lines, newest first (default 20, max 100)."
},
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'ONB'."
}
}
}What this company and one of its projects could still set up in the tracker, and what is set up already — call it when the person has just started or asks what else the tracker can do. Each step has 'id', 'scope' ('company' or 'project'), 'done', 'why' (one sentence) and 'how': the next move, either an MCP 'tool' with example 'args' to call, or a 'url' of the screen to open when the step needs a token, a key or a browser — never ask for such a secret in the chat. Steps not yet done come first. Only steps the caller may take are listed: the ones that need the project's lead or the company's owner or an admin are counted in 'hidden', with a 'note' to ask them. Without 'project', the only project the caller can see is used; with several, 'projects' lists them and only the company's steps are answered.
| Argument | Type | Description |
|---|---|---|
| project | string | null | The project's key, e.g. 'PM'. Optional when the caller can see only one project. |
{
"type": "object",
"properties": {
"project": {
"type": [
"string",
"null"
],
"default": null,
"description": "The project's key, e.g. 'PM'. Optional when the caller can see only one project."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| letterId* | integer | The letter's id. |
{
"type": "object",
"required": [
"letterId"
],
"properties": {
"letterId": {
"type": "integer",
"description": "The letter's id."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| key* | string | Issue key of the request, e.g. 'SUPPORT-12'. |
{
"type": "object",
"required": [
"key"
],
"properties": {
"key": {
"type": "string",
"description": "Issue key of the request, e.g. 'SUPPORT-12'."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| title | string | null | Exact page title, when identifying the page by title. |
| pageId | integer | null | Page id (as returned by search_wiki). |
| filename* | string | File name, as listed by get_wiki_page. |
| spaceKey | string | null | Space key, when identifying the page by title. |
{
"type": "object",
"required": [
"filename"
],
"properties": {
"title": {
"type": [
"string",
"null"
],
"default": null,
"description": "Exact page title, when identifying the page by title."
},
"pageId": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Page id (as returned by search_wiki)."
},
"filename": {
"type": "string",
"description": "File name, as listed by get_wiki_page."
},
"spaceKey": {
"type": [
"string",
"null"
],
"default": null,
"description": "Space key, when identifying the page by title."
}
}
}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. A page with ```manim code blocks (where the company has scenes switched on) also returns 'scenes': each block's drawing state — queued, rendering, done or failed — manim's own error when it failed, and the attachment it was drawn into. A page with ```anim blocks (a scene as JSON the reader's client plays itself, no rendering) returns 'anims': for each, whether it can be shown, its length, or every problem with where it stands.
| Argument | Type | Description |
|---|---|---|
| id | integer | null | Page id (as returned by search_wiki). |
| limit | integer | null | How many lines to return from 'offset' (default 200). |
| title | string | null | Exact page title, when looking the page up by title. |
| offset | integer | null | Return only the Markdown source from this 1-based line on — for a page without headings to navigate by. Pair with 'limit'. |
| outline |
A wiki page's APPROVAL: which edition is in force. 'version' is the edition the page is at now and 'approved' whether that very edition is approved. 'inForce' is the newest edition somebody's approval stands on — its 'version', when it was written, when it was approved and 'by' whom (null: the page was never approved). When 'inForce.version' is lower than 'version' the page was EDITED AFTER it was approved: the text you read with get_wiki_page is not the approved one. 'approvers' are the people named on the page as those who may approve it (the project's lead always may), 'canApprove' / 'canAsk' what you may do, and 'journal' every line ever written, newest first — asked, released, approved, withdrawn; no line is ever changed or removed.
| Argument | Type | Description |
|---|---|---|
| id* | integer | Page id (as returned by search_wiki). |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "integer",
"description": "Page id (as returned by search_wiki)."
}
}
}A wiki page as REQUIRED READING: whether somebody is asked to read it and mark so. 'edition' is the version to read — the approved edition in force where the page has one (see get_wiki_page_approval), else the one its lead last asked about; null when the page is asked of nobody. 'required' says whether it is asked of YOU and 'readAt' when you marked that edition (absent: not yet). 'readers' is the list as written: a person, 'members' (everybody on the project) or a team role. For the project's lead there is also 'people' — everybody the page is for today, each with 'askedAt', 'readAt' and 'remindedAt' for that edition, so who has NOT read it is whoever has no 'readAt' — and 'earlier', the marks on earlier editions. A mark is on an edition: a newer approved edition leaves the old marks in 'earlier' and asks everybody again.
| Argument | Type | Description |
|---|---|---|
| id* | integer | Page id (as returned by search_wiki). |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "integer",
"description": "Page id (as returned by search_wiki)."
}
}
}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. 'to' may also be an issue of ANOTHER company's PUBLIC project, as 'company/KEY-12' (e.g. 'math/D5-12') or its address there: it is read as somebody with no account reads it, linked only while public, shown in get_issue's 'publicLinks' with a 'state' that says 'unavailable' once its project closes, and the other company is not told. That needs permission to edit 'from' only.
| Argument | Type | Description |
|---|---|---|
| to* | string | The issue at the other end, e.g. 'PM-417' — or another company's public issue, 'math/D5-12'. |
| from* | string | The issue the phrase is said about, e.g. 'PM-419'. |
| type* | string | How '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. |
{
"type": "object",
"required": [
"from",
"to",
"type"
],
"properties": {
"to": {
"type": "string",
"description": "The issue at the other end, e.g. 'PM-417' — or another company's public issue, 'math/D5-12'."
},
"from": {
"type": "string",
"description": "The issue the phrase is said about, e.g. 'PM-419'."
},
"type": {
"type": "string",
"description": "How '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."
}
}
}Say how one term of a project stands to another (PM-1053): 'from' rests on 'to' ('dependsOn', the default), is a special case of it ('specialCaseOf'), or is its opposite ('oppositeOf'). 'state' 'confirmed' (the default) keeps the link — shown to readers beside the term and used for the order of reading; 'rejected' turns down a link term_graph proposed, so the definition does not offer it again; 'none' takes a link away. Terms are named by id or spelling, as term_graph returns them; 'to' must be of the project or one above it. Members of the project who may write only.
| Argument | Type | Description |
|---|---|---|
| to* | string | The term rested on: id or spelling. |
| from* | string | The term that rests on the other: id or spelling. |
| kind | string | null | 'dependsOn', 'specialCaseOf' or 'oppositeOf'. Default 'dependsOn'. |
| state | string | null | 'confirmed', 'rejected' or 'none'. Default 'confirmed'. |
| project* | string | The project key. |
{
"type": "object",
"required": [
"project",
"from",
"to"
],
"properties": {
"to": {
"type": "string",
"description": "The term rested on: id or spelling."
},
"from": {
"type": "string",
"description": "The term that rests on the other: id or spelling."
},
"kind": {
"type": [
"string",
"null"
],
"default": null,
"description": "'dependsOn', 'specialCaseOf' or 'oppositeOf'. Default 'dependsOn'."
},
"state": {
"type": [
"string",
"null"
],
"default": null,
"description": "'confirmed', 'rejected' or 'none'. Default 'confirmed'."
},
"project": {
"type": "string",
"description": "The project key."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| title | string | null | Exact page title, when identifying the page by title. |
| pageId | integer | null | Page id (as returned by search_wiki). |
| issueKey* | string | Issue key, e.g. 'UK-1'. |
| spaceKey | string | null | Space key, when identifying the page by title. |
| relationship | string | null | How the page relates to the issue, free text — e.g. 'documentation' (the default), 'specification', 'design'. |
{
"type": "object",
"required": [
"issueKey"
],
"properties": {
"title": {
"type": [
"string",
"null"
],
"default": null,
"description": "Exact page title, when identifying the page by title."
},
"pageId": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Page id (as returned by search_wiki)."
},
"issueKey": {
"type": "string",
"description": "Issue key, e.g. 'UK-1'."
},
"spaceKey": {
"type": [
"string",
"null"
],
"default": null,
"description": "Space key, when identifying the page by title."
},
"relationship": {
"type": [
"string",
"null"
],
"default": null,
"description": "How the page relates to the issue, free text — e.g. 'documentation' (the default), 'specification', 'design'."
}
}
}A project's claims — its theorems, lemmas, propositions, corollaries, conjectures and questions — each with its label (what a paper's \label and a citation name it by, e.g. 'thm:d5-rank5'), its number in the paper, its statement (Markdown with formulas), how far it is proved and what it rests on. 'status' is on one fixed scale: 'open' (not proved), 'paper' (proved on paper), 'computer' (by a computation), 'lean' (formalised in Lean), 'refuted', 'retracted' (taken back — the † of a result). A basis is a wiki page with the proof ('page', its id and title — or 'hidden' where you may not open the page), a computation by the name a [comp:…] cites ('computation'), a Lean declaration ('lean') or a source in words ('source'). This register is where a claim's status is kept: read it here rather than from a page's words, and change it with set_claim_status. Ordered by number, then label. Anybody who sees the project.
| Argument | Type | Description |
|---|---|---|
| q | string | null | Words its label, number, title or statement holds, case aside. |
| kind | string | null | Only claims of this kind: theorem, lemma, proposition, corollary, conjecture, question. |
| status | string | null | Only claims of this status: open, paper, computer, lean, refuted, retracted. |
| project* | string | The project key, e.g. MATH. |
{
"type": "object",
"required": [
"project"
],
"properties": {
"q": {
"type": [
"string",
"null"
],
"default": null,
"description": "Words its label, number, title or statement holds, case aside."
},
"kind": {
"type": [
"string",
"null"
],
"default": null,
"description": "Only claims of this kind: theorem, lemma, proposition, corollary, conjecture, question."
},
"status": {
"type": [
"string",
"null"
],
"default": null,
"description": "Only claims of this status: open, paper, computer, lean, refuted, retracted."
},
"project": {
"type": "string",
"description": "The project key, e.g. MATH."
}
}
}List a directory of a repository connected to a project. Only repositories whose owners opened them to agents can be read.
| Argument | Type | Description |
|---|---|---|
| path | string | null | Directory inside the repository. Omit for its root. |
| repo | string | null | Which repository, as 'group/repo'. Its last segment alone is enough when unambiguous; omit it when only one is open. |
| reference | string | null | Branch, tag or commit. Omit for the default branch. |
{
"type": "object",
"properties": {
"path": {
"type": [
"string",
"null"
],
"default": null,
"description": "Directory inside the repository. Omit for its root."
},
"repo": {
"type": [
"string",
"null"
],
"default": null,
"description": "Which repository, as 'group/repo'. Its last segment alone is enough when unambiguous; omit it when only one is open."
},
"reference": {
"type": [
"string",
"null"
],
"default": null,
"description": "Branch, tag or commit. Omit for the default branch."
}
}
}The computations issues rest on, as their runners reported them: state, progress, the commit and repository, the job's page and output, and what came of it. With 'key', one issue's; with 'projectKey', the project's, newest first and the ones still going on top — state 'open' (queued or running) is what is going now, which is the first thing to ask after a lost session instead of reading status comments. 'state' may also be one of queued, running, done, failed, cancelled, lost.
| Argument | Type | Description |
|---|---|---|
| key | string | null | One issue's computations, e.g. 'MATH-74'. |
| limit | integer | How many, for a project (default 50, max 200). |
| state | string | null | Only this state, or 'open' for queued and running together. |
| projectKey | string | null | A project's computations, e.g. 'MATH'. Ignored when 'key' is given. |
{
"type": "object",
"properties": {
"key": {
"type": [
"string",
"null"
],
"default": null,
"description": "One issue's computations, e.g. 'MATH-74'."
},
"limit": {
"type": "integer",
"default": 50,
"description": "How many, for a project (default 50, max 200)."
},
"state": {
"type": [
"string",
"null"
],
"default": null,
"description": "Only this state, or 'open' for queued and running together."
},
"projectKey": {
"type": [
"string",
"null"
],
"default": null,
"description": "A project's computations, e.g. 'MATH'. Ignored when 'key' is given."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| pageId | integer | null | Wiki page id. |
| issueKey | string | null | Issue key, e.g. 'UK-1'. |
{
"type": "object",
"properties": {
"pageId": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Wiki page id."
},
"issueKey": {
"type": [
"string",
"null"
],
"default": null,
"description": "Issue key, e.g. 'UK-1'."
}
}
}A project's environments, in order, and its ten newest deployments. An environment is one of the places a project's work is put out to — 'dev', 'staging', 'prod' — in order; the LAST one is where finished work ends up. A deployment is a pipeline saying «this went out, there». Each issue it carried then says where it lies ('deployedTo' on get_issue), gets one history line per environment, and the project's rules with trigger 'deployed' run on it. Also 'canEdit' (you may change the list) and 'canReport' (you may report a deployment). Any member may read them.
| Argument | Type | Description |
|---|---|---|
| projectKey* | string | Project key, e.g. 'ONB'. |
{
"type": "object",
"required": [
"projectKey"
],
"properties": {
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'ONB'."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| key | string | null | Limit to one issue, e.g. 'UK-1'. Omit to look across every project this token can reach. |
| from | string | null | 'agent' for only what an agent put to somebody (a resolution, PM-602), 'people' for only what a person asked. Omit for both. |
| role | string | null | Whose 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. |
| limit | integer | How many to return (default 20, max 100). |
| state | string | 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). |
{
"type": "object",
"properties": {
"key": {
"type": [
"string",
"null"
],
"default": null,
"description": "Limit to one issue, e.g. 'UK-1'. Omit to look across every project this token can reach."
},
"from": {
"type": [
"string",
"null"
],
"default": null,
"description": "'agent' for only what an agent put to somebody (a resolution, PM-602), 'people' for only what a person asked. Omit for both."
},
"role": {
"type": [
"string",
"null"
],
"default": null,
"description": "Whose 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."
},
"limit": {
"type": "integer",
"default": 20,
"description": "How many to return (default 20, max 100)."
},
"state": {
"type": [
"string",
"null"
],
"default": "open",
"description": "'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)."
}
}
}A project's RECURRING ISSUES: issues it files by itself on a calendar — a monthly report, a quarterly review, a licence renewed every year. Each has the issue as words (summary, description, type, assignee, priority, labels), the cadence ('every' N of 'unit': week or month — 3 months is a quarter, 12 a year), 'nextDay' it files on, 'dueInDays' (the filed issue's due day, counted from the day it is filed), whose it is (it files in that person's name) and, when the last day filed nothing, 'halted' ('owner_lost': its owner can no longer configure the project and it is switched off; 'refused': the filing was refused, 'lastError' says why). 'lastIssueKey' is the last one filed. Any member may read them.
| Argument | Type | Description |
|---|---|---|
| project* | string | The project key, e.g. PM. |
{
"type": "object",
"required": [
"project"
],
"properties": {
"project": {
"type": "string",
"description": "The project key, e.g. PM."
}
}
}The requests of people outside the company to take part in a public project: who asked, what they wrote, when — those waiting first, then the last twenty decided. Approved, a person files issues and comments in that project and nothing else; they take no seat and see nothing else of the company. Only the project's owner and its administrators see and decide them.
| Argument | Type | Description |
|---|---|---|
| projectKey* | string | Key of the public project, e.g. 'LIB'. |
{
"type": "object",
"required": [
"projectKey"
],
"properties": {
"projectKey": {
"type": "string",
"description": "Key of the public project, e.g. 'LIB'."
}
}
}List the acts in the legal library — what this installation's agents have already read off the official sites: url, title, the day the text is as of (fetched_at), when the site last confirmed it (checked_at) and its length. Open where the company lets an agent role read laws.
| Argument | Type | Description |
|---|---|---|
| limit | integer | null | How many, at most 200. Default 50. |
| filter | string | null | Only acts whose title or address contains this. |
{
"type": "object",
"properties": {
"limit": {
"type": [
"integer",
"null"
],
"default": null,
"description": "How many, at most 200. Default 50."
},
"filter": {
"type": [
"string",
"null"
],
"default": null,
"description": "Only acts whose title or address contains this."
}
}
}The legal acts one issue or one wiki page refers to — in its own text and in the comments on it. Each reference: its 'id' (pass it to remove_legal_reference), where it stands ('in': issue, comment, page or wikiComment, with 'commentId'), the act ('document': id, url, sourceUrl, title, hasText, asOf — the day its text is as of), the 'place' cited («Article 18»), the 'quote' it was read from, 'foundBy' (url, pattern, model or hand) and 'state' — 'proposed' is the model's offer that nobody accepted yet, 'rejected' one somebody said no to. 'editionChangedAt' is set when the act's text was found changed since the reference was made and nobody has looked at it since ('editionReaches': whether the change is in the place cited, null when that cannot be told) — a person marks it looked at on the screen. 'enabled' false means the project does not keep legal references, and the list is empty. Needs only permission to see the issue or the page. In JQL and CQL the same is the field legalRef.
| Argument | Type | Description |
|---|---|---|
| page | integer | null | Wiki page id (as returned by search_wiki). Either this or 'issue'. |
| issue | string | null | Issue key, e.g. 'UK-1'. Either this or 'page'. |
{
"type": "object",
"properties": {
"page": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Wiki page id (as returned by search_wiki). Either this or 'issue'."
},
"issue": {
"type": [
"string",
"null"
],
"default": null,
"description": "Issue key, e.g. 'UK-1'. Either this or 'page'."
}
}
}List the external MCP connections configured for a project. Auth tokens are never returned (only whether one is set).
| Argument | Type | Description |
|---|---|---|
| projectKey* | string | Project key, e.g. 'UK'. |
{
"type": "object",
"required": [
"projectKey"
],
"properties": {
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'UK'."
}
}
}A project's register of persons — the people its texts name — each with their spellings by script and form, each spelling's source and whether it is checked (see find_person), facts (born, died, wikidata, mathGenealogy, orcid, mrAuthor) the same way, and the project's note on why they are here. 'state' is 'confirmed', 'proposed' (found in the texts, waiting for a person — set_person with state decides it) or 'rejected'; proposed and rejected ones only to members who may write. 'reading' says whether the project has its texts read for persons. 'q' narrows to persons with a spelling holding those words. To a member who may write, 'similar' pairs two persons that look like one, with the two spellings and why — 'form' (the same up to the form of the words, «Гупта» / «Гупты»), 'letter' (one letter apart in a long Latin name, «Sjogren» / «Sjorgren»), 'transliteration' («Сьёгрен» / «Sjogren») or 'initials' («N. D. Gupta» / «Narayan D. Gupta») — a hint for the person to decide, never a fact: merge_persons only when they agree, distinct_persons when they say the two are different people — 'distinct' lists those answers. 'merged' lists the persons merged into one, whose spellings and facts are shown among its own with 'mergedFrom'. Only spellings whose source you may open; a person none of whose spellings you may see is not listed. Only where the company's plan includes AI.
| Argument | Type | Description |
|---|---|---|
| q | string | null | Words a spelling holds, case aside. |
| limit | integer | How many to return, at most 200. Default 100. |
| state | string | null | 'confirmed', 'proposed', 'rejected' or leave out for all you may see. |
| offset | integer |
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.
| Argument | Type | Description |
|---|---|---|
| projectKey* | string | Project key, e.g. 'CRM'. |
{
"type": "object",
"required": [
"projectKey"
],
"properties": {
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'CRM'."
}
}
}The ready-made projects a project can take in one action — today 'requirements', a register of what a company is obliged to do: an issue type, ten columns (the norm, the obligation, who answers, what proves it, when it is reviewed), a four-state workflow, the year's recurring compliance work and two wiki page templates. Says what each brings, by name, before anything is taken.
No arguments.
{
"type": "object",
"properties": {}
}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. 'trigger' says WHEN: 'entered' (the default — the issue entered 'status'), 'versionReleased' (a version it goes out in was marked released), 'subtasksDone' (every issue under it is finished — the rule acts on the PARENT) or 'subtaskStarted' (an issue under it was taken into work — the parent again); or what the project's repository said through its webhook: 'branchCreated' (a branch naming the issue was made), 'mrOpened', 'mrMerged' or 'mrClosed' (a merge request — a pull request on GitHub — naming the issue was opened, merged, or closed without merging). An issue is named by its key in the branch, the title or the description, and only this project's issues are touched. 'branch' narrows the three merge-request events to a request going INTO that branch, e.g. 'main'. Nobody is behind a webhook, so such a rule acts as whoever last saved or switched it on, whatever its action. 'deployed' fires when a pipeline reports that the issue went out to an environment (report_deployment); 'environment' narrows it to one of the project's environments by name, e.g. 'staging'. 'actChanged' fires on the issues that cite a legal act when its publisher's text changed, and 'actTouched' only on those where the change is in the place they cite (or that cite the act as a whole) — found once a week, only in a project with the «Legal acts» add-on; nobody is behind a publisher either, so these act as the rule's owner too. Only 'entered' has a 'status'; pass an empty one for the others. 'fromStatus' narrows any of them to an issue coming from that state: the state it has just left for 'entered', the state it stands in for the rest. A rule with action 'move' MOVES the issue to 'moveToStatus' instead of appending anything, and has no template (pass an empty one). The move is an ordinary one — made as whoever last saved or switched on the rule, asked of the project's workflow, written to the history with the rule's name, and followed by the rules of the state it lands in. A workflow that refuses it leaves a 'moveRefused' line with the reason in the journal and nothing else; 'moved' is a move made; 'tooDeep' is a move not made because rules had already moved issues three times off one event. 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, jira (propose a move or a comment in the project's linked Jira, applied by a person). 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, trigger, state, conditions (type, label, fromStatus, branch — null means any), template, moveToStatus and whether it is on, and for a duty its 'agent' part; with the state and type names, the triggers and the actions 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.
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.
No arguments.
{
"type": "object",
"properties": {}
}The GitHub and GitLab repositories a project is connected to: each one's id, host, path and address, whether it is the project's open source repository (with the licence its host named and when that was last confirmed), whether a token is set (never the token), whether agents may read its code, and whether a webhook is set. Also whether the project itself is open source and public, whether you may change the list, and the screen where a token is given. Any member may read it.
| Argument | Type | Description |
|---|---|---|
| projectKey* | string | Key of the project, e.g. 'LIB'. |
{
"type": "object",
"required": [
"projectKey"
],
"properties": {
"projectKey": {
"type": "string",
"description": "Key of the project, e.g. 'LIB'."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| state | string | null | One of 'held', 'failed', 'ignored', 'dismissed'. Omit for held and failed. |
{
"type": "object",
"properties": {
"state": {
"type": [
"string",
"null"
],
"default": null,
"description": "One of 'held', 'failed', 'ignored', 'dismissed'. Omit for held and failed."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| who | string | null | 'all' (default), 'mine' (assigned to you) or 'unassigned'. |
{
"type": "object",
"properties": {
"who": {
"type": [
"string",
"null"
],
"default": null,
"description": "'all' (default), 'mine' (assigned to you) or 'unassigned'."
}
}
}A project's terms: each word, its other spellings, its short definition, its kind, and its source (a wiki page or an issue, with the heading on it). 'state' is 'confirmed' (shown to readers, marked in texts), 'proposed' (found on a page by its markup or by the model, waiting for a person — set_term with state 'confirmed' or 'rejected' decides it) or 'rejected' (kept so it is not offered again). Proposed and rejected ones are listed only to members who may write. Only terms whose source you may open. 'uses' is how many times the project's pages and issues use the term by any spelling (null: not counted yet); the most used come first, a page at a time — 'total' says how many there are. To a member who may write, 'similar' pairs a term of this page with another that looks like it up to the form of its words (plural, case) — merge_terms joins them if the person agrees. Only where the company's plan includes AI.
| Argument | Type | Description |
|---|---|---|
| kind | string | null | Only these kinds, comma-separated — 'статус,система'; an empty one ('статус,') also takes terms with no kind. 'kinds' in the answer says which there are. |
| limit | integer | How many to return, at most 200. Default 100. |
| state | string | null | 'confirmed', 'proposed', 'rejected' or leave out for all you may see. |
| offset | integer | How many to skip — for the next page. |
| source | string | null | Only the terms of one source — 'page:471', 'issue:KYC-12', or 'none' for the terms with no source. 'sources' in the answer says which there are, with how many. |
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.
| Argument | Type | Description |
|---|---|---|
| projectKey* | string | Project key, e.g. 'TH'. |
{
"type": "object",
"required": [
"projectKey"
],
"properties": {
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'TH'."
}
}
}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'.
| Argument | Type | Description |
|---|---|---|
| text | string | null | Free text to match in username, display name or email. |
| limit | integer | Max users to return (default 50, max 200). |
| projectKey | string | null | Restrict to members of this project key (must be visible to the token). |
| includeInactive | boolean | Include deactivated accounts, which can be neither assigned nor mentioned. Off by default. |
{
"type": "object",
"properties": {
"text": {
"type": [
"string",
"null"
],
"default": null,
"description": "Free text to match in username, display name or email."
},
"limit": {
"type": "integer",
"default": 50,
"description": "Max users to return (default 50, max 200)."
},
"projectKey": {
"type": [
"string",
"null"
],
"default": null,
"description": "Restrict to members of this project key (must be visible to the token)."
},
"includeInactive": {
"type": "boolean",
"default": false,
"description": "Include deactivated accounts, which can be neither assigned nor mentioned. Off by default."
}
}
}A project's versions, in their sequence. A version is what a project's work goes out in — '2.4.0', 'Autumn'. It is the project's own: an issue carries versions of its own project only, any number of them ('fixVersions' on create_issue, update_issue and get_issue; JQL 'fixVersion = "2.4.0"', 'fixVersion in unreleasedVersions()'). Each with its id, name, description, startDate and releaseDate (YYYY-MM-DD), whether it is released or archived (put away: still on its issues, no longer offered), 'overdue' (its day has passed and it has not shipped), and how many issues it carries — 'issues' — and how many of those are not finished — 'open'. Also 'canEdit': whether you may make, change and release versions here. Any member may read them.
| Argument | Type | Description |
|---|---|---|
| projectKey* | string | Project key, e.g. 'ONB'. |
| hideArchived | boolean | Leave out the versions that are archived. They are listed by default, since an issue may still carry one. |
{
"type": "object",
"required": [
"projectKey"
],
"properties": {
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'ONB'."
},
"hideArchived": {
"type": "boolean",
"default": false,
"description": "Leave out the versions that are archived. They are listed by default, since an issue may still carry one."
}
}
}The scenes of a wiki page — or of every page of a space you may edit — put on other sites (PM-1076): for each, its id, the block ('language' anim or anim-js and its number among that kind's blocks, as get_wiki_page's 'anims' numbers them), the link and the ready <iframe> code, the caption, the sites allowed to frame it (empty is any), the term ('expiresAt', null until removed), who made it and when, and how many times it was opened. Only for somebody who may edit the page; give 'id' for one page or 'spaceKey' for the space.
| Argument | Type | Description |
|---|---|---|
| id | integer | null | Page id. Give this or spaceKey. |
| spaceKey | string | null | Space key, for every page of it. |
{
"type": "object",
"properties": {
"id": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Page id. Give this or spaceKey."
},
"spaceKey": {
"type": [
"string",
"null"
],
"default": null,
"description": "Space key, for every page of it."
}
}
}The labels of one wiki space with how many pages carry each, most used first — counted over the pages visible to this token. `service` marks a label that does a job rather than describe a page ('template'). search_wiki with `label` lists a label's pages.
| Argument | Type | Description |
|---|---|---|
| spaceKey* | string | The space key, e.g. 'PM'. |
{
"type": "object",
"required": [
"spaceKey"
],
"properties": {
"spaceKey": {
"type": "string",
"description": "The space key, e.g. 'PM'."
}
}
}List the wiki spaces visible to this token. Every project has exactly one space, keyed like the project.
No arguments.
{
"type": "object",
"properties": {}
}How the person connects pm-files — a small local MCP server that attaches files from their own computer to issues and wiki pages by path, and saves attachments back to files, so no bytes pass through the conversation. Call it when you need a local file (a screenshot, a document, anything past the base64 ceiling) and pm-files is not among your tools: hand the person the command for their client, with this workspace's address already in it. It never contains a token, and you must never ask for one — the command takes it from the person's clipboard. Changes nothing.
No arguments.
{
"type": "object",
"properties": {}
}Mark a wiki page as READ, IN YOUR OWN NAME: «I have read this edition». 'version' is the edition you read and must be the one get_wiki_page_reading gives as 'edition' — the call is refused when the edition to read is another one. Only for somebody the page is required reading for. The mark is a line in the page's journal — who, when, which edition — and is never changed or removed. It is a person's statement: make it when your person told you they have read the page, not because you fetched its text.
| Argument | Type | Description |
|---|---|---|
| id* | integer | Page id. |
| version* | integer | The edition that was read: 'edition' from get_wiki_page_reading. |
{
"type": "object",
"required": [
"id",
"version"
],
"properties": {
"id": {
"type": "integer",
"description": "Page id."
},
"version": {
"type": "integer",
"description": "The edition that was read: 'edition' from get_wiki_page_reading."
}
}
}Merge one person of a project's register into another when they are one human being — «Sjorgren» into «Sjogren». ASK the person first, naming both as list_persons shows them: 'similar' there is only a hint. Nothing is removed: the one merged keeps their spellings and facts with their sources, and from then on find_person, list_persons and the marks answer the other for any of their spellings. unmerge_person undoes it. Into a person already merged is into the one they were merged into; a rejected person is not merged into. Both journals keep a line. Members of the project who may write only. Only where the company's plan includes AI.
| Argument | Type | Description |
|---|---|---|
| from* | integer | The person merged, as list_persons returned them. |
| into* | integer | The person who stays. |
{
"type": "object",
"required": [
"from",
"into"
],
"properties": {
"from": {
"type": "integer",
"description": "The person merged, as list_persons returned them."
},
"into": {
"type": "integer",
"description": "The person who stays."
}
}
}Join one term to another of the same project when they are one notion — «Размерные подгруппы» into «Размерная подгруппа». The joined term's name and spellings become the target's variants (so the reading does not offer that spelling again), its links move to the target, and the joined term is gone; this cannot be undone. The target keeps its definition, kind, source and place — with 'takeDefinition', the joined term's definition replaces it, together with the source and place it was read from. The result is confirmed if either was; two proposed terms stay proposed. 'similar' in list_terms names terms that look alike up to the form of their words. Members of the project who may write only. Only where the company's plan includes AI.
| Argument | Type | Description |
|---|---|---|
| from* | integer | The term to join to the other, as list_terms returned it — it is removed. |
| into* | integer | The term that stays. |
| takeDefinition | boolean | true to take the joined term's definition, with its source and place, instead of the target's. Default false. |
{
"type": "object",
"required": [
"from",
"into"
],
"properties": {
"from": {
"type": "integer",
"description": "The term to join to the other, as list_terms returned it — it is removed."
},
"into": {
"type": "integer",
"description": "The term that stays."
},
"takeDefinition": {
"type": "boolean",
"default": false,
"description": "true to take the joined term's definition, with its source and place, instead of the target's. Default false."
}
}
}Move an issue into another project, taking its comments, history, attachments, links and sub-tasks with it. The key does NOT change: 'PM-12' stays 'PM-12' wherever it lives, so every existing link and branch name goes on working. Call it with apply=false first (the default): the answer says what the move would cost — values in columns the target project does not have are LOST, the sprint is cleared, and a secret attached to the issue becomes readable by the target project's lead. Refuses when the target has no state by the issue's status name; say what that state becomes with 'statuses'. A sub-task cannot move on its own — move its parent. Needs full write access in BOTH projects.
| Argument | Type | Description |
|---|---|---|
| key* | string | The issue to move, e.g. 'PM-12'. |
| apply | boolean | false (the default) answers what the move would do and changes nothing. true does it. |
| statuses | string | null | What each source status becomes in the target project, as 'In Review=Review, Blocked=On hold'. Only needed for states the target does not already have under the same name. |
| toProject* | string | Project key to move it into, e.g. 'CRM'. |
{
"type": "object",
"required": [
"key",
"toProject"
],
"properties": {
"key": {
"type": "string",
"description": "The issue to move, e.g. 'PM-12'."
},
"apply": {
"type": "boolean",
"default": false,
"description": "false (the default) answers what the move would do and changes nothing. true does it."
},
"statuses": {
"type": [
"string",
"null"
],
"default": null,
"description": "What each source status becomes in the target project, as 'In Review=Review, Blocked=On hold'. Only needed for states the target does not already have under the same name."
},
"toProject": {
"type": "string",
"description": "Project key to move it into, e.g. 'CRM'."
}
}
}How the TRACKER ITSELF works — not what is in anybody's project: what a feature does, where it is on the screen, who may use it, and what the product does not do. Use it when the person asks about the tool ('how do sprints work here', 'where do I switch on due reminders', 'can a wiki page be restricted') rather than about their work. Without 'topic' it lists the topics, each with the questions it answers; with one it returns that topic's text. Buttons and menu items are quoted in «…» in the person's interface language — repeat them as given. 'availability' is set when the feature is switched off for this company: say that first. The text is the whole of what the help says; what it does not say, say it does not cover — do not fill it in from other trackers, and do not answer a question about the product from the project's wiki.
| Argument | Type | Description |
|---|---|---|
| topic | string | null | A topic id, e.g. 'sprints'. Leave out for the list. |
{
"type": "object",
"properties": {
"topic": {
"type": [
"string",
"null"
],
"default": null,
"description": "A topic id, e.g. 'sprints'. Leave out for the list."
}
}
}Read one file from a repository connected to a project. A long file arrives cut and says so; generated and binary files are not read.
| Argument | Type | Description |
|---|---|---|
| path* | string | The file's path inside the repository, e.g. 'src/app/main.ts'. Not a URL. |
| repo | string | null | Which repository, as 'group/repo'. Omit when only one is open. |
| reference | string | null | Branch, tag or commit. Omit for the default branch. |
{
"type": "object",
"required": [
"path"
],
"properties": {
"path": {
"type": "string",
"description": "The file's path inside the repository, e.g. 'src/app/main.ts'. Not a URL."
},
"repo": {
"type": [
"string",
"null"
],
"default": null,
"description": "Which repository, as 'group/repo'. Omit when only one is open."
},
"reference": {
"type": [
"string",
"null"
],
"default": null,
"description": "Branch, tag or commit. Omit for the default branch."
}
}
}Mark a version released — or, with released=false, take the mark back. A version is what a project's work goes out in — '2.4.0', 'Autumn'. It is the project's own: an issue carries versions of its own project only, any number of them ('fixVersions' on create_issue, update_issue and get_issue; JQL 'fixVersion = "2.4.0"', 'fixVersion in unreleasedVersions()'). Releasing runs the project's rules that wait for a version to ship (list_project_rules, trigger 'versionReleased') on the issues it carries, and tells the project's webhooks. It does NOT refuse a version that still carries unfinished issues: 'open' in the answer says how many, and 'openIssues' names up to twenty of them — check before you release, or say so to the person. With no 'releaseDate', today is written as the day it shipped — over a planned day, as the releases screen does. Releasing a version that is already released changes nothing and answers 'already': true. Project lead or admin only.
| Argument | Type | Description |
|---|---|---|
| version* | string | The version, by its name or its id from list_versions. |
| released | boolean | false takes the mark back. |
| projectKey* | string | Project key, e.g. 'ONB'. |
| releaseDate | string | null | The day it shipped, as YYYY-MM-DD. Left out, today. |
{
"type": "object",
"required": [
"projectKey",
"version"
],
"properties": {
"version": {
"type": "string",
"description": "The version, by its name or its id from list_versions."
},
"released": {
"type": "boolean",
"default": true,
"description": "false takes the mark back."
},
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'ONB'."
},
"releaseDate": {
"type": [
"string",
"null"
],
"default": null,
"description": "The day it shipped, as YYYY-MM-DD. Left out, today."
}
}
}Take a legal reference off an issue or a wiki page, by the 'id' list_legal_references gave it — as «Remove» in the block «Legal acts» does. A reference read from words that still stand in the text is kept as a «no» ('keptAsRefused' true, its state 'rejected'), so the next save does not put it back; one put by hand with no words of its own is deleted. Requires permission to edit the text it stands in.
| Argument | Type | Description |
|---|---|---|
| id* | integer | The reference's id, from list_legal_references. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "integer",
"description": "The reference's id, from list_legal_references."
}
}
}Undeclare a track. THE LABEL STAYS ON THE WORK: what goes is the declaration, so the issues keep their tag and declaring the track again brings exactly the same ones back. Nothing here can lose work — but the name, icon and place ARE lost, and the track's issues count as 'outside every track' afterwards. For a track that is merely finished, archive it instead: set_track with archived=true. Needs permission to write in the project.
| Argument | Type | Description |
|---|---|---|
| tag* | string | The track's tag, e.g. 'cherry-orchard'. |
| projectKey* | string | Project key, e.g. 'TH'. |
{
"type": "object",
"required": [
"projectKey",
"tag"
],
"properties": {
"tag": {
"type": "string",
"description": "The track's tag, e.g. 'cherry-orchard'."
},
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'TH'."
}
}
}Write to the person who opened a support request. The text becomes a comment the requester can read on their page and is emailed to them — unlike add_comment, which is always internal and never reaches the requester. Write it to the customer, in their language (get_support_request says which). Requires full write access to the support project. Answers with the comment id and whether the letter went ('emailed'; 'emailError' when it failed — the reply is kept either way).
| Argument | Type | Description |
|---|---|---|
| key* | string | Issue key of the request, e.g. 'SUPPORT-12'. |
| body* | string | What to tell the requester. Markdown is kept as written. |
{
"type": "object",
"required": [
"key",
"body"
],
"properties": {
"key": {
"type": "string",
"description": "Issue key of the request, e.g. 'SUPPORT-12'."
},
"body": {
"type": "string",
"description": "What to tell the requester. Markdown is kept as written."
}
}
}Record what one agent run cost an issue (local or mirrored/upstream): tokens by kind and machine time. Re-sending the same 'source' + 'externalId' updates that record instead of adding a second one, so a retry never doubles the spend. Omit a metric you did not measure — omitted is 'not reported', which is different from zero. Requires permission to edit the issue.
| Argument | Type | Description |
|---|---|---|
| key* | string | Issue key, e.g. 'UK-1'. |
| host | string | null | Which host it ran on. |
| note | string | null | Short note, e.g. the outcome. |
| agent | string | null | Which agent did the work, e.g. 'claude-code'. |
| model | string | null | Which model it ran on, e.g. 'claude-opus-5'. |
| runId | string | null | The run this record belongs to, when one run reports several records (different models or hosts). |
| source* | string | Who is reporting, e.g. 'bg-agent-api'. Idempotency is scoped to it. |
| costUsd | number | null |
Say how a computation an issue rests on stands — a GAP run, a batch of work units, a Lean build that ran somewhere else; the tracker runs nothing. Call it when the job is submitted, as it progresses and when it ends, with the same 'source' + 'externalId' every time: that is one job, updated, never a second. Send only what you know now — a field left out keeps what an earlier report said, so a progress report need not repeat the commit. 'state' is queued, running, done, failed, cancelled or lost (a job whose runner stopped answering); 'starting' reads as running. Report the commit it ran at and the repository's web address: that is what makes a [computer] result checkable, and the answer's 'commitUrl' links it where the host is GitHub or GitLab. 'result' is what came of it, in a sentence — Markdown and $…$ formulas work. Answers with 'created' and 'stateBefore'. A name already reported on another issue is refused with that issue's key. Requires permission to edit the issue.
| Argument | Type | Description |
|---|---|---|
| key* | string | The issue the computation answers, e.g. 'MATH-74'. |
| url | string | null | The job's own page on its runner (http/https). |
| state | string | null | queued, running, done, failed, cancelled or lost. |
| title | string | null | What it computes, in words, e.g. 'rank 5, order 2^11, stage C'. |
| commit | string | null | The commit it ran at. |
Say that something was deployed to one of a project's environments — the call a pipeline step makes. An environment is one of the places a project's work is put out to — 'dev', 'staging', 'prod' — in order; the LAST one is where finished work ends up. A deployment is a pipeline saying «this went out, there». Each issue it carried then says where it lies ('deployedTo' on get_issue), gets one history line per environment, and the project's rules with trigger 'deployed' run on it. Name the issues it carried in 'issues', or give 'from' and 'to' — two revisions — and the keys are read off the messages of the commits between them in the project's connected repository (a merge commit names its branch and merge request). Both may be given. The same 'id' for the same environment again changes nothing and answers 'repeated': true, so a step that runs twice is safe. 'version' also puts each of those issues in that version of the project. Answers with the issues it found, 'unknown' (keys you named that are no issue of this project), how many times a rule ran, and — on the project's last environment — 'unfinished': the issues that went out while not in a finished state. Needs permission to change issues in the project.
| Argument | Type | Description |
|---|---|---|
| id | string | null | Your own identifier for this deployment — a pipeline or job id. Left out, 'revision' stands in for it. |
| to | string | null | The end of that range. Left out, 'revision'. |
| url | string | null | A link to the pipeline, http or https. |
| from | string | null | The revision the previous deployment to this environment was at — the start of the range of commits to read keys from. |
| issues |
Read one credential's value, by the id from list_credentials. This is the same act as pressing reveal on the screen and carries the same cost: it is recorded against the token you are using, and the person who owns the secret can see that you read it. Call it when you are about to use the value, not to have it on hand. The answer is marked secret: do not copy it into a comment, a description, a merge request or a log.
| Argument | Type | Description |
|---|---|---|
| id* | integer | Credential id, from list_credentials. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "integer",
"description": "Credential id, from list_credentials."
}
}
}Find where a string appears in the code of the repositories connected to a project, with the file, the line number and the lines around it. Only repositories whose owners opened them to agents are searched, and the answer says when what it searched was out of date.
| Argument | Type | Description |
|---|---|---|
| path | string | null | Narrow to files whose path contains this, such as 'src/' or '.ts'. |
| repo | string | null | Which repository, as 'group/repo'. Omit to search every repository open here. |
| query* | string | What to look for, taken literally unless regexp is set. A space is a space, not two terms. |
| regexp | boolean | Read query as a regular expression. One with no literal in it may not finish in time. |
| caseSensitive | boolean | Match case. Off by default. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"path": {
"type": [
"string",
"null"
],
"default": null,
"description": "Narrow to files whose path contains this, such as 'src/' or '.ts'."
},
"repo": {
"type": [
"string",
"null"
],
"default": null,
"description": "Which repository, as 'group/repo'. Omit to search every repository open here."
},
"query": {
"type": "string",
"description": "What to look for, taken literally unless regexp is set. A space is a space, not two terms."
},
"regexp": {
"type": "boolean",
"default": false,
"description": "Read query as a regular expression. One with no literal in it may not finish in time."
},
"caseSensitive": {
"type": "boolean",
"default": false,
"description": "Match case. Off by default."
}
}
}Search the issues visible to this token, with a JQL query — the same JQL the Jira REST surface takes, read by the same parser. A query naming a field this tracker does not have is REFUSED and named, never run: it would match everything and read as an answer. Without `jql`, the shorthand arguments filter instead. Most recently created first unless the query says ORDER BY. Archived issues are left out unless the query names `archived`, and `archivedLeftOut` says how many matches that hid — an empty list with it is not "there are none".
| Argument | Type | Description |
|---|---|---|
| jql | string | null | A JQL query, e.g. `assignee = currentUser() AND statusCategory != Done ORDER BY updated DESC`. FIELDS: project, status, statuscategory, issuetype, type, priority, resolution, assignee, reporter, creator, key, issuekey, id, summary, description, sprint, parent, epic, labels, archived, agent, teamRole, fixVersion, fixVersions, legalRef, text, created, updated, duedate. OPERATORS: = != ~ !~ > >= < <=, IN (...), NOT IN (...), IS EMPTY, IS NOT EMPTY, combined with AND / OR, with parentheses around a sub-expression — `project = PM AND (status = Blocked OR priority = Highest)` — plus an optional trailing ORDER BY <field> [DESC]. `~` means contains (substring) and is the one to use for free text — `text` searches summary, description and comments. `>` `>=` `<` `<=` are for created/updated/duedate only, with absolute YYYY-MM-DD values: there are NO relative-date functions, so compute the date yourself. The functions are currentUser(), for assignee/reporter/creator, myTeamRoles(), for teamRole, and releasedVersions() / unreleasedVersions(), for fixVersion. `archived` is this tracker's own field: archived issues are left out unless the query mentions it. `epic` is this tracker's own too, and it is the wide one: `epic = PM-12` matches that epic AND the work under it — its children and their sub-tasks — which is how one asks for an epic's whole board in a single clause. `parent` is the narrow one: direct children only, and never the epic itself. `agent` is this tracker's own as well: `agent = product` is an issue an agent of that role has right now — working on it or waiting on its question — and `agent IS NOT EMPTY` is any agent; the assignee of such an issue is still the person it works for. `teamRole` is this tracker's own too: the project's team role an issue is for, by name — `teamRole = "Звуковик"` — and `teamRole in myTeamRoles()` is every issue for a role the caller holds, which with `assignee != currentUser()` is the work of their role that fell to somebody else. `fixVersion` is the project version an issue goes out in, by name or id — `fixVersion = "2.4.0"`; an issue may be in several, so `=` means «is in». `fixVersion in unreleasedVersions()` is what is still to ship, `fixVersion in releasedVersions(PM)` what one project has shipped, `fixVersion IS EMPTY` work in no version. `legalRef` is this tracker's own: the legal act an issue refers to, in its description or a comment — `legalRef = "32015L0849"` by the act's key, its address or its document id, `legalRef ~ "2015/849"` by words in its address or title, `legalRef IS NOT EMPTY` any act. Only in projects that keep legal references. Quote values containing spaces. Seeded values — status: Backlog, "To Do", "In Progress", "In Review", Blocked, Done; statusCategory: "To Do", "In Progress", Done; priority: Highest, High, Medium, Low, Lowest; type: Epic, Story, Task, Bug, "Sub-task". A project's own columns (PM-170) can be searched too, by name — Segment = AI — or as customfield_20003 / cf[20003]; list_project_fields names them. |
Search the laws, regulations and standards this installation's agents have already read off the official sites (EUR-Lex, legislation.gov.uk, Fedlex, FATF and others) — by words and by meaning. Not a web search. Each hit: the act's url, title, the day its text is as of, an offset into the text and a snippet around the match. Open where the company lets an agent role read laws.
| Argument | Type | Description |
|---|---|---|
| limit | integer | null | How many passages, at most 20. Default 8. |
| query* | string | What to look for, e.g. 'beneficial owner 25% threshold'. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": [
"integer",
"null"
],
"default": null,
"description": "How many passages, at most 20. Default 8."
},
"query": {
"type": "string",
"description": "What to look for, e.g. 'beneficial owner 25% threshold'."
}
}
}Search the Confluence of a project's own Jira site (see get_linked_confluence_page) with CQL, as its own search does — e.g. 'type = page AND text ~ "onboarding" ORDER BY lastmodified DESC', 'space = ENG AND title ~ "release"', 'parent = 123456'. Answers each page's confluence_page_id, confluence_url, title, space, an excerpt and when it changed; read one whole with get_linked_confluence_page. A query the site cannot read comes back with its reason. This tracker's own wiki is searched with search_wiki. Name the project by 'project', or an issue here by 'issue'. For the people who work in the project; at most 10 reads of the linked site a minute per person.
| Argument | Type | Description |
|---|---|---|
| cql* | string | The CQL query, as that Confluence reads it. |
| issue | string | null | An issue here, e.g. 'PM-12', whose project's site is searched. |
| limit | integer | null | How many pages, at most 30. Default 10. |
| project | string | null | Project key here, e.g. 'PM'. Or give 'issue'. |
{
"type": "object",
"required": [
"cql"
],
"properties": {
"cql": {
"type": "string",
"description": "The CQL query, as that Confluence reads it."
},
"issue": {
"type": [
"string",
"null"
],
"default": null,
"description": "An issue here, e.g. 'PM-12', whose project's site is searched."
},
"limit": {
"type": [
"integer",
"null"
],
"default": null,
"description": "How many pages, at most 30. Default 10."
},
"project": {
"type": [
"string",
"null"
],
"default": null,
"description": "Project key here, e.g. 'PM'. Or give 'issue'."
}
}
}Search a project's own Jira (see get_linked_jira_issue) with JQL, as its own search does — e.g. 'project = ACME AND status != Done ORDER BY updated DESC', 'text ~ "login"'; currentUser() is the project token's owner, not you. Answers each issue's jira_key, jira_url, summary, type, status, priority, assignee and when it changed; read one whole with get_linked_jira_issue. A query the site cannot read comes back with its reason. This is the other site's JQL; this tracker's own issues are searched with search_issues. Name the project by 'project', or an issue here by 'issue'. For the people who work in the project; at most 10 reads of the linked Jira a minute per person.
| Argument | Type | Description |
|---|---|---|
| jql* | string | The JQL query, as that Jira reads it. |
| issue | string | null | An issue here, e.g. 'PM-12', whose project's Jira is searched. |
| limit | integer | null | How many issues, at most 30. Default 10. |
| project | string | null | Project key here, e.g. 'PM'. Or give 'issue'. |
{
"type": "object",
"required": [
"jql"
],
"properties": {
"jql": {
"type": "string",
"description": "The JQL query, as that Jira reads it."
},
"issue": {
"type": [
"string",
"null"
],
"default": null,
"description": "An issue here, e.g. 'PM-12', whose project's Jira is searched."
},
"limit": {
"type": [
"integer",
"null"
],
"default": null,
"description": "How many issues, at most 30. Default 10."
},
"project": {
"type": [
"string",
"null"
],
"default": null,
"description": "Project key here, e.g. 'PM'. Or give 'issue'."
}
}
}Search wiki pages visible to this token by free text: by words in any form and by meaning (where the server has its embedding model), and literally — the title, the body, the labels written on an attached SVG diagram. Best match first; `match` says what found each page. `files` are PDF and Word files attached to pages, found by the words inside them. Optionally restrict to one space key. Without `text`, the pages most recently updated first.
| Argument | Type | Description |
|---|---|---|
| text | string | null | What to look for, in your own words. |
| label | string | null | Only pages carrying this label (list_wiki_labels names a space's labels). With `text`, the labelled pages that say it; without, all of them, most recently updated first. |
| limit | integer | Max pages to return (default 25, max 100). |
| spaceKey | string | null | Restrict to this space key (e.g. 'PM'). |
{
"type": "object",
"properties": {
"text": {
"type": [
"string",
"null"
],
"default": null,
"description": "What to look for, in your own words."
},
"label": {
"type": [
"string",
"null"
],
"default": null,
"description": "Only pages carrying this label (list_wiki_labels names a space's labels). With `text`, the labelled pages that say it; without, all of them, most recently updated first."
},
"limit": {
"type": "integer",
"default": 25,
"description": "Max pages to return (default 25, max 100)."
},
"spaceKey": {
"type": [
"string",
"null"
],
"default": null,
"description": "Restrict to this space key (e.g. 'PM')."
}
}
}Add a claim to a project's register, or change one — its kind, label, number in the paper, title, statement or bases. A claim is named by 'id', or by 'project' and 'label': one that does not exist yet is created (with 'statement'; 'status' says how far it is proved from the start, 'open' if left out, and 'reason' on what ground). An existing claim's status is NOT changed here — use set_claim_status, so the journal says why. A field left out keeps its value; 'bases' given replaces the whole list. Write the statement in Markdown with $…$ formulas. The label is the paper's \label: a letter, then letters, digits and ':', '.', '_', '-' — once per project, case aside; 'newLabel' renames it. Members of the project who may write only.
| Argument | Type | Description |
|---|---|---|
| id | integer | null | The claim to change, as list_claims returned it. Or name it by 'project' and 'label'. |
| kind | string | null | theorem, lemma, proposition, corollary, conjecture or question. A new claim is a theorem unless said. |
| bases | string | null | What it rests on, as a JSON array replacing the list: [{"kind":"page","page":477,"note":"§3"},{"kind":"computation","ref":"kimmy/gap/m74r5u"},{"kind":"lean","ref":"D5.rank_five"},{"kind":"source","ref":"Gupta 1990, Thm 2"}]. A page is one you may open, by its id; a computation by the name a [comp:…] cites — a runner's job, or a page's saved cell 'wl:477/…/2'. |
| label | string | null | The claim's label, e.g. 'thm:d5-rank5'. |
| title | string | null | A short name, e.g. 'Rank 5 is decided'; empty to clear. |
Move a claim on the scale — open, paper, computer, lean, refuted, retracted — with the ground it moved on in 'reason' (a merge, a computation that finished, a reviewer's word, the issue it was decided in). The journal keeps the line: who, when, from what to what and why; this is the one place a status changes, so the paper and the site that read it agree. Name the claim by 'id', or by 'project' and 'label'. The same status again changes nothing. Members of the project who may write only.
| Argument | Type | Description |
|---|---|---|
| id | integer | null | The claim, as list_claims returned it. |
| label | string | null | The claim's label, with 'project'. |
| reason | string | null | On what ground — at most 1000 characters. |
| status* | string | open, paper, computer, lean, refuted or retracted. |
| project | string | null | The project key, with 'label'. |
{
"type": "object",
"required": [
"status"
],
"properties": {
"id": {
"type": [
"integer",
"null"
],
"default": null,
"description": "The claim, as list_claims returned it."
},
"label": {
"type": [
"string",
"null"
],
"default": null,
"description": "The claim's label, with 'project'."
},
"reason": {
"type": [
"string",
"null"
],
"default": null,
"description": "On what ground — at most 1000 characters."
},
"status": {
"type": "string",
"description": "open, paper, computer, lean, refuted or retracted."
},
"project": {
"type": [
"string",
"null"
],
"default": null,
"description": "The project key, with 'label'."
}
}
}Make a project's environments exactly this list, in this order — the last is where finished work ends up. An environment is one of the places a project's work is put out to — 'dev', 'staging', 'prod' — in order; the LAST one is where finished work ends up. A deployment is a pipeline saying «this went out, there». Each issue it carried then says where it lies ('deployedTo' on get_issue), gets one history line per environment, and the project's rules with trigger 'deployed' run on it. A name the project already has is kept as it is, with what was deployed there; a name it does not have is added; and an environment LEFT OUT is removed together with the record of what was deployed to it and any rule waiting for it. So to rename one, add the new name and tell the person — there is no rename here. Project lead or admin only.
| Argument | Type | Description |
|---|---|---|
| names* | string | The environments in order, comma-separated: 'dev,staging,prod'. Each is one word of letters, digits, dots, dashes and underscores. An empty string removes them all. |
| projectKey* | string | Project key, e.g. 'ONB'. |
{
"type": "object",
"required": [
"projectKey",
"names"
],
"properties": {
"names": {
"type": "string",
"description": "The environments in order, comma-separated: 'dev,staging,prod'. Each is one word of letters, digits, dots, dashes and underscores. An empty string removes them all."
},
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'ONB'."
}
}
}Fill in a project's own columns on one issue, by their NAMES: 'Segment=AI; Country=Poland; Started=2026-08-01', or a JSON object. A country column takes the country's name or its two-letter code. A link column takes issue keys and wiki pages (a page's address or page:471), comma-separated, and REPLACES the records you can see with them — records you cannot open stay. An empty value clears the field, which is not the same as an empty one. A value that does not fit the field's kind — an option nobody offered, a date that is not one, a country that is neither — refuses the WHOLE call rather than writing part of it.
| Argument | Type | Description |
|---|---|---|
| key* | string | Issue key, e.g. 'CRM-1'. |
| values* | string | Field names to values, as 'Segment=AI; Country=Poland' or a JSON object. List values are given by option name, people by username, dates as 2026-08-21. |
{
"type": "object",
"required": [
"key",
"values"
],
"properties": {
"key": {
"type": "string",
"description": "Issue key, e.g. 'CRM-1'."
},
"values": {
"type": "string",
"description": "Field names to values, as 'Segment=AI; Country=Poland' or a JSON object. List values are given by option name, people by username, dates as 2026-08-21."
}
}
}Add a recurring issue to a project, or change the one named by 'id' — the WHOLE of it as you write it here: what you leave out of a change is cleared, not kept. From 'nextDay' on, every 'every' weeks or months, the project files this issue at nine in the morning on YOUR clock and in YOUR name: with your access, through the same rules, notifications and watchers as an issue you filed yourself. In 'summary', {date}, {month}, {quarter} and {year} are read off the day it is filed ('VAT return {quarter}' → 'VAT return Q4 2026'). If the one filed before is still open, the new one is filed all the same and linked to it. A day missed — a paused project — files once when it can, never a backlog. Refused, with the reason, if the issue could not be filed as described today (an unknown type, an assignee nobody has). The project's lead, the company's owner or an admin only.
| Argument | Type | Description |
|---|---|---|
| id | integer | null | The schedule to change, as list_issue_schedules returned it. Leave out to add one. |
| type | string | null | Issue type name, one of the project's. 'Task' where nothing is said. |
| unit | string | 'month' (the default) or 'week'. |
| every | integer | Every how many units: 1 (the default), 3 for a quarter, 12 for a year. Up to 52 weeks or 24 months. |
| labels | string | null | Labels as 'a,b'. |
| enabled | boolean |
Switch a project's Jira connection on or off, keeping its token — and, with 'confluence', whether the same site's Confluence is read too. Off, nothing reads that Jira or writes to it — the issue screen, the agents, the status sync — and issues keep their keys there. Switched on, the held token is asked of the site first and refused with the site's reason if it no longer opens it. Connecting a Jira, or giving a new token — Confluence's own included — is done on the board's Jira sheet (get_jira_connection's 'url'), never here. For whoever administers the project.
| Argument | Type | Description |
|---|---|---|
| enabled | boolean | null | true to switch the connection on, false to switch it off. Leave out to keep it as it is. |
| confluence | boolean | null | true to read the same site's Confluence too, false to stop. Leave out to keep it as it is. |
| projectKey* | string | Project key, e.g. 'PM'. |
{
"type": "object",
"required": [
"projectKey"
],
"properties": {
"enabled": {
"type": [
"boolean",
"null"
],
"default": null,
"description": "true to switch the connection on, false to switch it off. Leave out to keep it as it is."
},
"confluence": {
"type": [
"boolean",
"null"
],
"default": null,
"description": "true to read the same site's Confluence too, false to stop. Leave out to keep it as it is."
},
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'PM'."
}
}
}Say which issue of the project's own Jira this issue is: its key (ACME-123) or its link on the site. The key is asked of that Jira first — one it does not have, or the token cannot see, is refused. An empty 'jiraKey' removes the link. One Jira issue per issue; the change is a line in the issue's history. Needs a Jira connected to the project and permission to edit the issue.
| Argument | Type | Description |
|---|---|---|
| key* | string | Issue key here, e.g. 'PM-12'. |
| jiraKey | string | null | The Jira issue: 'ACME-123' or 'https://acme.atlassian.net/browse/ACME-123'. Empty removes the link. |
{
"type": "object",
"required": [
"key"
],
"properties": {
"key": {
"type": "string",
"description": "Issue key here, e.g. 'PM-12'."
},
"jiraKey": {
"type": [
"string",
"null"
],
"default": null,
"description": "The Jira issue: 'ACME-123' or 'https://acme.atlassian.net/browse/ACME-123'. Empty removes the link."
}
}
}Set how a project keeps its statuses in step with its own Jira: the direction and the pairs of statuses. Either left out keeps what is there. Moves on either side go through that side's own workflow and are never forced: a move one refuses is left undone and said on the issue (get_jira_link's 'sync'). A move made here because Jira moved is made in YOUR name from now on — whoever saves this is whom it acts for — and Jira's history names the project token's owner. Switching it on moves nothing by itself: the next change on either side does. Both sides moved before the two were compared: neither is moved, and the issue says so. The site's webhook (quicker than the five-minute poll) is set up on the screen, since its address is a secret. For whoever administers the project; needs the connection switched on, with its token.
| Argument | Type | Description |
|---|---|---|
| pairs | string | null | The pairs, here=there, separated by ';' or new lines: 'To Do=To Do; In Progress=In Progress; Done=Done'. A status may appear in several pairs; the first one in order is where a move goes. An empty string clears them. Omit to keep. |
| direction | string | null | 'off', 'both', 'from_jira' or 'to_jira'. Omit to keep. |
| projectKey* | string | Project key, e.g. 'PM'. |
{
"type": "object",
"required": [
"projectKey"
],
"properties": {
"pairs": {
"type": [
"string",
"null"
],
"default": null,
"description": "The pairs, here=there, separated by ';' or new lines: 'To Do=To Do; In Progress=In Progress; Done=Done'. A status may appear in several pairs; the first one in order is where a move goes. An empty string clears them. Omit to keep."
},
"direction": {
"type": [
"string",
"null"
],
"default": null,
"description": "'off', 'both', 'from_jira' or 'to_jira'. Omit to keep."
},
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'PM'."
}
}
}Add a person to a project's register, or change the one named by 'id': add spellings and facts, remove them, change the name shown or the note, and confirm or reject a proposed person with 'state'. A spelling or fact given with 'source' (the page, issue or comment you READ it in: 'page:471', 'PM-12', 'comment:88', 'wikicomment:7' or an address) and 'quote' (the source's own words that hold it) is checked now, and refused if the quote is not there or does not hold it. One without a source or quote is written UNCHECKED and the answer's 'unchecked' lists it — so write a name from memory only when the person asked for it, and never invent initials. A spelling the person already has is written over with the source you give. What you leave out stays. A person written here is confirmed at once. Members of the project who may write only. Only where the company's plan includes AI.
| Argument | Type | Description |
|---|---|---|
| id | integer | null | The person to change, as list_persons or find_person returned them. Leave out to add one. |
| name | string | null | The name shown first — one of the person's spellings, e.g. 'Гупта'; a new one becomes a spelling. |
| note | string | null | Why this person is here, in a line — at most 600 characters. |
| facts | string | null | Facts to add, as a JSON array: [{"kind":"born","value":"1938","source":"page:471","quote":"…(1938–2019)…"}]. 'kind' is born, died (a year or a date), wikidata (Q…), mathGenealogy, mrAuthor (digits) or orcid. |
| state | string | null |
Add a column to a project, or edit the one that already has this name. Keyed by name rather than by id: 'make sure there is a Segment field with these options' is the request, and a name is what you just read. A field's KIND cannot be changed once it exists. Project lead or admin only.
| Argument | Type | Description |
|---|---|---|
| icon | string | null | The glyph that mark wears, from the palette list_project_fields returns. Not for a country field: that one marks a card with the flag of the country the issue holds, so passing an icon is refused rather than ignored. |
| kind | string | null | What it holds: 'text', 'number', 'date' (a day), 'datetime' (a day and a time, written like 2026-10-01T19:30+03:00), 'user', 'select' (a list), 'country' (a country, written as its name or its two-letter code and shown with a flag) or 'link' (issues and wiki pages, one or several — what a row is confirmed by). Required when creating; ignored when the field already exists, since a kind cannot change. |
| name* | string | Field name, e.g. 'Segment'. An existing field with this name is edited rather than duplicated. |
| newName | string | null | Rename the field to this. Leave out to keep the name. |
| options | string | null | For a list: its options, as 'AI:green, Skins:orange, GameCards' or a JSON array of {name, color}. A colour is optional and must be one of: orange, amber, red, pink, purple, blue, teal, green. Options left out are REMOVED — send the whole set. |
Add an issue type of this project's own — e.g. 'Показ' — or rename one it already has. Keyed by name. The shared types (Epic, Story, Task, Bug, Sub-task, Client) are every project's and cannot be renamed here. Another project never sees this type. Project lead or admin only.
| Argument | Type | Description |
|---|---|---|
| name* | string | The type's name. An own type of this project with this name is renamed (with newName) rather than duplicated. |
| newName | string | null | Rename the type to this. Leave out to add or keep it. |
| subtask | boolean | null | When adding: true for a sub-task type, whose issues hang off a parent. Cannot be changed afterwards. |
| projectKey* | string | Project key, e.g. 'TH'. |
{
"type": "object",
"required": [
"projectKey",
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The type's name. An own type of this project with this name is renamed (with newName) rather than duplicated."
},
"newName": {
"type": [
"string",
"null"
],
"default": null,
"description": "Rename the type to this. Leave out to add or keep it."
},
"subtask": {
"type": [
"boolean",
"null"
],
"default": null,
"description": "When adding: true for a sub-task type, whose issues hang off a parent. Cannot be changed afterwards."
},
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'TH'."
}
}
}Make an existing project a subproject of another, or take it back out with an empty parentKey. This is about ACCESS, not about names or issues: everyone who may reach the parent may reach the subproject too, in the role they hold there. Nothing is renamed, no issue moves, and the keys stay ordinary keys. Attaching needs an admin or somebody who leads BOTH projects, since neither can be volunteered by whoever leads the other; detaching needs a lead of either, since it only takes access away. One level: a subproject cannot have subprojects.
| Argument | Type | Description |
|---|---|---|
| parentKey | string | null | Key of the project it becomes a subproject of, e.g. 'KYC'. Leave it out (or empty) to detach it and leave it a project of its own. |
| projectKey* | string | Key of the project to move, e.g. 'KYCB2B'. |
{
"type": "object",
"required": [
"projectKey"
],
"properties": {
"parentKey": {
"type": [
"string",
"null"
],
"default": null,
"description": "Key of the project it becomes a subproject of, e.g. 'KYC'. Leave it out (or empty) to detach it and leave it a project of its own."
},
"projectKey": {
"type": "string",
"description": "Key of the project to move, e.g. 'KYCB2B'."
}
}
}Open a project to be READ by anybody — nobody signed in, or somebody who does not work in the company — or close it again. Opened, its board, issues, comments, attached files and wiki can be linked to from anywhere; nobody outside can write in it, people's email addresses are never shown, and the company's other projects and the project's own subprojects stay closed (a subproject has its own switch). Closing takes effect at once. Only an open source project may be opened — one created or configured with a public repository (create_project's openSourceRepo, connect_repository with openSource, or the project's repositories screen) — and it is closed by itself if that repository stops being public. Only the project's lead (or its parent's, or an admin) may do either, and both are written to the company's journal. Confirm with the person before opening: everything already in the project becomes public.
| Argument | Type | Description |
|---|---|---|
| indexed | boolean | null | Optional, for a public project: true lets search engines index it (its issues and pages go into the sitemap), false asks them not to. Off until somebody turns it on; leave it out to keep it as it is. |
| isPublic* | boolean | true to open it to be read by anybody, false to close it. |
| projectKey* | string | Key of the project, e.g. 'LIB'. |
{
"type": "object",
"required": [
"projectKey",
"isPublic"
],
"properties": {
"indexed": {
"type": [
"boolean",
"null"
],
"default": null,
"description": "Optional, for a public project: true lets search engines index it (its issues and pages go into the sitemap), false asks them not to. Off until somebody turns it on; leave it out to keep it as it is."
},
"isPublic": {
"type": "boolean",
"description": "true to open it to be read by anybody, false to close it."
},
"projectKey": {
"type": "string",
"description": "Key of the project, e.g. 'LIB'."
}
}
}Mark a repository already connected to a project as the project's open source repository, or take the mark off. Marking asks its host, without a token, whether anybody can read it and under which licence, and is refused for a private one. Taking the mark off the last marked repository of a public project closes the project to readers outside at once, as the screen does — confirm with the person first. Only the project's lead, a board administrator or a company admin may; both are written to the company's journal.
| Argument | Type | Description |
|---|---|---|
| openSource* | boolean | true to mark it open source, false to take the mark off. |
| projectKey* | string | Key of the project, e.g. 'LIB'. |
| repository* | string | The repository: its id from list_repositories, or its path, e.g. 'owner/repo'. |
{
"type": "object",
"required": [
"projectKey",
"repository",
"openSource"
],
"properties": {
"openSource": {
"type": "boolean",
"description": "true to mark it open source, false to take the mark off."
},
"projectKey": {
"type": "string",
"description": "Key of the project, e.g. 'LIB'."
},
"repository": {
"type": "string",
"description": "The repository: its id from list_repositories, or its path, e.g. 'owner/repo'."
}
}
}Add a term to a project, or change the one named by 'id' — and confirm or reject a proposed one with 'state'. On a change, what you leave out stays as it is. A term written here is confirmed at once. 'variants' REPLACES the other spellings: send all of them — for a word that declines, the forms running text uses ('размерной подгруппы', 'размерных подгрупп'), since a text is matched by these and not by a stemmer. 'source' is the wiki page or issue that defines it — 'page:471', 'PM-12' or its address — and must be one you can open; an empty string removes it. Members of the project who may write only. Only where the company's plan includes AI.
| Argument | Type | Description |
|---|---|---|
| id | integer | null | The term to change, as list_terms returned it. Leave out to add one. |
| kind | string | null | What sort of thing it is, in the project's words — 'условие', 'спецификация', 'понятие'. |
| name | string | null | The term as written, e.g. 'PW06' or 'Размерная подгруппа'. |
| place | string | null | The heading on the source it stands under. |
| state | string | null | 'confirmed' or 'rejected' — to decide a proposed term. |
| source | string | null | The page or issue that defines it: 'page:471', 'PM-12' or its address. '' removes it. |
| project |
Declare a track on a project, or edit the one that already has this tag. The tag is the LABEL issues carry to join it ('cherry-orchard'), so it cannot contain a space — labels are stored space-separated. The name is what a reader sees ('The Cherry Orchard'); leave it out and the tag speaks for itself. Declaring a track writes nothing to any issue: the ones already carrying the label are in it at once. Needs permission to write in the project.
| Argument | Type | Description |
|---|---|---|
| tag* | string | The label that puts an issue in this track, e.g. 'cherry-orchard'. No spaces. An existing track with this tag is edited rather than duplicated; matched exactly, so 'Hamlet' and 'hamlet' are two tags, as they are two labels. |
| icon | string | null | One or two emoji shown BESIDE the name, never instead of it. Leave it out to keep what is there; send an empty string to take it off. Anything that is not an emoji is refused rather than ignored. |
| name | string | null | What a reader sees, e.g. 'The Cherry Orchard'. Leave it out to keep what is there; send an empty string to drop it and let the tag speak. |
| newTag | string | null | Rename the tag to this. The label on existing issues is NOT rewritten, so work in the old tag leaves the track — rename only when the issues are being relabelled too. |
| archived | boolean | null | true takes the track off the row above the board WITHOUT undeclaring it — a play that has been staged: its name, icon, place and tag are kept, its issues stay in it (they do not become 'outside every track'), and links to it keep working. false puts it back in the row. Leave it out to keep what is there. Prefer this to remove_track for a track that is finished. |
Say whom a wiki page is REQUIRED READING for, and tell them. The three arguments together are the WHOLE list and replace the one before — read it with get_wiki_page_reading first and pass back what should stay. 'users' is usernames or e-mails as 'a,b' (each must be able to read the page); 'members: true' is everybody on the page's project, whoever they are on the day; 'teamRoles' is the project's team roles by name as 'a,b'. Everybody on the list who has not been told about the edition to read gets a notification that opens the page, and one reminder two working days later if they have not marked it. An empty list switches it off; marks already made are kept. With 'askAgain: true' the list is left as it is and everybody who has NOT read the edition is told once more — and on a page with no approved edition, the edition to read becomes the one the page is at now. The project's lead, the company's owner or an admin only.
| Argument | Type | Description |
|---|---|---|
| id* | integer | Page id. |
| users | string | null | Usernames or e-mails, as 'a,b'. Take them from list_users. |
| members | boolean | true for everybody on the page's project. |
| askAgain | boolean | true to leave the list alone and ask again everybody who has not read the edition. |
| teamRoles | string | null | The project's team roles by name, as 'a,b'. |
How a project's website was visited, from the service that counts it: Google Search Console (clicks, impressions, ctr, position by query, page, country, device or date), Vercel Web Analytics (visitors and page views by page, referrer, source, country, device or date) or Google Analytics 4 (sessions, active users, page views, engaged sessions and key events by source, channel, landing page, country, device or date). Only connections opened to agents are read. The totals are the site's — rows of a breakdown do not add up to them — and the answer's period and notes say what was actually counted.
| Argument | Type | Description |
|---|---|---|
| by | string | null | Break down by: query, page, country, device, date, referrer, source or channel. Omit for totals only. |
| to | string | null | Last day, YYYY-MM-DD. Omit for the last day counted. |
| from | string | null | First day, YYYY-MM-DD. Omit for a week before 'to'. |
| page | string | null | Only pages whose address contains this (Search Console), whose path starts with it (Vercel), or sessions whose landing page contains it (Google Analytics). |
| site | string | null | Which site, e.g. 'sc-domain:example.com', a Vercel project or 'properties/123456789'. Omit when only one is open. |
| limit | integer | null | How many rows, at most 50. Default 10. |
Give a project a ready-made setup (see list_project_presets) — only what it does not already have: a column, a type, a recurring issue or a page of the same name is left as it is, so taking it twice adds nothing. The workflow is taken only by a project with no issues whose states are still the ones a new project starts with; otherwise 'workflow' answers 'issues' or 'own' and the project's own workflow stays (the workflow screen offers the same one, and asks where each state's work goes). The recurring issues come SWITCHED OFF, each with the day it would first be filed on: read them with list_issue_schedules and switch on the ones meant with set_issue_schedule. It also switches legal references on for the project and, where the project told nobody of due days ahead, sets that to 14, 7 and 1 days. With 'samples', five sample requirements and three sample pages about an invented company are filed as you, all labelled 'sample' so they are found and removed together. Words are in 'language' — 'en' or 'ru'. The project's lead, the company's owner or an admin only.
| Argument | Type | Description |
|---|---|---|
| preset | string | Which one: 'requirements'. |
| project* | string | The project key, e.g. PM. |
| samples | boolean | true to file the sample requirements and pages too. Default false. |
| language | string | The language the names are written in: 'en' (the default) or 'ru'. They are the project's own afterwards and can be renamed. |
{
"type": "object",
"required": [
"project"
],
"properties": {
"preset": {
"type": "string",
"default": "requirements",
"description": "Which one: 'requirements'."
},
"project": {
"type": "string",
"description": "The project key, e.g. PM."
},
"samples": {
"type": "boolean",
"default": false,
"description": "true to file the sample requirements and pages too. Default false."
},
"language": {
"type": "string",
"default": "en",
"description": "The language the names are written in: 'en' (the default) or 'ru'. They are the project's own afterwards and can be renamed."
}
}
}What a project's terms rest on (PM-1053): its confirmed terms and its parent projects', the links between them, and 'order' — the terms in the order to read them, each after what it rests on, the ones resting on nothing first — with 'circles', terms whose definitions rest on each other (worth putting right). A link is 'dependsOn' (the definition rests on the other term), 'specialCaseOf' or 'oppositeOf'; its 'state' is 'confirmed' or, to a member who may write, 'proposed' — offered because the definition names the other term, waiting for a person (link_terms decides it). The order rests on confirmed links only. With 'term', only what stands within 'depth' links of it — the way to look at a large dictionary. Only terms whose source you may open. Only where the company's plan includes AI.
| Argument | Type | Description |
|---|---|---|
| term | string | null | A term — its id, or a spelling of it — to see only what is around it. Leave out for the whole project. |
| depth | integer | How many links away from 'term', 1 to 3. Default 2. |
| project* | string | The project key, e.g. MATH. |
{
"type": "object",
"required": [
"project"
],
"properties": {
"term": {
"type": [
"string",
"null"
],
"default": null,
"description": "A term — its id, or a spelling of it — to see only what is around it. Leave out for the whole project."
},
"depth": {
"type": "integer",
"default": 2,
"description": "How many links away from 'term', 1 to 3. Default 2."
},
"project": {
"type": "string",
"description": "The project key, e.g. MATH."
}
}
}Remove a link between two issues: name both ends (and, when more than one link joins them, the phrase — 'blocks', 'relates to'), or give the 'linkId' get_issue returned. Ambiguity is refused rather than guessed: two issues joined twice and no phrase given comes back with the links listed. Requires permission to edit BOTH issues. The issues themselves are untouched.
| Argument | Type | Description |
|---|---|---|
| to | string | null | The other end, e.g. 'PM-417'. Not needed when 'linkId' is given. |
| from | string | null | One end, e.g. 'PM-419'. Not needed when 'linkId' is given. |
| type | string | null | Which link, when the two issues are joined by more than one: the phrase as get_issue says it ('blocks', 'is blocked by', 'relates to'). |
| linkId | integer | null | The link's id, as get_issue returns it in 'links'. |
{
"type": "object",
"properties": {
"to": {
"type": [
"string",
"null"
],
"default": null,
"description": "The other end, e.g. 'PM-417'. Not needed when 'linkId' is given."
},
"from": {
"type": [
"string",
"null"
],
"default": null,
"description": "One end, e.g. 'PM-419'. Not needed when 'linkId' is given."
},
"type": {
"type": [
"string",
"null"
],
"default": null,
"description": "Which link, when the two issues are joined by more than one: the phrase as get_issue says it ('blocks', 'is blocked by', 'relates to')."
},
"linkId": {
"type": [
"integer",
"null"
],
"default": null,
"description": "The link's id, as get_issue returns it in 'links'."
}
}
}Remove the link between an issue and a wiki page. Identify the page by 'pageId', or by 'spaceKey' + 'title'. Requires permission to edit the issue. The page itself is not touched.
| Argument | Type | Description |
|---|---|---|
| title | string | null | Exact page title, when identifying the page by title. |
| pageId | integer | null | Page id (as returned by search_wiki). |
| issueKey* | string | Issue key, e.g. 'UK-1'. |
| spaceKey | string | null | Space key, when identifying the page by title. |
{
"type": "object",
"required": [
"issueKey"
],
"properties": {
"title": {
"type": [
"string",
"null"
],
"default": null,
"description": "Exact page title, when identifying the page by title."
},
"pageId": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Page id (as returned by search_wiki)."
},
"issueKey": {
"type": "string",
"description": "Issue key, e.g. 'UK-1'."
},
"spaceKey": {
"type": [
"string",
"null"
],
"default": null,
"description": "Space key, when identifying the page by title."
}
}
}Undo merge_persons: the person merged is a person of their own again, with every spelling and fact they had. Name them by their own id — 'merged' in list_persons lists them under the person they were merged into. Ask the person first. Both journals keep a line. Members of the project who may write only. Only where the company's plan includes AI.
| Argument | Type | Description |
|---|---|---|
| id* | integer | The person merged into another, as 'merged' lists them. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "integer",
"description": "The person merged into another, as 'merged' lists them."
}
}
}Edit a comment on an issue: pass 'body' to replace the whole of it, or 'edits' to change part of it — exact find-and-replace against the comment as get_comments hands it back, each 'oldText' occurring exactly once. One body axis per call. With 'edits' the answer says where each one landed rather than giving the comment back, so correcting one number in a long comment costs neither a resend nor a re-read. Nothing here takes a version and none is needed: an 'oldText' is matched against the comment as it stands now, so an edit whose text somebody has since rewritten is refused rather than applied over their words. The author may edit their own comment; anyone with full write access in the project may edit any. Answers with 'notified' — and note that this is only the people the *edit* newly reaches: names already present in the old text are not notified again, and the comment is not re-announced to watchers.
| Argument | Type | Description |
|---|---|---|
| key* | string | Issue key the comment is on, e.g. 'UK-1'. |
| body | string | null | The new body, replacing the old one entirely. Markdown is kept as written, and carries $…$ / $$…$$ LaTeX formulas and [~username] mentions. |
| edits | array | null | Exact replacements in the comment, changing part of it in place. Matched against the body as get_comments returns it — stored as written, so what you read is what an 'oldText' has to equal, whitespace and line breaks included. Every edit is looked for in that text, not in what the edits before it produced; if any one does not fit, none is applied. |
| commentId* | integer |
Change a credential, by the id from list_credentials: its name, its value, or who may read it — each on its own, and only what you pass is touched, so taking somebody off the list never needs the value. 'readers' REPLACES the list; noReaders: true empties it. Only the person who attached it and the project's lead may change one: being shown a secret is not being given it to pass on. The answer never carries the value. Do not repeat the value in any text you write — a comment, a description, a merge request, a log.
| Argument | Type | Description |
|---|---|---|
| id* | integer | Credential id, from list_credentials. |
| name | string | null | A new name. Leave it out to keep the name. |
| value | string | null | A new value. Leave it out to keep the value. |
| readers | string | null | Who else may read it from now on, comma-separated usernames or emails. Replaces the whole list. Leave it out to keep the list. |
| noReaders | boolean | True to leave nobody on the list — the author and the project's lead still read it. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "integer",
"description": "Credential id, from list_credentials."
},
"name": {
"type": [
"string",
"null"
],
"default": null,
"description": "A new name. Leave it out to keep the name."
},
"value": {
"type": [
"string",
"null"
],
"default": null,
"description": "A new value. Leave it out to keep the value."
},
"readers": {
"type": [
"string",
"null"
],
"default": null,
"description": "Who else may read it from now on, comma-separated usernames or emails. Replaces the whole list. Leave it out to keep the list."
},
"noReaders": {
"type": "boolean",
"default": false,
"description": "True to leave nobody on the list — the author and the project's lead still read it."
}
}
}Update an issue: any of summary, description, type, assignee, priority, labels, dueDate, parentKey, fixVersions, or status (which performs the transition, and fires the project's rules — a rule may append a checklist to the description, in which case 'description' is listed in 'changed'). Only the fields you pass are changed. A project's workflow may put conditions on a move — that only certain people may make it, or that it must set certain fields — and a refusal names the condition and, where it is about who you are, lists the states you CAN reach. Fields a move requires must be sent in this same call, with 'resolution' and 'fields': a value set by an earlier call does not satisfy the condition. Answers with 'notified' (who this actually reaches: the people mentioned, and for an assignment the new assignee as 'assignee' and the one taken off as 'unassigned' in 'as' — never yourself) 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.
| Argument | Type | Description |
|---|---|---|
| key* | string | Issue key, e.g. 'UK-1'. |
| type | string | null | New issue type name, e.g. 'Task', 'Bug', 'Story', 'Epic'. |
| fields | string | null | The project's own columns to fill in with this update, by their NAMES: 'Segment=AI; Country=Poland', or a JSON object. Same shape as set_issue_fields — this exists here because a move a workflow conditions on a column has to set it in the same call. |
| labels | string | null | Labels to set, space or comma separated. Replaces the existing set. |
Change a project rule, by its id from list_project_rules. Only what you pass changes: pass just 'enabled' to switch a rule on or off, or any of the others to edit it. An empty string for 'type' or 'label' removes that condition; an empty 'fromStatus' or 'branch' removes that one too; for a duty, an empty 'status', 'agentActions', 'agentFields' or 'doneStatus' clears that one. A rule's action cannot change. 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. 'trigger' says WHEN: 'entered' (the default — the issue entered 'status'), 'versionReleased' (a version it goes out in was marked released), 'subtasksDone' (every issue under it is finished — the rule acts on the PARENT) or 'subtaskStarted' (an issue under it was taken into work — the parent again); or what the project's repository said through its webhook: 'branchCreated' (a branch naming the issue was made), 'mrOpened', 'mrMerged' or 'mrClosed' (a merge request — a pull request on GitHub — naming the issue was opened, merged, or closed without merging). An issue is named by its key in the branch, the title or the description, and only this project's issues are touched. 'branch' narrows the three merge-request events to a request going INTO that branch, e.g. 'main'. Nobody is behind a webhook, so such a rule acts as whoever last saved or switched it on, whatever its action. 'deployed' fires when a pipeline reports that the issue went out to an environment (report_deployment); 'environment' narrows it to one of the project's environments by name, e.g. 'staging'. 'actChanged' fires on the issues that cite a legal act when its publisher's text changed, and 'actTouched' only on those where the change is in the place they cite (or that cite the act as a whole) — found once a week, only in a project with the «Legal acts» add-on; nobody is behind a publisher either, so these act as the rule's owner too. Only 'entered' has a 'status'; pass an empty one for the others. 'fromStatus' narrows any of them to an issue coming from that state: the state it has just left for 'entered', the state it stands in for the rest. A rule with action 'move' MOVES the issue to 'moveToStatus' instead of appending anything, and has no template (pass an empty one). The move is an ordinary one — made as whoever last saved or switched on the rule, asked of the project's workflow, written to the history with the rule's name, and followed by the rules of the state it lands in. A workflow that refuses it leaves a 'moveRefused' line with the reason in the journal and nothing else; 'moved' is a move made; 'tooDeep' is a move not made because rules had already moved issues three times off one event. 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, jira (propose a move or a comment in the project's linked Jira, applied by a person). 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. Project lead or admin only.
Change a version: its name, description, days, or whether it is archived. Only what you pass is changed. A version is what a project's work goes out in — '2.4.0', 'Autumn'. It is the project's own: an issue carries versions of its own project only, any number of them ('fixVersions' on create_issue, update_issue and get_issue; JQL 'fixVersion = "2.4.0"', 'fixVersion in unreleasedVersions()'). An issue that carries the version goes on carrying it under a new name. Archiving puts it away — still on its issues, no longer offered for new ones — and is undone the same way. Releasing is release_version's, not this tool's. Answers with the version as list_versions gives it. Project lead or admin only.
| Argument | Type | Description |
|---|---|---|
| name | string | null | A new name. |
| version* | string | The version, by its name or its id from list_versions. |
| archived | boolean | null | true puts it away; false brings it back. |
| startDate | string | null | The day work on it starts, as YYYY-MM-DD. An empty string clears it. |
| projectKey* | string | Project key, e.g. 'ONB'. |
| description | string | null | A new description. An empty string removes it. |
Edit a comment on a wiki page — your own, or anyone's with full write access in that project. Read it first with get_wiki_page(withMarkdown: true), which gives each comment its 'markdown' and 'version'. Pass 'markdown' to replace the whole comment, or 'edits' to change part of it (exact find-and-replace on that Markdown, each 'oldText' occurring exactly once) — the answer then says where each landed, not the comment. An inline comment's anchor moves with 'inlineSelection': the page text it should point at, copied exactly; an empty string turns it into an ordinary footer comment, which is the only way it ever stops being anchored. Mention someone as [@Their Name](user:username), the wiki's own form. Answers with 'notified' — only the people the *edit* newly reaches, since names already in the old text are not notified again and the page is not re-announced to its watchers.
| Argument | Type | Description |
|---|---|---|
| edits | array | null | Exact replacements in the comment's Markdown — the text get_wiki_page returns as a comment's 'markdown'. Every 'oldText' is matched against it as you read it (not against the result of the other edits) and must occur exactly once unless 'replaceAll' is set; if any edit does not fit, none is applied. |
| markdown | string | null | The whole comment, replacing what is there. Markdown, which also carries $…$ / $$…$$ LaTeX formulas. |
| commentId* | integer | The comment's id, as get_wiki_page lists it or add_wiki_comment returned. |
| inlineMatch | integer | null | Which occurrence of 'inlineSelection' on the page to anchor to, counted from 1. Only needed when the text occurs more than once. |
Change an embed of a wiki page's scene (PM-1076) — its caption, the sites that may frame it, its term — keeping its link, so the sites that have it keep working. Only what you pass changes: an empty caption takes it off, an empty 'sites' allows any site, days 0 removes the term. Only for somebody who may edit the page; a line in its history.
| Argument | Type | Description |
|---|---|---|
| days | integer | null | A new term in days from now; 0 is until it is removed. |
| sites | string | null | Sites that may frame it, comma-separated; empty is any site. |
| caption | string | null | New caption; empty takes it off. |
| embedId* | integer | The embed's id, from list_wiki_embeds or create_wiki_embed. |
{
"type": "object",
"required": [
"embedId"
],
"properties": {
"days": {
"type": [
"integer",
"null"
],
"default": null,
"description": "A new term in days from now; 0 is until it is removed."
},
"sites": {
"type": [
"string",
"null"
],
"default": null,
"description": "Sites that may frame it, comma-separated; empty is any site."
},
"caption": {
"type": [
"string",
"null"
],
"default": null,
"description": "New caption; empty takes it off."
},
"embedId": {
"type": "integer",
"description": "The embed's id, from list_wiki_embeds or create_wiki_embed."
}
}
}Edit a wiki page: retitle it, change its body, move it under another parent (or to the top of its space), or set its labels. Identify it by 'id', or by 'spaceKey' + 'title'. To change part of the body, pass 'edits' (exact find-and-replace on the Markdown source, each 'oldText' occurring exactly once) or 'replaceSection' — the answer says where each landed, not the page, so a one-line fix to a long page costs one line. 'markdown' replaces the whole body — read it first with get_wiki_page(withMarkdown: true) and edit that, or the page's links, images and macros are dropped; 'appendMarkdown' adds to the end and leaves what is there untouched. Mention someone as [@Their Name](user:username), the wiki's own form. Requires permission to edit the page. A page with ```anim blocks answers 'anims': per block, whether it plays or every problem with where it stands. 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.
| Argument | Type | Description |
|---|---|---|
| id | integer | null | Page id (as returned by search_wiki). |
| edits | array | null | Exact replacements in the page's Markdown source — the text get_wiki_page returns with 'section', 'offset' or withMarkdown: true. Every 'oldText' is matched against the page as you read it (not against the result of the other edits) and must occur exactly once unless 'replaceAll' is set; if any edit does not fit, none is applied. Pair with 'expectedVersion'. |
| title | string | null | Current page title, when identifying the page by title. |
| labels |
Admin only: create or update a project's external MCP connection. Pass 'id' to update an existing one (omit to create). 'token' is stored server-side and never returned; omit it to keep the current token when updating. The assistant panel calls the server's read-only tools (readOnlyHint) directly and turns every other non-destructive tool into a card the person applies; 'forAgents' also gives the project's agents its read-only tools.
| Argument | Type | Description |
|---|---|---|
| id | integer | null | Existing connection id to update; omit to create a new one. |
| url | string | null | MCP server URL — use https (required when creating). |
| name | string | null | Connection display name (required when creating). |
| token | string | null | Bearer auth token. Omit to keep the current token when updating. |
| enabled | boolean | null | Whether the connection is enabled. |
| forAgents | boolean | null | Whether the project's agents (called by a mention, a reply or a duty) also get this server's read-only tools. Off by default. |
| projectKey* | string | Project key, e.g. 'UK'. |
Take back a question you asked, when it no longer needs answering — you worked it out, or the task moved on. The comment stays in the thread (the conversation happened) and the question stops counting on the other person's list. The person who asked, or anybody with full write access in the project.
| Argument | Type | Description |
|---|---|---|
| questionId* | integer | The question's id, as returned by list_issue_questions or ask_issue_question. |
{
"type": "object",
"required": [
"questionId"
],
"properties": {
"questionId": {
"type": "integer",
"description": "The question's id, as returned by list_issue_questions or ask_issue_question."
}
}
}Take an approval of a wiki page back: your own, or — the project's lead — somebody else's ('who'). Without 'version' it is the newest edition that person's approval stands on. Nothing is deleted: a 'withdrawn' line is added to the page's journal after the approval it answers, with your note. If nobody else's approval stands on that edition, an older approved edition is in force again, or none.
| Argument | Type | Description |
|---|---|---|
| id* | integer | Page id. |
| who | string | null | Whose approval, by username or e-mail. Leave out for your own. |
| note | string | null | Why — kept with the line. |
| version | integer | null | The edition whose approval is taken back. Leave out for the newest approved one. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "integer",
"description": "Page id."
},
"who": {
"type": [
"string",
"null"
],
"default": null,
"description": "Whose approval, by username or e-mail. Leave out for your own."
},
"note": {
"type": [
"string",
"null"
],
"default": null,
"description": "Why — kept with the line."
},
"version": {
"type": [
"integer",
"null"
],
"default": null,
"description": "The edition whose approval is taken back. Leave out for the newest approved one."
}
}
}| mimeType | string | null | Content type to record for the listing, e.g. 'text/csv'. Ignored when the bytes identify themselves, and never used to serve the file. |
| spaceKey | string | null | Space key, when identifying the page by title. |
| contentBase64 | string | null | The file's bytes, base64-encoded (a 'data:…;base64,…' URL is accepted and unwrapped). Use 'text' instead when the file is text. |
{
"type": "object",
"required": [
"filename"
],
"properties": {
"text": {
"type": [
"string",
"null"
],
"default": null,
"description": "The 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."
},
"title": {
"type": [
"string",
"null"
],
"default": null,
"description": "Exact page title, when identifying the page by title."
},
"pageId": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Page id (as returned by search_wiki)."
},
"comment": {
"type": [
"string",
"null"
],
"default": null,
"description": "Short note about this upload, shown in the page's attachment list."
},
"filename": {
"type": "string",
"description": "File name to store, e.g. 'diagram.png'. Any directory part is dropped."
},
"mimeType": {
"type": [
"string",
"null"
],
"default": null,
"description": "Content type to record for the listing, e.g. 'text/csv'. Ignored when the bytes identify themselves, and never used to serve the file."
},
"spaceKey": {
"type": [
"string",
"null"
],
"default": null,
"description": "Space key, when identifying the page by title."
},
"contentBase64": {
"type": [
"string",
"null"
],
"default": null,
"description": "The file's bytes, base64-encoded (a 'data:…;base64,…' URL is accepted and unwrapped). Use 'text' instead when the file is text."
}
}
}| from |
| string | null |
| Start of the period, as YYYY-MM-DD. Use with 'to'. |
{
"type": "object",
"properties": {
"to": {
"type": [
"string",
"null"
],
"default": null,
"description": "End of the period, as YYYY-MM-DD, included. Use with 'from'."
},
"days": {
"type": [
"integer",
"null"
],
"default": null,
"description": "How many days back from today. Defaults to 90, at most 730. Ignored when 'from' and 'to' are given."
},
"from": {
"type": [
"string",
"null"
],
"default": null,
"description": "Start of the period, as YYYY-MM-DD. Use with 'to'."
}
}
}| bankName |
| string | null |
| The bank's name and address. |
| minimumUsd | number | null | The 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 other ways to pay and told why. |
| beneficiary | string | null | Who the money is sent to — the account holder's name as the bank has it. |
| daysToArrive | integer | null | How 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). |
| accountCurrency | string | null | The account's OWN currency, e.g. 'AMD'. Bills stay in USD; this is what the receiving bank converts into. |
| intermediaryBank | string | null | The intermediary bank's name, where one is needed. |
| intermediarySwift | string | null | The intermediary bank's SWIFT/BIC. |
| intermediaryAccount | string | null | Our account at the intermediary bank. |
{
"type": "object",
"required": [
"enabled"
],
"properties": {
"note": {
"type": [
"string",
"null"
],
"default": null,
"description": "A line for the payer, e.g. which charges are whose. Shown with the details."
},
"swift": {
"type": [
"string",
"null"
],
"default": null,
"description": "The bank's SWIFT/BIC."
},
"account": {
"type": [
"string",
"null"
],
"default": null,
"description": "The account number or IBAN."
},
"enabled": {
"type": "boolean",
"description": "Whether this installation takes transfers. On is refused while a required field is missing; off never is."
},
"purpose": {
"type": [
"string",
"null"
],
"default": null,
"description": "What 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}'."
},
"bankName": {
"type": [
"string",
"null"
],
"default": null,
"description": "The bank's name and address."
},
"minimumUsd": {
"type": [
"number",
"null"
],
"default": null,
"description": "The 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 other ways to pay and told why."
},
"beneficiary": {
"type": [
"string",
"null"
],
"default": null,
"description": "Who the money is sent to — the account holder's name as the bank has it."
},
"daysToArrive": {
"type": [
"integer",
"null"
],
"default": null,
"description": "How 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)."
},
"accountCurrency": {
"type": [
"string",
"null"
],
"default": null,
"description": "The account's OWN currency, e.g. 'AMD'. Bills stay in USD; this is what the receiving bank converts into."
},
"intermediaryBank": {
"type": [
"string",
"null"
],
"default": null,
"description": "The intermediary bank's name, where one is needed."
},
"intermediarySwift": {
"type": [
"string",
"null"
],
"default": null,
"description": "The intermediary bank's SWIFT/BIC."
},
"intermediaryAccount": {
"type": [
"string",
"null"
],
"default": null,
"description": "Our account at the intermediary bank."
}
}
}| boolean |
| Whether 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. |
| defaultOption | integer | null | Which 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 safe to assume: then the deadline only stops the waiting and decides nothing. |
{
"type": "object",
"required": [
"key",
"to",
"question",
"options"
],
"properties": {
"to": {
"type": "string",
"description": "Who 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."
},
"key": {
"type": "string",
"description": "Issue key, e.g. 'UK-1'."
},
"options": {
"type": "array",
"items": {
"type": "string"
},
"description": "The 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."
},
"question": {
"type": "string",
"description": "The question itself. Keep it to what the options answer."
},
"ttlHours": {
"type": [
"integer",
"null"
],
"default": null,
"description": "How 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."
},
"allowFreeText": {
"type": "boolean",
"default": true,
"description": "Whether 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."
},
"defaultOption": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Which 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 safe to assume: then the deadline only stops the waiting and decides nothing."
}
}
}| issueKey | string | null | Issue key, e.g. 'UK-1'. |
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "What it is, e.g. 'stand admin password'. Read by everybody who may read the secret, so not the value and no part of it."
},
"value": {
"type": [
"string",
"null"
],
"default": null,
"description": "The secret itself. Leave it out to get a 'form' link where the person types it themselves."
},
"pageId": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Wiki page id."
},
"readers": {
"type": [
"string",
"null"
],
"default": null,
"description": "Who else may read it, comma-separated usernames or emails (see list_users): 'ivan,olga'. Leave it out for nobody else."
},
"issueKey": {
"type": [
"string",
"null"
],
"default": null,
"description": "Issue key, e.g. 'UK-1'."
}
}
}| teamRole | string | null | The project's team role this issue is for, by name, e.g. 'Звуковик' — one of the roles its administrators keep. With no assignee given, the issue goes to the person who has held that role longest. |
| parentKey | string | null | Parent issue key, to create this as a child/sub-task. |
| projectKey* | string | Project key, e.g. 'UK'. |
| description | string | null | Issue 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). |
| fixVersions | string | null | The versions of the project this goes out in, by name, comma-separated: '2.4.0' or '2.4.0, 2.4.1' — the names list_versions gives. A name the project does not have refuses the filing and lists the ones it has. |
{
"type": "object",
"required": [
"projectKey",
"summary"
],
"properties": {
"type": {
"type": [
"string",
"null"
],
"default": null,
"description": "Issue type name, e.g. 'Task', 'Bug', 'Story', 'Epic'. Defaults to 'Task'."
},
"order": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Its place among its parent's children: 1, 2, 3… — the order they are to be done in. Children with a place come first, in it; the rest after, by number. Filing a template's sub-tasks, pass 1, 2, 3… in turn."
},
"labels": {
"type": [
"string",
"null"
],
"default": null,
"description": "Labels to set, space or comma separated."
},
"dueDate": {
"type": [
"string",
"null"
],
"default": null,
"description": "The day this is due, as YYYY-MM-DD. A calendar day, not a timestamp — do not send a time or a zone."
},
"summary": {
"type": "string",
"description": "Issue summary (title)."
},
"assignee": {
"type": [
"string",
"null"
],
"default": null,
"description": "Assignee username or email. Omit to leave unassigned."
},
"priority": {
"type": [
"string",
"null"
],
"default": null,
"description": "Priority name, e.g. 'High'."
},
"teamRole": {
"type": [
"string",
"null"
],
"default": null,
"description": "The project's team role this issue is for, by name, e.g. 'Звуковик' — one of the roles its administrators keep. With no assignee given, the issue goes to the person who has held that role longest."
},
"parentKey": {
"type": [
"string",
"null"
],
"default": null,
"description": "Parent issue key, to create this as a child/sub-task."
},
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'UK'."
},
"description": {
"type": [
"string",
"null"
],
"default": null,
"description": "Issue 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)."
},
"fixVersions": {
"type": [
"string",
"null"
],
"default": null,
"description": "The versions of the project this goes out in, by name, comma-separated: '2.4.0' or '2.4.0, 2.4.1' — the names list_versions gives. A name the project does not have refuses the filing and lists the ones it has."
}
}
}| description |
| string | null |
| What the project is for. Markdown. |
| openSourceRepo | string | null | Optional: the address of the public repository this is the open source project of, e.g. 'https://github.com/owner/repo' or a GitLab project's address. The host is asked without a token whether it is public; a private or missing one refuses the project. Being open source opens nothing by itself — set_project_public does, and needs it. |
| projectTypeKey | string | null | Jira project type: 'software' (the default), 'business' or 'service_desk'. |
{
"type": "object",
"required": [
"key",
"name"
],
"properties": {
"key": {
"type": "string",
"description": "Project key, 2–10 characters: a letter followed by letters or digits, e.g. 'BGS'. Uppercased."
},
"lead": {
"type": [
"string",
"null"
],
"default": null,
"description": "Username 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."
},
"name": {
"type": "string",
"description": "Project name, e.g. 'Background agents'."
},
"parentKey": {
"type": [
"string",
"null"
],
"default": null,
"description": "Key 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. Leave it out for a project of its own. One level: a subproject cannot have subprojects. The key here is still an ordinary key ('KYCB2B', not 'KYC-B2B'), because it is what every issue key is built from."
},
"description": {
"type": [
"string",
"null"
],
"default": null,
"description": "What the project is for. Markdown."
},
"openSourceRepo": {
"type": [
"string",
"null"
],
"default": null,
"description": "Optional: the address of the public repository this is the open source project of, e.g. 'https://github.com/owner/repo' or a GitLab project's address. The host is asked without a token whether it is public; a private or missing one refuses the project. Being open source opens nothing by itself — set_project_public does, and needs it."
},
"projectTypeKey": {
"type": [
"string",
"null"
],
"default": null,
"description": "Jira project type: 'software' (the default), 'business' or 'service_desk'."
}
}
}| Argument | Type | Description |
|---|---|---|
| name* | string | What the rule is called, e.g. 'Document pack'. At most 120 characters. |
| type | string | null | Only issues of this type, by name, e.g. 'Bug'. Leave out for any type. |
| label | string | null | Only issues carrying this label (one word). Leave out for any label. |
| action | string | null | 'checklist' (the default), 'move' to move the issue to 'moveToStatus', or 'agent' for a duty. Fixed once the rule exists. |
| branch | string | null | For 'mrOpened', 'mrMerged' and 'mrClosed': only a merge request going into this branch, e.g. 'main'. Leave out for any. |
| capUsd | number | null | For a duty: what one task may cost, in dollars, when more than the ordinary ceiling is needed. At most 5. |
| status* | string | The state whose ENTRY fires the rule, by name, e.g. 'Ready for review'. For a duty taken only by hand, an empty string. |
| enabled | boolean | Whether the rule is on from the start. Default true. |
| trigger | string | null | WHEN the rule fires: 'entered' (the default), 'versionReleased', 'subtasksDone', 'subtaskStarted', or from the repository's webhook 'branchCreated', 'mrOpened', 'mrMerged', 'mrClosed', or 'deployed' when a pipeline reports a deployment, or 'actChanged' / 'actTouched' when a legal act the issue cites changed. For any but 'entered', pass an empty 'status'. |
| template* | string | The 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 instruction. |
| agentRole | string | null | For a duty: the agent role's key, e.g. 'product'. |
| doneStatus | string | null | For a duty: the state it moves the issue to when done. Never a finished state. Leave out and it does not move the issue. |
| fromStatus | string | null | Only an issue coming from this state, by name. Leave out for any. |
| projectKey* | string | Project key, e.g. 'ONB'. |
| agentFields | string | null | For a duty: the fields it may set, comma-separated — priority, labels, duedate, or a project field's name. |
| environment | string | null | For 'deployed': only a deployment to this environment of the project, by name, e.g. 'staging'. Leave out for any. |
| agentActions | string | null | For a duty: what the agent may do beyond commenting, comma-separated — describe, subtasks, ask, wiki, report, support, jira. |
| moveToStatus | string | null | For action 'move': the state the issue is moved to, by name — finished ones included. |
{
"type": "object",
"required": [
"projectKey",
"name",
"status",
"template"
],
"properties": {
"name": {
"type": "string",
"description": "What the rule is called, e.g. 'Document pack'. At most 120 characters."
},
"type": {
"type": [
"string",
"null"
],
"default": null,
"description": "Only issues of this type, by name, e.g. 'Bug'. Leave out for any type."
},
"label": {
"type": [
"string",
"null"
],
"default": null,
"description": "Only issues carrying this label (one word). Leave out for any label."
},
"action": {
"type": [
"string",
"null"
],
"default": null,
"description": "'checklist' (the default), 'move' to move the issue to 'moveToStatus', or 'agent' for a duty. Fixed once the rule exists."
},
"branch": {
"type": [
"string",
"null"
],
"default": null,
"description": "For 'mrOpened', 'mrMerged' and 'mrClosed': only a merge request going into this branch, e.g. 'main'. Leave out for any."
},
"capUsd": {
"type": [
"number",
"null"
],
"default": null,
"description": "For a duty: what one task may cost, in dollars, when more than the ordinary ceiling is needed. At most 5."
},
"status": {
"type": "string",
"description": "The state whose ENTRY fires the rule, by name, e.g. 'Ready for review'. For a duty taken only by hand, an empty string."
},
"enabled": {
"type": "boolean",
"default": true,
"description": "Whether the rule is on from the start. Default true."
},
"trigger": {
"type": [
"string",
"null"
],
"default": null,
"description": "WHEN the rule fires: 'entered' (the default), 'versionReleased', 'subtasksDone', 'subtaskStarted', or from the repository's webhook 'branchCreated', 'mrOpened', 'mrMerged', 'mrClosed', or 'deployed' when a pipeline reports a deployment, or 'actChanged' / 'actTouched' when a legal act the issue cites changed. For any but 'entered', pass an empty 'status'."
},
"template": {
"type": "string",
"description": "The 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 instruction."
},
"agentRole": {
"type": [
"string",
"null"
],
"default": null,
"description": "For a duty: the agent role's key, e.g. 'product'."
},
"doneStatus": {
"type": [
"string",
"null"
],
"default": null,
"description": "For a duty: the state it moves the issue to when done. Never a finished state. Leave out and it does not move the issue."
},
"fromStatus": {
"type": [
"string",
"null"
],
"default": null,
"description": "Only an issue coming from this state, by name. Leave out for any."
},
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'ONB'."
},
"agentFields": {
"type": [
"string",
"null"
],
"default": null,
"description": "For a duty: the fields it may set, comma-separated — priority, labels, duedate, or a project field's name."
},
"environment": {
"type": [
"string",
"null"
],
"default": null,
"description": "For 'deployed': only a deployment to this environment of the project, by name, e.g. 'staging'. Leave out for any."
},
"agentActions": {
"type": [
"string",
"null"
],
"default": null,
"description": "For a duty: what the agent may do beyond commenting, comma-separated — describe, subtasks, ask, wiki, report, support, jira."
},
"moveToStatus": {
"type": [
"string",
"null"
],
"default": null,
"description": "For action 'move': the state the issue is moved to, by name — finished ones included."
}
}
}{
"type": "object",
"required": [
"id",
"block"
],
"properties": {
"id": {
"type": "integer",
"description": "Page id."
},
"days": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Days the link answers, 1 to 3650. Optional: none is until it is removed."
},
"block": {
"type": "integer",
"description": "The block's number among the page's blocks of its language, from 1 — 'block' in get_wiki_page's 'anims'."
},
"sites": {
"type": [
"string",
"null"
],
"default": null,
"description": "Sites that may frame it, comma-separated, as https://example.org. Optional: none is any site."
},
"caption": {
"type": [
"string",
"null"
],
"default": null,
"description": "A line shown under the scene. Optional."
},
"language": {
"type": [
"string",
"null"
],
"default": null,
"description": "'anim' (default) or 'anim-js'."
}
}
}| Parent page id. Omit to hang the page off the space home page. |
| spaceKey* | string | Space key, e.g. 'PM'. Every project has exactly one space, keyed like the project. |
| templateId | integer | null | Make the page from a template: the id of a page of the same space that carries the label 'template' (search_wiki finds them by that label). The new page starts as the template's text and its other labels; 'markdown', when you send it too, wins. |
| parentTitle | string | null | Parent page title, as an alternative to 'parentId'. Must be a page in the same space. |
{
"type": "object",
"required": [
"spaceKey",
"title"
],
"properties": {
"title": {
"type": "string",
"description": "Page title. Must be unique within the space — the title is how pages are addressed here."
},
"labels": {
"type": [
"string",
"null"
],
"default": null,
"description": "Labels to set, space or comma separated. Stored in lower case, except a label starting with '$', which is kept exactly as written. The label 'template' offers the page as a template: people then make pages from it."
},
"markdown": {
"type": [
"string",
"null"
],
"default": null,
"description": "Page 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}. A theorem, lemma, proposition, corollary, conjecture or question is a block of its own — ::: theorem {#thm:label status=computer number=5.8 title=\"…\"} on its line, the statement, then ::: — read into the project's register of claims at the save (list_claims); 'claims' in the answer says which."
},
"parentId": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Parent page id. Omit to hang the page off the space home page."
},
"spaceKey": {
"type": "string",
"description": "Space key, e.g. 'PM'. Every project has exactly one space, keyed like the project."
},
"templateId": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Make the page from a template: the id of a page of the same space that carries the label 'template' (search_wiki finds them by that label). The new page starts as the template's text and its other labels; 'markdown', when you send it too, wins."
},
"parentTitle": {
"type": [
"string",
"null"
],
"default": null,
"description": "Parent page title, as an alternative to 'parentId'. Must be a page in the same space."
}
}
}| boolean |
| Return 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 large page. |
| section | string | null | Return 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 links to) or by its heading text. |
| spaceKey | string | null | Space key, when looking the page up by title. |
| withRelated | boolean | With 'outline', 'section' or 'offset': also return the page's children, attachments, comments and linked issues, which a partial read otherwise leaves out. |
| withMarkdown | boolean | Return 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 as text. |
{
"type": "object",
"properties": {
"id": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Page id (as returned by search_wiki)."
},
"limit": {
"type": [
"integer",
"null"
],
"default": null,
"description": "How many lines to return from 'offset' (default 200)."
},
"title": {
"type": [
"string",
"null"
],
"default": null,
"description": "Exact page title, when looking the page up by title."
},
"offset": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Return only the Markdown source from this 1-based line on — for a page without headings to navigate by. Pair with 'limit'."
},
"outline": {
"type": "boolean",
"default": false,
"description": "Return 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 large page."
},
"section": {
"type": [
"string",
"null"
],
"default": null,
"description": "Return 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 links to) or by its heading text."
},
"spaceKey": {
"type": [
"string",
"null"
],
"default": null,
"description": "Space key, when looking the page up by title."
},
"withRelated": {
"type": "boolean",
"default": false,
"description": "With 'outline', 'section' or 'offset': also return the page's children, attachments, comments and linked issues, which a partial read otherwise leaves out."
},
"withMarkdown": {
"type": "boolean",
"default": false,
"description": "Return 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 as text."
}
}
}| How many to skip — for the next page. |
| source | string | null | Only persons read from this source: 'page:471', 'issue:KYC-12', 'comment:88', 'wikicomment:7', or 'none' for those written with no source. 'sources' in the answer lists them with counts. |
| project* | string | The project key, e.g. MATH. |
| onlyUnchecked | boolean | true for only persons with a spelling or fact that is not checked — written from memory or no longer in its source. |
{
"type": "object",
"required": [
"project"
],
"properties": {
"q": {
"type": [
"string",
"null"
],
"default": null,
"description": "Words a spelling holds, case aside."
},
"limit": {
"type": "integer",
"default": 100,
"description": "How many to return, at most 200. Default 100."
},
"state": {
"type": [
"string",
"null"
],
"default": null,
"description": "'confirmed', 'proposed', 'rejected' or leave out for all you may see."
},
"offset": {
"type": "integer",
"default": 0,
"description": "How many to skip — for the next page."
},
"source": {
"type": [
"string",
"null"
],
"default": null,
"description": "Only persons read from this source: 'page:471', 'issue:KYC-12', 'comment:88', 'wikicomment:7', or 'none' for those written with no source. 'sources' in the answer lists them with counts."
},
"project": {
"type": "string",
"description": "The project key, e.g. MATH."
},
"onlyUnchecked": {
"type": "boolean",
"default": false,
"description": "true for only persons with a spelling or fact that is not checked — written from memory or no longer in its source."
}
}
}| Argument | Type | Description |
|---|---|---|
| projectKey* | string | Project key, e.g. 'ONB'. |
{
"type": "object",
"required": [
"projectKey"
],
"properties": {
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'ONB'."
}
}
}| project* | string | The project key, e.g. KYC. |
{
"type": "object",
"required": [
"project"
],
"properties": {
"kind": {
"type": [
"string",
"null"
],
"default": null,
"description": "Only these kinds, comma-separated — 'статус,система'; an empty one ('статус,') also takes terms with no kind. 'kinds' in the answer says which there are."
},
"limit": {
"type": "integer",
"default": 100,
"description": "How many to return, at most 200. Default 100."
},
"state": {
"type": [
"string",
"null"
],
"default": null,
"description": "'confirmed', 'proposed', 'rejected' or leave out for all you may see."
},
"offset": {
"type": "integer",
"default": 0,
"description": "How many to skip — for the next page."
},
"source": {
"type": [
"string",
"null"
],
"default": null,
"description": "Only the terms of one source — 'page:471', 'issue:KYC-12', or 'none' for the terms with no source. 'sources' in the answer says which there are, with how many."
},
"project": {
"type": "string",
"description": "The project key, e.g. KYC."
}
}
}| Cost in USD, if you know the rates that applied. |
| endedAt | string | null | When the run ended (ISO 8601). |
| startedAt | string | null | When the run started (ISO 8601). |
| externalId* | string | Your own key for this record (usually the run id). Re-sending it updates the record. |
| inputTokens | integer | null | Input (prompt) tokens. |
| agentSeconds | integer | null | Wall-clock seconds the run took. Machine time, not a worklog. |
| outputTokens | integer | null | Output (completion) tokens. |
| cacheReadTokens | integer | null | Cache-read tokens. |
| cacheWriteTokens | integer | null | Cache-write tokens. |
{
"type": "object",
"required": [
"key",
"source",
"externalId"
],
"properties": {
"key": {
"type": "string",
"description": "Issue key, e.g. 'UK-1'."
},
"host": {
"type": [
"string",
"null"
],
"default": null,
"description": "Which host it ran on."
},
"note": {
"type": [
"string",
"null"
],
"default": null,
"description": "Short note, e.g. the outcome."
},
"agent": {
"type": [
"string",
"null"
],
"default": null,
"description": "Which agent did the work, e.g. 'claude-code'."
},
"model": {
"type": [
"string",
"null"
],
"default": null,
"description": "Which model it ran on, e.g. 'claude-opus-5'."
},
"runId": {
"type": [
"string",
"null"
],
"default": null,
"description": "The run this record belongs to, when one run reports several records (different models or hosts)."
},
"source": {
"type": "string",
"description": "Who is reporting, e.g. 'bg-agent-api'. Idempotency is scoped to it."
},
"costUsd": {
"type": [
"number",
"null"
],
"default": null,
"description": "Cost in USD, if you know the rates that applied."
},
"endedAt": {
"type": [
"string",
"null"
],
"format": "date-time",
"default": null,
"description": "When the run ended (ISO 8601)."
},
"startedAt": {
"type": [
"string",
"null"
],
"format": "date-time",
"default": null,
"description": "When the run started (ISO 8601)."
},
"externalId": {
"type": "string",
"description": "Your own key for this record (usually the run id). Re-sending it updates the record."
},
"inputTokens": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Input (prompt) tokens."
},
"agentSeconds": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Wall-clock seconds the run took. Machine time, not a worklog."
},
"outputTokens": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Output (completion) tokens."
},
"cacheReadTokens": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Cache-read tokens."
},
"cacheWriteTokens": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Cache-write tokens."
}
}
}| result |
| string | null |
| What came of it, a sentence or two. Markdown, $...$ formulas. |
| source* | string | Who runs it, e.g. 'tm' or 'boinc'. The job's name is unique within it. |
| command | string | null | How it was run: the command line or the job's description. |
| outputUrl | string | null | Where its output can be fetched (http/https). |
| startedAt | string | null | When it started (ISO 8601). Left out, a move to running stamps now. |
| externalId* | string | The job's own name there, e.g. 'kimmy/gap/m74r5u'. The same name again updates the job. |
| finishedAt | string | null | When it ended (ISO 8601). Left out, a move to a finished state stamps now. |
| repository | string | null | The repository's web address, e.g. 'https://github.com/org/repo'. |
| progressDone | integer | null | How much is done, as the runner counts, e.g. 812. |
| progressTotal | integer | null | Out of how much, e.g. 1695. |
{
"type": "object",
"required": [
"key",
"source",
"externalId"
],
"properties": {
"key": {
"type": "string",
"description": "The issue the computation answers, e.g. 'MATH-74'."
},
"url": {
"type": [
"string",
"null"
],
"default": null,
"description": "The job's own page on its runner (http/https)."
},
"state": {
"type": [
"string",
"null"
],
"default": null,
"description": "queued, running, done, failed, cancelled or lost."
},
"title": {
"type": [
"string",
"null"
],
"default": null,
"description": "What it computes, in words, e.g. 'rank 5, order 2^11, stage C'."
},
"commit": {
"type": [
"string",
"null"
],
"default": null,
"description": "The commit it ran at."
},
"result": {
"type": [
"string",
"null"
],
"default": null,
"description": "What came of it, a sentence or two. Markdown, $...$ formulas."
},
"source": {
"type": "string",
"description": "Who runs it, e.g. 'tm' or 'boinc'. The job's name is unique within it."
},
"command": {
"type": [
"string",
"null"
],
"default": null,
"description": "How it was run: the command line or the job's description."
},
"outputUrl": {
"type": [
"string",
"null"
],
"default": null,
"description": "Where its output can be fetched (http/https)."
},
"startedAt": {
"type": [
"string",
"null"
],
"format": "date-time",
"default": null,
"description": "When it started (ISO 8601). Left out, a move to running stamps now."
},
"externalId": {
"type": "string",
"description": "The job's own name there, e.g. 'kimmy/gap/m74r5u'. The same name again updates the job."
},
"finishedAt": {
"type": [
"string",
"null"
],
"format": "date-time",
"default": null,
"description": "When it ended (ISO 8601). Left out, a move to a finished state stamps now."
},
"repository": {
"type": [
"string",
"null"
],
"default": null,
"description": "The repository's web address, e.g. 'https://github.com/org/repo'."
},
"progressDone": {
"type": [
"integer",
"null"
],
"default": null,
"description": "How much is done, as the runner counts, e.g. 812."
},
"progressTotal": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Out of how much, e.g. 1695."
}
}
}| string | null |
| The issue keys it carried, comma-separated: 'ONB-12,ONB-15'. |
| version | string | null | A version of the project to put these issues in, by name, e.g. '2.4.0'. |
| fromLast | boolean | True to start the range at the revision the last deployment to this environment was reported at, instead of naming 'from'. The first report to an environment then reads no range. |
| revision | string | null | What went out: a commit, a tag, an image tag. |
| projectKey* | string | Project key, e.g. 'ONB'. |
| repository | string | null | Which connected repository the range is in, as 'group/repo', when the project has several. |
| environment* | string | The environment's name, e.g. 'staging' — one of list_environments. |
{
"type": "object",
"required": [
"projectKey",
"environment"
],
"properties": {
"id": {
"type": [
"string",
"null"
],
"default": null,
"description": "Your own identifier for this deployment — a pipeline or job id. Left out, 'revision' stands in for it."
},
"to": {
"type": [
"string",
"null"
],
"default": null,
"description": "The end of that range. Left out, 'revision'."
},
"url": {
"type": [
"string",
"null"
],
"default": null,
"description": "A link to the pipeline, http or https."
},
"from": {
"type": [
"string",
"null"
],
"default": null,
"description": "The revision the previous deployment to this environment was at — the start of the range of commits to read keys from."
},
"issues": {
"type": [
"string",
"null"
],
"default": null,
"description": "The issue keys it carried, comma-separated: 'ONB-12,ONB-15'."
},
"version": {
"type": [
"string",
"null"
],
"default": null,
"description": "A version of the project to put these issues in, by name, e.g. '2.4.0'."
},
"fromLast": {
"type": "boolean",
"default": false,
"description": "True to start the range at the revision the last deployment to this environment was reported at, instead of naming 'from'. The first report to an environment then reads no range."
},
"revision": {
"type": [
"string",
"null"
],
"default": null,
"description": "What went out: a commit, a tag, an image tag."
},
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'ONB'."
},
"repository": {
"type": [
"string",
"null"
],
"default": null,
"description": "Which connected repository the range is in, as 'group/repo', when the project has several."
},
"environment": {
"type": "string",
"description": "The environment's name, e.g. 'staging' — one of list_environments."
}
}
}| text | string | null | Shorthand for `key ~ … OR summary ~ …`. Narrows the query further when `jql` is given too. |
| limit | integer | Max issues to return (default 25, max 100). |
| status | string | null | Shorthand for `status = …` (e.g. 'In Progress', 'Done'). Narrows the query further when `jql` is given too. |
| projectKey | string | null | Shorthand for `project = …` (must be visible to the token). Narrows the query further when `jql` is given too. |
{
"type": "object",
"properties": {
"jql": {
"type": [
"string",
"null"
],
"default": null,
"description": "A JQL query, e.g. `assignee = currentUser() AND statusCategory != Done ORDER BY updated DESC`. FIELDS: project, status, statuscategory, issuetype, type, priority, resolution, assignee, reporter, creator, key, issuekey, id, summary, description, sprint, parent, epic, labels, archived, agent, teamRole, fixVersion, fixVersions, legalRef, text, created, updated, duedate. OPERATORS: = != ~ !~ > >= < <=, IN (...), NOT IN (...), IS EMPTY, IS NOT EMPTY, combined with AND / OR, with parentheses around a sub-expression — `project = PM AND (status = Blocked OR priority = Highest)` — plus an optional trailing ORDER BY <field> [DESC]. `~` means contains (substring) and is the one to use for free text — `text` searches summary, description and comments. `>` `>=` `<` `<=` are for created/updated/duedate only, with absolute YYYY-MM-DD values: there are NO relative-date functions, so compute the date yourself. The functions are currentUser(), for assignee/reporter/creator, myTeamRoles(), for teamRole, and releasedVersions() / unreleasedVersions(), for fixVersion. `archived` is this tracker's own field: archived issues are left out unless the query mentions it. `epic` is this tracker's own too, and it is the wide one: `epic = PM-12` matches that epic AND the work under it — its children and their sub-tasks — which is how one asks for an epic's whole board in a single clause. `parent` is the narrow one: direct children only, and never the epic itself. `agent` is this tracker's own as well: `agent = product` is an issue an agent of that role has right now — working on it or waiting on its question — and `agent IS NOT EMPTY` is any agent; the assignee of such an issue is still the person it works for. `teamRole` is this tracker's own too: the project's team role an issue is for, by name — `teamRole = \"Звуковик\"` — and `teamRole in myTeamRoles()` is every issue for a role the caller holds, which with `assignee != currentUser()` is the work of their role that fell to somebody else. `fixVersion` is the project version an issue goes out in, by name or id — `fixVersion = \"2.4.0\"`; an issue may be in several, so `=` means «is in». `fixVersion in unreleasedVersions()` is what is still to ship, `fixVersion in releasedVersions(PM)` what one project has shipped, `fixVersion IS EMPTY` work in no version. `legalRef` is this tracker's own: the legal act an issue refers to, in its description or a comment — `legalRef = \"32015L0849\"` by the act's key, its address or its document id, `legalRef ~ \"2015/849\"` by words in its address or title, `legalRef IS NOT EMPTY` any act. Only in projects that keep legal references. Quote values containing spaces. Seeded values — status: Backlog, \"To Do\", \"In Progress\", \"In Review\", Blocked, Done; statusCategory: \"To Do\", \"In Progress\", Done; priority: Highest, High, Medium, Low, Lowest; type: Epic, Story, Task, Bug, \"Sub-task\". A project's own columns (PM-170) can be searched too, by name — Segment = AI — or as customfield_20003 / cf[20003]; list_project_fields names them."
},
"text": {
"type": [
"string",
"null"
],
"default": null,
"description": "Shorthand for `key ~ … OR summary ~ …`. Narrows the query further when `jql` is given too."
},
"limit": {
"type": "integer",
"default": 25,
"description": "Max issues to return (default 25, max 100)."
},
"status": {
"type": [
"string",
"null"
],
"default": null,
"description": "Shorthand for `status = …` (e.g. 'In Progress', 'Done'). Narrows the query further when `jql` is given too."
},
"projectKey": {
"type": [
"string",
"null"
],
"default": null,
"description": "Shorthand for `project = …` (must be visible to the token). Narrows the query further when `jql` is given too."
}
}
}| number | string | null | Its number in the paper, e.g. '5.8'; empty to clear. |
| reason | string | null | For a new claim with a status: on what ground. |
| status | string | null | For a NEW claim: how far it is proved — open, paper, computer, lean, refuted, retracted. Default open. |
| project | string | null | The project key, e.g. MATH. |
| newLabel | string | null | A new label for an existing claim. |
| statement | string | null | The statement, Markdown with $…$ formulas. |
{
"type": "object",
"properties": {
"id": {
"type": [
"integer",
"null"
],
"default": null,
"description": "The claim to change, as list_claims returned it. Or name it by 'project' and 'label'."
},
"kind": {
"type": [
"string",
"null"
],
"default": null,
"description": "theorem, lemma, proposition, corollary, conjecture or question. A new claim is a theorem unless said."
},
"bases": {
"type": [
"string",
"null"
],
"default": null,
"description": "What it rests on, as a JSON array replacing the list: [{\"kind\":\"page\",\"page\":477,\"note\":\"§3\"},{\"kind\":\"computation\",\"ref\":\"kimmy/gap/m74r5u\"},{\"kind\":\"lean\",\"ref\":\"D5.rank_five\"},{\"kind\":\"source\",\"ref\":\"Gupta 1990, Thm 2\"}]. A page is one you may open, by its id; a computation by the name a [comp:…] cites — a runner's job, or a page's saved cell 'wl:477/…/2'."
},
"label": {
"type": [
"string",
"null"
],
"default": null,
"description": "The claim's label, e.g. 'thm:d5-rank5'."
},
"title": {
"type": [
"string",
"null"
],
"default": null,
"description": "A short name, e.g. 'Rank 5 is decided'; empty to clear."
},
"number": {
"type": [
"string",
"null"
],
"default": null,
"description": "Its number in the paper, e.g. '5.8'; empty to clear."
},
"reason": {
"type": [
"string",
"null"
],
"default": null,
"description": "For a new claim with a status: on what ground."
},
"status": {
"type": [
"string",
"null"
],
"default": null,
"description": "For a NEW claim: how far it is proved — open, paper, computer, lean, refuted, retracted. Default open."
},
"project": {
"type": [
"string",
"null"
],
"default": null,
"description": "The project key, e.g. MATH."
},
"newLabel": {
"type": [
"string",
"null"
],
"default": null,
"description": "A new label for an existing claim."
},
"statement": {
"type": [
"string",
"null"
],
"default": null,
"description": "The statement, Markdown with $…$ formulas."
}
}
}| false to keep it switched off. Default true. |
| nextDay* | string | The first day it files on, YYYY-MM-DD, today or later on your clock. For months, its day of the month is the day kept (the 31st is a short month's last day). |
| project* | string | The project key, e.g. PM. |
| summary* | string | The filed issue's title; {date}, {month}, {quarter}, {year} are filled in on the day. |
| assignee | string | null | Assignee username or e-mail. Nobody where nothing is said. |
| priority | string | null | Priority name, e.g. 'High'. |
| dueInDays | integer | null | The filed issue's due day, as a number of days after the day it is filed — 19 makes an issue filed on the 1st due on the 20th. A count, not a day of the month. Leave out for no due day. |
| description | string | null | The filed issue's description, Markdown; [~username] mentions notify each time. |
{
"type": "object",
"required": [
"project",
"summary",
"nextDay"
],
"properties": {
"id": {
"type": [
"integer",
"null"
],
"default": null,
"description": "The schedule to change, as list_issue_schedules returned it. Leave out to add one."
},
"type": {
"type": [
"string",
"null"
],
"default": null,
"description": "Issue type name, one of the project's. 'Task' where nothing is said."
},
"unit": {
"type": "string",
"default": "month",
"description": "'month' (the default) or 'week'."
},
"every": {
"type": "integer",
"default": 1,
"description": "Every how many units: 1 (the default), 3 for a quarter, 12 for a year. Up to 52 weeks or 24 months."
},
"labels": {
"type": [
"string",
"null"
],
"default": null,
"description": "Labels as 'a,b'."
},
"enabled": {
"type": "boolean",
"default": true,
"description": "false to keep it switched off. Default true."
},
"nextDay": {
"type": "string",
"description": "The first day it files on, YYYY-MM-DD, today or later on your clock. For months, its day of the month is the day kept (the 31st is a short month's last day)."
},
"project": {
"type": "string",
"description": "The project key, e.g. PM."
},
"summary": {
"type": "string",
"description": "The filed issue's title; {date}, {month}, {quarter}, {year} are filled in on the day."
},
"assignee": {
"type": [
"string",
"null"
],
"default": null,
"description": "Assignee username or e-mail. Nobody where nothing is said."
},
"priority": {
"type": [
"string",
"null"
],
"default": null,
"description": "Priority name, e.g. 'High'."
},
"dueInDays": {
"type": [
"integer",
"null"
],
"default": null,
"description": "The filed issue's due day, as a number of days after the day it is filed — 19 makes an issue filed on the 1st due on the 20th. A count, not a day of the month. Leave out for no due day."
},
"description": {
"type": [
"string",
"null"
],
"default": null,
"description": "The filed issue's description, Markdown; [~username] mentions notify each time."
}
}
}| 'confirmed' or 'rejected' — to decide a proposed person. |
| project | string | null | The project key, for a new person. |
| spellings | string | null | Spellings to add, as a JSON array: [{"text":"N. D. Gupta","form":"full","source":"page:471","quote":"N. D. Gupta, The dimension subgroup conjecture…","place":"Источники"}]. 'form' is 'full', 'surname' or 'inflected' (a declined form, «Гупты»); left out, it is worked out. |
| removeFacts | string | null | Facts to remove, as 'kind:value', comma-separated — 'born:1938'. |
| removeSpellings | string | null | Spellings to remove, by their text, comma-separated. |
{
"type": "object",
"properties": {
"id": {
"type": [
"integer",
"null"
],
"default": null,
"description": "The person to change, as list_persons or find_person returned them. Leave out to add one."
},
"name": {
"type": [
"string",
"null"
],
"default": null,
"description": "The name shown first — one of the person's spellings, e.g. 'Гупта'; a new one becomes a spelling."
},
"note": {
"type": [
"string",
"null"
],
"default": null,
"description": "Why this person is here, in a line — at most 600 characters."
},
"facts": {
"type": [
"string",
"null"
],
"default": null,
"description": "Facts to add, as a JSON array: [{\"kind\":\"born\",\"value\":\"1938\",\"source\":\"page:471\",\"quote\":\"…(1938–2019)…\"}]. 'kind' is born, died (a year or a date), wikidata (Q…), mathGenealogy, mrAuthor (digits) or orcid."
},
"state": {
"type": [
"string",
"null"
],
"default": null,
"description": "'confirmed' or 'rejected' — to decide a proposed person."
},
"project": {
"type": [
"string",
"null"
],
"default": null,
"description": "The project key, for a new person."
},
"spellings": {
"type": [
"string",
"null"
],
"default": null,
"description": "Spellings to add, as a JSON array: [{\"text\":\"N. D. Gupta\",\"form\":\"full\",\"source\":\"page:471\",\"quote\":\"N. D. Gupta, The dimension subgroup conjecture…\",\"place\":\"Источники\"}]. 'form' is 'full', 'surname' or 'inflected' (a declined form, «Гупты»); left out, it is worked out."
},
"removeFacts": {
"type": [
"string",
"null"
],
"default": null,
"description": "Facts to remove, as 'kind:value', comma-separated — 'born:1938'."
},
"removeSpellings": {
"type": [
"string",
"null"
],
"default": null,
"description": "Spellings to remove, by their text, comma-separated."
}
}
}| showIcon | boolean | null | Mark a board card when this field has a value: true to switch the mark on, false off. Leave out to keep it as it is. |
| issueType | string | null | Keep the field for issues of one type only, by name — e.g. 'Показ' — or '' for every type. Leave out to keep it as it is. |
| projectKey* | string | Project key, e.g. 'CRM'. |
{
"type": "object",
"required": [
"projectKey",
"name"
],
"properties": {
"icon": {
"type": [
"string",
"null"
],
"default": null,
"description": "The glyph that mark wears, from the palette list_project_fields returns. Not for a country field: that one marks a card with the flag of the country the issue holds, so passing an icon is refused rather than ignored."
},
"kind": {
"type": [
"string",
"null"
],
"default": null,
"description": "What it holds: 'text', 'number', 'date' (a day), 'datetime' (a day and a time, written like 2026-10-01T19:30+03:00), 'user', 'select' (a list), 'country' (a country, written as its name or its two-letter code and shown with a flag) or 'link' (issues and wiki pages, one or several — what a row is confirmed by). Required when creating; ignored when the field already exists, since a kind cannot change."
},
"name": {
"type": "string",
"description": "Field name, e.g. 'Segment'. An existing field with this name is edited rather than duplicated."
},
"newName": {
"type": [
"string",
"null"
],
"default": null,
"description": "Rename the field to this. Leave out to keep the name."
},
"options": {
"type": [
"string",
"null"
],
"default": null,
"description": "For a list: its options, as 'AI:green, Skins:orange, GameCards' or a JSON array of {name, color}. A colour is optional and must be one of: orange, amber, red, pink, purple, blue, teal, green. Options left out are REMOVED — send the whole set."
},
"showIcon": {
"type": [
"boolean",
"null"
],
"default": null,
"description": "Mark a board card when this field has a value: true to switch the mark on, false off. Leave out to keep it as it is."
},
"issueType": {
"type": [
"string",
"null"
],
"default": null,
"description": "Keep the field for issues of one type only, by name — e.g. 'Показ' — or '' for every type. Leave out to keep it as it is."
},
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'CRM'."
}
}
}| string | null |
| The project key, for a new term. |
| variants | string | null | Its other spellings, one per line or comma-separated. |
| definition | string | null | What it means — one or two short sentences, Markdown, $…$ for formulas; at most 600 characters. |
{
"type": "object",
"properties": {
"id": {
"type": [
"integer",
"null"
],
"default": null,
"description": "The term to change, as list_terms returned it. Leave out to add one."
},
"kind": {
"type": [
"string",
"null"
],
"default": null,
"description": "What sort of thing it is, in the project's words — 'условие', 'спецификация', 'понятие'."
},
"name": {
"type": [
"string",
"null"
],
"default": null,
"description": "The term as written, e.g. 'PW06' or 'Размерная подгруппа'."
},
"place": {
"type": [
"string",
"null"
],
"default": null,
"description": "The heading on the source it stands under."
},
"state": {
"type": [
"string",
"null"
],
"default": null,
"description": "'confirmed' or 'rejected' — to decide a proposed term."
},
"source": {
"type": [
"string",
"null"
],
"default": null,
"description": "The page or issue that defines it: 'page:471', 'PM-12' or its address. '' removes it."
},
"project": {
"type": [
"string",
"null"
],
"default": null,
"description": "The project key, for a new term."
},
"variants": {
"type": [
"string",
"null"
],
"default": null,
"description": "Its other spellings, one per line or comma-separated."
},
"definition": {
"type": [
"string",
"null"
],
"default": null,
"description": "What it means — one or two short sentences, Markdown, $…$ for formulas; at most 600 characters."
}
}
}| position | integer | null | Where it sits in the row above the board, counting from 1. Leave it out and a new track goes last, an existing one stays where it is. |
| projectKey* | string | Project key, e.g. 'TH'. |
{
"type": "object",
"required": [
"projectKey",
"tag"
],
"properties": {
"tag": {
"type": "string",
"description": "The label that puts an issue in this track, e.g. 'cherry-orchard'. No spaces. An existing track with this tag is edited rather than duplicated; matched exactly, so 'Hamlet' and 'hamlet' are two tags, as they are two labels."
},
"icon": {
"type": [
"string",
"null"
],
"default": null,
"description": "One or two emoji shown BESIDE the name, never instead of it. Leave it out to keep what is there; send an empty string to take it off. Anything that is not an emoji is refused rather than ignored."
},
"name": {
"type": [
"string",
"null"
],
"default": null,
"description": "What a reader sees, e.g. 'The Cherry Orchard'. Leave it out to keep what is there; send an empty string to drop it and let the tag speak."
},
"newTag": {
"type": [
"string",
"null"
],
"default": null,
"description": "Rename the tag to this. The label on existing issues is NOT rewritten, so work in the old tag leaves the track — rename only when the issues are being relabelled too."
},
"archived": {
"type": [
"boolean",
"null"
],
"default": null,
"description": "true takes the track off the row above the board WITHOUT undeclaring it — a play that has been staged: its name, icon, place and tag are kept, its issues stay in it (they do not become 'outside every track'), and links to it keep working. false puts it back in the row. Leave it out to keep what is there. Prefer this to remove_track for a track that is finished."
},
"position": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Where it sits in the row above the board, counting from 1. Leave it out and a new track goes last, an existing one stays where it is."
},
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'TH'."
}
}
}{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "integer",
"description": "Page id."
},
"users": {
"type": [
"string",
"null"
],
"default": null,
"description": "Usernames or e-mails, as 'a,b'. Take them from list_users."
},
"members": {
"type": "boolean",
"default": false,
"description": "true for everybody on the page's project."
},
"askAgain": {
"type": "boolean",
"default": false,
"description": "true to leave the list alone and ask again everybody who has not read the edition."
},
"teamRoles": {
"type": [
"string",
"null"
],
"default": null,
"description": "The project's team roles by name, as 'a,b'."
}
}
}| query | string | null | Only searches containing this. Search Console only. |
{
"type": "object",
"properties": {
"by": {
"type": [
"string",
"null"
],
"default": null,
"description": "Break down by: query, page, country, device, date, referrer, source or channel. Omit for totals only."
},
"to": {
"type": [
"string",
"null"
],
"default": null,
"description": "Last day, YYYY-MM-DD. Omit for the last day counted."
},
"from": {
"type": [
"string",
"null"
],
"default": null,
"description": "First day, YYYY-MM-DD. Omit for a week before 'to'."
},
"page": {
"type": [
"string",
"null"
],
"default": null,
"description": "Only pages whose address contains this (Search Console), whose path starts with it (Vercel), or sessions whose landing page contains it (Google Analytics)."
},
"site": {
"type": [
"string",
"null"
],
"default": null,
"description": "Which site, e.g. 'sc-domain:example.com', a Vercel project or 'properties/123456789'. Omit when only one is open."
},
"limit": {
"type": [
"integer",
"null"
],
"default": null,
"description": "How many rows, at most 50. Default 10."
},
"query": {
"type": [
"string",
"null"
],
"default": null,
"description": "Only searches containing this. Search Console only."
}
}
}| The comment's id, as returned by get_comments or add_comment. |
{
"type": "object",
"required": [
"key",
"commentId"
],
"properties": {
"key": {
"type": "string",
"description": "Issue key the comment is on, e.g. 'UK-1'."
},
"body": {
"type": [
"string",
"null"
],
"default": null,
"description": "The new body, replacing the old one entirely. Markdown is kept as written, and carries $…$ / $$…$$ LaTeX formulas and [~username] mentions."
},
"edits": {
"type": [
"array",
"null"
],
"items": {
"type": [
"object",
"null"
],
"properties": {
"newText": {
"type": [
"string",
"null"
],
"description": "What to put in its place. An empty string deletes. To insert, put an anchor in 'oldText' and the same anchor plus the addition here."
},
"oldText": {
"type": [
"string",
"null"
],
"description": "The text to replace, exactly as it stands in the Markdown source — whitespace and line breaks included. Must occur exactly once unless 'replaceAll' is set; include a few surrounding words to make it unique."
},
"replaceAll": {
"type": "boolean",
"description": "Replace every occurrence rather than requiring exactly one."
}
}
},
"default": null,
"description": "Exact replacements in the comment, changing part of it in place. Matched against the body as get_comments returns it — stored as written, so what you read is what an 'oldText' has to equal, whitespace and line breaks included. Every edit is looked for in that text, not in what the edits before it produced; if any one does not fit, none is applied."
},
"commentId": {
"type": "integer",
"description": "The comment's id, as returned by get_comments or add_comment."
}
}
}| status | string | null | Status name to move the issue to, e.g. 'In Progress', 'Done'. |
| dueDate | string | null | The day this is due, as YYYY-MM-DD. A calendar day, not a timestamp. Pass an empty string to clear it. |
| summary | string | null | New summary (title). |
| assignee | string | null | Assignee username or email. Pass an empty string to unassign. 'agent:<role>' (e.g. 'agent:product') hands the issue to that agent instead: you become the assignee and the agent works on your behalf — allowed only where a switched-on duty of that role in this project takes issues like this one (list_project_rules shows the duties). |
| priority | string | null | Priority name, e.g. 'High'. |
| parentKey | string | null | Key of the issue this one hangs off, e.g. 'PM-276' — moves it under that story or epic. To DETACH it instead, send detachParent: true; an empty string still works but is easy to lose on the way. Nothing is renamed and the key never changes: an issue keeps the key of the project it lives in. A sub-task must stay in its parent's project; anything else may cross projects. |
| resolution | string | null | Resolution name to set, e.g. 'Fixed', 'Won't Do'. Some workflows require one on the move into a finished state; sending it here is how that condition is met. |
| description | string | null | New description. Markdown, with $…$ / $$…$$ LaTeX formulas and [~username] mentions. |
| fixVersions | string | null | The versions of the project this goes out in, by name, comma-separated: '2.4.0, 2.4.1'. REPLACES the set — to add one, send the ones it has (get_issue's 'fixVersions') with the new one. Pass an empty string to take it out of every version. A name the project does not have refuses the update and lists the ones it has. |
| detachParent | boolean | Take this issue out from under its parent and leave it top-level. The reliable way to detach: unlike an empty parentKey it cannot arrive as the two characters "" or be dropped as «nothing was sent». Refused together with a parentKey, since the two would be asking for opposite things. |
{
"type": "object",
"required": [
"key"
],
"properties": {
"key": {
"type": "string",
"description": "Issue key, e.g. 'UK-1'."
},
"type": {
"type": [
"string",
"null"
],
"default": null,
"description": "New issue type name, e.g. 'Task', 'Bug', 'Story', 'Epic'."
},
"fields": {
"type": [
"string",
"null"
],
"default": null,
"description": "The project's own columns to fill in with this update, by their NAMES: 'Segment=AI; Country=Poland', or a JSON object. Same shape as set_issue_fields — this exists here because a move a workflow conditions on a column has to set it in the same call."
},
"labels": {
"type": [
"string",
"null"
],
"default": null,
"description": "Labels to set, space or comma separated. Replaces the existing set."
},
"status": {
"type": [
"string",
"null"
],
"default": null,
"description": "Status name to move the issue to, e.g. 'In Progress', 'Done'."
},
"dueDate": {
"type": [
"string",
"null"
],
"default": null,
"description": "The day this is due, as YYYY-MM-DD. A calendar day, not a timestamp. Pass an empty string to clear it."
},
"summary": {
"type": [
"string",
"null"
],
"default": null,
"description": "New summary (title)."
},
"assignee": {
"type": [
"string",
"null"
],
"default": null,
"description": "Assignee username or email. Pass an empty string to unassign. 'agent:<role>' (e.g. 'agent:product') hands the issue to that agent instead: you become the assignee and the agent works on your behalf — allowed only where a switched-on duty of that role in this project takes issues like this one (list_project_rules shows the duties)."
},
"priority": {
"type": [
"string",
"null"
],
"default": null,
"description": "Priority name, e.g. 'High'."
},
"parentKey": {
"type": [
"string",
"null"
],
"default": null,
"description": "Key of the issue this one hangs off, e.g. 'PM-276' — moves it under that story or epic. To DETACH it instead, send detachParent: true; an empty string still works but is easy to lose on the way. Nothing is renamed and the key never changes: an issue keeps the key of the project it lives in. A sub-task must stay in its parent's project; anything else may cross projects."
},
"resolution": {
"type": [
"string",
"null"
],
"default": null,
"description": "Resolution name to set, e.g. 'Fixed', 'Won't Do'. Some workflows require one on the move into a finished state; sending it here is how that condition is met."
},
"description": {
"type": [
"string",
"null"
],
"default": null,
"description": "New description. Markdown, with $…$ / $$…$$ LaTeX formulas and [~username] mentions."
},
"fixVersions": {
"type": [
"string",
"null"
],
"default": null,
"description": "The versions of the project this goes out in, by name, comma-separated: '2.4.0, 2.4.1'. REPLACES the set — to add one, send the ones it has (get_issue's 'fixVersions') with the new one. Pass an empty string to take it out of every version. A name the project does not have refuses the update and lists the ones it has."
},
"detachParent": {
"type": "boolean",
"default": false,
"description": "Take this issue out from under its parent and leave it top-level. The reliable way to detach: unlike an empty parentKey it cannot arrive as the two characters \"\" or be dropped as «nothing was sent». Refused together with a parentKey, since the two would be asking for opposite things."
}
}
}| Argument | Type | Description |
|---|---|---|
| id* | integer | The rule's id, from list_project_rules. |
| name | string | null | A new name. |
| type | string | null | Only issues of this type, by name. An empty string means any type. |
| label | string | null | Only issues with this label. An empty string means any label. |
| branch | string | null | For a merge-request event: only a request going into this branch. An empty string means into any. |
| capUsd | number | null | For a duty: what one task may cost, in dollars, at most 5; 0 goes back to the ordinary ceiling. |
| status | string | null | A new state to fire on, by name. |
| enabled | boolean | null | true to switch the rule on, false to switch it off. |
| trigger | string | null | WHEN the rule fires: 'entered', 'versionReleased', 'subtasksDone', 'subtaskStarted', 'branchCreated', 'mrOpened', 'mrMerged', 'mrClosed', 'deployed', 'actChanged' or 'actTouched'. Moving off 'entered' drops the rule's state. |
| template | string | null | A new checklist template (Markdown). Replaces the old one for issues that enter the state from now on; checklists already added stay as they are. |
| agentRole | string | null | For a duty: a new agent role key. |
| doneStatus | string | null | For a duty: a new review state; an empty string and it no longer moves the issue. |
| fromStatus | string | null | Only an issue coming from this state, by name. An empty string means from any. |
| projectKey* | string | Project key, e.g. 'ONB'. |
| agentFields | string | null | For a duty: the whole new list of fields, comma-separated. |
| environment | string | null | For 'deployed': only a deployment to this environment, by name. An empty string means to any. |
| agentActions | string | null | For a duty: the whole new list of actions, comma-separated. |
| moveToStatus | string | null | For a 'move' rule: a new state to move the issue to, by name. |
{
"type": "object",
"required": [
"projectKey",
"id"
],
"properties": {
"id": {
"type": "integer",
"description": "The rule's id, from list_project_rules."
},
"name": {
"type": [
"string",
"null"
],
"default": null,
"description": "A new name."
},
"type": {
"type": [
"string",
"null"
],
"default": null,
"description": "Only issues of this type, by name. An empty string means any type."
},
"label": {
"type": [
"string",
"null"
],
"default": null,
"description": "Only issues with this label. An empty string means any label."
},
"branch": {
"type": [
"string",
"null"
],
"default": null,
"description": "For a merge-request event: only a request going into this branch. An empty string means into any."
},
"capUsd": {
"type": [
"number",
"null"
],
"default": null,
"description": "For a duty: what one task may cost, in dollars, at most 5; 0 goes back to the ordinary ceiling."
},
"status": {
"type": [
"string",
"null"
],
"default": null,
"description": "A new state to fire on, by name."
},
"enabled": {
"type": [
"boolean",
"null"
],
"default": null,
"description": "true to switch the rule on, false to switch it off."
},
"trigger": {
"type": [
"string",
"null"
],
"default": null,
"description": "WHEN the rule fires: 'entered', 'versionReleased', 'subtasksDone', 'subtaskStarted', 'branchCreated', 'mrOpened', 'mrMerged', 'mrClosed', 'deployed', 'actChanged' or 'actTouched'. Moving off 'entered' drops the rule's state."
},
"template": {
"type": [
"string",
"null"
],
"default": null,
"description": "A new checklist template (Markdown). Replaces the old one for issues that enter the state from now on; checklists already added stay as they are."
},
"agentRole": {
"type": [
"string",
"null"
],
"default": null,
"description": "For a duty: a new agent role key."
},
"doneStatus": {
"type": [
"string",
"null"
],
"default": null,
"description": "For a duty: a new review state; an empty string and it no longer moves the issue."
},
"fromStatus": {
"type": [
"string",
"null"
],
"default": null,
"description": "Only an issue coming from this state, by name. An empty string means from any."
},
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'ONB'."
},
"agentFields": {
"type": [
"string",
"null"
],
"default": null,
"description": "For a duty: the whole new list of fields, comma-separated."
},
"environment": {
"type": [
"string",
"null"
],
"default": null,
"description": "For 'deployed': only a deployment to this environment, by name. An empty string means to any."
},
"agentActions": {
"type": [
"string",
"null"
],
"default": null,
"description": "For a duty: the whole new list of actions, comma-separated."
},
"moveToStatus": {
"type": [
"string",
"null"
],
"default": null,
"description": "For a 'move' rule: a new state to move the issue to, by name."
}
}
}| releaseDate |
| string | null |
| The day it is meant to ship, as YYYY-MM-DD. An empty string clears it. |
{
"type": "object",
"required": [
"projectKey",
"version"
],
"properties": {
"name": {
"type": [
"string",
"null"
],
"default": null,
"description": "A new name."
},
"version": {
"type": "string",
"description": "The version, by its name or its id from list_versions."
},
"archived": {
"type": [
"boolean",
"null"
],
"default": null,
"description": "true puts it away; false brings it back."
},
"startDate": {
"type": [
"string",
"null"
],
"default": null,
"description": "The day work on it starts, as YYYY-MM-DD. An empty string clears it."
},
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'ONB'."
},
"description": {
"type": [
"string",
"null"
],
"default": null,
"description": "A new description. An empty string removes it."
},
"releaseDate": {
"type": [
"string",
"null"
],
"default": null,
"description": "The day it is meant to ship, as YYYY-MM-DD. An empty string clears it."
}
}
}| expectedVersion | integer | null | The version you read (from get_wiki_page). If the comment has moved on since, the edit is refused instead of overwriting somebody else's. |
| inlineSelection | string | null | Move the inline anchor: the page text this comment should point at, copied exactly from the page. An empty string detaches it, making it a footer comment. Refused when the page does not carry that text, or carries it more than once and 'inlineMatch' does not say which — never resolved by guessing. |
{
"type": "object",
"required": [
"commentId"
],
"properties": {
"edits": {
"type": [
"array",
"null"
],
"items": {
"type": [
"object",
"null"
],
"properties": {
"newText": {
"type": [
"string",
"null"
],
"description": "What to put in its place. An empty string deletes. To insert, put an anchor in 'oldText' and the same anchor plus the addition here."
},
"oldText": {
"type": [
"string",
"null"
],
"description": "The text to replace, exactly as it stands in the Markdown source — whitespace and line breaks included. Must occur exactly once unless 'replaceAll' is set; include a few surrounding words to make it unique."
},
"replaceAll": {
"type": "boolean",
"description": "Replace every occurrence rather than requiring exactly one."
}
}
},
"default": null,
"description": "Exact replacements in the comment's Markdown — the text get_wiki_page returns as a comment's 'markdown'. Every 'oldText' is matched against it as you read it (not against the result of the other edits) and must occur exactly once unless 'replaceAll' is set; if any edit does not fit, none is applied."
},
"markdown": {
"type": [
"string",
"null"
],
"default": null,
"description": "The whole comment, replacing what is there. Markdown, which also carries $…$ / $$…$$ LaTeX formulas."
},
"commentId": {
"type": "integer",
"description": "The comment's id, as get_wiki_page lists it or add_wiki_comment returned."
},
"inlineMatch": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Which occurrence of 'inlineSelection' on the page to anchor to, counted from 1. Only needed when the text occurs more than once."
},
"expectedVersion": {
"type": [
"integer",
"null"
],
"default": null,
"description": "The version you read (from get_wiki_page). If the comment has moved on since, the edit is refused instead of overwriting somebody else's."
},
"inlineSelection": {
"type": [
"string",
"null"
],
"default": null,
"description": "Move the inline anchor: the page text this comment should point at, copied exactly from the page. An empty string detaches it, making it a footer comment. Refused when the page does not carry that text, or carries it more than once and 'inlineMatch' does not say which — never resolved by guessing."
}
}
}| string | null |
| Labels to set, space or comma separated. Replaces the existing set. Stored in lower case, except a label starting with '$', which is kept exactly as written; list_wiki_labels shows the ones the space already uses. |
| message | string | null | Short note for the page history, e.g. why you changed it. |
| markdown | string | null | The complete new body as Markdown — replaces what is there. Carries $…$ / $$…$$ LaTeX formulas and the wiki's macros on a line of their own ({toc}, {children}, {info} … {info}, {expand:title=…} … {expand}). A theorem, lemma, proposition, corollary, conjecture or question is a block of its own — ::: theorem {#thm:label status=computer number=5.8 title="…"} on its line, the statement, then ::: — read into the project's register of claims at the save (list_claims); 'claims' in the answer says which. |
| newTitle | string | null | New title. The page's existing links follow the rename. |
| parentId | integer | null | Move the page under this parent page id. |
| spaceKey | string | null | Space key, when identifying the page by title. |
| minorEdit | boolean | Mark this as a minor edit in the history. |
| toTopLevel | boolean | Move the page to the top of its space, out from under any parent, so it sits beside the space's other root pages. Use this instead of parentId/parentTitle — a tool argument has no way to say 'no parent' by leaving one out. |
| parentTitle | string | null | Move the page under the page with this title, in the same space. |
| appendMarkdown | string | null | Markdown to add to the end of the page, leaving the rest as it is. Same syntax as 'markdown'. |
| replaceSection | object | null | Replace one whole section: 'section' names it as get_wiki_page's 'section' does (anchor or heading text), 'markdown' is what replaces it — heading line included, as reading the section returned it. Can be combined with 'edits' elsewhere on the page. |
| expectedVersion | integer | null | The version you read (from get_wiki_page). If the page has moved on since, the edit is refused instead of overwriting someone else's. |
{
"type": "object",
"properties": {
"id": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Page id (as returned by search_wiki)."
},
"edits": {
"type": [
"array",
"null"
],
"items": {
"type": [
"object",
"null"
],
"properties": {
"newText": {
"type": [
"string",
"null"
],
"description": "What to put in its place. An empty string deletes. To insert, put an anchor in 'oldText' and the same anchor plus the addition here."
},
"oldText": {
"type": [
"string",
"null"
],
"description": "The text to replace, exactly as it stands in the Markdown source — whitespace and line breaks included. Must occur exactly once unless 'replaceAll' is set; include a few surrounding words to make it unique."
},
"replaceAll": {
"type": "boolean",
"description": "Replace every occurrence rather than requiring exactly one."
}
}
},
"default": null,
"description": "Exact replacements in the page's Markdown source — the text get_wiki_page returns with 'section', 'offset' or withMarkdown: true. Every 'oldText' is matched against the page as you read it (not against the result of the other edits) and must occur exactly once unless 'replaceAll' is set; if any edit does not fit, none is applied. Pair with 'expectedVersion'."
},
"title": {
"type": [
"string",
"null"
],
"default": null,
"description": "Current page title, when identifying the page by title."
},
"labels": {
"type": [
"string",
"null"
],
"default": null,
"description": "Labels to set, space or comma separated. Replaces the existing set. Stored in lower case, except a label starting with '$', which is kept exactly as written; list_wiki_labels shows the ones the space already uses."
},
"message": {
"type": [
"string",
"null"
],
"default": null,
"description": "Short note for the page history, e.g. why you changed it."
},
"markdown": {
"type": [
"string",
"null"
],
"default": null,
"description": "The complete new body as Markdown — replaces what is there. Carries $…$ / $$…$$ LaTeX formulas and the wiki's macros on a line of their own ({toc}, {children}, {info} … {info}, {expand:title=…} … {expand}). A theorem, lemma, proposition, corollary, conjecture or question is a block of its own — ::: theorem {#thm:label status=computer number=5.8 title=\"…\"} on its line, the statement, then ::: — read into the project's register of claims at the save (list_claims); 'claims' in the answer says which."
},
"newTitle": {
"type": [
"string",
"null"
],
"default": null,
"description": "New title. The page's existing links follow the rename."
},
"parentId": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Move the page under this parent page id."
},
"spaceKey": {
"type": [
"string",
"null"
],
"default": null,
"description": "Space key, when identifying the page by title."
},
"minorEdit": {
"type": "boolean",
"default": false,
"description": "Mark this as a minor edit in the history."
},
"toTopLevel": {
"type": "boolean",
"default": false,
"description": "Move the page to the top of its space, out from under any parent, so it sits beside the space's other root pages. Use this instead of parentId/parentTitle — a tool argument has no way to say 'no parent' by leaving one out."
},
"parentTitle": {
"type": [
"string",
"null"
],
"default": null,
"description": "Move the page under the page with this title, in the same space."
},
"appendMarkdown": {
"type": [
"string",
"null"
],
"default": null,
"description": "Markdown to add to the end of the page, leaving the rest as it is. Same syntax as 'markdown'."
},
"replaceSection": {
"type": [
"object",
"null"
],
"default": null,
"properties": {
"section": {
"type": [
"string",
"null"
],
"description": "The section to replace: its anchor as get_wiki_page(outline: true) gives it, or its heading text."
},
"markdown": {
"type": [
"string",
"null"
],
"description": "The Markdown that replaces it, heading line included — the section as get_wiki_page(section: …) returned it, changed. An empty string removes the section."
}
},
"description": "Replace one whole section: 'section' names it as get_wiki_page's 'section' does (anchor or heading text), 'markdown' is what replaces it — heading line included, as reading the section returned it. Can be combined with 'edits' elsewhere on the page."
},
"expectedVersion": {
"type": [
"integer",
"null"
],
"default": null,
"description": "The version you read (from get_wiki_page). If the page has moved on since, the edit is refused instead of overwriting someone else's."
}
}
}{
"type": "object",
"required": [
"projectKey"
],
"properties": {
"id": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Existing connection id to update; omit to create a new one."
},
"url": {
"type": [
"string",
"null"
],
"default": null,
"description": "MCP server URL — use https (required when creating)."
},
"name": {
"type": [
"string",
"null"
],
"default": null,
"description": "Connection display name (required when creating)."
},
"token": {
"type": [
"string",
"null"
],
"default": null,
"description": "Bearer auth token. Omit to keep the current token when updating."
},
"enabled": {
"type": [
"boolean",
"null"
],
"default": null,
"description": "Whether the connection is enabled."
},
"forAgents": {
"type": [
"boolean",
"null"
],
"default": null,
"description": "Whether the project's agents (called by a mention, a reply or a duty) also get this server's read-only tools. Off by default."
},
"projectKey": {
"type": "string",
"description": "Project key, e.g. 'UK'."
}
}
}