{"data":{"slug":"studocu","verdict":"passed","scannedAt":"2026-10-26T10:54:44.142Z","scannerVersion":"1.2.1","latest":{"id":"40f425ec-3226-4424-8403-38c2456ae44d","createdAt":"2026-10-26T10:54:44.142Z","version":"1.0.0","trigger":"tools_changed","scannerVersion":"1.2.1","verdict":"passed","checks":[{"id":"hidden_instructions","status":"passed","findings":0,"label":"Hidden instructions"},{"id":"hidden_text","status":"passed","findings":0,"label":"Invisible text"},{"id":"sensitive_access","status":"passed","findings":0,"label":"Access to credentials"},{"id":"remote_code","status":"passed","findings":0,"label":"Downloads and runs code"},{"id":"exfiltration","status":"passed","findings":0,"label":"Sends data out"},{"id":"secrets","status":"passed","findings":0,"label":"Leaked secrets"}],"findings":[],"toolCount":18},"history":[{"id":"40f425ec-3226-4424-8403-38c2456ae44d","createdAt":"2026-10-26T10:54:44.142Z","version":"1.0.0","trigger":"tools_changed","scannerVersion":"1.2.1","verdict":"passed","checks":[{"id":"hidden_instructions","status":"passed","findings":0,"label":"Hidden instructions"},{"id":"hidden_text","status":"passed","findings":0,"label":"Invisible text"},{"id":"sensitive_access","status":"passed","findings":0,"label":"Access to credentials"},{"id":"remote_code","status":"passed","findings":0,"label":"Downloads and runs code"},{"id":"exfiltration","status":"passed","findings":0,"label":"Sends data out"},{"id":"secrets","status":"passed","findings":0,"label":"Leaked secrets"}],"findings":[],"toolCount":18},{"id":"6014a295-552f-4e40-a5a9-1aa361a71489","createdAt":"2026-10-26T05:56:50.532Z","version":"1.0.0","trigger":"changed","scannerVersion":"1.2.1","verdict":"passed","checks":[{"id":"hidden_instructions","status":"passed","findings":0,"label":"Hidden instructions"},{"id":"hidden_text","status":"passed","findings":0,"label":"Invisible text"},{"id":"sensitive_access","status":"passed","findings":0,"label":"Access to credentials"},{"id":"remote_code","status":"passed","findings":0,"label":"Downloads and runs code"},{"id":"exfiltration","status":"passed","findings":0,"label":"Sends data out"},{"id":"secrets","status":"passed","findings":0,"label":"Leaked secrets"}],"findings":[],"toolCount":null},{"id":"aeaa8978-809c-4991-80b4-e3289e8173ae","createdAt":"2026-10-25T22:45:42.655Z","version":"1.0.0","trigger":"new","scannerVersion":"1.2.1","verdict":"passed","checks":[{"id":"hidden_instructions","status":"passed","findings":0,"label":"Hidden instructions"},{"id":"hidden_text","status":"passed","findings":0,"label":"Invisible text"},{"id":"sensitive_access","status":"passed","findings":0,"label":"Access to credentials"},{"id":"remote_code","status":"passed","findings":0,"label":"Downloads and runs code"},{"id":"exfiltration","status":"passed","findings":0,"label":"Sends data out"},{"id":"secrets","status":"passed","findings":0,"label":"Leaked secrets"}],"findings":[],"toolCount":null}],"endpoint":{"url":"https://agent-os-mcp.alpha.studocu.com/mcp","transport":"streamable-http","status":"ok","checkedAt":"2026-10-26T10:53:34.478Z","toolCount":18,"latencyMs":587,"error":null},"tools":[{"name":"add-document-sources","title":"Add Studocu Document Sources","description":"Attach up to 10 Studocu documents from search-documents to a project. Returns the sources that were successfully added; compare with document_ids if some were omitted.","access":"write","accessDeclared":true,"hash":"24278a1e35480f2097a54ff8eea101c99e751eb80e137a7b1ed77e7cc7a9288b","inputSchema":"{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"properties\": {\n    \"document_ids\": {\n      \"description\": \"One to ten unique Studocu document IDs returned by search-documents.\",\n      \"items\": {\n        \"exclusiveMinimum\": 0,\n        \"maximum\": 9007199254740991,\n        \"type\": \"integer\"\n      },\n      \"maxItems\": 10,\n      \"minItems\": 1,\n      \"type\": \"array\"\n    },\n    \"project_id\": {\n      \"description\": \"UUID of the Studocu project that will receive the document sources.\",\n      \"format\": \"uuid\",\n      \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\",\n      \"type\": \"string\"\n    }\n  },\n  \"required\": [\n    \"project_id\",\n    \"document_ids\"\n  ],\n  \"type\": \"object\"\n}"},{"name":"agent-os-session","title":"Agent OS Session","description":"Use this proof tool to verify that the Agent OS MCP server received a valid delegated Studocu session.","access":"read","accessDeclared":true,"hash":"a777b200556298a4f49ac27ce99638ed33e0db9c6ae9aa33902590b9ecc7bf78","inputSchema":"{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"properties\": {},\n  \"type\": \"object\"\n}"},{"name":"create-project","title":"Create Studocu Project","description":"Create a Studocu project and optionally configure its emoji and course. A numeric course_id is validated before project creation.","access":"write","accessDeclared":true,"hash":"dfb141d63c27987fc15a246d51aae76afa6856351a5caea9d7aed95f1d5d5f73","inputSchema":"{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"additionalProperties\": false,\n  \"properties\": {\n    \"course_id\": {\n      \"maximum\": 9007199254740991,\n      \"minimum\": 1,\n      \"type\": \"integer\"\n    },\n    \"emoji\": {\n      \"minLength\": 1,\n      \"type\": \"string\"\n    },\n    \"title\": {\n      \"maxLength\": 255,\n      \"minLength\": 1,\n      \"pattern\": \"\\\\S\",\n      \"type\": \"string\"\n    }\n  },\n  \"type\": \"object\"\n}"},{"name":"delete-memory","title":"Delete Studocu Agent Memory","description":"Delete one durable memory document identified by (scope, kind) for the authenticated user. Provide project_id for project-local memory, or null/omit for global. Identity comes from Core via the session bearer, not from input.","access":"delete","accessDeclared":true,"hash":"0ec86665cdf33dcccfc76e095078f694ad0172bba391cfde9afa7039af35ec4e","inputSchema":"{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"properties\": {\n    \"kind\": {\n      \"description\": \"Memory kind to delete, e.g. study_preference or project_learning_context.\",\n      \"minLength\": 1,\n      \"type\": \"string\"\n    },\n    \"project_id\": {\n      \"anyOf\": [\n        {\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\",\n          \"type\": \"string\"\n        },\n        {\n          \"type\": \"null\"\n        }\n      ],\n      \"description\": \"Project UUID for project-local memory; null or omitted deletes global (user-level) memory.\"\n    }\n  },\n  \"required\": [\n    \"kind\"\n  ],\n  \"type\": \"object\"\n}"},{"name":"get-context","title":"Studocu Agent OS Context","description":"Return the unified Agent OS context manifest for the authenticated user: profile, followed courses, project metadata, and recent activity. Every project includes has_course_mastery and started_course_mastery (course supports Infinite Practice / learner has started it). Course mastery is visible only on projects, not followed_courses. Practised-topic detail (topic_masteries) is included only when a course is in scope (project_id, a sole remaining project, or remaining projects that share one course_id); the field is omitted when detail was not loaded. Empty topic_masteries means that course was loaded and the learner has no practised topics. Use get-course-mastery(course_id) for the practised-topic list when context omitted detail. Agent OS is read-only: chatting or calling this tool does not change mastery. Source of truth is Infinite Practice attempts (identity + course + topic); web IP writes, ACE/mobile/Agent OS only read.","access":"read","accessDeclared":true,"hash":"c95cd84082053eda48afd55a1b5225ac97bc659d07646f805a14ad44b99fa732","inputSchema":"{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"properties\": {\n    \"active_only\": {\n      \"description\": \"Limit the manifest to active context.\",\n      \"type\": \"boolean\"\n    },\n    \"course_id\": {\n      \"anyOf\": [\n        {\n          \"minLength\": 1,\n          \"type\": \"string\"\n        },\n        {\n          \"exclusiveMinimum\": 0,\n          \"maximum\": 9007199254740991,\n          \"type\": \"integer\"\n        }\n      ],\n      \"description\": \"Narrow context to a single followed course and its projects.\"\n    },\n    \"project_id\": {\n      \"description\": \"Narrow context to a single project by id.\",\n      \"minLength\": 1,\n      \"type\": \"string\"\n    },\n    \"recent_only\": {\n      \"description\": \"Limit the manifest to recently active context.\",\n      \"type\": \"boolean\"\n    }\n  },\n  \"type\": \"object\"\n}"},{"name":"get-course-mastery","title":"Get Infinite Practice Course Mastery","description":"Return practised-topic Infinite Practice mastery for a course (topic_id, topic_name when available, display 0–100, questions_answered). Use after get-context flags (has_course_mastery / started_course_mastery) or whenever context omitted topic_masteries. Agent OS is read-only: chatting, creating artifacts, or calling this tool does not change mastery. Source of truth is Infinite Practice attempts (user_topic_mastery: identity + course + topic); display matches the web IP UI. Progress is learner- and course-scoped, not chat- or client-scoped — web IP writes it; ACE/mobile/Agent OS only read the same rows. Empty topic_masteries means no IP attempts yet, not a separate client score. Requires course_id.","access":"read","accessDeclared":true,"hash":"d0f175684ca0f375f4760c7dd9add8b728f89b264f26e7aaf736da5f765cc9c3","inputSchema":"{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"properties\": {\n    \"course_id\": {\n      \"description\": \"Course id to load practised-topic Infinite Practice mastery for.\",\n      \"exclusiveMinimum\": 0,\n      \"maximum\": 9007199254740991,\n      \"type\": \"integer\"\n    }\n  },\n  \"required\": [\n    \"course_id\"\n  ],\n  \"type\": \"object\"\n}"},{"name":"get-course-syllabus","title":"Get Course Syllabus","description":"Return a generated course outline as markdown when this tool has one. This is the best grounding for high-quality study guidance. If it is missing, a syllabus may be generating, so try again in a few minutes. Requires course_id.","access":"read","accessDeclared":true,"hash":"a2ac30346a73935731cc0797ea397aad82b043636d4e73fe08af7721df2495e1","inputSchema":"{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"properties\": {\n    \"course_id\": {\n      \"description\": \"Studocu course id whose published syllabus should be loaded.\",\n      \"exclusiveMinimum\": 0,\n      \"maximum\": 9007199254740991,\n      \"type\": \"integer\"\n    }\n  },\n  \"required\": [\n    \"course_id\"\n  ],\n  \"type\": \"object\"\n}"},{"name":"get-project-state","title":"Studocu Project State","description":"Return sources and creations (project state) for one or more projects by id. Creation rows may include external_id (quizId or mockExamId) so a request-creation creating response can be matched once Alpha identity appears. Use after get-context (which lists projects without their sources/creations) to load those projects' artifacts. Only projects you can access are returned.","access":"read","accessDeclared":true,"hash":"f87c0bf739a74cc025a9206458ce0672b5774d39cdbcc2cadf77c551a1535ecb","inputSchema":"{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"properties\": {\n    \"ids\": {\n      \"description\": \"The project ids to load sources and creations (project state) for. Only projects you can access are returned.\",\n      \"items\": {\n        \"minLength\": 1,\n        \"type\": \"string\"\n      },\n      \"maxItems\": 20,\n      \"minItems\": 1,\n      \"type\": \"array\"\n    }\n  },\n  \"required\": [\n    \"ids\"\n  ],\n  \"type\": \"object\"\n}"},{"name":"read-artifact","title":"Read Studocu Artifact","description":"Read a Studocu project source or creation by its studocu://project/{project_id}/{kind}/{uuid} URI. Returns normalized metadata with explicitly mapped inline content.","access":"read","accessDeclared":true,"hash":"5ee2e2c342fe3ee6625dbbe83af648bde32aaad98305baacac9be5c072712b24","inputSchema":"{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"properties\": {\n    \"artifact_id\": {\n      \"description\": \"Artifact URI in the form studocu://project/{project_id}/{kind}/{uuid}.\",\n      \"minLength\": 1,\n      \"type\": \"string\"\n    },\n    \"cursor\": {\n      \"description\": \"Opaque continuation cursor returned by a previous read.\",\n      \"minLength\": 1,\n      \"type\": \"string\"\n    }\n  },\n  \"required\": [\n    \"artifact_id\"\n  ],\n  \"type\": \"object\"\n}"},{"name":"read-detached-document","title":"Read Detached Studocu Document","description":"Read a Studocu document directly, without requiring or creating a project source. Use read-artifact for documents attached to a project.","access":"read","accessDeclared":true,"hash":"db47cc6b67d913da74d318109040cdc703f5d4607ea59f0e0fce09ae0eb43288","inputSchema":"{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"properties\": {\n    \"document_id\": {\n      \"description\": \"Studocu document ID to read without creating a project source.\",\n      \"exclusiveMinimum\": 0,\n      \"maximum\": 9007199254740991,\n      \"type\": \"integer\"\n    }\n  },\n  \"required\": [\n    \"document_id\"\n  ],\n  \"type\": \"object\"\n}"},{"name":"read-memory","title":"Read Studocu Agent Memory","description":"Read durable agent memory for the authenticated user. Returns one document per (scope, kind); use project_id for project-scoped memory. Identity comes from Core via the session bearer, not from input.","access":"read","accessDeclared":true,"hash":"1109278124019f297ac86eb3f1e5a057e9d2c606d25818aa0ff203c53df6a9fa","inputSchema":"{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"properties\": {\n    \"kind\": {\n      \"description\": \"Narrow the result to a single memory kind.\",\n      \"minLength\": 1,\n      \"type\": \"string\"\n    },\n    \"project_id\": {\n      \"anyOf\": [\n        {\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\",\n          \"type\": \"string\"\n        },\n        {\n          \"type\": \"null\"\n        }\n      ],\n      \"description\": \"Project UUID for project-scoped memory; null or omitted reads global (user-level) memory. Required when scope is project or both.\"\n    },\n    \"scope\": {\n      \"description\": \"Memory scope to read: global, project, or both. Defaults to global unless project_id is set.\",\n      \"enum\": [\n        \"global\",\n        \"project\",\n        \"both\"\n      ],\n      \"type\": \"string\"\n    }\n  },\n  \"type\": \"object\"\n}"},{"name":"request-creation","title":"Request Studocu Creation","description":"Generate a Studocu quiz or mockExam from 1-10 project source artifacts. Waits up to ~3 minutes; returns artifact_id and external_id when created, status creating with external_id when persist is not yet visible, or outcome_unknown on client timeout or in-flight duplicate (check get-project-state before retrying). Optional idempotency_key is forwarded as Idempotency-Key; identical retries without a key still dedupe.","access":"write","accessDeclared":true,"hash":"da0366a08895acdaf1c91689946944e8c44f8871d2c5c95d26a6204845626153","inputSchema":"{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"properties\": {\n    \"artifact_ids\": {\n      \"description\": \"One to ten unique source artifact IDs (studocu://project/{project_id}/source/{uuid}) to generate from.\",\n      \"items\": {\n        \"minLength\": 1,\n        \"type\": \"string\"\n      },\n      \"maxItems\": 10,\n      \"minItems\": 1,\n      \"type\": \"array\"\n    },\n    \"idempotency_key\": {\n      \"description\": \"Optional retry key. Agent OS always sends Idempotency-Key to Alpha (this value, or a fingerprint of project/type/sources/instruction). Reuse with a different body is rejected.\",\n      \"maxLength\": 256,\n      \"minLength\": 1,\n      \"type\": \"string\"\n    },\n    \"instruction\": {\n      \"description\": \"Optional free-text hint for the generating agent (e.g. \\\"focus on chapter 3\\\").\",\n      \"maxLength\": 6000,\n      \"minLength\": 1,\n      \"type\": \"string\"\n    },\n    \"project_id\": {\n      \"description\": \"UUID of the Studocu project that will own the new creation.\",\n      \"format\": \"uuid\",\n      \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\",\n      \"type\": \"string\"\n    },\n    \"type\": {\n      \"description\": \"The kind of creation to generate: quiz or mockExam.\",\n      \"enum\": [\n        \"quiz\",\n        \"mockExam\"\n      ],\n      \"type\": \"string\"\n    }\n  },\n  \"required\": [\n    \"project_id\",\n    \"type\",\n    \"artifact_ids\"\n  ],\n  \"type\": \"object\"\n}"},{"name":"search-courses","title":"Search Courses","description":"Search Studocu courses when establishing or correcting course context. Prefer institution_id from search-institutions to scope results. Omit institution_id only when the institution is unknown: results then include catalog institution_id, and institution_name when Algolia has it. Do not require this before every document search. Structured results include course_id, name, code (nullable), institution_id, and optional institution_name. When talking to the user, present name, course code, and institution name only — do not show internal IDs. Auto-pick a clear top match; if the shortlist is ambiguous, ask the user to choose by name/code. Resolved IDs are conversation-scoped until a persistence capability owns them.","access":"read","accessDeclared":true,"hash":"e2e74d23a54cacf0f66a3c56be204e14fb96175e46b800f96779aff9d1a2504f","inputSchema":"{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"properties\": {\n    \"institution_id\": {\n      \"exclusiveMinimum\": 0,\n      \"maximum\": 2147483647,\n      \"type\": \"integer\"\n    },\n    \"limit\": {\n      \"default\": 3,\n      \"maximum\": 10,\n      \"minimum\": 1,\n      \"type\": \"integer\"\n    },\n    \"query\": {\n      \"maxLength\": 200,\n      \"minLength\": 1,\n      \"type\": \"string\"\n    }\n  },\n  \"required\": [\n    \"query\"\n  ],\n  \"type\": \"object\"\n}"},{"name":"search-documents","title":"Document Search","description":"Use this when the user wants to find, search, or browse study documents, lecture notes, summaries, or course materials on Studocu. Pass topic/keywords as `query` only — never put course name, course id, or institution name in `query`. `institution` is a display name only (this tool has no institution_id). Prefer numeric `course_id` from search-courses when you have it: it pins the course and overrules `course`. If both `course_id` and `institution` are sent, `course_id` wins; result institution is that course's university, not the name you passed. Otherwise pass `course` as name or code, never as a numeric id. `course` is optional extra if you already have `course_id`. Omit unknown filters. Returns matching documents with titles, course and institution info, ratings, and a link to view each on Studocu. Results with `match_type: semantic` are closest matches, not exact keyword hits, and may be only loosely related; check them against the request.","access":"read","accessDeclared":true,"hash":"9ce6985e6fd024448a7e3abb2fbec75d1faf30ec604bbed5c7e87ac15919d01b","inputSchema":"{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"properties\": {\n    \"course\": {\n      \"description\": \"Course name or code only, e.g. \\\"Economics\\\" or \\\"ECON101\\\". Use when you do not have `course_id`. Never put a numeric id here. Optional extra if you also have `course_id`. Omit entirely if unknown.\",\n      \"type\": \"string\"\n    },\n    \"course_id\": {\n      \"description\": \"Numeric Studocu course ID from search-courses `course_id`. Prefer this: it pins the course and overrules `course` name/code. Omit if you only have a name/code.\",\n      \"exclusiveMinimum\": 0,\n      \"maximum\": 2147483647,\n      \"type\": \"integer\"\n    },\n    \"institution\": {\n      \"description\": \"Institution display name only, e.g. \\\"University of Amsterdam\\\". Not an id — this tool has no `institution_id`. Infer it from the user message or conversation context when available; omit entirely if unknown. If `course_id` is also set, `course_id` wins; result institution is that course's university, not this name.\",\n      \"type\": \"string\"\n    },\n    \"limit\": {\n      \"default\": 10,\n      \"description\": \"Number of results to return (1-50, default: 10).\",\n      \"maximum\": 50,\n      \"minimum\": 1,\n      \"type\": \"integer\"\n    },\n    \"query\": {\n      \"description\": \"Topic/keywords only (e.g. \\\"supply and demand\\\", \\\"microeconomics midterm 2025\\\"). Never put course name, course id, or institution name here — use `institution`, `course`, and `course_id` instead.\",\n      \"minLength\": 1,\n      \"type\": \"string\"\n    },\n    \"use_no_course_as_fallback\": {\n      \"description\": \"Only used with `course_id`. When true and that course has no matching documents, search again without the course, so results may come from other courses; check each result's `course_id`. Default false.\",\n      \"type\": \"boolean\"\n    }\n  },\n  \"required\": [\n    \"query\"\n  ],\n  \"type\": \"object\"\n}"},{"name":"search-institutions","title":"Search Institutions","description":"Search Studocu institutions by name when establishing or correcting education context (onboarding / context setup). Do not require this before every document search. Structured results include id, name, type, region_code, and country for follow-up tools. When talking to the user, present name/type/country/region only — do not show internal IDs. Auto-pick a clear top match; if the shortlist is ambiguous, ask the user to choose by name. Resolved IDs are conversation-scoped until a persistence capability owns them.","access":"read","accessDeclared":true,"hash":"44cfff0c9c274e21da598eb103f680a1877df4eb4a73715a77d7de61ce64d743","inputSchema":"{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"properties\": {\n    \"limit\": {\n      \"default\": 3,\n      \"maximum\": 10,\n      \"minimum\": 1,\n      \"type\": \"integer\"\n    },\n    \"query\": {\n      \"maxLength\": 200,\n      \"minLength\": 1,\n      \"type\": \"string\"\n    },\n    \"type\": {\n      \"enum\": [\n        \"UNIVERSITY\",\n        \"HIGH_SCHOOL\"\n      ],\n      \"type\": \"string\"\n    }\n  },\n  \"required\": [\n    \"query\"\n  ],\n  \"type\": \"object\"\n}"},{"name":"update-project","title":"Update Studocu Project","description":"Update a Studocu project title, emoji, or course. Use course_id null to clear the course and institution.","access":"write","accessDeclared":true,"hash":"b3f81f6b19a32e962fe30f5d7d449335a4a1dac5bedcc2c092af76ab50a45f6a","inputSchema":"{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"additionalProperties\": false,\n  \"anyOf\": [\n    {\n      \"required\": [\n        \"title\"\n      ]\n    },\n    {\n      \"required\": [\n        \"emoji\"\n      ]\n    },\n    {\n      \"required\": [\n        \"course_id\"\n      ]\n    }\n  ],\n  \"minProperties\": 2,\n  \"properties\": {\n    \"course_id\": {\n      \"anyOf\": [\n        {\n          \"maximum\": 9007199254740991,\n          \"minimum\": 1,\n          \"type\": \"integer\"\n        },\n        {\n          \"type\": \"null\"\n        }\n      ]\n    },\n    \"emoji\": {\n      \"minLength\": 1,\n      \"type\": \"string\"\n    },\n    \"project_id\": {\n      \"description\": \"NOTE: These shared primitives are copied from the AI API spec and owned\\nlocally by Agent OS to keep this contract decoupled.\",\n      \"format\": \"uuid\",\n      \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\",\n      \"type\": \"string\"\n    },\n    \"title\": {\n      \"maxLength\": 255,\n      \"minLength\": 1,\n      \"pattern\": \"\\\\S\",\n      \"type\": \"string\"\n    }\n  },\n  \"required\": [\n    \"project_id\"\n  ],\n  \"type\": \"object\"\n}"},{"name":"write-artifact","title":"Write Studocu Artifact","description":"Create a Studocu artifact from typed content. Provide project_id and an artifact envelope; the artifact type defines the required content shape.","access":"write","accessDeclared":true,"hash":"d41b48a9eba5188b5fb8d26752acf53fb9d6b159f06b14ccb56d34db29a0f8f2","inputSchema":"{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"properties\": {\n    \"artifact\": {\n      \"description\": \"The artifact to create. Pick type; each type defines its own content shape.\",\n      \"oneOf\": [\n        {\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"content\": {\n              \"additionalProperties\": false,\n              \"description\": \"Quiz content.\",\n              \"properties\": {\n                \"course_id\": {\n                  \"exclusiveMinimum\": 0,\n                  \"maximum\": 9007199254740991,\n                  \"type\": \"integer\"\n                },\n                \"questions\": {\n                  \"items\": {\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"answers\": {\n                        \"items\": {\n                          \"additionalProperties\": false,\n                          \"properties\": {\n                            \"answer\": {\n                              \"description\": \"Answer option text.\",\n                              \"minLength\": 1,\n                              \"type\": \"string\"\n                            },\n                            \"is_correct\": {\n                              \"description\": \"True for the correct option or options.\",\n                              \"type\": \"boolean\"\n                            }\n                          },\n                          \"required\": [\n                            \"answer\",\n                            \"is_correct\"\n                          ],\n                          \"type\": \"object\"\n                        },\n                        \"minItems\": 2,\n                        \"type\": \"array\"\n                      },\n                      \"difficulty\": {\n                        \"enum\": [\n                          \"EASY\",\n                          \"MEDIUM\",\n                          \"HARD\"\n                        ],\n                        \"type\": \"string\"\n                      },\n                      \"explanation\": {\n                        \"description\": \"Required explanation for the correct answer (Core quiz API requires it, max 255 characters).\",\n                        \"maxLength\": 255,\n                        \"minLength\": 1,\n                        \"type\": \"string\"\n                      },\n                      \"question\": {\n                        \"description\": \"Question prompt shown to the learner.\",\n                        \"minLength\": 1,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\n                      \"question\",\n                      \"answers\",\n                      \"explanation\"\n                    ],\n                    \"type\": \"object\"\n                  },\n                  \"minItems\": 1,\n                  \"type\": \"array\"\n                }\n              },\n              \"required\": [\n                \"questions\"\n              ],\n              \"type\": \"object\"\n            },\n            \"description\": {\n              \"description\": \"Optional description stored on the creation record.\",\n              \"minLength\": 1,\n              \"type\": \"string\"\n            },\n            \"kind\": {\n              \"const\": \"creation\",\n              \"description\": \"Artifact kind. Only creation is writable in this MVP.\",\n              \"type\": \"string\"\n            },\n            \"title\": {\n              \"description\": \"Human-readable quiz title (Core Labs API requires 20-255 characters).\",\n              \"maxLength\": 255,\n              \"minLength\": 20,\n              \"type\": \"string\"\n            },\n            \"type\": {\n              \"const\": \"quiz\",\n              \"type\": \"string\"\n            }\n          },\n          \"required\": [\n            \"kind\",\n            \"title\",\n            \"type\",\n            \"content\"\n          ],\n          \"type\": \"object\"\n        },\n        {\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"content\": {\n              \"additionalProperties\": false,\n              \"description\": \"Mock exam content.\",\n              \"properties\": {\n                \"exam_json\": {\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"content\": {\n                      \"items\": {\n                        \"oneOf\": [\n                          {\n                            \"additionalProperties\": false,\n                            \"properties\": {\n                              \"id\": {\n                                \"minLength\": 1,\n                                \"type\": \"string\"\n                              },\n                              \"instructions\": {\n                                \"minLength\": 1,\n                                \"type\": \"string\"\n                              },\n                              \"kind\": {\n                                \"const\": \"section\",\n                                \"type\": \"string\"\n                              },\n                              \"question_type\": {\n                                \"description\": \"Frontend-supported KnowledgeTest question type. Use mcq, not multiple_choice.\",\n                                \"enum\": [\n                                  \"mcq\",\n                                  \"multi_select\",\n                                  \"true_false\",\n                                  \"fill_in_blank\",\n                                  \"text_answer_short\",\n                                  \"text_answer_long\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"title\": {\n                                \"minLength\": 1,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\n                              \"kind\",\n                              \"id\",\n                              \"question_type\"\n                            ],\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"additionalProperties\": false,\n                            \"properties\": {\n                              \"id\": {\n                                \"minLength\": 1,\n                                \"type\": \"string\"\n                              },\n                              \"kind\": {\n                                \"const\": \"stimulus\",\n                                \"type\": \"string\"\n                              },\n                              \"stimulus_markdown\": {\n                                \"minLength\": 1,\n                                \"type\": \"string\"\n                              },\n                              \"title\": {\n                                \"minLength\": 1,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\n                              \"kind\",\n                              \"id\",\n                              \"stimulus_markdown\"\n                            ],\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"oneOf\": [\n                              {\n                                \"additionalProperties\": false,\n                                \"properties\": {\n                                  \"grading\": {\n                                    \"additionalProperties\": false,\n                                    \"properties\": {\n                                      \"correct_answer\": {\n                                        \"type\": \"string\"\n                                      },\n                                      \"correct_answer_ids\": {\n                                        \"items\": {\n                                          \"minLength\": 1,\n                                          \"type\": \"string\"\n                                        },\n                                        \"type\": \"array\"\n                                      },\n                                      \"key_points\": {\n                                        \"items\": {\n                                          \"minLength\": 1,\n                                          \"type\": \"string\"\n                                        },\n                                        \"type\": \"array\"\n                                      },\n                                      \"model_answer\": {\n                                        \"minLength\": 1,\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"required\": [\n                                      \"model_answer\"\n                                    ],\n                                    \"type\": \"object\"\n                                  },\n                                  \"id\": {\n                                    \"minLength\": 1,\n                                    \"type\": \"string\"\n                                  },\n                                  \"kind\": {\n                                    \"const\": \"question\",\n                                    \"type\": \"string\"\n                                  },\n                                  \"marks\": {\n                                    \"minimum\": 0,\n                                    \"type\": \"number\"\n                                  },\n                                  \"options\": {\n                                    \"items\": {\n                                      \"additionalProperties\": false,\n                                      \"properties\": {\n                                        \"id\": {\n                                          \"description\": \"Stable option id.\",\n                                          \"minLength\": 1,\n                                          \"type\": \"string\"\n                                        },\n                                        \"text\": {\n                                          \"description\": \"Option text.\",\n                                          \"minLength\": 1,\n                                          \"type\": \"string\"\n                                        }\n                                      },\n                                      \"required\": [\n                                        \"id\",\n                                        \"text\"\n                                      ],\n                                      \"type\": \"object\"\n                                    },\n                                    \"minItems\": 2,\n                                    \"type\": \"array\"\n                                  },\n                                  \"question_markdown\": {\n                                    \"minLength\": 1,\n                                    \"type\": \"string\"\n                                  },\n                                  \"section_id\": {\n                                    \"minLength\": 1,\n                                    \"type\": \"string\"\n                                  },\n                                  \"stimulus_id_refs\": {\n                                    \"anyOf\": [\n                                      {\n                                        \"items\": {\n                                          \"minLength\": 1,\n                                          \"type\": \"string\"\n                                        },\n                                        \"type\": \"array\"\n                                      },\n                                      {\n                                        \"type\": \"null\"\n                                      }\n                                    ]\n                                  },\n                                  \"topics\": {\n                                    \"anyOf\": [\n                                      {\n                                        \"items\": {\n                                          \"minLength\": 1,\n                                          \"type\": \"string\"\n                                        },\n                                        \"type\": \"array\"\n                                      },\n                                      {\n                                        \"type\": \"null\"\n                                      }\n                                    ]\n                                  },\n                                  \"type\": {\n                                    \"enum\": [\n                                      \"mcq\",\n                                      \"multi_select\",\n                                      \"true_false\"\n                                    ],\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"required\": [\n                                  \"kind\",\n                                  \"id\",\n                                  \"section_id\",\n                                  \"type\",\n                                  \"marks\",\n                                  \"question_markdown\",\n                                  \"options\"\n                                ],\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"additionalProperties\": false,\n                                \"properties\": {\n                                  \"blanks\": {\n                                    \"items\": {\n                                      \"additionalProperties\": false,\n                                      \"properties\": {\n                                        \"id\": {\n                                          \"minLength\": 1,\n                                          \"type\": \"string\"\n                                        },\n                                        \"label\": {\n                                          \"type\": \"string\"\n                                        }\n                                      },\n                                      \"required\": [\n                                        \"id\"\n                                      ],\n                                      \"type\": \"object\"\n                                    },\n                                    \"type\": \"array\"\n                                  },\n                                  \"grading\": {\n                                    \"additionalProperties\": false,\n                                    \"properties\": {\n                                      \"correct_answer\": {\n                                        \"type\": \"string\"\n                                      },\n                                      \"correct_answer_ids\": {\n                                        \"items\": {\n                                          \"minLength\": 1,\n                                          \"type\": \"string\"\n                                        },\n                                        \"type\": \"array\"\n                                      },\n                                      \"key_points\": {\n                                        \"items\": {\n                                          \"minLength\": 1,\n                                          \"type\": \"string\"\n                                        },\n                                        \"type\": \"array\"\n                                      },\n                                      \"model_answer\": {\n                                        \"minLength\": 1,\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"required\": [\n                                      \"model_answer\"\n                                    ],\n                                    \"type\": \"object\"\n                                  },\n                                  \"id\": {\n                                    \"minLength\": 1,\n                                    \"type\": \"string\"\n                                  },\n                                  \"kind\": {\n                                    \"const\": \"question\",\n                                    \"type\": \"string\"\n                                  },\n                                  \"marks\": {\n                                    \"minimum\": 0,\n                                    \"type\": \"number\"\n                                  },\n                                  \"question_markdown\": {\n                                    \"minLength\": 1,\n                                    \"type\": \"string\"\n                                  },\n                                  \"section_id\": {\n                                    \"minLength\": 1,\n                                    \"type\": \"string\"\n                                  },\n                                  \"stimulus_id_refs\": {\n                                    \"anyOf\": [\n                                      {\n                                        \"items\": {\n                                          \"minLength\": 1,\n                                          \"type\": \"string\"\n                                        },\n                                        \"type\": \"array\"\n                                      },\n                                      {\n                                        \"type\": \"null\"\n                                      }\n                                    ]\n                                  },\n                                  \"template_markdown\": {\n                                    \"anyOf\": [\n                                      {\n                                        \"type\": \"string\"\n                                      },\n                                      {\n                                        \"type\": \"null\"\n                                      }\n                                    ]\n                                  },\n                                  \"topics\": {\n                                    \"anyOf\": [\n                                      {\n                                        \"items\": {\n                                          \"minLength\": 1,\n                                          \"type\": \"string\"\n                                        },\n                                        \"type\": \"array\"\n                                      },\n                                      {\n                                        \"type\": \"null\"\n                                      }\n                                    ]\n                                  },\n                                  \"type\": {\n                                    \"const\": \"fill_in_blank\",\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"required\": [\n                                  \"kind\",\n                                  \"id\",\n                                  \"section_id\",\n                                  \"type\",\n                                  \"marks\",\n                                  \"question_markdown\"\n                                ],\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"additionalProperties\": false,\n                                \"properties\": {\n                                  \"grading\": {\n                                    \"additionalProperties\": false,\n                                    \"properties\": {\n                                      \"correct_answer\": {\n                                        \"type\": \"string\"\n                                      },\n                                      \"correct_answer_ids\": {\n                                        \"items\": {\n                                          \"minLength\": 1,\n                                          \"type\": \"string\"\n                                        },\n                                        \"type\": \"array\"\n                                      },\n                                      \"key_points\": {\n                                        \"items\": {\n                                          \"minLength\": 1,\n                                          \"type\": \"string\"\n                                        },\n                                        \"type\": \"array\"\n                                      },\n                                      \"model_answer\": {\n                                        \"minLength\": 1,\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"required\": [\n                                      \"model_answer\"\n                                    ],\n                                    \"type\": \"object\"\n                                  },\n                                  \"id\": {\n                                    \"minLength\": 1,\n                                    \"type\": \"string\"\n                                  },\n                                  \"kind\": {\n                                    \"const\": \"question\",\n                                    \"type\": \"string\"\n                                  },\n                                  \"marks\": {\n                                    \"minimum\": 0,\n                                    \"type\": \"number\"\n                                  },\n                                  \"question_markdown\": {\n                                    \"minLength\": 1,\n                                    \"type\": \"string\"\n                                  },\n                                  \"section_id\": {\n                                    \"minLength\": 1,\n                                    \"type\": \"string\"\n                                  },\n                                  \"stimulus_id_refs\": {\n                                    \"anyOf\": [\n                                      {\n                                        \"items\": {\n                                          \"minLength\": 1,\n                                          \"type\": \"string\"\n                                        },\n                                        \"type\": \"array\"\n                                      },\n                                      {\n                                        \"type\": \"null\"\n                                      }\n                                    ]\n                                  },\n                                  \"topics\": {\n                                    \"anyOf\": [\n                                      {\n                                        \"items\": {\n                                          \"minLength\": 1,\n                                          \"type\": \"string\"\n                                        },\n                                        \"type\": \"array\"\n                                      },\n                                      {\n                                        \"type\": \"null\"\n                                      }\n                                    ]\n                                  },\n                                  \"type\": {\n                                    \"enum\": [\n                                      \"text_answer_short\",\n                                      \"text_answer_long\"\n                                    ],\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"required\": [\n                                  \"kind\",\n                                  \"id\",\n                                  \"section_id\",\n                                  \"type\",\n                                  \"marks\",\n                                  \"question_markdown\"\n                                ],\n                                \"type\": \"object\"\n                              }\n                            ]\n                          }\n                        ]\n                      },\n                      \"minItems\": 1,\n                      \"type\": \"array\"\n                    },\n                    \"front_matter\": {\n                      \"additionalProperties\": false,\n                      \"properties\": {\n                        \"instructions_markdown\": {\n                          \"type\": \"string\"\n                        }\n                      },\n                      \"type\": \"object\"\n                    },\n                    \"schema_version\": {\n                      \"const\": \"0.8\",\n                      \"type\": \"string\"\n                    },\n                    \"title\": {\n                      \"minLength\": 1,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\n                    \"schema_version\",\n                    \"title\",\n                    \"content\"\n                  ],\n                  \"type\": \"object\"\n                }\n              },\n              \"required\": [\n                \"exam_json\"\n              ],\n              \"type\": \"object\"\n            },\n            \"description\": {\n              \"description\": \"Optional description stored on the creation record.\",\n              \"minLength\": 1,\n              \"type\": \"string\"\n            },\n            \"kind\": {\n              \"const\": \"creation\",\n              \"description\": \"Artifact kind. Only creation is writable in this MVP.\",\n              \"type\": \"string\"\n            },\n            \"title\": {\n              \"description\": \"Human-readable title for the created artifact.\",\n              \"minLength\": 1,\n              \"type\": \"string\"\n            },\n            \"type\": {\n              \"const\": \"mockExam\",\n              \"type\": \"string\"\n            }\n          },\n          \"required\": [\n            \"kind\",\n            \"title\",\n            \"type\",\n            \"content\"\n          ],\n          \"type\": \"object\"\n        },\n        {\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"content\": {\n              \"additionalProperties\": false,\n              \"description\": \"Note content.\",\n              \"properties\": {\n                \"html\": {\n                  \"description\": \"Complete HTML document for the note body (max 1 MiB UTF-8).\",\n                  \"minLength\": 1,\n                  \"type\": \"string\"\n                }\n              },\n              \"required\": [\n                \"html\"\n              ],\n              \"type\": \"object\"\n            },\n            \"kind\": {\n              \"const\": \"creation\",\n              \"description\": \"Artifact kind. Only creation is writable in this MVP.\",\n              \"type\": \"string\"\n            },\n            \"title\": {\n              \"description\": \"Human-readable note title (Alpha creation store max 255 characters).\",\n              \"maxLength\": 255,\n              \"minLength\": 1,\n              \"type\": \"string\"\n            },\n            \"type\": {\n              \"const\": \"note\",\n              \"type\": \"string\"\n            }\n          },\n          \"required\": [\n            \"kind\",\n            \"title\",\n            \"type\",\n            \"content\"\n          ],\n          \"type\": \"object\"\n        },\n        {\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"content\": {\n              \"additionalProperties\": false,\n              \"description\": \"Flashcard set content.\",\n              \"properties\": {\n                \"flashcards_json\": {\n                  \"additionalProperties\": false,\n                  \"properties\": {\n                    \"description\": {\n                      \"type\": \"string\"\n                    },\n                    \"flashcards\": {\n                      \"items\": {\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                          \"back\": {\n                            \"minLength\": 1,\n                            \"type\": \"string\"\n                          },\n                          \"front\": {\n                            \"minLength\": 1,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\n                          \"front\",\n                          \"back\"\n                        ],\n                        \"type\": \"object\"\n                      },\n                      \"maxItems\": 200,\n                      \"minItems\": 1,\n                      \"type\": \"array\"\n                    },\n                    \"title\": {\n                      \"minLength\": 1,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\n                    \"title\",\n                    \"description\",\n                    \"flashcards\"\n                  ],\n                  \"type\": \"object\"\n                }\n              },\n              \"required\": [\n                \"flashcards_json\"\n              ],\n              \"type\": \"object\"\n            },\n            \"description\": {\n              \"description\": \"Optional description stored on the creation record.\",\n              \"minLength\": 1,\n              \"type\": \"string\"\n            },\n            \"kind\": {\n              \"const\": \"creation\",\n              \"description\": \"Artifact kind. Only creation is writable in this MVP.\",\n              \"type\": \"string\"\n            },\n            \"title\": {\n              \"description\": \"Human-readable title for the created artifact.\",\n              \"minLength\": 1,\n              \"type\": \"string\"\n            },\n            \"type\": {\n              \"const\": \"flashcard\",\n              \"type\": \"string\"\n            }\n          },\n          \"required\": [\n            \"kind\",\n            \"title\",\n            \"type\",\n            \"content\"\n          ],\n          \"type\": \"object\"\n        }\n      ]\n    },\n    \"project_id\": {\n      \"description\": \"UUID of the Studocu project that will own the artifact.\",\n      \"format\": \"uuid\",\n      \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\",\n      \"type\": \"string\"\n    }\n  },\n  \"required\": [\n    \"project_id\",\n    \"artifact\"\n  ],\n  \"type\": \"object\"\n}"},{"name":"write-memory","title":"Write Studocu Agent Memory","description":"Upsert one durable memory document per (scope, kind) for the authenticated user. Provide project_id for project-local memory, or null/omit for global. Identity comes from Core via the session bearer, not from input.","access":"delete","accessDeclared":true,"hash":"c4a492fcc2912d899bb4ced1f69e4f95c46e97bbf42632c943403a7eabf94f62","inputSchema":"{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"properties\": {\n    \"kind\": {\n      \"description\": \"Memory kind, e.g. study_preference or project_learning_context.\",\n      \"minLength\": 1,\n      \"type\": \"string\"\n    },\n    \"project_id\": {\n      \"anyOf\": [\n        {\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\",\n          \"type\": \"string\"\n        },\n        {\n          \"type\": \"null\"\n        }\n      ],\n      \"description\": \"Project UUID for project-local memory; null or omitted stores global (user-level) memory.\"\n    },\n    \"value\": {\n      \"additionalProperties\": {},\n      \"description\": \"Freeform memory document. MVP convention is { content: string }.\",\n      \"propertyNames\": {\n        \"type\": \"string\"\n      },\n      \"type\": \"object\"\n    }\n  },\n  \"required\": [\n    \"kind\",\n    \"value\"\n  ],\n  \"type\": \"object\"\n}"}],"toolsHash":"0ca5a672725ae27cfdbcfcdbf2d41188ad076a5267d58a14abbf839d380d53fc","toolsPinnedAt":"2026-10-26T10:53:34.499Z","toolsLastSeenAt":"2026-10-26T10:53:34.478Z","toolChanges":[]}}