{"name":"tech.kaiku/kaiku","slug":"kaiku","title":"Kaiku","description":"Issue tracker and wiki for teams and their agents: find, file and update issues, write pages.","url":"https://mcp.market/server/kaiku","rating":null,"grade":"B","score":79,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":8,"stars":null,"forks":null,"downloads_week":null,"last_push_at":null,"license":null},"uptime":{"percent":100,"checks":28,"ok":28,"last_checked_at":"2026-11-04T11:11:08.692Z","last_ok_at":"2026-11-04T11:11:08.692Z","latency_ms":136},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":null,"website":"https://kaiku.tech/en/docs/mcp?utm_source=mcp-registry","version":"1.3.0","remotes":[{"type":"streamable-http","url":"https://app.kaiku.tech/mcp"},{"type":"streamable-http","url":"https://mcp.kaiku.tech/mcp","headers":[{"description":"Leave empty to sign in through the browser (OAuth); or Bearer <token> made in Settings → Connect over MCP; the token says which workspace","isSecret":true,"name":"Authorization"}]},{"type":"streamable-http","url":"https://{workspace}.kaiku.tech/mcp","headers":[{"description":"Leave empty to sign in through the browser (OAuth); or Bearer <token> made in Settings → Connect over MCP","isSecret":true,"name":"Authorization"}],"variables":{"workspace":{"description":"Your workspace: the company name in front of kaiku.tech in the address you sign in at","isRequired":true}}}],"packages":[],"tools":[{"name":"add_attachment","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Issue key, e.g. 'UK-1'.","type":"string"},"filename":{"description":"File name to store, e.g. 'report.pdf'. Any directory part is dropped.","type":"string"},"contentBase64":{"description":"The file's bytes, base64-encoded (a 'data:…;base64,…' URL is accepted and unwrapped). Use 'text' instead when the file is text.","type":["string","null"],"default":null},"text":{"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.","type":["string","null"],"default":null},"mimeType":{"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.","type":["string","null"],"default":null}},"required":["key","filename"]}},{"name":"add_comment","description":"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).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Issue key, e.g. 'UK-1'.","type":"string"},"body":{"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).","type":"string"},"replyTo":{"description":"The comment this one answers, as returned by get_comments — on the same issue and not deleted.","type":["integer","null"],"default":null}},"required":["key","body"]}},{"name":"add_legal_reference","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"url":{"description":"The act's address, e.g. 'https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32015L0849'.","type":"string"},"issue":{"description":"Issue key, e.g. 'UK-1'. Either this or 'page'.","type":["string","null"],"default":null},"page":{"description":"Wiki page id. Either this or 'issue'.","type":["integer","null"],"default":null},"place":{"description":"The place in the act, in words, e.g. 'Article 18'.","type":["string","null"],"default":null},"commentId":{"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.","type":["integer","null"],"default":null}},"required":["url"]}},{"name":"add_to_showcase","description":"Show one issue, one wiki page or one claim of a PRIVATE project in a public project of the same company — by reference, not as a copy: anybody, signed in or not, can then read that issue (with its comments and files) or that page as it is now, and every later edit; the rest of its project stays closed, and its links to other closed things are counted, never named. A claim is shown with its statement and its status as the register says it — the same status inside and outside — and is cited on the public project's pages by its label. Give exactly one of issueKey, pageId or claimId. Only the owner of the project it belongs to may, and only if they also administer the public project; the public project must be public. Written to both projects' journals. Confirm with the person first: what it shows becomes readable by the whole internet.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Key of the public project that will show it, e.g. 'D5'.","type":"string"},"issueKey":{"description":"The issue to show, e.g. 'MATH-41'.","type":["string","null"],"default":null},"pageId":{"description":"The wiki page to show, by its id.","type":["integer","null"],"default":null},"edition":{"description":"For a page: 'current' (default) shows its words as they are now and every later edit; 'approved' shows only its edition in force (approve_wiki_page) — later edits stay unseen until approved, and the page shows nothing while no approval stands. Asking again with the other word switches a page already shown.","type":["string","null"],"default":null},"claimId":{"description":"The claim to show, by its id (list_claims): its statement and its status, which moves with the register's journal; the journal itself is not shown.","type":["integer","null"],"default":null}},"required":["projectKey"]}},{"name":"add_wiki_attachment","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"filename":{"description":"File name to store, e.g. 'diagram.png'. Any directory part is dropped.","type":"string"},"contentBase64":{"description":"The file's bytes, base64-encoded (a 'data:…;base64,…' URL is accepted and unwrapped). Use 'text' instead when the file is text.","type":["string","null"],"default":null},"text":{"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.","type":["string","null"],"default":null},"pageId":{"description":"Page id (as returned by search_wiki).","type":["integer","null"],"default":null},"spaceKey":{"description":"Space key, when identifying the page by title.","type":["string","null"],"default":null},"title":{"description":"Exact page title, when identifying the page by title.","type":["string","null"],"default":null},"comment":{"description":"Short note about this upload, shown in the page's attachment list.","type":["string","null"],"default":null},"mimeType":{"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.","type":["string","null"],"default":null}},"required":["filename"]}},{"name":"add_wiki_comment","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"body":{"description":"Comment body as Markdown, which also carries $…$ / $$…$$ LaTeX formulas.","type":"string"},"pageId":{"description":"Page id (as returned by search_wiki).","type":["integer","null"],"default":null},"spaceKey":{"description":"Space key, when identifying the page by title.","type":["string","null"],"default":null},"title":{"description":"Exact page title, when identifying the page by title.","type":["string","null"],"default":null},"replyTo":{"description":"The comment this one answers, as returned by get_wiki_page.","type":["integer","null"],"default":null}},"required":["body"]}},{"name":"admin_bank_transfer","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"admin_errors_week","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"weeksAgo":{"description":"0 is the last full week, 1 the one before it.","type":"integer","default":0}}}},{"name":"admin_funnel","description":"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. 'firstSession' is the same cohort with our own companies left out (admin_set_workspace_ours): for each step a new company is led to — board, project, issue, wiki, token, agent, invite — how many took it ('known' leaves out companies registered before the step was recorded), 'stoppedAt' the first step each did not take, and 'firstWeek' how many filed at least five issues in their first seven days, counted only once the week is over. 'segments' splits the same outside cohort by what each company came for — 'legal', 'agents', 'jira-dc' — by the landing's mark, the start chosen on the form or a fact of its own (an agent's sign-up over MCP; an import from Jira), each with registered, activated and converted; segments overlap, and 'unknown' names the machines that have not said the own fact — never zero. Default period: the last 90 days.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"days":{"description":"How many days back from today. Defaults to 90, at most 730. Ignored when 'from' and 'to' are given.","type":["integer","null"],"default":null},"from":{"description":"Start of the period, as YYYY-MM-DD. Use with 'to'.","type":["string","null"],"default":null},"to":{"description":"End of the period, as YYYY-MM-DD, included. Use with 'from'.","type":["string","null"],"default":null}}}},{"name":"admin_invoices","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"slug":{"description":"Only invoices of the company at this address.","type":["string","null"],"default":null},"status":{"description":"Only invoices in this state, e.g. 'open', 'paid', 'void'.","type":["string","null"],"default":null},"limit":{"description":"How many rows, newest first. Default 50, at most 100.","type":"integer","default":50}}}},{"name":"admin_landing_week","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"weeksAgo":{"description":"0 is the last full week, 1 the one before it.","type":"integer","default":0}}}},{"name":"admin_load","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"days":{"description":"Window for model spend, in days. Default 30; 0 means all time.","type":"integer","default":30}}}},{"name":"admin_overview","description":"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'.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"admin_set_bank_transfer","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"enabled":{"description":"Whether this installation takes transfers. On is refused while a required field is missing; off never is.","type":"boolean"},"beneficiary":{"description":"Who the money is sent to — the account holder's name as the bank has it.","type":["string","null"],"default":null},"account":{"description":"The account number or IBAN.","type":["string","null"],"default":null},"accountCurrency":{"description":"The account's OWN currency, e.g. 'AMD'. Bills stay in USD; this is what the receiving bank converts into.","type":["string","null"],"default":null},"bankName":{"description":"The bank's name and address.","type":["string","null"],"default":null},"swift":{"description":"The bank's SWIFT/BIC.","type":["string","null"],"default":null},"intermediaryBank":{"description":"The intermediary bank's name, where one is needed.","type":["string","null"],"default":null},"intermediarySwift":{"description":"The intermediary bank's SWIFT/BIC.","type":["string","null"],"default":null},"intermediaryAccount":{"description":"Our account at the intermediary bank.","type":["string","null"],"default":null},"purpose":{"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}'.","type":["string","null"],"default":null},"daysToArrive":{"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).","type":["integer","null"],"default":null},"minimumUsd":{"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.","type":["number","null"],"default":null},"note":{"description":"A line for the payer, e.g. which charges are whose. Shown with the details.","type":["string","null"],"default":null}},"required":["enabled"]}},{"name":"admin_set_workspace_ours","description":"Administrators only, and this one CHANGES things: mark a company as one of ours — our own, a test somebody here made — or take the mark off. The funnel's 'firstSession' leaves our companies out, so that 'external' means somebody who came from outside. A company that is not billed, or the demo, is ours whatever the mark says. Answers the company's row with 'ours' and 'oursBy' (marked, not-billed, demo).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"slug":{"description":"The company's slug, as admin_workspaces lists it.","type":"string"},"ours":{"description":"True to mark it ours, false to take the mark off.","type":"boolean"}},"required":["slug","ours"]}},{"name":"admin_workspace_journal","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"slug":{"description":"The company's address — 'acme' in acme.kaiku.tech.","type":"string"}},"required":["slug"]}},{"name":"admin_workspaces","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"status":{"description":"Only companies in this state: 'trial', 'active', 'free', 'over-limit', 'expired', 'suspended'.","type":["string","null"],"default":null},"endingInDays":{"description":"Only companies whose paid-for period ends within this many days. 0 means already run out.","type":["integer","null"],"default":null},"slug":{"description":"Only the company at this address ('acme' in acme.kaiku.tech).","type":["string","null"],"default":null},"withOwners":{"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.","type":"boolean","default":false}}}},{"name":"answer_issue_question","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"questionId":{"description":"The question's id, as returned by list_issue_questions or ask_issue_question.","type":"integer"},"option":{"description":"Which option to choose, counted from 0 in the order they were offered.","type":"integer"},"note":{"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.","type":["string","null"],"default":null}},"required":["questionId","option"]}},{"name":"answer_review_remark","description":"Answer a remark of a page's review (see get_wiki_page_reviews). As the page's author — whoever may edit it — 'fixed': true says it is put right in the version the page is at now, false that it still stands (it is then compared with this version, so the next edit asks again); 'note' says how. As its reviewer — or the project's lead — 'action': 'reopen' puts a remark said fixed back as standing, 'withdraw' takes it back. The reviewer is told of an author's answer.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"remarkId":{"description":"The remark's id.","type":"integer"},"fixed":{"description":"The author's answer: true fixed, false still stands.","type":["boolean","null"],"default":null},"note":{"description":"What was done, or why it stands.","type":["string","null"],"default":null},"action":{"description":"The reviewer's instead: 'reopen' or 'withdraw'.","type":["string","null"],"default":null}},"required":["remarkId"]}},{"name":"approve_wiki_page","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"Page id.","type":"integer"},"version":{"description":"The version you read and are approving.","type":"integer"},"note":{"description":"An optional note kept with the approval, e.g. the decision it rests on.","type":["string","null"],"default":null}},"required":["id","version"]}},{"name":"ask_issue_question","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Issue key, e.g. 'UK-1'.","type":"string"},"to":{"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.","type":"string"},"question":{"description":"The question itself. Keep it to what the options answer.","type":"string"},"options":{"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.","type":"array","items":{"type":"string"}},"defaultOption":{"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.","type":["integer","null"],"default":null},"ttlHours":{"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.","type":["integer","null"],"default":null},"allowFreeText":{"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.","type":"boolean","default":true}},"required":["key","to","question","options"]}},{"name":"ask_wiki_page_approval","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"Page id.","type":"integer"},"who":{"description":"Usernames or e-mails, as 'a,b'. Take them from list_users.","type":"string"},"note":{"description":"A line for the people asked — what changed, by when.","type":["string","null"],"default":null},"release":{"description":"true to take these people off the page's list instead of asking them.","type":"boolean","default":false}},"required":["id","who"]}},{"name":"check_checklist_item","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Issue key, e.g. 'UK-1'.","type":"string"},"id":{"description":"The item's id, from get_checklist.","type":"string"},"checked":{"description":"true to tick the item, false to untick it.","type":"boolean","default":true}},"required":["key","id"]}},{"name":"check_source","description":"Check a source of a project's register against the open services now: its arXiv id against arXiv, its DOI against Crossref, its zbMATH number against zbMATH Open — whether the work is there and whether its authors (by surname), title and year are the record's. Every service agreeing makes it 'api' (checked by a service) and takes the † off; a service disagreeing or not having the work makes it 'mismatch' with the reason field by field, with the †; a service that does not answer changes nothing and is said in 'silent'. A source a person checked against the original, or a mismatch a person set, keeps their word: what the services say otherwise comes back as 'serviceNote', without the †. 'newerVersion' says arXiv has a later version than the one checked. MR and ISBN are asked nowhere. Sources are also checked by themselves when an identifier is written and weekly, so call this only when the person wants it now; at most 30 a project an hour, answers kept a day per identifier. Members of the project who may write only.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"The source's id, as list_sources returned it.","type":["integer","null"],"default":null},"project":{"description":"The project key, with 'source'.","type":["string","null"],"default":null},"source":{"description":"Its key or an identifier it has, with 'project'.","type":["string","null"],"default":null}}}},{"name":"cite","description":"How to cite a work of a project's register in a text you write: give its key or any identifier in any shape ('arXiv:2301.01234', a DOI or its address, 'MR1234567', 'Zbl 1234.56789', an ISBN) and get 'cite' — '[@KEY]', what to put in a page, a comment or a description — the 'reference' line a bibliography prints (with † while it is unchecked or disagrees with what it names), and its BibTeX entry for a paper. Use it rather than typing a reference out by hand, so every text names one row. When the register does not have it, 'found' is false and, where what you gave is an identifier, 'offer' says which: add the source with set_source (that identifier, a key and its title) before citing it. Anybody who sees the project.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project":{"description":"The project key, e.g. MATH.","type":"string"},"source":{"description":"The source's key ('IMP26') or an identifier of the work, in any shape.","type":"string"}},"required":["project","source"]}},{"name":"code_calls","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"symbol":{"description":"The symbol, e.g. 'IssueTransition.MoveAsync'. A bare name works when only one symbol has it.","type":"string"},"direction":{"description":"'callers' (who uses it, the default) or 'callees' (what it uses).","type":["string","null"],"default":null},"depth":{"description":"How many rings out: 1 (default) to 3.","type":"integer","default":1},"repo":{"description":"Which repository, as 'group/repo'. Omit to ask every repository open here.","type":["string","null"],"default":null},"path":{"description":"The path of the symbol's file, or part of it, when its name is not enough.","type":["string","null"],"default":null}},"required":["symbol"]}},{"name":"code_symbols","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"description":"The symbol's name, e.g. 'MoveAsync', or 'IssueTransition.MoveAsync' to say whose.","type":"string"},"repo":{"description":"Which repository, as 'group/repo'. Omit to ask every repository open here.","type":["string","null"],"default":null},"path":{"description":"Keep only declarations in files whose path contains this.","type":["string","null"],"default":null}},"required":["name"]}},{"name":"connect_repository","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Key of the project, e.g. 'LIB'.","type":"string"},"url":{"description":"The repository's address, e.g. 'https://github.com/owner/repo'. github.com is GitHub; any other host is taken for a GitLab.","type":"string"},"openSource":{"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.","type":"boolean","default":false}},"required":["projectKey","url"]}},{"name":"create_chat","description":"Open a chat. kind 'direct': the chat with one colleague ('with') — there is one per pair, so an existing one is found rather than made ('created' false). kind 'group': a group with a title and its members, you its administrator. kind 'agent': a chat of your own with one of the company's agents ('agent', e.g. 'product'), found if you have one. Only the company's own people. A project's chat is never made — it is there for every project; list_chats with projectKey finds it.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"kind":{"description":"'direct', 'group' or 'agent'.","type":"string"},"with":{"description":"For 'direct': the colleague's username or email.","type":["string","null"],"default":null},"title":{"description":"For 'group': its title.","type":["string","null"],"default":null},"members":{"description":"For 'group': the members besides you, by username or email.","type":["array","null"],"items":{"type":["string","null"]},"default":null},"agent":{"description":"For 'agent': the agent's role key or handle, e.g. 'product' or 'agent:product'.","type":["string","null"],"default":null}},"required":["kind"]}},{"name":"create_claim_embed","description":"Put one claim of a project on other sites (PM-1165, PM-1166): a link anybody can open with no account, which shows its kind, number, title, statement with its formulas and status — never its bases, journal or review — and, while the project is public, the page it rests on. Answers with the ready code: 'script' once per page and 'mark' around the words on the site, which open the claim in a cloud, or 'iframe', a card. Name it by 'id', or by 'project' and 'label'. 'sites' and 'days' as for create_term_embed. Only for somebody who may write in the project; a line in its history.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"The claim's id, as list_claims returned it. Or name it by 'project' and 'label'.","type":["integer","null"],"default":null},"project":{"description":"The project key, with 'label'.","type":["string","null"],"default":null},"label":{"description":"The claim's label, e.g. 'thm:d5-rank5', with 'project'.","type":["string","null"],"default":null},"sites":{"description":"Sites that may show it, comma-separated, as https://example.org. Optional: none is any site.","type":["string","null"],"default":null},"days":{"description":"Days the link answers, 1 to 3650. Optional: none is until it is removed.","type":["integer","null"],"default":null}}}},{"name":"create_credential","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"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.","type":"string"},"issueKey":{"description":"Issue key, e.g. 'UK-1'.","type":["string","null"],"default":null},"pageId":{"description":"Wiki page id.","type":["integer","null"],"default":null},"value":{"description":"The secret itself. Leave it out to get a 'form' link where the person types it themselves.","type":["string","null"],"default":null},"readers":{"description":"Who else may read it, comma-separated usernames or emails (see list_users): 'ivan,olga'. Leave it out for nobody else.","type":["string","null"],"default":null}},"required":["name"]}},{"name":"create_embed_set","description":"Put a list of a project's terms and claims on other sites under ONE link (PM-1167) — for an article that cites many: the site puts 'script' in once and marks its words by name, <span data-kaiku-term=\"kernel\"> or data-kaiku-claim=\"thm:d5-rank5\", each opening its cloud. Only what the list names goes out, each thing as its own link would show it; a name not on it says so and nothing of the project. The list is given by hand: 'terms' — ids, words or spellings — and 'claims' — ids or labels — comma-separated, each one you may put out alone (a confirmed term you may open); the first that is not is the refusal and nothing is made. At most 200 things a set and 20 sets a project. A set has no card. 'sites' and 'days' as for create_term_embed. Only for somebody who may write in the project; a line in its history.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"project":{"description":"The project key, e.g. MATH.","type":"string"},"terms":{"description":"Terms, comma-separated: ids, words or spellings.","type":["string","null"],"default":null},"claims":{"description":"Claims, comma-separated: ids or labels.","type":["string","null"],"default":null},"title":{"description":"The set's name, e.g. the article's; up to 120 characters. Optional.","type":["string","null"],"default":null},"sites":{"description":"Sites that may show it, comma-separated, as https://example.org. Optional: none is any site.","type":["string","null"],"default":null},"days":{"description":"Days the link answers, 1 to 3650. Optional: none is until it is removed.","type":["integer","null"],"default":null}},"required":["project"]}},{"name":"create_issue","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'UK'.","type":"string"},"summary":{"description":"Issue summary (title).","type":"string"},"description":{"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).","type":["string","null"],"default":null},"type":{"description":"Issue type name, e.g. 'Task', 'Bug', 'Story', 'Epic'. Defaults to 'Task'.","type":["string","null"],"default":null},"assignee":{"description":"Assignee username or email. Omit to leave unassigned.","type":["string","null"],"default":null},"priority":{"description":"Priority name, e.g. 'High'.","type":["string","null"],"default":null},"labels":{"description":"Labels to set, space or comma separated.","type":["string","null"],"default":null},"dueDate":{"description":"The day this is due, as YYYY-MM-DD. A calendar day, not a timestamp — do not send a time or a zone.","type":["string","null"],"default":null},"parentKey":{"description":"Parent issue key, to create this as a child/sub-task.","type":["string","null"],"default":null},"teamRole":{"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.","type":["string","null"],"default":null},"order":{"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.","type":["integer","null"],"default":null},"fixVersions":{"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.","type":["string","null"],"default":null}},"required":["projectKey","summary"]}},{"name":"create_issue_from_chat_message","description":"Make an issue of a message in one of the company's chats — or of a thread of them — in one step, as the screen's «Make an issue» does (PM-1237). The description quotes the messages (who wrote each and when) unless you give your own, and always ends with a link back to the message, which opens only for the chat's people; the messages' files are copied onto the issue; the message shows «→ KEY» to whoever may open the issue. Filed as create_issue files — your rights in that project, its rules, its watchers. A project's chat files into its project when projectKey is omitted; any other chat needs projectKey. Answers like create_issue, with 'files' copied.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"chatId":{"description":"The chat's id, as the chat's address /chats/{id} has it.","type":"integer"},"messageId":{"description":"The message's id — the one the issue is made of; its author may be the reporter.","type":"integer"},"alsoMessageIds":{"description":"Other messages of the same chat to quote with it, by id — a thread. At most 50 in all.","type":["array","null"],"items":{"type":"integer"},"default":null},"projectKey":{"description":"Project key. Defaults to the project of a project's chat; required for any other chat.","type":["string","null"],"default":null},"summary":{"description":"Issue summary (title). Defaults to the message's first line.","type":["string","null"],"default":null},"description":{"description":"Issue description, Markdown. Defaults to the messages quoted; the link back to the chat is added after it either way.","type":["string","null"],"default":null},"type":{"description":"Issue type name. Defaults to 'Task'.","type":["string","null"],"default":null},"assignee":{"description":"Assignee username or email.","type":["string","null"],"default":null},"priority":{"description":"Priority name.","type":["string","null"],"default":null},"labels":{"description":"Labels, space or comma separated.","type":["string","null"],"default":null},"dueDate":{"description":"Due day, YYYY-MM-DD.","type":["string","null"],"default":null},"parentKey":{"description":"Parent issue key.","type":["string","null"],"default":null},"reporterIsAuthor":{"description":"Make the message's author the reporter instead of you — refused when they cannot open the project.","type":"boolean","default":false},"copyFiles":{"description":"Copy the messages' files onto the issue. Default true.","type":"boolean","default":true}},"required":["chatId","messageId"]}},{"name":"create_project","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Project key, 2–10 characters: a letter followed by letters or digits, e.g. 'BGS'. Uppercased.","type":"string"},"name":{"description":"Project name, e.g. 'Background agents'.","type":"string"},"description":{"description":"What the project is for. Markdown.","type":["string","null"],"default":null},"lead":{"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.","type":["string","null"],"default":null},"projectTypeKey":{"description":"Jira project type: 'software' (the default), 'business' or 'service_desk'.","type":["string","null"],"default":null},"parentKey":{"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.","type":["string","null"],"default":null},"openSourceRepo":{"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.","type":["string","null"],"default":null}},"required":["key","name"]}},{"name":"create_project_rule","description":"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; 'claimBasisChanged' fires on the issues that cite a claim ([thm:…], [claim:…]) whose legal basis is such an act, once per new text and claim; 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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'ONB'.","type":"string"},"name":{"description":"What the rule is called, e.g. 'Document pack'. At most 120 characters.","type":"string"},"status":{"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.","type":"string"},"template":{"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.","type":"string"},"type":{"description":"Only issues of this type, by name, e.g. 'Bug'. Leave out for any type.","type":["string","null"],"default":null},"label":{"description":"Only issues carrying this label (one word). Leave out for any label.","type":["string","null"],"default":null},"enabled":{"description":"Whether the rule is on from the start. Default true.","type":"boolean","default":true},"action":{"description":"'checklist' (the default), 'move' to move the issue to 'moveToStatus', or 'agent' for a duty. Fixed once the rule exists.","type":["string","null"],"default":null},"agentRole":{"description":"For a duty: the agent role's key, e.g. 'product'.","type":["string","null"],"default":null},"agentActions":{"description":"For a duty: what the agent may do beyond commenting, comma-separated — describe, subtasks, ask, wiki, report, support, jira.","type":["string","null"],"default":null},"agentFields":{"description":"For a duty: the fields it may set, comma-separated — priority, labels, duedate, or a project field's name.","type":["string","null"],"default":null},"doneStatus":{"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.","type":["string","null"],"default":null},"capUsd":{"description":"For a duty: what one task may cost, in dollars, when more than the ordinary ceiling is needed. At most 5.","type":["number","null"],"default":null},"trigger":{"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, or 'claimBasisChanged' when a claim the issue cites rests on an act that changed. For any but 'entered', pass an empty 'status'.","type":["string","null"],"default":null},"fromStatus":{"description":"Only an issue coming from this state, by name. Leave out for any.","type":["string","null"],"default":null},"moveToStatus":{"description":"For action 'move': the state the issue is moved to, by name — finished ones included.","type":["string","null"],"default":null},"branch":{"description":"For 'mrOpened', 'mrMerged' and 'mrClosed': only a merge request going into this branch, e.g. 'main'. Leave out for any.","type":["string","null"],"default":null},"environment":{"description":"For 'deployed': only a deployment to this environment of the project, by name, e.g. 'staging'. Leave out for any.","type":["string","null"],"default":null}},"required":["projectKey","name","status","template"]}},{"name":"create_term_embed","description":"Put one confirmed term of a project on other sites (PM-1165, PM-1166): a link anybody can open with no account, which shows the term's word, its definition with its formulas and — while the project is public — where it is defined; nothing else of the project. Answers with the ready code: 'script' once per page and 'mark' around the words on the site, which open the term in a cloud, or 'iframe', a card. Name the term by 'id' (list_terms), or by 'project' and 'term' — its word or any spelling. 'sites' limits which sites may show it (https://example.org each; none is any); 'days' gives it a term (none is until removed). Only for somebody who may write in the project and open the term's source; a line in the project's history. For many terms of one article, create_embed_set gives one link for all of them.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"The term's id, as list_terms returned it. Or name it by 'project' and 'term'.","type":["integer","null"],"default":null},"project":{"description":"The project key, with 'term'.","type":["string","null"],"default":null},"term":{"description":"The term's word or one of its spellings, with 'project'.","type":["string","null"],"default":null},"sites":{"description":"Sites that may show it, comma-separated, as https://example.org. Optional: none is any site.","type":["string","null"],"default":null},"days":{"description":"Days the link answers, 1 to 3650. Optional: none is until it is removed.","type":["integer","null"],"default":null}}}},{"name":"create_version","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'ONB'.","type":"string"},"name":{"description":"The version's name, e.g. '2.4.0'.","type":"string"},"description":{"description":"What is in it, in a sentence.","type":["string","null"],"default":null},"startDate":{"description":"The day work on it starts, as YYYY-MM-DD.","type":["string","null"],"default":null},"releaseDate":{"description":"The day it is meant to ship, as YYYY-MM-DD.","type":["string","null"],"default":null}},"required":["projectKey","name"]}},{"name":"create_wiki_embed","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"Page id.","type":"integer"},"block":{"description":"The block's number among the page's blocks of its language, from 1 — 'block' in get_wiki_page's 'anims'.","type":"integer"},"language":{"description":"'anim' (default) or 'anim-js'.","type":["string","null"],"default":null},"caption":{"description":"A line shown under the scene. Optional.","type":["string","null"],"default":null},"sites":{"description":"Sites that may frame it, comma-separated, as https://example.org. Optional: none is any site.","type":["string","null"],"default":null},"days":{"description":"Days the link answers, 1 to 3650. Optional: none is until it is removed.","type":["integer","null"],"default":null}},"required":["id","block"]}},{"name":"create_wiki_page","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"spaceKey":{"description":"Space key, e.g. 'PM'. Every project has exactly one space, keyed like the project.","type":"string"},"title":{"description":"Page title. Must be unique within the space — the title is how pages are addressed here.","type":"string"},"markdown":{"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.","type":["string","null"],"default":null},"parentId":{"description":"Parent page id. Omit to hang the page off the space home page.","type":["integer","null"],"default":null},"parentTitle":{"description":"Parent page title, as an alternative to 'parentId'. Must be a page in the same space.","type":["string","null"],"default":null},"labels":{"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.","type":["string","null"],"default":null},"templateId":{"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.","type":["integer","null"],"default":null}},"required":["spaceKey","title"]}},{"name":"decide_join_request","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Key of the public project, e.g. 'LIB'.","type":"string"},"id":{"description":"The request's id.","type":"integer"},"approve":{"description":"true to let them in as a reporter, false to decline.","type":"boolean"}},"required":["projectKey","id","approve"]}},{"name":"decide_persons","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project":{"description":"The project key.","type":"string"},"source":{"description":"The source: 'page:471', 'issue:KYC-12', 'comment:88', 'wikicomment:7' or 'none'.","type":"string"},"state":{"description":"'confirmed' or 'rejected'.","type":"string"},"expected":{"description":"How many proposed persons of the source you read in list_persons.","type":"integer"},"q":{"description":"Only those with a spelling holding these words, as list_persons' 'q'.","type":["string","null"],"default":null}},"required":["project","source","state","expected"]}},{"name":"decide_support_letter","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"letterId":{"description":"The letter's id, from list_support_letters.","type":"integer"},"decision":{"description":"'release' or 'dismiss'.","type":"string"}},"required":["letterId","decision"]}},{"name":"decide_terms","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project":{"description":"The project key, e.g. KYC.","type":"string"},"source":{"description":"The source, as list_terms' 'sources' names it: 'page:471', 'issue:KYC-12' or 'none'.","type":"string"},"state":{"description":"'confirmed' or 'rejected'.","type":"string"},"expected":{"description":"How many proposed terms of this source you read — 'total' of list_terms with state 'proposed' and this source.","type":"integer"},"kind":{"description":"Only these kinds, comma-separated, as list_terms takes them.","type":["string","null"],"default":null}},"required":["project","source","state","expected"]}},{"name":"define_term","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"word":{"description":"The word or phrase, as you met it, e.g. 'PW06' or 'размерных подгрупп'.","type":"string"},"project":{"description":"A project key to look in it and its parent projects only. Leave out for every project you can read.","type":["string","null"],"default":null}},"required":["word"]}},{"name":"delete_agent_usage","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Issue key, e.g. 'UK-1'.","type":"string"},"id":{"description":"Record id, as returned by get_agent_usage.","type":"integer"}},"required":["key","id"]}},{"name":"delete_attachment","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Issue key, e.g. 'UK-1'.","type":"string"},"filename":{"description":"File name to remove, as listed by get_issue.","type":["string","null"],"default":null},"id":{"description":"Attachment id, as listed by get_issue. An alternative to 'filename'.","type":["integer","null"],"default":null}},"required":["key"]}},{"name":"delete_chat_message","description":"Delete a message you wrote, as the screen does: its words and files are gone for everybody, and the message stays in its place as «deleted» so the replies to it still point somewhere. Cannot be undone. Only your own message.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"chatId":{"description":"The chat's id.","type":"integer"},"messageId":{"description":"The message's id — one you wrote.","type":"integer"}},"required":["chatId","messageId"]}},{"name":"delete_claim","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"The claim, as list_claims returned it.","type":["integer","null"],"default":null},"project":{"description":"The project key, with 'label'.","type":["string","null"],"default":null},"label":{"description":"The claim's label, with 'project'.","type":["string","null"],"default":null}}}},{"name":"delete_computation","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Issue key, e.g. 'MATH-74'.","type":"string"},"id":{"description":"The computation's id, from list_computations.","type":"integer"}},"required":["key","id"]}},{"name":"delete_credential","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"Credential id, from list_credentials.","type":"integer"}},"required":["id"]}},{"name":"delete_issue_schedule","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"project":{"description":"The project key, e.g. PM.","type":"string"},"id":{"description":"The schedule's id, as list_issue_schedules returned it.","type":"integer"}},"required":["project","id"]}},{"name":"delete_person","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"The person, as list_persons returned them.","type":"integer"}},"required":["id"]}},{"name":"delete_project_field","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'CRM'.","type":"string"},"name":{"description":"Field name, e.g. 'Provider'.","type":"string"}},"required":["projectKey","name"]}},{"name":"delete_project_issue_type","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'TH'.","type":"string"},"name":{"description":"The own type's name.","type":"string"}},"required":["projectKey","name"]}},{"name":"delete_project_rule","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'ONB'.","type":"string"},"id":{"description":"The rule's id, from list_project_rules.","type":"integer"}},"required":["projectKey","id"]}},{"name":"delete_registry_embed","description":"Take a term's, a claim's or a set's link down (PM-1168): it answers 404 at once on every site that has it — the clouds and cards there say the thing is not available. It cannot be undone; a link made again is a new one. Only for somebody who may write in the project; a line in its history.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"embedId":{"description":"The embed's id, from list_registry_embeds.","type":"integer"}},"required":["embedId"]}},{"name":"delete_source","description":"Remove a source from a project's register for good, with its authors — it cannot be undone, so do it only when the person asked for this very one to be deleted; confirm its key with them first. Its journal keeps its lines and one that it was deleted. A source found to be wrong is not deleted: set_source 'check' 'mismatch' with the reason keeps it said. Members of the project who may write only.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"The source, as list_sources returned it.","type":["integer","null"],"default":null},"project":{"description":"The project key, with 'source'.","type":["string","null"],"default":null},"source":{"description":"Its key or an identifier it has, with 'project'.","type":["string","null"],"default":null}}}},{"name":"delete_term","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"The term, as list_terms returned it.","type":"integer"}},"required":["id"]}},{"name":"delete_wiki_attachment","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"filename":{"description":"File name to remove, as listed by get_wiki_page.","type":"string"},"pageId":{"description":"Page id (as returned by search_wiki).","type":["integer","null"],"default":null},"spaceKey":{"description":"Space key, when identifying the page by title.","type":["string","null"],"default":null},"title":{"description":"Exact page title, when identifying the page by title.","type":["string","null"],"default":null}},"required":["filename"]}},{"name":"delete_wiki_embed","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"embedId":{"description":"The embed's id, from list_wiki_embeds.","type":"integer"}},"required":["embedId"]}},{"name":"delete_wiki_page","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"Page id (as returned by search_wiki).","type":["integer","null"],"default":null},"spaceKey":{"description":"Space key, when identifying the page by title.","type":["string","null"],"default":null},"title":{"description":"Exact page title, when identifying the page by title.","type":["string","null"],"default":null},"includeChildren":{"description":"Delete the page's descendants along with it. Off by default.","type":"boolean","default":false}}}},{"name":"distinct_persons","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"a":{"description":"One of the two, as list_persons returned them.","type":"integer"},"b":{"description":"The other.","type":"integer"},"undo":{"description":"true to take the answer back, so the hint may pair them again. Default false.","type":"boolean","default":false}},"required":["a","b"]}},{"name":"edit_chat_message","description":"Change the words of a message you wrote, as the screen's «Edit» does: it says «edited», the chat's open screens show the new words at once, and nobody is told anew — a mention added by an edit notifies nobody. Only your own message, not a deleted one.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"chatId":{"description":"The chat's id.","type":"integer"},"messageId":{"description":"The message's id — one you wrote.","type":"integer"},"body":{"description":"The new text, Markdown. At most 32 KB.","type":"string"}},"required":["chatId","messageId","body"]}},{"name":"evaluate_wl","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"code":{"description":"One cell of Wolfram Language, e.g. \"Integrate[x^2 Sin[x], x]\" or \"Factor[x^4 - 1]\".","type":["string","null"],"default":null},"cells":{"description":"Several cells, evaluated in one session and in order — instead of 'code'.","type":["array","null"],"items":{"type":["string","null"]},"default":null}}}},{"name":"export_sources_bib","description":"A project's register of sources as a BibTeX file's text: one entry per source, its key the source's (what \\cite{} and [@KEY] name), the identifiers as eprint/archivePrefix (arXiv), doi, mrnumber, zbl, isbn; a source with the † says so in a comment above its entry. 'keys' narrows it to those sources; 'page' to the ones a wiki page of the project cites ([@KEY], or [KEY] where the key is a source's), in the order it first cites them. A paper's build fetches the same file by token at /api/projects/{project}/sources.bib (?page= for a page's), with an ETag. Anybody who sees the project.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project":{"description":"The project key, e.g. MATH.","type":"string"},"keys":{"description":"Only these sources: keys separated by commas, e.g. 'GS90,IMP26'.","type":["string","null"],"default":null},"page":{"description":"Only the sources this wiki page cites: its id.","type":["integer","null"],"default":null}},"required":["project"]}},{"name":"find_by_legal_document","description":"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 = \"…\".","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"document":{"description":"The act: its key (e.g. '32015L0849'), its address, a document id, or words of its title.","type":"string"},"project":{"description":"Only this project's, by its key. Omit for every project you read.","type":["string","null"],"default":null},"startAt":{"description":"Where to start, for a list longer than one answer.","type":["integer","null"],"default":null},"limit":{"description":"How many lines, at most 200. Default 50.","type":["integer","null"],"default":null}},"required":["document"]}},{"name":"find_issues","description":"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).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"text":{"description":"What it is about, in your own words.","type":"string"},"projectKey":{"description":"Only this project (must be visible to the token). Omit for every project the token sees.","type":["string","null"],"default":null},"limit":{"description":"How many of each kind to return (default 10, max 25).","type":"integer","default":10}},"required":["text"]}},{"name":"find_lean_declaration","description":"Where a Lean declaration of a claim is declared — 'theorem rank5' in a .lean file — searched in the project's repositories that are open to its agents: the repository, the file, the line, the line's text and the commit the index is at. Pass the full name, e.g. 'D5.rank5_decided'; the file names its last part inside its namespace, so read the file when two places answer. Then bind a claim's basis to it with set_claim, {\"kind\":\"lean\",\"ref\":\"D5.rank5_decided\",\"repo\":\"ispacex/d5\"}. Members of the project who may write only.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project":{"description":"The project key, e.g. D5.","type":"string"},"name":{"description":"The declaration's full name, e.g. 'D5.rank5_decided'.","type":"string"},"repo":{"description":"Look in this repository only, by its path, e.g. 'ispacex/d5'.","type":["string","null"],"default":null}},"required":["project","name"]}},{"name":"find_person","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"spelling":{"description":"The name as you met it, e.g. 'Гупта' or 'N. D. Gupta'.","type":"string"},"project":{"description":"A project key to look in it and its parent projects only. Leave out for every project you can read.","type":["string","null"],"default":null}},"required":["spelling"]}},{"name":"get_agent_usage","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Issue key, e.g. 'UK-1'.","type":"string"}},"required":["key"]}},{"name":"get_attachment","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Issue key, e.g. 'UK-1'.","type":"string"},"filename":{"description":"File name, as listed by get_issue.","type":"string"}},"required":["key","filename"]}},{"name":"get_change","description":"The files one merge request, pull request or commit touches, with their diffs. Large diffs arrive cut.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"change":{"description":"The merge request or pull request number ('!12', '#12' or '12'), or a commit's hash.","type":"string"},"repo":{"description":"Which repository, as 'group/repo'. Omit when only one is open.","type":["string","null"],"default":null}},"required":["change"]}},{"name":"get_chat_agent_policy","description":"Which of this company's agents may be in its chats (PM-1247): 'mode' is 'all' (the default), 'none', or 'chosen' — then only the agents in 'roles'. An agent already in a chat that the choice bars stays there and answers nobody. 'mayChange' says whether you may change it — the company's owner only, with set_chat_agent_policy.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"get_chat_keeping","description":"How long this company's chats are kept: 'days' is 30, 90 or 365, or null for as long as the company is (the default). Older messages are erased with their files within the hour. 'mayChange' says whether you may change it — the company's owner only, with set_chat_keeping.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"get_chat_messages","description":"A chat's messages, oldest first in the page, by cursor: the newest page by default; 'before' a message id reads further back, 'after' one reads forward (what came since). 'more' says the page stopped short — pass the first message's id as 'before' for the page before it. Each message: author (absent when an agent wrote it — then 'agent' names the role and whom it answered), Markdown body (absent once deleted, with 'deleted' true), 'replyTo', files by address, 'issues' made of it that you may open. Reading here does not mark the chat read — mark_chat_read does. 'working' lists the agents answering in it now. A secret chat ('secret' true) is end to end: its words open on its people's devices only, so here every message has an empty body — who wrote when, and nothing of what; it cannot be written to from here either.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"chatId":{"description":"The chat's id, as list_chats gives it.","type":"integer"},"before":{"description":"Read the messages before this id, going back.","type":["integer","null"],"default":null},"after":{"description":"Read the messages after this id, going forward. Wins over 'before'.","type":["integer","null"],"default":null},"limit":{"description":"How many, 1–100. Default 50.","type":["integer","null"],"default":null}},"required":["chatId"]}},{"name":"get_checklist","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Issue key, e.g. 'UK-1'.","type":"string"}},"required":["key"]}},{"name":"get_claim","description":"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; 'restingOn' names the issues whose link column rests on it (a requirement of the register), and counts those you may not open. Name it by 'id', or by 'project' and 'label'. Anybody who sees the project.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"The claim's id, as list_claims returned it.","type":["integer","null"],"default":null},"project":{"description":"The project key, with 'label'.","type":["string","null"],"default":null},"label":{"description":"The claim's label, e.g. 'thm:d5-rank5', with 'project'.","type":["string","null"],"default":null}}}},{"name":"get_comments","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Issue key, e.g. 'UK-1'.","type":"string"},"limit":{"description":"How many comments to return (default 20, max 100).","type":"integer","default":20},"startAt":{"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.","type":["integer","null"],"default":null}},"required":["key"]}},{"name":"get_issue","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Issue key, e.g. 'UK-1'.","type":"string"}},"required":["key"]}},{"name":"get_jira_connection","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'PM'.","type":"string"}},"required":["projectKey"]}},{"name":"get_jira_link","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Issue key here, e.g. 'PM-12'.","type":"string"}},"required":["key"]}},{"name":"get_jira_sync","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'PM'.","type":"string"}},"required":["projectKey"]}},{"name":"get_legal_document","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"document":{"description":"The act: a document id, its address, or its key (e.g. '32015L0849').","type":"string"},"find":{"description":"Words to land on, e.g. 'Article 18'.","type":["string","null"],"default":null},"offset":{"description":"Where to read from: a previous answer's nextOffset, or an outline entry's offset.","type":["integer","null"],"default":null}},"required":["document"]}},{"name":"get_linked_confluence_page","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"page":{"description":"The page there: its id, e.g. '123456', or its link.","type":"string"},"project":{"description":"Project key here, e.g. 'PM'. Or give 'issue'.","type":["string","null"],"default":null},"issue":{"description":"An issue here, e.g. 'PM-12', whose project's site is read.","type":["string","null"],"default":null}},"required":["page"]}},{"name":"get_linked_jira_comments","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project":{"description":"Project key here, e.g. 'PM'. Or give 'issue'.","type":["string","null"],"default":null},"issue":{"description":"An issue here, e.g. 'PM-12': its project's Jira is read, and its own key there unless 'jiraKey' says otherwise.","type":["string","null"],"default":null},"jiraKey":{"description":"The issue there: 'ACME-123' or its /browse/ link. Optional when 'issue' has a key there.","type":["string","null"],"default":null},"limit":{"description":"How many of the latest, at most 30. Default 10.","type":["integer","null"],"default":null}}}},{"name":"get_linked_jira_issue","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project":{"description":"Project key here, e.g. 'PM'. Or give 'issue'.","type":["string","null"],"default":null},"issue":{"description":"An issue here, e.g. 'PM-12': its project's Jira is read, and its own key there unless 'jiraKey' says otherwise.","type":["string","null"],"default":null},"jiraKey":{"description":"The issue there: 'ACME-123' or its /browse/ link. Optional when 'issue' has a key there.","type":["string","null"],"default":null}}}},{"name":"get_project_rule_runs","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'ONB'.","type":"string"},"id":{"description":"The rule's id, from list_project_rules.","type":"integer"},"limit":{"description":"How many lines, newest first (default 20, max 100).","type":"integer","default":20}},"required":["projectKey","id"]}},{"name":"get_secret_file_journal","description":"What was done to one secret file, newest first — uploaded, downloaded, a reader added, waiting for a key or taken off, its key changed — by whom, with which token and through which door (ui, api, mcp). Only for the file's managers: its author, the project's lead or a company administrator who reads it. Take the id from list_secret_files.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"Secret file id, from list_secret_files.","type":"integer"},"limit":{"description":"How many lines, newest first. Default 100, at most 500.","type":"integer","default":100}},"required":["id"]}},{"name":"get_source","description":"One source of a project (see list_sources), with its journal: every change of how far it is checked — from what, to what, who and why — newest first, and when it was created and edited. Name it by 'id', or by 'project' and 'source' — its key, or any identifier it has in any shape: 'arXiv:2301.01234', a DOI or its https://doi.org/ address, 'MR1234567', 'Zbl 1234.56789', an ISBN. Anybody who sees the project.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"The source's id, as list_sources returned it.","type":["integer","null"],"default":null},"project":{"description":"The project key, with 'source'.","type":["string","null"],"default":null},"source":{"description":"Its key ('IMP26') or an identifier it has, with 'project'.","type":["string","null"],"default":null}}}},{"name":"get_started","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project":{"description":"The project's key, e.g. 'PM'. Optional when the caller can see only one project.","type":["string","null"],"default":null}}}},{"name":"get_support_letter","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"letterId":{"description":"The letter's id.","type":"integer"}},"required":["letterId"]}},{"name":"get_support_request","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Issue key of the request, e.g. 'SUPPORT-12'.","type":"string"}},"required":["key"]}},{"name":"get_wiki_attachment","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"filename":{"description":"File name, as listed by get_wiki_page.","type":"string"},"pageId":{"description":"Page id (as returned by search_wiki).","type":["integer","null"],"default":null},"spaceKey":{"description":"Space key, when identifying the page by title.","type":["string","null"],"default":null},"title":{"description":"Exact page title, when identifying the page by title.","type":["string","null"],"default":null}},"required":["filename"]}},{"name":"get_wiki_page","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"Page id (as returned by search_wiki).","type":["integer","null"],"default":null},"spaceKey":{"description":"Space key, when looking the page up by title.","type":["string","null"],"default":null},"title":{"description":"Exact page title, when looking the page up by title.","type":["string","null"],"default":null},"withMarkdown":{"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.","type":"boolean","default":false},"outline":{"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.","type":"boolean","default":false},"section":{"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.","type":["string","null"],"default":null},"offset":{"description":"Return only the Markdown source from this 1-based line on — for a page without headings to navigate by. Pair with 'limit'.","type":["integer","null"],"default":null},"limit":{"description":"How many lines to return from 'offset' (default 200).","type":["integer","null"],"default":null},"withRelated":{"description":"With 'outline', 'section' or 'offset': also return the page's children, attachments, comments and linked issues, which a partial read otherwise leaves out.","type":"boolean","default":false}}}},{"name":"get_wiki_page_approval","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"Page id (as returned by search_wiki).","type":"integer"}},"required":["id"]}},{"name":"get_wiki_page_reading","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"Page id (as returned by search_wiki).","type":"integer"}},"required":["id"]}},{"name":"get_wiki_page_reviews","description":"A wiki page's REVIEWS: who checked which version of it, and what they found. Each review has the 'version' its reviewer read, the 'reviewer' (and the 'agent' that read it for them, where one did), a 'verdict' — 'correct', 'gap' (something not argued), 'error', or null while under way — a 'summary', and 'remarks', each tied to a place: 'anchor' is 'page', 'heading' (key: the heading's anchor), 'claim' (key: a claim block's label, as in ::: theorem {#thm:x}), 'formula' (key: the \\label{…} in it) or 'quote' (the words quoted). A remark's 'state' is 'open' (stands on the page as it is now), 'check' (its place reads otherwise in the current version, or is gone — it may be fixed, and waits for the author to say so), 'fixed' or 'withdrawn'. 'anchors' lists the places a remark may be put on now; 'canReview' and 'canAnswer' say what you may do.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"Page id (as returned by search_wiki).","type":"integer"}},"required":["id"]}},{"name":"import_sources_bib","description":"Read a BibTeX file's text against a project's register of sources. Without 'take' nothing is written: each entry comes back as an offer — 'new' (a source to add under the entry's key), 'fill' (the register already has the work by one of its identifiers: 'adds' lists the empty fields the entry would fill; 'unchecks' says a checked source would go back to unchecked), 'same' (nothing to add), 'conflict' ('keyTaken': the key is another work's — take it with 'as', a new key; 'twoSources': its identifiers name two sources; 'twice': it is twice in the file) or 'invalid' (no title, or a key a source cannot have). 'differs' names what the register says otherwise — never overwritten — and 'notes' what of the entry could not be read; 'problems' are places in the file that are not entries. Show the person the offers, then call again with the same 'bib' and 'take' — the entries they chose — to write them; each is written on its own and says 'created', 'filled', 'skipped' or 'refused' with the reason. Members of the project who may write only, for 'take'.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project":{"description":"The project key, e.g. MATH.","type":"string"},"bib":{"description":"The .bib file's text.","type":"string"},"take":{"description":"The entries to write, as a JSON array: [{\"key\":\"GS90\"},{\"key\":\"Tah81\",\"as\":\"Tah81b\"}] — 'key' the entry's key in the file, 'as' a new key for an entry whose key the register has for another work. Leave out to only see the offers.","type":["string","null"],"default":null}},"required":["project","bib"]}},{"name":"link_issues","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"from":{"description":"The issue the phrase is said about, e.g. 'PM-419'.","type":"string"},"to":{"description":"The issue at the other end, e.g. 'PM-417' — or another company's public issue, 'math/D5-12'.","type":"string"},"type":{"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.","type":"string"}},"required":["from","to","type"]}},{"name":"link_terms","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project":{"description":"The project key.","type":"string"},"from":{"description":"The term that rests on the other: id or spelling.","type":"string"},"to":{"description":"The term rested on: id or spelling.","type":"string"},"kind":{"description":"'dependsOn', 'specialCaseOf' or 'oppositeOf'. Default 'dependsOn'.","type":["string","null"],"default":null},"state":{"description":"'confirmed', 'rejected' or 'none'. Default 'confirmed'.","type":["string","null"],"default":null}},"required":["project","from","to"]}},{"name":"link_wiki_page","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"issueKey":{"description":"Issue key, e.g. 'UK-1'.","type":"string"},"pageId":{"description":"Page id (as returned by search_wiki).","type":["integer","null"],"default":null},"spaceKey":{"description":"Space key, when identifying the page by title.","type":["string","null"],"default":null},"title":{"description":"Exact page title, when identifying the page by title.","type":["string","null"],"default":null},"relationship":{"description":"How the page relates to the issue, free text — e.g. 'documentation' (the default), 'specification', 'design'.","type":["string","null"],"default":null}},"required":["issueKey"]}},{"name":"list_chats","description":"The chats you are in, the most recently written to first: direct chats with one colleague ('with'), groups ('title', 'members', who is an administrator), each project's own chat ('project' — everybody who may open the project is in it), chats with an agent ('agents'). Each says how many messages you have not read ('unread'), up to which message you have read ('readUpTo'), whether you muted it, and its last message. With projectKey, just that project's chat. Read a chat with get_chat_messages; write with send_chat_message.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"A project's key: only that project's own chat — refused when you may not open the project.","type":["string","null"],"default":null}}}},{"name":"list_claims","description":"A project's claims, each with its label (what a paper's \\label and a citation name it by, e.g. 'thm:d5-rank5'), its number, its statement (Markdown with formulas), its status and what it rests on. A project writes them on one of two scales, answered as 'scale' with its 'statuses' and 'kinds': 'math' — theorem, lemma, proposition, corollary, conjecture, question; 'open' (not proved), 'paper' (proved on paper), 'computer' (by a computation), 'lean' (formalised in Lean), 'refuted', 'retracted' (taken back — the † of a result) — or 'law' — position, conclusion, risk, obligation; 'draft', 'agreed', 'practice' (confirmed by practice), 'disputed', 'outdated' (the norm under it changed). set_claim_scale chooses it. 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'), a source in words ('source') or a norm of law ('legal': the act on the legal shelf — 'legal.document', its id for get_legal_document, its title and the 'place' cited — with 'changed' true when the act's publisher has said other words since, 'reaches' whether the change is in the place cited (null where that cannot be told), 'changedAt', and 'asOf' — when the text it rests on was received, its edition; a person marks it looked at on the register's screen). 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project":{"description":"The project key, e.g. MATH.","type":"string"},"status":{"description":"Only claims of this status, one of the project's scale.","type":["string","null"],"default":null},"kind":{"description":"Only claims of this kind, one of the project's scale.","type":["string","null"],"default":null},"q":{"description":"Words its label, number, title or statement holds, case aside.","type":["string","null"],"default":null}},"required":["project"]}},{"name":"list_code","description":"List a directory of a repository connected to a project. Only repositories whose owners opened them to agents can be read.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"repo":{"description":"Which repository, as 'group/repo'. Its last segment alone is enough when unambiguous; omit it when only one is open.","type":["string","null"],"default":null},"path":{"description":"Directory inside the repository. Omit for its root.","type":["string","null"],"default":null},"reference":{"description":"Branch, tag or commit. Omit for the default branch.","type":["string","null"],"default":null}}}},{"name":"list_computations","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"One issue's computations, e.g. 'MATH-74'.","type":["string","null"],"default":null},"projectKey":{"description":"A project's computations, e.g. 'MATH'. Ignored when 'key' is given.","type":["string","null"],"default":null},"state":{"description":"Only this state, or 'open' for queued and running together.","type":["string","null"],"default":null},"limit":{"description":"How many, for a project (default 50, max 200).","type":"integer","default":50}}}},{"name":"list_credentials","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"issueKey":{"description":"Issue key, e.g. 'UK-1'.","type":["string","null"],"default":null},"pageId":{"description":"Wiki page id.","type":["integer","null"],"default":null}}}},{"name":"list_environments","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'ONB'.","type":"string"}},"required":["projectKey"]}},{"name":"list_issue_questions","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Limit to one issue, e.g. 'UK-1'. Omit to look across every project this token can reach.","type":["string","null"],"default":null},"role":{"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.","type":["string","null"],"default":null},"state":{"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).","type":["string","null"],"default":"open"},"from":{"description":"'agent' for only what an agent put to somebody (a resolution, PM-602), 'people' for only what a person asked. Omit for both.","type":["string","null"],"default":null},"limit":{"description":"How many to return (default 20, max 100).","type":"integer","default":20}}}},{"name":"list_issue_schedules","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project":{"description":"The project key, e.g. PM.","type":"string"}},"required":["project"]}},{"name":"list_join_requests","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Key of the public project, e.g. 'LIB'.","type":"string"}},"required":["projectKey"]}},{"name":"list_legal_library","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"filter":{"description":"Only acts whose title or address contains this.","type":["string","null"],"default":null},"limit":{"description":"How many, at most 200. Default 50.","type":["integer","null"],"default":null}}}},{"name":"list_legal_references","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"issue":{"description":"Issue key, e.g. 'UK-1'. Either this or 'page'.","type":["string","null"],"default":null},"page":{"description":"Wiki page id (as returned by search_wiki). Either this or 'issue'.","type":["integer","null"],"default":null}}}},{"name":"list_mcp_connections","description":"List the external MCP connections configured for a project. Auth tokens are never returned (only whether one is set).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'UK'.","type":"string"}},"required":["projectKey"]}},{"name":"list_pages_to_approve","description":"The wiki pages waiting on YOUR approval — what to answer when your person asks «what is waiting for my signature». A page is listed when its lead named you with ask_wiki_page_approval and no approval of yours stands on the edition you were asked about or a later one: approving takes it off, being asked again about a newer edition puts it back. Each row: 'pageId', 'title', 'spaceKey', 'projectKey' and 'projectName', 'askedBy' (display name) and 'askedByUsername', 'askedAt', 'askedFor' (the edition you were asked about), 'version' (the edition the page is at now — read that one before approve_wiki_page, which takes the version you read) and 'note'. Newest ask first; only pages you can open now. Questions put to you on issues are list_issue_questions.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"list_persons","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project":{"description":"The project key, e.g. MATH.","type":"string"},"state":{"description":"'confirmed', 'proposed', 'rejected' or leave out for all you may see.","type":["string","null"],"default":null},"q":{"description":"Words a spelling holds, case aside.","type":["string","null"],"default":null},"source":{"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.","type":["string","null"],"default":null},"onlyUnchecked":{"description":"true for only persons with a spelling or fact that is not checked — written from memory or no longer in its source.","type":"boolean","default":false},"offset":{"description":"How many to skip — for the next page.","type":"integer","default":0},"limit":{"description":"How many to return, at most 200. Default 100.","type":"integer","default":100}},"required":["project"]}},{"name":"list_project_fields","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'CRM'.","type":"string"}},"required":["projectKey"]}},{"name":"list_project_presets","description":"The ready-made projects a project can take in one action: 'requirements', a register of what a company is obliged to do (an issue type, ten columns, a four-state workflow, the year's recurring compliance work, two page templates); 'agents', sample issues to hand to an agent and a «Project context» page it reads first; 'jira', a page on moving a project from Jira; and, where the company has the theatre switched on, 'season', a production type with anchor dates and two sample productions. Says what each brings, by name, before anything is taken.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"list_project_rules","description":"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; 'claimBasisChanged' fires on the issues that cite a claim ([thm:…], [claim:…]) whose legal basis is such an act, once per new text and claim; 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'ONB'.","type":"string"}},"required":["projectKey"]}},{"name":"list_projects","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"list_registry_embeds","description":"A project's terms and claims put on other sites (PM-1165–PM-1168), and its sets: for each, its id, 'kind' (term, claim or set), 'name' (the term's word, the claim's label, the set's name), the ready code — 'script' (the cloud's script, once per page), 'mark' (the words on the site that open the cloud) and, for one thing, 'iframe' (a card) and 'url' — the sites allowed to show it (empty is any), the term ('expiresAt', null until removed), who made it and when, and how many times it was opened. A set lists what it names in 'items'; a term on it you may not open is only counted in 'hidden'. Only for somebody who may write in the project.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project":{"description":"The project key, e.g. MATH.","type":"string"}},"required":["project"]}},{"name":"list_repositories","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Key of the project, e.g. 'LIB'.","type":"string"}},"required":["projectKey"]}},{"name":"list_secret_files","description":"List the secret files on an issue or a wiki page that this token's person reads — the title its author gave it, the size, who reads it, who is waiting for a key, and whether the key is due a change. Never the contents or the file's own name: they are encrypted on the readers' devices and this server cannot open them, so neither can you through it. Pass issueKey or pageId.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"issueKey":{"description":"Issue key, e.g. 'UK-1'.","type":["string","null"],"default":null},"pageId":{"description":"Wiki page id.","type":["integer","null"],"default":null}}}},{"name":"list_showcase","description":"What a public project shows of the company's OTHER projects: issues and wiki pages shown there by reference, not copied — anybody who reads the public project reads them as they are now, while the rest of their project stays closed and their links to it are counted, never named. Each row: its id (for remove_from_showcase), whether it is an issue or a page, its key or page id, its title and the project it belongs to; for a page its edition — 'current', or 'approved' with the version in force (null while none stands, and then it shows nothing). Whoever manages it also sees rows that show nothing now, with shown: false. Also whether you may add to it.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Key of the public project, e.g. 'D5'.","type":"string"}},"required":["projectKey"]}},{"name":"list_sources","description":"A project's sources — the papers, books and preprints its pages cite — each with its key (what a page cites it by, e.g. 'IMP26', a BibTeX key), its authors (the name as the work prints it, and 'personId'/'person' where it is a person of the project's register — 'hidden' where you may not see that person), title, year, venue (journal or publisher), identifiers ('arxiv' with its version, 'doi', 'mr', 'zbmath', 'isbn'), its PDF ('pdf': an attachment of an issue or a page, with its address — or 'hidden') and how far it is checked. 'check' is 'unchecked' (nobody checked it), 'api' (a service — arXiv, Crossref, zbMATH Open — agreed with it), 'mismatch' (it disagrees with what it names; 'checkNote' says how) or 'manual' (a person checked it against the original; 'checkedBy'). 'dagger' is true for unchecked and mismatch: the † a bibliography marks such a reference with. Read a work's description here rather than from a page's own list. Ordered by key. Anybody who sees the project.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project":{"description":"The project key, e.g. MATH.","type":"string"},"check":{"description":"Only sources so checked: unchecked, api, mismatch, manual — or 'dagger' for unchecked and mismatch together.","type":["string","null"],"default":null},"q":{"description":"Words its key, title, venue, an author's name or an identifier holds, case aside.","type":["string","null"],"default":null}},"required":["project"]}},{"name":"list_support_letters","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"state":{"description":"One of 'held', 'failed', 'ignored', 'dismissed'. Omit for held and failed.","type":["string","null"],"default":null}}}},{"name":"list_support_queue","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"who":{"description":"'all' (default), 'mine' (assigned to you) or 'unassigned'.","type":["string","null"],"default":null}}}},{"name":"list_terms","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project":{"description":"The project key, e.g. KYC.","type":"string"},"state":{"description":"'confirmed', 'proposed', 'rejected' or leave out for all you may see.","type":["string","null"],"default":null},"kind":{"description":"Only these kinds, comma-separated — 'статус,система'; an empty one ('статус,') also takes terms with no kind. 'kinds' in the answer says which there are.","type":["string","null"],"default":null},"source":{"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.","type":["string","null"],"default":null},"offset":{"description":"How many to skip — for the next page.","type":"integer","default":0},"limit":{"description":"How many to return, at most 200. Default 100.","type":"integer","default":100}},"required":["project"]}},{"name":"list_tracks","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'TH'.","type":"string"}},"required":["projectKey"]}},{"name":"list_users","description":"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'.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"text":{"description":"Free text to match in username, display name or email.","type":["string","null"],"default":null},"projectKey":{"description":"Restrict to members of this project key (must be visible to the token).","type":["string","null"],"default":null},"includeInactive":{"description":"Include deactivated accounts, which can be neither assigned nor mentioned. Off by default.","type":"boolean","default":false},"limit":{"description":"Max users to return (default 50, max 200).","type":"integer","default":50}}}},{"name":"list_versions","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'ONB'.","type":"string"},"hideArchived":{"description":"Leave out the versions that are archived. They are listed by default, since an issue may still carry one.","type":"boolean","default":false}},"required":["projectKey"]}},{"name":"list_wiki_embeds","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"Page id. Give this or spaceKey.","type":["integer","null"],"default":null},"spaceKey":{"description":"Space key, for every page of it.","type":["string","null"],"default":null}}}},{"name":"list_wiki_labels","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"spaceKey":{"description":"The space key, e.g. 'PM'.","type":"string"}},"required":["spaceKey"]}},{"name":"list_wiki_spaces","description":"List the wiki spaces visible to this token. Every project has exactly one space, keyed like the project.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"local_files_setup","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"mark_chat_read","description":"Say you have read a chat up to a message — the newest when upTo is omitted — as opening it on the screen does: its unread count goes down on every screen you have open, and the push and letter waiting about it are not sent. Never moves backwards.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"chatId":{"description":"The chat's id.","type":"integer"},"upTo":{"description":"The last message read. Default: the newest.","type":["integer","null"],"default":null}},"required":["chatId"]}},{"name":"mark_wiki_page_read","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"Page id.","type":"integer"},"version":{"description":"The edition that was read: 'edition' from get_wiki_page_reading.","type":"integer"}},"required":["id","version"]}},{"name":"merge_persons","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"from":{"description":"The person merged, as list_persons returned them.","type":"integer"},"into":{"description":"The person who stays.","type":"integer"}},"required":["from","into"]}},{"name":"merge_terms","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"from":{"description":"The term to join to the other, as list_terms returned it — it is removed.","type":"integer"},"into":{"description":"The term that stays.","type":"integer"},"takeDefinition":{"description":"true to take the joined term's definition, with its source and place, instead of the target's. Default false.","type":"boolean","default":false}},"required":["from","into"]}},{"name":"move_issue","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"The issue to move, e.g. 'PM-12'.","type":"string"},"toProject":{"description":"Project key to move it into, e.g. 'CRM'.","type":"string"},"statuses":{"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.","type":["string","null"],"default":null},"apply":{"description":"false (the default) answers what the move would do and changes nothing. true does it.","type":"boolean","default":false}},"required":["key","toProject"]}},{"name":"pdf_page_image","description":"A page of a PDF attached to an issue or a wiki page, as a picture you can look at — whole, or only the part 'box' names — drawn on the server, so nothing has to be installed on your side. Use it to read what a PDF's extracted text loses: superscripts, formulas, tables, diagrams. Name the issue by 'key' or the page by 'pageId' (or 'spaceKey' + 'title'), and the file by 'filename' as get_issue / get_wiki_page list it. 'page' counts from 1; the answer says how many pages the file has. 'box' is 'x,y,w,h' in fractions of the page as it is shown, top left first — '0,0,1,0.5' is the top half. The answer also carries 'quote': the Markdown that puts exactly this picture into a comment or a page of the same issue or page, and leads a reader back to that page of the PDF. Reading needs only permission to see the issue or the page.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"filename":{"description":"File name of the PDF, as listed by get_issue or get_wiki_page.","type":"string"},"page":{"description":"The page, from 1.","type":"integer","default":1},"box":{"description":"Optional part of the page: 'x,y,w,h' in fractions of it, top left first.","type":["string","null"],"default":null},"width":{"description":"Optional width of the picture in pixels, 400 to 2400; 1200 if not given.","type":["integer","null"],"default":null},"key":{"description":"Issue key, when the PDF is attached to an issue.","type":["string","null"],"default":null},"pageId":{"description":"Wiki page id, when the PDF is attached to a page.","type":["integer","null"],"default":null},"spaceKey":{"description":"Space key, when identifying the page by title.","type":["string","null"],"default":null},"title":{"description":"Exact page title, when identifying the page by title.","type":["string","null"],"default":null}},"required":["filename"]}},{"name":"product_help","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"topic":{"description":"A topic id, e.g. 'sprints'. Leave out for the list.","type":["string","null"],"default":null}}}},{"name":"read_code","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"path":{"description":"The file's path inside the repository, e.g. 'src/app/main.ts'. Not a URL.","type":"string"},"repo":{"description":"Which repository, as 'group/repo'. Omit when only one is open.","type":["string","null"],"default":null},"reference":{"description":"Branch, tag or commit. Omit for the default branch.","type":["string","null"],"default":null}},"required":["path"]}},{"name":"read_page_literature","description":"Read a wiki page's hand-written «Literature» list (the section headed Литература, Literature, References or Bibliography) against its project's register of sources. Without 'take' nothing is written: each line comes back with what was read of it — its key in front ('[IMP26] …'), arXiv id, DOI, MR, zbMATH number, authors, title, venue, year, the † — and an offer: 'new' (a source to add; 'suggestedKey' where the line has no key), 'known' (the register has it as 'source': cite it as [@source] instead of the line), 'conflict' (its key is another work's: take it with 'as', a new key) or 'unread' (nothing to make a source of). The reading of the words is a guess — show the person the lines and what was read before taking. Call again with 'take' — the lines chosen — to add them, unchecked; each says 'created', 'skipped' or 'refused' with the reason. Anybody who may read the page reads; members who may write take.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"page":{"description":"The wiki page's id.","type":"integer"},"take":{"description":"The lines to add, as a JSON array: [{\"index\":0},{\"index\":3,\"as\":\"Tah81b\"}] — 'index' as the offers numbered them, 'as' a key of your own. Leave out to only read.","type":["string","null"],"default":null}},"required":["page"]}},{"name":"release_version","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'ONB'.","type":"string"},"version":{"description":"The version, by its name or its id from list_versions.","type":"string"},"released":{"description":"false takes the mark back.","type":"boolean","default":true},"releaseDate":{"description":"The day it shipped, as YYYY-MM-DD. Left out, today.","type":["string","null"],"default":null}},"required":["projectKey","version"]}},{"name":"remove_from_showcase","description":"Stop showing one row of a public project's showcase (its id from list_showcase): from the next request the issue or page is closed to everybody outside its own project again. Nothing is deleted but the row. The owner of the project it belongs to or an administrator of the public project may; written to both projects' journals.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Key of the public project, e.g. 'D5'.","type":"string"},"id":{"description":"The row's id, from list_showcase.","type":"integer"}},"required":["projectKey","id"]}},{"name":"remove_legal_reference","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"The reference's id, from list_legal_references.","type":"integer"}},"required":["id"]}},{"name":"remove_track","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'TH'.","type":"string"},"tag":{"description":"The track's tag, e.g. 'cherry-orchard'.","type":"string"}},"required":["projectKey","tag"]}},{"name":"reply_to_requester","description":"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).","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Issue key of the request, e.g. 'SUPPORT-12'.","type":"string"},"body":{"description":"What to tell the requester. Markdown is kept as written.","type":"string"}},"required":["key","body"]}},{"name":"report_agent_usage","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Issue key, e.g. 'UK-1'.","type":"string"},"source":{"description":"Who is reporting, e.g. 'bg-agent-api'. Idempotency is scoped to it.","type":"string"},"externalId":{"description":"Your own key for this record (usually the run id). Re-sending it updates the record.","type":"string"},"runId":{"description":"The run this record belongs to, when one run reports several records (different models or hosts).","type":["string","null"],"default":null},"agent":{"description":"Which agent did the work, e.g. 'claude-code'.","type":["string","null"],"default":null},"model":{"description":"Which model it ran on, e.g. 'claude-opus-5'.","type":["string","null"],"default":null},"host":{"description":"Which host it ran on.","type":["string","null"],"default":null},"inputTokens":{"description":"Input (prompt) tokens.","type":["integer","null"],"default":null},"outputTokens":{"description":"Output (completion) tokens.","type":["integer","null"],"default":null},"cacheReadTokens":{"description":"Cache-read tokens.","type":["integer","null"],"default":null},"cacheWriteTokens":{"description":"Cache-write tokens.","type":["integer","null"],"default":null},"agentSeconds":{"description":"Wall-clock seconds the run took. Machine time, not a worklog.","type":["integer","null"],"default":null},"costUsd":{"description":"Cost in USD, if you know the rates that applied.","type":["number","null"],"default":null},"startedAt":{"description":"When the run started (ISO 8601).","type":["string","null"],"format":"date-time","default":null},"endedAt":{"description":"When the run ended (ISO 8601).","type":["string","null"],"format":"date-time","default":null},"note":{"description":"Short note, e.g. the outcome.","type":["string","null"],"default":null}},"required":["key","source","externalId"]}},{"name":"report_computation","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"The issue the computation answers, e.g. 'MATH-74'.","type":"string"},"source":{"description":"Who runs it, e.g. 'tm' or 'boinc'. The job's name is unique within it.","type":"string"},"externalId":{"description":"The job's own name there, e.g. 'kimmy/gap/m74r5u'. The same name again updates the job.","type":"string"},"title":{"description":"What it computes, in words, e.g. 'rank 5, order 2^11, stage C'.","type":["string","null"],"default":null},"state":{"description":"queued, running, done, failed, cancelled or lost.","type":["string","null"],"default":null},"progressDone":{"description":"How much is done, as the runner counts, e.g. 812.","type":["integer","null"],"default":null},"progressTotal":{"description":"Out of how much, e.g. 1695.","type":["integer","null"],"default":null},"repository":{"description":"The repository's web address, e.g. 'https://github.com/org/repo'.","type":["string","null"],"default":null},"commit":{"description":"The commit it ran at.","type":["string","null"],"default":null},"command":{"description":"How it was run: the command line or the job's description.","type":["string","null"],"default":null},"url":{"description":"The job's own page on its runner (http/https).","type":["string","null"],"default":null},"outputUrl":{"description":"Where its output can be fetched (http/https).","type":["string","null"],"default":null},"result":{"description":"What came of it, a sentence or two. Markdown, $...$ formulas.","type":["string","null"],"default":null},"startedAt":{"description":"When it started (ISO 8601). Left out, a move to running stamps now.","type":["string","null"],"format":"date-time","default":null},"finishedAt":{"description":"When it ended (ISO 8601). Left out, a move to a finished state stamps now.","type":["string","null"],"format":"date-time","default":null}},"required":["key","source","externalId"]}},{"name":"report_deployment","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'ONB'.","type":"string"},"environment":{"description":"The environment's name, e.g. 'staging' — one of list_environments.","type":"string"},"id":{"description":"Your own identifier for this deployment — a pipeline or job id. Left out, 'revision' stands in for it.","type":["string","null"],"default":null},"revision":{"description":"What went out: a commit, a tag, an image tag.","type":["string","null"],"default":null},"url":{"description":"A link to the pipeline, http or https.","type":["string","null"],"default":null},"issues":{"description":"The issue keys it carried, comma-separated: 'ONB-12,ONB-15'.","type":["string","null"],"default":null},"from":{"description":"The revision the previous deployment to this environment was at — the start of the range of commits to read keys from.","type":["string","null"],"default":null},"to":{"description":"The end of that range. Left out, 'revision'.","type":["string","null"],"default":null},"repository":{"description":"Which connected repository the range is in, as 'group/repo', when the project has several.","type":["string","null"],"default":null},"version":{"description":"A version of the project to put these issues in, by name, e.g. '2.4.0'.","type":["string","null"],"default":null},"fromLast":{"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.","type":"boolean","default":false}},"required":["projectKey","environment"]}},{"name":"report_lean_audit","description":"Report what a CI's `#print axioms` said of Lean declarations in one repository of the project at one commit: pass Lean's output as it printed it in 'output' (lines like \"'D5.rank5' depends on axioms: [propext, Classical.choice, Quot.sound]\" and \"'X' does not depend on any axioms\"), or 'declarations' as a JSON array [{\"name\":\"D5.rank5\",\"axioms\":[\"propext\"]}], or both. The latest word per declaration is kept, as a computation's report is; a claim whose Lean basis is bound to a declaration may be marked 'lean' only while its audit is clean — Lean's own propext, Classical.choice and Quot.sound at most, no sorryAx and no axiom of the project's own. Answers each declaration with whether it is clean and the claims bound to it. Members of the project who may write only.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project":{"description":"The project key, e.g. D5.","type":"string"},"repository":{"description":"The repository of the project, by its path ('ispacex/d5') or address.","type":"string"},"commit":{"description":"The commit the CI built.","type":"string"},"output":{"description":"Lean's own #print axioms output.","type":["string","null"],"default":null},"declarations":{"description":"Or the declarations as a JSON array: [{\"name\":\"D5.rank5\",\"axioms\":[\"propext\"]}].","type":["string","null"],"default":null},"url":{"description":"The CI job's page, http(s).","type":["string","null"],"default":null}},"required":["project","repository","commit"]}},{"name":"reveal_credential","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"Credential id, from list_credentials.","type":"integer"}},"required":["id"]}},{"name":"review_wiki_page","description":"REVIEW a wiki page — a proof, an argument — in your person's name, on the version you read: 'version' is the page's version as get_wiki_page gave it, refused if the page has been edited since. 'verdict' is 'correct', 'gap' or 'error' (leave it out while the review is under way, and give it later with reviewId). 'remarks' is a JSON array of {anchor, key, quote, body}: anchor 'page', 'heading' with key the heading's anchor, 'claim' with key the label of a ::: theorem block, 'formula' with key the \\label{…} inside it, or 'quote' with the exact words (at least 8 characters) of the paragraph meant; body is the remark in Markdown. Take the keys from get_wiki_page_reviews' 'anchors'. A place the page does not have is refused. With 'reviewId' the call changes that review instead — its verdict, summary, and more remarks — and 'version' is not needed. Name the agent that did the reading in 'agent' (e.g. 'Claude'): the review is still your person's. The page's author is told. Needs permission to comment on the page.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"Page id.","type":"integer"},"version":{"description":"The version you read and are reviewing. Not needed with reviewId.","type":["integer","null"],"default":null},"verdict":{"description":"'correct', 'gap' or 'error'; leave out while under way. With reviewId, an empty string takes the verdict back.","type":["string","null"],"default":null},"summary":{"description":"What you conclude of the whole, Markdown.","type":["string","null"],"default":null},"remarks":{"description":"The remarks, as a JSON array of {anchor, key, quote, body}.","type":["string","null"],"default":null},"agent":{"description":"The agent that read the page, e.g. 'Claude'. Leave out when your person did.","type":["string","null"],"default":null},"reviewId":{"description":"An existing review to change instead of writing a new one.","type":["integer","null"],"default":null}},"required":["id"]}},{"name":"search_code","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"description":"What to look for, taken literally unless regexp is set. A space is a space, not two terms.","type":"string"},"repo":{"description":"Which repository, as 'group/repo'. Omit to search every repository open here.","type":["string","null"],"default":null},"path":{"description":"Narrow to files whose path contains this, such as 'src/' or '.ts'.","type":["string","null"],"default":null},"regexp":{"description":"Read query as a regular expression. One with no literal in it may not finish in time.","type":"boolean","default":false},"caseSensitive":{"description":"Match case. Off by default.","type":"boolean","default":false}},"required":["query"]}},{"name":"search_issues","description":"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\".","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"jql":{"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.","type":["string","null"],"default":null},"text":{"description":"Shorthand for `key ~ … OR summary ~ …`. Narrows the query further when `jql` is given too.","type":["string","null"],"default":null},"projectKey":{"description":"Shorthand for `project = …` (must be visible to the token). Narrows the query further when `jql` is given too.","type":["string","null"],"default":null},"status":{"description":"Shorthand for `status = …` (e.g. 'In Progress', 'Done'). Narrows the query further when `jql` is given too.","type":["string","null"],"default":null},"limit":{"description":"Max issues to return (default 25, max 100).","type":"integer","default":25}}}},{"name":"search_legal_library","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"description":"What to look for, e.g. 'beneficial owner 25% threshold'.","type":"string"},"limit":{"description":"How many passages, at most 20. Default 8.","type":["integer","null"],"default":null}},"required":["query"]}},{"name":"search_linked_confluence","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"cql":{"description":"The CQL query, as that Confluence reads it.","type":"string"},"project":{"description":"Project key here, e.g. 'PM'. Or give 'issue'.","type":["string","null"],"default":null},"issue":{"description":"An issue here, e.g. 'PM-12', whose project's site is searched.","type":["string","null"],"default":null},"limit":{"description":"How many pages, at most 30. Default 10.","type":["integer","null"],"default":null}},"required":["cql"]}},{"name":"search_linked_jira","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"jql":{"description":"The JQL query, as that Jira reads it.","type":"string"},"project":{"description":"Project key here, e.g. 'PM'. Or give 'issue'.","type":["string","null"],"default":null},"issue":{"description":"An issue here, e.g. 'PM-12', whose project's Jira is searched.","type":["string","null"],"default":null},"limit":{"description":"How many issues, at most 30. Default 10.","type":["integer","null"],"default":null}},"required":["jql"]}},{"name":"search_wiki","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"text":{"description":"What to look for, in your own words.","type":["string","null"],"default":null},"spaceKey":{"description":"Restrict to this space key (e.g. 'PM').","type":["string","null"],"default":null},"limit":{"description":"Max pages to return (default 25, max 100).","type":"integer","default":25},"label":{"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.","type":["string","null"],"default":null}}}},{"name":"send_chat_message","description":"Write a message in a chat, as yourself — as the screen sends it: the chat's people see it at once, and it is told by push and by letter to whoever it calls: in a direct chat the other person, in a group or a project's chat only who it mentions ([~username], the handle list_users gives) or answers (replyTo). An agent of the chat answers when mentioned ([~agent:product]) or replied to, and in a chat with an agent every message is a question to it. A project's chat takes a message from whoever may comment in the project. Answers with 'notified' (who this actually tells, and why: direct, mention, reply — never yourself), 'unresolvedMentions' (what looked like a mention and told nobody, with a reason: unknown, inactive, self, not_in_chat, or an agent's) and 'agents' (the agents it called and their requests). A wrong handle is kept as written and never refused, so that list is the only sign it did not land. Text only — files are sent from the screen.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"chatId":{"description":"The chat's id, as list_chats gives it.","type":"integer"},"body":{"description":"The message, Markdown — with $…$ formulas and [~username] mentions. At most 32 KB.","type":"string"},"replyTo":{"description":"The message of this chat this one answers.","type":["integer","null"],"default":null}},"required":["chatId","body"]}},{"name":"set_chat_agent","description":"Put a company's agent into a group or a project's chat, or take it out, as the chat's settings do (PM-1247) — a group's administrators and, in a project's chat, whoever configures the project. Put in, it answers when it is mentioned ([~agent:product]) or its message is replied to, as the person who called it, and reads the chat only as far back as 'reads' says: 'after' (the default) — only what is written from now on — or 'last' with 'last' messages before each call, 1–30. Already in, nothing about it changes: take it out and put it in again to change what it reads. Taken out, it reads nothing more: a call still waiting is refused. Refused where the company's owner does not let that agent into chats (get_chat_agent_policy). Each put-in, take-out and call is a line in the company's journal, without the words.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"chatId":{"description":"The chat's id.","type":"integer"},"agent":{"description":"The agent, by key or handle — product, agent:analyst.","type":"string"},"remove":{"description":"True takes it out.","type":"boolean","default":false},"reads":{"description":"'after' (default) or 'last'.","type":["string","null"],"default":null},"last":{"description":"With reads='last': how many earlier messages, 1–30.","type":["integer","null"],"default":null}},"required":["chatId","agent"]}},{"name":"set_chat_agent_policy","description":"Choose which agents may be in this company's chats — the company's owner only (PM-1247). 'all': every agent switched on; 'none': no agent anywhere — none may be put in or called, and those already in chats answer nobody; 'chosen': only the agents named in 'roles' (the whole list — one not named is barred). Takes effect at once, a call already waiting included. A line in the company's journal says from what to what.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"mode":{"description":"'all', 'none' or 'chosen'.","type":"string"},"roles":{"description":"With 'chosen': the agents let in, by key or handle.","type":["array","null"],"items":{"type":["string","null"]},"default":null}},"required":["mode"]}},{"name":"set_chat_keeping","description":"Choose how long this company's chats are kept — the company's owner only. 'days' 30, 90 or 365: within the hour every message older than that is erased with its files, in every chat of the company, for good, and so on from then; a line in the company's journal says how many went. Omit 'days' for as long as the company is (the default), which erases nothing. An issue made of a message keeps its words. Ask the owner before shortening it: what is erased does not come back.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"days":{"description":"30, 90 or 365; omit for no term.","type":["integer","null"],"default":null}}}},{"name":"set_chat_members","description":"Change a group's people, as its settings do — only its administrators may: 'add' puts colleagues in, 'admins' and 'notAdmins' make members administrators or not, 'remove' takes people out. Your own username in 'remove' is leaving the group, which anybody may. 'title' renames it. Applied in that order — add, admins, notAdmins, title, remove — and stopped at the first refusal, which is named; what came before it stays done. A direct chat has no members to change; a project's chat is whoever may open the project.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"chatId":{"description":"The group's id.","type":"integer"},"add":{"description":"Colleagues to add, by username or email.","type":["array","null"],"items":{"type":["string","null"]},"default":null},"admins":{"description":"Members to make administrators, by username.","type":["array","null"],"items":{"type":["string","null"]},"default":null},"notAdmins":{"description":"Administrators to make plain members, by username.","type":["array","null"],"items":{"type":["string","null"]},"default":null},"remove":{"description":"Members to take out, by username. Your own is leaving.","type":["array","null"],"items":{"type":["string","null"]},"default":null},"title":{"description":"A new title for the group.","type":["string","null"],"default":null}},"required":["chatId"]}},{"name":"set_claim","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"The claim to change, as list_claims returned it. Or name it by 'project' and 'label'.","type":["integer","null"],"default":null},"project":{"description":"The project key, e.g. MATH.","type":["string","null"],"default":null},"label":{"description":"The claim's label, e.g. 'thm:d5-rank5'.","type":["string","null"],"default":null},"newLabel":{"description":"A new label for an existing claim.","type":["string","null"],"default":null},"kind":{"description":"One of the project's scale (list_claims answers its 'kinds'): theorem, lemma, proposition, corollary, conjecture or question on 'math'; position, conclusion, risk or obligation on 'law'. A new claim is the scale's first — a theorem, a position — unless said.","type":["string","null"],"default":null},"number":{"description":"Its number in the paper, e.g. '5.8'; empty to clear.","type":["string","null"],"default":null},"title":{"description":"A short name, e.g. 'Rank 5 is decided'; empty to clear.","type":["string","null"],"default":null},"statement":{"description":"The statement, Markdown with $…$ formulas.","type":["string","null"],"default":null},"bases":{"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\",\"repo\":\"ispacex/d5\"},{\"kind\":\"source\",\"ref\":\"Gupta 1990, Thm 2\"},{\"kind\":\"legal\",\"document\":31,\"place\":\"Article 6(1)(f)\"}]. 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'; a Lean declaration by its full name, and with 'repo' bound to where code search finds it in that repository of the project (find_lean_declaration) — only a bound declaration with a clean axiom audit lets the claim be 'lean'; a norm of law by the act's id on the legal shelf (list_legal_references gives it as the reference's document) — an act you may read — and the place in it, or none for the act as a whole.","type":["string","null"],"default":null},"status":{"description":"For a NEW claim: its status on the project's scale — open, paper, computer, lean, refuted, retracted on 'math'; draft, agreed, practice, disputed, outdated on 'law'. Default the scale's first: open, draft.","type":["string","null"],"default":null},"reason":{"description":"For a new claim with a status: on what ground.","type":["string","null"],"default":null}}}},{"name":"set_claim_scale","description":"Choose the scale and kinds a project's claims are written on: 'math' (theorem, lemma, proposition, corollary, conjecture, question; open, paper, computer, lean, refuted, retracted) or 'law' (position, conclusion, risk, obligation; draft, agreed, practice, disputed, outdated). Free while the project has no claims. With claims, carry every status and every kind in use over to one of the new scale's by name — 'statuses' and 'kinds' as JSON objects, e.g. {\"open\":\"draft\",\"paper\":\"agreed\"} and {\"theorem\":\"position\"}; ask the person which goes where, never guess. Each claim whose status moves gets a line in its journal with the change of scale and 'reason' as its ground. Nothing is carried into 'lean'. A page's blocks of the other scale's kinds stay boxes on the page and are no longer read into the register. Whoever configures the project (its lead or an administrator) only.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project":{"description":"The project key.","type":"string"},"scale":{"description":"'math' or 'law'.","type":"string"},"statuses":{"description":"With claims: each status in use → one of the new scale's, as a JSON object.","type":["string","null"],"default":null},"kinds":{"description":"With claims: each kind in use → one of the new scale's, as a JSON object.","type":["string","null"],"default":null},"reason":{"description":"Why the scale changes — written into the journal of each claim it moves.","type":["string","null"],"default":null}},"required":["project","scale"]}},{"name":"set_claim_status","description":"Move a claim on its project's scale — open, paper, computer, lean, refuted, retracted on 'math'; draft, agreed, practice, disputed, outdated on 'law' — with the ground it moved on in 'reason' (a merge, a computation that finished, a reviewer's word, the issue it was decided in). 'lean' is refused unless every Lean basis of the claim is bound to its code and its latest axiom audit is clean (report_lean_audit). 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"status":{"description":"A status of the project's scale (list_claims answers its 'statuses').","type":"string"},"reason":{"description":"On what ground — at most 1000 characters.","type":["string","null"],"default":null},"id":{"description":"The claim, as list_claims returned it.","type":["integer","null"],"default":null},"project":{"description":"The project key, with 'label'.","type":["string","null"],"default":null},"label":{"description":"The claim's label, with 'project'.","type":["string","null"],"default":null}},"required":["status"]}},{"name":"set_environments","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'ONB'.","type":"string"},"names":{"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.","type":"string"}},"required":["projectKey","names"]}},{"name":"set_issue_fields","description":"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, wiki pages (a page's address or page:471) and claims (a label like thm:main, or claim:12), 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Issue key, e.g. 'CRM-1'.","type":"string"},"values":{"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.","type":"string"}},"required":["key","values"]}},{"name":"set_issue_schedule","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project":{"description":"The project key, e.g. PM.","type":"string"},"summary":{"description":"The filed issue's title; {date}, {month}, {quarter}, {year} are filled in on the day.","type":"string"},"nextDay":{"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).","type":"string"},"every":{"description":"Every how many units: 1 (the default), 3 for a quarter, 12 for a year. Up to 52 weeks or 24 months.","type":"integer","default":1},"unit":{"description":"'month' (the default) or 'week'.","type":"string","default":"month"},"id":{"description":"The schedule to change, as list_issue_schedules returned it. Leave out to add one.","type":["integer","null"],"default":null},"description":{"description":"The filed issue's description, Markdown; [~username] mentions notify each time.","type":["string","null"],"default":null},"type":{"description":"Issue type name, one of the project's. 'Task' where nothing is said.","type":["string","null"],"default":null},"assignee":{"description":"Assignee username or e-mail. Nobody where nothing is said.","type":["string","null"],"default":null},"priority":{"description":"Priority name, e.g. 'High'.","type":["string","null"],"default":null},"labels":{"description":"Labels as 'a,b'.","type":["string","null"],"default":null},"dueInDays":{"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.","type":["integer","null"],"default":null},"enabled":{"description":"false to keep it switched off. Default true.","type":"boolean","default":true}},"required":["project","summary","nextDay"]}},{"name":"set_jira_connection","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'PM'.","type":"string"},"enabled":{"description":"true to switch the connection on, false to switch it off. Leave out to keep it as it is.","type":["boolean","null"],"default":null},"confluence":{"description":"true to read the same site's Confluence too, false to stop. Leave out to keep it as it is.","type":["boolean","null"],"default":null}},"required":["projectKey"]}},{"name":"set_jira_link","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Issue key here, e.g. 'PM-12'.","type":"string"},"jiraKey":{"description":"The Jira issue: 'ACME-123' or 'https://acme.atlassian.net/browse/ACME-123'. Empty removes the link.","type":["string","null"],"default":null}},"required":["key"]}},{"name":"set_jira_sync","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'PM'.","type":"string"},"direction":{"description":"'off', 'both', 'from_jira' or 'to_jira'. Omit to keep.","type":["string","null"],"default":null},"pairs":{"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.","type":["string","null"],"default":null}},"required":["projectKey"]}},{"name":"set_person","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project":{"description":"The project key, for a new person.","type":["string","null"],"default":null},"id":{"description":"The person to change, as list_persons or find_person returned them. Leave out to add one.","type":["integer","null"],"default":null},"name":{"description":"The name shown first — one of the person's spellings, e.g. 'Гупта'; a new one becomes a spelling.","type":["string","null"],"default":null},"note":{"description":"Why this person is here, in a line — at most 600 characters.","type":["string","null"],"default":null},"spellings":{"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.","type":["string","null"],"default":null},"facts":{"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.","type":["string","null"],"default":null},"removeSpellings":{"description":"Spellings to remove, by their text, comma-separated.","type":["string","null"],"default":null},"removeFacts":{"description":"Facts to remove, as 'kind:value', comma-separated — 'born:1938'.","type":["string","null"],"default":null},"state":{"description":"'confirmed' or 'rejected' — to decide a proposed person.","type":["string","null"],"default":null}}}},{"name":"set_project_field","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'CRM'.","type":"string"},"name":{"description":"Field name, e.g. 'Segment'. An existing field with this name is edited rather than duplicated.","type":"string"},"kind":{"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.","type":["string","null"],"default":null},"options":{"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.","type":["string","null"],"default":null},"newName":{"description":"Rename the field to this. Leave out to keep the name.","type":["string","null"],"default":null},"showIcon":{"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.","type":["boolean","null"],"default":null},"icon":{"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.","type":["string","null"],"default":null},"issueType":{"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.","type":["string","null"],"default":null}},"required":["projectKey","name"]}},{"name":"set_project_issue_type","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'TH'.","type":"string"},"name":{"description":"The type's name. An own type of this project with this name is renamed (with newName) rather than duplicated.","type":"string"},"newName":{"description":"Rename the type to this. Leave out to add or keep it.","type":["string","null"],"default":null},"subtask":{"description":"When adding: true for a sub-task type, whose issues hang off a parent. Cannot be changed afterwards.","type":["boolean","null"],"default":null}},"required":["projectKey","name"]}},{"name":"set_project_parent","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Key of the project to move, e.g. 'KYCB2B'.","type":"string"},"parentKey":{"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.","type":["string","null"],"default":null}},"required":["projectKey"]}},{"name":"set_project_public","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Key of the project, e.g. 'LIB'.","type":"string"},"isPublic":{"description":"true to open it to be read by anybody, false to close it.","type":"boolean"},"indexed":{"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.","type":["boolean","null"],"default":null}},"required":["projectKey","isPublic"]}},{"name":"set_repository_open_source","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Key of the project, e.g. 'LIB'.","type":"string"},"repository":{"description":"The repository: its id from list_repositories, or its path, e.g. 'owner/repo'.","type":"string"},"openSource":{"description":"true to mark it open source, false to take the mark off.","type":"boolean"}},"required":["projectKey","repository","openSource"]}},{"name":"set_source","description":"Add a source to a project's register, or change one — its key, authors, title, year, venue, identifiers or PDF — or say how far it is checked. A source is named by 'id', or by 'project' and 'key': one that does not exist yet is created (with 'title'), unchecked. A field left out keeps its value and an empty one clears it; 'authors' given replaces the whole list. Identifiers are kept in one shape whatever they are pasted as (arXiv without 'arXiv:' and with its version, a DOI without https://doi.org/, 'MR' and digits, zbMATH without 'Zbl', an ISBN's digits with its checksum held), and each is once per project — a second source with the same one is refused, naming the first. 'check' moves the check by hand, with a line in its journal: 'manual' (you checked it against the original — say against what in 'reason'), 'mismatch' (it disagrees with what it names — 'reason' says how; required) or 'unchecked'; 'api' is written only by the check against the services. Changing the authors, title, year, venue or an identifier of a checked source takes it back to unchecked: what was checked is no longer there. Members of the project who may write only.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"The source to change, as list_sources returned it. Or name it by 'project' and 'key'.","type":["integer","null"],"default":null},"project":{"description":"The project key, e.g. MATH.","type":["string","null"],"default":null},"key":{"description":"The source's key, e.g. 'IMP26' — a letter or digit, then letters, digits and ':', '.', '_', '-', '+'; once per project, case aside.","type":["string","null"],"default":null},"newKey":{"description":"A new key for an existing source.","type":["string","null"],"default":null},"authors":{"description":"Its authors in the work's order, as a JSON array replacing the list: [{\"name\":\"N. D. Gupta\"},{\"name\":\"S. Sidki\",\"person\":42}] — 'name' as the work prints it, 'person' a person of the project's register you may see (find_person), optional. A person without a name takes the name the register shows.","type":["string","null"],"default":null},"title":{"description":"Its title.","type":["string","null"],"default":null},"year":{"description":"The year it appeared; 0 clears it.","type":["integer","null"],"default":null},"venue":{"description":"The journal, series or publisher, e.g. 'Ann. of Math.'.","type":["string","null"],"default":null},"arxiv":{"description":"The arXiv id, with its version where it matters: '2301.01234v3', 'math/0601001'.","type":["string","null"],"default":null},"doi":{"description":"The DOI, e.g. '10.4007/annals.2024.199.1.3'.","type":["string","null"],"default":null},"mr":{"description":"The Mathematical Reviews number, e.g. 'MR1234567'.","type":["string","null"],"default":null},"zbmath":{"description":"The zbMATH number, e.g. '1234.56789'.","type":["string","null"],"default":null},"isbn":{"description":"The ISBN, ten or thirteen digits.","type":["string","null"],"default":null},"pdfAttachment":{"description":"Its PDF: the id of an issue's attachment you may open; 0 takes the PDF off.","type":["integer","null"],"default":null},"pdfWikiAttachment":{"description":"Its PDF: the id of a wiki page's attachment you may open; 0 takes the PDF off.","type":["integer","null"],"default":null},"check":{"description":"How far it is checked, by hand: 'manual', 'mismatch' or 'unchecked'.","type":["string","null"],"default":null},"reason":{"description":"With 'check': against what it was checked, or how it disagrees — at most 1000 characters.","type":["string","null"],"default":null}}}},{"name":"set_term","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project":{"description":"The project key, for a new term.","type":["string","null"],"default":null},"id":{"description":"The term to change, as list_terms returned it. Leave out to add one.","type":["integer","null"],"default":null},"name":{"description":"The term as written, e.g. 'PW06' or 'Размерная подгруппа'.","type":["string","null"],"default":null},"definition":{"description":"What it means — one or two short sentences, Markdown, $…$ for formulas; at most 600 characters.","type":["string","null"],"default":null},"variants":{"description":"Its other spellings, one per line or comma-separated.","type":["string","null"],"default":null},"kind":{"description":"What sort of thing it is, in the project's words — 'условие', 'спецификация', 'понятие'.","type":["string","null"],"default":null},"source":{"description":"The page or issue that defines it: 'page:471', 'PM-12' or its address. '' removes it.","type":["string","null"],"default":null},"place":{"description":"The heading on the source it stands under.","type":["string","null"],"default":null},"state":{"description":"'confirmed' or 'rejected' — to decide a proposed term.","type":["string","null"],"default":null}}}},{"name":"set_track","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'TH'.","type":"string"},"tag":{"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.","type":"string"},"name":{"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.","type":["string","null"],"default":null},"icon":{"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.","type":["string","null"],"default":null},"newTag":{"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.","type":["string","null"],"default":null},"position":{"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.","type":["integer","null"],"default":null},"archived":{"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.","type":["boolean","null"],"default":null}},"required":["projectKey","tag"]}},{"name":"set_wiki_page_readers","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"Page id.","type":"integer"},"users":{"description":"Usernames or e-mails, as 'a,b'. Take them from list_users.","type":["string","null"],"default":null},"members":{"description":"true for everybody on the page's project.","type":"boolean","default":false},"teamRoles":{"description":"The project's team roles by name, as 'a,b'.","type":["string","null"],"default":null},"askAgain":{"description":"true to leave the list alone and ask again everybody who has not read the edition.","type":"boolean","default":false}},"required":["id"]}},{"name":"site_traffic","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"site":{"description":"Which site, e.g. 'sc-domain:example.com', a Vercel project or 'properties/123456789'. Omit when only one is open.","type":["string","null"],"default":null},"from":{"description":"First day, YYYY-MM-DD. Omit for a week before 'to'.","type":["string","null"],"default":null},"to":{"description":"Last day, YYYY-MM-DD. Omit for the last day counted.","type":["string","null"],"default":null},"by":{"description":"Break down by: query, page, country, device, date, referrer, source or channel. Omit for totals only.","type":["string","null"],"default":null},"page":{"description":"Only pages whose address contains this (Search Console), whose path starts with it (Vercel), or sessions whose landing page contains it (Google Analytics).","type":["string","null"],"default":null},"query":{"description":"Only searches containing this. Search Console only.","type":["string","null"],"default":null},"limit":{"description":"How many rows, at most 50. Default 10.","type":["integer","null"],"default":null}}}},{"name":"take_project_preset","description":"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. The register 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; 'agents' and 'jira' keep the project's types and workflow; 'season' needs the theatre switched on for the company and sets the production type up for anchor dates. With 'samples', the preset's sample issues and pages 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project":{"description":"The project key, e.g. PM.","type":"string"},"preset":{"description":"Which one: 'requirements', 'agents', 'jira' or 'season'.","type":"string","default":"requirements"},"samples":{"description":"true to file the sample requirements and pages too. Default false.","type":"boolean","default":false},"language":{"description":"The language the names are written in: 'en' (the default) or 'ru'. They are the project's own afterwards and can be renamed.","type":"string","default":"en"}},"required":["project"]}},{"name":"term_graph","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project":{"description":"The project key, e.g. MATH.","type":"string"},"term":{"description":"A term — its id, or a spelling of it — to see only what is around it. Leave out for the whole project.","type":["string","null"],"default":null},"depth":{"description":"How many links away from 'term', 1 to 3. Default 2.","type":"integer","default":2}},"required":["project"]}},{"name":"unlink_issues","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"from":{"description":"One end, e.g. 'PM-419'. Not needed when 'linkId' is given.","type":["string","null"],"default":null},"to":{"description":"The other end, e.g. 'PM-417'. Not needed when 'linkId' is given.","type":["string","null"],"default":null},"type":{"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').","type":["string","null"],"default":null},"linkId":{"description":"The link's id, as get_issue returns it in 'links'.","type":["integer","null"],"default":null}}}},{"name":"unlink_wiki_page","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"issueKey":{"description":"Issue key, e.g. 'UK-1'.","type":"string"},"pageId":{"description":"Page id (as returned by search_wiki).","type":["integer","null"],"default":null},"spaceKey":{"description":"Space key, when identifying the page by title.","type":["string","null"],"default":null},"title":{"description":"Exact page title, when identifying the page by title.","type":["string","null"],"default":null}},"required":["issueKey"]}},{"name":"unmerge_person","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"The person merged into another, as 'merged' lists them.","type":"integer"}},"required":["id"]}},{"name":"update_comment","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Issue key the comment is on, e.g. 'UK-1'.","type":"string"},"commentId":{"description":"The comment's id, as returned by get_comments or add_comment.","type":"integer"},"body":{"description":"The new body, replacing the old one entirely. Markdown is kept as written, and carries $…$ / $$…$$ LaTeX formulas and [~username] mentions.","type":["string","null"],"default":null},"edits":{"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.","type":["array","null"],"items":{"type":["object","null"],"properties":{"oldText":{"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.","type":["string","null"]},"newText":{"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.","type":["string","null"]},"replaceAll":{"description":"Replace every occurrence rather than requiring exactly one.","type":"boolean"}}},"default":null}},"required":["key","commentId"]}},{"name":"update_credential","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"Credential id, from list_credentials.","type":"integer"},"name":{"description":"A new name. Leave it out to keep the name.","type":["string","null"],"default":null},"value":{"description":"A new value. Leave it out to keep the value.","type":["string","null"],"default":null},"readers":{"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.","type":["string","null"],"default":null},"noReaders":{"description":"True to leave nobody on the list — the author and the project's lead still read it.","type":"boolean","default":false}},"required":["id"]}},{"name":"update_issue","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Issue key, e.g. 'UK-1'.","type":"string"},"summary":{"description":"New summary (title).","type":["string","null"],"default":null},"description":{"description":"New description. Markdown, with $…$ / $$…$$ LaTeX formulas and [~username] mentions.","type":["string","null"],"default":null},"type":{"description":"New issue type name, e.g. 'Task', 'Bug', 'Story', 'Epic'.","type":["string","null"],"default":null},"assignee":{"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).","type":["string","null"],"default":null},"priority":{"description":"Priority name, e.g. 'High'.","type":["string","null"],"default":null},"labels":{"description":"Labels to set, space or comma separated. Replaces the existing set.","type":["string","null"],"default":null},"dueDate":{"description":"The day this is due, as YYYY-MM-DD. A calendar day, not a timestamp. Pass an empty string to clear it.","type":["string","null"],"default":null},"parentKey":{"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.","type":["string","null"],"default":null},"detachParent":{"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.","type":"boolean","default":false},"status":{"description":"Status name to move the issue to, e.g. 'In Progress', 'Done'.","type":["string","null"],"default":null},"resolution":{"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.","type":["string","null"],"default":null},"fields":{"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.","type":["string","null"],"default":null},"fixVersions":{"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.","type":["string","null"],"default":null}},"required":["key"]}},{"name":"update_project_rule","description":"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; 'claimBasisChanged' fires on the issues that cite a claim ([thm:…], [claim:…]) whose legal basis is such an act, once per new text and claim; 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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'ONB'.","type":"string"},"id":{"description":"The rule's id, from list_project_rules.","type":"integer"},"enabled":{"description":"true to switch the rule on, false to switch it off.","type":["boolean","null"],"default":null},"name":{"description":"A new name.","type":["string","null"],"default":null},"status":{"description":"A new state to fire on, by name.","type":["string","null"],"default":null},"template":{"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.","type":["string","null"],"default":null},"type":{"description":"Only issues of this type, by name. An empty string means any type.","type":["string","null"],"default":null},"label":{"description":"Only issues with this label. An empty string means any label.","type":["string","null"],"default":null},"agentRole":{"description":"For a duty: a new agent role key.","type":["string","null"],"default":null},"agentActions":{"description":"For a duty: the whole new list of actions, comma-separated.","type":["string","null"],"default":null},"agentFields":{"description":"For a duty: the whole new list of fields, comma-separated.","type":["string","null"],"default":null},"doneStatus":{"description":"For a duty: a new review state; an empty string and it no longer moves the issue.","type":["string","null"],"default":null},"capUsd":{"description":"For a duty: what one task may cost, in dollars, at most 5; 0 goes back to the ordinary ceiling.","type":["number","null"],"default":null},"trigger":{"description":"WHEN the rule fires: 'entered', 'versionReleased', 'subtasksDone', 'subtaskStarted', 'branchCreated', 'mrOpened', 'mrMerged', 'mrClosed', 'deployed', 'actChanged', 'actTouched' or 'claimBasisChanged'. Moving off 'entered' drops the rule's state.","type":["string","null"],"default":null},"fromStatus":{"description":"Only an issue coming from this state, by name. An empty string means from any.","type":["string","null"],"default":null},"moveToStatus":{"description":"For a 'move' rule: a new state to move the issue to, by name.","type":["string","null"],"default":null},"branch":{"description":"For a merge-request event: only a request going into this branch. An empty string means into any.","type":["string","null"],"default":null},"environment":{"description":"For 'deployed': only a deployment to this environment, by name. An empty string means to any.","type":["string","null"],"default":null}},"required":["projectKey","id"]}},{"name":"update_registry_embed","description":"Change a term's, a claim's or a set's link on other sites (PM-1168) — the sites that may show it, its term — keeping the link, so the sites that have it keep working; for a set also its name, and its 'terms' or 'claims', each given replacing that part of the list (a term on it you may not open stays on it). Only what you pass changes: an empty 'sites' allows any site, days 0 removes the term. Only for somebody who may write in the project; a line in its history.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"embedId":{"description":"The embed's id, from list_registry_embeds or a create_*_embed.","type":"integer"},"sites":{"description":"Sites that may show it, comma-separated; empty is any site.","type":["string","null"],"default":null},"days":{"description":"A new term in days from now; 0 is until it is removed.","type":["integer","null"],"default":null},"title":{"description":"A set's new name.","type":["string","null"],"default":null},"terms":{"description":"A set's terms, comma-separated, replacing its terms.","type":["string","null"],"default":null},"claims":{"description":"A set's claims, comma-separated, replacing its claims.","type":["string","null"],"default":null}},"required":["embedId"]}},{"name":"update_version","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'ONB'.","type":"string"},"version":{"description":"The version, by its name or its id from list_versions.","type":"string"},"name":{"description":"A new name.","type":["string","null"],"default":null},"description":{"description":"A new description. An empty string removes it.","type":["string","null"],"default":null},"startDate":{"description":"The day work on it starts, as YYYY-MM-DD. An empty string clears it.","type":["string","null"],"default":null},"releaseDate":{"description":"The day it is meant to ship, as YYYY-MM-DD. An empty string clears it.","type":["string","null"],"default":null},"archived":{"description":"true puts it away; false brings it back.","type":["boolean","null"],"default":null}},"required":["projectKey","version"]}},{"name":"update_wiki_comment","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"commentId":{"description":"The comment's id, as get_wiki_page lists it or add_wiki_comment returned.","type":"integer"},"markdown":{"description":"The whole comment, replacing what is there. Markdown, which also carries $…$ / $$…$$ LaTeX formulas.","type":["string","null"],"default":null},"edits":{"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.","type":["array","null"],"items":{"type":["object","null"],"properties":{"oldText":{"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.","type":["string","null"]},"newText":{"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.","type":["string","null"]},"replaceAll":{"description":"Replace every occurrence rather than requiring exactly one.","type":"boolean"}}},"default":null},"inlineSelection":{"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.","type":["string","null"],"default":null},"inlineMatch":{"description":"Which occurrence of 'inlineSelection' on the page to anchor to, counted from 1. Only needed when the text occurs more than once.","type":["integer","null"],"default":null},"expectedVersion":{"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.","type":["integer","null"],"default":null}},"required":["commentId"]}},{"name":"update_wiki_embed","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"embedId":{"description":"The embed's id, from list_wiki_embeds or create_wiki_embed.","type":"integer"},"caption":{"description":"New caption; empty takes it off.","type":["string","null"],"default":null},"sites":{"description":"Sites that may frame it, comma-separated; empty is any site.","type":["string","null"],"default":null},"days":{"description":"A new term in days from now; 0 is until it is removed.","type":["integer","null"],"default":null}},"required":["embedId"]}},{"name":"update_wiki_page","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"Page id (as returned by search_wiki).","type":["integer","null"],"default":null},"spaceKey":{"description":"Space key, when identifying the page by title.","type":["string","null"],"default":null},"title":{"description":"Current page title, when identifying the page by title.","type":["string","null"],"default":null},"newTitle":{"description":"New title. The page's existing links follow the rename.","type":["string","null"],"default":null},"edits":{"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'.","type":["array","null"],"items":{"type":["object","null"],"properties":{"oldText":{"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.","type":["string","null"]},"newText":{"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.","type":["string","null"]},"replaceAll":{"description":"Replace every occurrence rather than requiring exactly one.","type":"boolean"}}},"default":null},"replaceSection":{"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.","type":["object","null"],"properties":{"section":{"description":"The section to replace: its anchor as get_wiki_page(outline: true) gives it, or its heading text.","type":["string","null"]},"markdown":{"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.","type":["string","null"]}},"default":null},"markdown":{"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.","type":["string","null"],"default":null},"appendMarkdown":{"description":"Markdown to add to the end of the page, leaving the rest as it is. Same syntax as 'markdown'.","type":["string","null"],"default":null},"parentId":{"description":"Move the page under this parent page id.","type":["integer","null"],"default":null},"parentTitle":{"description":"Move the page under the page with this title, in the same space.","type":["string","null"],"default":null},"toTopLevel":{"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.","type":"boolean","default":false},"labels":{"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.","type":["string","null"],"default":null},"expectedVersion":{"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":["integer","null"],"default":null},"message":{"description":"Short note for the page history, e.g. why you changed it.","type":["string","null"],"default":null},"minorEdit":{"description":"Mark this as a minor edit in the history.","type":"boolean","default":false}}}},{"name":"upsert_mcp_connection","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectKey":{"description":"Project key, e.g. 'UK'.","type":"string"},"id":{"description":"Existing connection id to update; omit to create a new one.","type":["integer","null"],"default":null},"name":{"description":"Connection display name (required when creating).","type":["string","null"],"default":null},"url":{"description":"MCP server URL — use https (required when creating).","type":["string","null"],"default":null},"token":{"description":"Bearer auth token. Omit to keep the current token when updating.","type":["string","null"],"default":null},"enabled":{"description":"Whether the connection is enabled.","type":["boolean","null"],"default":null},"forAgents":{"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.","type":["boolean","null"],"default":null}},"required":["projectKey"]}},{"name":"withdraw_issue_question","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"questionId":{"description":"The question's id, as returned by list_issue_questions or ask_issue_question.","type":"integer"}},"required":["questionId"]}},{"name":"withdraw_wiki_page_approval","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"Page id.","type":"integer"},"version":{"description":"The edition whose approval is taken back. Leave out for the newest approved one.","type":["integer","null"],"default":null},"who":{"description":"Whose approval, by username or e-mail. Leave out for your own.","type":["string","null"],"default":null},"note":{"description":"Why — kept with the line.","type":["string","null"],"default":null}},"required":["id"]}}],"scan":{"score":79,"grade":"B","scanned_at":"2026-11-01T22:11:23.501Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-11-01T22:11:23.459Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 326ms (auth required)"]},"poisoning":{"score":13,"max":15,"notes":["203 tool descriptions checked"]},"auth":{"score":15,"max":15,"notes":["OAuth resource metadata advertised on 401"]},"maintenance":{"score":3,"max":15,"notes":["no repository listed"]},"identity":{"score":8,"max":10,"notes":["endpoint served from the registry-verified namespace domain"]}},"findings":[{"id":"poison.long-description","severity":"low","component":"poisoning","title":"Unusually long tool description (over 2,000 characters)","evidence":"tool admin_funnel: …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. 'firstSession' is the same cohort with our own companies left out (admin_set_workspace_ours): for each step a new company is led to — board, project, issue, wiki, token, agent, invite — how many took it ('known' leaves out companies registered before the step was recorded), 'stoppedAt' the first step each did not take, and 'firstWeek' how many filed at least five issues in their first seven days, counted only once the week is over. 'segments' splits the same outside cohort by what each company came for — 'legal', 'agents', 'jira-dc' — by the landing's mark, the start chosen on the form or a fact of its own (an agent's sign-up over MCP; an import from Jira), each with registered, activated and converted; segments overlap, and 'unknown' names the machines that have not said the own fact — never zero. Default period: the last 90 days.…"},{"id":"maint.no-repo","severity":"low","component":"maintenance","title":"No source repository listed"}],"inputs":{"probes":[{"url":"https://app.kaiku.tech/mcp","reachable":true,"authRequired":true,"latencyMs":326,"authScheme":"oauth"},{"url":"https://mcp.kaiku.tech/mcp","reachable":true,"authRequired":false,"latencyMs":1271,"serverInfo":{"name":"kaiku","version":"1.3.0"}}],"packages":[],"repo":{"found":false},"icon":{"url":"https://mcp.kaiku.tech/favicon.ico","source":"registry","width":48,"height":48},"presence":{"stars":null,"forks":null,"downloadsWeek":null,"license":null,"lastPushAt":null,"score":8}}}},"grade_history":[{"kind":"restore","fromGrade":"C","toGrade":"B","reason":"score 79: Unusually long tool description (over 2,000 characters); No source repository listed","createdAt":"2026-11-01T22:11:47.826Z"}],"reviews":[]}