Tools reference
Every memtro_ tool the model and MCP clients can call, with its inputs.
Every tool below is Memtro's own, available to the model in a chat, in a job, over the API and to any MCP client. Each connected system adds its own tools beside these, named <connector>_<tool>; what each connector offers is on the Connectors page, and the ones whose description starts with ACTION: change something in that system and run only when the person asked for exactly that and an administrator has granted the tool.
Three groups here come and go with a setting. The register tools appear only when the matching feature is switched on under Organisation → Features, because each one writes to shared memory. The job tools are always there. memtro_delegate exists only inside an agent-mode run, where the harness hands sub-tasks to workers.
Inputs are given as the model sees them, generated from the same schemas the API validates against.
Memory
memtro_search
Semantic + keyword search over the organisation/personal knowledge graph: remembered facts, decisions, preferences, people, projects and their relationships. Use before answering questions about the company, colleagues, customers or past work. Pass as_of to search memory as it stood on an earlier date (what was believed then); memtro_timeline shows how it changed.
| Input | Type | Required | What it is |
|---|---|---|---|
query | string | yes | Natural-language query |
limit | integer | no | |
as_of | string | no | ISO date (YYYY-MM-DD): return what was believed at the end of that day, leaving out memories recorded or corrected since |
memtro_values
Look up the recorded VALUES of things — amounts, dates, counts, rates — across entities of one kind, and compare, filter or total them. This is the tool for "which deals are worth more than £50k", "what renews this quarter", "who has the largest balance": questions memory's sentences cannot answer, because answering them from prose means reading every sentence and hoping. Call it with no key to see which values this organisation actually records. Each value is what some system or conversation stated, with the date it was recorded, and is not a live figure: check the system that owns it before acting on a number.
| Input | Type | Required | What it is |
|---|---|---|---|
key | string | no | The value to look up, e.g. deal_value, renewal_date, headcount. Omit to list the keys that exist. |
entity_type | string | no | Narrow to one kind of entity: customer, deal, person, project… |
min | number | no | Only values at or above this (numeric values only) |
max | number | no | Only values at or below this (numeric values only) |
from | string | no | ISO date: only dated values on or after this |
to | string | no | ISO date: only dated values on or before this |
limit | integer | no |
memtro_remember
Save durable knowledge to Memtro's memory so it is available in future conversations. Use when the user states a fact, decision, preference or asks you to remember something. Choose scope: 'shared' (everyone in the organisation) for knowledge about the company, customers, systems, decisions and colleagues; 'personal' (only this user) for their own preferences, working style, private matters, reminders, or anything they say is just for them. If it corrects an earlier memory, pass replaces_memory_id.
| Input | Type | Required | What it is |
|---|---|---|---|
content | string | yes | A self-contained statement of the fact, with names and dates. |
kind | one of fact, decision, preference, event, procedure | no | |
subject | string | no | Entity the statement is mainly about |
valid_from | string | no | ISO date |
valid_to | string | no | ISO date |
replaces_memory_id | string | no | |
entities | array of object (type, name, summary) | no | Each item: type; name; summary (optional). |
relations | array of object (from, to, relation) | no | Each item: from; to; relation. |
scope | one of shared, personal | no | shared = organisation knowledge, personal = about this user only. Defaults to shared when the request allows it. A request run with personal memory never stores shared facts. |
memtro_explore
Look up an entity by name (fuzzy, aliases included) and return its neighbourhood in the knowledge graph plus the facts recorded about it. Pass as_of for the facts as they stood on an earlier date.
| Input | Type | Required | What it is |
|---|---|---|---|
name | string | yes | Entity name or part of it |
depth | integer | no | |
as_of | string | no | ISO date (YYYY-MM-DD): the facts believed at the end of that day rather than now |
memtro_why
Why a piece of code is the way it is: the pull requests and commits that touched a file, the tickets they closed, the conversations where the approach was decided, the errors and incidents that followed, and who was involved — joined across GitHub, GitLab, Sentry, the tracker, Slack and the deploy log. Use it before changing unfamiliar code, when a reviewer asks why something is written this way, when an error points at a file, or for "who should I ask about this?". Pass the file path as the repository spells it (a path from a stack trace is fine); pass repo when the same path exists in more than one repository. IMPORTANT: this is what the connected systems recorded, not the whole story — code with no pull request, no ticket and no conversation behind it will come back nearly empty, and that is an answer too. Nothing here is a judgement about whether the code is correct. When the person asks to put the reasoning on the pull request or issue, post it with github_comment: the decision, its reason in the recorded words, and what was rejected, naming Memtro as the source.
| Input | Type | Required | What it is |
|---|---|---|---|
path | string | no | File path, e.g. src/checkout/total.ts (a stack-trace path such as /app/src/checkout/total.ts:42 also works) |
repo | string | no | owner/name, when the same path exists in several repositories — or on its own to ask about a whole repository |
limit | integer | no | |
as_of | string | no | ISO date (YYYY-MM-DD): the facts believed at the end of that day rather than now |
memtro_timeline
How knowledge changed over time. Returns the memories recorded or superseded in a date window, oldest first, each with when it was recorded, when and by what it was replaced, and the dates it was valid for. Use it for "how did X change over the quarter", "what did we think about X before July" and "what changed since <date>". Name an entity to follow one thing; leave it out for everything that changed in the window. This is the only tool that returns superseded memories.
| Input | Type | Required | What it is |
|---|---|---|---|
entity | string | no | Entity name (fuzzy, aliases included). Omit for the whole memory. |
from | string | no | ISO date: include memories recorded or superseded on or after this day |
to | string | no | ISO date: include memories recorded by the end of this day |
limit | integer | no | Newest entries to return (default 40) |
Registers
Commitments (who promised what, by when, and whether it landed; switched on under Organisation → Features, see Commitments).
memtro_commitments
Who promised what and by when, taken from meeting notes and team chat. Use it for "what did we promise BigCo?", "what is Priya on the hook for?" and "what is overdue?". IMPORTANT: this is the record of the promise, not a live check on whether it was kept. Each verdict is a nightly judgement made from memory as it stood that night, so it can be out of date by a day or by a sync. Before telling anyone that something did or did not happen, check the system that would hold the proof with its own tools — the invoice in the ledger, the issue in the tracker, the message in the mailbox — and say which you checked. Nothing here is ever marked missed: a commitment with no evidence is still open, and the verdict says only what was looked for.
| Input | Type | Required | What it is |
|---|---|---|---|
owner | string | no | Person or team name, to narrow it to what they owe |
state | one of open, overdue, landed, cancelled, all | no | Default open, which includes overdue ones |
limit | integer | no |
memtro_update_commitment
Change an entry on the commitment register: mark a promise done, mark it dropped, reopen it, or correct its wording or its due date. Pass the id from memtro_commitments. Use it as soon as someone tells you a promise was kept, abandoned or moved — otherwise the page keeps saying open, and for work that leaves no trace in a connected system it will say that forever. Marking something done or dropped needs note saying what that rests on: the system you checked and what it showed, or whose word it is. Say so in your reply too, so nobody reads a confirmation as a verified fact.
| Input | Type | Required | What it is |
|---|---|---|---|
id | string | yes | Commitment id, as memtro_commitments returns it |
status | one of landed, done, cancelled, dropped, open | no | landed/done = it was carried out; cancelled/dropped = it will not be, and should stop being chased; open = reopen one settled by mistake |
note | string | no | What the status rests on, in one line: the system checked and what it showed, or who confirmed it and when. Required to mark something done or dropped. |
due_on | string | no | ISO date (YYYY-MM-DD) the deadline moved to |
what | string | no | Corrected description of the promise, one line, third person, keeping any figures and names |
memtro_record_commitment
Put a promise on the commitment register: a named person or team undertook to do a specific thing. Use it when someone commits during this conversation, or tells you about a commitment made somewhere Memtro cannot see (a phone call, a meeting with no notes). Promises in meeting notes and team chat are read automatically overnight, so do not copy those in by hand. Only record an actual undertaking by a named owner — an idea, a hope or a decision is not a commitment, and a register full of those is one nobody trusts.
| Input | Type | Required | What it is |
|---|---|---|---|
owner | string | yes | The person or team who undertook it, named as the organisation would name them |
what | string | yes | What they undertook to do, one line, third person, keeping any figures, names and systems mentioned |
due_on | string | no | ISO date (YYYY-MM-DD) it is due. Leave out if no deadline was given — do not invent one. |
promised_on | string | no | ISO date it was promised, if that was not today |
from | string | no | Where the promise was made, if it was not this conversation (e.g. "a call with Baltic on 9 Oct") |
Contradictions (the things the business believes twice, differently; switched on under Organisation → Features, see Contradictions).
memtro_contradictions
Things this organisation believes that cannot both be true, found by reading its memory against itself overnight. Each one carries both statements with the system and date each came from. Use it for "what do we disagree with ourselves about?", "is anything we tell customers out of date?", and before answering a question where two systems might say different things. IMPORTANT: these are pairs of remembered statements, not a live check. Before telling anyone which side is right, look in the system that would settle it with its own tools and say which you checked — then record the answer with memtro_answer_contradiction so memory stops holding both.
| Input | Type | Required | What it is |
|---|---|---|---|
state | one of open, resolved, dismissed, all | no | Default open: the ones nobody has answered |
severity | one of high, medium, low | no | Narrow it to how much it matters: high means somebody could act wrongly on it today |
limit | integer | no |
memtro_answer_contradiction
Answer a contradiction: say which of the two statements stands. Pass the id from memtro_contradictions. "a" or "b" supersedes the other statement in memory, which is the whole point — a system told which of two beliefs is wrong and keeping both has learned nothing. "both" leaves both standing (they describe different periods or different parts of the business) and "neither" says they never disagreed; both close the question without touching memory. Answer only from something you checked or something somebody told you in this conversation, never from your own inference, and say in your reply what the answer rests on.
| Input | Type | Required | What it is |
|---|---|---|---|
id | string | yes | Contradiction id, as memtro_contradictions returns it |
answer | one of a, b, both, neither | yes | a/b = that statement stands and the other is superseded; both = both true; neither = not a contradiction |
note | string | yes | What the answer rests on, in one line: the system you checked and what it showed, or who said so and when |
memtro_raise_contradiction
Raise a contradiction nobody had noticed: two things the organisation believes that cannot both be true. Use it when you find one while answering something else — two systems disagreeing about the same customer, a public claim that no longer matches the records — or when somebody points one out. Pairs of remembered statements are found automatically overnight, so do not copy those in. Give the memory ids where you have them (memtro_search returns them), because that is what lets the answer supersede the statement that loses.
| Input | Type | Required | What it is |
|---|---|---|---|
question | string | yes | One sentence stating both sides and asking which is right, as a colleague would ask it |
about | string | yes | What the disagreement is about, three to six words |
claim_a | string | yes | The first statement, as it is believed |
source_a | string | yes | Where the first came from: a system name, a document, or who said it |
claim_b | string | yes | The second statement |
source_b | string | yes | Where the second came from |
memory_id_a | string | no | The memory behind the first statement, if you have it |
memory_id_b | string | no | The memory behind the second statement, if you have it |
severity | one of high, medium, low | no | high = somebody could act wrongly on it today (a customer-facing claim, a price, a contract term); default medium |
subject | string | no | The person, company or thing both statements are about |
Jargon (the words the business uses in its own way; switched on under Organisation → Features, see Jargon).
memtro_glossary
Words this organisation uses in its own way — acronyms, process names, ordinary words used as terms of art — with a note on what each one points at here. Look a word up BEFORE answering a question that turns on it, so you do not read it in its ordinary sense. Each note is a POINTER, not a definition: it was written from a handful of uses and the term almost always reaches further, so never use one to narrow what somebody means, to tell them they are using their own word wrongly, or to rule something out because the note did not mention it. Where the answer turns on the edge of a meaning, look at how the word is actually used (memtro_search) and say what you found. Also use this to see which words are still waiting for somebody to say what they point at, and which are used in more than one sense.
| Input | Type | Required | What it is |
|---|---|---|---|
term | string | no | One word or phrase to look up; leave out for the whole glossary |
state | one of defined, open, all | no | Default defined: the ones somebody has confirmed. open = raised and still unanswered. |
limit | integer | no |
memtro_define_term
Record what one of this organisation's words points at, in its own terms. Use it when somebody explains a word in the conversation ("a MID is the acquirer's merchant identifier"), or confirms what one of the open entries is getting at. It becomes a memory and joins the glossary, so later answers stop reading the word in its ordinary sense. Write it as a pointer and keep it broad enough to be true of every use you have seen — a note that is too narrow will be read as the whole meaning. Only record what somebody actually said: a definition you inferred is a guess, and a glossary of guesses is worse than none.
| Input | Type | Required | What it is |
|---|---|---|---|
term | string | yes | The word or phrase, written as the organisation writes it |
definition | string | yes | What the word points at here, in one sentence, broad enough to cover every use you have seen |
id | string | no | The glossary id from memtro_glossary, where this answers an entry already raised |
memtro_update_term
Change a glossary entry: correct or widen what a word points at here, take it out of the glossary, or put it back to be asked about again. Widening one is as useful as correcting it — somebody finding that the note was narrower than the word is exactly the thing worth recording. Pass the id from memtro_glossary. Use it the moment somebody corrects a definition in the conversation — a glossary that is wrong is worse than one that is empty, because every later answer reads the word that way. A corrected definition replaces the one it corrects in memory; withdrawing one removes the statement entirely, since a meaning nobody stands behind should not be retrievable. Only ever record what somebody actually said.
| Input | Type | Required | What it is |
|---|---|---|---|
id | string | yes | Glossary id, as memtro_glossary returns it |
definition | string | no | What the word points at, corrected or widened, in one sentence |
state | one of defined, dismissed, open | no | dismissed = not this organisation's word after all, and never raised again; open = withdraw the definition and ask again; defined is implied by passing a definition |
note | string | no | Why, in one line, for whoever reads the entry later |
Jobs
memtro_schedule_once
Schedule a ONE-OFF task at a single future moment: "remind me in a week to…", "on Friday afternoon check whether X landed", "chase this in two days". It runs once, reports into a chat like any job, and then deletes itself — nothing is left behind. Use this rather than memtro_schedule_job whenever the user means once. Work out the moment from today's date in your instructions and pass it as an ISO date and time. Write the prompt as complete instructions to a future assistant with no memory of this conversation, including what the user is expecting to be reminded of. Default timezone: UTC. Confirm the moment back in words.
| Input | Type | Required | What it is |
|---|---|---|---|
name | string | yes | Short name, e.g. 'Chase the Baltic invoice' |
prompt | string | yes | What to do on the day, with the names, systems and context a reader with no memory of this conversation would need |
at | string | yes | When to run it, as an ISO date and time (e.g. 2026-10-19T09:00) in the timezone below. A date on its own means 09:00 that day. |
timezone | string | no | IANA timezone the moment is in (default UTC) |
scope | one of personal, shared | no | shared = visible to and manageable by the organisation (still runs as this user); default personal |
mode | one of chat, agent | no | agent (multi-step, default) or chat (single reply) |
model | string | no | Model id or 'auto' (default) |
memory | one of org, personal, off | no | Where facts learned during the run are stored; defaults to the scope |
memtro_schedule_job
Create a scheduled job: a task the assistant will carry out on a cron schedule with the same tools, as this user, saving each run's report to a chat. Use when the user asks for something recurring or at a future time ("every morning…", "each Friday…", "check X daily"). Write the prompt as complete instructions to a future assistant that has no memory of this conversation. Five-field cron: minute hour day-of-month month day-of-week, e.g. "0 9 * * 1-5" (weekdays 09:00), "0 * * * *" (hourly), "30 17 * * 5" (Fridays 17:30), "0 9 1 * *" (1st of the month). Default timezone: UTC. Confirm the schedule back to the user in words.
| Input | Type | Required | What it is |
|---|---|---|---|
name | string | yes | Short name, e.g. 'Daily VIP ticket digest' |
prompt | string | yes | What to do on every run, with names, systems, filters and what the report should contain |
schedule | string | yes | Five-field cron expression |
timezone | string | no | IANA timezone the schedule is in (default UTC) |
scope | one of personal, shared | no | shared = visible to and manageable by the organisation (still runs as this user); default personal |
mode | one of chat, agent | no | agent (multi-step, default) or chat (single reply) |
model | string | no | Model id or 'auto' (default) |
memory | one of org, personal, off | no | Where facts learned during runs are stored; defaults to the scope |
memtro_list_jobs
List this user's scheduled jobs and the organisation's shared ones, with schedules, next/last run and status.
No inputs.
memtro_update_job
Change, pause, resume, run now or delete a scheduled job (by id from memtro_list_jobs). Five-field cron: minute hour day-of-month month day-of-week, e.g. "0 9 * * 1-5" (weekdays 09:00), "0 * * * *" (hourly), "30 17 * * 5" (Fridays 17:30), "0 9 1 * *" (1st of the month).
| Input | Type | Required | What it is |
|---|---|---|---|
id | string | yes | |
name | string | no | |
prompt | string | no | |
schedule | string | no | |
timezone | string | no | |
enabled | boolean | no | false pauses the job, true resumes it |
mode | one of chat, agent | no | |
model | string | no | |
memory | one of org, personal, off | no | |
run_now | boolean | no | Queue a run within the next minute, in addition to the schedule |
delete | boolean | no | Delete the job (its past runs stay in its chat) |
Agent mode
memtro_delegate
Delegate a self-contained sub-task to a worker agent that has the same tools. Returns the worker's final report. Use for parallelisable research or for long multi-step lookups that would clutter your own context.
Agent mode only.
| Input | Type | Required | What it is |
|---|---|---|---|
task | string | yes | Complete instructions for the worker, including names, ids, date ranges and what to return |
context | string | no | Any facts from this conversation the worker needs |