← Files Smart Calendars AIARCHIVED FILE
.codex-plugin/plugin.json
20.9 KB · Nov 3, 2026 · 00:13 UTC
{
"author": {
"name": "Smart Calendars AI"
},
"description": "Turn a school schedule, team timetable or event programme into a calendar you can subscribe to. Give your assistant a PDF, image or pasted schedule; the assistant reads it, and Smart Calendars AI saves and publishes the events.\n\nOpen the calendar in your default calendar app, choose Apple, Google or Outlook on the Calendar options page, or copy the HTTPS subscription link. You confirm the subscription in your calendar app. Later changes use the same feed link and arrive according to that app's refresh schedule.\n\nAsk for changes in the conversation or use your existing dashboard. Preview revisions before saving, update individual events without replacing the whole calendar, and remove or restore events. When the supplied schedule includes suitable topic, organizer or venue details, your assistant can save those tags and return a filtered subscription for the events you want. Filters select events; they are not a privacy restriction.\n\nRequires a Smart Calendars AI account. This connection accesses only your Smart Calendars AI feeds, events and status, not Gmail or other app accounts. Anyone with a subscription link can read the published calendar. New feeds do not automatically monitor the original source or create a public Calendar Page.",
"interface": {
"capabilities": [],
"category": "Productivity",
"defaultPrompt": [
"Turn this school schedule into a calendar feed I can subscribe to. Show me any ambiguous dates before creating it.",
"Compare this revised schedule with my existing feed. Preview changes and preserve my notes before saving.",
"Show available filters for my feed and give me a subscription for only the topics and organizers I choose."
],
"developerName": "Smart Calendars AI",
"displayName": "Smart Calendars AI",
"longDescription": "Turn a school schedule, team timetable or event programme into a calendar you can subscribe to. Give your assistant a PDF, image or pasted schedule; the assistant reads it, and Smart Calendars AI saves and publishes the events.\n\nOpen the calendar in your default calendar app, choose Apple, Google or Outlook on the Calendar options page, or copy the HTTPS subscription link. You confirm the subscription in your calendar app. Later changes use the same feed link and arrive according to that app's refresh schedule.\n\nAsk for changes in the conversation or use your existing dashboard. Preview revisions before saving, update individual events without replacing the whole calendar, and remove or restore events. When the supplied schedule includes suitable topic, organizer or venue details, your assistant can save those tags and return a filtered subscription for the events you want. Filters select events; they are not a privacy restriction.\n\nRequires a Smart Calendars AI account. This connection accesses only your Smart Calendars AI feeds, events and status, not Gmail or other app accounts. Anyone with a subscription link can read the published calendar. New feeds do not automatically monitor the original source or create a public Calendar Page.",
"privacyPolicyURL": "https://www.smartcalendars.ai/en/privacy",
"shortDescription": "Create and edit calendar feeds",
"supportURL": "https://www.smartcalendars.ai/en/contact",
"termsOfServiceURL": "https://www.smartcalendars.ai/en/terms",
"websiteURL": "https://www.smartcalendars.ai/en",
"logo": "./assets/icon.png",
"composerIcon": "./assets/icon.png",
"logoDark": "./assets/icon.png",
"composerIconDark": "./assets/icon.png"
},
"name": "app-6a9fa702c0b48191b39140402f9a36c8",
"version": "1.0.5",
"mcpServers": "./.mcp.json",
"extensions": {
"com.openai": {
"review": {
"demo_recording_url": "https://youtu.be/EWyiyVxz-ww",
"commerce": false,
"test_cases": {
"positive": [
{
"description": "After connecting the dedicated review account and refreshing tools if an older connection is installed, start a NEW ChatGPT conversation with this plugin selected. Run cases 1-5 in order on one new synthetic feed; case 3 explicitly starts a second fresh chat. Use the returned feed ID, never an older same-name sample. The account needs one available active-feed slot and included editing access. Test HTTPS calendar handoff and options on each supported surface.",
"prompt": "Create and activate one feed named OpenAI Review School Calendar from this fictional schedule. Parents' evening: 10 November 2026, 18:00-19:00 Europe/Berlin, Library, topic Education, organizer School Office. School break: one all-day event covering 16-17 November 2026 inclusive, topic Education, organizer School Office, no venue. Planning meeting: 24 November 2026, 10:00-11:00 Europe/Berlin, Office, topic Administration, organizer Staff Team. Save the supplied topics, organizers and venues as filterable tags, not just descriptions. Give me Open in calendar app, Calendar options, an HTTPS subscription link and View or edit. Do not enable monitoring, create a public Calendar Page or spend credits.",
"expected_behavior": "Returns one active feed with three events; the break spans exactly 16-17 November. For a distribution-ready feed, Open in calendar app uses the returned HTTPS subscription_open_url, Calendar options uses subscription_options_url, and the HTTPS ICS and dashboard links remain available. The reviewer clicks Open from ChatGPT: on a device with a compatible handler, the browser offers the calendar-app handoff. Calendar options opens a standalone web page with Apple/default, Google, Outlook and manual-copy choices, not an embedded ChatGPT widget. Opening a link is not reported as a completed subscription. Browser restrictions or a missing handler use the options/copy fallback. Pending publication is disclosed without creating another feed. No monitoring, public Calendar Page or credit charge.",
"tools_triggered": "create_feed, get_feed_status"
},
{
"description": "Read account allowances and paginated events, discover existing tags, and obtain filtered subscriptions without changing or duplicating the review feed.",
"prompt": "List my Smart Calendars AI feeds and remaining active-feed allowance, then check the status of the OpenAI Review School Calendar created in case 1. Read all its November 2026 events two at a time and show available filter values. Give matching names, counts and subscription links for Education plus School Office, Education plus Library, Education or Administration, and Astronomy. Use the returned filtered Open in calendar app and Calendar options links for each selection. Keep the Education/School Office link for comparison after later edits. Do not change anything or spend credits.",
"expected_behavior": "Reports the returned account allowance rather than inferring usage from the list length, plus status and all three events across two pages. Education with School Office matches 2 events; Education with Library matches 1; Education or Administration matches 3; Astronomy matches 0 and is reported as unmatched, never broadened to all events. Uses each filtered_subscription object's exact HTTPS handoff, options and ICS URLs, preserving selections. The reviewer may fetch those ICS URLs and compare the active entries with the reported matches. Read-date limits and pagination do not become subscription filters. Explains that a filtered link is not an access restriction. No new feed, saved changes, revision advance or credit charge.",
"tools_triggered": "list_feeds, get_feed_status, get_feed"
},
{
"description": "Multi-turn revision and lost-preview recovery test, using the SAME single apply_feed_changes tool. Send the steps below separately, waiting for each result. Preserve a personal correction; recover a mixed revision in a NEW chat using only its feed/request handle; obtain fresh approval, save once and verify safe retry/already-saved recovery. Complete pending-preview recovery before its returned expiry (up to one hour).",
"prompt": "STEP A, in the cases 1-2 conversation: On this run's feed, preview setting Parents' evening location and venue tag to Gym and appending 'Personal note: use the side entrance.' once to its description. Preserve everything else. Show the returned preview and stop for my approval. Do not spend credits.\nAFTER A'S PREVIEW, send: Approve this correction only. Save its exact validated proposal with no credit spending, then read back the result.\nSTEP B: Read the complete unfiltered feed. Preview this revised schedule without saving: Parents' evening on 10 November 2026 now runs 19:00-20:00 Europe/Berlin; School break is explicitly canceled; add Workshop on 1 December 2026, 15:00-16:00 Europe/Berlin, Library, topic Education, organizer School Office. Leave the omitted Planning meeting active. Preserve my Gym correction, note, existing identities, unchanged tags and unrelated fields. Show the actual before/after result, feed_id, request_id and expiry. Stop for approval; do not spend credits.\nSTEP C, in a NEW ChatGPT conversation with the same reviewer connection selected: I lost a calendar revision preview. Recover it for feed_id <copy B's feed_id> and request_id <copy B's request_id>. Use apply_feed_changes with dry_run=true and recover_preview=true. Use only that handle, not old chat history or a reconstructed proposal. Show the recovered changes, expiry and any charge. Do not save, create another preview or spend credits. Stop for fresh approval.\nAFTER C'S RECOVERED PREVIEW, send: I approve exactly the recovered changes. Save using its returned save_arguments unchanged, with no credit spending. Read back the full feed and the Education/School Office filtered subscription.\nSTEP D: Retry the identical successful save once with its original request_id, receipt and payload; do not generate a new request. Then recover that same feed/request handle again with dry_run=true and recover_preview=true. If it reports already saved, report that result and stop without another save. Verify no duplicate Workshop or additional revision increment. Do not spend credits.\nReplace only the two placeholders in step C with values actually returned in B; do not paste B's event changes, receipt or save arguments into the new chat. Continue cases 4-5 in this second chat using the same feed ID.",
"expected_behavior": "A previews without changing the calendar, then saves only the approved correction (revision 1 to 2 on a new untouched feed). B previews the mixed revision at revision 2, with existing matched IDs and one new namespaced Workshop key. Before approval, the original times, active break and absent Workshop are unchanged. C retrieves that exact proposal using only feed_id/request_id/dry_run/recover_preview in the MCP payload, under the same reviewer connection. Host account-routing fields are outside that payload. Recovery returns saved=false, the same changes and original expiry, and exact save_arguments with confirm_credit_charge=false; it neither renews expiry nor writes calendar events, advances revision or spends credits. Fresh approval is required in the new chat. Saving the returned arguments advances revision once to 3: 3 active events plus canceled School break, exactly one Workshop, existing UIDs retained, Gym/note preserved and Planning unchanged. The retained Education/School Office URL still selects 2 active events (Parents and Workshop). D's exact retry stays at revision 3. Its subsequent recovery returns saved=true for the original request, with no save_arguments or further save, revision advance, duplicate or charge. ICS uses the canceled break's original UID and STATUS:CANCELLED. Never guess missing handles or matches. If a preview expires, is missing or becomes stale, do not save or treat recovery as successful: read the feed, prepare a new preview with a new request ID and obtain fresh approval, then rerun the recovery check before expiry.",
"tools_triggered": "get_feed, apply_feed_changes"
},
{
"description": "In case 3's recovery conversation, use the same feed ID to preview and then approve restoration, selected-field reset and removal. Send the approval follow-up only after inspecting the actual returned preview.",
"prompt": "Preview these changes to this run's feed, without saving: restore the existing canceled School break rather than adding a replacement; reset Parents' evening start and end times to their original stored values, preserving my Gym correction and personal note; remove the temporary Workshop. Keep Planning meeting and every other field unchanged. Show the actual preview and stop for approval. Do not spend credits.\nAFTER INSPECTING THE PREVIEW, send separately: Approve exactly these changes. Save the returned validated proposal without spending credits. Read back all events and show the same base and Education/School Office subscription links.",
"expected_behavior": "Restores School break exactly once with its original event identity, tags and inclusive 16-17 November range; its ICS entry is no longer canceled. Resets Parents' evening to 18:00-19:00 Europe/Berlin while keeping Gym and the personal note, and cancels Workshop without permanently erasing its history. Planning meeting is unchanged. There are 3 active events and 2 active Education/School Office matches. Base and filtered subscription URLs stay unchanged; calendar-app refresh is not claimed to be immediate. No credit charge.",
"tools_triggered": "get_feed, apply_feed_changes"
},
{
"description": "Exercise reversible feed availability on the synthetic review feed without deleting its data or creating a replacement.",
"prompt": "Temporarily deactivate only OpenAI Review School Calendar, check that it is inactive, then reactivate that same feed and check its status again. I understand subscription access will be interrupted briefly. Keep all stored events and the same subscription link, and do not spend credits.",
"expected_behavior": "Reports active to inactive to active on the same feed. While inactive, distribution_ready is false and the assistant does not present it as subscribable; opening its handoff/options URLs reports unavailable. After reactivation within account capacity, the same stored events, ICS URL, HTTPS app-handoff URL, options URL and filters remain available. No replacement feed, editing-window reset or credit charge. The reviewer can reopen Calendar options and Open in calendar app after reactivation; the user still confirms any subscription in their chosen calendar app.",
"tools_triggered": "get_feed, deactivate_feed, get_feed_status, reactivate_feed"
}
],
"negative": [
{
"description": "Feed permissions must not be treated as mailbox access.",
"prompt": "Use the Smart Calendars AI connection to read my Gmail inbox and delete my old school emails.",
"expected_behavior": "Does not invoke Smart Calendars AI tools or claim to access Gmail. Explains that this connection manages Smart Calendars AI feeds only and can work with schedule content the user chooses to provide."
},
{
"description": "General calendar-format education does not require reading or editing a user's feeds.",
"prompt": "What is the difference between importing an ICS file and subscribing to an ICS calendar? Just explain it; do not access any of my calendars.",
"expected_behavior": "Answers the general question without invoking the integration, reading account data, creating a feed or charging credits."
},
{
"description": "The feed tools cannot enroll automatic source monitoring or refresh an original document.",
"prompt": "Use only the Smart Calendars AI connection to start checking my school's PDF every morning and automatically update my existing feed whenever the PDF changes. Do not make a one-time edit or create a new feed.",
"expected_behavior": "Explains that these tools cannot start source monitoring or refresh the document, does not promise scheduled checks, and does not substitute a new feed or an unsolicited one-time edit for the requested automation."
}
]
}
},
"publication": {
"countries": [],
"translations": {
"de-DE": {
"subtitle": "Kalenderfeeds verwalten",
"description": "Mach aus einem Schulplan, Teamkalender oder Veranstaltungsprogramm einen Kalender zum Abonnieren. Gib deinem Assistenten eine PDF-Datei, ein Bild oder einen eingef\u00fcgten Terminplan. Der Assistent liest die Angaben; Smart Calendars AI speichert und ver\u00f6ffentlicht die Termine.\n\n\u00d6ffne den Kalender in deiner Standard-Kalender-App, w\u00e4hle auf der Seite mit den Kalenderoptionen Apple, Google oder Outlook oder kopiere den HTTPS-Abo-Link. Das Abonnement best\u00e4tigst du in deiner Kalender-App. Sp\u00e4tere \u00c4nderungen bleiben unter demselben Link verf\u00fcgbar und erscheinen nach der Aktualisierung durch deine Kalender-App.\n\n\u00c4ndere Termine im Gespr\u00e4ch oder in deinem bestehenden Dashboard. Pr\u00fcfe \u00c4nderungen vor dem Speichern, bearbeite einzelne Termine und entferne sie oder stelle sie wieder her, ohne den ganzen Kalender zu ersetzen. Enth\u00e4lt der Terminplan passende Angaben zu Themen, Veranstaltern oder Orten, kann dein Assistent diese als Merkmale speichern und dir ein gefiltertes Kalender-Abo anbieten. Filter w\u00e4hlen Termine aus; sie beschr\u00e4nken nicht den Zugriff auf den vollst\u00e4ndigen Kalender.\n\nDu ben\u00f6tigst ein Smart Calendars AI Konto. Diese Verbindung greift nur auf deine Smart Calendars AI Feeds, Termine und Statusinformationen zu, nicht auf Gmail oder andere App-Konten. Wer einen Abo-Link hat, kann den ver\u00f6ffentlichten Kalender lesen. Neue Feeds \u00fcberwachen ihre Quelle nicht automatisch und erstellen keine \u00f6ffentliche Kalenderseite."
},
"fr-FR": {
"subtitle": "Cr\u00e9er et g\u00e9rer des calendriers",
"description": "Transformez un calendrier scolaire, un planning d\u2019\u00e9quipe ou un programme d\u2019\u00e9v\u00e9nements en calendrier auquel vous pouvez vous abonner. Donnez \u00e0 votre assistant un PDF, une image ou un planning coll\u00e9 dans la conversation. L\u2019assistant en lit le contenu ; Smart Calendars AI enregistre et publie les \u00e9v\u00e9nements.\n\nOuvrez le calendrier dans votre application de calendrier par d\u00e9faut, choisissez Apple, Google ou Outlook sur la page des options, ou copiez le lien d\u2019abonnement HTTPS. Vous confirmez l\u2019abonnement dans votre application. Les modifications restent disponibles au m\u00eame lien et apparaissent selon la fr\u00e9quence d\u2019actualisation de votre application.\n\nDemandez des modifications dans la conversation ou utilisez votre tableau de bord habituel. Pr\u00e9visualisez les changements avant de les enregistrer, modifiez des \u00e9v\u00e9nements individuels, supprimez-les ou r\u00e9tablissez-les sans remplacer tout le calendrier. Si le planning contient des pr\u00e9cisions sur les th\u00e8mes, les organisateurs ou les lieux, votre assistant peut les enregistrer comme crit\u00e8res et vous proposer un abonnement filtr\u00e9. Les filtres s\u00e9lectionnent les \u00e9v\u00e9nements ; ils ne restreignent pas l\u2019acc\u00e8s au calendrier complet.\n\nUn compte Smart Calendars AI est n\u00e9cessaire. Cette connexion acc\u00e8de uniquement \u00e0 vos calendriers, \u00e9v\u00e9nements et informations d\u2019\u00e9tat Smart Calendars AI, pas \u00e0 Gmail ni \u00e0 vos autres comptes. Toute personne disposant du lien d\u2019abonnement peut lire le calendrier publi\u00e9. Les nouveaux calendriers ne surveillent pas automatiquement leur source et ne cr\u00e9ent pas de page de calendrier publique."
}
},
"release_notes": "Update reviewer test instructions for the deployed, receipt-bound calendar revision workflow. Keep all seven public MCP tools, including the single apply_feed_changes atomic revision tool; no internal LLM calls were added. A lost preview can be retrieved by its exact feed/request handle before its original expiry, reviewed again and saved only after fresh approval. Recovery of an already committed request returns its saved result without repeating the mutation. Tests now specify fresh conversations after tool refresh, reviewer-account selection, separate preview/approval messages, handle-only cross-chat recovery and duplicate-save checks. Retain the existing creation, filtering, restoration, deactivation/reactivation and three capability-boundary cases, original demo URL, translations, assets and publication settings. These instructions do not claim that unperformed mobile tests or all updated host replicates have passed."
}
}
},
"apps": "./.app.json"
}
SHA-256: 71c7eed21120ec486c42b53213e698c3d1fd9ac1fba6de254fe71872e47b0bd0