← PrimitiveCONTENT HISTORY

Update to Primitive

Snapshot Oct 24, 2026 · 12:52 UTC · version 2.1.0

WHAT CHANGED

Package or technical metadata updated

Package or technical metadata updated

Observed in package metadata. These changes alone do not establish a new customer-facing feature.

Save Primitive and check future changes in Following.

Up to 3 plugins free · no card required.

All fields and original values.

These are saved file metadata. Open a changed file to read its text edits.

Package file

Before

Sep 30, 2026 · 22:49 UTC

9fd76be776b95e6f2900f2cd47c0d3d9badb6f5ed0bfc98768a1f8ca25b80e9a

After

Oct 24, 2026 · 12:52 UTC

7d9deab63564b6bbc8439a613e17a88ec7ac0c6eaf56869551cda6471bbcec88

Package file

Before

Sep 30, 2026 · 22:49 UTC

127

After

Oct 24, 2026 · 12:52 UTC

101

Package file

Before

Sep 30, 2026 · 22:49 UTC

{"sha256":"eeea7da82c7358ef1f97c32d9895df74a6f3fad7aca4aa65d53b61393bc20a98","size":1246}

After

Oct 24, 2026 · 12:52 UTC

Not present

Package file

Before

Sep 30, 2026 · 22:49 UTC

Not present

After

Oct 24, 2026 · 12:52 UTC

{"sha256":"54ac194730cffe6ad7aad3c7674c25e43e585de068a3b387649050298b679cae","size":98681}

Compare saved observations

Download comparison JSON

Changed files

Choose a file to see its text changes. Binary or large files show metadata only.

.app.json →

.codex-plugin/plugin.json →

assets/icon.png →

assets/logo.png →

mcp.json →

plugin.json →

plugin.json

− removed · + added

--- before
+++ after
@@ -0,0 +1,103 @@
+{
+  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
+  "name": "app-6a25e1d409008191a30d80366aaad5e5",
+  "version": "2.1.0",
+  "description": "Email for AI agents: read, search, send, and reply to email in a Primitive inbox, and wait for the reply in the same turn.",
+  "author": {
+    "name": "Primitive",
+    "url": "https://www.primitive.dev"
+  },
+  "homepage": "https://www.primitive.dev",
+  "keywords": [
+    "email",
+    "inbox",
+    "agents",
+    "send email",
+    "reply"
+  ],
+  "extensions": {
+    "com.openai": {
+      "interface": {
+        "displayName": "Primitive",
+        "shortDescription": "Email for AI agents",
+        "longDescription": "Primitive gives ChatGPT a real email inbox. Create a managed inbox address with no signup form, or connect an existing Primitive account. Check whether the inbox and outbound sending are ready, list and search received email, open a message or its whole conversation, read text attachments, send new email, and reply in thread. When you send and expect an answer, Primitive waits for the reply and returns it in the same turn, and says whether the reply came from the person you wrote to.\n\nPrimitive only accesses email in the connected Primitive account. A new account can send only to the recipients it lists until it is verified further. Sending and replying always need your confirmation. Domain, webhook, and filter management are not part of this app.",
+        "developerName": "Primitive",
+        "category": "Developer Tools",
+        "capabilities": [
+          "Read email",
+          "Search email",
+          "Send email",
+          "Reply to email"
+        ],
+        "websiteURL": "https://www.primitive.dev",
+        "supportURL": "https://www.primitive.dev/contact",
+        "privacyPolicyURL": "https://www.primitive.dev/privacy",
+        "termsOfServiceURL": "https://www.primitive.dev/terms",
+        "defaultPrompt": [
+          "Is my Primitive inbox ready to receive email?",
+          "Show my 10 most recent Primitive emails.",
+          "Find emails from support@example.com about billing."
+        ],
+        "composerIcon": "./assets/icon.png",
+        "logo": "./assets/logo.png"
+      },
+      "review": {
+        "test_cases": {
+          "positive": [
+            {
+              "description": "Show the authenticated Primitive account summary.",
+              "prompt": "Show my Primitive account status and onboarding state.",
+              "tools_triggered": "getAccount",
+              "expected_behavior": "Returns the account summary, including plan and onboarding state, without changing account data."
+            },
+            {
+              "description": "Check inbound setup readiness before guiding configuration.",
+              "prompt": "Is my Primitive inbox ready to receive agent email?",
+              "tools_triggered": "getInboxStatus",
+              "expected_behavior": "Returns a readiness summary covering domains, routes, deployed Functions, and recent inbound activity."
+            },
+            {
+              "description": "Search inbound messages with sender and subject filters.",
+              "prompt": "Find inbound Primitive emails from support@example.com with billing in the subject.",
+              "tools_triggered": "searchEmails",
+              "expected_behavior": "Returns matching inbound messages, or a clear empty result if none match."
+            },
+            {
+              "description": "Open the most recent inbound email and read the conversation it belongs to.",
+              "prompt": "Open my most recent Primitive email and show me the whole conversation.",
+              "tools_triggered": "listEmails, getEmail, getConversation",
+              "expected_behavior": "Finds the latest inbound email, shows its sender, subject and text, then returns every message in its thread oldest first."
+            },
+            {
+              "description": "Send a confirmed outbound email from the account's own inbox address.",
+              "prompt": "Send an email to teammate@example.com with subject Status update and body: The inbox test passed. I confirm this should be sent.",
+              "tools_triggered": "sendEmail",
+              "expected_behavior": "Sends the confirmed email from the account's managed inbox address and returns the delivery outcome, or explains which recipients the account can reach if this one is not allowed."
+            }
+          ],
+          "negative": [
+            {
+              "description": "Do not trigger for unrelated weather requests.",
+              "prompt": "What is the weather in San Francisco tomorrow?",
+              "expected_behavior": "The app is not invoked because the request is unrelated to Primitive email."
+            },
+            {
+              "description": "Do not use Primitive for non-Primitive inboxes.",
+              "prompt": "Search my Gmail inbox for messages from my bank.",
+              "expected_behavior": "The app is not invoked because it only accesses email in the user's Primitive account."
+            },
+            {
+              "description": "Do not send email without the required details and confirmation.",
+              "prompt": "Send a quick email to my teammate.",
+              "expected_behavior": "The assistant asks for the recipient, subject, body, and confirmation before invoking a sending tool."
+            }
+          ]
+        }
+      },
+      "publication": {
+        "release_notes": "Each MCP endpoint now runs only the tools it lists, and the server instructions name only those tools. Adds email search, conversation and attachment reads, sent-email reads, and waiting for a reply in the same turn."
+      },
+      "apps": "./.app.json"
+    }
+  }
+}
Full technical diff · 7 changed fields

changed /files/.app.json/sha256

BEFORE
"9fd76be776b95e6f2900f2cd47c0d3d9badb6f5ed0bfc98768a1f8ca25b80e9a"
AFTER
"7d9deab63564b6bbc8439a613e17a88ec7ac0c6eaf56869551cda6471bbcec88"

changed /files/.app.json/size

BEFORE
127
AFTER
101

removed /files/.codex-plugin~1plugin.json

BEFORE
{
  "sha256": "eeea7da82c7358ef1f97c32d9895df74a6f3fad7aca4aa65d53b61393bc20a98",
  "size": 1246
}
AFTER
Field is absent

added /files/assets~1icon.png

BEFORE
Field was absent
AFTER
{
  "sha256": "54ac194730cffe6ad7aad3c7674c25e43e585de068a3b387649050298b679cae",
  "size": 98681
}

added /files/assets~1logo.png

BEFORE
Field was absent
AFTER
{
  "sha256": "54ac194730cffe6ad7aad3c7674c25e43e585de068a3b387649050298b679cae",
  "size": 98681
}

added /files/mcp.json

BEFORE
Field was absent
AFTER
{
  "sha256": "50ecad6c8e275bb774ea3d8d64d48e897957a9cc53d16d470fa76691ceb2f10a",
  "size": 197
}

added /files/plugin.json

BEFORE
Field was absent
AFTER
{
  "sha256": "12c0d62f91e8a979147691595efc7d4b7674d66990bd5eda90903488663885c3",
  "size": 5757
}
Full snapshot data
{
  "files": {
    ".app.json": {
      "sha256": "7d9deab63564b6bbc8439a613e17a88ec7ac0c6eaf56869551cda6471bbcec88",
      "size": 101
    },
    "assets/icon.png": {
      "sha256": "54ac194730cffe6ad7aad3c7674c25e43e585de068a3b387649050298b679cae",
      "size": 98681
    },
    "assets/logo.png": {
      "sha256": "54ac194730cffe6ad7aad3c7674c25e43e585de068a3b387649050298b679cae",
      "size": 98681
    },
    "mcp.json": {
      "sha256": "50ecad6c8e275bb774ea3d8d64d48e897957a9cc53d16d470fa76691ceb2f10a",
      "size": 197
    },
    "plugin.json": {
      "sha256": "12c0d62f91e8a979147691595efc7d4b7674d66990bd5eda90903488663885c3",
      "size": 5757
    }
  }
}

SHA-256 of public snapshot: 3132984695bdfdcc192f4b2355d7d68fc8d232e378903b33bbfadc9263fd693d