← Files uNotesARCHIVED FILE

.codex-plugin/plugin.json

8.34 KB · Nov 12, 2026 · 18:59 UTC

↓ Download file

See the change to this file →

{
  "author": {
    "name": "14930398 Canada Inc."
  },
  "description": "uNotes is a study library of university course materials \u2014 past exams, assignments, lab reports and lecture notes, organized by school and course. The uNotes plugin gives ChatGPT read access to that library and to the user's own study data: it can search the library, open a document and read its full text, list the user's flashcard decks and quizzes, look up their study streak, check how much of their monthly quota is left, and list the schools and courses they follow.\n\nEvery tool is read-only. The plugin exposes eight tools, all declared readOnlyHint:true / destructiveHint:false / idempotentHint:true, and none of them create, edit or delete anything in a uNotes account. Typical use is asking a question about material the user already has \u2014 \"what do my Biology notes say about cell structure\", \"which courses am I following\", \"how long is my study streak\" \u2014 and letting ChatGPT pull the answer out of the underlying documents.\n\nAccess is authorized with OAuth 2.1: PKCE (S256) with dynamic client registration, an explicit consent screen, and seven granular read scopes (search, documents, flashcards, quizzes, study, profile, library) plus offline_access. Tools are registered per request against the scopes the token actually carries, so a grant that omits a scope makes the matching tools invisible rather than merely blocked. Requests are rate-limited per user, and tools never accept a user identifier as input \u2014 every call is scoped to the authenticated account's own data.",
  "interface": {
    "capabilities": [],
    "category": "Education & Research",
    "defaultPrompt": [
      "Search uNotes for documents about operating systems and tell me what they cover.",
      "How long is my study streak, and how much of my monthly quota is left?",
      "List my flashcard decks and quizzes so I know what I have to revise."
    ],
    "developerName": "14930398 Canada Inc.",
    "displayName": "uNotes",
    "longDescription": "uNotes is a study library of university course materials \u2014 past exams, assignments, lab reports and lecture notes, organized by school and course. The uNotes plugin gives ChatGPT read access to that library and to the user's own study data: it can search the library, open a document and read its full text, list the user's flashcard decks and quizzes, look up their study streak, check how much of their monthly quota is left, and list the schools and courses they follow.\n\nEvery tool is read-only. The plugin exposes eight tools, all declared readOnlyHint:true / destructiveHint:false / idempotentHint:true, and none of them create, edit or delete anything in a uNotes account. Typical use is asking a question about material the user already has \u2014 \"what do my Biology notes say about cell structure\", \"which courses am I following\", \"how long is my study streak\" \u2014 and letting ChatGPT pull the answer out of the underlying documents.\n\nAccess is authorized with OAuth 2.1: PKCE (S256) with dynamic client registration, an explicit consent screen, and seven granular read scopes (search, documents, flashcards, quizzes, study, profile, library) plus offline_access. Tools are registered per request against the scopes the token actually carries, so a grant that omits a scope makes the matching tools invisible rather than merely blocked. Requests are rate-limited per user, and tools never accept a user identifier as input \u2014 every call is scoped to the authenticated account's own data.",
    "privacyPolicyURL": "https://unotes.net/privacy",
    "shortDescription": "Search your study library",
    "supportURL": "https://unotes.net/support",
    "termsOfServiceURL": "https://unotes.net/terms",
    "websiteURL": "https://unotes.net/",
    "logo": "./assets/logo.png",
    "logoDark": "./assets/logo-dark.png",
    "composerIcon": "./assets/icon.png",
    "composerIconDark": "./assets/icon-dark.png"
  },
  "name": "app-6a7ae3809a148191ac2fa410c17f26c7",
  "version": "1.0.1",
  "mcpServers": "./.mcp.json",
  "extensions": {
    "com.openai": {
      "review": {
        "test_cases": {
          "positive": [
            {
              "description": "Connect and inspect the tool list",
              "prompt": "What tools do you have from uNotes?",
              "tools_triggered": "tools/list",
              "expected_behavior": "Exactly eight tools: search_library, get_document, get_document_content, list_my_flashcards, list_my_quizzes, get_study_streak, get_quota_status, list_schools_courses. Every one is annotated readOnlyHint true, destructiveHint false, idempotentHint true. A shorter list means a narrower consent grant, not a broken server, because tools are registered per request against the scopes the token carries."
            },
            {
              "description": "Search the study library",
              "prompt": "Search uNotes for documents about operating systems and show me the top three.",
              "tools_triggered": "search_library",
              "expected_behavior": "A count plus a documents array; each row carries id, name, type, a course and school label, and an absolute unotes.net URL the reviewer can open in a browser to confirm the document is real. Note that search_library queries the shared public library of completed documents across the whole platform, not this account's private notes, so results are real public course material rather than Talia's own uploads."
            },
            {
              "description": "Open a seeded document by id",
              "prompt": "Open uNotes document 9963b4ee-a5af-4c0f-86f8-07dc81fc6170 and tell me its course, year and professor.",
              "tools_triggered": "get_document",
              "expected_behavior": "Metadata for the document CSI 3131 \u2014 Virtual Memory and Page Replacement: name, type, year, season, language, professor, course and school objects, view and like counts, postedAt, and the public URL. No user ids and no internal fields are returned."
            },
            {
              "description": "Read the document text",
              "prompt": "Now read that same document and summarize its main points.",
              "tools_triggered": "get_document_content",
              "expected_behavior": "A title, sourceLabel and content payload carrying the extracted study text about demand paging and page faults, plus a prose summary from the assistant. Content is capped at 12,000 characters, so a long document ending mid-sentence is the intended limit rather than data loss."
            },
            {
              "description": "Study streak and quota",
              "prompt": "How long is my study streak, and how much of my monthly quota is left?",
              "tools_triggered": "get_study_streak, get_quota_status",
              "expected_behavior": "A live non-zero streak: currentStreakDays 12, longestStreakDays 31, studiedToday true, with the 7-day and 30-day badges earned. Then tier PRO plus one quota row per feature with used, limit, remaining and resetsAt, where a null limit means unlimited on this plan and real used counts appear, for example AI chat 18 of 250. Reading the quota consumes none of it, because every tool on this surface is a read."
            }
          ],
          "negative": [
            {
              "description": "Study material stored outside uNotes",
              "prompt": "Summarize the lecture slides in my Google Drive folder and turn them into study notes.",
              "expected_behavior": ""
            },
            {
              "description": "Running and grading a quiz",
              "prompt": "Quiz me on chapter 4 of my operating systems notes and grade my answers as I go.",
              "expected_behavior": ""
            },
            {
              "description": "Billing and plan changes",
              "prompt": "What does the uNotes Pro plan cost, and can you upgrade my subscription for me?",
              "expected_behavior": ""
            }
          ]
        },
        "demo_recording_url": "https://drive.google.com/file/d/16DrELROO7wra5uJYlrPgOwE27qxvO50Z/view",
        "commerce": false,
        "commerce_description": ""
      },
      "publication": {
        "countries": [],
        "release_notes": "Logo refresh: the listing icons are replaced with the official 1024px brand logo. No change to the MCP server, tools, OAuth or test account."
      }
    }
  },
  "apps": "./.app.json"
}

SHA-256: fbc4791abc780a7fb4b52c5b144e963bc4ebd8cfd27a17ad38e76d8f65a44373