MCP App Store
Productivity
Native Soil icon

Native Soil

by Mastodont AB

Overview

Native Soil saves the working state of your AI chat (the decisions, the context, and the plan) and lets you load it in any other model, client, or provider. Switch tools, hit a context limit, or come back tomorrow, and pick up exactly where you left off instead of re-explaining everything. Every save is verified, and secrets and private data are stripped before anything is stored. Type "soil save" to capture the state, then "soil load" to restore it anywhere.

Tools

soil_canon

ChatGPT
READ-ONLY query of a shared team project's CANON, its accumulated load-bearing truths (decisions, constraints, identity, architecture, workflow, vocabulary, rejected paths). Use it to expand a claim instead of asking the user to reload the project. Filter by ids (e.g. a c003 from a digest), kind, or q (case-insensitive search over statement + reason); returns matched claims grouped by kind, with masked attribution and lineage, paginated by limit + cursor. REQUIRES an explicit @project the user is a member of: pass the reference WITH the leading @ in project. A personal/bare context has no canon and returns a clean 'no project canon' note. Never changes the canon and costs nothing. IMPORTANT: the returned text is a finished, user-facing status message — show it to the user IN FULL, exactly as written. Do NOT summarize it, collapse it into one line, or drop the verification details.

soil_canon

ChatGPT
READ-ONLY query of a shared team project's CANON, its accumulated load-bearing truths (decisions, constraints, identity, architecture, workflow, vocabulary, rejected paths). Use it to expand a claim instead of asking the user to reload the project. Filter by ids (e.g. a c003 from a digest), kind, or q (case-insensitive search over statement + reason); returns matched claims grouped by kind, with masked attribution and lineage, paginated by limit + cursor. REQUIRES an explicit @project the user is a member of: pass the reference WITH the leading @ in project. A personal/bare context has no canon and returns a clean 'no project canon' note. Never changes the canon and costs nothing. IMPORTANT: the returned text is a finished, user-facing status message — show it to the user IN FULL, exactly as written. Do NOT summarize it, collapse it into one line, or drop the verification details.

soil_info

ChatGPT
Show the user's Soil status (project + handover counts and recent handovers, code-first; identity stays masked). Call on soil, soil status, or soil info; no confirmation needed. IMPORTANT: the returned text is a finished, user-facing status message — show it to the user IN FULL, exactly as written. Do NOT summarize it, collapse it into one line, or drop the verification details.

soil_info

ChatGPT
Show the user's Soil status (project + handover counts and recent handovers, code-first; identity stays masked). Call on soil, soil status, or soil info; no confirmation needed. IMPORTANT: the returned text is a finished, user-facing status message — show it to the user IN FULL, exactly as written. Do NOT summarize it, collapse it into one line, or drop the verification details.

soil_list

ChatGPT
List the user's saved Soil handovers (load code, project, title, saved-at, readiness; newest first). Call on soil list. soil list @project lists a shared team project's threads (code, title, contributor, readiness) so the user knows what to load. IMPORTANT: the returned text is a finished, user-facing status message — show it to the user IN FULL, exactly as written. Do NOT summarize it, collapse it into one line, or drop the verification details.

soil_list

ChatGPT
List the user's saved Soil handovers (load code, project, title, saved-at, readiness; newest first). Call on soil list. soil list @project lists a shared team project's threads (code, title, contributor, readiness) so the user knows what to load. IMPORTANT: the returned text is a finished, user-facing status message — show it to the user IN FULL, exactly as written. Do NOT summarize it, collapse it into one line, or drop the verification details.

soil_load

ChatGPT
Load a saved Soil handover into this session as a paste-ready restore block. Call on soil load #001 (exact code) or soil load <project> (latest in a project). ALWAYS pass the exact reference the user gave in reference; NEVER call with an empty reference to ask which project. Grammar (@=where, #=which): a bare #NNN is always PERSONAL (the user's handover, never a project thread). A non-numeric soil load #name loads the personal handover SAVED UNDER THAT NAME (newest); if no name matches it falls back to the latest in the personal project with that label; if both match, the tool refuses and asks for the exact code, so relay that and never pick one. soil load @project restores the WHOLE shared team project (contents plus every thread, attributed); soil load @project #NNN restores ONE thread in it (by its project-local #NNN, #name, or title; #name = newest version under that name); you MUST pass @project #NNN to reach a team thread. A numeric #NNN is an EXACT code: unknown = not-found, never the latest. On not-found you MUST report it and offer soil list. NEVER load or present a different handover in its place, and never silently fall back to the latest. @project-only, best-effort: when a whole-project load ends with a CANON-RECALL CHECK, answer its probes FROM THE LOADED CANON and call soil_load again with the SAME @project and a recallAnswers array (each item: a probe id like p001 plus your one-line answer); skipping it does not affect the restore. IMPORTANT: the returned text is a finished, user-facing status message — show it to the user IN FULL, exactly as written. Do NOT summarize it, collapse it into one line, or drop the verification details.

soil_load

ChatGPT
Load a saved Soil handover into this session as a paste-ready restore block. Call on soil load #001 (exact code) or soil load <project> (latest in a project). ALWAYS pass the exact reference the user gave in reference; NEVER call with an empty reference to ask which project. Grammar (@=where, #=which): a bare #NNN is always PERSONAL (the user's handover, never a project thread). A non-numeric soil load #name loads the personal handover SAVED UNDER THAT NAME (newest); if no name matches it falls back to the latest in the personal project with that label; if both match, the tool refuses and asks for the exact code, so relay that and never pick one. soil load @project restores the WHOLE shared team project (contents plus every thread, attributed); soil load @project #NNN restores ONE thread in it (by its project-local #NNN, #name, or title; #name = newest version under that name); you MUST pass @project #NNN to reach a team thread. A numeric #NNN is an EXACT code: unknown = not-found, never the latest. On not-found you MUST report it and offer soil list. NEVER load or present a different handover in its place, and never silently fall back to the latest. @project-only, best-effort: when a whole-project load ends with a CANON-RECALL CHECK, answer its probes FROM THE LOADED CANON and call soil_load again with the SAME @project and a recallAnswers array (each item: a probe id like p001 plus your one-line answer); skipping it does not affect the restore. IMPORTANT: the returned text is a finished, user-facing status message — show it to the user IN FULL, exactly as written. Do NOT summarize it, collapse it into one line, or drop the verification details.

soil_prepare

ChatGPT
OPTIONAL depth helper that returns the Soil extraction recipe (sections to fill). You do NOT need to call this before soil_save: a real, verified save lands in ONE soil_save call. Call it to capture MORE depth (workflow, constraints, rejected-paths), or on an @project save to get the CANON DIGEST to disposition. The SAME single save mode either way. Pass the user's reference (everything after soil save, e.g. @acme-app #min-handover, either order) in project: a leading @ is a SHARED team project, otherwise the save is PERSONAL. Never file a personal save into an @project just because one is in the conversation. If the user gives no project, derive a short kebab-case projectId from the conversation yourself; never ask the user for one and never refuse to save because one was not given.

soil_prepare

ChatGPT
OPTIONAL depth helper that returns the Soil extraction recipe (sections to fill). You do NOT need to call this before soil_save: a real, verified save lands in ONE soil_save call. Call it to capture MORE depth (workflow, constraints, rejected-paths), or on an @project save to get the CANON DIGEST to disposition. The SAME single save mode either way. Pass the user's reference (everything after soil save, e.g. @acme-app #min-handover, either order) in project: a leading @ is a SHARED team project, otherwise the save is PERSONAL. Never file a personal save into an @project just because one is in the conversation. If the user gives no project, derive a short kebab-case projectId from the conversation yourself; never ask the user for one and never refuse to save because one was not given.

soil_save

ChatGPT
RECEIPT RULE — READ FIRST: a Soil save has happened ONLY if THIS tool returned a load code (a #NNN) THIS turn. There is no 'Soil memory fallback'. If no #NNN came back this turn, the save did NOT happen — tell the user plainly it was not saved, never show or invent a 'saved' card, and offer to retry (a fresh thread is most reliable). The #NNN is the only proof; the host's prose 'Saved' is not. Save the current working state as a Soil handover, loadable anywhere later. Call on soil save or a request to save to Soil. SELF-CONTAINED IS RULE ONE: a cold model loads ONLY this handover and cannot open anything, so every section must inline its actual content. Never point the reader elsewhere — do NOT write 'see ...', 'in the repo', 'in the docs', 'documented in ...', 'the draft', 'go read ...' or any fetch-it-from-X phrase, not even as a passing factual aside (state the fact directly: not 'no secrets in the repo' but 'no secrets or API keys are stored anywhere'). Naming a path as a plain label is fine ('the config in src/app.ts'); pointing at it as where-to-find-the-content is rejected. ONE soil_save call is enough, but ALL 17 extractionSections are EXPECTED — not a subset. Lead with the restore-critical core (executiveSummary, currentTask, nextSteps, decisions with why, restoreInstructions as a single standalone restore prompt, projectIdentity; add architecture for code), then fill EVERY remaining section too. For a section that genuinely does not apply, write a brief none rather than omitting it — every section must be present, and omitting any one is rejected. NEVER put a secret or a local/absolute filesystem path (an absolute home-directory or drive-root path) in any section; name locations generically (an absolute path is rejected). The extraction is then verified and SAVED in this one call. Calling soil_prepare first is OPTIONAL (for more depth). This is Soil's single self-sufficient save, not a quick/lite tier: the handover must stand alone — see RULE ONE above (every section self-contained, no external pointers; an external-file reference is rejected). Write the restore prompt to boot a cold model with ONLY the handover. Write it about the PROJECT, never about Soil: the save command, @project/#name routing, and load code are the MEDIUM, not project content; if the thread has no real project work yet, write an honest THIN handover marking gaps in the project's own terms, not Soil-machinery padding. A borderline handover comes back NEEDS-WORK (fix the gaps and call again) or DRIFT-TEST (re-read it cold, then call again with driftConfirmed:true). Incomplete input is NEVER saved. Grammar (@ says where, # says which, either order): soil save (personal, auto-named) · soil save #my-name (personal, named) · soil save @project (shared, membership-gated) · soil save @project #my-name (shared, named). Pass everything after soil save in project. A leading @ selects a SHARED team project; without it the save is PERSONAL, never filed into an @project just because one is in the conversation. For a SHARED @project save you MUST disposition the project's existing CANON: call soil_prepare FIRST to fetch the canon digest, then in canonOps give EVERY existing claim exactly one disposition (affirm/supersede/retire/conflict) and add any new locked truth — an unaddressed claim blocks the save and the shared canon is left un-patched. (soil_prepare stays OPTIONAL for a PERSONAL save.) An explicit #name becomes the handover NAME (overrides the extracted title); re-saving a name saves a NEW VERSION, loadable with soil load #my-name. Names cannot be all digits (numeric #NNN codes are auto-assigned). If the user gives no project, derive a short kebab-case projectId from the conversation yourself (e.g. payments-migration); never ask the user for one and never refuse to save because one was not given. EXPECTED on every save — do not skip these because they are not strictly required (they are expected, like captureCoverage): set modelName to the EXACT model id you are running as, read from you…

soil_save

ChatGPT
RECEIPT RULE — READ FIRST: a Soil save has happened ONLY if THIS tool returned a load code (a #NNN) THIS turn. There is no 'Soil memory fallback'. If no #NNN came back this turn, the save did NOT happen — tell the user plainly it was not saved, never show or invent a 'saved' card, and offer to retry (a fresh thread is most reliable). The #NNN is the only proof; the host's prose 'Saved' is not. Save the current working state as a Soil handover, loadable anywhere later. Call on soil save or a request to save to Soil. SELF-CONTAINED IS RULE ONE: a cold model loads ONLY this handover and cannot open anything, so every section must inline its actual content. Never point the reader elsewhere — do NOT write 'see ...', 'in the repo', 'in the docs', 'documented in ...', 'the draft', 'go read ...' or any fetch-it-from-X phrase, not even as a passing factual aside (state the fact directly: not 'no secrets in the repo' but 'no secrets or API keys are stored anywhere'). Naming a path as a plain label is fine ('the config in src/app.ts'); pointing at it as where-to-find-the-content is rejected. ONE soil_save call is enough, but ALL 17 extractionSections are EXPECTED — not a subset. Lead with the restore-critical core (executiveSummary, currentTask, nextSteps, decisions with why, restoreInstructions as a single standalone restore prompt, projectIdentity; add architecture for code), then fill EVERY remaining section too. For a section that genuinely does not apply, write a brief none rather than omitting it — every section must be present, and omitting any one is rejected. NEVER put a secret or a local/absolute filesystem path (an absolute home-directory or drive-root path) in any section; name locations generically (an absolute path is rejected). The extraction is then verified and SAVED in this one call. Calling soil_prepare first is OPTIONAL (for more depth). This is Soil's single self-sufficient save, not a quick/lite tier: the handover must stand alone — see RULE ONE above (every section self-contained, no external pointers; an external-file reference is rejected). Write the restore prompt to boot a cold model with ONLY the handover. Write it about the PROJECT, never about Soil: the save command, @project/#name routing, and load code are the MEDIUM, not project content; if the thread has no real project work yet, write an honest THIN handover marking gaps in the project's own terms, not Soil-machinery padding. A borderline handover comes back NEEDS-WORK (fix the gaps and call again) or DRIFT-TEST (re-read it cold, then call again with driftConfirmed:true). Incomplete input is NEVER saved. Grammar (@ says where, # says which, either order): soil save (personal, auto-named) · soil save #my-name (personal, named) · soil save @project (shared, membership-gated) · soil save @project #my-name (shared, named). Pass everything after soil save in project. A leading @ selects a SHARED team project; without it the save is PERSONAL, never filed into an @project just because one is in the conversation. For a SHARED @project save you MUST disposition the project's existing CANON: call soil_prepare FIRST to fetch the canon digest, then in canonOps give EVERY existing claim exactly one disposition (affirm/supersede/retire/conflict) and add any new locked truth — an unaddressed claim blocks the save and the shared canon is left un-patched. (soil_prepare stays OPTIONAL for a PERSONAL save.) An explicit #name becomes the handover NAME (overrides the extracted title); re-saving a name saves a NEW VERSION, loadable with soil load #my-name. Names cannot be all digits (numeric #NNN codes are auto-assigned). If the user gives no project, derive a short kebab-case projectId from the conversation yourself (e.g. payments-migration); never ask the user for one and never refuse to save because one was not given. EXPECTED on every save — do not skip these because they are not strictly required (they are expected, like captureCoverage): set modelName to the EXACT model id you are running as, read from you…

Capabilities

Writes

App Stats

12

Tools

ChatGPT

Platforms

Works with

ChatGPT

Data refreshed daily