AiAkiv Memory
Shared memory for AI agents
- Category
- AI
- Primary Subcategory
- Personal AI Memory & Second Brain
Integration details
Description
AiAkiv is long-term memory that AI agents and teammates share over MCP. It saves the important parts of your conversations as a knowledge graph and recalls them across sessions, tools, and teammates — so context one AI saves, the next one picks up, and a whole team works from one shared memory instead of scattered private chats. Save with an explicit command ("ak save"), recall by meaning with semantic search. Hosted remote MCP server with OAuth sign-in; Korean and English supported.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Personal AI Memory & Second Brain
- Secondary Subcategories
- None listed
- Brand
- AiAkiv
- Access
- Account required
- First tracked
- 2026-09-22
- Tool count
- 21
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
Get alerts for AiAkiv Memory
Get updates when AiAkiv Memory’s Discoverability Score or category rank changes.
ChatGPT Plugin Discovery Score
ChatGPT Plugin discovery is coming soon
ChatGPT can surface a Plugin when it matches a user's request.Your Plugin Discovery Score measures how often yours appears.
No spam. Unsubscribe any time.
What discovery looks like

Competing in ChatGPT Personal AI Memory & Second Brain
View Category21 tools agents can invoke
Return the memory database's tables, columns, and types. Use this when a SQL query needs the schema first. Do not use it to read stored content; it describes structure alone. Read-only and cheap. The schema itself is public information; the data in those tables stays protected by RLS. Returns: Every table with its columns and their types.
Look up entities by name and return the events they appear in. Use this when the user names a person, project, system, or term and wants what is recorded about it. Do not use it for an open question about a topic; use `search_memory` for that. Read-only. Scope is decided by the server and reported in `searched_scope`. Args: entity_name: Substring to match, case-insensitive. May be empty when `entity_id` is given. entity_id: Exact entity id (`ent_...`), for following an entity a previous response named. Same scope as a name lookup; it takes precedence over `entity_name`. limit: Max events per entity (1-50, clamped). Returns: `{query_name, hint, suggestion, matches, tag_matches, searched_scope}`. The same substring also matches tags, which arrive in `tag_matches`. Each match's `top_partners` is the co-occurrence ranking across the whole scope, which is what "which entity co-occurs most with X?" asks for; `hint.entities[].hit_count` counts only within this response's sample.
Walk the entity-event graph outward from what a sentence finds, one or two hops. Search returns the closest events; this returns events connected to them through shared entities the vector ranking left outside the top hits, each candidate carrying its bridge entity, path, and evidence. Use this when the user asks what is linked to something that a ranked search did not surface. Do not use it for a direct answer to a question; use `search_memory` for that. Do not use it when the request states a pattern to match; use `query_memory_graph` for that. Read-only. Candidates are unverified pointers, not established facts. Args: sentence: One complete sentence, not keywords. Required for every relation except `explore`, which forbids it. anchor_entity_id: An entity id to walk from instead of a vector entry; this path does not depend on the ranking. Required for `relation="explore"`. relation: `similar` (default, time-stratified), `before`, `after`, `evolution`, `contrast`, or `explore`. `before` and `after` require exactly one of `reference_time` or `anchor_event_id`; there is no implicit "now". `contrast` returns candidates narrowed by cosine without judging opposition, which the reader does. `explore` needs `anchor_entity_id`, forbids `sentence`, and returns `grounding="exploration"`. reference_time: ISO 8601 basis for `before` and `after`. anchor_event_id: Event basis for `before` and `after`. top_n: Max candidates per round (server-capped). expansion_rounds: 1 (default) or 2. Round 2 re-expands from the round-1 picks through bridges not used in round 1, reaching things two structural steps away, so a 2-round call can return up to twice `top_n` in total. Each candidate carries its `round`. Returns: `{candidates: [{event_id, summary, path, bridge_entity_id, cosine, cosine_percentile, timestamp}], grounding, grounding_basis, bridges, entry, searched_scope, truncations}`. `grounding` is `grounded`, `weak`, `absent`, or `exploration`; `absent` means no neighbourhood exists for this sentence in scope, an honest empty rather than a failure. `event_id` feeds `get_memory_content`.
Walk the entity-event graph across the caller's org and a partner org. Use this when the user asks what a linked partner team's memory connects to something of their own. Do not use it for a plain partner lookup; use `search_partner_memory` for that. Do not use it when the request states a pattern to match; use `query_partner_memory_graph` for that. Reads the partner org and writes nothing to either side. Candidates are unverified pointers, not established facts. Calls are handled one at a time per org: a second link call issued while one is in flight comes back with `reason: busy` without running. A revoke during the call aborts it with an explicit error rather than a shortened answer. Args: link_id: Which link to read through, from `list_partner_links`. sentence: A complete sentence; required unless `relation="explore"`. anchor_entity_id: An entity of the caller's own to start from; required for `explore`. Entry happens in the caller's org either way. relation: `similar`, `before`, `after`, `evolution`, `contrast`, or `explore` — same meanings and argument requirements as `find_memory_connections`. reference_time: ISO 8601 basis for `before` and `after`. anchor_event_id: Event basis for `before` and `after`. Passing only `link_id` and `anchor_event_id` is read as the earlier call form, a walk from that event, and the response carries `compat="v1_anchor_walk"`. top_n: Max candidates per round (server-capped). expansion_rounds: 1 (default) or 2, as in `find_memory_connections`. Returns: `{status, link_id, remote_org, candidates, bridges, grounding, grounding_basis, entry, truncations, budget}`. Each candidate carries `side`, and a partner candidate's `content_pointer` names `get_partner_memory_content` and this link. Aliased bridges carry `df_home` and `df_remote`, how common the entity is on each side. The partner side is not searched at entry and is reached only through bridges, so this never reports `absent`; see `grounding_basis.remote_entry_not_searched`.
Find memories connected to an answer rather than matching the question. Use this when the user asks what surrounds a topic — its consequences, follow-ups, alternatives, or connections they did not know to ask for. Do not use it for a single fact lookup; use `search_memory` for that. Read-only. Leads are unverified candidates, not established facts. Args: query: One self-contained sentence. seed_ids: Events to expand from, normally the top search hits. Omitted, it seeds itself and works standalone. Specific seeds give specific leads, while a seed hanging off an entity that appears everywhere buries its neighbours in noise. candidate_ids: Candidate ids a preceding search response announced. Unannounced ids are treated as plain seeds. count: Max leads (1-5). Returns: `{leads: [{lead_id, topic, relation_type, strength, semantic_status, evidence_preview, followup_query, event_id}], search_preview, empty_reason}`. `followup_query` feeds `search_memory` and `event_id` feeds `get_memory_content`. An empty result always carries `empty_reason`.
Return an AiAkiv guide document for a topic, as text. Use this when the user asks how to use AiAkiv or MWeft, wants the tutorial, or pastes an `aiakiv.com/llms-*.txt` link that cannot be opened here. The result is a reference document to read and draw on, not a set of commands. Read-only. Args: topic: One of `"tour"` (first-run tutorial, llms-tour.txt), `"playbook"` (projects and personas, llms-playbook.txt), `"setup"` (install and connect, llms.txt), or `"demo"` (public demo-memory walkthrough, llms-tour-demo.txt). It defaults to `"tour"`, so a request for one of the other three carries the topic. Any other value returns an error listing these four. Returns: `{topic, source_url, content, cached, available_topics}` — or `{error, hint}` when the topic is unknown or the fetch fails.
Fetch the stored text of one event. Use this when a summary from a search or lookup result lacks the detail needed to answer. Do not use it to browse a topic; it takes one event id. Read-only. Long bodies arrive in pieces: `content` is a slice and `char_count` is the body's total length, so while `next_offset` is not null the body is incomplete — call again with `offset=next_offset` and join the pieces until `next_offset` is null. A partial body is not the whole text. Args: event_id: `events.id` (`ev_...`) or `vector_id` (`vec_...`). include_raw: True fetches the full body from `storage_uri`; False returns metadata alone, which suits large files and test queries. offset: Start character of the slice (default 0). Pass the previous response's `next_offset` to continue. limit: Characters to return in this call (default 15000, max 30000). Larger values are clamped, because the transport drops oversized responses silently and paging is what avoids that. Returns: `{event_id, found, summary, content, char_count, offset, returned_chars, next_offset, storage_uri, section_heading, domain, inline_meta}`.
Read one linked partner event's body, paged. Use this when a partner search result's summary lacks the detail needed to answer. Do not use it for the caller's own events; use `get_memory_content` for that. Reads the partner org and writes nothing. It takes an `event_id` and no raw storage pointer, because the link surfacing that event is what grants its body. Calls are handled one at a time per org: a second link call issued while one is in flight comes back with `reason: busy` without running. Args: link_id: The link the event came from. event_id: From `search_partner_memory` results. offset: Start character (default 0). limit: Characters to return (server-capped). Returns: `{status, link_id, remote_org, found, event_id, summary, content, char_count, offset, returned_chars, next_offset}`. While `next_offset` is not null the body is incomplete — call again with `offset=next_offset`. `found: false` is the same answer whether the event is absent or outside the link's scope.
Report where saves currently go, and how to change it. The target is the signed-in account plus the project coordinates: a team name, a save domain, and a save group. Use this when the user asks where their memory is being saved, asks to switch project, or when expected memory seems missing and the account or project may have changed. Do not use it to change the target — no tool can do that; the switch happens when the user opens `switch_url` and clicks. Read-only. Returns: `{team, account, account_email, project, binding, read_only, link_id, save_domain, save_group, switch_url, switchable_via, persona?, emergency_notice?, note}`. `binding` says what the target is pinned to: `folder` and `api-key` mean this connection is pinned to that project and a console switch elsewhere does not move it; `main` means it follows the account-wide preset and can change mid-session; `public-read` and `link-read` are read-only binds where saving is disabled. `persona`, when present, is a project-level note set by the project owner in the web console.
Hide a saved event from all recall — search, neighbors, and derived layers. Use this when the user says a memory was saved by mistake, landed in the wrong project, or has been superseded. Do not use it to remove data permanently: this is a reversible hide rather than a delete, and un-hiding is an operator action, not a tool. Writes to an existing record. Events belonging to another team are refused. Args: event_id: The event to hide. Returns: `{event_id, deprecated, hidden, changed}` — or `{error}` when the id is empty, not found, or belongs to another org.
List the projects the signed-in account can save to or read. Use this when the user asks which projects they have, which one they are saving to, or wants to move their saves elsewhere. Do not use it to perform the switch — no tool can move the account-wide target; the user's click on a project's `switch_link` is the switch. Read-only. Returns: `{projects: [{project, team, save_domain, save_group, is_main, is_this_connection, read_only?, switch_url, switch_link}], main_project, display, note}`. Each `switch_link` is a clickable link; the user's click on it performs the switch. `is_main` marks the account-wide target; `is_this_connection` marks the project this connection is folder-bound to. Entries with `read_only` are public targets the account can read without owning a preset, such as a shared demo. A wanted memory is located by its `team`, not by an exact project name.
Return events in chronological order for an entity, tag group, or domain. Use this when the user asks how something developed over time, or what happened in a period. Do not use it to rank by relevance to a question; use `search_memory` for that. Read-only. The domain is decided by the server and reported in `searched_scope`. Args: entity_id: Return events involving this entity, from `find_memories_by_entity`. cg_id: Return events carrying this tag group, named by the group ids in a search response's `hint.categories`. days: Restrict to the last N days. limit: 1-200 (default 20). Returns: `{mode, anchor, events, total, truncated, searched_scope}`. With neither `entity_id` nor `cg_id`, the flow covers the whole domain.
List the org links the caller can read through, and whether each works now. Use this when the user asks which partner teams they can read, or when a link tool returned an error and the reason needs checking. Do not use it to read partner content; the `mweft_link_*` tools do that. Read-only and local: it keeps answering while the partner org is down, which is when its answer matters most. Returns: `{status, count, links: [{link_id, partner_org_id, status, usable, blocked_reason, contract_version, reconsent: {mine, partner}, expires_at, created_at}]}`. `link_id` is what every `mweft_link_*` tool takes, and `usable` says which links will answer. `blocked_reason` names what to fix: `link_not_active` (suspended, pending, or revoked), `contract_version_too_old` (both owners re-consent — `reconsent` says who is missing), `principal_not_active` (this direction is closed), or `we_are_provider` (links run one way and this side issued the invite, so the other team reads our memory and there is nothing here to read). An empty list is an honest empty, not an error.
Run a read-only SQL query against the memory database. Use this when the user wants exact counts, aggregates, or table-level facts that a semantic search cannot give. Do not use it to change data: SELECT and WITH statements only. Read-only. Access control is applied by the server, so rows outside the caller's permissions never appear. A LIMIT and a statement timeout are applied automatically. Args: sql: A SELECT or WITH statement. `describe_memory_schema` returns the table and column names to write it against. max_rows: Automatic LIMIT cap, preserved when the query already sets one. Default 10000. timeout_ms: Postgres statement timeout in milliseconds. Default 5000.
Run a graph query, in a Cypher subset, over the caller's own memory graph. Use this when the user wants a structured traversal — shared-entity counts, paths between events, tag membership — that a text query cannot express. Do not use it for relational table facts; use `query_memories_with_sql` for that. Do not use it when the starting point is a sentence and no pattern is stated; use `find_memory_connections` for that. Read-only. The subset: a query opens with `START a = events(text: "..." | entity: "name or id" | ids: [...], k: n)`, so the anchor set is always events. Events reach events through `SHARES` (shared entities), `SIMILAR` and `FAR` (vector), and `NEXT`; entities through `PARTICIPATED_IN`, tags through `MEMBER_OF`. There is no `WITH` — conditions go in relation parameters such as `{min: 3}`. The rest is ordinary Cypher: `MATCH`, `WHERE`, `RETURN [DISTINCT]`, `ORDER BY`, `LIMIT`, aggregates in `RETURN`, `$name` parameters, and `cos(a, b)`. Example: `START a = events(text: $q, k: 3) MATCH (a)-[:PARTICIPATED_IN]-(e) -[:PARTICIPATED_IN]-(b) RETURN b, count(DISTINCT e) AS shared ORDER BY shared DESC LIMIT 20` Args: query: The graph query text. params: Values for `$name` references (strings, numbers, lists). Returns: `{columns, rows, row_count, start, partial, truncated, plan, budget, notes}`. Rows are projected: an Event to `{id, summary, timestamp, order_index}`, an Entity to `{id, name, type}`, a Tag to `{id, name}`. Budget caps are reported in `truncated`, never applied silently. Rejections come back as `{error, blocked_by: syntax|grammar|params, hint?, allowed_*}`.
Run the same graph query language across the caller's org and a partner org. Use this when the user asks how their own memory relates to a linked partner team's. Do not use it to read the partner alone; use `search_partner_memory` for that. Do not use it when the starting point is a sentence and no pattern is stated; use `find_partner_memory_connections` for that. Reads the partner org and writes nothing to either side. Calls are handled one at a time per org: a second link call issued while one is in flight comes back with `reason: busy` without running. Args: link_id: Which link to read through, from `list_partner_links`. query: The graph query text, same grammar and vocabulary as `query_memory_graph`. `START` resolves in the caller's org only; the walk crosses into the partner's events through entities the link has aliased, which count as one entity for `PARTICIPATED_IN` and `SHARES`. `NEXT`, `MEMBER_OF`, and `CONNECTED` stay within a side. params: Values for `$name` references. Returns: `{status, link_id, remote_org, columns, rows, row_count, start, partial, truncated, plan, budget, notes}`, or `{status: error, error, reason, detail}` where `error` repeats the reason code. A query the grammar rejects also carries `{blocked_by: syntax|grammar|params, hint?, allowed_*}`, as on the home path. Returned events carry `side` (`remote` = partner), and partner content opens with `get_partner_memory_content`. A `reason` names the state of the link, not a failure of the caller's own memory.
Create or query data in an AiAkiv app. Use this when the user asks to make or look up something in an AiAkiv app, for example a card built from a memory they already have. Do not use it to save a memory; use `save_memory` for that. Writes when `action="create"`. Some apps publish the result to the open web: the returned link is live the moment it comes back — unlisted, but reachable by anyone holding the address — and that publication cannot be undone from here. The content is written by the caller from memory the user can already read; the server never calls a model. Args: app: The app name. An unknown one returns `available_apps`. action: `"describe"` returns the app's field list and limits, which is how the exact input shape for an app is established; `"create"` writes. Apps may define further read actions, which `describe` lists. data: The app's payload — a JSON object, or a JSON string holding one. The string form survives transports that mangle long multi-line fields. Returns: `{ok, app, key, url, notice?}` on create, or `{error, hint}`. The returned `url` is the link to the created item. A `notice` is the app stating what just became public and how to undo it, which is information the user needs to see rather than a detail to compress away. On a shape error the app names the offending field.
Save a piece of conversation content to memory. Use this when the user explicitly asks to save or record something. Do not use it on a bare "remember this" or a request to summarize; those are not save requests. Writes a new record. The destination project and folder come from the active target and cannot be set from here. Args: payload: Alternative call form bundling {summary, entities, content, tags} into this one argument, as a JSON object or a JSON string. The other arguments are ignored when it is given. summary: The retrieval surface, required unless `payload`, up to 500 characters. Searches rank against this rather than the content, so exact identifiers kept verbatim and the acting party named in the first sentence are what make the record findable later. entities: NER results [{name, type}, ...], required unless `payload`. One canonical spelling per entity; records connect on shared names. tags: List of short slash-paths. Reusing the closest paths from a prior response's `suggested_tags` or `tag_tree` keeps them consistent. Ids, hashes, and dates are soft-rejected. content: The original text, required unless `payload`, up to 50000 characters. Longer text is split across calls, each passing the previous `event_id` as `prev_event_id`, with its own summary. prev_event_id: The prior call's `event_id` when this save continues it. allow_truncation_marker: Content carrying a truncation marker left by upstream tooling is refused with `truncation_marker_detected`, since nothing downstream can distinguish a cut body from a whole one. Set it True when the marker is part of what is being recorded. assert_project: The server refuses the save if the resolved target differs from this project name. It blocks, never redirects. timestamp: ISO 8601; defaults to the current time. source: Upstream origin `{provider, address, version?}` when the content came from outside this conversation. Returns: `{event_id, tags, tag_tree, suggested_tags?, saved_entities, rejected_tags?, continuation_hint, edit_command, active_target}`. `saved_entities` and `rejected_tags` let the user correct a wrong entity or a dropped tag through `update_memory`. `suggested_entities` is advisory — a literal name match does not establish that it denotes the same thing here.
Find stored memories that answer a question. Use this when the user asks about something that may already be recorded, or refers back to an earlier conversation, decision, or document. Do not use it to explore what surrounds an answer; use `find_related_memories` for that. Read-only. Scope is decided by the server from the signed-in account and reported in `searched_scope`. Args: query: One self-contained sentence. Resolving referents from the conversation and keeping exact identifiers intact both help it rank. top_k: Max hits (1-50, clamped). mode: `"hybrid"` (events + entities), `"events"`, or `"entities"`. principal: Restrict to content attributed to one user or team — a handle (email or team name) or a principal id, not a name to match. More than one match returns `principal_candidates` to re-call with. offset: How many top-ranked results to skip, for reading further down the same ranking. Defaults to 0, and is clamped to 200. A response that has more behind it names the continuing offset in `continuation`. Returns: `{query, mode, hits, total, hint, searched_scope}`. `hint` is a connection map over all results (threads, entities, categories, clusters, available_channels). Event hits may carry `connections.sequential {prev, next}`.
Search a linked partner org's memory. Use this when the user asks what a partner team has recorded about something. Do not use it to search the caller's own memory; use `search_memory` for that. Reads the partner org and writes nothing; a link is a read capability both orgs agreed to rather than a project to switch into, so the caller's own scope is untouched and `link_id` is passed per call. Results are the partner's events and stay theirs. Calls are handled one at a time per org: a second link call issued while one is in flight comes back with `reason: busy` without running. Args: sentence: One complete sentence, not keywords. link_id: Which link to read through, from `list_partner_links`. top_n: Max hits (server-capped at 50). domain: An optional single remote domain to narrow to. Returns: `{status, link_id, remote_org, hits: [{event_id, domain, summary, timestamp, distance, link_id}], count}`. With `status="error"` the `reason` (`no_links`, `contract_version_too_old`, `busy`, ...) describes the state of the link, not a failure of the caller's own memory. `event_id` feeds `get_partner_memory_content`.
Correct the entities, tags, and order links on a saved event. Use this when the user says a saved memory has a wrong or missing entity or tag, or that two saves belong in sequence. Do not use it to change the saved text; the stored content is never modified. Writes to an existing record. Args: event_id: The event to correct. remove_entities: Entity names or ids to unlink; orphans are deprecated. add_entities: New entities [{name, type}, ...]; creates one when the exact spelling does not exist. add_entity_ids: Existing entity ids to link, never creating. Each is re-validated; failures come back in `rejected_entity_ids`. Idempotent. add_tags: Tag paths to attach (same rules as `save_memory`). remove_tags: Tag leaf names or group ids to detach. add_prev_events: Event ids that come before this one, linking `other -> event_id`, for saves that belong together but were not chained at save time. remove_prev_events: Event ids to unlink from the front of this event. Links carrying document structure from ingestion are refused as `protected_source` and cannot be rebuilt. The direction is always "prev", so cutting a link on the other side means running this on the later event. An id in both lists is refused as `conflicting_request` and neither operation runs. Returns: `{event_id, removed_count, added_count, now_linked_entities, orphaned_entities, added_tags?, removed_tags?, rejected_tags?, rejected_entity_ids?, added_prev_events?, removed_prev_events?, rejected_prev_events?, graph_delta?}`. `graph_delta` reports the derived-layer re-sync when participation or tags actually changed; a link-only edit feeds no derived layer and carries none.
How do I improve a ChatGPT Plugin's discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are AiAkiv Memory alternatives on ChatGPT?
As of 2026-09-22, AiAkiv Memory competes with AI Passport, AI Whisper Voice Note Taker, AI Wisebase, Arkon Vault, Auto, Axiomyx Mobile, Axiomyx Personal, Axis, Basic Memory Cloud, ButlerBrain, CentricMem, Chat2Doc, ChatData Sync, CherryDrop, Coconut, ContextBolt Bookmarks, Contextick, Contextli, Continuity, CopyCharm, Cortex — Semantic Memory, Create State, Cribly, Dijin Memory, DotSpark, Empirical, Engram, Esment, Fieldy, Fluent, Genesys, Giraffe, GoodMem, Guides, Hjarni Notes, Jade Note, Jotter, Kepler, KinicMemory, Komplyt Zero, LIAM, Lians Memory, Linko, Looki, Memocore, Memoket, Miyo, Mygentic, NeoSapien, NewTwos, NugIt, Oi, omi, Omphalis, Open Context, Orbismo, Personal Context, Rhythm AI Personality Tuner, Savantis Memory, Stem, Symbol, TimePeace — Daily Log, TwinMind, UseMyContext.ai, VaultSage, VITALS, Vocci, Voicenotes, Wazu, Weave, Werify, XMemo, こころぐ, 티에이치스터디 in ChatGPT Personal AI Memory & Second Brain, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.